x402-mantle-sdk 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/client/index.ts","../../src/client/constants.ts","../../src/client/wallet.ts","../../src/client/payment.ts","../../src/client/modal-vanilla.ts","../../src/client/modal.ts","../../src/client/client.ts"],"sourcesContent":["/**\n * x402 Client SDK\n *\n * Client SDK for x402 payments on Mantle Network\n *\n * @example\n * ```typescript\n * import { x402Fetch } from '@x402-devkit/sdk/client'\n *\n * // Basic usage (auto-detects network from 402 response)\n * const response = await x402Fetch('https://api.example.com/data')\n *\n * // With testnet option\n * const response = await x402Fetch('https://api.example.com/data', undefined, {\n * testnet: true\n * })\n *\n * // With custom network\n * import { registerCustomNetwork } from '@x402-devkit/sdk/client'\n * registerCustomNetwork('my-network', { chainId: 12345, rpcUrl: 'https://...' })\n * ```\n *\n * For React components:\n * ```tsx\n * import { PaymentModal } from '@x402-devkit/sdk/client/react'\n * ```\n */\n\n// Core client\nexport { x402Client, x402Fetch, X402Client } from './client'\n\n// Payment modal (vanilla JS)\nexport { createPaymentModal } from './modal'\nexport { createVanillaPaymentModal } from './modal-vanilla'\n\n// Wallet utilities\nexport {\n connectWallet,\n detectWalletProvider,\n MetaMaskProvider,\n ensureNetwork,\n getAddNetworkParams,\n} from './wallet'\n\n// Payment processing\nexport { processPayment } from './payment'\n\n// Types\nexport type {\n PaymentRequest,\n PaymentResponse,\n X402ClientOptions,\n TransactionRequest,\n WalletProvider,\n EIP1193Provider,\n AddEthereumChainParameter,\n} from './types'\n\n// Constants and configuration\nexport {\n // Network presets\n NETWORKS,\n TOKENS,\n\n // Treasury\n TREASURY_ADDRESS,\n TREASURY_ADMIN,\n PLATFORM_FEE_BPS,\n\n // Network utilities\n getNetworkConfig,\n getTokenConfig,\n getChainId,\n isTestnet,\n isMainnet,\n getAvailableNetworks,\n getNetworksByEnvironment,\n\n // Custom network/token registration\n registerCustomNetwork,\n registerCustomTokens,\n\n // Types\n type NetworkId,\n type NetworkEnvironment,\n type NetworkConfig,\n type TokenConfig,\n type CustomNetworkConfig,\n type CustomTokenConfig,\n} from './constants'\n","/**\n * Constants and Configuration\n *\n * Centralized configuration for networks and tokens\n * Supports both preset networks (mainnet/testnet) and custom configurations\n */\n\n/** Supported network identifiers */\nexport type NetworkId = 'mantle' | 'mantle-sepolia' | 'mantle-testnet'\n\n/** Network environment */\nexport type NetworkEnvironment = 'mainnet' | 'testnet'\n\n/** Network configuration */\nexport interface NetworkConfig {\n chainId: number\n rpcUrl: string\n name: string\n environment: NetworkEnvironment\n nativeCurrency: {\n name: string\n symbol: string\n decimals: number\n }\n blockExplorer: string\n}\n\n/** Token configuration */\nexport interface TokenConfig {\n address: string\n decimals: number\n symbol: string\n}\n\n/** Custom network configuration (user-provided) */\nexport interface CustomNetworkConfig {\n chainId: number\n rpcUrl: string\n name?: string\n environment?: NetworkEnvironment\n blockExplorer?: string\n}\n\n/** Custom token configuration (user-provided) */\nexport interface CustomTokenConfig {\n [symbol: string]: {\n address: string\n decimals: number\n }\n}\n\n/** Network configurations */\nexport const NETWORKS: Record<NetworkId, NetworkConfig> = {\n mantle: {\n chainId: 5000,\n rpcUrl: 'https://rpc.mantle.xyz',\n name: 'Mantle',\n environment: 'mainnet',\n nativeCurrency: { name: 'Mantle', symbol: 'MNT', decimals: 18 },\n blockExplorer: 'https://explorer.mantle.xyz',\n },\n 'mantle-sepolia': {\n chainId: 5003,\n rpcUrl: 'https://rpc.sepolia.mantle.xyz',\n name: 'Mantle Sepolia',\n environment: 'testnet',\n nativeCurrency: { name: 'Mantle', symbol: 'MNT', decimals: 18 },\n blockExplorer: 'https://explorer.sepolia.mantle.xyz',\n },\n 'mantle-testnet': {\n chainId: 5003,\n rpcUrl: 'https://rpc.sepolia.mantle.xyz',\n name: 'Mantle Testnet',\n environment: 'testnet',\n nativeCurrency: { name: 'Mantle', symbol: 'MNT', decimals: 18 },\n blockExplorer: 'https://explorer.sepolia.mantle.xyz',\n },\n} as const\n\n/** Token addresses by network */\nexport const TOKENS: Record<NetworkId, Record<string, TokenConfig>> = {\n mantle: {\n USDC: {\n address: '0x09Bc4E0D864854c6aFB6eB9A9cdF58aC190D0dF9',\n decimals: 6,\n symbol: 'USDC',\n },\n USDT: {\n address: '0x201EBa5CC46D216Ce6DC03F6a759e8E766e956aE',\n decimals: 6,\n symbol: 'USDT',\n },\n mETH: {\n address: '0xcDA86A272531e8640cD7F1a92c01839911B90bb0',\n decimals: 18,\n symbol: 'mETH',\n },\n WMNT: {\n address: '0x78c1b0C915c4FAA5FffA6CAbf0219DA63d7f4cb8',\n decimals: 18,\n symbol: 'WMNT',\n },\n },\n 'mantle-sepolia': {\n USDC: {\n address: '0x09Bc4E0D864854c6aFB6eB9A9cdF58aC190D0dF9',\n decimals: 6,\n symbol: 'USDC',\n },\n mETH: {\n address: '0xdEAddEaDdeadDEadDEADDEAddEADDEAddead1111',\n decimals: 18,\n symbol: 'mETH',\n },\n WMNT: {\n address: '0x78c1b0C915c4FAA5FffA6CAbf0219DA63d7f4cb8',\n decimals: 18,\n symbol: 'WMNT',\n },\n },\n 'mantle-testnet': {\n USDC: {\n address: '0x09Bc4E0D864854c6aFB6eB9A9cdF58aC190D0dF9',\n decimals: 6,\n symbol: 'USDC',\n },\n mETH: {\n address: '0xdEAddEaDdeadDEadDEADDEAddEADDEAddead1111',\n decimals: 18,\n symbol: 'mETH',\n },\n WMNT: {\n address: '0x78c1b0C915c4FAA5FffA6CAbf0219DA63d7f4cb8',\n decimals: 18,\n symbol: 'WMNT',\n },\n },\n} as const\n\n/** Treasury contract address (collects 0.5% platform fee) */\nexport const TREASURY_ADDRESS = '0xB27705342ACE73736AE490540Ea031cc06C3eF49'\n\n/** Platform fee in basis points (50 = 0.5%) */\nexport const PLATFORM_FEE_BPS = 50n\nexport const BPS_DENOMINATOR = 10000n\n\n/** Treasury admin address */\nexport const TREASURY_ADMIN = '0xDacCF30F8BB2aEb8D76E68E03033629809ed08E1'\n\n/** Custom network registry (populated at runtime) */\nconst customNetworks: Map<string, NetworkConfig> = new Map()\n\n/** Custom token registry (populated at runtime) */\nconst customTokens: Map<string, Map<string, TokenConfig>> = new Map()\n\n/**\n * Register a custom network configuration\n *\n * @example\n * ```typescript\n * registerCustomNetwork('my-network', {\n * chainId: 12345,\n * rpcUrl: 'https://my-rpc.example.com',\n * name: 'My Custom Network',\n * environment: 'testnet'\n * })\n * ```\n */\nexport function registerCustomNetwork(networkId: string, config: CustomNetworkConfig): void {\n customNetworks.set(networkId.toLowerCase(), {\n chainId: config.chainId,\n rpcUrl: config.rpcUrl,\n name: config.name || networkId,\n environment: config.environment || 'testnet',\n nativeCurrency: { name: 'Native', symbol: 'ETH', decimals: 18 },\n blockExplorer: config.blockExplorer || '',\n })\n}\n\n/**\n * Register custom tokens for a network\n *\n * @example\n * ```typescript\n * registerCustomTokens('mantle', {\n * 'MYTOKEN': { address: '0x...', decimals: 18 }\n * })\n * ```\n */\nexport function registerCustomTokens(networkId: string, tokens: CustomTokenConfig): void {\n const networkKey = networkId.toLowerCase()\n if (!customTokens.has(networkKey)) {\n customTokens.set(networkKey, new Map())\n }\n const tokenMap = customTokens.get(networkKey)!\n for (const [symbol, config] of Object.entries(tokens)) {\n tokenMap.set(symbol.toUpperCase(), {\n address: config.address,\n decimals: config.decimals,\n symbol: symbol.toUpperCase(),\n })\n }\n}\n\n/**\n * Check if network is testnet\n */\nexport function isTestnet(network: string): boolean {\n const config = getNetworkConfig(network)\n return config.environment === 'testnet'\n}\n\n/**\n * Check if network is mainnet\n */\nexport function isMainnet(network: string): boolean {\n const config = getNetworkConfig(network)\n return config.environment === 'mainnet'\n}\n\n/**\n * Get network configuration (supports preset and custom networks)\n */\nexport function getNetworkConfig(network: string): NetworkConfig {\n const networkKey = network.toLowerCase()\n\n // Check custom networks first\n const custom = customNetworks.get(networkKey)\n if (custom) {\n return custom\n }\n\n // Check preset networks\n const preset = NETWORKS[networkKey as NetworkId]\n if (preset) {\n return preset\n }\n\n // Default to mainnet\n return NETWORKS.mantle\n}\n\n/**\n * Get token configuration (supports preset and custom tokens)\n */\nexport function getTokenConfig(token: string, network: string): TokenConfig | null {\n const networkKey = network.toLowerCase()\n const tokenKey = token.toUpperCase()\n\n // Native MNT doesn't have a token config\n if (tokenKey === 'MNT') {\n return null\n }\n\n // Check custom tokens first\n const customMap = customTokens.get(networkKey)\n if (customMap?.has(tokenKey)) {\n return customMap.get(tokenKey)!\n }\n\n // Check preset tokens\n return TOKENS[networkKey as NetworkId]?.[tokenKey] || null\n}\n\n/**\n * Get chain ID for network\n */\nexport function getChainId(network: string): number {\n return getNetworkConfig(network).chainId\n}\n\n/**\n * Get all available networks (preset + custom)\n */\nexport function getAvailableNetworks(): string[] {\n const preset = Object.keys(NETWORKS)\n const custom = Array.from(customNetworks.keys())\n return [...new Set([...preset, ...custom])]\n}\n\n/**\n * Get networks by environment\n */\nexport function getNetworksByEnvironment(env: NetworkEnvironment): string[] {\n return getAvailableNetworks().filter((network) => {\n const config = getNetworkConfig(network)\n return config.environment === env\n })\n}\n","/**\n * Wallet Connection & Management\n *\n * Handles web3 wallet connections (MetaMask, WalletConnect, etc.)\n * Supports network switching and custom network addition\n */\n\nimport type {\n TransactionRequest,\n WalletProvider,\n EIP1193Provider,\n WindowWithEthereum,\n AddEthereumChainParameter,\n} from './types'\nimport { getNetworkConfig, getChainId as getChainIdForNetwork } from './constants'\n\n/**\n * Get ethereum provider from window\n */\nfunction getEthereumProvider(): EIP1193Provider | null {\n if (typeof window === 'undefined') {\n return null\n }\n return (window as WindowWithEthereum).ethereum || null\n}\n\n/**\n * MetaMask/EIP-1193 wallet provider\n */\nexport class MetaMaskProvider implements WalletProvider {\n private ethereum: EIP1193Provider | null\n\n constructor() {\n this.ethereum = getEthereumProvider()\n }\n\n isAvailable(): boolean {\n return this.ethereum !== null && this.ethereum.isMetaMask === true\n }\n\n async connect(): Promise<string> {\n if (!this.ethereum) {\n throw new Error('MetaMask is not available')\n }\n\n const accounts = (await this.ethereum.request({\n method: 'eth_requestAccounts',\n })) as string[]\n\n if (!accounts || accounts.length === 0) {\n throw new Error('No accounts found')\n }\n\n return accounts[0]\n }\n\n async getAccount(): Promise<string | null> {\n if (!this.ethereum) {\n return null\n }\n\n try {\n const accounts = (await this.ethereum.request({\n method: 'eth_accounts',\n })) as string[]\n\n return accounts && accounts.length > 0 ? accounts[0] : null\n } catch {\n return null\n }\n }\n\n async getChainId(): Promise<number | null> {\n if (!this.ethereum) {\n return null\n }\n\n try {\n const chainIdHex = (await this.ethereum.request({\n method: 'eth_chainId',\n })) as string\n\n return parseInt(chainIdHex, 16)\n } catch {\n return null\n }\n }\n\n async switchNetwork(chainId: number): Promise<void> {\n if (!this.ethereum) {\n throw new Error('MetaMask is not available')\n }\n\n const chainIdHex = `0x${chainId.toString(16)}`\n\n try {\n await this.ethereum.request({\n method: 'wallet_switchEthereumChain',\n params: [{ chainId: chainIdHex }],\n })\n } catch (error) {\n const switchError = error as { code?: number }\n if (switchError.code === 4902) {\n // Chain not added, throw specific error\n throw new Error(`Network with chainId ${chainId} not found. Use addNetwork() first.`)\n }\n throw error\n }\n }\n\n async addNetwork(params: AddEthereumChainParameter): Promise<void> {\n if (!this.ethereum) {\n throw new Error('MetaMask is not available')\n }\n\n await this.ethereum.request({\n method: 'wallet_addEthereumChain',\n params: [params],\n })\n }\n\n async sendTransaction(tx: TransactionRequest): Promise<string> {\n if (!this.ethereum) {\n throw new Error('MetaMask is not available')\n }\n\n const txHash = (await this.ethereum.request({\n method: 'eth_sendTransaction',\n params: [tx],\n })) as string\n\n return txHash\n }\n\n async signMessage(message: string): Promise<string> {\n if (!this.ethereum) {\n throw new Error('MetaMask is not available')\n }\n\n const account = await this.getAccount()\n if (!account) {\n throw new Error('No account connected')\n }\n\n const signature = (await this.ethereum.request({\n method: 'personal_sign',\n params: [message, account],\n })) as string\n\n return signature\n }\n}\n\n/**\n * Auto-detect wallet provider\n */\nexport function detectWalletProvider(): WalletProvider | null {\n const metaMask = new MetaMaskProvider()\n if (metaMask.isAvailable()) {\n return metaMask\n }\n\n // Add more providers here (WalletConnect, Coinbase Wallet, etc.)\n return null\n}\n\n/**\n * Connect wallet (auto-detect or use provided)\n */\nexport async function connectWallet(provider?: WalletProvider): Promise<string> {\n const wallet = provider || detectWalletProvider()\n\n if (!wallet) {\n throw new Error(\n 'No wallet provider found. Please install MetaMask or another compatible wallet.'\n )\n }\n\n return wallet.connect()\n}\n\n/**\n * Ensure wallet is on the correct network\n *\n * @param wallet - Wallet provider\n * @param network - Network identifier (e.g., 'mantle', 'mantle-sepolia')\n * @param autoAdd - Auto-add network if not found (default: true)\n */\nexport async function ensureNetwork(\n wallet: WalletProvider,\n network: string,\n autoAdd = true\n): Promise<void> {\n const config = getNetworkConfig(network)\n const targetChainId = config.chainId\n const currentChainId = await wallet.getChainId()\n\n if (currentChainId === targetChainId) {\n return // Already on correct network\n }\n\n try {\n await wallet.switchNetwork(targetChainId)\n } catch (error) {\n const switchError = error as { message?: string }\n\n // If network not found and autoAdd is enabled, add it\n if (autoAdd && switchError.message?.includes('not found')) {\n await wallet.addNetwork({\n chainId: `0x${targetChainId.toString(16)}`,\n chainName: config.name,\n nativeCurrency: config.nativeCurrency,\n rpcUrls: [config.rpcUrl],\n blockExplorerUrls: config.blockExplorer ? [config.blockExplorer] : undefined,\n })\n } else {\n throw error\n }\n }\n}\n\n/**\n * Get network config for adding to wallet\n */\nexport function getAddNetworkParams(network: string): AddEthereumChainParameter {\n const config = getNetworkConfig(network)\n return {\n chainId: `0x${config.chainId.toString(16)}`,\n chainName: config.name,\n nativeCurrency: config.nativeCurrency,\n rpcUrls: [config.rpcUrl],\n blockExplorerUrls: config.blockExplorer ? [config.blockExplorer] : undefined,\n }\n}\n","/**\n * Payment Processing\n *\n * Handles direct blockchain payments with automatic fee splitting\n * Automatically splits 0.5% platform fee to Treasury\n */\n\nimport type { PaymentRequest, PaymentResponse, WalletProvider, TransactionRequest } from './types'\nimport {\n getTokenConfig,\n TREASURY_ADDRESS,\n PLATFORM_FEE_BPS,\n BPS_DENOMINATOR,\n} from './constants'\n\n/** ERC20 transfer function signature */\nconst ERC20_TRANSFER_SIG = '0xa9059cbb'\n\n/**\n * Convert amount to Wei\n */\nfunction amountToWei(amount: string, decimals: number = 18): bigint {\n const parts = amount.split('.')\n const whole = parts[0] || '0'\n const fraction = (parts[1] || '').padEnd(decimals, '0').slice(0, decimals)\n\n return BigInt(whole) * 10n ** BigInt(decimals) + BigInt(fraction)\n}\n\n/**\n * Calculate fee split\n */\nfunction calculateSplit(amount: bigint): { merchantAmount: bigint; feeAmount: bigint } {\n const feeAmount = (amount * PLATFORM_FEE_BPS) / BPS_DENOMINATOR\n const merchantAmount = amount - feeAmount\n return { merchantAmount, feeAmount }\n}\n\n/**\n * Encode ERC20 transfer call data\n */\nfunction encodeERC20Transfer(to: string, amount: bigint): string {\n const toHex = to.slice(2).toLowerCase().padStart(64, '0')\n const amountHex = amount.toString(16).padStart(64, '0')\n return ERC20_TRANSFER_SIG + toHex + amountHex\n}\n\n/**\n * Process payment for an x402 request\n *\n * Automatically splits payment:\n * - 99.5% to merchant\n * - 0.5% to Treasury\n *\n * @param request - Payment request from HTTP 402 response\n * @param wallet - Wallet provider to use for transaction\n * @returns Payment response with transaction hash\n */\nexport async function processPayment(\n request: PaymentRequest,\n wallet: WalletProvider\n): Promise<PaymentResponse> {\n // Get token configuration\n const tokenConfig = getTokenConfig(request.token, request.network)\n const decimals = tokenConfig?.decimals ?? 18\n\n // Calculate amounts\n const totalAmount = amountToWei(request.amount, decimals)\n const { merchantAmount, feeAmount } = calculateSplit(totalAmount)\n\n let txHash: string\n\n if (tokenConfig) {\n // ERC20 token transfer - send full amount to merchant\n // (Treasury fee handled separately for ERC20)\n const transferData = encodeERC20Transfer(request.recipient, totalAmount)\n\n const tx: TransactionRequest = {\n to: tokenConfig.address,\n data: transferData,\n }\n\n txHash = await wallet.sendTransaction(tx)\n } else {\n // Native MNT transfer - split between merchant and treasury\n\n // 1. Send to merchant (99.5%)\n const merchantTx: TransactionRequest = {\n to: request.recipient,\n value: `0x${merchantAmount.toString(16)}`,\n }\n txHash = await wallet.sendTransaction(merchantTx)\n\n // 2. Send fee to Treasury (0.5%)\n if (feeAmount > 0n) {\n const feeTx: TransactionRequest = {\n to: TREASURY_ADDRESS,\n value: `0x${feeAmount.toString(16)}`,\n }\n await wallet.sendTransaction(feeTx)\n }\n }\n\n return {\n transactionHash: txHash,\n timestamp: new Date().toISOString(),\n }\n}\n","/**\n * Vanilla JS Payment Modal\n *\n * Creates a payment modal using vanilla JS/DOM\n */\n\nimport type { PaymentRequest, PaymentResponse } from './types'\nimport { connectWallet, detectWalletProvider } from './wallet'\nimport { processPayment } from './payment'\n\n/** Modal styles */\nconst STYLES = {\n overlay: `\n position: fixed;\n inset: 0;\n z-index: 9999;\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgba(0, 0, 0, 0.5);\n backdrop-filter: blur(4px);\n `,\n modal: `\n width: 100%;\n max-width: 28rem;\n border-radius: 0.75rem;\n border: 1px solid rgba(255, 255, 255, 0.1);\n background: rgba(24, 24, 27, 0.95);\n padding: 1.5rem;\n box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.3);\n backdrop-filter: blur(16px);\n color: #fafafa;\n `,\n header: `\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 1.5rem;\n `,\n logo: `\n width: 2rem;\n height: 2rem;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 0.5rem;\n background: rgba(255, 255, 255, 0.1);\n font-family: monospace;\n font-size: 0.75rem;\n font-weight: bold;\n color: #fafafa;\n `,\n title: `\n font-size: 1.25rem;\n font-weight: 300;\n margin: 0;\n margin-left: 0.5rem;\n color: #fafafa;\n `,\n closeBtn: `\n background: none;\n border: none;\n font-size: 1.5rem;\n cursor: pointer;\n color: rgba(250, 250, 250, 0.6);\n line-height: 1;\n `,\n details: `\n margin-bottom: 1.5rem;\n padding: 1rem;\n border-radius: 0.5rem;\n border: 1px solid rgba(255, 255, 255, 0.1);\n background: rgba(255, 255, 255, 0.02);\n `,\n row: `\n display: flex;\n justify-content: space-between;\n margin-bottom: 0.75rem;\n `,\n rowLast: `\n display: flex;\n justify-content: space-between;\n `,\n label: `\n font-family: monospace;\n font-size: 0.75rem;\n color: rgba(250, 250, 250, 0.6);\n `,\n value: `\n font-size: 0.875rem;\n color: #fafafa;\n `,\n valueAmount: `\n font-size: 1.125rem;\n font-weight: 500;\n color: #fafafa;\n `,\n valueMono: `\n font-family: monospace;\n font-size: 0.875rem;\n color: #fafafa;\n `,\n button: `\n width: 100%;\n padding: 0.75rem 1rem;\n border-radius: 0.5rem;\n border: 1px solid rgba(255, 255, 255, 0.1);\n background: rgba(255, 255, 255, 0.05);\n font-size: 0.875rem;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.2s;\n color: #fafafa;\n `,\n buttonPrimary: `\n flex: 1;\n padding: 0.75rem 1rem;\n border-radius: 0.5rem;\n border: 1px solid rgba(255, 255, 255, 0.1);\n background: rgba(255, 255, 255, 0.1);\n font-size: 0.875rem;\n font-weight: 500;\n cursor: pointer;\n color: #fafafa;\n `,\n buttonSecondary: `\n flex: 1;\n padding: 0.75rem 1rem;\n border-radius: 0.5rem;\n border: 1px solid rgba(255, 255, 255, 0.1);\n background: rgba(255, 255, 255, 0.02);\n font-size: 0.875rem;\n cursor: pointer;\n color: rgba(250, 250, 250, 0.8);\n `,\n walletBox: `\n margin-bottom: 1rem;\n padding: 0.75rem;\n border-radius: 0.5rem;\n border: 1px solid rgba(255, 255, 255, 0.1);\n background: rgba(255, 255, 255, 0.02);\n `,\n walletLabel: `\n margin: 0 0 0.25rem 0;\n font-family: monospace;\n font-size: 0.75rem;\n color: rgba(250, 250, 250, 0.6);\n `,\n walletAddress: `\n margin: 0;\n font-family: monospace;\n font-size: 0.875rem;\n color: #fafafa;\n `,\n buttonGroup: `\n display: flex;\n gap: 0.75rem;\n `,\n} as const\n\n/**\n * Format address for display\n */\nfunction formatAddress(address: string): string {\n return `${address.slice(0, 6)}...${address.slice(-4)}`\n}\n\n/**\n * Create vanilla JS payment modal\n */\nexport async function createVanillaPaymentModal(\n request: PaymentRequest\n): Promise<PaymentResponse | null> {\n return new Promise((resolve) => {\n // Create overlay\n const overlay = document.createElement('div')\n overlay.style.cssText = STYLES.overlay\n\n // Create modal\n const modal = document.createElement('div')\n modal.style.cssText = STYLES.modal\n\n let isProcessing = false\n\n // Cleanup function\n const cleanup = () => {\n if (document.body.contains(overlay)) {\n document.body.removeChild(overlay)\n }\n }\n\n // Header\n const header = document.createElement('div')\n header.style.cssText = STYLES.header\n\n const headerLeft = document.createElement('div')\n headerLeft.style.cssText = 'display: flex; align-items: center;'\n\n const logo = document.createElement('div')\n logo.style.cssText = STYLES.logo\n logo.textContent = 'x402'\n\n const title = document.createElement('h2')\n title.style.cssText = STYLES.title\n title.textContent = 'Payment Required'\n\n headerLeft.appendChild(logo)\n headerLeft.appendChild(title)\n\n const closeBtn = document.createElement('button')\n closeBtn.innerHTML = '&times;'\n closeBtn.style.cssText = STYLES.closeBtn\n closeBtn.onclick = () => {\n cleanup()\n resolve(null)\n }\n\n header.appendChild(headerLeft)\n header.appendChild(closeBtn)\n\n // Payment details\n const details = document.createElement('div')\n details.style.cssText = STYLES.details\n\n const amountRow = document.createElement('div')\n amountRow.style.cssText = STYLES.row\n amountRow.innerHTML = `\n <span style=\"${STYLES.label}\">Amount</span>\n <span style=\"${STYLES.valueAmount}\">${request.amount} ${request.token}</span>\n `\n\n const networkRow = document.createElement('div')\n networkRow.style.cssText = STYLES.row\n networkRow.innerHTML = `\n <span style=\"${STYLES.label}\">Network</span>\n <span style=\"${STYLES.value}\">${request.network}</span>\n `\n\n const recipientRow = document.createElement('div')\n recipientRow.style.cssText = STYLES.rowLast\n recipientRow.innerHTML = `\n <span style=\"${STYLES.label}\">Recipient</span>\n <span style=\"${STYLES.valueMono}\">${formatAddress(request.recipient)}</span>\n `\n\n details.appendChild(amountRow)\n details.appendChild(networkRow)\n details.appendChild(recipientRow)\n\n // Content area\n const content = document.createElement('div')\n\n // Connect button\n const connectBtn = document.createElement('button')\n connectBtn.textContent = 'Connect Wallet'\n connectBtn.style.cssText = STYLES.button\n\n connectBtn.onmouseover = () => {\n connectBtn.style.background = 'rgba(255, 255, 255, 0.1)'\n }\n connectBtn.onmouseout = () => {\n connectBtn.style.background = 'rgba(255, 255, 255, 0.05)'\n }\n\n connectBtn.onclick = async () => {\n try {\n connectBtn.setAttribute('disabled', 'true')\n connectBtn.textContent = 'Connecting...'\n connectBtn.style.opacity = '0.7'\n connectBtn.style.cursor = 'not-allowed'\n\n const wallet = detectWalletProvider()\n if (!wallet) {\n alert('No wallet found. Please install MetaMask.')\n connectBtn.removeAttribute('disabled')\n connectBtn.textContent = 'Connect Wallet'\n connectBtn.style.opacity = '1'\n connectBtn.style.cursor = 'pointer'\n return\n }\n\n const address = await connectWallet(wallet)\n\n // Show confirmation UI\n content.innerHTML = ''\n\n const walletBox = document.createElement('div')\n walletBox.style.cssText = STYLES.walletBox\n walletBox.innerHTML = `\n <p style=\"${STYLES.walletLabel}\">Connected Wallet</p>\n <p style=\"${STYLES.walletAddress}\">${formatAddress(address)}</p>\n `\n\n const buttonGroup = document.createElement('div')\n buttonGroup.style.cssText = STYLES.buttonGroup\n\n const cancelBtn = document.createElement('button')\n cancelBtn.textContent = 'Cancel'\n cancelBtn.style.cssText = STYLES.buttonSecondary\n cancelBtn.onclick = () => {\n cleanup()\n resolve(null)\n }\n\n const payBtn = document.createElement('button')\n payBtn.textContent = `Pay ${request.amount} ${request.token}`\n payBtn.style.cssText = STYLES.buttonPrimary\n\n payBtn.onclick = async () => {\n if (isProcessing) return\n isProcessing = true\n\n payBtn.setAttribute('disabled', 'true')\n payBtn.textContent = 'Processing...'\n payBtn.style.opacity = '0.7'\n payBtn.style.cursor = 'not-allowed'\n\n try {\n const w = detectWalletProvider()\n if (!w) throw new Error('Wallet not connected')\n\n const payment = await processPayment(request, w)\n cleanup()\n resolve(payment)\n } catch (error) {\n alert(`Payment failed: ${error instanceof Error ? error.message : String(error)}`)\n isProcessing = false\n payBtn.removeAttribute('disabled')\n payBtn.textContent = `Pay ${request.amount} ${request.token}`\n payBtn.style.opacity = '1'\n payBtn.style.cursor = 'pointer'\n }\n }\n\n buttonGroup.appendChild(cancelBtn)\n buttonGroup.appendChild(payBtn)\n\n content.appendChild(walletBox)\n content.appendChild(buttonGroup)\n } catch (error) {\n alert(`Connection failed: ${error instanceof Error ? error.message : String(error)}`)\n connectBtn.removeAttribute('disabled')\n connectBtn.textContent = 'Connect Wallet'\n connectBtn.style.opacity = '1'\n connectBtn.style.cursor = 'pointer'\n }\n }\n\n content.appendChild(connectBtn)\n\n // Assemble modal\n modal.appendChild(header)\n modal.appendChild(details)\n modal.appendChild(content)\n overlay.appendChild(modal)\n document.body.appendChild(overlay)\n\n // Close on overlay click\n overlay.onclick = (e) => {\n if (e.target === overlay) {\n cleanup()\n resolve(null)\n }\n }\n\n // Close on escape key\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n cleanup()\n resolve(null)\n document.removeEventListener('keydown', handleEscape)\n }\n }\n document.addEventListener('keydown', handleEscape)\n })\n}\n","/**\n * Payment Modal\n *\n * Default payment modal implementation using vanilla JS\n */\n\nimport type { PaymentRequest, PaymentResponse } from './types'\nimport { createVanillaPaymentModal } from './modal-vanilla'\n\n/**\n * Create payment modal\n *\n * Uses vanilla JS modal that works in any browser environment\n */\nexport async function createPaymentModal(\n request: PaymentRequest\n): Promise<PaymentResponse | null> {\n if (typeof window === 'undefined') {\n return null\n }\n\n return createVanillaPaymentModal(request)\n}\n","/**\n * x402 Client\n *\n * Main client that intercepts HTTP 402 responses and handles payment flow\n */\n\nimport type { X402ClientOptions, PaymentRequest, PaymentResponse, WalletProvider } from './types'\nimport { detectWalletProvider } from './wallet'\nimport { createPaymentModal } from './modal'\n\n/**\n * Parse HTTP 402 Payment Required response\n */\nfunction parse402Response(response: Response): PaymentRequest | null {\n if (response.status !== 402) {\n return null\n }\n\n const amount = response.headers.get('X-402-Amount') || response.headers.get('x-402-amount')\n const token = response.headers.get('X-402-Token') || response.headers.get('x-402-token')\n const network = response.headers.get('X-402-Network') || response.headers.get('x-402-network')\n const recipient =\n response.headers.get('X-402-Recipient') || response.headers.get('x-402-recipient')\n\n if (!amount || !token || !network || !recipient) {\n return null\n }\n\n return { amount, token, network, recipient }\n}\n\n/**\n * Add payment headers to request\n */\nfunction addPaymentHeaders(headers: HeadersInit, payment: PaymentResponse): Headers {\n const newHeaders = new Headers(headers)\n\n newHeaders.set('X-402-Transaction-Hash', payment.transactionHash)\n\n if (payment.timestamp) {\n newHeaders.set('X-402-Timestamp', payment.timestamp)\n }\n\n return newHeaders\n}\n\n/**\n * x402 Client class\n *\n * Provides automatic HTTP 402 handling for fetch requests\n */\nexport class X402Client {\n private options: X402ClientOptions\n private wallet: WalletProvider | null = null\n\n constructor(options: X402ClientOptions = {}) {\n this.options = {\n autoRetry: true,\n ...options,\n }\n }\n\n /**\n * Initialize wallet connection\n */\n async initialize(): Promise<void> {\n if (this.options.walletProvider) {\n this.wallet = this.options.walletProvider\n } else {\n this.wallet = detectWalletProvider()\n }\n }\n\n /**\n * Fetch with automatic 402 handling\n */\n async fetch(input: RequestInfo | URL, init?: RequestInit): Promise<Response> {\n const response = await globalThis.fetch(input, init)\n\n const paymentRequest = parse402Response(response)\n if (!paymentRequest) {\n return response\n }\n\n // Handle payment\n let payment: PaymentResponse | null = null\n\n if (this.options.paymentModal) {\n payment = await this.options.paymentModal(paymentRequest)\n } else {\n payment = await createPaymentModal(paymentRequest)\n }\n\n if (!payment) {\n // User cancelled or payment failed\n return response\n }\n\n // Retry request with payment headers\n if (this.options.autoRetry !== false) {\n const newHeaders = addPaymentHeaders(init?.headers || {}, payment)\n\n return globalThis.fetch(input, {\n ...init,\n headers: newHeaders,\n })\n }\n\n // Return payment info (user will retry manually)\n return new Response(JSON.stringify(payment), {\n status: 200,\n headers: { 'Content-Type': 'application/json' },\n })\n }\n}\n\n/**\n * Create x402 client instance\n */\nexport function x402Client(options?: X402ClientOptions): X402Client {\n return new X402Client(options)\n}\n\n/**\n * Enhanced fetch with automatic 402 handling\n *\n * @example\n * ```typescript\n * const response = await x402Fetch('https://api.example.com/data')\n * ```\n */\nexport async function x402Fetch(\n input: RequestInfo | URL,\n init?: RequestInit,\n options?: X402ClientOptions\n): Promise<Response> {\n const client = x402Client(options)\n await client.initialize()\n return client.fetch(input, init)\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,322 @@
1
+ /**
2
+ * Constants and Configuration
3
+ *
4
+ * Centralized configuration for networks and tokens
5
+ * Supports both preset networks (mainnet/testnet) and custom configurations
6
+ */
7
+ /** Supported network identifiers */
8
+ type NetworkId = 'mantle' | 'mantle-sepolia' | 'mantle-testnet';
9
+ /** Network environment */
10
+ type NetworkEnvironment = 'mainnet' | 'testnet';
11
+ /** Network configuration */
12
+ interface NetworkConfig {
13
+ chainId: number;
14
+ rpcUrl: string;
15
+ name: string;
16
+ environment: NetworkEnvironment;
17
+ nativeCurrency: {
18
+ name: string;
19
+ symbol: string;
20
+ decimals: number;
21
+ };
22
+ blockExplorer: string;
23
+ }
24
+ /** Token configuration */
25
+ interface TokenConfig {
26
+ address: string;
27
+ decimals: number;
28
+ symbol: string;
29
+ }
30
+ /** Custom network configuration (user-provided) */
31
+ interface CustomNetworkConfig {
32
+ chainId: number;
33
+ rpcUrl: string;
34
+ name?: string;
35
+ environment?: NetworkEnvironment;
36
+ blockExplorer?: string;
37
+ }
38
+ /** Custom token configuration (user-provided) */
39
+ interface CustomTokenConfig {
40
+ [symbol: string]: {
41
+ address: string;
42
+ decimals: number;
43
+ };
44
+ }
45
+ /** Network configurations */
46
+ declare const NETWORKS: Record<NetworkId, NetworkConfig>;
47
+ /** Token addresses by network */
48
+ declare const TOKENS: Record<NetworkId, Record<string, TokenConfig>>;
49
+ /** Treasury contract address (collects 0.5% platform fee) */
50
+ declare const TREASURY_ADDRESS = "0xB27705342ACE73736AE490540Ea031cc06C3eF49";
51
+ /** Platform fee in basis points (50 = 0.5%) */
52
+ declare const PLATFORM_FEE_BPS = 50n;
53
+ /** Treasury admin address */
54
+ declare const TREASURY_ADMIN = "0xDacCF30F8BB2aEb8D76E68E03033629809ed08E1";
55
+ /**
56
+ * Register a custom network configuration
57
+ *
58
+ * @example
59
+ * ```typescript
60
+ * registerCustomNetwork('my-network', {
61
+ * chainId: 12345,
62
+ * rpcUrl: 'https://my-rpc.example.com',
63
+ * name: 'My Custom Network',
64
+ * environment: 'testnet'
65
+ * })
66
+ * ```
67
+ */
68
+ declare function registerCustomNetwork(networkId: string, config: CustomNetworkConfig): void;
69
+ /**
70
+ * Register custom tokens for a network
71
+ *
72
+ * @example
73
+ * ```typescript
74
+ * registerCustomTokens('mantle', {
75
+ * 'MYTOKEN': { address: '0x...', decimals: 18 }
76
+ * })
77
+ * ```
78
+ */
79
+ declare function registerCustomTokens(networkId: string, tokens: CustomTokenConfig): void;
80
+ /**
81
+ * Check if network is testnet
82
+ */
83
+ declare function isTestnet(network: string): boolean;
84
+ /**
85
+ * Check if network is mainnet
86
+ */
87
+ declare function isMainnet(network: string): boolean;
88
+ /**
89
+ * Get network configuration (supports preset and custom networks)
90
+ */
91
+ declare function getNetworkConfig(network: string): NetworkConfig;
92
+ /**
93
+ * Get token configuration (supports preset and custom tokens)
94
+ */
95
+ declare function getTokenConfig(token: string, network: string): TokenConfig | null;
96
+ /**
97
+ * Get chain ID for network
98
+ */
99
+ declare function getChainId(network: string): number;
100
+ /**
101
+ * Get all available networks (preset + custom)
102
+ */
103
+ declare function getAvailableNetworks(): string[];
104
+ /**
105
+ * Get networks by environment
106
+ */
107
+ declare function getNetworksByEnvironment(env: NetworkEnvironment): string[];
108
+
109
+ /**
110
+ * Type definitions for x402 client SDK
111
+ */
112
+
113
+ /** Payment request from HTTP 402 response */
114
+ interface PaymentRequest {
115
+ amount: string;
116
+ token: string;
117
+ network: string;
118
+ chainId?: number;
119
+ recipient: string;
120
+ }
121
+ /** Payment response after successful payment */
122
+ interface PaymentResponse {
123
+ transactionHash: string;
124
+ timestamp?: string;
125
+ }
126
+ /** x402 Client options */
127
+ interface X402ClientOptions {
128
+ /** Wallet provider (MetaMask, WalletConnect, etc.) */
129
+ walletProvider?: WalletProvider;
130
+ /** Use testnet (mantle-sepolia) */
131
+ testnet?: boolean;
132
+ /** Network identifier (e.g., 'mantle', 'mantle-sepolia') */
133
+ network?: string;
134
+ /** Custom network configuration */
135
+ customNetwork?: CustomNetworkConfig;
136
+ /** Custom token configurations */
137
+ customTokens?: CustomTokenConfig;
138
+ /** Custom payment modal handler */
139
+ paymentModal?: (request: PaymentRequest) => Promise<PaymentResponse | null>;
140
+ /** Auto-retry after payment (default: true) */
141
+ autoRetry?: boolean;
142
+ /** Auto-switch network if needed (default: true) */
143
+ autoSwitchNetwork?: boolean;
144
+ }
145
+ /** EIP-1193 provider request arguments */
146
+ interface EIP1193RequestArgs {
147
+ method: string;
148
+ params?: readonly unknown[] | object;
149
+ }
150
+ /** EIP-1193 compatible provider */
151
+ interface EIP1193Provider {
152
+ request(args: EIP1193RequestArgs): Promise<unknown>;
153
+ on?(event: string, listener: (...args: unknown[]) => void): void;
154
+ removeListener?(event: string, listener: (...args: unknown[]) => void): void;
155
+ isMetaMask?: boolean;
156
+ }
157
+ /** Network parameters for wallet_addEthereumChain */
158
+ interface AddEthereumChainParameter {
159
+ chainId: string;
160
+ chainName: string;
161
+ nativeCurrency: {
162
+ name: string;
163
+ symbol: string;
164
+ decimals: number;
165
+ };
166
+ rpcUrls: string[];
167
+ blockExplorerUrls?: string[];
168
+ }
169
+ /** Wallet provider interface */
170
+ interface WalletProvider {
171
+ /** Check if wallet is available */
172
+ isAvailable(): boolean;
173
+ /** Connect wallet and return address */
174
+ connect(): Promise<string>;
175
+ /** Get current account */
176
+ getAccount(): Promise<string | null>;
177
+ /** Get current chain ID */
178
+ getChainId(): Promise<number | null>;
179
+ /** Switch network */
180
+ switchNetwork(chainId: number): Promise<void>;
181
+ /** Add and switch to network */
182
+ addNetwork(params: AddEthereumChainParameter): Promise<void>;
183
+ /** Send transaction */
184
+ sendTransaction(tx: TransactionRequest): Promise<string>;
185
+ /** Sign message (optional) */
186
+ signMessage?(message: string): Promise<string>;
187
+ }
188
+ /** Transaction request */
189
+ interface TransactionRequest {
190
+ to: string;
191
+ value?: string;
192
+ data?: string;
193
+ gasLimit?: string;
194
+ gasPrice?: string;
195
+ }
196
+
197
+ /**
198
+ * x402 Client
199
+ *
200
+ * Main client that intercepts HTTP 402 responses and handles payment flow
201
+ */
202
+
203
+ /**
204
+ * x402 Client class
205
+ *
206
+ * Provides automatic HTTP 402 handling for fetch requests
207
+ */
208
+ declare class X402Client {
209
+ private options;
210
+ private wallet;
211
+ constructor(options?: X402ClientOptions);
212
+ /**
213
+ * Initialize wallet connection
214
+ */
215
+ initialize(): Promise<void>;
216
+ /**
217
+ * Fetch with automatic 402 handling
218
+ */
219
+ fetch(input: RequestInfo | URL, init?: RequestInit): Promise<Response>;
220
+ }
221
+ /**
222
+ * Create x402 client instance
223
+ */
224
+ declare function x402Client(options?: X402ClientOptions): X402Client;
225
+ /**
226
+ * Enhanced fetch with automatic 402 handling
227
+ *
228
+ * @example
229
+ * ```typescript
230
+ * const response = await x402Fetch('https://api.example.com/data')
231
+ * ```
232
+ */
233
+ declare function x402Fetch(input: RequestInfo | URL, init?: RequestInit, options?: X402ClientOptions): Promise<Response>;
234
+
235
+ /**
236
+ * Payment Modal
237
+ *
238
+ * Default payment modal implementation using vanilla JS
239
+ */
240
+
241
+ /**
242
+ * Create payment modal
243
+ *
244
+ * Uses vanilla JS modal that works in any browser environment
245
+ */
246
+ declare function createPaymentModal(request: PaymentRequest): Promise<PaymentResponse | null>;
247
+
248
+ /**
249
+ * Vanilla JS Payment Modal
250
+ *
251
+ * Creates a payment modal using vanilla JS/DOM
252
+ */
253
+
254
+ /**
255
+ * Create vanilla JS payment modal
256
+ */
257
+ declare function createVanillaPaymentModal(request: PaymentRequest): Promise<PaymentResponse | null>;
258
+
259
+ /**
260
+ * Wallet Connection & Management
261
+ *
262
+ * Handles web3 wallet connections (MetaMask, WalletConnect, etc.)
263
+ * Supports network switching and custom network addition
264
+ */
265
+
266
+ /**
267
+ * MetaMask/EIP-1193 wallet provider
268
+ */
269
+ declare class MetaMaskProvider implements WalletProvider {
270
+ private ethereum;
271
+ constructor();
272
+ isAvailable(): boolean;
273
+ connect(): Promise<string>;
274
+ getAccount(): Promise<string | null>;
275
+ getChainId(): Promise<number | null>;
276
+ switchNetwork(chainId: number): Promise<void>;
277
+ addNetwork(params: AddEthereumChainParameter): Promise<void>;
278
+ sendTransaction(tx: TransactionRequest): Promise<string>;
279
+ signMessage(message: string): Promise<string>;
280
+ }
281
+ /**
282
+ * Auto-detect wallet provider
283
+ */
284
+ declare function detectWalletProvider(): WalletProvider | null;
285
+ /**
286
+ * Connect wallet (auto-detect or use provided)
287
+ */
288
+ declare function connectWallet(provider?: WalletProvider): Promise<string>;
289
+ /**
290
+ * Ensure wallet is on the correct network
291
+ *
292
+ * @param wallet - Wallet provider
293
+ * @param network - Network identifier (e.g., 'mantle', 'mantle-sepolia')
294
+ * @param autoAdd - Auto-add network if not found (default: true)
295
+ */
296
+ declare function ensureNetwork(wallet: WalletProvider, network: string, autoAdd?: boolean): Promise<void>;
297
+ /**
298
+ * Get network config for adding to wallet
299
+ */
300
+ declare function getAddNetworkParams(network: string): AddEthereumChainParameter;
301
+
302
+ /**
303
+ * Payment Processing
304
+ *
305
+ * Handles direct blockchain payments with automatic fee splitting
306
+ * Automatically splits 0.5% platform fee to Treasury
307
+ */
308
+
309
+ /**
310
+ * Process payment for an x402 request
311
+ *
312
+ * Automatically splits payment:
313
+ * - 99.5% to merchant
314
+ * - 0.5% to Treasury
315
+ *
316
+ * @param request - Payment request from HTTP 402 response
317
+ * @param wallet - Wallet provider to use for transaction
318
+ * @returns Payment response with transaction hash
319
+ */
320
+ declare function processPayment(request: PaymentRequest, wallet: WalletProvider): Promise<PaymentResponse>;
321
+
322
+ export { type AddEthereumChainParameter, type CustomNetworkConfig, type CustomTokenConfig, type EIP1193Provider, MetaMaskProvider, NETWORKS, type NetworkConfig, type NetworkEnvironment, type NetworkId, PLATFORM_FEE_BPS, type PaymentRequest, type PaymentResponse, TOKENS, TREASURY_ADDRESS, TREASURY_ADMIN, type TokenConfig, type TransactionRequest, type WalletProvider, X402Client, type X402ClientOptions, connectWallet, createPaymentModal, createVanillaPaymentModal, detectWalletProvider, ensureNetwork, getAddNetworkParams, getAvailableNetworks, getChainId, getNetworkConfig, getNetworksByEnvironment, getTokenConfig, isMainnet, isTestnet, processPayment, registerCustomNetwork, registerCustomTokens, x402Client, x402Fetch };