x402-mantle-sdk 0.2.1 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -438,11 +438,10 @@ async function callRPC(url, method, params) {
438
438
  return data.result;
439
439
  }
440
440
  async function getTransactionReceipt(rpcUrl, txHash) {
441
- const receipt = await callRPC(
442
- rpcUrl,
443
- "eth_getTransactionReceipt",
444
- [txHash]
445
- );
441
+ const [receipt, tx] = await Promise.all([
442
+ callRPC(rpcUrl, "eth_getTransactionReceipt", [txHash]),
443
+ callRPC(rpcUrl, "eth_getTransactionByHash", [txHash])
444
+ ]);
446
445
  if (!receipt) {
447
446
  return null;
448
447
  }
@@ -451,8 +450,8 @@ async function getTransactionReceipt(rpcUrl, txHash) {
451
450
  blockNumber: parseInt(receipt.blockNumber, 16),
452
451
  status: receipt.status === "0x1" ? "success" : "failed",
453
452
  from: receipt.from,
454
- to: receipt.to,
455
- value: receipt.value || "0x0",
453
+ to: tx?.to || receipt.to,
454
+ value: tx?.value || "0x0",
456
455
  logs: receipt.logs || []
457
456
  };
458
457
  }
@@ -507,16 +506,19 @@ async function verifyPaymentOnChain(transactionHash, config, requiredAmount, req
507
506
  if (requiredToken.toUpperCase() === "MNT") {
508
507
  const valueWei = BigInt(receipt.value);
509
508
  const requiredWei2 = parseAmountToWei(requiredAmount, 18);
509
+ const expectedMerchantAmount = requiredWei2 * 995n / 1000n;
510
+ const minAcceptable = expectedMerchantAmount - AMOUNT_TOLERANCE;
511
+ const maxAcceptable = requiredWei2 + AMOUNT_TOLERANCE;
510
512
  if (receipt.to?.toLowerCase() !== recipient) {
511
513
  return {
512
514
  valid: false,
513
515
  error: `Recipient mismatch: expected ${config.payTo}, got ${receipt.to}`
514
516
  };
515
517
  }
516
- if (valueWei < requiredWei2 - AMOUNT_TOLERANCE || valueWei > requiredWei2 + AMOUNT_TOLERANCE) {
518
+ if (valueWei < minAcceptable || valueWei > maxAcceptable) {
517
519
  return {
518
520
  valid: false,
519
- error: `Amount mismatch: expected ${requiredAmount} MNT, got ${weiToTokenUnits(valueWei)} MNT`
521
+ error: `Amount mismatch: expected ~${requiredAmount} MNT (99.5%-100%), got ${weiToTokenUnits(valueWei)} MNT`
520
522
  };
521
523
  }
522
524
  return {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/server/constants.ts","../../src/server/platform.ts","../../src/server/analytics.ts","../../src/server/endpoint-registry.ts","../../src/server/index.ts","../../src/server/middleware.ts","../../src/server/blockchain.ts","../../src/server/verify.ts","../../src/server/hono.ts"],"sourcesContent":["/**\n * Constants and Configuration\n *\n * Centralized configuration for networks, tokens, and RPC endpoints\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/** ERC20 Transfer event signature */\nexport const ERC20_TRANSFER_SIGNATURE = '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef'\n\n/** Default platform URL (for project config) */\nexport const DEFAULT_PLATFORM_URL = 'https://mantle-x402.vercel.app'\n\n/** Amount tolerance for payment verification (0.001 tokens) */\nexport const AMOUNT_TOLERANCE = BigInt(1e15)\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 RPC URL for network (with environment override)\n */\nexport function getRpcUrl(network: string, customRpcUrl?: string): string {\n // Custom RPC takes priority\n if (customRpcUrl) {\n return customRpcUrl\n }\n\n // Check environment variables\n const envRpc = process.env.X402_RPC_URL || process.env[`X402_RPC_URL_${network.toUpperCase()}`]\n if (envRpc) {\n return envRpc\n }\n\n return getNetworkConfig(network).rpcUrl\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 * Platform Configuration & Validation\n *\n * Validates project configuration via platform API\n */\n\nimport { DEFAULT_PLATFORM_URL } from './constants'\n\n/** Project configuration from platform */\nexport interface ProjectConfig {\n appId: string\n name: string\n payTo: string\n network: string\n status: string\n}\n\n/** Platform API response */\ninterface PlatformResponse {\n appId: string\n name: string\n payTo: string\n network: string\n status: string\n}\n\n/** Cached configuration (singleton) */\nlet cachedConfig: ProjectConfig | null = null\nlet validationPromise: Promise<ProjectConfig> | null = null\n\n/**\n * Get platform API base URL\n */\nfunction getPlatformBaseUrl(): string {\n return (\n process.env.X402_PLATFORM_URL ||\n process.env.NEXT_PUBLIC_X402_PLATFORM_URL ||\n DEFAULT_PLATFORM_URL\n )\n}\n\n/**\n * Validate project with platform API\n */\nasync function validateProject(appId: string): Promise<ProjectConfig> {\n const baseUrl = getPlatformBaseUrl()\n const url = `${baseUrl}/api/v1/validate?appId=${encodeURIComponent(appId)}`\n\n const response = await fetch(url, {\n method: 'GET',\n headers: { 'Content-Type': 'application/json' },\n })\n\n if (!response.ok) {\n if (response.status === 404) {\n throw new Error('Project not found: Invalid X402_APP_ID')\n }\n if (response.status === 401) {\n throw new Error('Unauthorized: Invalid X402_APP_ID')\n }\n throw new Error(`Platform validation failed: ${response.status} ${response.statusText}`)\n }\n\n const data = (await response.json()) as PlatformResponse\n\n if (!data.appId || !data.payTo || !data.network) {\n throw new Error('Invalid platform response: missing required fields')\n }\n\n if (data.status !== 'ACTIVE') {\n throw new Error(`Project is not active: status is ${data.status}`)\n }\n\n return {\n appId: data.appId,\n name: data.name,\n payTo: data.payTo,\n network: data.network,\n status: data.status,\n }\n}\n\n/**\n * Initialize platform configuration\n *\n * Reads X402_APP_ID from environment and validates with platform API.\n * Uses singleton pattern - multiple calls return same promise.\n */\nexport async function initializePlatform(): Promise<ProjectConfig> {\n if (cachedConfig) {\n return cachedConfig\n }\n\n if (validationPromise) {\n return validationPromise\n }\n\n const appId = process.env.X402_APP_ID || process.env.NEXT_PUBLIC_X402_APP_ID\n\n if (!appId || typeof appId !== 'string' || appId.trim().length === 0) {\n throw new Error('X402_APP_ID is required. Set it in your environment variables.')\n }\n\n validationPromise = validateProject(appId.trim())\n\n try {\n cachedConfig = await validationPromise\n return cachedConfig\n } catch (error) {\n validationPromise = null\n throw error\n }\n}\n\n/**\n * Get cached project configuration\n *\n * @throws Error if platform not initialized\n */\nexport function getProjectConfig(): ProjectConfig {\n if (!cachedConfig) {\n throw new Error('Platform not initialized. Call initializePlatform() first.')\n }\n return cachedConfig\n}\n\n/**\n * Clear cached configuration (for testing)\n */\nexport function clearCache(): void {\n cachedConfig = null\n validationPromise = null\n}\n","/**\n * Analytics & Payment Tracking\n *\n * Optional utility to log payment events to the platform for dashboard tracking\n */\n\nimport { getProjectConfig } from './platform'\nimport { DEFAULT_PLATFORM_URL } from './constants'\n\n/** Payment event data */\nexport interface PaymentEvent {\n transactionHash: string\n amount: string\n token: string\n network: string\n endpoint?: string // API endpoint that was paid for\n method?: string // HTTP method (GET, POST, etc.)\n fromAddress?: string // Payer wallet address\n toAddress: string // Recipient wallet address\n blockNumber?: number // Block number of transaction\n status?: 'SUCCESS' | 'FAILED' | 'PENDING'\n}\n\n/**\n * Get platform API base URL\n */\nfunction getPlatformBaseUrl(): string {\n return (\n process.env.X402_PLATFORM_URL ||\n process.env.NEXT_PUBLIC_X402_PLATFORM_URL ||\n DEFAULT_PLATFORM_URL\n )\n}\n\n/**\n * Log a payment event to the platform\n *\n * This is optional - call this after successful payment verification\n * to track endpoint usage in the dashboard.\n *\n * @param event - Payment event data\n * @param requestPath - Optional: Request path (e.g., \"/api/premium-data\")\n * @param requestMethod - Optional: HTTP method (e.g., \"GET\", \"POST\")\n *\n * @example\n * ```typescript\n * import { logPayment } from '@x402-devkit/sdk/server'\n *\n * // After successful payment verification\n * await logPayment({\n * transactionHash: receipt.transactionHash,\n * amount: '0.001',\n * token: 'MNT',\n * network: 'mantle',\n * toAddress: config.payTo,\n * }, '/api/premium-data', 'GET')\n * ```\n */\nexport async function logPayment(\n event: PaymentEvent,\n requestPath?: string,\n requestMethod?: string\n): Promise<void> {\n try {\n const config = getProjectConfig()\n const baseUrl = getPlatformBaseUrl()\n const url = `${baseUrl}/api/payments`\n\n const payload = {\n appId: config.appId,\n transactionHash: event.transactionHash,\n amount: event.amount,\n token: event.token,\n network: event.network || config.network,\n endpoint: event.endpoint || requestPath || null,\n method: event.method || requestMethod || null,\n fromAddress: event.fromAddress || null,\n toAddress: event.toAddress || config.payTo,\n blockNumber: event.blockNumber || null,\n status: event.status || 'SUCCESS',\n }\n\n // Fire and forget - don't block on analytics\n fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n }).catch((error) => {\n // Silently fail - analytics shouldn't break the payment flow\n console.warn('Failed to log payment event:', error)\n })\n } catch (error) {\n // Silently fail - analytics shouldn't break the payment flow\n console.warn('Failed to log payment event:', error)\n }\n}\n\n","/**\n * Endpoint Registry\n *\n * Automatically registers endpoints when x402 middleware is used\n * This allows endpoints to appear in the dashboard even before payments are made\n */\n\nimport { getProjectConfig } from './platform'\nimport { DEFAULT_PLATFORM_URL } from './constants'\n\n/** Endpoint registration data */\nexport interface EndpointRegistration {\n endpoint: string\n method?: string\n price: string\n token: string\n network: string\n}\n\n/**\n * Get platform API base URL\n */\nfunction getPlatformBaseUrl(): string {\n return (\n process.env.X402_PLATFORM_URL ||\n process.env.NEXT_PUBLIC_X402_PLATFORM_URL ||\n DEFAULT_PLATFORM_URL\n )\n}\n\n/** Cache of registered endpoints to avoid duplicate registrations */\nconst registeredEndpoints = new Set<string>()\n\n/**\n * Register an endpoint with the platform\n *\n * This is called automatically when x402 middleware is first invoked for an endpoint.\n * Endpoints appear in the dashboard even before any payments are made.\n *\n * @param registration - Endpoint registration data\n */\nexport async function registerEndpoint(registration: EndpointRegistration): Promise<void> {\n try {\n const config = getProjectConfig()\n const baseUrl = getPlatformBaseUrl()\n\n // Create unique key for this endpoint\n const endpointKey = `${config.appId}:${registration.endpoint}:${registration.method || 'ANY'}`\n\n // Skip if already registered in this session\n if (registeredEndpoints.has(endpointKey)) {\n return\n }\n\n // Mark as registered\n registeredEndpoints.add(endpointKey)\n\n const url = `${baseUrl}/api/endpoints/register`\n\n const payload = {\n appId: config.appId,\n endpoint: registration.endpoint,\n method: registration.method || null,\n price: registration.price,\n token: registration.token,\n network: registration.network || config.network,\n }\n\n // Fire and forget - don't block on registration\n fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n }).catch((error) => {\n // Silently fail - registration shouldn't break the payment flow\n console.warn('Failed to register endpoint:', error)\n // Remove from cache so we can retry next time\n registeredEndpoints.delete(endpointKey)\n })\n } catch (error) {\n // Silently fail - registration shouldn't break the payment flow\n console.warn('Failed to register endpoint:', error)\n }\n}\n\n","/**\n * x402 Server SDK\n *\n * Server middleware for x402 paid APIs on Mantle Network\n *\n * @example\n * ```typescript\n * import { x402 } from '@x402-devkit/sdk/server'\n *\n * // Basic usage (mainnet)\n * app.use('/api/data', x402({ price: '0.001', token: 'MNT' }))\n *\n * // Testnet\n * app.use('/api/data', x402({ price: '0.001', token: 'MNT', testnet: true }))\n *\n * // Custom network\n * app.use('/api/data', x402({\n * price: '0.001',\n * token: 'MNT',\n * network: 'my-network',\n * customNetwork: {\n * chainId: 12345,\n * rpcUrl: 'https://my-rpc.example.com'\n * }\n * }))\n * ```\n */\n\n// Main middleware export\nexport { x402 } from './hono'\n\n// Platform configuration\nexport {\n initializePlatform,\n getProjectConfig,\n clearCache,\n type ProjectConfig,\n} from './platform'\n\n// Payment verification\nexport {\n verifyPayment,\n extractPaymentReceipt,\n type PaymentVerification,\n type PaymentReceipt,\n} from './verify'\n\n// Blockchain verification\nexport { verifyPaymentOnChain, type BlockchainVerification } from './blockchain'\n\n// Middleware utilities\nexport {\n processPaymentMiddleware,\n type X402Options,\n type MiddlewareResult,\n type PaymentRequiredResponse,\n} from './middleware'\n\n// Constants and configuration\nexport {\n // Network presets\n NETWORKS,\n TOKENS,\n DEFAULT_PLATFORM_URL,\n\n // Network utilities\n getNetworkConfig,\n getTokenConfig,\n getRpcUrl,\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// Analytics and payment tracking\nexport {\n logPayment,\n type PaymentEvent,\n} from './analytics'\n\n// Endpoint registration\nexport {\n registerEndpoint,\n type EndpointRegistration,\n} from './endpoint-registry'\n","/**\n * Core Payment Middleware Logic\n *\n * Framework-agnostic payment verification middleware\n */\n\nimport { getProjectConfig } from './platform'\nimport { extractPaymentReceipt, verifyPayment } from './verify'\nimport {\n type CustomNetworkConfig,\n type CustomTokenConfig,\n registerCustomNetwork,\n registerCustomTokens,\n} from './constants'\n\n/** x402 middleware options */\nexport interface X402Options {\n /** Payment amount (e.g., \"0.001\") */\n price: string\n /** Payment token (e.g., \"USDC\", \"MNT\") */\n token: string\n /** Network identifier (defaults to project network) */\n network?: string\n /** Custom RPC URL (overrides default for the network) */\n rpcUrl?: string\n /** Use testnet (shorthand for network: 'mantle-sepolia') */\n testnet?: boolean\n /** Custom network configuration */\n customNetwork?: CustomNetworkConfig\n /** Custom token configurations for this network */\n customTokens?: CustomTokenConfig\n /** API endpoint path for tracking (e.g., \"/api/premium-data\") */\n endpoint?: string\n /** HTTP method for tracking (e.g., \"GET\", \"POST\") */\n method?: string\n /** Enable analytics tracking (default: true) */\n enableAnalytics?: boolean\n}\n\n/** HTTP 402 Payment Required response */\nexport interface PaymentRequiredResponse {\n status: 402\n headers: Record<string, string>\n body: {\n error: 'Payment Required'\n amount: string\n token: string\n network: string\n chainId: number\n recipient: string\n }\n}\n\n/** Middleware result */\nexport interface MiddlewareResult {\n allowed: boolean\n paymentRequired?: PaymentRequiredResponse\n error?: {\n status: number\n message: string\n }\n}\n\n/**\n * Resolve network from options\n */\nfunction resolveNetwork(options: X402Options, projectNetwork: string): string {\n // Explicit network takes priority\n if (options.network) {\n return options.network\n }\n\n // testnet shorthand\n if (options.testnet) {\n return 'mantle-sepolia'\n }\n\n // Fall back to project network\n return projectNetwork\n}\n\n/**\n * Create HTTP 402 Payment Required response\n */\nfunction createPaymentRequiredResponse(\n options: X402Options,\n config: { payTo: string; network: string },\n chainId: number\n): PaymentRequiredResponse {\n const network = resolveNetwork(options, config.network)\n\n return {\n status: 402,\n headers: {\n 'Content-Type': 'application/json',\n 'X-402-Amount': options.price,\n 'X-402-Token': options.token,\n 'X-402-Network': network,\n 'X-402-Chain-Id': chainId.toString(),\n 'X-402-Recipient': config.payTo,\n },\n body: {\n error: 'Payment Required',\n amount: options.price,\n token: options.token,\n network,\n chainId,\n recipient: config.payTo,\n },\n }\n}\n\n/**\n * Process payment middleware\n *\n * Core logic for payment verification:\n * 1. Gets project config\n * 2. Extracts payment receipt from headers\n * 3. Returns 402 if no payment\n * 4. Verifies payment on blockchain if present\n */\nexport async function processPaymentMiddleware(\n options: X402Options,\n headers: Headers | Record<string, string | string[] | undefined>,\n requestPath?: string,\n requestMethod?: string\n): Promise<MiddlewareResult> {\n try {\n // Register custom network if provided\n if (options.customNetwork) {\n const networkId = options.network || 'custom-network'\n registerCustomNetwork(networkId, options.customNetwork)\n }\n\n // Register custom tokens if provided\n if (options.customTokens) {\n const config = getProjectConfig()\n const network = resolveNetwork(options, config.network)\n registerCustomTokens(network, options.customTokens)\n }\n\n const config = getProjectConfig()\n const network = resolveNetwork(options, config.network)\n\n // Import getChainId dynamically to avoid circular dependency\n const { getChainId } = await import('./constants')\n const chainId = getChainId(network)\n\n const receipt = extractPaymentReceipt(headers)\n\n // No payment → return 402 Payment Required\n if (!receipt) {\n return {\n allowed: false,\n paymentRequired: createPaymentRequiredResponse(options, config, chainId),\n }\n }\n\n // Verify payment on blockchain\n const verification = await verifyPayment(\n receipt,\n { ...config, network },\n options.price,\n options.token,\n true,\n options.rpcUrl\n )\n\n if (!verification.valid) {\n return {\n allowed: false,\n error: {\n status: 402,\n message: verification.error || 'Payment verification failed',\n },\n }\n }\n\n // Log payment event for analytics (fire and forget)\n if (verification.transactionHash && options.enableAnalytics !== false) {\n // Dynamically import to avoid circular dependency\n import('./analytics').then(({ logPayment }) => {\n logPayment(\n {\n transactionHash: verification.transactionHash!,\n amount: verification.amount || options.price,\n token: verification.token || options.token,\n network,\n toAddress: config.payTo,\n blockNumber: undefined, // Could be extracted from verification if available\n status: 'SUCCESS',\n },\n options.endpoint || requestPath, // Use provided endpoint or extracted path\n options.method || requestMethod // Use provided method or extracted method\n ).catch(() => {\n // Silently fail - analytics shouldn't break payment flow\n })\n }).catch(() => {\n // Silently fail if analytics module can't be loaded\n })\n }\n\n return { allowed: true }\n } catch (error) {\n return {\n allowed: false,\n error: {\n status: 500,\n message: error instanceof Error ? error.message : 'Internal server error',\n },\n }\n }\n}\n","/**\n * Blockchain Verification\n *\n * Direct on-chain payment verification for Mantle network\n * - Verifies transaction receipts\n * - Validates ERC20 token transfers\n * - Validates native MNT transfers\n */\n\nimport type { ProjectConfig } from './platform'\nimport {\n getRpcUrl,\n getChainId,\n getTokenConfig,\n ERC20_TRANSFER_SIGNATURE,\n AMOUNT_TOLERANCE,\n} from './constants'\n\n/** Blockchain verification result */\nexport interface BlockchainVerification {\n valid: boolean\n transactionHash?: string\n amount?: string\n token?: string\n blockNumber?: number\n error?: string\n}\n\n/** JSON-RPC response structure */\ninterface RPCResponse<T = unknown> {\n jsonrpc: '2.0'\n id: number\n result?: T\n error?: {\n code: number\n message: string\n }\n}\n\n/** Raw transaction receipt from RPC */\ninterface RawTransactionReceipt {\n transactionHash: string\n blockNumber: string\n status: string\n from: string\n to: string | null\n value?: string\n logs: Array<{\n address: string\n topics: string[]\n data: string\n }>\n}\n\n/** Parsed transaction receipt */\ninterface TransactionReceipt {\n transactionHash: string\n blockNumber: number\n status: 'success' | 'failed'\n from: string\n to: string | null\n value: string\n logs: Array<{\n address: string\n topics: string[]\n data: string\n }>\n}\n\n/** Decoded ERC20 Transfer event */\ninterface ERC20Transfer {\n from: string\n to: string\n value: bigint\n tokenAddress: string\n}\n\n/**\n * Call JSON-RPC method\n */\nasync function callRPC<T>(url: string, method: string, params: unknown[]): Promise<T> {\n const response = await fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n jsonrpc: '2.0',\n id: 1,\n method,\n params,\n }),\n })\n\n if (!response.ok) {\n throw new Error(`RPC call failed: ${response.status} ${response.statusText}`)\n }\n\n const data = (await response.json()) as RPCResponse<T>\n\n if (data.error) {\n throw new Error(`RPC error: ${data.error.message}`)\n }\n\n return data.result as T\n}\n\n/**\n * Get and parse transaction receipt\n */\nasync function getTransactionReceipt(\n rpcUrl: string,\n txHash: string\n): Promise<TransactionReceipt | null> {\n const receipt = await callRPC<RawTransactionReceipt | null>(\n rpcUrl,\n 'eth_getTransactionReceipt',\n [txHash]\n )\n\n if (!receipt) {\n return null\n }\n\n return {\n transactionHash: receipt.transactionHash,\n blockNumber: parseInt(receipt.blockNumber, 16),\n status: receipt.status === '0x1' ? 'success' : 'failed',\n from: receipt.from,\n to: receipt.to,\n value: receipt.value || '0x0',\n logs: receipt.logs || [],\n }\n}\n\n/**\n * Decode ERC20 Transfer event from log\n */\nfunction decodeERC20Transfer(log: {\n topics: string[]\n data: string\n address: string\n}): ERC20Transfer | null {\n // Check Transfer event signature\n if (log.topics[0]?.toLowerCase() !== ERC20_TRANSFER_SIGNATURE.toLowerCase()) {\n return null\n }\n\n // Transfer has 3 topics: signature, from, to\n if (log.topics.length !== 3) {\n return null\n }\n\n return {\n from: ('0x' + log.topics[1].slice(-40)).toLowerCase(),\n to: ('0x' + log.topics[2].slice(-40)).toLowerCase(),\n value: BigInt(log.data),\n tokenAddress: log.address.toLowerCase(),\n }\n}\n\n/**\n * Convert Wei to token units\n */\nfunction weiToTokenUnits(wei: bigint, decimals: number = 18): string {\n const divisor = 10n ** BigInt(decimals)\n const whole = wei / divisor\n const remainder = wei % divisor\n\n if (remainder === 0n) {\n return whole.toString()\n }\n\n const remainderStr = remainder.toString().padStart(decimals, '0')\n const trimmed = remainderStr.replace(/0+$/, '')\n return `${whole}.${trimmed}`\n}\n\n/**\n * Parse amount string to Wei\n */\nfunction parseAmountToWei(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 * Verify payment directly on blockchain\n *\n * @param transactionHash - Transaction hash to verify\n * @param config - Project configuration\n * @param requiredAmount - Required payment amount (e.g., \"0.001\")\n * @param requiredToken - Required token symbol (e.g., \"USDC\", \"MNT\")\n * @param customRpcUrl - Custom RPC URL (optional, overrides default)\n */\nexport async function verifyPaymentOnChain(\n transactionHash: string,\n config: ProjectConfig,\n requiredAmount: string,\n requiredToken: string,\n customRpcUrl?: string\n): Promise<BlockchainVerification> {\n try {\n const rpcUrl = getRpcUrl(config.network, customRpcUrl)\n\n // Get transaction receipt\n const receipt = await getTransactionReceipt(rpcUrl, transactionHash)\n\n if (!receipt) {\n return {\n valid: false,\n error: 'Transaction not found or not yet confirmed',\n }\n }\n\n if (receipt.status !== 'success') {\n return {\n valid: false,\n error: 'Transaction failed',\n }\n }\n\n const recipient = config.payTo.toLowerCase()\n\n // Check for native MNT transfer\n if (requiredToken.toUpperCase() === 'MNT') {\n const valueWei = BigInt(receipt.value)\n const requiredWei = parseAmountToWei(requiredAmount, 18)\n\n if (receipt.to?.toLowerCase() !== recipient) {\n return {\n valid: false,\n error: `Recipient mismatch: expected ${config.payTo}, got ${receipt.to}`,\n }\n }\n\n // Check amount with tolerance\n if (valueWei < requiredWei - AMOUNT_TOLERANCE || valueWei > requiredWei + AMOUNT_TOLERANCE) {\n return {\n valid: false,\n error: `Amount mismatch: expected ${requiredAmount} MNT, got ${weiToTokenUnits(valueWei)} MNT`,\n }\n }\n\n return {\n valid: true,\n transactionHash: receipt.transactionHash,\n amount: weiToTokenUnits(valueWei),\n token: 'MNT',\n blockNumber: receipt.blockNumber,\n }\n }\n\n // Check for ERC20 token transfer\n const tokenConfig = getTokenConfig(requiredToken, config.network)\n if (!tokenConfig) {\n return {\n valid: false,\n error: `Unknown token: ${requiredToken}`,\n }\n }\n\n // Find Transfer event in logs\n let transfer: ERC20Transfer | null = null\n\n for (const log of receipt.logs) {\n if (log.address.toLowerCase() !== tokenConfig.address.toLowerCase()) {\n continue\n }\n\n const decoded = decodeERC20Transfer(log)\n if (decoded && decoded.to === recipient) {\n transfer = decoded\n break\n }\n }\n\n if (!transfer) {\n return {\n valid: false,\n error: `No ${requiredToken} transfer found to ${config.payTo}`,\n }\n }\n\n // Verify amount with tolerance (adjusted for token decimals)\n const requiredWei = parseAmountToWei(requiredAmount, tokenConfig.decimals)\n const toleranceAdjusted = AMOUNT_TOLERANCE / 10n ** BigInt(18 - tokenConfig.decimals)\n\n if (\n transfer.value < requiredWei - toleranceAdjusted ||\n transfer.value > requiredWei + toleranceAdjusted\n ) {\n return {\n valid: false,\n error: `Amount mismatch: expected ${requiredAmount} ${requiredToken}, got ${weiToTokenUnits(transfer.value, tokenConfig.decimals)} ${requiredToken}`,\n }\n }\n\n return {\n valid: true,\n transactionHash: receipt.transactionHash,\n amount: weiToTokenUnits(transfer.value, tokenConfig.decimals),\n token: requiredToken,\n blockNumber: receipt.blockNumber,\n }\n } catch (error) {\n return {\n valid: false,\n error: error instanceof Error ? error.message : 'Failed to verify payment on blockchain',\n }\n }\n}\n","/**\n * Payment Verification\n *\n * Handles direct blockchain verification of payments\n */\n\nimport type { ProjectConfig } from './platform'\nimport { verifyPaymentOnChain, type BlockchainVerification } from './blockchain'\n\n/** Payment verification result */\nexport interface PaymentVerification {\n valid: boolean\n transactionHash?: string\n amount?: string\n token?: string\n error?: string\n}\n\n/** Payment receipt from client (in request headers) */\nexport interface PaymentReceipt {\n transactionHash: string\n timestamp?: string\n}\n\n/**\n * Verify payment on blockchain\n *\n * @param receipt - Payment receipt from request headers\n * @param config - Project configuration\n * @param requiredAmount - Required payment amount\n * @param requiredToken - Required payment token\n * @param customRpcUrl - Custom RPC URL for blockchain verification\n */\nexport async function verifyPayment(\n receipt: PaymentReceipt,\n config: ProjectConfig,\n requiredAmount: string,\n requiredToken: string,\n _useBlockchain = true,\n customRpcUrl?: string\n): Promise<PaymentVerification> {\n const result = await verifyPaymentOnChain(\n receipt.transactionHash,\n config,\n requiredAmount,\n requiredToken,\n customRpcUrl\n )\n\n return {\n valid: result.valid,\n transactionHash: result.transactionHash,\n amount: result.amount,\n token: result.token,\n error: result.error,\n }\n}\n\n/**\n * Extract payment receipt from request headers\n */\nexport function extractPaymentReceipt(\n headers: Headers | Record<string, string | string[] | undefined>\n): PaymentReceipt | null {\n const getHeader = (name: string): string | null => {\n if (headers instanceof Headers) {\n return headers.get(name)\n }\n const value = headers[name.toLowerCase()] || headers[name]\n return Array.isArray(value) ? value[0] || null : value || null\n }\n\n const transactionHash =\n getHeader('x-402-transaction-hash') || getHeader('X-402-Transaction-Hash')\n\n if (!transactionHash) {\n return null\n }\n\n return {\n transactionHash,\n timestamp: getHeader('x-402-timestamp') || getHeader('X-402-Timestamp') || undefined,\n }\n}\n","/**\n * Hono Framework Integration\n *\n * Provides x402 middleware for Hono framework\n *\n * @example\n * ```typescript\n * import { x402 } from '@x402-devkit/server'\n *\n * app.use('/api/data', x402({ price: '0.001', token: 'USDC' }))\n * ```\n */\n\nimport { processPaymentMiddleware, type X402Options } from './middleware'\nimport { initializePlatform, getProjectConfig } from './platform'\n\n/** Hono context interface (generic to avoid requiring hono at build time) */\ninterface HonoContext {\n req: {\n header(): Record<string, string>\n url?: string\n path?: string\n method?: string\n }\n json(data: unknown, status?: number, headers?: Record<string, string>): Response\n}\n\n/** Hono next function */\ntype HonoNext = () => Promise<void>\n\n/**\n * x402 Hono Middleware\n *\n * Validates payment before allowing request to proceed.\n * Returns HTTP 402 if payment is missing or invalid.\n *\n * @param options - Payment options (price, token, network)\n * @returns Hono middleware function\n */\nexport function x402(options: X402Options) {\n if (!options.price || !options.token) {\n throw new Error('x402 middleware requires price and token options')\n }\n\n let initPromise: Promise<void> | null = null\n let initialized = false\n\n const ensureInitialized = async () => {\n if (initialized) return\n if (initPromise) {\n await initPromise\n return\n }\n initPromise = initializePlatform().then(() => {\n initialized = true\n initPromise = null\n })\n await initPromise\n }\n\n return async (c: HonoContext, next: HonoNext) => {\n try {\n await ensureInitialized()\n\n // Extract endpoint path from request (for automatic registration)\n const requestPath = c.req.path || (c.req.url ? new URL(c.req.url).pathname : undefined)\n const requestMethod = c.req.method\n\n // Auto-register endpoint on first use (fire and forget)\n if (requestPath && options.enableAnalytics !== false) {\n import('./endpoint-registry').then(({ registerEndpoint }) => {\n const config = getProjectConfig()\n const network = options.network || (options.testnet ? 'mantle-sepolia' : config.network)\n \n registerEndpoint({\n endpoint: requestPath,\n method: requestMethod || options.method,\n price: options.price,\n token: options.token,\n network,\n }).catch(() => {\n // Silently fail - registration shouldn't break payment flow\n })\n }).catch(() => {\n // Silently fail if module can't be loaded\n })\n }\n\n const result = await processPaymentMiddleware(\n options,\n c.req.header(),\n requestPath,\n requestMethod\n )\n\n if (!result.allowed) {\n if (result.paymentRequired) {\n return c.json(result.paymentRequired.body, 402, result.paymentRequired.headers)\n }\n if (result.error) {\n return c.json({ error: result.error.message }, result.error.status)\n }\n }\n\n await next()\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Internal server error'\n return c.json({ error: message }, 500)\n }\n }\n}\n"],"mappings":"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","names":["getPlatformBaseUrl","getPlatformBaseUrl","requiredWei","config","network","getChainId","logPayment","registerEndpoint"]}
1
+ {"version":3,"sources":["../../src/server/constants.ts","../../src/server/platform.ts","../../src/server/analytics.ts","../../src/server/endpoint-registry.ts","../../src/server/index.ts","../../src/server/middleware.ts","../../src/server/blockchain.ts","../../src/server/verify.ts","../../src/server/hono.ts"],"sourcesContent":["/**\n * Constants and Configuration\n *\n * Centralized configuration for networks, tokens, and RPC endpoints\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/** ERC20 Transfer event signature */\nexport const ERC20_TRANSFER_SIGNATURE = '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef'\n\n/** Default platform URL (for project config) */\nexport const DEFAULT_PLATFORM_URL = 'https://mantle-x402.vercel.app'\n\n/** Amount tolerance for payment verification (0.001 tokens) */\nexport const AMOUNT_TOLERANCE = BigInt(1e15)\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 RPC URL for network (with environment override)\n */\nexport function getRpcUrl(network: string, customRpcUrl?: string): string {\n // Custom RPC takes priority\n if (customRpcUrl) {\n return customRpcUrl\n }\n\n // Check environment variables\n const envRpc = process.env.X402_RPC_URL || process.env[`X402_RPC_URL_${network.toUpperCase()}`]\n if (envRpc) {\n return envRpc\n }\n\n return getNetworkConfig(network).rpcUrl\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 * Platform Configuration & Validation\n *\n * Validates project configuration via platform API\n */\n\nimport { DEFAULT_PLATFORM_URL } from './constants'\n\n/** Project configuration from platform */\nexport interface ProjectConfig {\n appId: string\n name: string\n payTo: string\n network: string\n status: string\n}\n\n/** Platform API response */\ninterface PlatformResponse {\n appId: string\n name: string\n payTo: string\n network: string\n status: string\n}\n\n/** Cached configuration (singleton) */\nlet cachedConfig: ProjectConfig | null = null\nlet validationPromise: Promise<ProjectConfig> | null = null\n\n/**\n * Get platform API base URL\n */\nfunction getPlatformBaseUrl(): string {\n return (\n process.env.X402_PLATFORM_URL ||\n process.env.NEXT_PUBLIC_X402_PLATFORM_URL ||\n DEFAULT_PLATFORM_URL\n )\n}\n\n/**\n * Validate project with platform API\n */\nasync function validateProject(appId: string): Promise<ProjectConfig> {\n const baseUrl = getPlatformBaseUrl()\n const url = `${baseUrl}/api/v1/validate?appId=${encodeURIComponent(appId)}`\n\n const response = await fetch(url, {\n method: 'GET',\n headers: { 'Content-Type': 'application/json' },\n })\n\n if (!response.ok) {\n if (response.status === 404) {\n throw new Error('Project not found: Invalid X402_APP_ID')\n }\n if (response.status === 401) {\n throw new Error('Unauthorized: Invalid X402_APP_ID')\n }\n throw new Error(`Platform validation failed: ${response.status} ${response.statusText}`)\n }\n\n const data = (await response.json()) as PlatformResponse\n\n if (!data.appId || !data.payTo || !data.network) {\n throw new Error('Invalid platform response: missing required fields')\n }\n\n if (data.status !== 'ACTIVE') {\n throw new Error(`Project is not active: status is ${data.status}`)\n }\n\n return {\n appId: data.appId,\n name: data.name,\n payTo: data.payTo,\n network: data.network,\n status: data.status,\n }\n}\n\n/**\n * Initialize platform configuration\n *\n * Reads X402_APP_ID from environment and validates with platform API.\n * Uses singleton pattern - multiple calls return same promise.\n */\nexport async function initializePlatform(): Promise<ProjectConfig> {\n if (cachedConfig) {\n return cachedConfig\n }\n\n if (validationPromise) {\n return validationPromise\n }\n\n const appId = process.env.X402_APP_ID || process.env.NEXT_PUBLIC_X402_APP_ID\n\n if (!appId || typeof appId !== 'string' || appId.trim().length === 0) {\n throw new Error('X402_APP_ID is required. Set it in your environment variables.')\n }\n\n validationPromise = validateProject(appId.trim())\n\n try {\n cachedConfig = await validationPromise\n return cachedConfig\n } catch (error) {\n validationPromise = null\n throw error\n }\n}\n\n/**\n * Get cached project configuration\n *\n * @throws Error if platform not initialized\n */\nexport function getProjectConfig(): ProjectConfig {\n if (!cachedConfig) {\n throw new Error('Platform not initialized. Call initializePlatform() first.')\n }\n return cachedConfig\n}\n\n/**\n * Clear cached configuration (for testing)\n */\nexport function clearCache(): void {\n cachedConfig = null\n validationPromise = null\n}\n","/**\n * Analytics & Payment Tracking\n *\n * Optional utility to log payment events to the platform for dashboard tracking\n */\n\nimport { getProjectConfig } from './platform'\nimport { DEFAULT_PLATFORM_URL } from './constants'\n\n/** Payment event data */\nexport interface PaymentEvent {\n transactionHash: string\n amount: string\n token: string\n network: string\n endpoint?: string // API endpoint that was paid for\n method?: string // HTTP method (GET, POST, etc.)\n fromAddress?: string // Payer wallet address\n toAddress: string // Recipient wallet address\n blockNumber?: number // Block number of transaction\n status?: 'SUCCESS' | 'FAILED' | 'PENDING'\n}\n\n/**\n * Get platform API base URL\n */\nfunction getPlatformBaseUrl(): string {\n return (\n process.env.X402_PLATFORM_URL ||\n process.env.NEXT_PUBLIC_X402_PLATFORM_URL ||\n DEFAULT_PLATFORM_URL\n )\n}\n\n/**\n * Log a payment event to the platform\n *\n * This is optional - call this after successful payment verification\n * to track endpoint usage in the dashboard.\n *\n * @param event - Payment event data\n * @param requestPath - Optional: Request path (e.g., \"/api/premium-data\")\n * @param requestMethod - Optional: HTTP method (e.g., \"GET\", \"POST\")\n *\n * @example\n * ```typescript\n * import { logPayment } from '@x402-devkit/sdk/server'\n *\n * // After successful payment verification\n * await logPayment({\n * transactionHash: receipt.transactionHash,\n * amount: '0.001',\n * token: 'MNT',\n * network: 'mantle',\n * toAddress: config.payTo,\n * }, '/api/premium-data', 'GET')\n * ```\n */\nexport async function logPayment(\n event: PaymentEvent,\n requestPath?: string,\n requestMethod?: string\n): Promise<void> {\n try {\n const config = getProjectConfig()\n const baseUrl = getPlatformBaseUrl()\n const url = `${baseUrl}/api/payments`\n\n const payload = {\n appId: config.appId,\n transactionHash: event.transactionHash,\n amount: event.amount,\n token: event.token,\n network: event.network || config.network,\n endpoint: event.endpoint || requestPath || null,\n method: event.method || requestMethod || null,\n fromAddress: event.fromAddress || null,\n toAddress: event.toAddress || config.payTo,\n blockNumber: event.blockNumber || null,\n status: event.status || 'SUCCESS',\n }\n\n // Fire and forget - don't block on analytics\n fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n }).catch((error) => {\n // Silently fail - analytics shouldn't break the payment flow\n console.warn('Failed to log payment event:', error)\n })\n } catch (error) {\n // Silently fail - analytics shouldn't break the payment flow\n console.warn('Failed to log payment event:', error)\n }\n}\n\n","/**\n * Endpoint Registry\n *\n * Automatically registers endpoints when x402 middleware is used\n * This allows endpoints to appear in the dashboard even before payments are made\n */\n\nimport { getProjectConfig } from './platform'\nimport { DEFAULT_PLATFORM_URL } from './constants'\n\n/** Endpoint registration data */\nexport interface EndpointRegistration {\n endpoint: string\n method?: string\n price: string\n token: string\n network: string\n}\n\n/**\n * Get platform API base URL\n */\nfunction getPlatformBaseUrl(): string {\n return (\n process.env.X402_PLATFORM_URL ||\n process.env.NEXT_PUBLIC_X402_PLATFORM_URL ||\n DEFAULT_PLATFORM_URL\n )\n}\n\n/** Cache of registered endpoints to avoid duplicate registrations */\nconst registeredEndpoints = new Set<string>()\n\n/**\n * Register an endpoint with the platform\n *\n * This is called automatically when x402 middleware is first invoked for an endpoint.\n * Endpoints appear in the dashboard even before any payments are made.\n *\n * @param registration - Endpoint registration data\n */\nexport async function registerEndpoint(registration: EndpointRegistration): Promise<void> {\n try {\n const config = getProjectConfig()\n const baseUrl = getPlatformBaseUrl()\n\n // Create unique key for this endpoint\n const endpointKey = `${config.appId}:${registration.endpoint}:${registration.method || 'ANY'}`\n\n // Skip if already registered in this session\n if (registeredEndpoints.has(endpointKey)) {\n return\n }\n\n // Mark as registered\n registeredEndpoints.add(endpointKey)\n\n const url = `${baseUrl}/api/endpoints/register`\n\n const payload = {\n appId: config.appId,\n endpoint: registration.endpoint,\n method: registration.method || null,\n price: registration.price,\n token: registration.token,\n network: registration.network || config.network,\n }\n\n // Fire and forget - don't block on registration\n fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n }).catch((error) => {\n // Silently fail - registration shouldn't break the payment flow\n console.warn('Failed to register endpoint:', error)\n // Remove from cache so we can retry next time\n registeredEndpoints.delete(endpointKey)\n })\n } catch (error) {\n // Silently fail - registration shouldn't break the payment flow\n console.warn('Failed to register endpoint:', error)\n }\n}\n\n","/**\n * x402 Server SDK\n *\n * Server middleware for x402 paid APIs on Mantle Network\n *\n * @example\n * ```typescript\n * import { x402 } from '@x402-devkit/sdk/server'\n *\n * // Basic usage (mainnet)\n * app.use('/api/data', x402({ price: '0.001', token: 'MNT' }))\n *\n * // Testnet\n * app.use('/api/data', x402({ price: '0.001', token: 'MNT', testnet: true }))\n *\n * // Custom network\n * app.use('/api/data', x402({\n * price: '0.001',\n * token: 'MNT',\n * network: 'my-network',\n * customNetwork: {\n * chainId: 12345,\n * rpcUrl: 'https://my-rpc.example.com'\n * }\n * }))\n * ```\n */\n\n// Main middleware export\nexport { x402 } from './hono'\n\n// Platform configuration\nexport {\n initializePlatform,\n getProjectConfig,\n clearCache,\n type ProjectConfig,\n} from './platform'\n\n// Payment verification\nexport {\n verifyPayment,\n extractPaymentReceipt,\n type PaymentVerification,\n type PaymentReceipt,\n} from './verify'\n\n// Blockchain verification\nexport { verifyPaymentOnChain, type BlockchainVerification } from './blockchain'\n\n// Middleware utilities\nexport {\n processPaymentMiddleware,\n type X402Options,\n type MiddlewareResult,\n type PaymentRequiredResponse,\n} from './middleware'\n\n// Constants and configuration\nexport {\n // Network presets\n NETWORKS,\n TOKENS,\n DEFAULT_PLATFORM_URL,\n\n // Network utilities\n getNetworkConfig,\n getTokenConfig,\n getRpcUrl,\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// Analytics and payment tracking\nexport {\n logPayment,\n type PaymentEvent,\n} from './analytics'\n\n// Endpoint registration\nexport {\n registerEndpoint,\n type EndpointRegistration,\n} from './endpoint-registry'\n","/**\n * Core Payment Middleware Logic\n *\n * Framework-agnostic payment verification middleware\n */\n\nimport { getProjectConfig } from './platform'\nimport { extractPaymentReceipt, verifyPayment } from './verify'\nimport {\n type CustomNetworkConfig,\n type CustomTokenConfig,\n registerCustomNetwork,\n registerCustomTokens,\n} from './constants'\n\n/** x402 middleware options */\nexport interface X402Options {\n /** Payment amount (e.g., \"0.001\") */\n price: string\n /** Payment token (e.g., \"USDC\", \"MNT\") */\n token: string\n /** Network identifier (defaults to project network) */\n network?: string\n /** Custom RPC URL (overrides default for the network) */\n rpcUrl?: string\n /** Use testnet (shorthand for network: 'mantle-sepolia') */\n testnet?: boolean\n /** Custom network configuration */\n customNetwork?: CustomNetworkConfig\n /** Custom token configurations for this network */\n customTokens?: CustomTokenConfig\n /** API endpoint path for tracking (e.g., \"/api/premium-data\") */\n endpoint?: string\n /** HTTP method for tracking (e.g., \"GET\", \"POST\") */\n method?: string\n /** Enable analytics tracking (default: true) */\n enableAnalytics?: boolean\n}\n\n/** HTTP 402 Payment Required response */\nexport interface PaymentRequiredResponse {\n status: 402\n headers: Record<string, string>\n body: {\n error: 'Payment Required'\n amount: string\n token: string\n network: string\n chainId: number\n recipient: string\n }\n}\n\n/** Middleware result */\nexport interface MiddlewareResult {\n allowed: boolean\n paymentRequired?: PaymentRequiredResponse\n error?: {\n status: number\n message: string\n }\n}\n\n/**\n * Resolve network from options\n */\nfunction resolveNetwork(options: X402Options, projectNetwork: string): string {\n // Explicit network takes priority\n if (options.network) {\n return options.network\n }\n\n // testnet shorthand\n if (options.testnet) {\n return 'mantle-sepolia'\n }\n\n // Fall back to project network\n return projectNetwork\n}\n\n/**\n * Create HTTP 402 Payment Required response\n */\nfunction createPaymentRequiredResponse(\n options: X402Options,\n config: { payTo: string; network: string },\n chainId: number\n): PaymentRequiredResponse {\n const network = resolveNetwork(options, config.network)\n\n return {\n status: 402,\n headers: {\n 'Content-Type': 'application/json',\n 'X-402-Amount': options.price,\n 'X-402-Token': options.token,\n 'X-402-Network': network,\n 'X-402-Chain-Id': chainId.toString(),\n 'X-402-Recipient': config.payTo,\n },\n body: {\n error: 'Payment Required',\n amount: options.price,\n token: options.token,\n network,\n chainId,\n recipient: config.payTo,\n },\n }\n}\n\n/**\n * Process payment middleware\n *\n * Core logic for payment verification:\n * 1. Gets project config\n * 2. Extracts payment receipt from headers\n * 3. Returns 402 if no payment\n * 4. Verifies payment on blockchain if present\n */\nexport async function processPaymentMiddleware(\n options: X402Options,\n headers: Headers | Record<string, string | string[] | undefined>,\n requestPath?: string,\n requestMethod?: string\n): Promise<MiddlewareResult> {\n try {\n // Register custom network if provided\n if (options.customNetwork) {\n const networkId = options.network || 'custom-network'\n registerCustomNetwork(networkId, options.customNetwork)\n }\n\n // Register custom tokens if provided\n if (options.customTokens) {\n const config = getProjectConfig()\n const network = resolveNetwork(options, config.network)\n registerCustomTokens(network, options.customTokens)\n }\n\n const config = getProjectConfig()\n const network = resolveNetwork(options, config.network)\n\n // Import getChainId dynamically to avoid circular dependency\n const { getChainId } = await import('./constants')\n const chainId = getChainId(network)\n\n const receipt = extractPaymentReceipt(headers)\n\n // No payment → return 402 Payment Required\n if (!receipt) {\n return {\n allowed: false,\n paymentRequired: createPaymentRequiredResponse(options, config, chainId),\n }\n }\n\n // Verify payment on blockchain\n const verification = await verifyPayment(\n receipt,\n { ...config, network },\n options.price,\n options.token,\n true,\n options.rpcUrl\n )\n\n if (!verification.valid) {\n return {\n allowed: false,\n error: {\n status: 402,\n message: verification.error || 'Payment verification failed',\n },\n }\n }\n\n // Log payment event for analytics (fire and forget)\n if (verification.transactionHash && options.enableAnalytics !== false) {\n // Dynamically import to avoid circular dependency\n import('./analytics').then(({ logPayment }) => {\n logPayment(\n {\n transactionHash: verification.transactionHash!,\n amount: verification.amount || options.price,\n token: verification.token || options.token,\n network,\n toAddress: config.payTo,\n blockNumber: undefined, // Could be extracted from verification if available\n status: 'SUCCESS',\n },\n options.endpoint || requestPath, // Use provided endpoint or extracted path\n options.method || requestMethod // Use provided method or extracted method\n ).catch(() => {\n // Silently fail - analytics shouldn't break payment flow\n })\n }).catch(() => {\n // Silently fail if analytics module can't be loaded\n })\n }\n\n return { allowed: true }\n } catch (error) {\n return {\n allowed: false,\n error: {\n status: 500,\n message: error instanceof Error ? error.message : 'Internal server error',\n },\n }\n }\n}\n","/**\n * Blockchain Verification\n *\n * Direct on-chain payment verification for Mantle network\n * - Verifies transaction receipts\n * - Validates ERC20 token transfers\n * - Validates native MNT transfers\n */\n\nimport type { ProjectConfig } from './platform'\nimport {\n getRpcUrl,\n getChainId,\n getTokenConfig,\n ERC20_TRANSFER_SIGNATURE,\n AMOUNT_TOLERANCE,\n} from './constants'\n\n/** Blockchain verification result */\nexport interface BlockchainVerification {\n valid: boolean\n transactionHash?: string\n amount?: string\n token?: string\n blockNumber?: number\n error?: string\n}\n\n/** JSON-RPC response structure */\ninterface RPCResponse<T = unknown> {\n jsonrpc: '2.0'\n id: number\n result?: T\n error?: {\n code: number\n message: string\n }\n}\n\n/** Raw transaction receipt from RPC */\ninterface RawTransactionReceipt {\n transactionHash: string\n blockNumber: string\n status: string\n from: string\n to: string | null\n logs: Array<{\n address: string\n topics: string[]\n data: string\n }>\n}\n\n/** Raw transaction from RPC */\ninterface RawTransaction {\n hash: string\n from: string\n to: string | null\n value: string\n input: string\n blockNumber: string | null\n}\n\n/** Parsed transaction receipt */\ninterface TransactionReceipt {\n transactionHash: string\n blockNumber: number\n status: 'success' | 'failed'\n from: string\n to: string | null\n value: string\n logs: Array<{\n address: string\n topics: string[]\n data: string\n }>\n}\n\n/** Decoded ERC20 Transfer event */\ninterface ERC20Transfer {\n from: string\n to: string\n value: bigint\n tokenAddress: string\n}\n\n/**\n * Call JSON-RPC method\n */\nasync function callRPC<T>(url: string, method: string, params: unknown[]): Promise<T> {\n const response = await fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n jsonrpc: '2.0',\n id: 1,\n method,\n params,\n }),\n })\n\n if (!response.ok) {\n throw new Error(`RPC call failed: ${response.status} ${response.statusText}`)\n }\n\n const data = (await response.json()) as RPCResponse<T>\n\n if (data.error) {\n throw new Error(`RPC error: ${data.error.message}`)\n }\n\n return data.result as T\n}\n\n/**\n * Get transaction by hash\n */\nasync function getTransaction(\n rpcUrl: string,\n txHash: string\n): Promise<RawTransaction | null> {\n return await callRPC<RawTransaction | null>(\n rpcUrl,\n 'eth_getTransactionByHash',\n [txHash]\n )\n}\n\n/**\n * Get and parse transaction receipt with transaction value\n */\nasync function getTransactionReceipt(\n rpcUrl: string,\n txHash: string\n): Promise<TransactionReceipt | null> {\n // Get both receipt and transaction (for value)\n const [receipt, tx] = await Promise.all([\n callRPC<RawTransactionReceipt | null>(rpcUrl, 'eth_getTransactionReceipt', [txHash]),\n callRPC<RawTransaction | null>(rpcUrl, 'eth_getTransactionByHash', [txHash]),\n ])\n\n if (!receipt) {\n return null\n }\n\n return {\n transactionHash: receipt.transactionHash,\n blockNumber: parseInt(receipt.blockNumber, 16),\n status: receipt.status === '0x1' ? 'success' : 'failed',\n from: receipt.from,\n to: tx?.to || receipt.to,\n value: tx?.value || '0x0',\n logs: receipt.logs || [],\n }\n}\n\n/**\n * Decode ERC20 Transfer event from log\n */\nfunction decodeERC20Transfer(log: {\n topics: string[]\n data: string\n address: string\n}): ERC20Transfer | null {\n // Check Transfer event signature\n if (log.topics[0]?.toLowerCase() !== ERC20_TRANSFER_SIGNATURE.toLowerCase()) {\n return null\n }\n\n // Transfer has 3 topics: signature, from, to\n if (log.topics.length !== 3) {\n return null\n }\n\n return {\n from: ('0x' + log.topics[1].slice(-40)).toLowerCase(),\n to: ('0x' + log.topics[2].slice(-40)).toLowerCase(),\n value: BigInt(log.data),\n tokenAddress: log.address.toLowerCase(),\n }\n}\n\n/**\n * Convert Wei to token units\n */\nfunction weiToTokenUnits(wei: bigint, decimals: number = 18): string {\n const divisor = 10n ** BigInt(decimals)\n const whole = wei / divisor\n const remainder = wei % divisor\n\n if (remainder === 0n) {\n return whole.toString()\n }\n\n const remainderStr = remainder.toString().padStart(decimals, '0')\n const trimmed = remainderStr.replace(/0+$/, '')\n return `${whole}.${trimmed}`\n}\n\n/**\n * Parse amount string to Wei\n */\nfunction parseAmountToWei(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 * Verify payment directly on blockchain\n *\n * @param transactionHash - Transaction hash to verify\n * @param config - Project configuration\n * @param requiredAmount - Required payment amount (e.g., \"0.001\")\n * @param requiredToken - Required token symbol (e.g., \"USDC\", \"MNT\")\n * @param customRpcUrl - Custom RPC URL (optional, overrides default)\n */\nexport async function verifyPaymentOnChain(\n transactionHash: string,\n config: ProjectConfig,\n requiredAmount: string,\n requiredToken: string,\n customRpcUrl?: string\n): Promise<BlockchainVerification> {\n try {\n const rpcUrl = getRpcUrl(config.network, customRpcUrl)\n\n // Get transaction receipt\n const receipt = await getTransactionReceipt(rpcUrl, transactionHash)\n\n if (!receipt) {\n return {\n valid: false,\n error: 'Transaction not found or not yet confirmed',\n }\n }\n\n if (receipt.status !== 'success') {\n return {\n valid: false,\n error: 'Transaction failed',\n }\n }\n\n const recipient = config.payTo.toLowerCase()\n\n // Check for native MNT transfer\n if (requiredToken.toUpperCase() === 'MNT') {\n const valueWei = BigInt(receipt.value)\n const requiredWei = parseAmountToWei(requiredAmount, 18)\n\n // SDK sends 99.5% to recipient (0.5% fee to treasury)\n // So we expect 99.5% of the required amount\n const expectedMerchantAmount = (requiredWei * 995n) / 1000n\n\n // Also accept full amount (for clients not using fee split)\n const minAcceptable = expectedMerchantAmount - AMOUNT_TOLERANCE\n const maxAcceptable = requiredWei + AMOUNT_TOLERANCE\n\n if (receipt.to?.toLowerCase() !== recipient) {\n return {\n valid: false,\n error: `Recipient mismatch: expected ${config.payTo}, got ${receipt.to}`,\n }\n }\n\n // Check amount with tolerance (accept 99.5% to 100% of required)\n if (valueWei < minAcceptable || valueWei > maxAcceptable) {\n return {\n valid: false,\n error: `Amount mismatch: expected ~${requiredAmount} MNT (99.5%-100%), got ${weiToTokenUnits(valueWei)} MNT`,\n }\n }\n\n return {\n valid: true,\n transactionHash: receipt.transactionHash,\n amount: weiToTokenUnits(valueWei),\n token: 'MNT',\n blockNumber: receipt.blockNumber,\n }\n }\n\n // Check for ERC20 token transfer\n const tokenConfig = getTokenConfig(requiredToken, config.network)\n if (!tokenConfig) {\n return {\n valid: false,\n error: `Unknown token: ${requiredToken}`,\n }\n }\n\n // Find Transfer event in logs\n let transfer: ERC20Transfer | null = null\n\n for (const log of receipt.logs) {\n if (log.address.toLowerCase() !== tokenConfig.address.toLowerCase()) {\n continue\n }\n\n const decoded = decodeERC20Transfer(log)\n if (decoded && decoded.to === recipient) {\n transfer = decoded\n break\n }\n }\n\n if (!transfer) {\n return {\n valid: false,\n error: `No ${requiredToken} transfer found to ${config.payTo}`,\n }\n }\n\n // Verify amount with tolerance (adjusted for token decimals)\n const requiredWei = parseAmountToWei(requiredAmount, tokenConfig.decimals)\n const toleranceAdjusted = AMOUNT_TOLERANCE / 10n ** BigInt(18 - tokenConfig.decimals)\n\n if (\n transfer.value < requiredWei - toleranceAdjusted ||\n transfer.value > requiredWei + toleranceAdjusted\n ) {\n return {\n valid: false,\n error: `Amount mismatch: expected ${requiredAmount} ${requiredToken}, got ${weiToTokenUnits(transfer.value, tokenConfig.decimals)} ${requiredToken}`,\n }\n }\n\n return {\n valid: true,\n transactionHash: receipt.transactionHash,\n amount: weiToTokenUnits(transfer.value, tokenConfig.decimals),\n token: requiredToken,\n blockNumber: receipt.blockNumber,\n }\n } catch (error) {\n return {\n valid: false,\n error: error instanceof Error ? error.message : 'Failed to verify payment on blockchain',\n }\n }\n}\n","/**\n * Payment Verification\n *\n * Handles direct blockchain verification of payments\n */\n\nimport type { ProjectConfig } from './platform'\nimport { verifyPaymentOnChain, type BlockchainVerification } from './blockchain'\n\n/** Payment verification result */\nexport interface PaymentVerification {\n valid: boolean\n transactionHash?: string\n amount?: string\n token?: string\n error?: string\n}\n\n/** Payment receipt from client (in request headers) */\nexport interface PaymentReceipt {\n transactionHash: string\n timestamp?: string\n}\n\n/**\n * Verify payment on blockchain\n *\n * @param receipt - Payment receipt from request headers\n * @param config - Project configuration\n * @param requiredAmount - Required payment amount\n * @param requiredToken - Required payment token\n * @param customRpcUrl - Custom RPC URL for blockchain verification\n */\nexport async function verifyPayment(\n receipt: PaymentReceipt,\n config: ProjectConfig,\n requiredAmount: string,\n requiredToken: string,\n _useBlockchain = true,\n customRpcUrl?: string\n): Promise<PaymentVerification> {\n const result = await verifyPaymentOnChain(\n receipt.transactionHash,\n config,\n requiredAmount,\n requiredToken,\n customRpcUrl\n )\n\n return {\n valid: result.valid,\n transactionHash: result.transactionHash,\n amount: result.amount,\n token: result.token,\n error: result.error,\n }\n}\n\n/**\n * Extract payment receipt from request headers\n */\nexport function extractPaymentReceipt(\n headers: Headers | Record<string, string | string[] | undefined>\n): PaymentReceipt | null {\n const getHeader = (name: string): string | null => {\n if (headers instanceof Headers) {\n return headers.get(name)\n }\n const value = headers[name.toLowerCase()] || headers[name]\n return Array.isArray(value) ? value[0] || null : value || null\n }\n\n const transactionHash =\n getHeader('x-402-transaction-hash') || getHeader('X-402-Transaction-Hash')\n\n if (!transactionHash) {\n return null\n }\n\n return {\n transactionHash,\n timestamp: getHeader('x-402-timestamp') || getHeader('X-402-Timestamp') || undefined,\n }\n}\n","/**\n * Hono Framework Integration\n *\n * Provides x402 middleware for Hono framework\n *\n * @example\n * ```typescript\n * import { x402 } from '@x402-devkit/server'\n *\n * app.use('/api/data', x402({ price: '0.001', token: 'USDC' }))\n * ```\n */\n\nimport { processPaymentMiddleware, type X402Options } from './middleware'\nimport { initializePlatform, getProjectConfig } from './platform'\n\n/** Hono context interface (generic to avoid requiring hono at build time) */\ninterface HonoContext {\n req: {\n header(): Record<string, string>\n url?: string\n path?: string\n method?: string\n }\n json(data: unknown, status?: number, headers?: Record<string, string>): Response\n}\n\n/** Hono next function */\ntype HonoNext = () => Promise<void>\n\n/**\n * x402 Hono Middleware\n *\n * Validates payment before allowing request to proceed.\n * Returns HTTP 402 if payment is missing or invalid.\n *\n * @param options - Payment options (price, token, network)\n * @returns Hono middleware function\n */\nexport function x402(options: X402Options) {\n if (!options.price || !options.token) {\n throw new Error('x402 middleware requires price and token options')\n }\n\n let initPromise: Promise<void> | null = null\n let initialized = false\n\n const ensureInitialized = async () => {\n if (initialized) return\n if (initPromise) {\n await initPromise\n return\n }\n initPromise = initializePlatform().then(() => {\n initialized = true\n initPromise = null\n })\n await initPromise\n }\n\n return async (c: HonoContext, next: HonoNext) => {\n try {\n await ensureInitialized()\n\n // Extract endpoint path from request (for automatic registration)\n const requestPath = c.req.path || (c.req.url ? new URL(c.req.url).pathname : undefined)\n const requestMethod = c.req.method\n\n // Auto-register endpoint on first use (fire and forget)\n if (requestPath && options.enableAnalytics !== false) {\n import('./endpoint-registry').then(({ registerEndpoint }) => {\n const config = getProjectConfig()\n const network = options.network || (options.testnet ? 'mantle-sepolia' : config.network)\n \n registerEndpoint({\n endpoint: requestPath,\n method: requestMethod || options.method,\n price: options.price,\n token: options.token,\n network,\n }).catch(() => {\n // Silently fail - registration shouldn't break payment flow\n })\n }).catch(() => {\n // Silently fail if module can't be loaded\n })\n }\n\n const result = await processPaymentMiddleware(\n options,\n c.req.header(),\n requestPath,\n requestMethod\n )\n\n if (!result.allowed) {\n if (result.paymentRequired) {\n return c.json(result.paymentRequired.body, 402, result.paymentRequired.headers)\n }\n if (result.error) {\n return c.json({ error: result.error.message }, result.error.status)\n }\n }\n\n await next()\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Internal server error'\n return c.json({ error: message }, 500)\n }\n }\n}\n"],"mappings":"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","names":["getPlatformBaseUrl","getPlatformBaseUrl","requiredWei","config","network","getChainId","logPayment","registerEndpoint"]}
@@ -397,11 +397,10 @@ async function callRPC(url, method, params) {
397
397
  return data.result;
398
398
  }
399
399
  async function getTransactionReceipt(rpcUrl, txHash) {
400
- const receipt = await callRPC(
401
- rpcUrl,
402
- "eth_getTransactionReceipt",
403
- [txHash]
404
- );
400
+ const [receipt, tx] = await Promise.all([
401
+ callRPC(rpcUrl, "eth_getTransactionReceipt", [txHash]),
402
+ callRPC(rpcUrl, "eth_getTransactionByHash", [txHash])
403
+ ]);
405
404
  if (!receipt) {
406
405
  return null;
407
406
  }
@@ -410,8 +409,8 @@ async function getTransactionReceipt(rpcUrl, txHash) {
410
409
  blockNumber: parseInt(receipt.blockNumber, 16),
411
410
  status: receipt.status === "0x1" ? "success" : "failed",
412
411
  from: receipt.from,
413
- to: receipt.to,
414
- value: receipt.value || "0x0",
412
+ to: tx?.to || receipt.to,
413
+ value: tx?.value || "0x0",
415
414
  logs: receipt.logs || []
416
415
  };
417
416
  }
@@ -466,16 +465,19 @@ async function verifyPaymentOnChain(transactionHash, config, requiredAmount, req
466
465
  if (requiredToken.toUpperCase() === "MNT") {
467
466
  const valueWei = BigInt(receipt.value);
468
467
  const requiredWei2 = parseAmountToWei(requiredAmount, 18);
468
+ const expectedMerchantAmount = requiredWei2 * 995n / 1000n;
469
+ const minAcceptable = expectedMerchantAmount - AMOUNT_TOLERANCE;
470
+ const maxAcceptable = requiredWei2 + AMOUNT_TOLERANCE;
469
471
  if (receipt.to?.toLowerCase() !== recipient) {
470
472
  return {
471
473
  valid: false,
472
474
  error: `Recipient mismatch: expected ${config.payTo}, got ${receipt.to}`
473
475
  };
474
476
  }
475
- if (valueWei < requiredWei2 - AMOUNT_TOLERANCE || valueWei > requiredWei2 + AMOUNT_TOLERANCE) {
477
+ if (valueWei < minAcceptable || valueWei > maxAcceptable) {
476
478
  return {
477
479
  valid: false,
478
- error: `Amount mismatch: expected ${requiredAmount} MNT, got ${weiToTokenUnits(valueWei)} MNT`
480
+ error: `Amount mismatch: expected ~${requiredAmount} MNT (99.5%-100%), got ${weiToTokenUnits(valueWei)} MNT`
479
481
  };
480
482
  }
481
483
  return {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/server/constants.ts","../../src/server/platform.ts","../../src/server/analytics.ts","../../src/server/endpoint-registry.ts","../../src/server/middleware.ts","../../src/server/blockchain.ts","../../src/server/verify.ts","../../src/server/hono.ts","../../src/server/index.ts"],"sourcesContent":["/**\n * Constants and Configuration\n *\n * Centralized configuration for networks, tokens, and RPC endpoints\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/** ERC20 Transfer event signature */\nexport const ERC20_TRANSFER_SIGNATURE = '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef'\n\n/** Default platform URL (for project config) */\nexport const DEFAULT_PLATFORM_URL = 'https://mantle-x402.vercel.app'\n\n/** Amount tolerance for payment verification (0.001 tokens) */\nexport const AMOUNT_TOLERANCE = BigInt(1e15)\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 RPC URL for network (with environment override)\n */\nexport function getRpcUrl(network: string, customRpcUrl?: string): string {\n // Custom RPC takes priority\n if (customRpcUrl) {\n return customRpcUrl\n }\n\n // Check environment variables\n const envRpc = process.env.X402_RPC_URL || process.env[`X402_RPC_URL_${network.toUpperCase()}`]\n if (envRpc) {\n return envRpc\n }\n\n return getNetworkConfig(network).rpcUrl\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 * Platform Configuration & Validation\n *\n * Validates project configuration via platform API\n */\n\nimport { DEFAULT_PLATFORM_URL } from './constants'\n\n/** Project configuration from platform */\nexport interface ProjectConfig {\n appId: string\n name: string\n payTo: string\n network: string\n status: string\n}\n\n/** Platform API response */\ninterface PlatformResponse {\n appId: string\n name: string\n payTo: string\n network: string\n status: string\n}\n\n/** Cached configuration (singleton) */\nlet cachedConfig: ProjectConfig | null = null\nlet validationPromise: Promise<ProjectConfig> | null = null\n\n/**\n * Get platform API base URL\n */\nfunction getPlatformBaseUrl(): string {\n return (\n process.env.X402_PLATFORM_URL ||\n process.env.NEXT_PUBLIC_X402_PLATFORM_URL ||\n DEFAULT_PLATFORM_URL\n )\n}\n\n/**\n * Validate project with platform API\n */\nasync function validateProject(appId: string): Promise<ProjectConfig> {\n const baseUrl = getPlatformBaseUrl()\n const url = `${baseUrl}/api/v1/validate?appId=${encodeURIComponent(appId)}`\n\n const response = await fetch(url, {\n method: 'GET',\n headers: { 'Content-Type': 'application/json' },\n })\n\n if (!response.ok) {\n if (response.status === 404) {\n throw new Error('Project not found: Invalid X402_APP_ID')\n }\n if (response.status === 401) {\n throw new Error('Unauthorized: Invalid X402_APP_ID')\n }\n throw new Error(`Platform validation failed: ${response.status} ${response.statusText}`)\n }\n\n const data = (await response.json()) as PlatformResponse\n\n if (!data.appId || !data.payTo || !data.network) {\n throw new Error('Invalid platform response: missing required fields')\n }\n\n if (data.status !== 'ACTIVE') {\n throw new Error(`Project is not active: status is ${data.status}`)\n }\n\n return {\n appId: data.appId,\n name: data.name,\n payTo: data.payTo,\n network: data.network,\n status: data.status,\n }\n}\n\n/**\n * Initialize platform configuration\n *\n * Reads X402_APP_ID from environment and validates with platform API.\n * Uses singleton pattern - multiple calls return same promise.\n */\nexport async function initializePlatform(): Promise<ProjectConfig> {\n if (cachedConfig) {\n return cachedConfig\n }\n\n if (validationPromise) {\n return validationPromise\n }\n\n const appId = process.env.X402_APP_ID || process.env.NEXT_PUBLIC_X402_APP_ID\n\n if (!appId || typeof appId !== 'string' || appId.trim().length === 0) {\n throw new Error('X402_APP_ID is required. Set it in your environment variables.')\n }\n\n validationPromise = validateProject(appId.trim())\n\n try {\n cachedConfig = await validationPromise\n return cachedConfig\n } catch (error) {\n validationPromise = null\n throw error\n }\n}\n\n/**\n * Get cached project configuration\n *\n * @throws Error if platform not initialized\n */\nexport function getProjectConfig(): ProjectConfig {\n if (!cachedConfig) {\n throw new Error('Platform not initialized. Call initializePlatform() first.')\n }\n return cachedConfig\n}\n\n/**\n * Clear cached configuration (for testing)\n */\nexport function clearCache(): void {\n cachedConfig = null\n validationPromise = null\n}\n","/**\n * Analytics & Payment Tracking\n *\n * Optional utility to log payment events to the platform for dashboard tracking\n */\n\nimport { getProjectConfig } from './platform'\nimport { DEFAULT_PLATFORM_URL } from './constants'\n\n/** Payment event data */\nexport interface PaymentEvent {\n transactionHash: string\n amount: string\n token: string\n network: string\n endpoint?: string // API endpoint that was paid for\n method?: string // HTTP method (GET, POST, etc.)\n fromAddress?: string // Payer wallet address\n toAddress: string // Recipient wallet address\n blockNumber?: number // Block number of transaction\n status?: 'SUCCESS' | 'FAILED' | 'PENDING'\n}\n\n/**\n * Get platform API base URL\n */\nfunction getPlatformBaseUrl(): string {\n return (\n process.env.X402_PLATFORM_URL ||\n process.env.NEXT_PUBLIC_X402_PLATFORM_URL ||\n DEFAULT_PLATFORM_URL\n )\n}\n\n/**\n * Log a payment event to the platform\n *\n * This is optional - call this after successful payment verification\n * to track endpoint usage in the dashboard.\n *\n * @param event - Payment event data\n * @param requestPath - Optional: Request path (e.g., \"/api/premium-data\")\n * @param requestMethod - Optional: HTTP method (e.g., \"GET\", \"POST\")\n *\n * @example\n * ```typescript\n * import { logPayment } from '@x402-devkit/sdk/server'\n *\n * // After successful payment verification\n * await logPayment({\n * transactionHash: receipt.transactionHash,\n * amount: '0.001',\n * token: 'MNT',\n * network: 'mantle',\n * toAddress: config.payTo,\n * }, '/api/premium-data', 'GET')\n * ```\n */\nexport async function logPayment(\n event: PaymentEvent,\n requestPath?: string,\n requestMethod?: string\n): Promise<void> {\n try {\n const config = getProjectConfig()\n const baseUrl = getPlatformBaseUrl()\n const url = `${baseUrl}/api/payments`\n\n const payload = {\n appId: config.appId,\n transactionHash: event.transactionHash,\n amount: event.amount,\n token: event.token,\n network: event.network || config.network,\n endpoint: event.endpoint || requestPath || null,\n method: event.method || requestMethod || null,\n fromAddress: event.fromAddress || null,\n toAddress: event.toAddress || config.payTo,\n blockNumber: event.blockNumber || null,\n status: event.status || 'SUCCESS',\n }\n\n // Fire and forget - don't block on analytics\n fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n }).catch((error) => {\n // Silently fail - analytics shouldn't break the payment flow\n console.warn('Failed to log payment event:', error)\n })\n } catch (error) {\n // Silently fail - analytics shouldn't break the payment flow\n console.warn('Failed to log payment event:', error)\n }\n}\n\n","/**\n * Endpoint Registry\n *\n * Automatically registers endpoints when x402 middleware is used\n * This allows endpoints to appear in the dashboard even before payments are made\n */\n\nimport { getProjectConfig } from './platform'\nimport { DEFAULT_PLATFORM_URL } from './constants'\n\n/** Endpoint registration data */\nexport interface EndpointRegistration {\n endpoint: string\n method?: string\n price: string\n token: string\n network: string\n}\n\n/**\n * Get platform API base URL\n */\nfunction getPlatformBaseUrl(): string {\n return (\n process.env.X402_PLATFORM_URL ||\n process.env.NEXT_PUBLIC_X402_PLATFORM_URL ||\n DEFAULT_PLATFORM_URL\n )\n}\n\n/** Cache of registered endpoints to avoid duplicate registrations */\nconst registeredEndpoints = new Set<string>()\n\n/**\n * Register an endpoint with the platform\n *\n * This is called automatically when x402 middleware is first invoked for an endpoint.\n * Endpoints appear in the dashboard even before any payments are made.\n *\n * @param registration - Endpoint registration data\n */\nexport async function registerEndpoint(registration: EndpointRegistration): Promise<void> {\n try {\n const config = getProjectConfig()\n const baseUrl = getPlatformBaseUrl()\n\n // Create unique key for this endpoint\n const endpointKey = `${config.appId}:${registration.endpoint}:${registration.method || 'ANY'}`\n\n // Skip if already registered in this session\n if (registeredEndpoints.has(endpointKey)) {\n return\n }\n\n // Mark as registered\n registeredEndpoints.add(endpointKey)\n\n const url = `${baseUrl}/api/endpoints/register`\n\n const payload = {\n appId: config.appId,\n endpoint: registration.endpoint,\n method: registration.method || null,\n price: registration.price,\n token: registration.token,\n network: registration.network || config.network,\n }\n\n // Fire and forget - don't block on registration\n fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n }).catch((error) => {\n // Silently fail - registration shouldn't break the payment flow\n console.warn('Failed to register endpoint:', error)\n // Remove from cache so we can retry next time\n registeredEndpoints.delete(endpointKey)\n })\n } catch (error) {\n // Silently fail - registration shouldn't break the payment flow\n console.warn('Failed to register endpoint:', error)\n }\n}\n\n","/**\n * Core Payment Middleware Logic\n *\n * Framework-agnostic payment verification middleware\n */\n\nimport { getProjectConfig } from './platform'\nimport { extractPaymentReceipt, verifyPayment } from './verify'\nimport {\n type CustomNetworkConfig,\n type CustomTokenConfig,\n registerCustomNetwork,\n registerCustomTokens,\n} from './constants'\n\n/** x402 middleware options */\nexport interface X402Options {\n /** Payment amount (e.g., \"0.001\") */\n price: string\n /** Payment token (e.g., \"USDC\", \"MNT\") */\n token: string\n /** Network identifier (defaults to project network) */\n network?: string\n /** Custom RPC URL (overrides default for the network) */\n rpcUrl?: string\n /** Use testnet (shorthand for network: 'mantle-sepolia') */\n testnet?: boolean\n /** Custom network configuration */\n customNetwork?: CustomNetworkConfig\n /** Custom token configurations for this network */\n customTokens?: CustomTokenConfig\n /** API endpoint path for tracking (e.g., \"/api/premium-data\") */\n endpoint?: string\n /** HTTP method for tracking (e.g., \"GET\", \"POST\") */\n method?: string\n /** Enable analytics tracking (default: true) */\n enableAnalytics?: boolean\n}\n\n/** HTTP 402 Payment Required response */\nexport interface PaymentRequiredResponse {\n status: 402\n headers: Record<string, string>\n body: {\n error: 'Payment Required'\n amount: string\n token: string\n network: string\n chainId: number\n recipient: string\n }\n}\n\n/** Middleware result */\nexport interface MiddlewareResult {\n allowed: boolean\n paymentRequired?: PaymentRequiredResponse\n error?: {\n status: number\n message: string\n }\n}\n\n/**\n * Resolve network from options\n */\nfunction resolveNetwork(options: X402Options, projectNetwork: string): string {\n // Explicit network takes priority\n if (options.network) {\n return options.network\n }\n\n // testnet shorthand\n if (options.testnet) {\n return 'mantle-sepolia'\n }\n\n // Fall back to project network\n return projectNetwork\n}\n\n/**\n * Create HTTP 402 Payment Required response\n */\nfunction createPaymentRequiredResponse(\n options: X402Options,\n config: { payTo: string; network: string },\n chainId: number\n): PaymentRequiredResponse {\n const network = resolveNetwork(options, config.network)\n\n return {\n status: 402,\n headers: {\n 'Content-Type': 'application/json',\n 'X-402-Amount': options.price,\n 'X-402-Token': options.token,\n 'X-402-Network': network,\n 'X-402-Chain-Id': chainId.toString(),\n 'X-402-Recipient': config.payTo,\n },\n body: {\n error: 'Payment Required',\n amount: options.price,\n token: options.token,\n network,\n chainId,\n recipient: config.payTo,\n },\n }\n}\n\n/**\n * Process payment middleware\n *\n * Core logic for payment verification:\n * 1. Gets project config\n * 2. Extracts payment receipt from headers\n * 3. Returns 402 if no payment\n * 4. Verifies payment on blockchain if present\n */\nexport async function processPaymentMiddleware(\n options: X402Options,\n headers: Headers | Record<string, string | string[] | undefined>,\n requestPath?: string,\n requestMethod?: string\n): Promise<MiddlewareResult> {\n try {\n // Register custom network if provided\n if (options.customNetwork) {\n const networkId = options.network || 'custom-network'\n registerCustomNetwork(networkId, options.customNetwork)\n }\n\n // Register custom tokens if provided\n if (options.customTokens) {\n const config = getProjectConfig()\n const network = resolveNetwork(options, config.network)\n registerCustomTokens(network, options.customTokens)\n }\n\n const config = getProjectConfig()\n const network = resolveNetwork(options, config.network)\n\n // Import getChainId dynamically to avoid circular dependency\n const { getChainId } = await import('./constants')\n const chainId = getChainId(network)\n\n const receipt = extractPaymentReceipt(headers)\n\n // No payment → return 402 Payment Required\n if (!receipt) {\n return {\n allowed: false,\n paymentRequired: createPaymentRequiredResponse(options, config, chainId),\n }\n }\n\n // Verify payment on blockchain\n const verification = await verifyPayment(\n receipt,\n { ...config, network },\n options.price,\n options.token,\n true,\n options.rpcUrl\n )\n\n if (!verification.valid) {\n return {\n allowed: false,\n error: {\n status: 402,\n message: verification.error || 'Payment verification failed',\n },\n }\n }\n\n // Log payment event for analytics (fire and forget)\n if (verification.transactionHash && options.enableAnalytics !== false) {\n // Dynamically import to avoid circular dependency\n import('./analytics').then(({ logPayment }) => {\n logPayment(\n {\n transactionHash: verification.transactionHash!,\n amount: verification.amount || options.price,\n token: verification.token || options.token,\n network,\n toAddress: config.payTo,\n blockNumber: undefined, // Could be extracted from verification if available\n status: 'SUCCESS',\n },\n options.endpoint || requestPath, // Use provided endpoint or extracted path\n options.method || requestMethod // Use provided method or extracted method\n ).catch(() => {\n // Silently fail - analytics shouldn't break payment flow\n })\n }).catch(() => {\n // Silently fail if analytics module can't be loaded\n })\n }\n\n return { allowed: true }\n } catch (error) {\n return {\n allowed: false,\n error: {\n status: 500,\n message: error instanceof Error ? error.message : 'Internal server error',\n },\n }\n }\n}\n","/**\n * Blockchain Verification\n *\n * Direct on-chain payment verification for Mantle network\n * - Verifies transaction receipts\n * - Validates ERC20 token transfers\n * - Validates native MNT transfers\n */\n\nimport type { ProjectConfig } from './platform'\nimport {\n getRpcUrl,\n getChainId,\n getTokenConfig,\n ERC20_TRANSFER_SIGNATURE,\n AMOUNT_TOLERANCE,\n} from './constants'\n\n/** Blockchain verification result */\nexport interface BlockchainVerification {\n valid: boolean\n transactionHash?: string\n amount?: string\n token?: string\n blockNumber?: number\n error?: string\n}\n\n/** JSON-RPC response structure */\ninterface RPCResponse<T = unknown> {\n jsonrpc: '2.0'\n id: number\n result?: T\n error?: {\n code: number\n message: string\n }\n}\n\n/** Raw transaction receipt from RPC */\ninterface RawTransactionReceipt {\n transactionHash: string\n blockNumber: string\n status: string\n from: string\n to: string | null\n value?: string\n logs: Array<{\n address: string\n topics: string[]\n data: string\n }>\n}\n\n/** Parsed transaction receipt */\ninterface TransactionReceipt {\n transactionHash: string\n blockNumber: number\n status: 'success' | 'failed'\n from: string\n to: string | null\n value: string\n logs: Array<{\n address: string\n topics: string[]\n data: string\n }>\n}\n\n/** Decoded ERC20 Transfer event */\ninterface ERC20Transfer {\n from: string\n to: string\n value: bigint\n tokenAddress: string\n}\n\n/**\n * Call JSON-RPC method\n */\nasync function callRPC<T>(url: string, method: string, params: unknown[]): Promise<T> {\n const response = await fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n jsonrpc: '2.0',\n id: 1,\n method,\n params,\n }),\n })\n\n if (!response.ok) {\n throw new Error(`RPC call failed: ${response.status} ${response.statusText}`)\n }\n\n const data = (await response.json()) as RPCResponse<T>\n\n if (data.error) {\n throw new Error(`RPC error: ${data.error.message}`)\n }\n\n return data.result as T\n}\n\n/**\n * Get and parse transaction receipt\n */\nasync function getTransactionReceipt(\n rpcUrl: string,\n txHash: string\n): Promise<TransactionReceipt | null> {\n const receipt = await callRPC<RawTransactionReceipt | null>(\n rpcUrl,\n 'eth_getTransactionReceipt',\n [txHash]\n )\n\n if (!receipt) {\n return null\n }\n\n return {\n transactionHash: receipt.transactionHash,\n blockNumber: parseInt(receipt.blockNumber, 16),\n status: receipt.status === '0x1' ? 'success' : 'failed',\n from: receipt.from,\n to: receipt.to,\n value: receipt.value || '0x0',\n logs: receipt.logs || [],\n }\n}\n\n/**\n * Decode ERC20 Transfer event from log\n */\nfunction decodeERC20Transfer(log: {\n topics: string[]\n data: string\n address: string\n}): ERC20Transfer | null {\n // Check Transfer event signature\n if (log.topics[0]?.toLowerCase() !== ERC20_TRANSFER_SIGNATURE.toLowerCase()) {\n return null\n }\n\n // Transfer has 3 topics: signature, from, to\n if (log.topics.length !== 3) {\n return null\n }\n\n return {\n from: ('0x' + log.topics[1].slice(-40)).toLowerCase(),\n to: ('0x' + log.topics[2].slice(-40)).toLowerCase(),\n value: BigInt(log.data),\n tokenAddress: log.address.toLowerCase(),\n }\n}\n\n/**\n * Convert Wei to token units\n */\nfunction weiToTokenUnits(wei: bigint, decimals: number = 18): string {\n const divisor = 10n ** BigInt(decimals)\n const whole = wei / divisor\n const remainder = wei % divisor\n\n if (remainder === 0n) {\n return whole.toString()\n }\n\n const remainderStr = remainder.toString().padStart(decimals, '0')\n const trimmed = remainderStr.replace(/0+$/, '')\n return `${whole}.${trimmed}`\n}\n\n/**\n * Parse amount string to Wei\n */\nfunction parseAmountToWei(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 * Verify payment directly on blockchain\n *\n * @param transactionHash - Transaction hash to verify\n * @param config - Project configuration\n * @param requiredAmount - Required payment amount (e.g., \"0.001\")\n * @param requiredToken - Required token symbol (e.g., \"USDC\", \"MNT\")\n * @param customRpcUrl - Custom RPC URL (optional, overrides default)\n */\nexport async function verifyPaymentOnChain(\n transactionHash: string,\n config: ProjectConfig,\n requiredAmount: string,\n requiredToken: string,\n customRpcUrl?: string\n): Promise<BlockchainVerification> {\n try {\n const rpcUrl = getRpcUrl(config.network, customRpcUrl)\n\n // Get transaction receipt\n const receipt = await getTransactionReceipt(rpcUrl, transactionHash)\n\n if (!receipt) {\n return {\n valid: false,\n error: 'Transaction not found or not yet confirmed',\n }\n }\n\n if (receipt.status !== 'success') {\n return {\n valid: false,\n error: 'Transaction failed',\n }\n }\n\n const recipient = config.payTo.toLowerCase()\n\n // Check for native MNT transfer\n if (requiredToken.toUpperCase() === 'MNT') {\n const valueWei = BigInt(receipt.value)\n const requiredWei = parseAmountToWei(requiredAmount, 18)\n\n if (receipt.to?.toLowerCase() !== recipient) {\n return {\n valid: false,\n error: `Recipient mismatch: expected ${config.payTo}, got ${receipt.to}`,\n }\n }\n\n // Check amount with tolerance\n if (valueWei < requiredWei - AMOUNT_TOLERANCE || valueWei > requiredWei + AMOUNT_TOLERANCE) {\n return {\n valid: false,\n error: `Amount mismatch: expected ${requiredAmount} MNT, got ${weiToTokenUnits(valueWei)} MNT`,\n }\n }\n\n return {\n valid: true,\n transactionHash: receipt.transactionHash,\n amount: weiToTokenUnits(valueWei),\n token: 'MNT',\n blockNumber: receipt.blockNumber,\n }\n }\n\n // Check for ERC20 token transfer\n const tokenConfig = getTokenConfig(requiredToken, config.network)\n if (!tokenConfig) {\n return {\n valid: false,\n error: `Unknown token: ${requiredToken}`,\n }\n }\n\n // Find Transfer event in logs\n let transfer: ERC20Transfer | null = null\n\n for (const log of receipt.logs) {\n if (log.address.toLowerCase() !== tokenConfig.address.toLowerCase()) {\n continue\n }\n\n const decoded = decodeERC20Transfer(log)\n if (decoded && decoded.to === recipient) {\n transfer = decoded\n break\n }\n }\n\n if (!transfer) {\n return {\n valid: false,\n error: `No ${requiredToken} transfer found to ${config.payTo}`,\n }\n }\n\n // Verify amount with tolerance (adjusted for token decimals)\n const requiredWei = parseAmountToWei(requiredAmount, tokenConfig.decimals)\n const toleranceAdjusted = AMOUNT_TOLERANCE / 10n ** BigInt(18 - tokenConfig.decimals)\n\n if (\n transfer.value < requiredWei - toleranceAdjusted ||\n transfer.value > requiredWei + toleranceAdjusted\n ) {\n return {\n valid: false,\n error: `Amount mismatch: expected ${requiredAmount} ${requiredToken}, got ${weiToTokenUnits(transfer.value, tokenConfig.decimals)} ${requiredToken}`,\n }\n }\n\n return {\n valid: true,\n transactionHash: receipt.transactionHash,\n amount: weiToTokenUnits(transfer.value, tokenConfig.decimals),\n token: requiredToken,\n blockNumber: receipt.blockNumber,\n }\n } catch (error) {\n return {\n valid: false,\n error: error instanceof Error ? error.message : 'Failed to verify payment on blockchain',\n }\n }\n}\n","/**\n * Payment Verification\n *\n * Handles direct blockchain verification of payments\n */\n\nimport type { ProjectConfig } from './platform'\nimport { verifyPaymentOnChain, type BlockchainVerification } from './blockchain'\n\n/** Payment verification result */\nexport interface PaymentVerification {\n valid: boolean\n transactionHash?: string\n amount?: string\n token?: string\n error?: string\n}\n\n/** Payment receipt from client (in request headers) */\nexport interface PaymentReceipt {\n transactionHash: string\n timestamp?: string\n}\n\n/**\n * Verify payment on blockchain\n *\n * @param receipt - Payment receipt from request headers\n * @param config - Project configuration\n * @param requiredAmount - Required payment amount\n * @param requiredToken - Required payment token\n * @param customRpcUrl - Custom RPC URL for blockchain verification\n */\nexport async function verifyPayment(\n receipt: PaymentReceipt,\n config: ProjectConfig,\n requiredAmount: string,\n requiredToken: string,\n _useBlockchain = true,\n customRpcUrl?: string\n): Promise<PaymentVerification> {\n const result = await verifyPaymentOnChain(\n receipt.transactionHash,\n config,\n requiredAmount,\n requiredToken,\n customRpcUrl\n )\n\n return {\n valid: result.valid,\n transactionHash: result.transactionHash,\n amount: result.amount,\n token: result.token,\n error: result.error,\n }\n}\n\n/**\n * Extract payment receipt from request headers\n */\nexport function extractPaymentReceipt(\n headers: Headers | Record<string, string | string[] | undefined>\n): PaymentReceipt | null {\n const getHeader = (name: string): string | null => {\n if (headers instanceof Headers) {\n return headers.get(name)\n }\n const value = headers[name.toLowerCase()] || headers[name]\n return Array.isArray(value) ? value[0] || null : value || null\n }\n\n const transactionHash =\n getHeader('x-402-transaction-hash') || getHeader('X-402-Transaction-Hash')\n\n if (!transactionHash) {\n return null\n }\n\n return {\n transactionHash,\n timestamp: getHeader('x-402-timestamp') || getHeader('X-402-Timestamp') || undefined,\n }\n}\n","/**\n * Hono Framework Integration\n *\n * Provides x402 middleware for Hono framework\n *\n * @example\n * ```typescript\n * import { x402 } from '@x402-devkit/server'\n *\n * app.use('/api/data', x402({ price: '0.001', token: 'USDC' }))\n * ```\n */\n\nimport { processPaymentMiddleware, type X402Options } from './middleware'\nimport { initializePlatform, getProjectConfig } from './platform'\n\n/** Hono context interface (generic to avoid requiring hono at build time) */\ninterface HonoContext {\n req: {\n header(): Record<string, string>\n url?: string\n path?: string\n method?: string\n }\n json(data: unknown, status?: number, headers?: Record<string, string>): Response\n}\n\n/** Hono next function */\ntype HonoNext = () => Promise<void>\n\n/**\n * x402 Hono Middleware\n *\n * Validates payment before allowing request to proceed.\n * Returns HTTP 402 if payment is missing or invalid.\n *\n * @param options - Payment options (price, token, network)\n * @returns Hono middleware function\n */\nexport function x402(options: X402Options) {\n if (!options.price || !options.token) {\n throw new Error('x402 middleware requires price and token options')\n }\n\n let initPromise: Promise<void> | null = null\n let initialized = false\n\n const ensureInitialized = async () => {\n if (initialized) return\n if (initPromise) {\n await initPromise\n return\n }\n initPromise = initializePlatform().then(() => {\n initialized = true\n initPromise = null\n })\n await initPromise\n }\n\n return async (c: HonoContext, next: HonoNext) => {\n try {\n await ensureInitialized()\n\n // Extract endpoint path from request (for automatic registration)\n const requestPath = c.req.path || (c.req.url ? new URL(c.req.url).pathname : undefined)\n const requestMethod = c.req.method\n\n // Auto-register endpoint on first use (fire and forget)\n if (requestPath && options.enableAnalytics !== false) {\n import('./endpoint-registry').then(({ registerEndpoint }) => {\n const config = getProjectConfig()\n const network = options.network || (options.testnet ? 'mantle-sepolia' : config.network)\n \n registerEndpoint({\n endpoint: requestPath,\n method: requestMethod || options.method,\n price: options.price,\n token: options.token,\n network,\n }).catch(() => {\n // Silently fail - registration shouldn't break payment flow\n })\n }).catch(() => {\n // Silently fail if module can't be loaded\n })\n }\n\n const result = await processPaymentMiddleware(\n options,\n c.req.header(),\n requestPath,\n requestMethod\n )\n\n if (!result.allowed) {\n if (result.paymentRequired) {\n return c.json(result.paymentRequired.body, 402, result.paymentRequired.headers)\n }\n if (result.error) {\n return c.json({ error: result.error.message }, result.error.status)\n }\n }\n\n await next()\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Internal server error'\n return c.json({ error: message }, 500)\n }\n }\n}\n","/**\n * x402 Server SDK\n *\n * Server middleware for x402 paid APIs on Mantle Network\n *\n * @example\n * ```typescript\n * import { x402 } from '@x402-devkit/sdk/server'\n *\n * // Basic usage (mainnet)\n * app.use('/api/data', x402({ price: '0.001', token: 'MNT' }))\n *\n * // Testnet\n * app.use('/api/data', x402({ price: '0.001', token: 'MNT', testnet: true }))\n *\n * // Custom network\n * app.use('/api/data', x402({\n * price: '0.001',\n * token: 'MNT',\n * network: 'my-network',\n * customNetwork: {\n * chainId: 12345,\n * rpcUrl: 'https://my-rpc.example.com'\n * }\n * }))\n * ```\n */\n\n// Main middleware export\nexport { x402 } from './hono'\n\n// Platform configuration\nexport {\n initializePlatform,\n getProjectConfig,\n clearCache,\n type ProjectConfig,\n} from './platform'\n\n// Payment verification\nexport {\n verifyPayment,\n extractPaymentReceipt,\n type PaymentVerification,\n type PaymentReceipt,\n} from './verify'\n\n// Blockchain verification\nexport { verifyPaymentOnChain, type BlockchainVerification } from './blockchain'\n\n// Middleware utilities\nexport {\n processPaymentMiddleware,\n type X402Options,\n type MiddlewareResult,\n type PaymentRequiredResponse,\n} from './middleware'\n\n// Constants and configuration\nexport {\n // Network presets\n NETWORKS,\n TOKENS,\n DEFAULT_PLATFORM_URL,\n\n // Network utilities\n getNetworkConfig,\n getTokenConfig,\n getRpcUrl,\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// Analytics and payment tracking\nexport {\n logPayment,\n type PaymentEvent,\n} from './analytics'\n\n// Endpoint registration\nexport {\n registerEndpoint,\n type EndpointRegistration,\n} from './endpoint-registry'\n"],"mappings":"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","names":["getPlatformBaseUrl","getPlatformBaseUrl","requiredWei","config","network","getChainId","logPayment","registerEndpoint"]}
1
+ {"version":3,"sources":["../../src/server/constants.ts","../../src/server/platform.ts","../../src/server/analytics.ts","../../src/server/endpoint-registry.ts","../../src/server/middleware.ts","../../src/server/blockchain.ts","../../src/server/verify.ts","../../src/server/hono.ts","../../src/server/index.ts"],"sourcesContent":["/**\n * Constants and Configuration\n *\n * Centralized configuration for networks, tokens, and RPC endpoints\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/** ERC20 Transfer event signature */\nexport const ERC20_TRANSFER_SIGNATURE = '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef'\n\n/** Default platform URL (for project config) */\nexport const DEFAULT_PLATFORM_URL = 'https://mantle-x402.vercel.app'\n\n/** Amount tolerance for payment verification (0.001 tokens) */\nexport const AMOUNT_TOLERANCE = BigInt(1e15)\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 RPC URL for network (with environment override)\n */\nexport function getRpcUrl(network: string, customRpcUrl?: string): string {\n // Custom RPC takes priority\n if (customRpcUrl) {\n return customRpcUrl\n }\n\n // Check environment variables\n const envRpc = process.env.X402_RPC_URL || process.env[`X402_RPC_URL_${network.toUpperCase()}`]\n if (envRpc) {\n return envRpc\n }\n\n return getNetworkConfig(network).rpcUrl\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 * Platform Configuration & Validation\n *\n * Validates project configuration via platform API\n */\n\nimport { DEFAULT_PLATFORM_URL } from './constants'\n\n/** Project configuration from platform */\nexport interface ProjectConfig {\n appId: string\n name: string\n payTo: string\n network: string\n status: string\n}\n\n/** Platform API response */\ninterface PlatformResponse {\n appId: string\n name: string\n payTo: string\n network: string\n status: string\n}\n\n/** Cached configuration (singleton) */\nlet cachedConfig: ProjectConfig | null = null\nlet validationPromise: Promise<ProjectConfig> | null = null\n\n/**\n * Get platform API base URL\n */\nfunction getPlatformBaseUrl(): string {\n return (\n process.env.X402_PLATFORM_URL ||\n process.env.NEXT_PUBLIC_X402_PLATFORM_URL ||\n DEFAULT_PLATFORM_URL\n )\n}\n\n/**\n * Validate project with platform API\n */\nasync function validateProject(appId: string): Promise<ProjectConfig> {\n const baseUrl = getPlatformBaseUrl()\n const url = `${baseUrl}/api/v1/validate?appId=${encodeURIComponent(appId)}`\n\n const response = await fetch(url, {\n method: 'GET',\n headers: { 'Content-Type': 'application/json' },\n })\n\n if (!response.ok) {\n if (response.status === 404) {\n throw new Error('Project not found: Invalid X402_APP_ID')\n }\n if (response.status === 401) {\n throw new Error('Unauthorized: Invalid X402_APP_ID')\n }\n throw new Error(`Platform validation failed: ${response.status} ${response.statusText}`)\n }\n\n const data = (await response.json()) as PlatformResponse\n\n if (!data.appId || !data.payTo || !data.network) {\n throw new Error('Invalid platform response: missing required fields')\n }\n\n if (data.status !== 'ACTIVE') {\n throw new Error(`Project is not active: status is ${data.status}`)\n }\n\n return {\n appId: data.appId,\n name: data.name,\n payTo: data.payTo,\n network: data.network,\n status: data.status,\n }\n}\n\n/**\n * Initialize platform configuration\n *\n * Reads X402_APP_ID from environment and validates with platform API.\n * Uses singleton pattern - multiple calls return same promise.\n */\nexport async function initializePlatform(): Promise<ProjectConfig> {\n if (cachedConfig) {\n return cachedConfig\n }\n\n if (validationPromise) {\n return validationPromise\n }\n\n const appId = process.env.X402_APP_ID || process.env.NEXT_PUBLIC_X402_APP_ID\n\n if (!appId || typeof appId !== 'string' || appId.trim().length === 0) {\n throw new Error('X402_APP_ID is required. Set it in your environment variables.')\n }\n\n validationPromise = validateProject(appId.trim())\n\n try {\n cachedConfig = await validationPromise\n return cachedConfig\n } catch (error) {\n validationPromise = null\n throw error\n }\n}\n\n/**\n * Get cached project configuration\n *\n * @throws Error if platform not initialized\n */\nexport function getProjectConfig(): ProjectConfig {\n if (!cachedConfig) {\n throw new Error('Platform not initialized. Call initializePlatform() first.')\n }\n return cachedConfig\n}\n\n/**\n * Clear cached configuration (for testing)\n */\nexport function clearCache(): void {\n cachedConfig = null\n validationPromise = null\n}\n","/**\n * Analytics & Payment Tracking\n *\n * Optional utility to log payment events to the platform for dashboard tracking\n */\n\nimport { getProjectConfig } from './platform'\nimport { DEFAULT_PLATFORM_URL } from './constants'\n\n/** Payment event data */\nexport interface PaymentEvent {\n transactionHash: string\n amount: string\n token: string\n network: string\n endpoint?: string // API endpoint that was paid for\n method?: string // HTTP method (GET, POST, etc.)\n fromAddress?: string // Payer wallet address\n toAddress: string // Recipient wallet address\n blockNumber?: number // Block number of transaction\n status?: 'SUCCESS' | 'FAILED' | 'PENDING'\n}\n\n/**\n * Get platform API base URL\n */\nfunction getPlatformBaseUrl(): string {\n return (\n process.env.X402_PLATFORM_URL ||\n process.env.NEXT_PUBLIC_X402_PLATFORM_URL ||\n DEFAULT_PLATFORM_URL\n )\n}\n\n/**\n * Log a payment event to the platform\n *\n * This is optional - call this after successful payment verification\n * to track endpoint usage in the dashboard.\n *\n * @param event - Payment event data\n * @param requestPath - Optional: Request path (e.g., \"/api/premium-data\")\n * @param requestMethod - Optional: HTTP method (e.g., \"GET\", \"POST\")\n *\n * @example\n * ```typescript\n * import { logPayment } from '@x402-devkit/sdk/server'\n *\n * // After successful payment verification\n * await logPayment({\n * transactionHash: receipt.transactionHash,\n * amount: '0.001',\n * token: 'MNT',\n * network: 'mantle',\n * toAddress: config.payTo,\n * }, '/api/premium-data', 'GET')\n * ```\n */\nexport async function logPayment(\n event: PaymentEvent,\n requestPath?: string,\n requestMethod?: string\n): Promise<void> {\n try {\n const config = getProjectConfig()\n const baseUrl = getPlatformBaseUrl()\n const url = `${baseUrl}/api/payments`\n\n const payload = {\n appId: config.appId,\n transactionHash: event.transactionHash,\n amount: event.amount,\n token: event.token,\n network: event.network || config.network,\n endpoint: event.endpoint || requestPath || null,\n method: event.method || requestMethod || null,\n fromAddress: event.fromAddress || null,\n toAddress: event.toAddress || config.payTo,\n blockNumber: event.blockNumber || null,\n status: event.status || 'SUCCESS',\n }\n\n // Fire and forget - don't block on analytics\n fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n }).catch((error) => {\n // Silently fail - analytics shouldn't break the payment flow\n console.warn('Failed to log payment event:', error)\n })\n } catch (error) {\n // Silently fail - analytics shouldn't break the payment flow\n console.warn('Failed to log payment event:', error)\n }\n}\n\n","/**\n * Endpoint Registry\n *\n * Automatically registers endpoints when x402 middleware is used\n * This allows endpoints to appear in the dashboard even before payments are made\n */\n\nimport { getProjectConfig } from './platform'\nimport { DEFAULT_PLATFORM_URL } from './constants'\n\n/** Endpoint registration data */\nexport interface EndpointRegistration {\n endpoint: string\n method?: string\n price: string\n token: string\n network: string\n}\n\n/**\n * Get platform API base URL\n */\nfunction getPlatformBaseUrl(): string {\n return (\n process.env.X402_PLATFORM_URL ||\n process.env.NEXT_PUBLIC_X402_PLATFORM_URL ||\n DEFAULT_PLATFORM_URL\n )\n}\n\n/** Cache of registered endpoints to avoid duplicate registrations */\nconst registeredEndpoints = new Set<string>()\n\n/**\n * Register an endpoint with the platform\n *\n * This is called automatically when x402 middleware is first invoked for an endpoint.\n * Endpoints appear in the dashboard even before any payments are made.\n *\n * @param registration - Endpoint registration data\n */\nexport async function registerEndpoint(registration: EndpointRegistration): Promise<void> {\n try {\n const config = getProjectConfig()\n const baseUrl = getPlatformBaseUrl()\n\n // Create unique key for this endpoint\n const endpointKey = `${config.appId}:${registration.endpoint}:${registration.method || 'ANY'}`\n\n // Skip if already registered in this session\n if (registeredEndpoints.has(endpointKey)) {\n return\n }\n\n // Mark as registered\n registeredEndpoints.add(endpointKey)\n\n const url = `${baseUrl}/api/endpoints/register`\n\n const payload = {\n appId: config.appId,\n endpoint: registration.endpoint,\n method: registration.method || null,\n price: registration.price,\n token: registration.token,\n network: registration.network || config.network,\n }\n\n // Fire and forget - don't block on registration\n fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n }).catch((error) => {\n // Silently fail - registration shouldn't break the payment flow\n console.warn('Failed to register endpoint:', error)\n // Remove from cache so we can retry next time\n registeredEndpoints.delete(endpointKey)\n })\n } catch (error) {\n // Silently fail - registration shouldn't break the payment flow\n console.warn('Failed to register endpoint:', error)\n }\n}\n\n","/**\n * Core Payment Middleware Logic\n *\n * Framework-agnostic payment verification middleware\n */\n\nimport { getProjectConfig } from './platform'\nimport { extractPaymentReceipt, verifyPayment } from './verify'\nimport {\n type CustomNetworkConfig,\n type CustomTokenConfig,\n registerCustomNetwork,\n registerCustomTokens,\n} from './constants'\n\n/** x402 middleware options */\nexport interface X402Options {\n /** Payment amount (e.g., \"0.001\") */\n price: string\n /** Payment token (e.g., \"USDC\", \"MNT\") */\n token: string\n /** Network identifier (defaults to project network) */\n network?: string\n /** Custom RPC URL (overrides default for the network) */\n rpcUrl?: string\n /** Use testnet (shorthand for network: 'mantle-sepolia') */\n testnet?: boolean\n /** Custom network configuration */\n customNetwork?: CustomNetworkConfig\n /** Custom token configurations for this network */\n customTokens?: CustomTokenConfig\n /** API endpoint path for tracking (e.g., \"/api/premium-data\") */\n endpoint?: string\n /** HTTP method for tracking (e.g., \"GET\", \"POST\") */\n method?: string\n /** Enable analytics tracking (default: true) */\n enableAnalytics?: boolean\n}\n\n/** HTTP 402 Payment Required response */\nexport interface PaymentRequiredResponse {\n status: 402\n headers: Record<string, string>\n body: {\n error: 'Payment Required'\n amount: string\n token: string\n network: string\n chainId: number\n recipient: string\n }\n}\n\n/** Middleware result */\nexport interface MiddlewareResult {\n allowed: boolean\n paymentRequired?: PaymentRequiredResponse\n error?: {\n status: number\n message: string\n }\n}\n\n/**\n * Resolve network from options\n */\nfunction resolveNetwork(options: X402Options, projectNetwork: string): string {\n // Explicit network takes priority\n if (options.network) {\n return options.network\n }\n\n // testnet shorthand\n if (options.testnet) {\n return 'mantle-sepolia'\n }\n\n // Fall back to project network\n return projectNetwork\n}\n\n/**\n * Create HTTP 402 Payment Required response\n */\nfunction createPaymentRequiredResponse(\n options: X402Options,\n config: { payTo: string; network: string },\n chainId: number\n): PaymentRequiredResponse {\n const network = resolveNetwork(options, config.network)\n\n return {\n status: 402,\n headers: {\n 'Content-Type': 'application/json',\n 'X-402-Amount': options.price,\n 'X-402-Token': options.token,\n 'X-402-Network': network,\n 'X-402-Chain-Id': chainId.toString(),\n 'X-402-Recipient': config.payTo,\n },\n body: {\n error: 'Payment Required',\n amount: options.price,\n token: options.token,\n network,\n chainId,\n recipient: config.payTo,\n },\n }\n}\n\n/**\n * Process payment middleware\n *\n * Core logic for payment verification:\n * 1. Gets project config\n * 2. Extracts payment receipt from headers\n * 3. Returns 402 if no payment\n * 4. Verifies payment on blockchain if present\n */\nexport async function processPaymentMiddleware(\n options: X402Options,\n headers: Headers | Record<string, string | string[] | undefined>,\n requestPath?: string,\n requestMethod?: string\n): Promise<MiddlewareResult> {\n try {\n // Register custom network if provided\n if (options.customNetwork) {\n const networkId = options.network || 'custom-network'\n registerCustomNetwork(networkId, options.customNetwork)\n }\n\n // Register custom tokens if provided\n if (options.customTokens) {\n const config = getProjectConfig()\n const network = resolveNetwork(options, config.network)\n registerCustomTokens(network, options.customTokens)\n }\n\n const config = getProjectConfig()\n const network = resolveNetwork(options, config.network)\n\n // Import getChainId dynamically to avoid circular dependency\n const { getChainId } = await import('./constants')\n const chainId = getChainId(network)\n\n const receipt = extractPaymentReceipt(headers)\n\n // No payment → return 402 Payment Required\n if (!receipt) {\n return {\n allowed: false,\n paymentRequired: createPaymentRequiredResponse(options, config, chainId),\n }\n }\n\n // Verify payment on blockchain\n const verification = await verifyPayment(\n receipt,\n { ...config, network },\n options.price,\n options.token,\n true,\n options.rpcUrl\n )\n\n if (!verification.valid) {\n return {\n allowed: false,\n error: {\n status: 402,\n message: verification.error || 'Payment verification failed',\n },\n }\n }\n\n // Log payment event for analytics (fire and forget)\n if (verification.transactionHash && options.enableAnalytics !== false) {\n // Dynamically import to avoid circular dependency\n import('./analytics').then(({ logPayment }) => {\n logPayment(\n {\n transactionHash: verification.transactionHash!,\n amount: verification.amount || options.price,\n token: verification.token || options.token,\n network,\n toAddress: config.payTo,\n blockNumber: undefined, // Could be extracted from verification if available\n status: 'SUCCESS',\n },\n options.endpoint || requestPath, // Use provided endpoint or extracted path\n options.method || requestMethod // Use provided method or extracted method\n ).catch(() => {\n // Silently fail - analytics shouldn't break payment flow\n })\n }).catch(() => {\n // Silently fail if analytics module can't be loaded\n })\n }\n\n return { allowed: true }\n } catch (error) {\n return {\n allowed: false,\n error: {\n status: 500,\n message: error instanceof Error ? error.message : 'Internal server error',\n },\n }\n }\n}\n","/**\n * Blockchain Verification\n *\n * Direct on-chain payment verification for Mantle network\n * - Verifies transaction receipts\n * - Validates ERC20 token transfers\n * - Validates native MNT transfers\n */\n\nimport type { ProjectConfig } from './platform'\nimport {\n getRpcUrl,\n getChainId,\n getTokenConfig,\n ERC20_TRANSFER_SIGNATURE,\n AMOUNT_TOLERANCE,\n} from './constants'\n\n/** Blockchain verification result */\nexport interface BlockchainVerification {\n valid: boolean\n transactionHash?: string\n amount?: string\n token?: string\n blockNumber?: number\n error?: string\n}\n\n/** JSON-RPC response structure */\ninterface RPCResponse<T = unknown> {\n jsonrpc: '2.0'\n id: number\n result?: T\n error?: {\n code: number\n message: string\n }\n}\n\n/** Raw transaction receipt from RPC */\ninterface RawTransactionReceipt {\n transactionHash: string\n blockNumber: string\n status: string\n from: string\n to: string | null\n logs: Array<{\n address: string\n topics: string[]\n data: string\n }>\n}\n\n/** Raw transaction from RPC */\ninterface RawTransaction {\n hash: string\n from: string\n to: string | null\n value: string\n input: string\n blockNumber: string | null\n}\n\n/** Parsed transaction receipt */\ninterface TransactionReceipt {\n transactionHash: string\n blockNumber: number\n status: 'success' | 'failed'\n from: string\n to: string | null\n value: string\n logs: Array<{\n address: string\n topics: string[]\n data: string\n }>\n}\n\n/** Decoded ERC20 Transfer event */\ninterface ERC20Transfer {\n from: string\n to: string\n value: bigint\n tokenAddress: string\n}\n\n/**\n * Call JSON-RPC method\n */\nasync function callRPC<T>(url: string, method: string, params: unknown[]): Promise<T> {\n const response = await fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n jsonrpc: '2.0',\n id: 1,\n method,\n params,\n }),\n })\n\n if (!response.ok) {\n throw new Error(`RPC call failed: ${response.status} ${response.statusText}`)\n }\n\n const data = (await response.json()) as RPCResponse<T>\n\n if (data.error) {\n throw new Error(`RPC error: ${data.error.message}`)\n }\n\n return data.result as T\n}\n\n/**\n * Get transaction by hash\n */\nasync function getTransaction(\n rpcUrl: string,\n txHash: string\n): Promise<RawTransaction | null> {\n return await callRPC<RawTransaction | null>(\n rpcUrl,\n 'eth_getTransactionByHash',\n [txHash]\n )\n}\n\n/**\n * Get and parse transaction receipt with transaction value\n */\nasync function getTransactionReceipt(\n rpcUrl: string,\n txHash: string\n): Promise<TransactionReceipt | null> {\n // Get both receipt and transaction (for value)\n const [receipt, tx] = await Promise.all([\n callRPC<RawTransactionReceipt | null>(rpcUrl, 'eth_getTransactionReceipt', [txHash]),\n callRPC<RawTransaction | null>(rpcUrl, 'eth_getTransactionByHash', [txHash]),\n ])\n\n if (!receipt) {\n return null\n }\n\n return {\n transactionHash: receipt.transactionHash,\n blockNumber: parseInt(receipt.blockNumber, 16),\n status: receipt.status === '0x1' ? 'success' : 'failed',\n from: receipt.from,\n to: tx?.to || receipt.to,\n value: tx?.value || '0x0',\n logs: receipt.logs || [],\n }\n}\n\n/**\n * Decode ERC20 Transfer event from log\n */\nfunction decodeERC20Transfer(log: {\n topics: string[]\n data: string\n address: string\n}): ERC20Transfer | null {\n // Check Transfer event signature\n if (log.topics[0]?.toLowerCase() !== ERC20_TRANSFER_SIGNATURE.toLowerCase()) {\n return null\n }\n\n // Transfer has 3 topics: signature, from, to\n if (log.topics.length !== 3) {\n return null\n }\n\n return {\n from: ('0x' + log.topics[1].slice(-40)).toLowerCase(),\n to: ('0x' + log.topics[2].slice(-40)).toLowerCase(),\n value: BigInt(log.data),\n tokenAddress: log.address.toLowerCase(),\n }\n}\n\n/**\n * Convert Wei to token units\n */\nfunction weiToTokenUnits(wei: bigint, decimals: number = 18): string {\n const divisor = 10n ** BigInt(decimals)\n const whole = wei / divisor\n const remainder = wei % divisor\n\n if (remainder === 0n) {\n return whole.toString()\n }\n\n const remainderStr = remainder.toString().padStart(decimals, '0')\n const trimmed = remainderStr.replace(/0+$/, '')\n return `${whole}.${trimmed}`\n}\n\n/**\n * Parse amount string to Wei\n */\nfunction parseAmountToWei(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 * Verify payment directly on blockchain\n *\n * @param transactionHash - Transaction hash to verify\n * @param config - Project configuration\n * @param requiredAmount - Required payment amount (e.g., \"0.001\")\n * @param requiredToken - Required token symbol (e.g., \"USDC\", \"MNT\")\n * @param customRpcUrl - Custom RPC URL (optional, overrides default)\n */\nexport async function verifyPaymentOnChain(\n transactionHash: string,\n config: ProjectConfig,\n requiredAmount: string,\n requiredToken: string,\n customRpcUrl?: string\n): Promise<BlockchainVerification> {\n try {\n const rpcUrl = getRpcUrl(config.network, customRpcUrl)\n\n // Get transaction receipt\n const receipt = await getTransactionReceipt(rpcUrl, transactionHash)\n\n if (!receipt) {\n return {\n valid: false,\n error: 'Transaction not found or not yet confirmed',\n }\n }\n\n if (receipt.status !== 'success') {\n return {\n valid: false,\n error: 'Transaction failed',\n }\n }\n\n const recipient = config.payTo.toLowerCase()\n\n // Check for native MNT transfer\n if (requiredToken.toUpperCase() === 'MNT') {\n const valueWei = BigInt(receipt.value)\n const requiredWei = parseAmountToWei(requiredAmount, 18)\n\n // SDK sends 99.5% to recipient (0.5% fee to treasury)\n // So we expect 99.5% of the required amount\n const expectedMerchantAmount = (requiredWei * 995n) / 1000n\n\n // Also accept full amount (for clients not using fee split)\n const minAcceptable = expectedMerchantAmount - AMOUNT_TOLERANCE\n const maxAcceptable = requiredWei + AMOUNT_TOLERANCE\n\n if (receipt.to?.toLowerCase() !== recipient) {\n return {\n valid: false,\n error: `Recipient mismatch: expected ${config.payTo}, got ${receipt.to}`,\n }\n }\n\n // Check amount with tolerance (accept 99.5% to 100% of required)\n if (valueWei < minAcceptable || valueWei > maxAcceptable) {\n return {\n valid: false,\n error: `Amount mismatch: expected ~${requiredAmount} MNT (99.5%-100%), got ${weiToTokenUnits(valueWei)} MNT`,\n }\n }\n\n return {\n valid: true,\n transactionHash: receipt.transactionHash,\n amount: weiToTokenUnits(valueWei),\n token: 'MNT',\n blockNumber: receipt.blockNumber,\n }\n }\n\n // Check for ERC20 token transfer\n const tokenConfig = getTokenConfig(requiredToken, config.network)\n if (!tokenConfig) {\n return {\n valid: false,\n error: `Unknown token: ${requiredToken}`,\n }\n }\n\n // Find Transfer event in logs\n let transfer: ERC20Transfer | null = null\n\n for (const log of receipt.logs) {\n if (log.address.toLowerCase() !== tokenConfig.address.toLowerCase()) {\n continue\n }\n\n const decoded = decodeERC20Transfer(log)\n if (decoded && decoded.to === recipient) {\n transfer = decoded\n break\n }\n }\n\n if (!transfer) {\n return {\n valid: false,\n error: `No ${requiredToken} transfer found to ${config.payTo}`,\n }\n }\n\n // Verify amount with tolerance (adjusted for token decimals)\n const requiredWei = parseAmountToWei(requiredAmount, tokenConfig.decimals)\n const toleranceAdjusted = AMOUNT_TOLERANCE / 10n ** BigInt(18 - tokenConfig.decimals)\n\n if (\n transfer.value < requiredWei - toleranceAdjusted ||\n transfer.value > requiredWei + toleranceAdjusted\n ) {\n return {\n valid: false,\n error: `Amount mismatch: expected ${requiredAmount} ${requiredToken}, got ${weiToTokenUnits(transfer.value, tokenConfig.decimals)} ${requiredToken}`,\n }\n }\n\n return {\n valid: true,\n transactionHash: receipt.transactionHash,\n amount: weiToTokenUnits(transfer.value, tokenConfig.decimals),\n token: requiredToken,\n blockNumber: receipt.blockNumber,\n }\n } catch (error) {\n return {\n valid: false,\n error: error instanceof Error ? error.message : 'Failed to verify payment on blockchain',\n }\n }\n}\n","/**\n * Payment Verification\n *\n * Handles direct blockchain verification of payments\n */\n\nimport type { ProjectConfig } from './platform'\nimport { verifyPaymentOnChain, type BlockchainVerification } from './blockchain'\n\n/** Payment verification result */\nexport interface PaymentVerification {\n valid: boolean\n transactionHash?: string\n amount?: string\n token?: string\n error?: string\n}\n\n/** Payment receipt from client (in request headers) */\nexport interface PaymentReceipt {\n transactionHash: string\n timestamp?: string\n}\n\n/**\n * Verify payment on blockchain\n *\n * @param receipt - Payment receipt from request headers\n * @param config - Project configuration\n * @param requiredAmount - Required payment amount\n * @param requiredToken - Required payment token\n * @param customRpcUrl - Custom RPC URL for blockchain verification\n */\nexport async function verifyPayment(\n receipt: PaymentReceipt,\n config: ProjectConfig,\n requiredAmount: string,\n requiredToken: string,\n _useBlockchain = true,\n customRpcUrl?: string\n): Promise<PaymentVerification> {\n const result = await verifyPaymentOnChain(\n receipt.transactionHash,\n config,\n requiredAmount,\n requiredToken,\n customRpcUrl\n )\n\n return {\n valid: result.valid,\n transactionHash: result.transactionHash,\n amount: result.amount,\n token: result.token,\n error: result.error,\n }\n}\n\n/**\n * Extract payment receipt from request headers\n */\nexport function extractPaymentReceipt(\n headers: Headers | Record<string, string | string[] | undefined>\n): PaymentReceipt | null {\n const getHeader = (name: string): string | null => {\n if (headers instanceof Headers) {\n return headers.get(name)\n }\n const value = headers[name.toLowerCase()] || headers[name]\n return Array.isArray(value) ? value[0] || null : value || null\n }\n\n const transactionHash =\n getHeader('x-402-transaction-hash') || getHeader('X-402-Transaction-Hash')\n\n if (!transactionHash) {\n return null\n }\n\n return {\n transactionHash,\n timestamp: getHeader('x-402-timestamp') || getHeader('X-402-Timestamp') || undefined,\n }\n}\n","/**\n * Hono Framework Integration\n *\n * Provides x402 middleware for Hono framework\n *\n * @example\n * ```typescript\n * import { x402 } from '@x402-devkit/server'\n *\n * app.use('/api/data', x402({ price: '0.001', token: 'USDC' }))\n * ```\n */\n\nimport { processPaymentMiddleware, type X402Options } from './middleware'\nimport { initializePlatform, getProjectConfig } from './platform'\n\n/** Hono context interface (generic to avoid requiring hono at build time) */\ninterface HonoContext {\n req: {\n header(): Record<string, string>\n url?: string\n path?: string\n method?: string\n }\n json(data: unknown, status?: number, headers?: Record<string, string>): Response\n}\n\n/** Hono next function */\ntype HonoNext = () => Promise<void>\n\n/**\n * x402 Hono Middleware\n *\n * Validates payment before allowing request to proceed.\n * Returns HTTP 402 if payment is missing or invalid.\n *\n * @param options - Payment options (price, token, network)\n * @returns Hono middleware function\n */\nexport function x402(options: X402Options) {\n if (!options.price || !options.token) {\n throw new Error('x402 middleware requires price and token options')\n }\n\n let initPromise: Promise<void> | null = null\n let initialized = false\n\n const ensureInitialized = async () => {\n if (initialized) return\n if (initPromise) {\n await initPromise\n return\n }\n initPromise = initializePlatform().then(() => {\n initialized = true\n initPromise = null\n })\n await initPromise\n }\n\n return async (c: HonoContext, next: HonoNext) => {\n try {\n await ensureInitialized()\n\n // Extract endpoint path from request (for automatic registration)\n const requestPath = c.req.path || (c.req.url ? new URL(c.req.url).pathname : undefined)\n const requestMethod = c.req.method\n\n // Auto-register endpoint on first use (fire and forget)\n if (requestPath && options.enableAnalytics !== false) {\n import('./endpoint-registry').then(({ registerEndpoint }) => {\n const config = getProjectConfig()\n const network = options.network || (options.testnet ? 'mantle-sepolia' : config.network)\n \n registerEndpoint({\n endpoint: requestPath,\n method: requestMethod || options.method,\n price: options.price,\n token: options.token,\n network,\n }).catch(() => {\n // Silently fail - registration shouldn't break payment flow\n })\n }).catch(() => {\n // Silently fail if module can't be loaded\n })\n }\n\n const result = await processPaymentMiddleware(\n options,\n c.req.header(),\n requestPath,\n requestMethod\n )\n\n if (!result.allowed) {\n if (result.paymentRequired) {\n return c.json(result.paymentRequired.body, 402, result.paymentRequired.headers)\n }\n if (result.error) {\n return c.json({ error: result.error.message }, result.error.status)\n }\n }\n\n await next()\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Internal server error'\n return c.json({ error: message }, 500)\n }\n }\n}\n","/**\n * x402 Server SDK\n *\n * Server middleware for x402 paid APIs on Mantle Network\n *\n * @example\n * ```typescript\n * import { x402 } from '@x402-devkit/sdk/server'\n *\n * // Basic usage (mainnet)\n * app.use('/api/data', x402({ price: '0.001', token: 'MNT' }))\n *\n * // Testnet\n * app.use('/api/data', x402({ price: '0.001', token: 'MNT', testnet: true }))\n *\n * // Custom network\n * app.use('/api/data', x402({\n * price: '0.001',\n * token: 'MNT',\n * network: 'my-network',\n * customNetwork: {\n * chainId: 12345,\n * rpcUrl: 'https://my-rpc.example.com'\n * }\n * }))\n * ```\n */\n\n// Main middleware export\nexport { x402 } from './hono'\n\n// Platform configuration\nexport {\n initializePlatform,\n getProjectConfig,\n clearCache,\n type ProjectConfig,\n} from './platform'\n\n// Payment verification\nexport {\n verifyPayment,\n extractPaymentReceipt,\n type PaymentVerification,\n type PaymentReceipt,\n} from './verify'\n\n// Blockchain verification\nexport { verifyPaymentOnChain, type BlockchainVerification } from './blockchain'\n\n// Middleware utilities\nexport {\n processPaymentMiddleware,\n type X402Options,\n type MiddlewareResult,\n type PaymentRequiredResponse,\n} from './middleware'\n\n// Constants and configuration\nexport {\n // Network presets\n NETWORKS,\n TOKENS,\n DEFAULT_PLATFORM_URL,\n\n // Network utilities\n getNetworkConfig,\n getTokenConfig,\n getRpcUrl,\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// Analytics and payment tracking\nexport {\n logPayment,\n type PaymentEvent,\n} from './analytics'\n\n// Endpoint registration\nexport {\n registerEndpoint,\n type EndpointRegistration,\n} from './endpoint-registry'\n"],"mappings":"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","names":["getPlatformBaseUrl","getPlatformBaseUrl","requiredWei","config","network","getChainId","logPayment","registerEndpoint"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "x402-mantle-sdk",
3
- "version": "0.2.1",
3
+ "version": "0.2.2",
4
4
  "description": "Complete SDK for monetizing APIs with HTTP 402 payments on Mantle Network. Protect API routes, handle payments automatically, and track revenue.",
5
5
  "type": "module",
6
6
  "exports": {