x402-mantle-sdk 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +130 -0
- package/dist/client/index.cjs +844 -0
- package/dist/client/index.cjs.map +1 -0
- package/dist/client/index.d.cts +322 -0
- package/dist/client/index.d.ts +322 -0
- package/dist/client/index.js +793 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/react.cjs +658 -0
- package/dist/client/react.cjs.map +1 -0
- package/dist/client/react.d.cts +42 -0
- package/dist/client/react.d.ts +42 -0
- package/dist/client/react.js +631 -0
- package/dist/client/react.js.map +1 -0
- package/dist/server/index.cjs +657 -0
- package/dist/server/index.cjs.map +1 -0
- package/dist/server/index.d.cts +292 -0
- package/dist/server/index.d.ts +292 -0
- package/dist/server/index.js +617 -0
- package/dist/server/index.js.map +1 -0
- package/package.json +103 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/client/react.ts","../../src/client/modal-react.tsx","../../src/client/constants.ts","../../src/client/wallet.ts","../../src/client/payment.ts"],"sourcesContent":["/**\n * React components for x402 client\n *\n * @example\n * ```tsx\n * import { PaymentModal } from '@x402-devkit/sdk/client/react'\n *\n * <PaymentModal\n * request={paymentRequest}\n * isOpen={isOpen}\n * onComplete={handleComplete}\n * onCancel={handleCancel}\n * />\n * ```\n */\n\nexport { PaymentModal } from './modal-react'\n\n// Re-export types that React components need\nexport type { PaymentRequest, PaymentResponse } from './types'\n","/**\n * React Payment Modal Component\n */\n\nimport React, { useState, useEffect, useCallback } from 'react'\nimport type { PaymentRequest, PaymentResponse } from './types'\nimport { connectWallet, detectWalletProvider } from './wallet'\nimport { processPayment } from './payment'\n\ninterface PaymentModalProps {\n request: PaymentRequest\n onComplete: (payment: PaymentResponse) => void\n onCancel: () => void\n isOpen: boolean\n}\n\ntype Step = 'connect' | 'confirm' | 'processing'\n\n/**\n * Format address for display\n */\nfunction formatAddress(address: string): string {\n return `${address.slice(0, 6)}...${address.slice(-4)}`\n}\n\n/**\n * Payment Modal Component\n *\n * @example\n * ```tsx\n * <PaymentModal\n * request={paymentRequest}\n * isOpen={isOpen}\n * onComplete={(payment) => console.log('Paid:', payment.transactionHash)}\n * onCancel={() => setIsOpen(false)}\n * />\n * ```\n */\nexport function PaymentModal({ request, onComplete, onCancel, isOpen }: PaymentModalProps) {\n const [walletAddress, setWalletAddress] = useState<string | null>(null)\n const [isConnecting, setIsConnecting] = useState(false)\n const [isProcessing, setIsProcessing] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const [step, setStep] = useState<Step>('connect')\n\n const checkWalletConnection = useCallback(async () => {\n const wallet = detectWalletProvider()\n if (wallet) {\n try {\n const account = await wallet.getAccount()\n if (account) {\n setWalletAddress(account)\n setStep('confirm')\n }\n } catch {\n // Not connected\n }\n }\n }, [])\n\n useEffect(() => {\n if (isOpen) {\n checkWalletConnection()\n } else {\n // Reset state when modal closes\n setStep('connect')\n setError(null)\n setWalletAddress(null)\n }\n }, [isOpen, checkWalletConnection])\n\n const handleConnect = async () => {\n setIsConnecting(true)\n setError(null)\n\n try {\n const wallet = detectWalletProvider()\n if (!wallet) {\n throw new Error('No wallet found. Please install MetaMask.')\n }\n\n const address = await connectWallet(wallet)\n setWalletAddress(address)\n setStep('confirm')\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to connect wallet')\n } finally {\n setIsConnecting(false)\n }\n }\n\n const handlePay = async () => {\n setIsProcessing(true)\n setError(null)\n setStep('processing')\n\n try {\n const wallet = detectWalletProvider()\n if (!wallet) {\n throw new Error('Wallet not connected')\n }\n\n const payment = await processPayment(request, wallet)\n onComplete(payment)\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Payment failed')\n setStep('confirm')\n } finally {\n setIsProcessing(false)\n }\n }\n\n if (!isOpen) return null\n\n return (\n <div\n style={{\n position: 'fixed',\n inset: 0,\n zIndex: 9999,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n background: 'rgba(0, 0, 0, 0.5)',\n backdropFilter: 'blur(4px)',\n }}\n onClick={(e) => e.target === e.currentTarget && onCancel()}\n >\n <div\n style={{\n width: '100%',\n maxWidth: '28rem',\n borderRadius: '0.75rem',\n border: '1px solid rgba(255, 255, 255, 0.1)',\n background: 'rgba(24, 24, 27, 0.95)',\n padding: '1.5rem',\n boxShadow: '0 20px 25px -5px rgba(0, 0, 0, 0.3)',\n backdropFilter: 'blur(16px)',\n color: '#fafafa',\n }}\n >\n {/* Header */}\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginBottom: '1.5rem',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}>\n <div\n style={{\n width: '2rem',\n height: '2rem',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: '0.5rem',\n background: 'rgba(255, 255, 255, 0.1)',\n fontFamily: 'monospace',\n fontSize: '0.75rem',\n fontWeight: 'bold',\n }}\n >\n x402\n </div>\n <h2 style={{ margin: 0, fontSize: '1.25rem', fontWeight: 300 }}>Payment Required</h2>\n </div>\n <button\n onClick={onCancel}\n style={{\n background: 'none',\n border: 'none',\n fontSize: '1.5rem',\n cursor: 'pointer',\n color: 'rgba(250, 250, 250, 0.6)',\n lineHeight: 1,\n }}\n >\n ×\n </button>\n </div>\n\n {/* Payment Details */}\n <div\n style={{\n marginBottom: '1.5rem',\n padding: '1rem',\n borderRadius: '0.5rem',\n border: '1px solid rgba(255, 255, 255, 0.1)',\n background: 'rgba(255, 255, 255, 0.02)',\n }}\n >\n <div\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n marginBottom: '0.75rem',\n }}\n >\n <span\n style={{ fontFamily: 'monospace', fontSize: '0.75rem', color: 'rgba(250,250,250,0.6)' }}\n >\n Amount\n </span>\n <span style={{ fontSize: '1.125rem', fontWeight: 500 }}>\n {request.amount} {request.token}\n </span>\n </div>\n <div\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n marginBottom: '0.75rem',\n }}\n >\n <span\n style={{ fontFamily: 'monospace', fontSize: '0.75rem', color: 'rgba(250,250,250,0.6)' }}\n >\n Network\n </span>\n <span style={{ fontSize: '0.875rem' }}>{request.network}</span>\n </div>\n <div style={{ display: 'flex', justifyContent: 'space-between' }}>\n <span\n style={{ fontFamily: 'monospace', fontSize: '0.75rem', color: 'rgba(250,250,250,0.6)' }}\n >\n Recipient\n </span>\n <span style={{ fontFamily: 'monospace', fontSize: '0.875rem' }}>\n {formatAddress(request.recipient)}\n </span>\n </div>\n </div>\n\n {/* Error Message */}\n {error && (\n <div\n style={{\n marginBottom: '1rem',\n padding: '0.75rem',\n borderRadius: '0.5rem',\n border: '1px solid rgba(239, 68, 68, 0.5)',\n background: 'rgba(239, 68, 68, 0.1)',\n fontFamily: 'monospace',\n fontSize: '0.75rem',\n color: 'rgba(239, 68, 68, 0.9)',\n }}\n >\n {error}\n </div>\n )}\n\n {/* Connect Step */}\n {step === 'connect' && (\n <button\n onClick={handleConnect}\n disabled={isConnecting}\n style={{\n width: '100%',\n padding: '0.75rem 1rem',\n borderRadius: '0.5rem',\n border: '1px solid rgba(255, 255, 255, 0.1)',\n background: 'rgba(255, 255, 255, 0.05)',\n fontSize: '0.875rem',\n fontWeight: 500,\n cursor: isConnecting ? 'not-allowed' : 'pointer',\n opacity: isConnecting ? 0.7 : 1,\n color: '#fafafa',\n }}\n >\n {isConnecting ? 'Connecting...' : 'Connect Wallet'}\n </button>\n )}\n\n {/* Confirm Step */}\n {step === 'confirm' && walletAddress && (\n <>\n <div\n style={{\n marginBottom: '1rem',\n padding: '0.75rem',\n borderRadius: '0.5rem',\n border: '1px solid rgba(255, 255, 255, 0.1)',\n background: 'rgba(255, 255, 255, 0.02)',\n }}\n >\n <p\n style={{\n margin: '0 0 0.25rem 0',\n fontFamily: 'monospace',\n fontSize: '0.75rem',\n color: 'rgba(250, 250, 250, 0.6)',\n }}\n >\n Connected Wallet\n </p>\n <p style={{ margin: 0, fontFamily: 'monospace', fontSize: '0.875rem' }}>\n {formatAddress(walletAddress)}\n </p>\n </div>\n <div style={{ display: 'flex', gap: '0.75rem' }}>\n <button\n onClick={onCancel}\n style={{\n flex: 1,\n padding: '0.75rem 1rem',\n borderRadius: '0.5rem',\n border: '1px solid rgba(255, 255, 255, 0.1)',\n background: 'rgba(255, 255, 255, 0.02)',\n fontSize: '0.875rem',\n cursor: 'pointer',\n color: 'rgba(250, 250, 250, 0.8)',\n }}\n >\n Cancel\n </button>\n <button\n onClick={handlePay}\n disabled={isProcessing}\n style={{\n flex: 1,\n padding: '0.75rem 1rem',\n borderRadius: '0.5rem',\n border: '1px solid rgba(255, 255, 255, 0.1)',\n background: 'rgba(255, 255, 255, 0.1)',\n fontSize: '0.875rem',\n fontWeight: 500,\n cursor: isProcessing ? 'not-allowed' : 'pointer',\n opacity: isProcessing ? 0.7 : 1,\n color: '#fafafa',\n }}\n >\n Pay {request.amount} {request.token}\n </button>\n </div>\n </>\n )}\n\n {/* Processing Step */}\n {step === 'processing' && (\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '2rem 0',\n }}\n >\n <div\n style={{\n width: '2rem',\n height: '2rem',\n marginBottom: '1rem',\n border: '2px solid rgba(255, 255, 255, 0.2)',\n borderTopColor: '#fafafa',\n borderRadius: '50%',\n animation: 'x402-spin 1s linear infinite',\n }}\n />\n <p style={{ margin: 0, fontSize: '0.875rem', color: 'rgba(250, 250, 250, 0.6)' }}>\n Processing payment...\n </p>\n <p\n style={{\n margin: '0.5rem 0 0 0',\n fontFamily: 'monospace',\n fontSize: '0.75rem',\n color: 'rgba(250, 250, 250, 0.4)',\n }}\n >\n Please confirm the transaction in your wallet\n </p>\n <style>{`\n @keyframes x402-spin {\n to { transform: rotate(360deg); }\n }\n `}</style>\n </div>\n )}\n </div>\n </div>\n )\n}\n","/**\n * Constants and Configuration\n *\n * Centralized configuration for networks and tokens\n * Supports both preset networks (mainnet/testnet) and custom configurations\n */\n\n/** Supported network identifiers */\nexport type NetworkId = 'mantle' | 'mantle-sepolia' | 'mantle-testnet'\n\n/** Network environment */\nexport type NetworkEnvironment = 'mainnet' | 'testnet'\n\n/** Network configuration */\nexport interface NetworkConfig {\n chainId: number\n rpcUrl: string\n name: string\n environment: NetworkEnvironment\n nativeCurrency: {\n name: string\n symbol: string\n decimals: number\n }\n blockExplorer: string\n}\n\n/** Token configuration */\nexport interface TokenConfig {\n address: string\n decimals: number\n symbol: string\n}\n\n/** Custom network configuration (user-provided) */\nexport interface CustomNetworkConfig {\n chainId: number\n rpcUrl: string\n name?: string\n environment?: NetworkEnvironment\n blockExplorer?: string\n}\n\n/** Custom token configuration (user-provided) */\nexport interface CustomTokenConfig {\n [symbol: string]: {\n address: string\n decimals: number\n }\n}\n\n/** Network configurations */\nexport const NETWORKS: Record<NetworkId, NetworkConfig> = {\n mantle: {\n chainId: 5000,\n rpcUrl: 'https://rpc.mantle.xyz',\n name: 'Mantle',\n environment: 'mainnet',\n nativeCurrency: { name: 'Mantle', symbol: 'MNT', decimals: 18 },\n blockExplorer: 'https://explorer.mantle.xyz',\n },\n 'mantle-sepolia': {\n chainId: 5003,\n rpcUrl: 'https://rpc.sepolia.mantle.xyz',\n name: 'Mantle Sepolia',\n environment: 'testnet',\n nativeCurrency: { name: 'Mantle', symbol: 'MNT', decimals: 18 },\n blockExplorer: 'https://explorer.sepolia.mantle.xyz',\n },\n 'mantle-testnet': {\n chainId: 5003,\n rpcUrl: 'https://rpc.sepolia.mantle.xyz',\n name: 'Mantle Testnet',\n environment: 'testnet',\n nativeCurrency: { name: 'Mantle', symbol: 'MNT', decimals: 18 },\n blockExplorer: 'https://explorer.sepolia.mantle.xyz',\n },\n} as const\n\n/** Token addresses by network */\nexport const TOKENS: Record<NetworkId, Record<string, TokenConfig>> = {\n mantle: {\n USDC: {\n address: '0x09Bc4E0D864854c6aFB6eB9A9cdF58aC190D0dF9',\n decimals: 6,\n symbol: 'USDC',\n },\n USDT: {\n address: '0x201EBa5CC46D216Ce6DC03F6a759e8E766e956aE',\n decimals: 6,\n symbol: 'USDT',\n },\n mETH: {\n address: '0xcDA86A272531e8640cD7F1a92c01839911B90bb0',\n decimals: 18,\n symbol: 'mETH',\n },\n WMNT: {\n address: '0x78c1b0C915c4FAA5FffA6CAbf0219DA63d7f4cb8',\n decimals: 18,\n symbol: 'WMNT',\n },\n },\n 'mantle-sepolia': {\n USDC: {\n address: '0x09Bc4E0D864854c6aFB6eB9A9cdF58aC190D0dF9',\n decimals: 6,\n symbol: 'USDC',\n },\n mETH: {\n address: '0xdEAddEaDdeadDEadDEADDEAddEADDEAddead1111',\n decimals: 18,\n symbol: 'mETH',\n },\n WMNT: {\n address: '0x78c1b0C915c4FAA5FffA6CAbf0219DA63d7f4cb8',\n decimals: 18,\n symbol: 'WMNT',\n },\n },\n 'mantle-testnet': {\n USDC: {\n address: '0x09Bc4E0D864854c6aFB6eB9A9cdF58aC190D0dF9',\n decimals: 6,\n symbol: 'USDC',\n },\n mETH: {\n address: '0xdEAddEaDdeadDEadDEADDEAddEADDEAddead1111',\n decimals: 18,\n symbol: 'mETH',\n },\n WMNT: {\n address: '0x78c1b0C915c4FAA5FffA6CAbf0219DA63d7f4cb8',\n decimals: 18,\n symbol: 'WMNT',\n },\n },\n} as const\n\n/** Treasury contract address (collects 0.5% platform fee) */\nexport const TREASURY_ADDRESS = '0xB27705342ACE73736AE490540Ea031cc06C3eF49'\n\n/** Platform fee in basis points (50 = 0.5%) */\nexport const PLATFORM_FEE_BPS = 50n\nexport const BPS_DENOMINATOR = 10000n\n\n/** Treasury admin address */\nexport const TREASURY_ADMIN = '0xDacCF30F8BB2aEb8D76E68E03033629809ed08E1'\n\n/** Custom network registry (populated at runtime) */\nconst customNetworks: Map<string, NetworkConfig> = new Map()\n\n/** Custom token registry (populated at runtime) */\nconst customTokens: Map<string, Map<string, TokenConfig>> = new Map()\n\n/**\n * Register a custom network configuration\n *\n * @example\n * ```typescript\n * registerCustomNetwork('my-network', {\n * chainId: 12345,\n * rpcUrl: 'https://my-rpc.example.com',\n * name: 'My Custom Network',\n * environment: 'testnet'\n * })\n * ```\n */\nexport function registerCustomNetwork(networkId: string, config: CustomNetworkConfig): void {\n customNetworks.set(networkId.toLowerCase(), {\n chainId: config.chainId,\n rpcUrl: config.rpcUrl,\n name: config.name || networkId,\n environment: config.environment || 'testnet',\n nativeCurrency: { name: 'Native', symbol: 'ETH', decimals: 18 },\n blockExplorer: config.blockExplorer || '',\n })\n}\n\n/**\n * Register custom tokens for a network\n *\n * @example\n * ```typescript\n * registerCustomTokens('mantle', {\n * 'MYTOKEN': { address: '0x...', decimals: 18 }\n * })\n * ```\n */\nexport function registerCustomTokens(networkId: string, tokens: CustomTokenConfig): void {\n const networkKey = networkId.toLowerCase()\n if (!customTokens.has(networkKey)) {\n customTokens.set(networkKey, new Map())\n }\n const tokenMap = customTokens.get(networkKey)!\n for (const [symbol, config] of Object.entries(tokens)) {\n tokenMap.set(symbol.toUpperCase(), {\n address: config.address,\n decimals: config.decimals,\n symbol: symbol.toUpperCase(),\n })\n }\n}\n\n/**\n * Check if network is testnet\n */\nexport function isTestnet(network: string): boolean {\n const config = getNetworkConfig(network)\n return config.environment === 'testnet'\n}\n\n/**\n * Check if network is mainnet\n */\nexport function isMainnet(network: string): boolean {\n const config = getNetworkConfig(network)\n return config.environment === 'mainnet'\n}\n\n/**\n * Get network configuration (supports preset and custom networks)\n */\nexport function getNetworkConfig(network: string): NetworkConfig {\n const networkKey = network.toLowerCase()\n\n // Check custom networks first\n const custom = customNetworks.get(networkKey)\n if (custom) {\n return custom\n }\n\n // Check preset networks\n const preset = NETWORKS[networkKey as NetworkId]\n if (preset) {\n return preset\n }\n\n // Default to mainnet\n return NETWORKS.mantle\n}\n\n/**\n * Get token configuration (supports preset and custom tokens)\n */\nexport function getTokenConfig(token: string, network: string): TokenConfig | null {\n const networkKey = network.toLowerCase()\n const tokenKey = token.toUpperCase()\n\n // Native MNT doesn't have a token config\n if (tokenKey === 'MNT') {\n return null\n }\n\n // Check custom tokens first\n const customMap = customTokens.get(networkKey)\n if (customMap?.has(tokenKey)) {\n return customMap.get(tokenKey)!\n }\n\n // Check preset tokens\n return TOKENS[networkKey as NetworkId]?.[tokenKey] || null\n}\n\n/**\n * Get chain ID for network\n */\nexport function getChainId(network: string): number {\n return getNetworkConfig(network).chainId\n}\n\n/**\n * Get all available networks (preset + custom)\n */\nexport function getAvailableNetworks(): string[] {\n const preset = Object.keys(NETWORKS)\n const custom = Array.from(customNetworks.keys())\n return [...new Set([...preset, ...custom])]\n}\n\n/**\n * Get networks by environment\n */\nexport function getNetworksByEnvironment(env: NetworkEnvironment): string[] {\n return getAvailableNetworks().filter((network) => {\n const config = getNetworkConfig(network)\n return config.environment === env\n })\n}\n","/**\n * Wallet Connection & Management\n *\n * Handles web3 wallet connections (MetaMask, WalletConnect, etc.)\n * Supports network switching and custom network addition\n */\n\nimport type {\n TransactionRequest,\n WalletProvider,\n EIP1193Provider,\n WindowWithEthereum,\n AddEthereumChainParameter,\n} from './types'\nimport { getNetworkConfig, getChainId as getChainIdForNetwork } from './constants'\n\n/**\n * Get ethereum provider from window\n */\nfunction getEthereumProvider(): EIP1193Provider | null {\n if (typeof window === 'undefined') {\n return null\n }\n return (window as WindowWithEthereum).ethereum || null\n}\n\n/**\n * MetaMask/EIP-1193 wallet provider\n */\nexport class MetaMaskProvider implements WalletProvider {\n private ethereum: EIP1193Provider | null\n\n constructor() {\n this.ethereum = getEthereumProvider()\n }\n\n isAvailable(): boolean {\n return this.ethereum !== null && this.ethereum.isMetaMask === true\n }\n\n async connect(): Promise<string> {\n if (!this.ethereum) {\n throw new Error('MetaMask is not available')\n }\n\n const accounts = (await this.ethereum.request({\n method: 'eth_requestAccounts',\n })) as string[]\n\n if (!accounts || accounts.length === 0) {\n throw new Error('No accounts found')\n }\n\n return accounts[0]\n }\n\n async getAccount(): Promise<string | null> {\n if (!this.ethereum) {\n return null\n }\n\n try {\n const accounts = (await this.ethereum.request({\n method: 'eth_accounts',\n })) as string[]\n\n return accounts && accounts.length > 0 ? accounts[0] : null\n } catch {\n return null\n }\n }\n\n async getChainId(): Promise<number | null> {\n if (!this.ethereum) {\n return null\n }\n\n try {\n const chainIdHex = (await this.ethereum.request({\n method: 'eth_chainId',\n })) as string\n\n return parseInt(chainIdHex, 16)\n } catch {\n return null\n }\n }\n\n async switchNetwork(chainId: number): Promise<void> {\n if (!this.ethereum) {\n throw new Error('MetaMask is not available')\n }\n\n const chainIdHex = `0x${chainId.toString(16)}`\n\n try {\n await this.ethereum.request({\n method: 'wallet_switchEthereumChain',\n params: [{ chainId: chainIdHex }],\n })\n } catch (error) {\n const switchError = error as { code?: number }\n if (switchError.code === 4902) {\n // Chain not added, throw specific error\n throw new Error(`Network with chainId ${chainId} not found. Use addNetwork() first.`)\n }\n throw error\n }\n }\n\n async addNetwork(params: AddEthereumChainParameter): Promise<void> {\n if (!this.ethereum) {\n throw new Error('MetaMask is not available')\n }\n\n await this.ethereum.request({\n method: 'wallet_addEthereumChain',\n params: [params],\n })\n }\n\n async sendTransaction(tx: TransactionRequest): Promise<string> {\n if (!this.ethereum) {\n throw new Error('MetaMask is not available')\n }\n\n const txHash = (await this.ethereum.request({\n method: 'eth_sendTransaction',\n params: [tx],\n })) as string\n\n return txHash\n }\n\n async signMessage(message: string): Promise<string> {\n if (!this.ethereum) {\n throw new Error('MetaMask is not available')\n }\n\n const account = await this.getAccount()\n if (!account) {\n throw new Error('No account connected')\n }\n\n const signature = (await this.ethereum.request({\n method: 'personal_sign',\n params: [message, account],\n })) as string\n\n return signature\n }\n}\n\n/**\n * Auto-detect wallet provider\n */\nexport function detectWalletProvider(): WalletProvider | null {\n const metaMask = new MetaMaskProvider()\n if (metaMask.isAvailable()) {\n return metaMask\n }\n\n // Add more providers here (WalletConnect, Coinbase Wallet, etc.)\n return null\n}\n\n/**\n * Connect wallet (auto-detect or use provided)\n */\nexport async function connectWallet(provider?: WalletProvider): Promise<string> {\n const wallet = provider || detectWalletProvider()\n\n if (!wallet) {\n throw new Error(\n 'No wallet provider found. Please install MetaMask or another compatible wallet.'\n )\n }\n\n return wallet.connect()\n}\n\n/**\n * Ensure wallet is on the correct network\n *\n * @param wallet - Wallet provider\n * @param network - Network identifier (e.g., 'mantle', 'mantle-sepolia')\n * @param autoAdd - Auto-add network if not found (default: true)\n */\nexport async function ensureNetwork(\n wallet: WalletProvider,\n network: string,\n autoAdd = true\n): Promise<void> {\n const config = getNetworkConfig(network)\n const targetChainId = config.chainId\n const currentChainId = await wallet.getChainId()\n\n if (currentChainId === targetChainId) {\n return // Already on correct network\n }\n\n try {\n await wallet.switchNetwork(targetChainId)\n } catch (error) {\n const switchError = error as { message?: string }\n\n // If network not found and autoAdd is enabled, add it\n if (autoAdd && switchError.message?.includes('not found')) {\n await wallet.addNetwork({\n chainId: `0x${targetChainId.toString(16)}`,\n chainName: config.name,\n nativeCurrency: config.nativeCurrency,\n rpcUrls: [config.rpcUrl],\n blockExplorerUrls: config.blockExplorer ? [config.blockExplorer] : undefined,\n })\n } else {\n throw error\n }\n }\n}\n\n/**\n * Get network config for adding to wallet\n */\nexport function getAddNetworkParams(network: string): AddEthereumChainParameter {\n const config = getNetworkConfig(network)\n return {\n chainId: `0x${config.chainId.toString(16)}`,\n chainName: config.name,\n nativeCurrency: config.nativeCurrency,\n rpcUrls: [config.rpcUrl],\n blockExplorerUrls: config.blockExplorer ? [config.blockExplorer] : undefined,\n }\n}\n","/**\n * Payment Processing\n *\n * Handles direct blockchain payments with automatic fee splitting\n * Automatically splits 0.5% platform fee to Treasury\n */\n\nimport type { PaymentRequest, PaymentResponse, WalletProvider, TransactionRequest } from './types'\nimport {\n getTokenConfig,\n TREASURY_ADDRESS,\n PLATFORM_FEE_BPS,\n BPS_DENOMINATOR,\n} from './constants'\n\n/** ERC20 transfer function signature */\nconst ERC20_TRANSFER_SIG = '0xa9059cbb'\n\n/**\n * Convert amount to Wei\n */\nfunction amountToWei(amount: string, decimals: number = 18): bigint {\n const parts = amount.split('.')\n const whole = parts[0] || '0'\n const fraction = (parts[1] || '').padEnd(decimals, '0').slice(0, decimals)\n\n return BigInt(whole) * 10n ** BigInt(decimals) + BigInt(fraction)\n}\n\n/**\n * Calculate fee split\n */\nfunction calculateSplit(amount: bigint): { merchantAmount: bigint; feeAmount: bigint } {\n const feeAmount = (amount * PLATFORM_FEE_BPS) / BPS_DENOMINATOR\n const merchantAmount = amount - feeAmount\n return { merchantAmount, feeAmount }\n}\n\n/**\n * Encode ERC20 transfer call data\n */\nfunction encodeERC20Transfer(to: string, amount: bigint): string {\n const toHex = to.slice(2).toLowerCase().padStart(64, '0')\n const amountHex = amount.toString(16).padStart(64, '0')\n return ERC20_TRANSFER_SIG + toHex + amountHex\n}\n\n/**\n * Process payment for an x402 request\n *\n * Automatically splits payment:\n * - 99.5% to merchant\n * - 0.5% to Treasury\n *\n * @param request - Payment request from HTTP 402 response\n * @param wallet - Wallet provider to use for transaction\n * @returns Payment response with transaction hash\n */\nexport async function processPayment(\n request: PaymentRequest,\n wallet: WalletProvider\n): Promise<PaymentResponse> {\n // Get token configuration\n const tokenConfig = getTokenConfig(request.token, request.network)\n const decimals = tokenConfig?.decimals ?? 18\n\n // Calculate amounts\n const totalAmount = amountToWei(request.amount, decimals)\n const { merchantAmount, feeAmount } = calculateSplit(totalAmount)\n\n let txHash: string\n\n if (tokenConfig) {\n // ERC20 token transfer - send full amount to merchant\n // (Treasury fee handled separately for ERC20)\n const transferData = encodeERC20Transfer(request.recipient, totalAmount)\n\n const tx: TransactionRequest = {\n to: tokenConfig.address,\n data: transferData,\n }\n\n txHash = await wallet.sendTransaction(tx)\n } else {\n // Native MNT transfer - split between merchant and treasury\n\n // 1. Send to merchant (99.5%)\n const merchantTx: TransactionRequest = {\n to: request.recipient,\n value: `0x${merchantAmount.toString(16)}`,\n }\n txHash = await wallet.sendTransaction(merchantTx)\n\n // 2. Send fee to Treasury (0.5%)\n if (feeAmount > 0n) {\n const feeTx: TransactionRequest = {\n to: TREASURY_ADDRESS,\n value: `0x${feeAmount.toString(16)}`,\n }\n await wallet.sendTransaction(feeTx)\n }\n }\n\n return {\n transactionHash: txHash,\n timestamp: new Date().toISOString(),\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Type definitions for x402 client SDK
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
/** Payment request from HTTP 402 response */
|
|
8
|
+
interface PaymentRequest {
|
|
9
|
+
amount: string;
|
|
10
|
+
token: string;
|
|
11
|
+
network: string;
|
|
12
|
+
chainId?: number;
|
|
13
|
+
recipient: string;
|
|
14
|
+
}
|
|
15
|
+
/** Payment response after successful payment */
|
|
16
|
+
interface PaymentResponse {
|
|
17
|
+
transactionHash: string;
|
|
18
|
+
timestamp?: string;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
interface PaymentModalProps {
|
|
22
|
+
request: PaymentRequest;
|
|
23
|
+
onComplete: (payment: PaymentResponse) => void;
|
|
24
|
+
onCancel: () => void;
|
|
25
|
+
isOpen: boolean;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Payment Modal Component
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* ```tsx
|
|
32
|
+
* <PaymentModal
|
|
33
|
+
* request={paymentRequest}
|
|
34
|
+
* isOpen={isOpen}
|
|
35
|
+
* onComplete={(payment) => console.log('Paid:', payment.transactionHash)}
|
|
36
|
+
* onCancel={() => setIsOpen(false)}
|
|
37
|
+
* />
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
declare function PaymentModal({ request, onComplete, onCancel, isOpen }: PaymentModalProps): react_jsx_runtime.JSX.Element | null;
|
|
41
|
+
|
|
42
|
+
export { PaymentModal, type PaymentRequest, type PaymentResponse };
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Type definitions for x402 client SDK
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
/** Payment request from HTTP 402 response */
|
|
8
|
+
interface PaymentRequest {
|
|
9
|
+
amount: string;
|
|
10
|
+
token: string;
|
|
11
|
+
network: string;
|
|
12
|
+
chainId?: number;
|
|
13
|
+
recipient: string;
|
|
14
|
+
}
|
|
15
|
+
/** Payment response after successful payment */
|
|
16
|
+
interface PaymentResponse {
|
|
17
|
+
transactionHash: string;
|
|
18
|
+
timestamp?: string;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
interface PaymentModalProps {
|
|
22
|
+
request: PaymentRequest;
|
|
23
|
+
onComplete: (payment: PaymentResponse) => void;
|
|
24
|
+
onCancel: () => void;
|
|
25
|
+
isOpen: boolean;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Payment Modal Component
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* ```tsx
|
|
32
|
+
* <PaymentModal
|
|
33
|
+
* request={paymentRequest}
|
|
34
|
+
* isOpen={isOpen}
|
|
35
|
+
* onComplete={(payment) => console.log('Paid:', payment.transactionHash)}
|
|
36
|
+
* onCancel={() => setIsOpen(false)}
|
|
37
|
+
* />
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
declare function PaymentModal({ request, onComplete, onCancel, isOpen }: PaymentModalProps): react_jsx_runtime.JSX.Element | null;
|
|
41
|
+
|
|
42
|
+
export { PaymentModal, type PaymentRequest, type PaymentResponse };
|