@dipansrimany/mlink-sdk 0.3.1 → 0.4.2

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/constants.ts","../../src/utils.ts","../../src/validators.ts","../../src/react/useMlink.ts","../../src/react/useExecuteMlink.ts","../../src/react/themes.ts","../../src/react/MlinkProvider.tsx","../../src/react/Mlink.tsx","../../src/react/adapters.ts"],"names":["useState","useCallback","jsx","useMemo"],"mappings":"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","file":"index.mjs","sourcesContent":["import type { ChainConfig } from './types';\n\nexport const MANTLE_MAINNET: ChainConfig = {\n chainId: 5000,\n name: 'Mantle',\n rpcUrl: 'https://rpc.mantle.xyz',\n explorerUrl: 'https://mantlescan.xyz',\n nativeCurrency: {\n name: 'MNT',\n symbol: 'MNT',\n decimals: 18,\n },\n};\n\nexport const MANTLE_SEPOLIA: ChainConfig = {\n chainId: 5003,\n name: 'Mantle Sepolia',\n rpcUrl: 'https://rpc.sepolia.mantle.xyz',\n explorerUrl: 'https://sepolia.mantlescan.xyz',\n nativeCurrency: {\n name: 'MNT',\n symbol: 'MNT',\n decimals: 18,\n },\n};\n\nexport const SUPPORTED_CHAINS: ChainConfig[] = [MANTLE_MAINNET, MANTLE_SEPOLIA];\n\nexport const DEFAULT_CHAIN = MANTLE_SEPOLIA;\n\nexport const BLINK_BASE_URL = 'https://blink.mantle.xyz';\n\nexport const ACTION_QUERY_PARAM = 'action';\n","import {\n BLINK_BASE_URL,\n ACTION_QUERY_PARAM,\n SUPPORTED_CHAINS,\n} from './constants';\nimport type { ChainConfig } from './types';\n\n// Create Blink URL from Action URL\nexport function createBlinkUrl(\n actionUrl: string,\n baseUrl: string = BLINK_BASE_URL\n): string {\n // Validate actionUrl is a valid URL\n try {\n new URL(actionUrl);\n } catch {\n throw new Error('Invalid action URL');\n }\n\n const encodedAction = encodeURIComponent(actionUrl);\n return `${baseUrl}/mlink?${ACTION_QUERY_PARAM}=${encodedAction}`;\n}\n\n// Parse Blink URL to extract Action URL\nexport function parseBlinkUrl(blinkUrl: string): string | null {\n try {\n const url = new URL(blinkUrl);\n const actionParam = url.searchParams.get(ACTION_QUERY_PARAM);\n\n if (!actionParam) return null;\n\n const actionUrl = decodeURIComponent(actionParam);\n\n // Validate it's a valid URL\n new URL(actionUrl);\n\n return actionUrl;\n } catch {\n return null;\n }\n}\n\n// Check if URL is a valid Blink URL\nexport function isBlinkUrl(url: string): boolean {\n return parseBlinkUrl(url) !== null;\n}\n\n// Convert human readable amount to wei string\nexport function parseEther(amount: string | number): string {\n const value = typeof amount === 'string' ? parseFloat(amount) : amount;\n if (isNaN(value) || value < 0) {\n throw new Error('Invalid amount');\n }\n const wei = BigInt(Math.floor(value * 1e18));\n return wei.toString();\n}\n\n// Convert wei to human readable amount\nexport function formatEther(wei: string | bigint): string {\n const value = typeof wei === 'string' ? BigInt(wei) : wei;\n const ether = Number(value) / 1e18;\n return ether.toFixed(6).replace(/\\.?0+$/, '');\n}\n\n// Shorten address for display\nexport function shortenAddress(address: string): string {\n if (!address || address.length < 10) return address;\n return `${address.slice(0, 6)}...${address.slice(-4)}`;\n}\n\n// Get explorer URL for transaction\nexport function getExplorerUrl(chainId: number, txHash: string): string {\n const chain = getChainById(chainId);\n if (!chain) return '';\n return `${chain.explorerUrl}/tx/${txHash}`;\n}\n\n// Get chain config by ID\nexport function getChainById(chainId: number): ChainConfig | undefined {\n return SUPPORTED_CHAINS.find((c) => c.chainId === chainId);\n}\n\n// Get explorer URL for address\nexport function getAddressExplorerUrl(\n chainId: number,\n address: string\n): string {\n const chain = getChainById(chainId);\n if (!chain) return '';\n return `${chain.explorerUrl}/address/${address}`;\n}\n","import { z } from 'zod';\nimport type {\n ActionMetadata,\n TransactionRequest,\n TransactionResponse,\n ValidationResult,\n} from './types';\n\n// Ethereum address regex\nconst addressRegex = /^0x[a-fA-F0-9]{40}$/;\n\n// Hex string regex\nconst hexRegex = /^0x[a-fA-F0-9]*$/;\n\n// Zod Schemas\nexport const ActionButtonSchema = z.object({\n label: z.string().min(1).max(50),\n value: z.string().min(1),\n type: z.enum(['button', 'input']),\n placeholder: z.string().optional(),\n disabled: z.boolean().optional(),\n});\n\nexport const ActionMetadataSchema = z.object({\n title: z.string().min(1).max(100),\n icon: z.string().url(),\n description: z.string().min(1).max(500),\n actions: z.array(ActionButtonSchema).min(1),\n disabled: z.boolean().optional(),\n error: z.object({ message: z.string() }).optional(),\n});\n\nexport const TransactionRequestSchema = z.object({\n account: z.string().regex(addressRegex, 'Invalid Ethereum address'),\n action: z.string().min(1),\n input: z.string().optional(),\n});\n\nexport const EVMTransactionSchema = z.object({\n to: z.string().regex(addressRegex, 'Invalid to address'),\n value: z.string(),\n data: z.string().regex(hexRegex, 'Invalid hex data'),\n chainId: z.number().positive(),\n});\n\nexport const TransactionResponseSchema = z.object({\n transaction: EVMTransactionSchema,\n message: z.string().optional(),\n});\n\n// Validation functions\nexport function validateActionMetadata(\n data: unknown\n): ValidationResult<ActionMetadata> {\n const result = ActionMetadataSchema.safeParse(data);\n if (result.success) {\n return { success: true, data: result.data as ActionMetadata };\n }\n return { success: false, error: result.error.message };\n}\n\nexport function validateTransactionRequest(\n data: unknown\n): ValidationResult<TransactionRequest> {\n const result = TransactionRequestSchema.safeParse(data);\n if (result.success) {\n return { success: true, data: result.data };\n }\n return { success: false, error: result.error.message };\n}\n\nexport function validateTransactionResponse(\n data: unknown\n): ValidationResult<TransactionResponse> {\n const result = TransactionResponseSchema.safeParse(data);\n if (result.success) {\n return { success: true, data: result.data as TransactionResponse };\n }\n return { success: false, error: result.error.message };\n}\n\nexport function isValidAddress(address: string): boolean {\n return addressRegex.test(address);\n}\n\nexport function isValidHex(hex: string): boolean {\n return hexRegex.test(hex);\n}\n","'use client';\r\n\r\nimport { useState, useEffect, useCallback, useRef } from 'react';\r\nimport type { ActionMetadata } from '../types';\r\nimport type { MlinkInstance, MlinkStatus, UseMlinkOptions } from './types';\r\nimport { parseBlinkUrl } from '../utils';\r\nimport { validateActionMetadata } from '../validators';\r\n\r\nconst DEFAULT_REFRESH_INTERVAL = 10 * 60 * 1000; // 10 minutes\r\n\r\nexport function useMlink(\r\n url: string,\r\n options: UseMlinkOptions = {}\r\n): MlinkInstance {\r\n const { refreshInterval = DEFAULT_REFRESH_INTERVAL, enabled = true } =\r\n options;\r\n\r\n const [status, setStatus] = useState<MlinkStatus>('idle');\r\n const [metadata, setMetadata] = useState<ActionMetadata | null>(null);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n const abortControllerRef = useRef<AbortController | null>(null);\r\n const intervalRef = useRef<ReturnType<typeof setInterval> | null>(null);\r\n\r\n // Extract action URL from mlink URL if needed\r\n const actionUrl = parseBlinkUrl(url) || url;\r\n\r\n const fetchMetadata = useCallback(async () => {\r\n if (!actionUrl || !enabled) return;\r\n\r\n // Abort previous request if still pending\r\n if (abortControllerRef.current) {\r\n abortControllerRef.current.abort();\r\n }\r\n\r\n abortControllerRef.current = new AbortController();\r\n\r\n setStatus('loading');\r\n setError(null);\r\n\r\n try {\r\n const response = await fetch(actionUrl, {\r\n method: 'GET',\r\n headers: {\r\n Accept: 'application/json',\r\n },\r\n signal: abortControllerRef.current.signal,\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\r\n }\r\n\r\n const data = await response.json();\r\n\r\n // Validate the response\r\n const validation = validateActionMetadata(data);\r\n if (!validation.success) {\r\n throw new Error(`Invalid metadata: ${validation.error}`);\r\n }\r\n\r\n setMetadata(validation.data);\r\n setStatus('ready');\r\n } catch (err) {\r\n if (err instanceof Error && err.name === 'AbortError') {\r\n return; // Ignore abort errors\r\n }\r\n\r\n const errorMessage =\r\n err instanceof Error ? err.message : 'Failed to fetch mlink data';\r\n setError(errorMessage);\r\n setStatus('error');\r\n }\r\n }, [actionUrl, enabled]);\r\n\r\n // Initial fetch\r\n useEffect(() => {\r\n if (enabled) {\r\n fetchMetadata();\r\n }\r\n\r\n return () => {\r\n if (abortControllerRef.current) {\r\n abortControllerRef.current.abort();\r\n }\r\n };\r\n }, [fetchMetadata, enabled]);\r\n\r\n // Set up refresh interval\r\n useEffect(() => {\r\n if (!enabled || !refreshInterval) return;\r\n\r\n intervalRef.current = setInterval(() => {\r\n fetchMetadata();\r\n }, refreshInterval);\r\n\r\n return () => {\r\n if (intervalRef.current) {\r\n clearInterval(intervalRef.current);\r\n }\r\n };\r\n }, [fetchMetadata, refreshInterval, enabled]);\r\n\r\n return {\r\n status,\r\n metadata,\r\n error,\r\n url: actionUrl,\r\n refresh: fetchMetadata,\r\n };\r\n}\r\n","'use client';\r\n\r\nimport { useState, useCallback } from 'react';\r\nimport type {\r\n MlinkAdapter,\r\n MlinkStatus,\r\n ExecutionResult,\r\n UseExecuteMlinkReturn,\r\n} from './types';\r\nimport type { TransactionResponse } from '../types';\r\nimport { validateTransactionResponse } from '../validators';\r\n\r\ninterface UseExecuteMlinkOptions {\r\n adapter: MlinkAdapter;\r\n actionUrl: string;\r\n onSuccess?: (txHash: string, action: string) => void;\r\n onError?: (error: string) => void;\r\n}\r\n\r\nexport function useExecuteMlink(\r\n options: UseExecuteMlinkOptions\r\n): UseExecuteMlinkReturn {\r\n const { adapter, actionUrl, onSuccess, onError } = options;\r\n\r\n const [status, setStatus] = useState<MlinkStatus>('ready');\r\n const [txHash, setTxHash] = useState<string | null>(null);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n const reset = useCallback(() => {\r\n setStatus('ready');\r\n setTxHash(null);\r\n setError(null);\r\n }, []);\r\n\r\n const execute = useCallback(\r\n async (action: string, input?: string): Promise<ExecutionResult> => {\r\n setStatus('executing');\r\n setError(null);\r\n setTxHash(null);\r\n\r\n try {\r\n // Ensure wallet is connected\r\n let account = adapter.getAddress();\r\n if (!adapter.isConnected() || !account) {\r\n account = await adapter.connect();\r\n }\r\n\r\n // Make POST request to get transaction\r\n const response = await fetch(actionUrl, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n body: JSON.stringify({\r\n account,\r\n action,\r\n input,\r\n }),\r\n });\r\n\r\n if (!response.ok) {\r\n const errorData = await response.json().catch(() => ({}));\r\n throw new Error(\r\n errorData.message || `HTTP ${response.status}: ${response.statusText}`\r\n );\r\n }\r\n\r\n const data: TransactionResponse = await response.json();\r\n\r\n // Validate response\r\n const validation = validateTransactionResponse(data);\r\n if (!validation.success) {\r\n throw new Error(`Invalid response: ${validation.error}`);\r\n }\r\n\r\n // Sign and send transaction\r\n const hash = await adapter.signAndSendTransaction(data.transaction);\r\n\r\n setTxHash(hash);\r\n setStatus('success');\r\n onSuccess?.(hash, action);\r\n\r\n return {\r\n success: true,\r\n txHash: hash,\r\n message: data.message,\r\n };\r\n } catch (err) {\r\n const errorMessage =\r\n err instanceof Error ? err.message : 'Transaction failed';\r\n setError(errorMessage);\r\n setStatus('error');\r\n onError?.(errorMessage);\r\n\r\n return {\r\n success: false,\r\n error: errorMessage,\r\n };\r\n }\r\n },\r\n [adapter, actionUrl, onSuccess, onError]\r\n );\r\n\r\n return {\r\n execute,\r\n status,\r\n txHash,\r\n error,\r\n reset,\r\n };\r\n}\r\n","import type { MlinkTheme, MlinkThemePreset } from './types';\r\n\r\nexport const lightTheme: MlinkTheme = {\r\n // Colors\r\n '--mlink-bg-primary': '#ffffff',\r\n '--mlink-bg-secondary': '#f8f9fa',\r\n '--mlink-border-color': '#e9ecef',\r\n '--mlink-text-primary': '#212529',\r\n '--mlink-text-secondary': '#6c757d',\r\n '--mlink-text-link': '#0d6efd',\r\n '--mlink-button-bg': '#212529',\r\n '--mlink-button-text': '#ffffff',\r\n '--mlink-button-hover': '#343a40',\r\n '--mlink-button-disabled': '#adb5bd',\r\n '--mlink-input-bg': '#ffffff',\r\n '--mlink-input-border': '#ced4da',\r\n '--mlink-input-text': '#212529',\r\n '--mlink-input-placeholder': '#adb5bd',\r\n '--mlink-success': '#198754',\r\n '--mlink-error': '#dc3545',\r\n '--mlink-warning': '#ffc107',\r\n // Sizing\r\n '--mlink-border-radius': '12px',\r\n '--mlink-button-radius': '8px',\r\n '--mlink-input-radius': '8px',\r\n // Shadows\r\n '--mlink-shadow': '0 2px 8px rgba(0, 0, 0, 0.08)',\r\n};\r\n\r\nexport const darkTheme: MlinkTheme = {\r\n // Colors\r\n '--mlink-bg-primary': '#1a1a1a',\r\n '--mlink-bg-secondary': '#2d2d2d',\r\n '--mlink-border-color': '#404040',\r\n '--mlink-text-primary': '#ffffff',\r\n '--mlink-text-secondary': '#a0a0a0',\r\n '--mlink-text-link': '#60a5fa',\r\n '--mlink-button-bg': '#ffffff',\r\n '--mlink-button-text': '#1a1a1a',\r\n '--mlink-button-hover': '#e5e5e5',\r\n '--mlink-button-disabled': '#525252',\r\n '--mlink-input-bg': '#2d2d2d',\r\n '--mlink-input-border': '#404040',\r\n '--mlink-input-text': '#ffffff',\r\n '--mlink-input-placeholder': '#6b7280',\r\n '--mlink-success': '#22c55e',\r\n '--mlink-error': '#ef4444',\r\n '--mlink-warning': '#f59e0b',\r\n // Sizing\r\n '--mlink-border-radius': '12px',\r\n '--mlink-button-radius': '8px',\r\n '--mlink-input-radius': '8px',\r\n // Shadows\r\n '--mlink-shadow': '0 2px 8px rgba(0, 0, 0, 0.3)',\r\n};\r\n\r\nexport const mantleTheme: MlinkTheme = {\r\n // Colors - Mantle brand colors\r\n '--mlink-bg-primary': '#0a0a0a',\r\n '--mlink-bg-secondary': '#141414',\r\n '--mlink-border-color': '#2a2a2a',\r\n '--mlink-text-primary': '#ffffff',\r\n '--mlink-text-secondary': '#9ca3af',\r\n '--mlink-text-link': '#65d9e4',\r\n '--mlink-button-bg': '#65d9e4',\r\n '--mlink-button-text': '#000000',\r\n '--mlink-button-hover': '#85e3ec',\r\n '--mlink-button-disabled': '#374151',\r\n '--mlink-input-bg': '#1f1f1f',\r\n '--mlink-input-border': '#374151',\r\n '--mlink-input-text': '#ffffff',\r\n '--mlink-input-placeholder': '#6b7280',\r\n '--mlink-success': '#34d399',\r\n '--mlink-error': '#f87171',\r\n '--mlink-warning': '#fbbf24',\r\n // Sizing\r\n '--mlink-border-radius': '16px',\r\n '--mlink-button-radius': '10px',\r\n '--mlink-input-radius': '10px',\r\n // Shadows\r\n '--mlink-shadow': '0 4px 16px rgba(101, 217, 228, 0.1)',\r\n};\r\n\r\nexport const themePresets: Record<MlinkThemePreset, MlinkTheme> = {\r\n light: lightTheme,\r\n dark: darkTheme,\r\n mantle: mantleTheme,\r\n};\r\n\r\nexport function resolveTheme(\r\n theme?: Partial<MlinkTheme> | MlinkThemePreset\r\n): MlinkTheme {\r\n if (!theme) {\r\n return darkTheme;\r\n }\r\n\r\n if (typeof theme === 'string') {\r\n return themePresets[theme] || darkTheme;\r\n }\r\n\r\n // Merge custom theme with dark theme as base\r\n return { ...darkTheme, ...theme };\r\n}\r\n\r\nexport function themeToCSS(theme: MlinkTheme): React.CSSProperties {\r\n return theme as unknown as React.CSSProperties;\r\n}\r\n","'use client';\r\n\r\nimport React, { createContext, useContext, useMemo } from 'react';\r\nimport type { MlinkProviderConfig, MlinkTheme } from './types';\r\nimport type { ChainConfig } from '../types';\r\nimport { resolveTheme } from './themes';\r\nimport { DEFAULT_CHAIN } from '../constants';\r\n\r\ninterface MlinkContextValue {\r\n theme: MlinkTheme;\r\n defaultChain: ChainConfig;\r\n}\r\n\r\nconst MlinkContext = createContext<MlinkContextValue | null>(null);\r\n\r\nexport interface MlinkProviderProps extends MlinkProviderConfig {\r\n children: React.ReactNode;\r\n}\r\n\r\nexport function MlinkProvider({\r\n children,\r\n theme,\r\n defaultChain = DEFAULT_CHAIN,\r\n}: MlinkProviderProps) {\r\n const resolvedTheme = useMemo(() => resolveTheme(theme), [theme]);\r\n\r\n const value = useMemo(\r\n () => ({\r\n theme: resolvedTheme,\r\n defaultChain,\r\n }),\r\n [resolvedTheme, defaultChain]\r\n );\r\n\r\n return (\r\n <MlinkContext.Provider value={value}>{children}</MlinkContext.Provider>\r\n );\r\n}\r\n\r\nexport function useMlinkContext(): MlinkContextValue {\r\n const context = useContext(MlinkContext);\r\n if (!context) {\r\n // Return defaults if not wrapped in provider\r\n return {\r\n theme: resolveTheme('dark'),\r\n defaultChain: DEFAULT_CHAIN,\r\n };\r\n }\r\n return context;\r\n}\r\n","'use client';\r\n\r\nimport React, { useState, useCallback } from 'react';\r\nimport type { MlinkProps, MlinkTheme } from './types';\r\nimport type { ActionButton } from '../types';\r\nimport { useMlink } from './useMlink';\r\nimport { useExecuteMlink } from './useExecuteMlink';\r\nimport { useMlinkContext } from './MlinkProvider';\r\nimport { resolveTheme, themeToCSS } from './themes';\r\n\r\nexport function Mlink({\r\n url,\r\n adapter,\r\n theme: themeProp,\r\n onSuccess,\r\n onError,\r\n className = '',\r\n stylePreset = 'default',\r\n}: MlinkProps) {\r\n const context = useMlinkContext();\r\n const resolvedTheme = themeProp ? resolveTheme(themeProp) : context.theme;\r\n\r\n const { status: fetchStatus, metadata, error: fetchError } = useMlink(url);\r\n\r\n const {\r\n execute,\r\n status: execStatus,\r\n txHash,\r\n error: execError,\r\n reset,\r\n } = useExecuteMlink({\r\n adapter,\r\n actionUrl: url,\r\n onSuccess,\r\n onError,\r\n });\r\n\r\n const [inputValues, setInputValues] = useState<Record<string, string>>({});\r\n\r\n const handleInputChange = useCallback((actionValue: string, value: string) => {\r\n setInputValues((prev) => ({ ...prev, [actionValue]: value }));\r\n }, []);\r\n\r\n const handleAction = useCallback(\r\n async (action: ActionButton) => {\r\n const input = action.type === 'input' ? inputValues[action.value] : undefined;\r\n await execute(action.value, input);\r\n },\r\n [execute, inputValues]\r\n );\r\n\r\n // Loading state\r\n if (fetchStatus === 'loading') {\r\n return (\r\n <MlinkContainer theme={resolvedTheme} className={className} preset={stylePreset}>\r\n <MlinkSkeleton />\r\n </MlinkContainer>\r\n );\r\n }\r\n\r\n // Error state\r\n if (fetchStatus === 'error' || !metadata) {\r\n return (\r\n <MlinkContainer theme={resolvedTheme} className={className} preset={stylePreset}>\r\n <MlinkError message={fetchError || 'Failed to load action'} />\r\n </MlinkContainer>\r\n );\r\n }\r\n\r\n // Success state after transaction\r\n if (execStatus === 'success' && txHash) {\r\n return (\r\n <MlinkContainer theme={resolvedTheme} className={className} preset={stylePreset}>\r\n <MlinkSuccess\r\n message={metadata.title}\r\n txHash={txHash}\r\n onReset={reset}\r\n />\r\n </MlinkContainer>\r\n );\r\n }\r\n\r\n return (\r\n <MlinkContainer theme={resolvedTheme} className={className} preset={stylePreset}>\r\n {/* Icon */}\r\n <div className=\"mlink-icon\">\r\n <img src={metadata.icon} alt={metadata.title} />\r\n </div>\r\n\r\n {/* Content */}\r\n <div className=\"mlink-content\">\r\n <h3 className=\"mlink-title\">{metadata.title}</h3>\r\n <p className=\"mlink-description\">{metadata.description}</p>\r\n </div>\r\n\r\n {/* Error display */}\r\n {execError && (\r\n <div className=\"mlink-error-banner\">\r\n {execError}\r\n </div>\r\n )}\r\n\r\n {/* Actions */}\r\n <div className=\"mlink-actions\">\r\n {metadata.actions.map((action, index) => (\r\n <ActionButtonComponent\r\n key={`${action.value}-${index}`}\r\n action={action}\r\n inputValue={inputValues[action.value] || ''}\r\n onInputChange={(value) => handleInputChange(action.value, value)}\r\n onExecute={() => handleAction(action)}\r\n loading={execStatus === 'executing'}\r\n disabled={metadata.disabled === true || action.disabled === true}\r\n />\r\n ))}\r\n </div>\r\n </MlinkContainer>\r\n );\r\n}\r\n\r\n// Container component\r\ninterface MlinkContainerProps {\r\n theme: MlinkTheme;\r\n className: string;\r\n preset: 'default' | 'compact' | 'minimal';\r\n children: React.ReactNode;\r\n}\r\n\r\nfunction MlinkContainer({ theme, className, preset, children }: MlinkContainerProps) {\r\n return (\r\n <div\r\n className={`mlink-container mlink-${preset} ${className}`}\r\n style={themeToCSS(theme)}\r\n >\r\n {children}\r\n </div>\r\n );\r\n}\r\n\r\n// Skeleton loading component\r\nfunction MlinkSkeleton() {\r\n return (\r\n <div className=\"mlink-skeleton\">\r\n <div className=\"mlink-skeleton-icon\" />\r\n <div className=\"mlink-skeleton-content\">\r\n <div className=\"mlink-skeleton-title\" />\r\n <div className=\"mlink-skeleton-description\" />\r\n </div>\r\n <div className=\"mlink-skeleton-button\" />\r\n </div>\r\n );\r\n}\r\n\r\n// Error component\r\nfunction MlinkError({ message }: { message: string }) {\r\n return (\r\n <div className=\"mlink-error\">\r\n <div className=\"mlink-error-icon\">!</div>\r\n <p className=\"mlink-error-message\">{message}</p>\r\n </div>\r\n );\r\n}\r\n\r\n// Success component\r\ninterface MlinkSuccessProps {\r\n message: string;\r\n txHash: string;\r\n onReset: () => void;\r\n}\r\n\r\nfunction MlinkSuccess({ message, txHash, onReset }: MlinkSuccessProps) {\r\n const shortHash = `${txHash.slice(0, 10)}...${txHash.slice(-8)}`;\r\n\r\n return (\r\n <div className=\"mlink-success\">\r\n <div className=\"mlink-success-icon\">✓</div>\r\n <h3 className=\"mlink-success-title\">Transaction Sent</h3>\r\n <p className=\"mlink-success-message\">{message}</p>\r\n <code className=\"mlink-success-hash\">{shortHash}</code>\r\n <button className=\"mlink-button mlink-button-secondary\" onClick={onReset}>\r\n Done\r\n </button>\r\n </div>\r\n );\r\n}\r\n\r\n// Action button component\r\ninterface ActionButtonComponentProps {\r\n action: ActionButton;\r\n inputValue: string;\r\n onInputChange: (value: string) => void;\r\n onExecute: () => void;\r\n loading: boolean;\r\n disabled: boolean;\r\n}\r\n\r\nfunction ActionButtonComponent({\r\n action,\r\n inputValue,\r\n onInputChange,\r\n onExecute,\r\n loading,\r\n disabled,\r\n}: ActionButtonComponentProps) {\r\n if (action.type === 'input') {\r\n return (\r\n <div className=\"mlink-input-group\">\r\n <input\r\n type=\"text\"\r\n className=\"mlink-input\"\r\n placeholder={action.placeholder || action.label}\r\n value={inputValue}\r\n onChange={(e) => onInputChange(e.target.value)}\r\n disabled={disabled || loading}\r\n />\r\n <button\r\n className=\"mlink-button\"\r\n onClick={onExecute}\r\n disabled={disabled || loading || !inputValue.trim()}\r\n >\r\n {loading ? <MlinkSpinner /> : action.label}\r\n </button>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <button\r\n className=\"mlink-button\"\r\n onClick={onExecute}\r\n disabled={disabled || loading}\r\n >\r\n {loading ? <MlinkSpinner /> : action.label}\r\n </button>\r\n );\r\n}\r\n\r\n// Spinner component\r\nfunction MlinkSpinner() {\r\n return <span className=\"mlink-spinner\" />;\r\n}\r\n\r\nexport default Mlink;\r\n","'use client';\r\n\r\nimport { useMemo } from 'react';\r\nimport type {\r\n MlinkAdapter,\r\n WagmiAdapterConfig,\r\n EthersAdapterConfig,\r\n} from './types';\r\nimport type { EVMTransaction } from '../types';\r\n\r\n/**\r\n * Create a Mlink adapter from wagmi hooks\r\n *\r\n * @example\r\n * ```tsx\r\n * import { useAccount, useConnect, useSendTransaction } from 'wagmi';\r\n * import { useMlinkWagmiAdapter } from '@dipansrimany/mlink-sdk/react';\r\n *\r\n * function MyComponent() {\r\n * const { address, isConnected } = useAccount();\r\n * const { connectAsync, connectors } = useConnect();\r\n * const { sendTransactionAsync } = useSendTransaction();\r\n *\r\n * const adapter = useMlinkWagmiAdapter({\r\n * address,\r\n * isConnected,\r\n * connect: async () => {\r\n * await connectAsync({ connector: connectors[0] });\r\n * },\r\n * sendTransaction: sendTransactionAsync,\r\n * });\r\n *\r\n * return <Mlink url=\"...\" adapter={adapter} />;\r\n * }\r\n * ```\r\n */\r\nexport function useMlinkWagmiAdapter(config: WagmiAdapterConfig): MlinkAdapter {\r\n const { address, isConnected, connect, sendTransaction } = config;\r\n\r\n return useMemo(\r\n () => ({\r\n connect: async () => {\r\n await connect();\r\n if (!address) {\r\n throw new Error('Failed to connect wallet');\r\n }\r\n return address;\r\n },\r\n\r\n signAndSendTransaction: async (transaction: EVMTransaction) => {\r\n const txHash = await sendTransaction({\r\n to: transaction.to as `0x${string}`,\r\n value: BigInt(transaction.value),\r\n data: transaction.data as `0x${string}`,\r\n chainId: transaction.chainId,\r\n });\r\n return txHash;\r\n },\r\n\r\n isConnected: () => isConnected,\r\n\r\n getAddress: () => address || null,\r\n }),\r\n [address, isConnected, connect, sendTransaction]\r\n );\r\n}\r\n\r\n/**\r\n * Create a Mlink adapter from ethers.js signer\r\n *\r\n * @example\r\n * ```tsx\r\n * import { useSigner } from 'some-ethers-provider';\r\n * import { useMlinkEthersAdapter } from '@dipansrimany/mlink-sdk/react';\r\n *\r\n * function MyComponent() {\r\n * const { signer, connect } = useSigner();\r\n *\r\n * const adapter = useMlinkEthersAdapter({\r\n * signer,\r\n * connect,\r\n * });\r\n *\r\n * return <Mlink url=\"...\" adapter={adapter} />;\r\n * }\r\n * ```\r\n */\r\nexport function useMlinkEthersAdapter(\r\n config: EthersAdapterConfig\r\n): MlinkAdapter {\r\n const { signer, connect } = config;\r\n\r\n return useMemo(\r\n () => ({\r\n connect: async () => {\r\n await connect();\r\n if (!signer) {\r\n throw new Error('Failed to connect wallet');\r\n }\r\n return await signer.getAddress();\r\n },\r\n\r\n signAndSendTransaction: async (transaction: EVMTransaction) => {\r\n if (!signer) {\r\n throw new Error('Wallet not connected');\r\n }\r\n\r\n const tx = await signer.sendTransaction({\r\n to: transaction.to,\r\n value: BigInt(transaction.value),\r\n data: transaction.data,\r\n chainId: transaction.chainId,\r\n });\r\n\r\n return tx.hash;\r\n },\r\n\r\n isConnected: () => signer !== null,\r\n\r\n getAddress: () => null, // Ethers requires async call\r\n }),\r\n [signer, connect]\r\n );\r\n}\r\n\r\n/**\r\n * Create a custom Mlink adapter\r\n *\r\n * @example\r\n * ```tsx\r\n * import { createMlinkAdapter } from '@dipansrimany/mlink-sdk/react';\r\n *\r\n * const adapter = createMlinkAdapter({\r\n * connect: async () => {\r\n * // Your connect logic\r\n * return '0x...';\r\n * },\r\n * signAndSendTransaction: async (tx) => {\r\n * // Your transaction logic\r\n * return '0x...txHash';\r\n * },\r\n * isConnected: () => true,\r\n * getAddress: () => '0x...',\r\n * });\r\n * ```\r\n */\r\nexport function createMlinkAdapter(adapter: MlinkAdapter): MlinkAdapter {\r\n return adapter;\r\n}\r\n"]}
1
+ {"version":3,"sources":["../../src/constants.ts","../../src/utils.ts","../../src/validators.ts","../../src/react/useMlink.ts","../../src/react/useExecuteMlink.ts","../../src/react/themes.ts","../../src/react/MlinkProvider.tsx","../../src/builders.ts","../../src/react/Mlink.tsx","../../src/react/adapters.ts"],"names":["useState","useCallback","useMemo","jsx"],"mappings":"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","file":"index.mjs","sourcesContent":["import type { ChainConfig } from './types';\n\nexport const MANTLE_MAINNET: ChainConfig = {\n chainId: 5000,\n name: 'Mantle',\n rpcUrl: 'https://rpc.mantle.xyz',\n explorerUrl: 'https://mantlescan.xyz',\n nativeCurrency: {\n name: 'MNT',\n symbol: 'MNT',\n decimals: 18,\n },\n};\n\nexport const MANTLE_SEPOLIA: ChainConfig = {\n chainId: 5003,\n name: 'Mantle Sepolia',\n rpcUrl: 'https://rpc.sepolia.mantle.xyz',\n explorerUrl: 'https://sepolia.mantlescan.xyz',\n nativeCurrency: {\n name: 'MNT',\n symbol: 'MNT',\n decimals: 18,\n },\n};\n\nexport const SUPPORTED_CHAINS: ChainConfig[] = [MANTLE_MAINNET, MANTLE_SEPOLIA];\n\nexport const DEFAULT_CHAIN = MANTLE_SEPOLIA;\n\nexport const BLINK_BASE_URL = 'https://blink.mantle.xyz';\n\nexport const ACTION_QUERY_PARAM = 'action';\n\n// Registry URL for validation\nexport const REGISTRY_URL = 'https://mlinks-fe.vercel.app';\nexport const REGISTRY_VALIDATE_ENDPOINT = '/api/registry/validate';\n","import {\n BLINK_BASE_URL,\n ACTION_QUERY_PARAM,\n SUPPORTED_CHAINS,\n} from './constants';\nimport type { ChainConfig } from './types';\n\n// Create Blink URL from Action URL\nexport function createBlinkUrl(\n actionUrl: string,\n baseUrl: string = BLINK_BASE_URL\n): string {\n // Validate actionUrl is a valid URL\n try {\n new URL(actionUrl);\n } catch {\n throw new Error('Invalid action URL');\n }\n\n const encodedAction = encodeURIComponent(actionUrl);\n return `${baseUrl}/mlink?${ACTION_QUERY_PARAM}=${encodedAction}`;\n}\n\n// Parse Blink URL to extract Action URL\nexport function parseBlinkUrl(blinkUrl: string): string | null {\n try {\n const url = new URL(blinkUrl);\n const actionParam = url.searchParams.get(ACTION_QUERY_PARAM);\n\n if (!actionParam) return null;\n\n const actionUrl = decodeURIComponent(actionParam);\n\n // Validate it's a valid URL\n new URL(actionUrl);\n\n return actionUrl;\n } catch {\n return null;\n }\n}\n\n// Check if URL is a valid Blink URL\nexport function isBlinkUrl(url: string): boolean {\n return parseBlinkUrl(url) !== null;\n}\n\n// Convert human readable amount to wei string\nexport function parseEther(amount: string | number): string {\n const value = typeof amount === 'string' ? parseFloat(amount) : amount;\n if (isNaN(value) || value < 0) {\n throw new Error('Invalid amount');\n }\n const wei = BigInt(Math.floor(value * 1e18));\n return wei.toString();\n}\n\n// Convert wei to human readable amount\nexport function formatEther(wei: string | bigint): string {\n const value = typeof wei === 'string' ? BigInt(wei) : wei;\n const ether = Number(value) / 1e18;\n return ether.toFixed(6).replace(/\\.?0+$/, '');\n}\n\n// Shorten address for display\nexport function shortenAddress(address: string): string {\n if (!address || address.length < 10) return address;\n return `${address.slice(0, 6)}...${address.slice(-4)}`;\n}\n\n// Get explorer URL for transaction\nexport function getExplorerUrl(chainId: number, txHash: string): string {\n const chain = getChainById(chainId);\n if (!chain) return '';\n return `${chain.explorerUrl}/tx/${txHash}`;\n}\n\n// Get chain config by ID\nexport function getChainById(chainId: number): ChainConfig | undefined {\n return SUPPORTED_CHAINS.find((c) => c.chainId === chainId);\n}\n\n// Get explorer URL for address\nexport function getAddressExplorerUrl(\n chainId: number,\n address: string\n): string {\n const chain = getChainById(chainId);\n if (!chain) return '';\n return `${chain.explorerUrl}/address/${address}`;\n}\n","import { z } from 'zod';\nimport type {\n ActionMetadata,\n TransactionRequest,\n TransactionResponse,\n LinkedAction,\n TypedActionParameter,\n ValidationResult,\n} from './types';\n\n// Ethereum address regex\nconst addressRegex = /^0x[a-fA-F0-9]{40}$/;\n\n// Hex string regex\nconst hexRegex = /^0x[a-fA-F0-9]*$/;\n\n// =============================================================================\n// LEGACY SCHEMAS (Backwards compatible)\n// =============================================================================\n\nexport const ActionButtonSchema = z.object({\n label: z.string().min(1).max(50),\n value: z.string().min(1),\n type: z.enum(['button', 'input']),\n placeholder: z.string().optional(),\n disabled: z.boolean().optional(),\n});\n\n// =============================================================================\n// SOLANA-STYLE PARAMETER SCHEMAS\n// =============================================================================\n\n/**\n * Parameter types enum\n */\nexport const ActionParameterTypeSchema = z.enum([\n 'text',\n 'number',\n 'email',\n 'url',\n 'date',\n 'datetime-local',\n 'textarea',\n 'select',\n 'radio',\n 'checkbox',\n 'address',\n 'token',\n 'amount',\n]);\n\n/**\n * Option for select/radio/checkbox\n */\nexport const ActionParameterOptionSchema = z.object({\n label: z.string().min(1),\n value: z.string(),\n selected: z.boolean().optional(),\n});\n\n/**\n * Base parameter fields\n */\nconst ActionParameterBaseSchema = z.object({\n name: z.string().min(1).max(50),\n label: z.string().max(100).optional(),\n required: z.boolean().optional(),\n pattern: z.string().optional(),\n patternDescription: z.string().optional(),\n min: z.union([z.string(), z.number()]).optional(),\n max: z.union([z.string(), z.number()]).optional(),\n});\n\n/**\n * Non-selectable parameter (text, number, etc.)\n */\nexport const ActionParameterSchema = ActionParameterBaseSchema.extend({\n type: z.enum([\n 'text', 'number', 'email', 'url', 'date', 'datetime-local',\n 'textarea', 'address', 'token', 'amount'\n ]).optional(),\n});\n\n/**\n * Selectable parameter (select, radio, checkbox)\n */\nexport const ActionParameterSelectableSchema = ActionParameterBaseSchema.extend({\n type: z.enum(['select', 'radio', 'checkbox']),\n options: z.array(ActionParameterOptionSchema).min(1),\n});\n\n/**\n * Union of all parameter types\n */\nexport const TypedActionParameterSchema = z.union([\n ActionParameterSelectableSchema,\n ActionParameterSchema,\n]);\n\n// =============================================================================\n// LINKED ACTION SCHEMAS\n// =============================================================================\n\n/**\n * Linked action type enum\n */\nexport const LinkedActionTypeSchema = z.enum(['transaction', 'post', 'external-link']);\n\n/**\n * Linked action with href template and parameters\n */\nexport const LinkedActionSchema = z.object({\n type: LinkedActionTypeSchema.optional(),\n href: z.string().min(1),\n label: z.string().min(1).max(50),\n disabled: z.boolean().optional(),\n parameters: z.array(TypedActionParameterSchema).optional(),\n});\n\n/**\n * Links section containing linked actions\n */\nexport const ActionLinksSchema = z.object({\n actions: z.array(LinkedActionSchema).min(1),\n});\n\n// =============================================================================\n// ACTION CHAINING SCHEMAS\n// =============================================================================\n\nexport const PostNextActionLinkSchema = z.object({\n type: z.literal('post'),\n href: z.string().min(1),\n});\n\nexport const InlineNextActionLinkSchema: z.ZodType<{ type: 'inline'; action: ActionMetadata }> = z.object({\n type: z.literal('inline'),\n action: z.lazy(() => ActionMetadataSchema),\n});\n\nexport const NextActionLinkSchema = z.union([\n PostNextActionLinkSchema,\n InlineNextActionLinkSchema,\n]);\n\n// =============================================================================\n// MAIN SCHEMAS (Enhanced)\n// =============================================================================\n\n/**\n * Icon can be URL or base64 data URI\n */\nconst iconSchema = z.string().refine(\n (val) => {\n // Allow URLs\n if (val.startsWith('http://') || val.startsWith('https://')) return true;\n // Allow base64 data URIs\n if (val.startsWith('data:image/')) return true;\n // Allow relative paths\n if (val.startsWith('/')) return true;\n return false;\n },\n { message: 'Icon must be a valid URL, base64 data URI, or relative path' }\n);\n\n/**\n * Enhanced ActionMetadata schema with links support\n */\nexport const ActionMetadataSchema = z.object({\n type: z.enum(['action', 'completed']).optional(),\n title: z.string().min(1).max(200),\n icon: iconSchema,\n description: z.string().min(1).max(1000),\n label: z.string().max(50).optional(),\n // Legacy actions (optional)\n actions: z.array(ActionButtonSchema).optional(),\n // Solana-style linked actions (optional)\n links: ActionLinksSchema.optional(),\n disabled: z.boolean().optional(),\n error: z.object({ message: z.string() }).optional(),\n}).refine(\n (data) => {\n // Must have either actions or links (or both)\n return (data.actions && data.actions.length > 0) ||\n (data.links?.actions && data.links.actions.length > 0);\n },\n { message: 'Must have at least one action or linked action' }\n);\n\n/**\n * Enhanced TransactionRequest with data support\n */\nexport const TransactionRequestSchema = z.object({\n account: z.string().regex(addressRegex, 'Invalid Ethereum address'),\n action: z.string().min(1),\n input: z.string().optional(),\n // Solana-style parameter data\n data: z.record(z.union([z.string(), z.array(z.string())])).optional(),\n});\n\nexport const EVMTransactionSchema = z.object({\n to: z.string().regex(addressRegex, 'Invalid to address'),\n value: z.string(),\n data: z.string().regex(hexRegex, 'Invalid hex data'),\n chainId: z.number().positive(),\n});\n\n/**\n * Enhanced TransactionResponse with multi-tx and chaining support\n */\nexport const TransactionResponseSchema = z.object({\n // Single transaction (legacy)\n transaction: EVMTransactionSchema.optional(),\n // Multiple transactions (batch)\n transactions: z.array(EVMTransactionSchema).optional(),\n message: z.string().optional(),\n // Action chaining\n links: z.object({\n next: NextActionLinkSchema.optional(),\n }).optional(),\n}).refine(\n (data) => {\n // Must have either transaction or transactions\n return data.transaction !== undefined || (data.transactions && data.transactions.length > 0);\n },\n { message: 'Must have either transaction or transactions' }\n);\n\n// Validation functions\nexport function validateActionMetadata(\n data: unknown\n): ValidationResult<ActionMetadata> {\n const result = ActionMetadataSchema.safeParse(data);\n if (result.success) {\n return { success: true, data: result.data as ActionMetadata };\n }\n return { success: false, error: result.error.message };\n}\n\nexport function validateTransactionRequest(\n data: unknown\n): ValidationResult<TransactionRequest> {\n const result = TransactionRequestSchema.safeParse(data);\n if (result.success) {\n return { success: true, data: result.data };\n }\n return { success: false, error: result.error.message };\n}\n\nexport function validateTransactionResponse(\n data: unknown\n): ValidationResult<TransactionResponse> {\n const result = TransactionResponseSchema.safeParse(data);\n if (result.success) {\n return { success: true, data: result.data as TransactionResponse };\n }\n return { success: false, error: result.error.message };\n}\n\nexport function isValidAddress(address: string): boolean {\n return addressRegex.test(address);\n}\n\nexport function isValidHex(hex: string): boolean {\n return hexRegex.test(hex);\n}\n\n// =============================================================================\n// NEW VALIDATION FUNCTIONS\n// =============================================================================\n\n/**\n * Validate a linked action\n */\nexport function validateLinkedAction(\n data: unknown\n): ValidationResult<LinkedAction> {\n const result = LinkedActionSchema.safeParse(data);\n if (result.success) {\n return { success: true, data: result.data as LinkedAction };\n }\n return { success: false, error: result.error.message };\n}\n\n/**\n * Validate a parameter\n */\nexport function validateParameter(\n data: unknown\n): ValidationResult<TypedActionParameter> {\n const result = TypedActionParameterSchema.safeParse(data);\n if (result.success) {\n return { success: true, data: result.data as TypedActionParameter };\n }\n return { success: false, error: result.error.message };\n}\n\n/**\n * Validate parameter values against their definitions\n */\nexport function validateParameterValues(\n parameters: TypedActionParameter[],\n values: Record<string, string | string[]>\n): ValidationResult<Record<string, string | string[]>> {\n const errors: string[] = [];\n\n for (const param of parameters) {\n const value = values[param.name];\n\n // Check required\n if (param.required && (value === undefined || value === '' || (Array.isArray(value) && value.length === 0))) {\n errors.push(`${param.label || param.name} is required`);\n continue;\n }\n\n // Skip validation if no value and not required\n if (value === undefined || value === '') continue;\n\n const strValue = Array.isArray(value) ? value[0] : value;\n\n // Validate pattern\n if (param.pattern && strValue) {\n const regex = new RegExp(param.pattern);\n if (!regex.test(strValue)) {\n errors.push(param.patternDescription || `${param.label || param.name} has invalid format`);\n }\n }\n\n // Validate min/max for number types\n if ((param.type === 'number' || param.type === 'amount') && strValue) {\n const numValue = parseFloat(strValue);\n if (isNaN(numValue)) {\n errors.push(`${param.label || param.name} must be a number`);\n } else {\n if (param.min !== undefined && numValue < Number(param.min)) {\n errors.push(`${param.label || param.name} must be at least ${param.min}`);\n }\n if (param.max !== undefined && numValue > Number(param.max)) {\n errors.push(`${param.label || param.name} must be at most ${param.max}`);\n }\n }\n }\n\n // Validate address type\n if (param.type === 'address' && strValue && !isValidAddress(strValue)) {\n errors.push(`${param.label || param.name} must be a valid Ethereum address`);\n }\n }\n\n if (errors.length > 0) {\n return { success: false, error: errors.join(', ') };\n }\n\n return { success: true, data: values };\n}\n","'use client';\r\n\r\nimport { useState, useEffect, useCallback, useRef } from 'react';\r\nimport type { ActionMetadata } from '../types';\r\nimport type { MlinkInstance, MlinkStatus, UseMlinkOptions, RegistrationResult } from './types';\r\nimport { parseBlinkUrl } from '../utils';\r\nimport { validateActionMetadata } from '../validators';\r\nimport { REGISTRY_URL, REGISTRY_VALIDATE_ENDPOINT } from '../constants';\r\n\r\nconst DEFAULT_REFRESH_INTERVAL = 10 * 60 * 1000; // 10 minutes\r\n\r\nexport function useMlink(\r\n url: string,\r\n options: UseMlinkOptions = {}\r\n): MlinkInstance {\r\n const {\r\n refreshInterval = DEFAULT_REFRESH_INTERVAL,\r\n enabled = true,\r\n registryUrl = REGISTRY_URL,\r\n requireRegistration = true,\r\n allowPending = true,\r\n allowBlocked = false,\r\n } = options;\r\n\r\n const [status, setStatus] = useState<MlinkStatus>('idle');\r\n const [metadata, setMetadata] = useState<ActionMetadata | null>(null);\r\n const [error, setError] = useState<string | null>(null);\r\n const [registration, setRegistration] = useState<RegistrationResult | null>(null);\r\n\r\n const abortControllerRef = useRef<AbortController | null>(null);\r\n const intervalRef = useRef<ReturnType<typeof setInterval> | null>(null);\r\n\r\n // Extract action URL from mlink URL if needed\r\n const actionUrl = parseBlinkUrl(url) || url;\r\n\r\n // Validate against registry\r\n const validateRegistration = useCallback(async (): Promise<RegistrationResult | null> => {\r\n if (!actionUrl || !requireRegistration) return null;\r\n\r\n try {\r\n const validateUrl = `${registryUrl}${REGISTRY_VALIDATE_ENDPOINT}?url=${encodeURIComponent(actionUrl)}`;\r\n const response = await fetch(validateUrl, {\r\n method: 'GET',\r\n headers: {\r\n Accept: 'application/json',\r\n },\r\n });\r\n\r\n const data = await response.json();\r\n return data as RegistrationResult;\r\n } catch (err) {\r\n console.error('Registry validation error:', err);\r\n // If registry is unreachable, we can either fail or allow\r\n // For now, we'll return a failure result\r\n return {\r\n isRegistered: false,\r\n status: null,\r\n error: 'Unable to validate against registry. Please try again later.',\r\n };\r\n }\r\n }, [actionUrl, registryUrl, requireRegistration]);\r\n\r\n const fetchMetadata = useCallback(async () => {\r\n if (!actionUrl || !enabled) return;\r\n\r\n // Abort previous request if still pending\r\n if (abortControllerRef.current) {\r\n abortControllerRef.current.abort();\r\n }\r\n\r\n abortControllerRef.current = new AbortController();\r\n\r\n setStatus('validating');\r\n setError(null);\r\n\r\n try {\r\n // Step 1: Validate against registry (if required)\r\n if (requireRegistration) {\r\n const registrationResult = await validateRegistration();\r\n setRegistration(registrationResult);\r\n\r\n if (registrationResult) {\r\n // Check if mlink is registered\r\n if (!registrationResult.isRegistered) {\r\n setError(registrationResult.error || 'This MLink is not registered.');\r\n setStatus('unregistered');\r\n return;\r\n }\r\n\r\n // Check if mlink is blocked\r\n if (registrationResult.status === 'blocked' && !allowBlocked) {\r\n setError('This MLink has been blocked for policy violations.');\r\n setStatus('blocked');\r\n return;\r\n }\r\n\r\n // Check if mlink is pending (and if we allow pending)\r\n if (registrationResult.status === 'pending' && !allowPending) {\r\n setError('This MLink is pending review and not yet available.');\r\n setStatus('error');\r\n return;\r\n }\r\n }\r\n }\r\n\r\n // Step 2: Fetch action metadata\r\n setStatus('loading');\r\n\r\n const response = await fetch(actionUrl, {\r\n method: 'GET',\r\n headers: {\r\n Accept: 'application/json',\r\n },\r\n signal: abortControllerRef.current.signal,\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\r\n }\r\n\r\n const data = await response.json();\r\n\r\n // Validate the response\r\n const validation = validateActionMetadata(data);\r\n if (!validation.success) {\r\n throw new Error(`Invalid metadata: ${validation.error}`);\r\n }\r\n\r\n setMetadata(validation.data);\r\n setStatus('ready');\r\n } catch (err) {\r\n if (err instanceof Error && err.name === 'AbortError') {\r\n return; // Ignore abort errors\r\n }\r\n\r\n const errorMessage =\r\n err instanceof Error ? err.message : 'Failed to fetch mlink data';\r\n setError(errorMessage);\r\n setStatus('error');\r\n }\r\n }, [actionUrl, enabled, requireRegistration, validateRegistration, allowBlocked, allowPending]);\r\n\r\n // Initial fetch\r\n useEffect(() => {\r\n if (enabled) {\r\n fetchMetadata();\r\n }\r\n\r\n return () => {\r\n if (abortControllerRef.current) {\r\n abortControllerRef.current.abort();\r\n }\r\n };\r\n }, [fetchMetadata, enabled]);\r\n\r\n // Set up refresh interval\r\n useEffect(() => {\r\n if (!enabled || !refreshInterval) return;\r\n\r\n intervalRef.current = setInterval(() => {\r\n fetchMetadata();\r\n }, refreshInterval);\r\n\r\n return () => {\r\n if (intervalRef.current) {\r\n clearInterval(intervalRef.current);\r\n }\r\n };\r\n }, [fetchMetadata, refreshInterval, enabled]);\r\n\r\n return {\r\n status,\r\n metadata,\r\n error,\r\n url: actionUrl,\r\n refresh: fetchMetadata,\r\n registration,\r\n isRegistered: registration?.isRegistered ?? false,\r\n };\r\n}\r\n","'use client';\r\n\r\nimport { useState, useCallback } from 'react';\r\nimport type {\r\n MlinkAdapter,\r\n MlinkStatus,\r\n ExecutionResult,\r\n UseExecuteMlinkReturn,\r\n} from './types';\r\nimport type { TransactionResponse, EVMTransaction } from '../types';\r\nimport { validateTransactionResponse } from '../validators';\r\n\r\ninterface UseExecuteMlinkOptions {\r\n adapter: MlinkAdapter;\r\n actionUrl: string;\r\n onSuccess?: (txHash: string, action: string) => void;\r\n onError?: (error: string) => void;\r\n}\r\n\r\n/**\r\n * Enhanced UseExecuteMlinkReturn with data parameter support\r\n */\r\nexport interface UseExecuteMlinkReturnEnhanced extends Omit<UseExecuteMlinkReturn, 'execute'> {\r\n execute: (\r\n action: string,\r\n input?: string,\r\n data?: Record<string, string | string[]>\r\n ) => Promise<ExecutionResult>;\r\n}\r\n\r\nexport function useExecuteMlink(\r\n options: UseExecuteMlinkOptions\r\n): UseExecuteMlinkReturnEnhanced {\r\n const { adapter, actionUrl, onSuccess, onError } = options;\r\n\r\n const [status, setStatus] = useState<MlinkStatus>('ready');\r\n const [txHash, setTxHash] = useState<string | null>(null);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n const reset = useCallback(() => {\r\n setStatus('ready');\r\n setTxHash(null);\r\n setError(null);\r\n }, []);\r\n\r\n const execute = useCallback(\r\n async (\r\n action: string,\r\n input?: string,\r\n data?: Record<string, string | string[]>\r\n ): Promise<ExecutionResult> => {\r\n setStatus('executing');\r\n setError(null);\r\n setTxHash(null);\r\n\r\n try {\r\n // Ensure wallet is connected\r\n let account = adapter.getAddress();\r\n if (!adapter.isConnected() || !account) {\r\n account = await adapter.connect();\r\n }\r\n\r\n // Make POST request to get transaction\r\n const response = await fetch(actionUrl, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n body: JSON.stringify({\r\n account,\r\n action,\r\n input,\r\n data, // Include parameter data\r\n }),\r\n });\r\n\r\n if (!response.ok) {\r\n const errorData = await response.json().catch(() => ({}));\r\n throw new Error(\r\n errorData.error?.message || errorData.message || `HTTP ${response.status}: ${response.statusText}`\r\n );\r\n }\r\n\r\n const responseData: TransactionResponse = await response.json();\r\n\r\n // Get transactions (support both single and multiple)\r\n const transactions: EVMTransaction[] = responseData.transactions\r\n ? responseData.transactions\r\n : responseData.transaction\r\n ? [responseData.transaction]\r\n : [];\r\n\r\n if (transactions.length === 0) {\r\n throw new Error('No transaction returned from action');\r\n }\r\n\r\n // Execute all transactions sequentially\r\n let lastHash = '';\r\n for (const tx of transactions) {\r\n lastHash = await adapter.signAndSendTransaction(tx);\r\n }\r\n\r\n setTxHash(lastHash);\r\n setStatus('success');\r\n onSuccess?.(lastHash, action);\r\n\r\n return {\r\n success: true,\r\n txHash: lastHash,\r\n message: responseData.message,\r\n };\r\n } catch (err) {\r\n const errorMessage =\r\n err instanceof Error ? err.message : 'Transaction failed';\r\n setError(errorMessage);\r\n setStatus('error');\r\n onError?.(errorMessage);\r\n\r\n return {\r\n success: false,\r\n error: errorMessage,\r\n };\r\n }\r\n },\r\n [adapter, actionUrl, onSuccess, onError]\r\n );\r\n\r\n return {\r\n execute,\r\n status,\r\n txHash,\r\n error,\r\n reset,\r\n };\r\n}\r\n","import type { MlinkTheme, MlinkThemePreset } from './types';\r\n\r\nexport const lightTheme: MlinkTheme = {\r\n // Colors\r\n '--mlink-bg-primary': '#ffffff',\r\n '--mlink-bg-secondary': '#f8f9fa',\r\n '--mlink-border-color': '#e9ecef',\r\n '--mlink-text-primary': '#212529',\r\n '--mlink-text-secondary': '#6c757d',\r\n '--mlink-text-link': '#0d6efd',\r\n '--mlink-button-bg': '#212529',\r\n '--mlink-button-text': '#ffffff',\r\n '--mlink-button-hover': '#343a40',\r\n '--mlink-button-disabled': '#adb5bd',\r\n '--mlink-input-bg': '#ffffff',\r\n '--mlink-input-border': '#ced4da',\r\n '--mlink-input-text': '#212529',\r\n '--mlink-input-placeholder': '#adb5bd',\r\n '--mlink-success': '#198754',\r\n '--mlink-error': '#dc3545',\r\n '--mlink-warning': '#ffc107',\r\n // Sizing\r\n '--mlink-border-radius': '12px',\r\n '--mlink-button-radius': '8px',\r\n '--mlink-input-radius': '8px',\r\n // Shadows\r\n '--mlink-shadow': '0 2px 8px rgba(0, 0, 0, 0.08)',\r\n};\r\n\r\nexport const darkTheme: MlinkTheme = {\r\n // Colors\r\n '--mlink-bg-primary': '#1a1a1a',\r\n '--mlink-bg-secondary': '#2d2d2d',\r\n '--mlink-border-color': '#404040',\r\n '--mlink-text-primary': '#ffffff',\r\n '--mlink-text-secondary': '#a0a0a0',\r\n '--mlink-text-link': '#60a5fa',\r\n '--mlink-button-bg': '#ffffff',\r\n '--mlink-button-text': '#1a1a1a',\r\n '--mlink-button-hover': '#e5e5e5',\r\n '--mlink-button-disabled': '#525252',\r\n '--mlink-input-bg': '#2d2d2d',\r\n '--mlink-input-border': '#404040',\r\n '--mlink-input-text': '#ffffff',\r\n '--mlink-input-placeholder': '#6b7280',\r\n '--mlink-success': '#22c55e',\r\n '--mlink-error': '#ef4444',\r\n '--mlink-warning': '#f59e0b',\r\n // Sizing\r\n '--mlink-border-radius': '12px',\r\n '--mlink-button-radius': '8px',\r\n '--mlink-input-radius': '8px',\r\n // Shadows\r\n '--mlink-shadow': '0 2px 8px rgba(0, 0, 0, 0.3)',\r\n};\r\n\r\nexport const mantleTheme: MlinkTheme = {\r\n // Colors - Mantle brand colors\r\n '--mlink-bg-primary': '#0a0a0a',\r\n '--mlink-bg-secondary': '#141414',\r\n '--mlink-border-color': '#2a2a2a',\r\n '--mlink-text-primary': '#ffffff',\r\n '--mlink-text-secondary': '#9ca3af',\r\n '--mlink-text-link': '#65d9e4',\r\n '--mlink-button-bg': '#65d9e4',\r\n '--mlink-button-text': '#000000',\r\n '--mlink-button-hover': '#85e3ec',\r\n '--mlink-button-disabled': '#374151',\r\n '--mlink-input-bg': '#1f1f1f',\r\n '--mlink-input-border': '#374151',\r\n '--mlink-input-text': '#ffffff',\r\n '--mlink-input-placeholder': '#6b7280',\r\n '--mlink-success': '#34d399',\r\n '--mlink-error': '#f87171',\r\n '--mlink-warning': '#fbbf24',\r\n // Sizing\r\n '--mlink-border-radius': '16px',\r\n '--mlink-button-radius': '10px',\r\n '--mlink-input-radius': '10px',\r\n // Shadows\r\n '--mlink-shadow': '0 4px 16px rgba(101, 217, 228, 0.1)',\r\n};\r\n\r\nexport const themePresets: Record<MlinkThemePreset, MlinkTheme> = {\r\n light: lightTheme,\r\n dark: darkTheme,\r\n mantle: mantleTheme,\r\n};\r\n\r\nexport function resolveTheme(\r\n theme?: Partial<MlinkTheme> | MlinkThemePreset\r\n): MlinkTheme {\r\n if (!theme) {\r\n return darkTheme;\r\n }\r\n\r\n if (typeof theme === 'string') {\r\n return themePresets[theme] || darkTheme;\r\n }\r\n\r\n // Merge custom theme with dark theme as base\r\n return { ...darkTheme, ...theme };\r\n}\r\n\r\nexport function themeToCSS(theme: MlinkTheme): React.CSSProperties {\r\n return theme as unknown as React.CSSProperties;\r\n}\r\n","'use client';\r\n\r\nimport React, { createContext, useContext, useMemo } from 'react';\r\nimport type { MlinkProviderConfig, MlinkTheme } from './types';\r\nimport type { ChainConfig } from '../types';\r\nimport { resolveTheme } from './themes';\r\nimport { DEFAULT_CHAIN } from '../constants';\r\n\r\ninterface MlinkContextValue {\r\n theme: MlinkTheme;\r\n defaultChain: ChainConfig;\r\n}\r\n\r\nconst MlinkContext = createContext<MlinkContextValue | null>(null);\r\n\r\nexport interface MlinkProviderProps extends MlinkProviderConfig {\r\n children: React.ReactNode;\r\n}\r\n\r\nexport function MlinkProvider({\r\n children,\r\n theme,\r\n defaultChain = DEFAULT_CHAIN,\r\n}: MlinkProviderProps) {\r\n const resolvedTheme = useMemo(() => resolveTheme(theme), [theme]);\r\n\r\n const value = useMemo(\r\n () => ({\r\n theme: resolvedTheme,\r\n defaultChain,\r\n }),\r\n [resolvedTheme, defaultChain]\r\n );\r\n\r\n return (\r\n <MlinkContext.Provider value={value}>{children}</MlinkContext.Provider>\r\n );\r\n}\r\n\r\nexport function useMlinkContext(): MlinkContextValue {\r\n const context = useContext(MlinkContext);\r\n if (!context) {\r\n // Return defaults if not wrapped in provider\r\n return {\r\n theme: resolveTheme('dark'),\r\n defaultChain: DEFAULT_CHAIN,\r\n };\r\n }\r\n return context;\r\n}\r\n","import type {\n ActionButton,\n ActionDefinition,\n ActionMetadata,\n TransactionRequest,\n TransactionResponse,\n LinkedAction,\n TypedActionParameter,\n ActionParameter,\n ActionParameterSelectable,\n ActionParameterOption,\n ActionParameterType,\n SelectableParameterType,\n ActionLinks,\n} from './types';\nimport { validateTransactionRequest } from './validators';\n\n// Create a button action\nexport function button(config: {\n label: string;\n value: string;\n disabled?: boolean;\n}): ActionButton {\n return {\n label: config.label,\n value: config.value,\n type: 'button',\n disabled: config.disabled,\n };\n}\n\n// Create an input action\nexport function input(config: {\n label: string;\n placeholder?: string;\n disabled?: boolean;\n}): ActionButton {\n return {\n label: config.label,\n value: '__input__',\n type: 'input',\n placeholder: config.placeholder,\n disabled: config.disabled,\n };\n}\n\n// =============================================================================\n// SOLANA-STYLE LINKED ACTIONS & PARAMETERS BUILDERS\n// =============================================================================\n\n/**\n * Create a linked action with optional parameters\n * Uses Solana-style href templates with {parameter} placeholders\n *\n * @example\n * ```ts\n * linkedAction({\n * href: '/api/swap?amount={amount}&token={token}',\n * label: 'Swap Tokens',\n * parameters: [\n * textParam({ name: 'amount', label: 'Amount', required: true }),\n * selectParam({\n * name: 'token',\n * label: 'Token',\n * options: [\n * { label: 'USDC', value: '0x...' },\n * { label: 'USDT', value: '0x...' }\n * ]\n * })\n * ]\n * })\n * ```\n */\nexport function linkedAction(config: {\n href: string;\n label: string;\n disabled?: boolean;\n parameters?: TypedActionParameter[];\n}): LinkedAction {\n return {\n type: 'transaction',\n href: config.href,\n label: config.label,\n disabled: config.disabled,\n parameters: config.parameters,\n };\n}\n\n/**\n * Create a simple linked action button (no parameters, just a static href)\n *\n * @example\n * ```ts\n * actionButton({\n * href: '/api/tip?amount=1',\n * label: 'Tip 1 MNT'\n * })\n * ```\n */\nexport function actionButton(config: {\n href: string;\n label: string;\n disabled?: boolean;\n}): LinkedAction {\n return {\n type: 'transaction',\n href: config.href,\n label: config.label,\n disabled: config.disabled,\n };\n}\n\n/**\n * Create a text parameter\n */\nexport function textParam(config: {\n name: string;\n label?: string;\n required?: boolean;\n pattern?: string;\n patternDescription?: string;\n}): ActionParameter {\n return {\n type: 'text',\n name: config.name,\n label: config.label,\n required: config.required,\n pattern: config.pattern,\n patternDescription: config.patternDescription,\n };\n}\n\n/**\n * Create a number parameter\n */\nexport function numberParam(config: {\n name: string;\n label?: string;\n required?: boolean;\n min?: number | string;\n max?: number | string;\n}): ActionParameter {\n return {\n type: 'number',\n name: config.name,\n label: config.label,\n required: config.required,\n min: config.min,\n max: config.max,\n };\n}\n\n/**\n * Create an amount parameter (for token/ETH amounts)\n */\nexport function amountParam(config: {\n name: string;\n label?: string;\n required?: boolean;\n min?: number | string;\n max?: number | string;\n}): ActionParameter {\n return {\n type: 'amount',\n name: config.name,\n label: config.label || 'Amount',\n required: config.required,\n min: config.min,\n max: config.max,\n };\n}\n\n/**\n * Create an address parameter (for wallet addresses)\n */\nexport function addressParam(config: {\n name: string;\n label?: string;\n required?: boolean;\n}): ActionParameter {\n return {\n type: 'address',\n name: config.name,\n label: config.label || 'Address',\n required: config.required,\n pattern: '^0x[a-fA-F0-9]{40}$',\n patternDescription: 'Valid Ethereum address (0x...)',\n };\n}\n\n/**\n * Create a select dropdown parameter\n */\nexport function selectParam(config: {\n name: string;\n label?: string;\n required?: boolean;\n options: ActionParameterOption[];\n}): ActionParameterSelectable {\n return {\n type: 'select',\n name: config.name,\n label: config.label,\n required: config.required,\n options: config.options,\n };\n}\n\n/**\n * Create a radio button group parameter\n */\nexport function radioParam(config: {\n name: string;\n label?: string;\n required?: boolean;\n options: ActionParameterOption[];\n}): ActionParameterSelectable {\n return {\n type: 'radio',\n name: config.name,\n label: config.label,\n required: config.required,\n options: config.options,\n };\n}\n\n/**\n * Create a checkbox parameter (multiple selection)\n */\nexport function checkboxParam(config: {\n name: string;\n label?: string;\n required?: boolean;\n options: ActionParameterOption[];\n}): ActionParameterSelectable {\n return {\n type: 'checkbox',\n name: config.name,\n label: config.label,\n required: config.required,\n options: config.options,\n };\n}\n\n/**\n * Create a date parameter\n */\nexport function dateParam(config: {\n name: string;\n label?: string;\n required?: boolean;\n min?: string;\n max?: string;\n}): ActionParameter {\n return {\n type: 'date',\n name: config.name,\n label: config.label,\n required: config.required,\n min: config.min,\n max: config.max,\n };\n}\n\n/**\n * Create a textarea parameter (multi-line text)\n */\nexport function textareaParam(config: {\n name: string;\n label?: string;\n required?: boolean;\n}): ActionParameter {\n return {\n type: 'textarea',\n name: config.name,\n label: config.label,\n required: config.required,\n };\n}\n\n/**\n * Create an option for select/radio/checkbox parameters\n */\nexport function option(\n label: string,\n value: string,\n selected?: boolean\n): ActionParameterOption {\n return { label, value, selected };\n}\n\n/**\n * Create a links object with actions array\n *\n * @example\n * ```ts\n * createLinks([\n * actionButton({ href: '/api/tip?amount=1', label: 'Tip 1 MNT' }),\n * actionButton({ href: '/api/tip?amount=5', label: 'Tip 5 MNT' }),\n * linkedAction({\n * href: '/api/tip?amount={amount}',\n * label: 'Custom Amount',\n * parameters: [amountParam({ name: 'amount', required: true })]\n * })\n * ])\n * ```\n */\nexport function createLinks(actions: LinkedAction[]): ActionLinks {\n return { actions };\n}\n\n/**\n * Replace placeholders in href template with parameter values\n *\n * @example\n * ```ts\n * buildHref('/api/swap?amount={amount}&token={token}', { amount: '100', token: '0x...' })\n * // Returns: '/api/swap?amount=100&token=0x...'\n * ```\n */\nexport function buildHref(\n template: string,\n params: Record<string, string | string[]>\n): string {\n let result = template;\n for (const [key, value] of Object.entries(params)) {\n const placeholder = `{${key}}`;\n const replacement = Array.isArray(value) ? value.join(',') : value;\n result = result.replace(new RegExp(placeholder, 'g'), encodeURIComponent(replacement));\n }\n return result;\n}\n\n/**\n * Extract parameter names from href template\n *\n * @example\n * ```ts\n * extractParams('/api/swap?amount={amount}&token={token}')\n * // Returns: ['amount', 'token']\n * ```\n */\nexport function extractParams(template: string): string[] {\n const matches = template.match(/\\{([^}]+)\\}/g);\n if (!matches) return [];\n return matches.map((m) => m.slice(1, -1));\n}\n\n/**\n * Check if a linked action has parameters that need to be collected\n */\nexport function hasParameters(action: LinkedAction): boolean {\n return Boolean(action.parameters && action.parameters.length > 0);\n}\n\n/**\n * Check if a parameter is selectable (select/radio/checkbox)\n */\nexport function isSelectableParam(\n param: TypedActionParameter\n): param is ActionParameterSelectable {\n return param.type === 'select' || param.type === 'radio' || param.type === 'checkbox';\n}\n\n// Action object returned by createAction\nexport interface Action {\n getMetadata(): ActionMetadata;\n handleRequest(request: TransactionRequest): Promise<TransactionResponse>;\n}\n\n/**\n * Extended action definition that supports both legacy actions and linked actions\n */\nexport interface ExtendedActionDefinition extends Omit<ActionDefinition, 'actions'> {\n /** Primary button label */\n label?: string;\n /** Legacy actions array (backwards compatible) */\n actions?: ActionButton[];\n /** Solana-style linked actions */\n links?: ActionLinks;\n}\n\n/**\n * Create a complete action with support for both legacy and Solana-style linked actions\n *\n * @example Legacy style (backwards compatible):\n * ```ts\n * createAction({\n * title: 'Tip',\n * icon: 'https://...',\n * description: 'Send a tip',\n * actions: [\n * button({ label: '1 MNT', value: '1' }),\n * input({ label: 'Custom' })\n * ],\n * handler: async (ctx) => ({ transaction: {...} })\n * })\n * ```\n *\n * @example Solana-style linked actions:\n * ```ts\n * createAction({\n * title: 'Swap Tokens',\n * icon: 'https://...',\n * description: 'Swap tokens on DEX',\n * links: createLinks([\n * actionButton({ href: '/api/swap?amount=10', label: 'Swap 10' }),\n * linkedAction({\n * href: '/api/swap?amount={amount}&token={token}',\n * label: 'Custom Swap',\n * parameters: [\n * amountParam({ name: 'amount', required: true }),\n * selectParam({ name: 'token', options: [...] })\n * ]\n * })\n * ]),\n * handler: async (ctx) => ({ transaction: {...} })\n * })\n * ```\n */\nexport function createAction(definition: ExtendedActionDefinition): Action {\n // Validate definition\n if (!definition.title) throw new Error('Action title is required');\n if (!definition.icon) throw new Error('Action icon is required');\n if (!definition.description) throw new Error('Action description is required');\n\n // Must have either actions or links\n const hasLegacyActions = definition.actions && definition.actions.length > 0;\n const hasLinkedActions = definition.links?.actions && definition.links.actions.length > 0;\n\n if (!hasLegacyActions && !hasLinkedActions) {\n throw new Error('At least one action or linked action is required');\n }\n\n if (typeof definition.handler !== 'function') {\n throw new Error('Handler must be a function');\n }\n\n return {\n getMetadata(): ActionMetadata {\n return {\n type: 'action',\n title: definition.title,\n icon: definition.icon,\n description: definition.description,\n label: definition.label,\n actions: definition.actions,\n links: definition.links,\n disabled: definition.disabled,\n };\n },\n\n async handleRequest(\n request: TransactionRequest\n ): Promise<TransactionResponse> {\n // Validate request\n const validation = validateTransactionRequest(request);\n if (!validation.success) {\n throw new Error(validation.error);\n }\n\n // Handle legacy actions\n if (definition.actions) {\n const selectedAction = definition.actions.find(\n (a) => a.value === request.action || (a.type === 'input' && request.action === '__input__')\n );\n\n if (selectedAction) {\n // If input type, require input value\n if (selectedAction.type === 'input' && !request.input) {\n throw new Error('Input value is required');\n }\n }\n }\n\n // Call handler with full context including data\n const response = await definition.handler({\n account: request.account,\n action: request.action,\n input: request.input,\n data: request.data,\n });\n\n return response;\n },\n };\n}\n","'use client';\r\n\r\nimport React, { useState, useCallback, useMemo } from 'react';\r\nimport type { MlinkProps, MlinkTheme } from './types';\r\nimport type {\r\n ActionButton,\r\n LinkedAction,\r\n TypedActionParameter,\r\n ActionParameterSelectable,\r\n} from '../types';\r\nimport { useMlink } from './useMlink';\r\nimport { useExecuteMlink } from './useExecuteMlink';\r\nimport { useMlinkContext } from './MlinkProvider';\r\nimport { resolveTheme, themeToCSS } from './themes';\r\nimport { buildHref, hasParameters, isSelectableParam } from '../builders';\r\n\r\nexport function Mlink({\r\n url,\r\n adapter,\r\n theme: themeProp,\r\n onSuccess,\r\n onError,\r\n className = '',\r\n stylePreset = 'default',\r\n registryUrl,\r\n requireRegistration = true,\r\n allowPending = true,\r\n allowBlocked = false,\r\n}: MlinkProps) {\r\n const context = useMlinkContext();\r\n const resolvedTheme = themeProp ? resolveTheme(themeProp) : context.theme;\r\n\r\n const { status: fetchStatus, metadata, error: fetchError, registration } = useMlink(url, {\r\n registryUrl,\r\n requireRegistration,\r\n allowPending,\r\n allowBlocked,\r\n });\r\n\r\n const {\r\n execute,\r\n status: execStatus,\r\n txHash,\r\n error: execError,\r\n reset,\r\n } = useExecuteMlink({\r\n adapter,\r\n actionUrl: url,\r\n onSuccess,\r\n onError,\r\n });\r\n\r\n // State for legacy inputs\r\n const [inputValues, setInputValues] = useState<Record<string, string>>({});\r\n\r\n // State for linked action parameters\r\n const [paramValues, setParamValues] = useState<Record<string, string | string[]>>({});\r\n\r\n // Currently selected linked action (if showing parameter form)\r\n const [selectedLinkedAction, setSelectedLinkedAction] = useState<LinkedAction | null>(null);\r\n\r\n const handleInputChange = useCallback((actionValue: string, value: string) => {\r\n setInputValues((prev) => ({ ...prev, [actionValue]: value }));\r\n }, []);\r\n\r\n const handleParamChange = useCallback((name: string, value: string | string[]) => {\r\n setParamValues((prev) => ({ ...prev, [name]: value }));\r\n }, []);\r\n\r\n // Handle legacy action execution\r\n const handleAction = useCallback(\r\n async (action: ActionButton) => {\r\n const input = action.type === 'input' ? inputValues[action.value] : undefined;\r\n await execute(action.value, input);\r\n },\r\n [execute, inputValues]\r\n );\r\n\r\n // Handle linked action click\r\n const handleLinkedAction = useCallback(\r\n async (action: LinkedAction) => {\r\n if (hasParameters(action)) {\r\n // Show parameter form\r\n setSelectedLinkedAction(action);\r\n // Initialize param values with defaults\r\n const defaults: Record<string, string | string[]> = {};\r\n action.parameters?.forEach((param) => {\r\n if (isSelectableParam(param)) {\r\n const selectedOption = param.options.find((o) => o.selected);\r\n if (selectedOption) {\r\n defaults[param.name] = param.type === 'checkbox' ? [selectedOption.value] : selectedOption.value;\r\n }\r\n }\r\n });\r\n setParamValues(defaults);\r\n } else {\r\n // Execute directly with href\r\n await execute(action.href, undefined, {});\r\n }\r\n },\r\n [execute]\r\n );\r\n\r\n // Execute linked action with parameters\r\n const handleExecuteWithParams = useCallback(async () => {\r\n if (!selectedLinkedAction) return;\r\n\r\n // Build the final href with parameter values\r\n const finalHref = buildHref(selectedLinkedAction.href, paramValues);\r\n\r\n await execute(finalHref, undefined, paramValues);\r\n setSelectedLinkedAction(null);\r\n setParamValues({});\r\n }, [selectedLinkedAction, paramValues, execute]);\r\n\r\n // Cancel parameter form\r\n const handleCancelParams = useCallback(() => {\r\n setSelectedLinkedAction(null);\r\n setParamValues({});\r\n }, []);\r\n\r\n // Check if we have linked actions\r\n const hasLinkedActions = useMemo(() => {\r\n return metadata?.links?.actions && metadata.links.actions.length > 0;\r\n }, [metadata]);\r\n\r\n // Loading/Validating state\r\n if (fetchStatus === 'loading' || fetchStatus === 'validating') {\r\n return (\r\n <MlinkContainer theme={resolvedTheme} className={className} preset={stylePreset}>\r\n <MlinkSkeleton />\r\n </MlinkContainer>\r\n );\r\n }\r\n\r\n // Unregistered state\r\n if (fetchStatus === 'unregistered') {\r\n return (\r\n <MlinkContainer theme={resolvedTheme} className={className} preset={stylePreset}>\r\n <MlinkUnregistered\r\n message={fetchError || 'This MLink is not registered.'}\r\n registryUrl={registryUrl}\r\n />\r\n </MlinkContainer>\r\n );\r\n }\r\n\r\n // Blocked state\r\n if (fetchStatus === 'blocked') {\r\n return (\r\n <MlinkContainer theme={resolvedTheme} className={className} preset={stylePreset}>\r\n <MlinkBlocked message={fetchError || 'This MLink has been blocked.'} />\r\n </MlinkContainer>\r\n );\r\n }\r\n\r\n // Error state\r\n if (fetchStatus === 'error' || !metadata) {\r\n return (\r\n <MlinkContainer theme={resolvedTheme} className={className} preset={stylePreset}>\r\n <MlinkError message={fetchError || 'Failed to load action'} />\r\n </MlinkContainer>\r\n );\r\n }\r\n\r\n // Success state after transaction\r\n if (execStatus === 'success' && txHash) {\r\n return (\r\n <MlinkContainer theme={resolvedTheme} className={className} preset={stylePreset}>\r\n <MlinkSuccess\r\n message={metadata.title}\r\n txHash={txHash}\r\n onReset={reset}\r\n />\r\n </MlinkContainer>\r\n );\r\n }\r\n\r\n // Parameter form for linked action\r\n if (selectedLinkedAction && hasParameters(selectedLinkedAction)) {\r\n return (\r\n <MlinkContainer theme={resolvedTheme} className={className} preset={stylePreset}>\r\n <div className=\"mlink-content\">\r\n <h3 className=\"mlink-title\">{selectedLinkedAction.label}</h3>\r\n <p className=\"mlink-description\">Fill in the details below</p>\r\n </div>\r\n\r\n {execError && (\r\n <div className=\"mlink-error-banner\">{execError}</div>\r\n )}\r\n\r\n <div className=\"mlink-params\">\r\n {selectedLinkedAction.parameters?.map((param) => (\r\n <ParameterInput\r\n key={param.name}\r\n param={param}\r\n value={paramValues[param.name] || ''}\r\n onChange={(value) => handleParamChange(param.name, value)}\r\n disabled={execStatus === 'executing'}\r\n />\r\n ))}\r\n </div>\r\n\r\n <div className=\"mlink-actions\">\r\n <button\r\n className=\"mlink-button\"\r\n onClick={handleExecuteWithParams}\r\n disabled={execStatus === 'executing'}\r\n >\r\n {execStatus === 'executing' ? <MlinkSpinner /> : selectedLinkedAction.label}\r\n </button>\r\n <button\r\n className=\"mlink-button mlink-button-secondary\"\r\n onClick={handleCancelParams}\r\n disabled={execStatus === 'executing'}\r\n >\r\n Back\r\n </button>\r\n </div>\r\n </MlinkContainer>\r\n );\r\n }\r\n\r\n return (\r\n <MlinkContainer theme={resolvedTheme} className={className} preset={stylePreset}>\r\n {/* Icon */}\r\n <div className=\"mlink-icon\">\r\n <img src={metadata.icon} alt={metadata.title} />\r\n </div>\r\n\r\n {/* Content */}\r\n <div className=\"mlink-content\">\r\n <h3 className=\"mlink-title\">{metadata.title}</h3>\r\n <p className=\"mlink-description\">{metadata.description}</p>\r\n </div>\r\n\r\n {/* Error display */}\r\n {execError && (\r\n <div className=\"mlink-error-banner\">\r\n {execError}\r\n </div>\r\n )}\r\n\r\n {/* Linked Actions (Solana-style) */}\r\n {hasLinkedActions && (\r\n <div className=\"mlink-actions\">\r\n {/* Quick action buttons (no parameters) */}\r\n <div className=\"mlink-quick-actions\">\r\n {metadata.links!.actions\r\n .filter((a) => !hasParameters(a))\r\n .map((action, index) => (\r\n <button\r\n key={`${action.href}-${index}`}\r\n className=\"mlink-button mlink-button-quick\"\r\n onClick={() => handleLinkedAction(action)}\r\n disabled={metadata.disabled || action.disabled || execStatus === 'executing'}\r\n >\r\n {execStatus === 'executing' ? <MlinkSpinner /> : action.label}\r\n </button>\r\n ))}\r\n </div>\r\n\r\n {/* Actions with parameters */}\r\n {metadata.links!.actions\r\n .filter((a) => hasParameters(a))\r\n .map((action, index) => (\r\n <button\r\n key={`param-${action.href}-${index}`}\r\n className=\"mlink-button mlink-button-custom\"\r\n onClick={() => handleLinkedAction(action)}\r\n disabled={metadata.disabled || action.disabled || execStatus === 'executing'}\r\n >\r\n {action.label}\r\n </button>\r\n ))}\r\n </div>\r\n )}\r\n\r\n {/* Legacy Actions (backwards compatible) */}\r\n {!hasLinkedActions && metadata.actions && (\r\n <div className=\"mlink-actions\">\r\n {metadata.actions.map((action, index) => (\r\n <ActionButtonComponent\r\n key={`${action.value}-${index}`}\r\n action={action}\r\n inputValue={inputValues[action.value] || ''}\r\n onInputChange={(value) => handleInputChange(action.value, value)}\r\n onExecute={() => handleAction(action)}\r\n loading={execStatus === 'executing'}\r\n disabled={metadata.disabled === true || action.disabled === true}\r\n />\r\n ))}\r\n </div>\r\n )}\r\n </MlinkContainer>\r\n );\r\n}\r\n\r\n// =============================================================================\r\n// PARAMETER INPUT COMPONENT\r\n// =============================================================================\r\n\r\ninterface ParameterInputProps {\r\n param: TypedActionParameter;\r\n value: string | string[];\r\n onChange: (value: string | string[]) => void;\r\n disabled: boolean;\r\n}\r\n\r\nfunction ParameterInput({ param, value, onChange, disabled }: ParameterInputProps) {\r\n const strValue = Array.isArray(value) ? value.join(',') : value;\r\n\r\n if (isSelectableParam(param)) {\r\n return (\r\n <SelectableParamInput\r\n param={param}\r\n value={value}\r\n onChange={onChange}\r\n disabled={disabled}\r\n />\r\n );\r\n }\r\n\r\n // Map parameter type to input type\r\n const inputType = getInputType(param.type);\r\n\r\n if (param.type === 'textarea') {\r\n return (\r\n <div className=\"mlink-param-group\">\r\n {param.label && <label className=\"mlink-param-label\">{param.label}</label>}\r\n <textarea\r\n className=\"mlink-textarea\"\r\n value={strValue}\r\n onChange={(e) => onChange(e.target.value)}\r\n disabled={disabled}\r\n required={param.required}\r\n />\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"mlink-param-group\">\r\n {param.label && (\r\n <label className=\"mlink-param-label\">\r\n {param.label}\r\n {param.required && <span className=\"mlink-required\">*</span>}\r\n </label>\r\n )}\r\n <input\r\n type={inputType}\r\n className=\"mlink-input\"\r\n value={strValue}\r\n onChange={(e) => onChange(e.target.value)}\r\n disabled={disabled}\r\n required={param.required}\r\n pattern={param.pattern}\r\n min={param.min?.toString()}\r\n max={param.max?.toString()}\r\n placeholder={param.label || param.name}\r\n />\r\n {param.patternDescription && (\r\n <span className=\"mlink-param-hint\">{param.patternDescription}</span>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nfunction SelectableParamInput({\r\n param,\r\n value,\r\n onChange,\r\n disabled,\r\n}: {\r\n param: ActionParameterSelectable;\r\n value: string | string[];\r\n onChange: (value: string | string[]) => void;\r\n disabled: boolean;\r\n}) {\r\n const arrayValue = Array.isArray(value) ? value : value ? [value] : [];\r\n\r\n if (param.type === 'select') {\r\n return (\r\n <div className=\"mlink-param-group\">\r\n {param.label && (\r\n <label className=\"mlink-param-label\">\r\n {param.label}\r\n {param.required && <span className=\"mlink-required\">*</span>}\r\n </label>\r\n )}\r\n <select\r\n className=\"mlink-select\"\r\n value={arrayValue[0] || ''}\r\n onChange={(e) => onChange(e.target.value)}\r\n disabled={disabled}\r\n required={param.required}\r\n >\r\n <option value=\"\">Select {param.label || param.name}</option>\r\n {param.options.map((opt) => (\r\n <option key={opt.value} value={opt.value}>\r\n {opt.label}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n );\r\n }\r\n\r\n if (param.type === 'radio') {\r\n return (\r\n <div className=\"mlink-param-group\">\r\n {param.label && (\r\n <label className=\"mlink-param-label\">\r\n {param.label}\r\n {param.required && <span className=\"mlink-required\">*</span>}\r\n </label>\r\n )}\r\n <div className=\"mlink-radio-group\">\r\n {param.options.map((opt) => (\r\n <label key={opt.value} className=\"mlink-radio-label\">\r\n <input\r\n type=\"radio\"\r\n name={param.name}\r\n value={opt.value}\r\n checked={arrayValue[0] === opt.value}\r\n onChange={(e) => onChange(e.target.value)}\r\n disabled={disabled}\r\n />\r\n {opt.label}\r\n </label>\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n if (param.type === 'checkbox') {\r\n return (\r\n <div className=\"mlink-param-group\">\r\n {param.label && (\r\n <label className=\"mlink-param-label\">\r\n {param.label}\r\n {param.required && <span className=\"mlink-required\">*</span>}\r\n </label>\r\n )}\r\n <div className=\"mlink-checkbox-group\">\r\n {param.options.map((opt) => (\r\n <label key={opt.value} className=\"mlink-checkbox-label\">\r\n <input\r\n type=\"checkbox\"\r\n value={opt.value}\r\n checked={arrayValue.includes(opt.value)}\r\n onChange={(e) => {\r\n if (e.target.checked) {\r\n onChange([...arrayValue, opt.value]);\r\n } else {\r\n onChange(arrayValue.filter((v) => v !== opt.value));\r\n }\r\n }}\r\n disabled={disabled}\r\n />\r\n {opt.label}\r\n </label>\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return null;\r\n}\r\n\r\nfunction getInputType(paramType?: string): string {\r\n switch (paramType) {\r\n case 'number':\r\n case 'amount':\r\n return 'number';\r\n case 'email':\r\n return 'email';\r\n case 'url':\r\n return 'url';\r\n case 'date':\r\n return 'date';\r\n case 'datetime-local':\r\n return 'datetime-local';\r\n case 'address':\r\n case 'token':\r\n case 'text':\r\n default:\r\n return 'text';\r\n }\r\n}\r\n\r\n// =============================================================================\r\n// HELPER COMPONENTS\r\n// =============================================================================\r\n\r\n// Container component\r\ninterface MlinkContainerProps {\r\n theme: MlinkTheme;\r\n className: string;\r\n preset: 'default' | 'compact' | 'minimal';\r\n children: React.ReactNode;\r\n}\r\n\r\nfunction MlinkContainer({ theme, className, preset, children }: MlinkContainerProps) {\r\n return (\r\n <div\r\n className={`mlink-container mlink-${preset} ${className}`}\r\n style={themeToCSS(theme)}\r\n >\r\n {children}\r\n </div>\r\n );\r\n}\r\n\r\n// Skeleton loading component\r\nfunction MlinkSkeleton() {\r\n return (\r\n <div className=\"mlink-skeleton\">\r\n <div className=\"mlink-skeleton-icon\" />\r\n <div className=\"mlink-skeleton-content\">\r\n <div className=\"mlink-skeleton-title\" />\r\n <div className=\"mlink-skeleton-description\" />\r\n </div>\r\n <div className=\"mlink-skeleton-button\" />\r\n </div>\r\n );\r\n}\r\n\r\n// Error component\r\nfunction MlinkError({ message }: { message: string }) {\r\n return (\r\n <div className=\"mlink-error\">\r\n <div className=\"mlink-error-icon\">!</div>\r\n <p className=\"mlink-error-message\">{message}</p>\r\n </div>\r\n );\r\n}\r\n\r\n// Unregistered component\r\nfunction MlinkUnregistered({ message, registryUrl }: { message: string; registryUrl?: string }) {\r\n const registerUrl = registryUrl\r\n ? `${registryUrl}/dashboard/register`\r\n : 'https://mlinks-fe.vercel.app/dashboard/register';\r\n\r\n return (\r\n <div className=\"mlink-unregistered\">\r\n <div className=\"mlink-unregistered-icon\">\r\n <svg width=\"48\" height=\"48\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\r\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\r\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\" />\r\n <line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\" />\r\n </svg>\r\n </div>\r\n <h3 className=\"mlink-unregistered-title\">Unregistered MLink</h3>\r\n <p className=\"mlink-unregistered-message\">{message}</p>\r\n <a\r\n href={registerUrl}\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n className=\"mlink-button\"\r\n >\r\n Register MLink\r\n </a>\r\n </div>\r\n );\r\n}\r\n\r\n// Blocked component\r\nfunction MlinkBlocked({ message }: { message: string }) {\r\n return (\r\n <div className=\"mlink-blocked\">\r\n <div className=\"mlink-blocked-icon\">\r\n <svg width=\"48\" height=\"48\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\r\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\r\n <line x1=\"4.93\" y1=\"4.93\" x2=\"19.07\" y2=\"19.07\" />\r\n </svg>\r\n </div>\r\n <h3 className=\"mlink-blocked-title\">Blocked MLink</h3>\r\n <p className=\"mlink-blocked-message\">{message}</p>\r\n </div>\r\n );\r\n}\r\n\r\n// Success component\r\ninterface MlinkSuccessProps {\r\n message: string;\r\n txHash: string;\r\n onReset: () => void;\r\n}\r\n\r\nfunction MlinkSuccess({ message, txHash, onReset }: MlinkSuccessProps) {\r\n const shortHash = `${txHash.slice(0, 10)}...${txHash.slice(-8)}`;\r\n\r\n return (\r\n <div className=\"mlink-success\">\r\n <div className=\"mlink-success-icon\">✓</div>\r\n <h3 className=\"mlink-success-title\">Transaction Sent</h3>\r\n <p className=\"mlink-success-message\">{message}</p>\r\n <code className=\"mlink-success-hash\">{shortHash}</code>\r\n <button className=\"mlink-button mlink-button-secondary\" onClick={onReset}>\r\n Done\r\n </button>\r\n </div>\r\n );\r\n}\r\n\r\n// Action button component (legacy)\r\ninterface ActionButtonComponentProps {\r\n action: ActionButton;\r\n inputValue: string;\r\n onInputChange: (value: string) => void;\r\n onExecute: () => void;\r\n loading: boolean;\r\n disabled: boolean;\r\n}\r\n\r\nfunction ActionButtonComponent({\r\n action,\r\n inputValue,\r\n onInputChange,\r\n onExecute,\r\n loading,\r\n disabled,\r\n}: ActionButtonComponentProps) {\r\n if (action.type === 'input') {\r\n return (\r\n <div className=\"mlink-input-group\">\r\n <input\r\n type=\"text\"\r\n className=\"mlink-input\"\r\n placeholder={action.placeholder || action.label}\r\n value={inputValue}\r\n onChange={(e) => onInputChange(e.target.value)}\r\n disabled={disabled || loading}\r\n />\r\n <button\r\n className=\"mlink-button\"\r\n onClick={onExecute}\r\n disabled={disabled || loading || !inputValue.trim()}\r\n >\r\n {loading ? <MlinkSpinner /> : action.label}\r\n </button>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <button\r\n className=\"mlink-button\"\r\n onClick={onExecute}\r\n disabled={disabled || loading}\r\n >\r\n {loading ? <MlinkSpinner /> : action.label}\r\n </button>\r\n );\r\n}\r\n\r\n// Spinner component\r\nfunction MlinkSpinner() {\r\n return <span className=\"mlink-spinner\" />;\r\n}\r\n\r\nexport default Mlink;\r\n","'use client';\r\n\r\nimport { useMemo } from 'react';\r\nimport type {\r\n MlinkAdapter,\r\n WagmiAdapterConfig,\r\n EthersAdapterConfig,\r\n} from './types';\r\nimport type { EVMTransaction } from '../types';\r\n\r\n/**\r\n * Create a Mlink adapter from wagmi hooks\r\n *\r\n * @example\r\n * ```tsx\r\n * import { useAccount, useConnect, useSendTransaction } from 'wagmi';\r\n * import { useMlinkWagmiAdapter } from '@dipansrimany/mlink-sdk/react';\r\n *\r\n * function MyComponent() {\r\n * const { address, isConnected } = useAccount();\r\n * const { connectAsync, connectors } = useConnect();\r\n * const { sendTransactionAsync } = useSendTransaction();\r\n *\r\n * const adapter = useMlinkWagmiAdapter({\r\n * address,\r\n * isConnected,\r\n * connect: async () => {\r\n * await connectAsync({ connector: connectors[0] });\r\n * },\r\n * sendTransaction: sendTransactionAsync,\r\n * });\r\n *\r\n * return <Mlink url=\"...\" adapter={adapter} />;\r\n * }\r\n * ```\r\n */\r\nexport function useMlinkWagmiAdapter(config: WagmiAdapterConfig): MlinkAdapter {\r\n const { address, isConnected, connect, sendTransaction } = config;\r\n\r\n return useMemo(\r\n () => ({\r\n connect: async () => {\r\n await connect();\r\n if (!address) {\r\n throw new Error('Failed to connect wallet');\r\n }\r\n return address;\r\n },\r\n\r\n signAndSendTransaction: async (transaction: EVMTransaction) => {\r\n const txHash = await sendTransaction({\r\n to: transaction.to as `0x${string}`,\r\n value: BigInt(transaction.value),\r\n data: transaction.data as `0x${string}`,\r\n chainId: transaction.chainId,\r\n });\r\n return txHash;\r\n },\r\n\r\n isConnected: () => isConnected,\r\n\r\n getAddress: () => address || null,\r\n }),\r\n [address, isConnected, connect, sendTransaction]\r\n );\r\n}\r\n\r\n/**\r\n * Create a Mlink adapter from ethers.js signer\r\n *\r\n * @example\r\n * ```tsx\r\n * import { useSigner } from 'some-ethers-provider';\r\n * import { useMlinkEthersAdapter } from '@dipansrimany/mlink-sdk/react';\r\n *\r\n * function MyComponent() {\r\n * const { signer, connect } = useSigner();\r\n *\r\n * const adapter = useMlinkEthersAdapter({\r\n * signer,\r\n * connect,\r\n * });\r\n *\r\n * return <Mlink url=\"...\" adapter={adapter} />;\r\n * }\r\n * ```\r\n */\r\nexport function useMlinkEthersAdapter(\r\n config: EthersAdapterConfig\r\n): MlinkAdapter {\r\n const { signer, connect } = config;\r\n\r\n return useMemo(\r\n () => ({\r\n connect: async () => {\r\n await connect();\r\n if (!signer) {\r\n throw new Error('Failed to connect wallet');\r\n }\r\n return await signer.getAddress();\r\n },\r\n\r\n signAndSendTransaction: async (transaction: EVMTransaction) => {\r\n if (!signer) {\r\n throw new Error('Wallet not connected');\r\n }\r\n\r\n const tx = await signer.sendTransaction({\r\n to: transaction.to,\r\n value: BigInt(transaction.value),\r\n data: transaction.data,\r\n chainId: transaction.chainId,\r\n });\r\n\r\n return tx.hash;\r\n },\r\n\r\n isConnected: () => signer !== null,\r\n\r\n getAddress: () => null, // Ethers requires async call\r\n }),\r\n [signer, connect]\r\n );\r\n}\r\n\r\n/**\r\n * Create a custom Mlink adapter\r\n *\r\n * @example\r\n * ```tsx\r\n * import { createMlinkAdapter } from '@dipansrimany/mlink-sdk/react';\r\n *\r\n * const adapter = createMlinkAdapter({\r\n * connect: async () => {\r\n * // Your connect logic\r\n * return '0x...';\r\n * },\r\n * signAndSendTransaction: async (tx) => {\r\n * // Your transaction logic\r\n * return '0x...txHash';\r\n * },\r\n * isConnected: () => true,\r\n * getAddress: () => '0x...',\r\n * });\r\n * ```\r\n */\r\nexport function createMlinkAdapter(adapter: MlinkAdapter): MlinkAdapter {\r\n return adapter;\r\n}\r\n"]}
package/dist/styles.css CHANGED
@@ -320,6 +320,245 @@
320
320
  text-decoration: underline;
321
321
  }
322
322
 
323
+ /* =============================================================================
324
+ SOLANA-STYLE LINKED ACTIONS & PARAMETERS
325
+ ============================================================================= */
326
+
327
+ /* Quick action buttons (grid layout) */
328
+ .mlink-quick-actions {
329
+ display: grid;
330
+ grid-template-columns: repeat(auto-fit, minmax(100px, 1fr));
331
+ gap: 8px;
332
+ margin-bottom: 8px;
333
+ }
334
+
335
+ .mlink-button-quick {
336
+ padding: 10px 12px;
337
+ font-size: 13px;
338
+ min-height: 40px;
339
+ }
340
+
341
+ .mlink-button-custom {
342
+ background: var(--mlink-bg-secondary);
343
+ color: var(--mlink-text-primary);
344
+ border: 1px solid var(--mlink-border-color);
345
+ }
346
+
347
+ .mlink-button-custom:hover:not(:disabled) {
348
+ background: var(--mlink-border-color);
349
+ }
350
+
351
+ /* Parameters container */
352
+ .mlink-params {
353
+ padding: 0 16px 16px;
354
+ display: flex;
355
+ flex-direction: column;
356
+ gap: 16px;
357
+ }
358
+
359
+ /* Parameter group */
360
+ .mlink-param-group {
361
+ display: flex;
362
+ flex-direction: column;
363
+ gap: 6px;
364
+ }
365
+
366
+ /* Parameter label */
367
+ .mlink-param-label {
368
+ font-size: 13px;
369
+ font-weight: 500;
370
+ color: var(--mlink-text-primary);
371
+ }
372
+
373
+ .mlink-required {
374
+ color: var(--mlink-error);
375
+ margin-left: 2px;
376
+ }
377
+
378
+ /* Parameter hint */
379
+ .mlink-param-hint {
380
+ font-size: 11px;
381
+ color: var(--mlink-text-secondary);
382
+ margin-top: 2px;
383
+ }
384
+
385
+ /* Select dropdown */
386
+ .mlink-select {
387
+ padding: 12px 16px;
388
+ font-size: 14px;
389
+ color: var(--mlink-input-text);
390
+ background: var(--mlink-input-bg);
391
+ border: 1px solid var(--mlink-input-border);
392
+ border-radius: var(--mlink-input-radius);
393
+ outline: none;
394
+ cursor: pointer;
395
+ min-height: 44px;
396
+ width: 100%;
397
+ box-sizing: border-box;
398
+ appearance: none;
399
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%23666' d='M6 8L1 3h10z'/%3E%3C/svg%3E");
400
+ background-repeat: no-repeat;
401
+ background-position: right 12px center;
402
+ padding-right: 36px;
403
+ }
404
+
405
+ .mlink-select:focus {
406
+ border-color: var(--mlink-button-bg);
407
+ box-shadow: 0 0 0 3px rgba(101, 217, 228, 0.1);
408
+ }
409
+
410
+ .mlink-select:disabled {
411
+ opacity: 0.7;
412
+ cursor: not-allowed;
413
+ }
414
+
415
+ /* Textarea */
416
+ .mlink-textarea {
417
+ padding: 12px 16px;
418
+ font-size: 14px;
419
+ color: var(--mlink-input-text);
420
+ background: var(--mlink-input-bg);
421
+ border: 1px solid var(--mlink-input-border);
422
+ border-radius: var(--mlink-input-radius);
423
+ outline: none;
424
+ min-height: 80px;
425
+ width: 100%;
426
+ box-sizing: border-box;
427
+ resize: vertical;
428
+ font-family: inherit;
429
+ }
430
+
431
+ .mlink-textarea:focus {
432
+ border-color: var(--mlink-button-bg);
433
+ box-shadow: 0 0 0 3px rgba(101, 217, 228, 0.1);
434
+ }
435
+
436
+ .mlink-textarea:disabled {
437
+ opacity: 0.7;
438
+ cursor: not-allowed;
439
+ }
440
+
441
+ /* Radio group */
442
+ .mlink-radio-group {
443
+ display: flex;
444
+ flex-direction: column;
445
+ gap: 8px;
446
+ }
447
+
448
+ .mlink-radio-label {
449
+ display: flex;
450
+ align-items: center;
451
+ gap: 8px;
452
+ font-size: 14px;
453
+ color: var(--mlink-text-primary);
454
+ cursor: pointer;
455
+ }
456
+
457
+ .mlink-radio-label input[type="radio"] {
458
+ width: 18px;
459
+ height: 18px;
460
+ accent-color: var(--mlink-button-bg);
461
+ cursor: pointer;
462
+ }
463
+
464
+ /* Checkbox group */
465
+ .mlink-checkbox-group {
466
+ display: flex;
467
+ flex-direction: column;
468
+ gap: 8px;
469
+ }
470
+
471
+ .mlink-checkbox-label {
472
+ display: flex;
473
+ align-items: center;
474
+ gap: 8px;
475
+ font-size: 14px;
476
+ color: var(--mlink-text-primary);
477
+ cursor: pointer;
478
+ }
479
+
480
+ .mlink-checkbox-label input[type="checkbox"] {
481
+ width: 18px;
482
+ height: 18px;
483
+ accent-color: var(--mlink-button-bg);
484
+ cursor: pointer;
485
+ }
486
+
487
+ /* Divider for separating quick actions from custom */
488
+ .mlink-actions-divider {
489
+ display: flex;
490
+ align-items: center;
491
+ gap: 12px;
492
+ margin: 8px 0;
493
+ color: var(--mlink-text-secondary);
494
+ font-size: 12px;
495
+ }
496
+
497
+ .mlink-actions-divider::before,
498
+ .mlink-actions-divider::after {
499
+ content: '';
500
+ flex: 1;
501
+ height: 1px;
502
+ background: var(--mlink-border-color);
503
+ }
504
+
505
+ /* Unregistered state */
506
+ .mlink-unregistered {
507
+ padding: 32px 24px;
508
+ text-align: center;
509
+ }
510
+
511
+ .mlink-unregistered-icon {
512
+ margin: 0 auto 16px;
513
+ color: var(--mlink-warning, #f59e0b);
514
+ }
515
+
516
+ .mlink-unregistered-title {
517
+ margin: 0 0 8px 0;
518
+ font-size: 18px;
519
+ font-weight: 600;
520
+ color: var(--mlink-text-primary);
521
+ }
522
+
523
+ .mlink-unregistered-message {
524
+ margin: 0 0 20px 0;
525
+ font-size: 14px;
526
+ color: var(--mlink-text-secondary);
527
+ line-height: 1.5;
528
+ }
529
+
530
+ .mlink-unregistered .mlink-button {
531
+ display: inline-flex;
532
+ width: auto;
533
+ padding: 12px 24px;
534
+ text-decoration: none;
535
+ }
536
+
537
+ /* Blocked state */
538
+ .mlink-blocked {
539
+ padding: 32px 24px;
540
+ text-align: center;
541
+ }
542
+
543
+ .mlink-blocked-icon {
544
+ margin: 0 auto 16px;
545
+ color: var(--mlink-error, #ef4444);
546
+ }
547
+
548
+ .mlink-blocked-title {
549
+ margin: 0 0 8px 0;
550
+ font-size: 18px;
551
+ font-weight: 600;
552
+ color: var(--mlink-error, #ef4444);
553
+ }
554
+
555
+ .mlink-blocked-message {
556
+ margin: 0;
557
+ font-size: 14px;
558
+ color: var(--mlink-text-secondary);
559
+ line-height: 1.5;
560
+ }
561
+
323
562
  /* Responsive */
324
563
  @media (max-width: 480px) {
325
564
  .mlink-container {
@@ -336,4 +575,13 @@
336
575
  .mlink-input-group .mlink-button {
337
576
  width: 100%;
338
577
  }
578
+
579
+ .mlink-quick-actions {
580
+ grid-template-columns: repeat(2, 1fr);
581
+ }
582
+
583
+ .mlink-radio-group,
584
+ .mlink-checkbox-group {
585
+ gap: 12px;
586
+ }
339
587
  }