@dipansrimany/mlink-sdk 0.3.0 → 0.3.1

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.
package/dist/index.js CHANGED
@@ -161,7 +161,7 @@ function createBlinkUrl(actionUrl, baseUrl = BLINK_BASE_URL) {
161
161
  throw new Error("Invalid action URL");
162
162
  }
163
163
  const encodedAction = encodeURIComponent(actionUrl);
164
- return `${baseUrl}/blink?${ACTION_QUERY_PARAM}=${encodedAction}`;
164
+ return `${baseUrl}/mlink?${ACTION_QUERY_PARAM}=${encodedAction}`;
165
165
  }
166
166
  function parseBlinkUrl(blinkUrl) {
167
167
  try {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/validators.ts","../src/builders.ts","../src/constants.ts","../src/utils.ts"],"names":["z"],"mappings":"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","file":"index.js","sourcesContent":["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","import type {\n ActionButton,\n ActionDefinition,\n ActionMetadata,\n TransactionRequest,\n TransactionResponse,\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// Action object returned by createAction\nexport interface Action {\n getMetadata(): ActionMetadata;\n handleRequest(request: TransactionRequest): Promise<TransactionResponse>;\n}\n\n// Create a complete action\nexport function createAction(definition: ActionDefinition): 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 if (!definition.actions || definition.actions.length === 0) {\n throw new Error('At least one action is required');\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 title: definition.title,\n icon: definition.icon,\n description: definition.description,\n actions: definition.actions,\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 // Find the selected action\n const selectedAction = definition.actions.find(\n (a) => a.value === request.action || (a.type === 'input' && request.action === '__input__')\n );\n\n if (!selectedAction) {\n throw new Error('Invalid action selected');\n }\n\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 // Call handler\n const response = await definition.handler({\n account: request.account,\n action: request.action,\n input: request.input,\n });\n\n return response;\n },\n };\n}\n","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}/blink?${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"]}
1
+ {"version":3,"sources":["../src/validators.ts","../src/builders.ts","../src/constants.ts","../src/utils.ts"],"names":["z"],"mappings":"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","file":"index.js","sourcesContent":["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","import type {\n ActionButton,\n ActionDefinition,\n ActionMetadata,\n TransactionRequest,\n TransactionResponse,\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// Action object returned by createAction\nexport interface Action {\n getMetadata(): ActionMetadata;\n handleRequest(request: TransactionRequest): Promise<TransactionResponse>;\n}\n\n// Create a complete action\nexport function createAction(definition: ActionDefinition): 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 if (!definition.actions || definition.actions.length === 0) {\n throw new Error('At least one action is required');\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 title: definition.title,\n icon: definition.icon,\n description: definition.description,\n actions: definition.actions,\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 // Find the selected action\n const selectedAction = definition.actions.find(\n (a) => a.value === request.action || (a.type === 'input' && request.action === '__input__')\n );\n\n if (!selectedAction) {\n throw new Error('Invalid action selected');\n }\n\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 // Call handler\n const response = await definition.handler({\n account: request.account,\n action: request.action,\n input: request.input,\n });\n\n return response;\n },\n };\n}\n","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"]}
package/dist/index.mjs CHANGED
@@ -159,7 +159,7 @@ function createBlinkUrl(actionUrl, baseUrl = BLINK_BASE_URL) {
159
159
  throw new Error("Invalid action URL");
160
160
  }
161
161
  const encodedAction = encodeURIComponent(actionUrl);
162
- return `${baseUrl}/blink?${ACTION_QUERY_PARAM}=${encodedAction}`;
162
+ return `${baseUrl}/mlink?${ACTION_QUERY_PARAM}=${encodedAction}`;
163
163
  }
164
164
  function parseBlinkUrl(blinkUrl) {
165
165
  try {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/validators.ts","../src/builders.ts","../src/constants.ts","../src/utils.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["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","import type {\n ActionButton,\n ActionDefinition,\n ActionMetadata,\n TransactionRequest,\n TransactionResponse,\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// Action object returned by createAction\nexport interface Action {\n getMetadata(): ActionMetadata;\n handleRequest(request: TransactionRequest): Promise<TransactionResponse>;\n}\n\n// Create a complete action\nexport function createAction(definition: ActionDefinition): 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 if (!definition.actions || definition.actions.length === 0) {\n throw new Error('At least one action is required');\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 title: definition.title,\n icon: definition.icon,\n description: definition.description,\n actions: definition.actions,\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 // Find the selected action\n const selectedAction = definition.actions.find(\n (a) => a.value === request.action || (a.type === 'input' && request.action === '__input__')\n );\n\n if (!selectedAction) {\n throw new Error('Invalid action selected');\n }\n\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 // Call handler\n const response = await definition.handler({\n account: request.account,\n action: request.action,\n input: request.input,\n });\n\n return response;\n },\n };\n}\n","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}/blink?${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"]}
1
+ {"version":3,"sources":["../src/validators.ts","../src/builders.ts","../src/constants.ts","../src/utils.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["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","import type {\n ActionButton,\n ActionDefinition,\n ActionMetadata,\n TransactionRequest,\n TransactionResponse,\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// Action object returned by createAction\nexport interface Action {\n getMetadata(): ActionMetadata;\n handleRequest(request: TransactionRequest): Promise<TransactionResponse>;\n}\n\n// Create a complete action\nexport function createAction(definition: ActionDefinition): 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 if (!definition.actions || definition.actions.length === 0) {\n throw new Error('At least one action is required');\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 title: definition.title,\n icon: definition.icon,\n description: definition.description,\n actions: definition.actions,\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 // Find the selected action\n const selectedAction = definition.actions.find(\n (a) => a.value === request.action || (a.type === 'input' && request.action === '__input__')\n );\n\n if (!selectedAction) {\n throw new Error('Invalid action selected');\n }\n\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 // Call handler\n const response = await definition.handler({\n account: request.account,\n action: request.action,\n input: request.input,\n });\n\n return response;\n },\n };\n}\n","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"]}
@@ -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":["z","useState","useRef","useCallback","useEffect","createContext","useMemo","jsx","useContext","jsxs"],"mappings":"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","file":"index.js","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}/blink?${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/react/Mlink.tsx","../../src/react/adapters.ts"],"names":["z","useState","useRef","useCallback","useEffect","createContext","useMemo","jsx","useContext","jsxs"],"mappings":"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","file":"index.js","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 +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}/blink?${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/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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dipansrimany/mlink-sdk",
3
- "version": "0.3.0",
3
+ "version": "0.3.1",
4
4
  "description": "SDK for building Mantle links - shareable blockchain transaction URLs with React UI components",
5
5
  "author": "Mlink",
6
6
  "repository": {