@t402/cli 2.3.0 → 2.4.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.
@@ -831,7 +831,7 @@ function registerConfigCommands(program) {
831
831
  setConfig("facilitatorUrl", value);
832
832
  printSuccess(`Facilitator URL set to ${value}`);
833
833
  break;
834
- case "testnet":
834
+ case "testnet": {
835
835
  const isTestnet = value.toLowerCase() === "true" || value === "1";
836
836
  setConfig("testnet", isTestnet);
837
837
  printSuccess(`Testnet mode ${isTestnet ? "enabled" : "disabled"}`);
@@ -843,6 +843,7 @@ function registerConfigCommands(program) {
843
843
  console.log(import_chalk5.default.gray(" Default network changed to Base"));
844
844
  }
845
845
  break;
846
+ }
846
847
  default:
847
848
  printError(
848
849
  `Unknown key: ${key}. Valid keys: defaultNetwork, facilitatorUrl, testnet`
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/index.ts","../../src/cli.ts","../../src/commands/wallet.ts","../../src/config/index.ts","../../src/types.ts","../../src/utils/index.ts","../../src/commands/pay.ts","../../src/commands/request.ts","../../src/version.ts","../../src/commands/config.ts","../../src/commands/info.ts"],"sourcesContent":["// CLI exports\nexport { createCli, runCli } from \"./cli.js\";\n\n// Config exports\nexport {\n getConfig,\n setConfig,\n getAllConfig,\n resetConfig,\n getConfigPath,\n hasSeedConfigured,\n setRpcEndpoint,\n getRpcEndpoint,\n} from \"./config/index.js\";\n\n// Utility exports\nexport {\n createSpinner,\n formatAddress,\n formatAmount,\n parseAmount,\n formatBalanceResult,\n formatPaymentResult,\n getNetworkInfo,\n getNetworkName,\n getAvailableNetworks,\n printSuccess,\n printError,\n printWarning,\n printInfo,\n printHeader,\n printTable,\n isValidSeedPhrase,\n isValidUrl,\n} from \"./utils/index.js\";\n\n// Type exports\nexport type {\n CliConfig,\n WalletInfo,\n BalanceResult,\n PaymentResult,\n NetworkInfo,\n} from \"./types.js\";\n\nexport { DEFAULT_CONFIG, NETWORKS } from \"./types.js\";\n","import { Command } from \"commander\";\nimport { registerWalletCommands } from \"./commands/wallet.js\";\nimport { registerPayCommands } from \"./commands/pay.js\";\nimport { registerRequestCommand } from \"./commands/request.js\";\nimport { registerConfigCommands } from \"./commands/config.js\";\nimport { registerInfoCommand } from \"./commands/info.js\";\nimport { VERSION } from \"./version.js\";\n\n/**\n * Create and configure the CLI program\n */\nexport function createCli(): Command {\n const program = new Command();\n\n program\n .name(\"t402\")\n .description(\"Command-line interface for the T402 payment protocol\")\n .version(VERSION);\n\n // Register command groups\n registerWalletCommands(program);\n registerPayCommands(program);\n registerRequestCommand(program);\n registerConfigCommands(program);\n registerInfoCommand(program);\n\n return program;\n}\n\n/**\n * Run the CLI\n */\nexport async function runCli(args: string[] = process.argv): Promise<void> {\n const program = createCli();\n await program.parseAsync(args);\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport {\n hasSeedConfigured,\n storeSeed,\n getEncryptedSeed,\n clearSeed,\n getConfig,\n} from \"../config/index.js\";\nimport {\n createSpinner,\n formatAmount,\n printSuccess,\n printError,\n printWarning,\n printHeader,\n printTable,\n isValidSeedPhrase,\n encryptSeed,\n decryptSeed,\n getNetworkName,\n} from \"../utils/index.js\";\n\n// Machine ID for basic encryption key\nconst MACHINE_KEY = `t402-cli-${process.env.USER || \"default\"}`;\n\n/**\n * Register wallet-related commands\n */\nexport function registerWalletCommands(program: Command): void {\n const wallet = program.command(\"wallet\").description(\"Wallet management commands\");\n\n // wallet create\n wallet\n .command(\"create\")\n .description(\"Create a new wallet with a generated seed phrase\")\n .action(async () => {\n if (hasSeedConfigured()) {\n printWarning(\"A wallet is already configured. Use 'wallet clear' first to remove it.\");\n return;\n }\n\n try {\n // Use viem for seed phrase generation\n const { generateMnemonic, english } = await import(\"viem/accounts\");\n\n const spinner = createSpinner(\"Generating seed phrase...\").start();\n const mnemonic = generateMnemonic(english);\n spinner.succeed(\"Seed phrase generated\");\n\n console.log();\n console.log(chalk.yellow(\"⚠ IMPORTANT: Write down these words and store them safely!\"));\n console.log(chalk.yellow(\" This is the ONLY way to recover your wallet.\"));\n console.log();\n console.log(chalk.bold(\"Seed phrase:\"));\n console.log();\n console.log(` ${chalk.cyan(mnemonic)}`);\n console.log();\n\n // Store encrypted seed\n const encrypted = encryptSeed(mnemonic, MACHINE_KEY);\n storeSeed(encrypted);\n\n printSuccess(\"Wallet created and saved to config\");\n console.log();\n console.log(\"Run 'wallet show' to see your addresses.\");\n } catch (error) {\n printError(`Failed to create wallet: ${error instanceof Error ? error.message : error}`);\n }\n });\n\n // wallet import\n wallet\n .command(\"import\")\n .description(\"Import an existing wallet from a seed phrase\")\n .argument(\"<seed-phrase>\", \"12 or 24 word seed phrase (in quotes)\")\n .action(async (seedPhrase: string) => {\n if (hasSeedConfigured()) {\n printWarning(\"A wallet is already configured. Use 'wallet clear' first to remove it.\");\n return;\n }\n\n const phrase = seedPhrase.trim();\n if (!isValidSeedPhrase(phrase)) {\n printError(\"Invalid seed phrase. Must be 12 or 24 words.\");\n return;\n }\n\n try {\n // Validate by trying to create an account\n const { mnemonicToAccount } = await import(\"viem/accounts\");\n mnemonicToAccount(phrase); // Throws if invalid\n\n // Store encrypted seed\n const encrypted = encryptSeed(phrase, MACHINE_KEY);\n storeSeed(encrypted);\n\n printSuccess(\"Wallet imported successfully\");\n console.log();\n console.log(\"Run 'wallet show' to see your addresses.\");\n } catch (error) {\n printError(`Failed to import wallet: ${error instanceof Error ? error.message : error}`);\n }\n });\n\n // wallet show\n wallet\n .command(\"show\")\n .description(\"Show wallet addresses\")\n .action(async () => {\n const encrypted = getEncryptedSeed();\n if (!encrypted) {\n printError(\"No wallet configured. Run 'wallet create' or 'wallet import' first.\");\n return;\n }\n\n try {\n const seedPhrase = decryptSeed(encrypted, MACHINE_KEY);\n const { mnemonicToAccount } = await import(\"viem/accounts\");\n\n const spinner = createSpinner(\"Loading wallet...\").start();\n const account = mnemonicToAccount(seedPhrase);\n spinner.succeed(\"Wallet loaded\");\n\n printHeader(\"Wallet Addresses\");\n\n const addresses: Record<string, string> = {\n \"EVM (Ethereum, Arbitrum, Base, etc.)\": account.address,\n };\n\n printTable(addresses);\n\n console.log();\n console.log(chalk.gray(\"Note: Install @t402/wdk for full multi-chain support\"));\n } catch (error) {\n printError(`Failed to load wallet: ${error instanceof Error ? error.message : error}`);\n }\n });\n\n // wallet balance\n wallet\n .command(\"balance\")\n .description(\"Check wallet balances\")\n .option(\"-n, --network <network>\", \"Specific network to check (e.g., eip155:8453)\")\n .option(\"-a, --all\", \"Show all networks including zero balances\")\n .action(async (options: { network?: string; all?: boolean }) => {\n const encrypted = getEncryptedSeed();\n if (!encrypted) {\n printError(\"No wallet configured. Run 'wallet create' or 'wallet import' first.\");\n return;\n }\n\n try {\n const seedPhrase = decryptSeed(encrypted, MACHINE_KEY);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const wdkModule: any = await import(\"@t402/wdk\");\n const { T402WDK } = wdkModule;\n\n const spinner = createSpinner(\"Fetching balances...\").start();\n const testnet = getConfig(\"testnet\");\n\n // Create WDK with appropriate chains\n const chainConfig = testnet\n ? {\n \"arbitrum-sepolia\": \"https://sepolia-rollup.arbitrum.io/rpc\",\n \"base-sepolia\": \"https://sepolia.base.org\",\n }\n : {\n arbitrum: \"https://arb1.arbitrum.io/rpc\",\n base: \"https://mainnet.base.org\",\n };\n\n const wdk = new T402WDK(seedPhrase, chainConfig);\n\n if (options.network) {\n // Single network balance\n const chainName = options.network.replace(\"eip155:\", \"\").replace(\"8453\", \"base\").replace(\"42161\", \"arbitrum\");\n spinner.text = `Fetching balance for ${getNetworkName(options.network)}...`;\n const balance = await wdk.getUsdt0Balance(chainName);\n spinner.succeed(\"Balance fetched\");\n\n printHeader(`Balance on ${getNetworkName(options.network)}`);\n console.log(` ${chalk.green(formatAmount(balance.toString()))} USDT0`);\n } else {\n // All balances\n const balances = await wdk.getAggregatedBalances();\n spinner.succeed(\"Balances fetched\");\n\n printHeader(\"Wallet Balances\");\n console.log(` Total USDT0: ${chalk.green(formatAmount(balances.totalUsdt0.toString()))}`);\n\n if (balances.chains.length > 0) {\n console.log();\n for (const chain of balances.chains) {\n const usdt0 = chain.tokens.find((t: { symbol: string }) => t.symbol === \"USDT0\");\n if (usdt0 && (options.all || usdt0.balance > 0n)) {\n const color = usdt0.balance > 0n ? chalk.green : chalk.gray;\n console.log(` ${chain.chain.padEnd(20)} ${color(formatAmount(usdt0.balance.toString()))} USDT0`);\n }\n }\n }\n }\n } catch (error) {\n printError(`Failed to fetch balances: ${error instanceof Error ? error.message : error}`);\n }\n });\n\n // wallet clear\n wallet\n .command(\"clear\")\n .description(\"Remove wallet from this device\")\n .option(\"-f, --force\", \"Skip confirmation\")\n .action(async (options: { force?: boolean }) => {\n if (!hasSeedConfigured()) {\n printWarning(\"No wallet configured.\");\n return;\n }\n\n if (!options.force) {\n console.log(chalk.yellow(\"⚠ WARNING: This will remove your wallet from this device.\"));\n console.log(chalk.yellow(\" Make sure you have your seed phrase backed up!\"));\n console.log();\n console.log(\"Run with --force to confirm.\");\n return;\n }\n\n clearSeed();\n printSuccess(\"Wallet removed from this device\");\n });\n\n // wallet export\n wallet\n .command(\"export\")\n .description(\"Export seed phrase (use with caution!)\")\n .option(\"-f, --force\", \"Skip warning\")\n .action(async (options: { force?: boolean }) => {\n const encrypted = getEncryptedSeed();\n if (!encrypted) {\n printError(\"No wallet configured.\");\n return;\n }\n\n if (!options.force) {\n console.log(chalk.red(\"⚠ DANGER: This will display your seed phrase on screen!\"));\n console.log(chalk.red(\" Anyone who sees this can steal your funds.\"));\n console.log();\n console.log(\"Run with --force to proceed.\");\n return;\n }\n\n const seedPhrase = decryptSeed(encrypted, MACHINE_KEY);\n console.log();\n console.log(chalk.bold(\"Seed phrase:\"));\n console.log();\n console.log(` ${chalk.cyan(seedPhrase)}`);\n console.log();\n });\n}\n","import Conf from \"conf\";\nimport type { CliConfig } from \"../types.js\";\nimport { DEFAULT_CONFIG } from \"../types.js\";\n\n/**\n * Configuration store for t402 CLI\n */\nconst config = new Conf<CliConfig>({\n projectName: \"t402\",\n defaults: DEFAULT_CONFIG,\n});\n\n/**\n * Get a configuration value\n */\nexport function getConfig<K extends keyof CliConfig>(key: K): CliConfig[K] {\n return config.get(key);\n}\n\n/**\n * Set a configuration value\n */\nexport function setConfig<K extends keyof CliConfig>(key: K, value: CliConfig[K]): void {\n config.set(key, value);\n}\n\n/**\n * Get all configuration values\n */\nexport function getAllConfig(): CliConfig {\n return config.store;\n}\n\n/**\n * Reset configuration to defaults\n */\nexport function resetConfig(): void {\n config.clear();\n}\n\n/**\n * Get the path to the configuration file\n */\nexport function getConfigPath(): string {\n return config.path;\n}\n\n/**\n * Check if a seed phrase is configured\n */\nexport function hasSeedConfigured(): boolean {\n return !!config.get(\"encryptedSeed\");\n}\n\n/**\n * Store encrypted seed phrase\n */\nexport function storeSeed(encryptedSeed: string): void {\n config.set(\"encryptedSeed\", encryptedSeed);\n}\n\n/**\n * Get encrypted seed phrase\n */\nexport function getEncryptedSeed(): string | undefined {\n return config.get(\"encryptedSeed\");\n}\n\n/**\n * Clear stored seed phrase\n */\nexport function clearSeed(): void {\n config.delete(\"encryptedSeed\");\n}\n\n/**\n * Set custom RPC endpoint for a network\n */\nexport function setRpcEndpoint(network: string, url: string): void {\n const endpoints = config.get(\"rpcEndpoints\");\n config.set(\"rpcEndpoints\", { ...endpoints, [network]: url });\n}\n\n/**\n * Get RPC endpoint for a network\n */\nexport function getRpcEndpoint(network: string): string | undefined {\n return config.get(\"rpcEndpoints\")[network];\n}\n\nexport { config };\n","/**\n * CLI configuration stored in user config file\n */\nexport interface CliConfig {\n /** Default network to use */\n defaultNetwork: string;\n /** Facilitator URL */\n facilitatorUrl: string;\n /** Whether to use testnet networks */\n testnet: boolean;\n /** Encrypted seed phrase (optional) */\n encryptedSeed?: string;\n /** Custom RPC endpoints by network */\n rpcEndpoints: Record<string, string>;\n}\n\n/**\n * Wallet information\n */\nexport interface WalletInfo {\n /** Wallet addresses by network type */\n addresses: {\n evm?: string;\n solana?: string;\n ton?: string;\n tron?: string;\n };\n /** Whether the wallet has a seed configured */\n hasSeed: boolean;\n}\n\n/**\n * Balance result for a specific network\n */\nexport interface BalanceResult {\n network: string;\n asset: string;\n balance: string;\n formatted: string;\n address: string;\n}\n\n/**\n * Payment result\n */\nexport interface PaymentResult {\n success: boolean;\n txHash?: string;\n network?: string;\n amount?: string;\n error?: string;\n}\n\n/**\n * Supported network information\n */\nexport interface NetworkInfo {\n id: string;\n name: string;\n type: \"evm\" | \"solana\" | \"ton\" | \"tron\";\n testnet: boolean;\n assets: string[];\n}\n\n/**\n * Default configuration values\n */\nexport const DEFAULT_CONFIG: CliConfig = {\n defaultNetwork: \"eip155:8453\",\n facilitatorUrl: \"https://facilitator.t402.io\",\n testnet: false,\n rpcEndpoints: {},\n};\n\n/**\n * Supported networks\n */\nexport const NETWORKS: NetworkInfo[] = [\n // EVM Mainnets\n { id: \"eip155:1\", name: \"Ethereum\", type: \"evm\", testnet: false, assets: [\"usdt\", \"usdt0\"] },\n { id: \"eip155:42161\", name: \"Arbitrum\", type: \"evm\", testnet: false, assets: [\"usdt0\"] },\n { id: \"eip155:8453\", name: \"Base\", type: \"evm\", testnet: false, assets: [\"usdt0\"] },\n { id: \"eip155:10\", name: \"Optimism\", type: \"evm\", testnet: false, assets: [\"usdt0\"] },\n { id: \"eip155:57073\", name: \"Ink\", type: \"evm\", testnet: false, assets: [\"usdt0\"] },\n { id: \"eip155:80094\", name: \"Berachain\", type: \"evm\", testnet: false, assets: [\"usdt0\"] },\n // EVM Testnets\n { id: \"eip155:11155111\", name: \"Sepolia\", type: \"evm\", testnet: true, assets: [\"usdt0\"] },\n { id: \"eip155:421614\", name: \"Arbitrum Sepolia\", type: \"evm\", testnet: true, assets: [\"usdt0\"] },\n { id: \"eip155:84532\", name: \"Base Sepolia\", type: \"evm\", testnet: true, assets: [\"usdt0\"] },\n // Solana\n {\n id: \"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp\",\n name: \"Solana\",\n type: \"solana\",\n testnet: false,\n assets: [\"usdt\"],\n },\n {\n id: \"solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1\",\n name: \"Solana Devnet\",\n type: \"solana\",\n testnet: true,\n assets: [\"usdt\"],\n },\n // TON\n { id: \"ton:-239\", name: \"TON\", type: \"ton\", testnet: false, assets: [\"usdt\"] },\n { id: \"ton:-3\", name: \"TON Testnet\", type: \"ton\", testnet: true, assets: [\"usdt\"] },\n // TRON\n { id: \"tron:mainnet\", name: \"TRON\", type: \"tron\", testnet: false, assets: [\"usdt\"] },\n { id: \"tron:nile\", name: \"TRON Nile\", type: \"tron\", testnet: true, assets: [\"usdt\"] },\n];\n","import chalk from \"chalk\";\nimport ora, { type Ora } from \"ora\";\nimport type { BalanceResult, NetworkInfo, PaymentResult } from \"../types.js\";\nimport { NETWORKS } from \"../types.js\";\n\n/**\n * Create a spinner with consistent styling\n */\nexport function createSpinner(text: string): Ora {\n return ora({\n text,\n color: \"cyan\",\n });\n}\n\n/**\n * Format an address for display (truncated)\n */\nexport function formatAddress(address: string, startChars = 6, endChars = 4): string {\n if (address.length <= startChars + endChars + 3) {\n return address;\n }\n return `${address.slice(0, startChars)}...${address.slice(-endChars)}`;\n}\n\n/**\n * Format a token amount with decimals\n */\nexport function formatAmount(amount: string, decimals = 6): string {\n const value = BigInt(amount);\n const divisor = BigInt(10 ** decimals);\n const whole = value / divisor;\n const fraction = value % divisor;\n\n if (fraction === 0n) {\n return whole.toString();\n }\n\n const fractionStr = fraction.toString().padStart(decimals, \"0\").replace(/0+$/, \"\");\n return `${whole}.${fractionStr}`;\n}\n\n/**\n * Format balance result for display\n */\nexport function formatBalanceResult(result: BalanceResult): string {\n const network = getNetworkInfo(result.network);\n const networkName = network?.name || result.network;\n const assetName = result.asset.toUpperCase();\n\n return `${chalk.bold(networkName)}: ${chalk.green(result.formatted)} ${assetName}`;\n}\n\n/**\n * Format payment result for display\n */\nexport function formatPaymentResult(result: PaymentResult): string {\n if (result.success) {\n const lines = [chalk.green(\"✓ Payment successful!\")];\n if (result.txHash) {\n lines.push(` Transaction: ${chalk.cyan(result.txHash)}`);\n }\n if (result.network) {\n const network = getNetworkInfo(result.network);\n lines.push(` Network: ${network?.name || result.network}`);\n }\n if (result.amount) {\n lines.push(` Amount: ${result.amount}`);\n }\n return lines.join(\"\\n\");\n } else {\n return chalk.red(`✗ Payment failed: ${result.error || \"Unknown error\"}`);\n }\n}\n\n/**\n * Get network info by ID\n */\nexport function getNetworkInfo(networkId: string): NetworkInfo | undefined {\n return NETWORKS.find((n) => n.id === networkId);\n}\n\n/**\n * Get network display name\n */\nexport function getNetworkName(networkId: string): string {\n const network = getNetworkInfo(networkId);\n return network?.name || networkId;\n}\n\n/**\n * Filter networks by testnet mode\n */\nexport function getAvailableNetworks(testnet: boolean): NetworkInfo[] {\n return NETWORKS.filter((n) => n.testnet === testnet);\n}\n\n/**\n * Print a table of key-value pairs\n */\nexport function printTable(data: Record<string, string>): void {\n const maxKeyLength = Math.max(...Object.keys(data).map((k) => k.length));\n\n for (const [key, value] of Object.entries(data)) {\n const paddedKey = key.padEnd(maxKeyLength);\n console.log(` ${chalk.gray(paddedKey)} ${value}`);\n }\n}\n\n/**\n * Print a success message\n */\nexport function printSuccess(message: string): void {\n console.log(chalk.green(`✓ ${message}`));\n}\n\n/**\n * Print an error message\n */\nexport function printError(message: string): void {\n console.error(chalk.red(`✗ ${message}`));\n}\n\n/**\n * Print a warning message\n */\nexport function printWarning(message: string): void {\n console.log(chalk.yellow(`⚠ ${message}`));\n}\n\n/**\n * Print an info message\n */\nexport function printInfo(message: string): void {\n console.log(chalk.cyan(`ℹ ${message}`));\n}\n\n/**\n * Print a header\n */\nexport function printHeader(title: string): void {\n console.log();\n console.log(chalk.bold.underline(title));\n console.log();\n}\n\n/**\n * Validate a seed phrase (basic check)\n */\nexport function isValidSeedPhrase(phrase: string): boolean {\n const words = phrase.trim().split(/\\s+/);\n return words.length === 12 || words.length === 24;\n}\n\n/**\n * Simple XOR encryption for seed storage\n * Note: This is basic obfuscation, not secure encryption.\n * For production, use proper encryption with a password.\n */\nexport function encryptSeed(seed: string, key: string): string {\n const seedBytes = Buffer.from(seed, \"utf8\");\n const keyBytes = Buffer.from(key, \"utf8\");\n const encrypted = Buffer.alloc(seedBytes.length);\n\n for (let i = 0; i < seedBytes.length; i++) {\n encrypted[i] = seedBytes[i] ^ keyBytes[i % keyBytes.length];\n }\n\n return encrypted.toString(\"base64\");\n}\n\n/**\n * Decrypt seed phrase\n */\nexport function decryptSeed(encrypted: string, key: string): string {\n const encryptedBytes = Buffer.from(encrypted, \"base64\");\n const keyBytes = Buffer.from(key, \"utf8\");\n const decrypted = Buffer.alloc(encryptedBytes.length);\n\n for (let i = 0; i < encryptedBytes.length; i++) {\n decrypted[i] = encryptedBytes[i] ^ keyBytes[i % keyBytes.length];\n }\n\n return decrypted.toString(\"utf8\");\n}\n\n/**\n * Parse amount string to smallest units\n */\nexport function parseAmount(amount: string, decimals = 6): string {\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) * BigInt(10 ** decimals) + BigInt(fraction)).toString();\n}\n\n/**\n * Validate URL format\n */\nexport function isValidUrl(url: string): boolean {\n try {\n new URL(url);\n return true;\n } catch {\n return false;\n }\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { getEncryptedSeed, getConfig } from \"../config/index.js\";\nimport {\n createSpinner,\n formatAddress,\n formatAmount,\n parseAmount,\n printSuccess,\n printError,\n printHeader,\n printTable,\n decryptSeed,\n getNetworkName,\n isValidUrl,\n} from \"../utils/index.js\";\n\n// Machine ID for basic encryption key\nconst MACHINE_KEY = `t402-cli-${process.env.USER || \"default\"}`;\n\n/**\n * Register payment-related commands\n */\nexport function registerPayCommands(program: Command): void {\n // pay command\n program\n .command(\"pay\")\n .description(\"Send a payment to an address\")\n .argument(\"<to>\", \"Recipient address\")\n .argument(\"<amount>\", \"Amount to send (e.g., 1.5)\")\n .option(\"-n, --network <network>\", \"Network to use (e.g., eip155:8453)\")\n .option(\"-a, --asset <asset>\", \"Asset to send (default: usdt0)\", \"usdt0\")\n .option(\"-g, --gasless\", \"Use gasless transaction (ERC-4337)\")\n .action(\n async (\n to: string,\n amount: string,\n options: { network?: string; asset: string; gasless?: boolean },\n ) => {\n const encrypted = getEncryptedSeed();\n if (!encrypted) {\n printError(\"No wallet configured. Run 'wallet create' or 'wallet import' first.\");\n return;\n }\n\n const network = options.network || getConfig(\"defaultNetwork\");\n const testnet = getConfig(\"testnet\");\n\n // Validate network matches testnet setting\n const isTestnetNetwork =\n network.includes(\"sepolia\") ||\n network.includes(\"testnet\") ||\n network.includes(\"devnet\") ||\n network.includes(\"nile\") ||\n network === \"ton:-3\";\n if (testnet !== isTestnetNetwork) {\n printError(\n `Network ${network} doesn't match testnet mode (${testnet ? \"testnet\" : \"mainnet\"}).`,\n );\n printError(`Run 'config set testnet ${isTestnetNetwork}' to switch modes.`);\n return;\n }\n\n try {\n const seedPhrase = decryptSeed(encrypted, MACHINE_KEY);\n\n printHeader(\"Payment Details\");\n printTable({\n To: formatAddress(to),\n Amount: `${amount} ${options.asset.toUpperCase()}`,\n Network: getNetworkName(network),\n Mode: options.gasless ? \"Gasless (ERC-4337)\" : \"Standard\",\n });\n console.log();\n\n const spinner = createSpinner(\"Preparing transaction...\").start();\n\n if (options.gasless) {\n // Gasless payment using ERC-4337\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const wdkGasless: any = await import(\"@t402/wdk-gasless\");\n const { WdkGaslessClient } = wdkGasless;\n\n spinner.text = \"Initializing gasless client...\";\n const client = await WdkGaslessClient.create({\n seedPhrase,\n chain: network.replace(\"eip155:\", \"\"),\n });\n\n spinner.text = \"Sending gasless payment...\";\n const result = await client.pay({\n to,\n amount: parseAmount(amount),\n });\n\n spinner.succeed(\"Payment sent!\");\n console.log();\n printSuccess(\"Transaction submitted\");\n console.log(` User Operation Hash: ${chalk.cyan(result.userOpHash)}`);\n if (result.txHash) {\n console.log(` Transaction Hash: ${chalk.cyan(result.txHash)}`);\n }\n } else {\n // Standard payment\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const wdk: any = await import(\"@t402/wdk\");\n const { createPaymentProcessor } = wdk;\n\n spinner.text = \"Initializing wallet...\";\n const processor = createPaymentProcessor({ seedPhrase });\n await processor.initialize();\n\n spinner.text = \"Sending payment...\";\n const txHash = await processor.pay({\n network,\n asset: options.asset,\n to,\n amount: parseAmount(amount),\n });\n\n spinner.succeed(\"Payment sent!\");\n console.log();\n printSuccess(\"Transaction submitted\");\n console.log(` Transaction Hash: ${chalk.cyan(txHash)}`);\n }\n } catch (error) {\n printError(`Payment failed: ${error instanceof Error ? error.message : error}`);\n }\n },\n );\n\n // pay-invoice command (pay a 402 response)\n program\n .command(\"pay-invoice\")\n .description(\"Pay a 402 Payment Required response\")\n .argument(\"<url>\", \"URL that returned 402\")\n .option(\"-g, --gasless\", \"Use gasless transaction (ERC-4337)\")\n .option(\"-i, --index <index>\", \"Payment option index (if multiple)\", \"0\")\n .action(async (url: string, options: { gasless?: boolean; index: string }) => {\n if (!isValidUrl(url)) {\n printError(\"Invalid URL format\");\n return;\n }\n\n const encrypted = getEncryptedSeed();\n if (!encrypted) {\n printError(\"No wallet configured. Run 'wallet create' or 'wallet import' first.\");\n return;\n }\n\n try {\n const spinner = createSpinner(\"Fetching payment requirements...\").start();\n\n // Fetch the 402 response\n const response = await fetch(url);\n if (response.status !== 402) {\n spinner.fail(`Expected 402 status, got ${response.status}`);\n return;\n }\n\n const paymentRequired = (await response.json()) as {\n accepts?: Array<{\n network: string;\n asset?: string;\n amount: string;\n payTo: string;\n }>;\n resource?: { description?: string };\n };\n if (!paymentRequired.accepts || !Array.isArray(paymentRequired.accepts)) {\n spinner.fail(\"Invalid 402 response format\");\n return;\n }\n\n const index = parseInt(options.index, 10);\n const requirement = paymentRequired.accepts[index];\n if (!requirement) {\n spinner.fail(`No payment option at index ${index}`);\n return;\n }\n\n spinner.succeed(\"Payment requirements fetched\");\n\n printHeader(\"Payment Requirements\");\n printTable({\n Resource: paymentRequired.resource?.description || url,\n Amount: `${formatAmount(requirement.amount)} ${requirement.asset?.toUpperCase() || \"USDT\"}`,\n Network: getNetworkName(requirement.network),\n Recipient: formatAddress(requirement.payTo),\n });\n console.log();\n\n const seedPhrase = decryptSeed(encrypted, MACHINE_KEY);\n const paySpinner = createSpinner(\"Processing payment...\").start();\n\n if (options.gasless) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const wdkGasless: any = await import(\"@t402/wdk-gasless\");\n const { WdkGaslessClient } = wdkGasless;\n\n paySpinner.text = \"Initializing gasless client...\";\n const client = await WdkGaslessClient.create({\n seedPhrase,\n chain: requirement.network.replace(\"eip155:\", \"\"),\n });\n\n paySpinner.text = \"Sending gasless payment...\";\n const result = await client.pay({\n to: requirement.payTo,\n amount: requirement.amount,\n });\n\n paySpinner.succeed(\"Payment sent!\");\n console.log();\n printSuccess(\"Payment completed\");\n console.log(` User Operation Hash: ${chalk.cyan(result.userOpHash)}`);\n\n // Retry the original request with payment header\n console.log();\n const retrySpinner = createSpinner(\"Retrying request with payment...\").start();\n\n const retryResponse = await fetch(url, {\n headers: {\n \"X-Payment\": result.userOpHash,\n },\n });\n\n if (retryResponse.ok) {\n retrySpinner.succeed(\"Request successful!\");\n console.log(` Status: ${chalk.green(retryResponse.status)}`);\n } else {\n retrySpinner.warn(`Request returned ${retryResponse.status}`);\n }\n } else {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const wdk: any = await import(\"@t402/wdk\");\n const { createPaymentProcessor } = wdk;\n\n paySpinner.text = \"Initializing wallet...\";\n const processor = createPaymentProcessor({ seedPhrase });\n await processor.initialize();\n\n paySpinner.text = \"Sending payment...\";\n const txHash = await processor.pay({\n network: requirement.network,\n asset: requirement.asset || \"usdt\",\n to: requirement.payTo,\n amount: requirement.amount,\n });\n\n paySpinner.succeed(\"Payment sent!\");\n console.log();\n printSuccess(\"Payment completed\");\n console.log(` Transaction Hash: ${chalk.cyan(txHash)}`);\n }\n } catch (error) {\n printError(`Failed to pay invoice: ${error instanceof Error ? error.message : error}`);\n }\n });\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { getEncryptedSeed, getConfig } from \"../config/index.js\";\nimport {\n createSpinner,\n formatAddress,\n formatAmount,\n printSuccess,\n printError,\n printWarning,\n printHeader,\n printTable,\n decryptSeed,\n getNetworkName,\n isValidUrl,\n} from \"../utils/index.js\";\nimport { VERSION } from \"../version.js\";\n\n// Machine ID for basic encryption key\nconst MACHINE_KEY = `t402-cli-${process.env.USER || \"default\"}`;\n\n/**\n * Register the request command\n */\nexport function registerRequestCommand(program: Command): void {\n program\n .command(\"request\")\n .description(\"Make an HTTP request with automatic 402 payment handling\")\n .argument(\"<url>\", \"URL to request\")\n .option(\"-X, --method <method>\", \"HTTP method\", \"GET\")\n .option(\"-H, --header <header...>\", \"Additional headers (key:value)\")\n .option(\"-d, --data <data>\", \"Request body data\")\n .option(\"-g, --gasless\", \"Use gasless payments (ERC-4337)\")\n .option(\"-n, --network <network>\", \"Preferred network for payment\")\n .option(\"-o, --output <file>\", \"Save response to file\")\n .option(\"-v, --verbose\", \"Show detailed output\")\n .option(\"--dry-run\", \"Show what would be paid without executing\")\n .action(\n async (\n url: string,\n options: {\n method: string;\n header?: string[];\n data?: string;\n gasless?: boolean;\n network?: string;\n output?: string;\n verbose?: boolean;\n dryRun?: boolean;\n },\n ) => {\n if (!isValidUrl(url)) {\n printError(\"Invalid URL format\");\n return;\n }\n\n const encrypted = getEncryptedSeed();\n if (!encrypted && !options.dryRun) {\n printError(\"No wallet configured. Run 'wallet create' or 'wallet import' first.\");\n return;\n }\n\n // Build request options\n const headers: Record<string, string> = {\n \"User-Agent\": `t402-cli/${VERSION}`,\n };\n\n if (options.header) {\n for (const h of options.header) {\n const [key, ...valueParts] = h.split(\":\");\n if (key && valueParts.length > 0) {\n headers[key.trim()] = valueParts.join(\":\").trim();\n }\n }\n }\n\n const fetchOptions: RequestInit = {\n method: options.method,\n headers,\n };\n\n if (options.data) {\n fetchOptions.body = options.data;\n if (!headers[\"Content-Type\"]) {\n headers[\"Content-Type\"] = \"application/json\";\n }\n }\n\n try {\n const spinner = createSpinner(`${options.method} ${url}`).start();\n\n // Make initial request\n const response = await fetch(url, fetchOptions);\n\n if (response.status === 402) {\n spinner.info(\"Payment required (402)\");\n\n // Parse 402 response\n const paymentRequired = (await response.json()) as {\n accepts?: Array<{\n network: string;\n asset?: string;\n amount: string;\n payTo: string;\n }>;\n resource?: { description?: string };\n };\n if (!paymentRequired.accepts || !Array.isArray(paymentRequired.accepts)) {\n printError(\"Invalid 402 response format\");\n return;\n }\n\n // Select payment option\n const preferredNetwork = options.network || getConfig(\"defaultNetwork\");\n let requirement = paymentRequired.accepts.find(\n (r) => r.network === preferredNetwork,\n );\n if (!requirement) {\n requirement = paymentRequired.accepts[0];\n }\n\n printHeader(\"Payment Required\");\n printTable({\n Resource: paymentRequired.resource?.description || url,\n Amount: `${formatAmount(requirement.amount)} ${requirement.asset?.toUpperCase() || \"USDT\"}`,\n Network: getNetworkName(requirement.network),\n Recipient: formatAddress(requirement.payTo),\n });\n console.log();\n\n if (options.dryRun) {\n printWarning(\"Dry run - no payment executed\");\n return;\n }\n\n if (!encrypted) {\n printError(\"No wallet configured.\");\n return;\n }\n\n const seedPhrase = decryptSeed(encrypted, MACHINE_KEY);\n const paySpinner = createSpinner(\"Processing payment...\").start();\n\n let paymentProof: string;\n\n if (options.gasless) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const wdkGasless: any = await import(\"@t402/wdk-gasless\");\n const { WdkGaslessClient } = wdkGasless;\n\n paySpinner.text = \"Initializing gasless client...\";\n const client = await WdkGaslessClient.create({\n seedPhrase,\n chain: requirement.network.replace(\"eip155:\", \"\"),\n });\n\n paySpinner.text = \"Sending gasless payment...\";\n const result = await client.pay({\n to: requirement.payTo,\n amount: requirement.amount,\n });\n\n paymentProof = result.userOpHash;\n paySpinner.succeed(\"Gasless payment sent\");\n\n if (options.verbose) {\n console.log(` User Operation Hash: ${chalk.cyan(result.userOpHash)}`);\n }\n } else {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const wdk: any = await import(\"@t402/wdk\");\n const { createPaymentProcessor } = wdk;\n\n paySpinner.text = \"Initializing wallet...\";\n const processor = createPaymentProcessor({ seedPhrase });\n await processor.initialize();\n\n paySpinner.text = \"Sending payment...\";\n const txHash = await processor.pay({\n network: requirement.network,\n asset: requirement.asset || \"usdt\",\n to: requirement.payTo,\n amount: requirement.amount,\n });\n\n paymentProof = txHash;\n paySpinner.succeed(\"Payment sent\");\n\n if (options.verbose) {\n console.log(` Transaction Hash: ${chalk.cyan(txHash)}`);\n }\n }\n\n // Retry with payment header\n console.log();\n const retrySpinner = createSpinner(\"Retrying request with payment proof...\").start();\n\n const retryResponse = await fetch(url, {\n ...fetchOptions,\n headers: {\n ...headers,\n \"X-Payment\": paymentProof,\n },\n });\n\n if (retryResponse.ok) {\n retrySpinner.succeed(`${retryResponse.status} ${retryResponse.statusText}`);\n await handleResponse(retryResponse, options);\n } else if (retryResponse.status === 402) {\n retrySpinner.fail(\"Payment not accepted - still requires payment\");\n printError(\"The server did not accept the payment proof.\");\n } else {\n retrySpinner.warn(`${retryResponse.status} ${retryResponse.statusText}`);\n await handleResponse(retryResponse, options);\n }\n } else if (response.ok) {\n spinner.succeed(`${response.status} ${response.statusText}`);\n await handleResponse(response, options);\n } else {\n spinner.fail(`${response.status} ${response.statusText}`);\n await handleResponse(response, options);\n }\n } catch (error) {\n printError(`Request failed: ${error instanceof Error ? error.message : error}`);\n }\n },\n );\n}\n\n/**\n * Handle and display response\n */\nasync function handleResponse(\n response: Response,\n options: { output?: string; verbose?: boolean },\n): Promise<void> {\n const contentType = response.headers.get(\"content-type\") || \"\";\n\n if (options.verbose) {\n console.log();\n console.log(chalk.gray(\"Response Headers:\"));\n response.headers.forEach((value, key) => {\n console.log(chalk.gray(` ${key}: ${value}`));\n });\n console.log();\n }\n\n if (options.output) {\n const { writeFile } = await import(\"fs/promises\");\n const buffer = await response.arrayBuffer();\n await writeFile(options.output, Buffer.from(buffer));\n printSuccess(`Response saved to ${options.output}`);\n } else if (contentType.includes(\"application/json\")) {\n const json = await response.json();\n console.log();\n console.log(JSON.stringify(json, null, 2));\n } else if (contentType.includes(\"text/\")) {\n const text = await response.text();\n console.log();\n console.log(text);\n } else {\n const size = response.headers.get(\"content-length\") || \"unknown\";\n console.log();\n console.log(chalk.gray(`Binary response (${size} bytes)`));\n console.log(chalk.gray(\"Use --output to save to file\"));\n }\n}\n","// Version is injected at build time or read from package.json\n// Using a simple constant that gets updated during release\nexport const VERSION = \"2.0.0\";\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport {\n getConfig,\n setConfig,\n getAllConfig,\n resetConfig,\n getConfigPath,\n setRpcEndpoint,\n} from \"../config/index.js\";\nimport {\n printSuccess,\n printError,\n printWarning,\n printHeader,\n printTable,\n getNetworkName,\n isValidUrl,\n} from \"../utils/index.js\";\nimport type { CliConfig } from \"../types.js\";\n\n/**\n * Register configuration commands\n */\nexport function registerConfigCommands(program: Command): void {\n const config = program.command(\"config\").description(\"Configuration management\");\n\n // config show\n config\n .command(\"show\")\n .description(\"Show current configuration\")\n .action(() => {\n const cfg = getAllConfig();\n\n printHeader(\"T402 CLI Configuration\");\n\n const displayConfig: Record<string, string> = {\n \"Default Network\": getNetworkName(cfg.defaultNetwork),\n \"Network ID\": cfg.defaultNetwork,\n \"Facilitator URL\": cfg.facilitatorUrl,\n \"Testnet Mode\": cfg.testnet ? chalk.yellow(\"Yes\") : \"No\",\n \"Wallet Configured\": cfg.encryptedSeed ? chalk.green(\"Yes\") : chalk.gray(\"No\"),\n \"Config File\": getConfigPath(),\n };\n\n printTable(displayConfig);\n\n // Show custom RPC endpoints if any\n const endpoints = cfg.rpcEndpoints;\n if (Object.keys(endpoints).length > 0) {\n console.log();\n console.log(chalk.bold(\"Custom RPC Endpoints:\"));\n for (const [network, url] of Object.entries(endpoints)) {\n console.log(` ${getNetworkName(network)}: ${url}`);\n }\n }\n });\n\n // config get\n config\n .command(\"get\")\n .description(\"Get a configuration value\")\n .argument(\"<key>\", \"Configuration key (defaultNetwork, facilitatorUrl, testnet)\")\n .action((key: string) => {\n const validKeys = [\"defaultNetwork\", \"facilitatorUrl\", \"testnet\", \"rpcEndpoints\"];\n if (!validKeys.includes(key)) {\n printError(`Invalid key. Valid keys: ${validKeys.join(\", \")}`);\n return;\n }\n\n const value = getConfig(key as keyof CliConfig);\n if (typeof value === \"object\") {\n console.log(JSON.stringify(value, null, 2));\n } else {\n console.log(value);\n }\n });\n\n // config set\n config\n .command(\"set\")\n .description(\"Set a configuration value\")\n .argument(\"<key>\", \"Configuration key\")\n .argument(\"<value>\", \"Value to set\")\n .action((key: string, value: string) => {\n switch (key) {\n case \"defaultNetwork\":\n setConfig(\"defaultNetwork\", value);\n printSuccess(`Default network set to ${getNetworkName(value)}`);\n break;\n\n case \"facilitatorUrl\":\n if (!isValidUrl(value)) {\n printError(\"Invalid URL format\");\n return;\n }\n setConfig(\"facilitatorUrl\", value);\n printSuccess(`Facilitator URL set to ${value}`);\n break;\n\n case \"testnet\":\n const isTestnet = value.toLowerCase() === \"true\" || value === \"1\";\n setConfig(\"testnet\", isTestnet);\n printSuccess(`Testnet mode ${isTestnet ? \"enabled\" : \"disabled\"}`);\n\n // Suggest appropriate default network\n if (isTestnet) {\n setConfig(\"defaultNetwork\", \"eip155:84532\");\n console.log(chalk.gray(\" Default network changed to Base Sepolia\"));\n } else {\n setConfig(\"defaultNetwork\", \"eip155:8453\");\n console.log(chalk.gray(\" Default network changed to Base\"));\n }\n break;\n\n default:\n printError(\n `Unknown key: ${key}. Valid keys: defaultNetwork, facilitatorUrl, testnet`,\n );\n }\n });\n\n // config rpc\n config\n .command(\"rpc\")\n .description(\"Set custom RPC endpoint for a network\")\n .argument(\"<network>\", \"Network ID (e.g., eip155:8453)\")\n .argument(\"<url>\", \"RPC endpoint URL\")\n .action((network: string, url: string) => {\n if (!isValidUrl(url)) {\n printError(\"Invalid URL format\");\n return;\n }\n\n setRpcEndpoint(network, url);\n printSuccess(`RPC endpoint set for ${getNetworkName(network)}`);\n });\n\n // config reset\n config\n .command(\"reset\")\n .description(\"Reset configuration to defaults\")\n .option(\"-f, --force\", \"Skip confirmation\")\n .action((options: { force?: boolean }) => {\n if (!options.force) {\n printWarning(\"This will reset all configuration to defaults.\");\n printWarning(\"Your wallet will NOT be removed.\");\n console.log();\n console.log(\"Run with --force to confirm.\");\n return;\n }\n\n // Preserve wallet\n const cfg = getAllConfig();\n const encryptedSeed = cfg.encryptedSeed;\n\n resetConfig();\n\n // Restore wallet if it existed\n if (encryptedSeed) {\n setConfig(\"encryptedSeed\", encryptedSeed);\n }\n\n printSuccess(\"Configuration reset to defaults\");\n });\n\n // config path\n config\n .command(\"path\")\n .description(\"Show configuration file path\")\n .action(() => {\n console.log(getConfigPath());\n });\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { getConfig } from \"../config/index.js\";\nimport { printHeader } from \"../utils/index.js\";\nimport { NETWORKS } from \"../types.js\";\nimport { VERSION } from \"../version.js\";\n\n/**\n * Register info command\n */\nexport function registerInfoCommand(program: Command): void {\n program\n .command(\"info\")\n .description(\"Show supported networks and assets\")\n .option(\"-a, --all\", \"Show all networks (mainnet and testnet)\")\n .option(\"-t, --testnet\", \"Show testnet networks only\")\n .action((options: { all?: boolean; testnet?: boolean }) => {\n const showTestnet = options.testnet || getConfig(\"testnet\");\n const showAll = options.all;\n\n printHeader(\"T402 Payment Protocol\");\n\n console.log(` Version: ${VERSION}`);\n console.log(\" Facilitator: \" + chalk.cyan(getConfig(\"facilitatorUrl\")));\n console.log();\n\n // Supported Networks\n console.log(chalk.bold(\"Supported Networks:\"));\n console.log();\n\n // EVM Networks\n const evmMainnets = NETWORKS.filter((n) => n.type === \"evm\" && !n.testnet);\n const evmTestnets = NETWORKS.filter((n) => n.type === \"evm\" && n.testnet);\n\n if (showAll || !showTestnet) {\n console.log(chalk.underline(\" EVM (Mainnet):\"));\n for (const network of evmMainnets) {\n console.log(\n ` ${chalk.green(\"●\")} ${network.name.padEnd(16)} ${chalk.gray(network.id)}`,\n );\n }\n console.log();\n }\n\n if (showAll || showTestnet) {\n console.log(chalk.underline(\" EVM (Testnet):\"));\n for (const network of evmTestnets) {\n console.log(\n ` ${chalk.yellow(\"●\")} ${network.name.padEnd(16)} ${chalk.gray(network.id)}`,\n );\n }\n console.log();\n }\n\n // Solana\n const solanaNetworks = NETWORKS.filter(\n (n) => n.type === \"solana\" && (showAll || n.testnet === showTestnet),\n );\n if (solanaNetworks.length > 0) {\n console.log(chalk.underline(\" Solana:\"));\n for (const network of solanaNetworks) {\n const color = network.testnet ? chalk.yellow : chalk.green;\n console.log(` ${color(\"●\")} ${network.name.padEnd(16)} ${chalk.gray(network.id)}`);\n }\n console.log();\n }\n\n // TON\n const tonNetworks = NETWORKS.filter(\n (n) => n.type === \"ton\" && (showAll || n.testnet === showTestnet),\n );\n if (tonNetworks.length > 0) {\n console.log(chalk.underline(\" TON:\"));\n for (const network of tonNetworks) {\n const color = network.testnet ? chalk.yellow : chalk.green;\n console.log(` ${color(\"●\")} ${network.name.padEnd(16)} ${chalk.gray(network.id)}`);\n }\n console.log();\n }\n\n // TRON\n const tronNetworks = NETWORKS.filter(\n (n) => n.type === \"tron\" && (showAll || n.testnet === showTestnet),\n );\n if (tronNetworks.length > 0) {\n console.log(chalk.underline(\" TRON:\"));\n for (const network of tronNetworks) {\n const color = network.testnet ? chalk.yellow : chalk.green;\n console.log(` ${color(\"●\")} ${network.name.padEnd(16)} ${chalk.gray(network.id)}`);\n }\n console.log();\n }\n\n // Supported Assets\n console.log(chalk.bold(\"Supported Assets:\"));\n console.log();\n console.log(` ${chalk.cyan(\"USDT0\")} - Tether USD (OFT) on EVM chains`);\n console.log(` ${chalk.cyan(\"USDT\")} - Tether USD on all chains`);\n console.log();\n\n // Payment Schemes\n console.log(chalk.bold(\"Payment Schemes:\"));\n console.log();\n console.log(` ${chalk.magenta(\"exact\")} - Exact amount payment (default)`);\n console.log(` ${chalk.magenta(\"upto\")} - Payment up to specified amount`);\n console.log();\n\n // Features\n console.log(chalk.bold(\"Features:\"));\n console.log();\n console.log(` ${chalk.green(\"✓\")} Standard payments (all chains)`);\n console.log(` ${chalk.green(\"✓\")} Gasless payments via ERC-4337 (EVM chains)`);\n console.log(` ${chalk.green(\"✓\")} Cross-chain bridging via LayerZero`);\n console.log(` ${chalk.green(\"✓\")} WDK wallet integration`);\n console.log();\n\n // Legend\n console.log(chalk.gray(\"Legend:\"));\n console.log(chalk.gray(` ${chalk.green(\"●\")} Mainnet ${chalk.yellow(\"●\")} Testnet`));\n });\n\n // version command (alias)\n program\n .command(\"version\")\n .description(\"Show CLI version\")\n .action(() => {\n console.log(`t402 CLI v${VERSION}`);\n });\n}\n"],"mappings":"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","names":["import_chalk","Conf","ora","chalk","chalk","import_chalk","MACHINE_KEY","chalk","import_chalk","MACHINE_KEY","chalk","import_chalk","config","chalk","import_chalk","chalk"]}
1
+ {"version":3,"sources":["../../src/index.ts","../../src/cli.ts","../../src/commands/wallet.ts","../../src/config/index.ts","../../src/types.ts","../../src/utils/index.ts","../../src/commands/pay.ts","../../src/commands/request.ts","../../src/version.ts","../../src/commands/config.ts","../../src/commands/info.ts"],"sourcesContent":["// CLI exports\nexport { createCli, runCli } from \"./cli.js\";\n\n// Config exports\nexport {\n getConfig,\n setConfig,\n getAllConfig,\n resetConfig,\n getConfigPath,\n hasSeedConfigured,\n setRpcEndpoint,\n getRpcEndpoint,\n} from \"./config/index.js\";\n\n// Utility exports\nexport {\n createSpinner,\n formatAddress,\n formatAmount,\n parseAmount,\n formatBalanceResult,\n formatPaymentResult,\n getNetworkInfo,\n getNetworkName,\n getAvailableNetworks,\n printSuccess,\n printError,\n printWarning,\n printInfo,\n printHeader,\n printTable,\n isValidSeedPhrase,\n isValidUrl,\n} from \"./utils/index.js\";\n\n// Type exports\nexport type {\n CliConfig,\n WalletInfo,\n BalanceResult,\n PaymentResult,\n NetworkInfo,\n} from \"./types.js\";\n\nexport { DEFAULT_CONFIG, NETWORKS } from \"./types.js\";\n","import { Command } from \"commander\";\nimport { registerWalletCommands } from \"./commands/wallet.js\";\nimport { registerPayCommands } from \"./commands/pay.js\";\nimport { registerRequestCommand } from \"./commands/request.js\";\nimport { registerConfigCommands } from \"./commands/config.js\";\nimport { registerInfoCommand } from \"./commands/info.js\";\nimport { VERSION } from \"./version.js\";\n\n/**\n * Create and configure the CLI program\n */\nexport function createCli(): Command {\n const program = new Command();\n\n program\n .name(\"t402\")\n .description(\"Command-line interface for the T402 payment protocol\")\n .version(VERSION);\n\n // Register command groups\n registerWalletCommands(program);\n registerPayCommands(program);\n registerRequestCommand(program);\n registerConfigCommands(program);\n registerInfoCommand(program);\n\n return program;\n}\n\n/**\n * Run the CLI\n */\nexport async function runCli(args: string[] = process.argv): Promise<void> {\n const program = createCli();\n await program.parseAsync(args);\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport {\n hasSeedConfigured,\n storeSeed,\n getEncryptedSeed,\n clearSeed,\n getConfig,\n} from \"../config/index.js\";\nimport {\n createSpinner,\n formatAmount,\n printSuccess,\n printError,\n printWarning,\n printHeader,\n printTable,\n isValidSeedPhrase,\n encryptSeed,\n decryptSeed,\n getNetworkName,\n} from \"../utils/index.js\";\n\n// Machine ID for basic encryption key\nconst MACHINE_KEY = `t402-cli-${process.env.USER || \"default\"}`;\n\n/**\n * Register wallet-related commands\n */\nexport function registerWalletCommands(program: Command): void {\n const wallet = program.command(\"wallet\").description(\"Wallet management commands\");\n\n // wallet create\n wallet\n .command(\"create\")\n .description(\"Create a new wallet with a generated seed phrase\")\n .action(async () => {\n if (hasSeedConfigured()) {\n printWarning(\"A wallet is already configured. Use 'wallet clear' first to remove it.\");\n return;\n }\n\n try {\n // Use viem for seed phrase generation\n const { generateMnemonic, english } = await import(\"viem/accounts\");\n\n const spinner = createSpinner(\"Generating seed phrase...\").start();\n const mnemonic = generateMnemonic(english);\n spinner.succeed(\"Seed phrase generated\");\n\n console.log();\n console.log(chalk.yellow(\"⚠ IMPORTANT: Write down these words and store them safely!\"));\n console.log(chalk.yellow(\" This is the ONLY way to recover your wallet.\"));\n console.log();\n console.log(chalk.bold(\"Seed phrase:\"));\n console.log();\n console.log(` ${chalk.cyan(mnemonic)}`);\n console.log();\n\n // Store encrypted seed\n const encrypted = encryptSeed(mnemonic, MACHINE_KEY);\n storeSeed(encrypted);\n\n printSuccess(\"Wallet created and saved to config\");\n console.log();\n console.log(\"Run 'wallet show' to see your addresses.\");\n } catch (error) {\n printError(`Failed to create wallet: ${error instanceof Error ? error.message : error}`);\n }\n });\n\n // wallet import\n wallet\n .command(\"import\")\n .description(\"Import an existing wallet from a seed phrase\")\n .argument(\"<seed-phrase>\", \"12 or 24 word seed phrase (in quotes)\")\n .action(async (seedPhrase: string) => {\n if (hasSeedConfigured()) {\n printWarning(\"A wallet is already configured. Use 'wallet clear' first to remove it.\");\n return;\n }\n\n const phrase = seedPhrase.trim();\n if (!isValidSeedPhrase(phrase)) {\n printError(\"Invalid seed phrase. Must be 12 or 24 words.\");\n return;\n }\n\n try {\n // Validate by trying to create an account\n const { mnemonicToAccount } = await import(\"viem/accounts\");\n mnemonicToAccount(phrase); // Throws if invalid\n\n // Store encrypted seed\n const encrypted = encryptSeed(phrase, MACHINE_KEY);\n storeSeed(encrypted);\n\n printSuccess(\"Wallet imported successfully\");\n console.log();\n console.log(\"Run 'wallet show' to see your addresses.\");\n } catch (error) {\n printError(`Failed to import wallet: ${error instanceof Error ? error.message : error}`);\n }\n });\n\n // wallet show\n wallet\n .command(\"show\")\n .description(\"Show wallet addresses\")\n .action(async () => {\n const encrypted = getEncryptedSeed();\n if (!encrypted) {\n printError(\"No wallet configured. Run 'wallet create' or 'wallet import' first.\");\n return;\n }\n\n try {\n const seedPhrase = decryptSeed(encrypted, MACHINE_KEY);\n const { mnemonicToAccount } = await import(\"viem/accounts\");\n\n const spinner = createSpinner(\"Loading wallet...\").start();\n const account = mnemonicToAccount(seedPhrase);\n spinner.succeed(\"Wallet loaded\");\n\n printHeader(\"Wallet Addresses\");\n\n const addresses: Record<string, string> = {\n \"EVM (Ethereum, Arbitrum, Base, etc.)\": account.address,\n };\n\n printTable(addresses);\n\n console.log();\n console.log(chalk.gray(\"Note: Install @t402/wdk for full multi-chain support\"));\n } catch (error) {\n printError(`Failed to load wallet: ${error instanceof Error ? error.message : error}`);\n }\n });\n\n // wallet balance\n wallet\n .command(\"balance\")\n .description(\"Check wallet balances\")\n .option(\"-n, --network <network>\", \"Specific network to check (e.g., eip155:8453)\")\n .option(\"-a, --all\", \"Show all networks including zero balances\")\n .action(async (options: { network?: string; all?: boolean }) => {\n const encrypted = getEncryptedSeed();\n if (!encrypted) {\n printError(\"No wallet configured. Run 'wallet create' or 'wallet import' first.\");\n return;\n }\n\n try {\n const seedPhrase = decryptSeed(encrypted, MACHINE_KEY);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const wdkModule: any = await import(\"@t402/wdk\");\n const { T402WDK } = wdkModule;\n\n const spinner = createSpinner(\"Fetching balances...\").start();\n const testnet = getConfig(\"testnet\");\n\n // Create WDK with appropriate chains\n const chainConfig = testnet\n ? {\n \"arbitrum-sepolia\": \"https://sepolia-rollup.arbitrum.io/rpc\",\n \"base-sepolia\": \"https://sepolia.base.org\",\n }\n : {\n arbitrum: \"https://arb1.arbitrum.io/rpc\",\n base: \"https://mainnet.base.org\",\n };\n\n const wdk = new T402WDK(seedPhrase, chainConfig);\n\n if (options.network) {\n // Single network balance\n const chainName = options.network.replace(\"eip155:\", \"\").replace(\"8453\", \"base\").replace(\"42161\", \"arbitrum\");\n spinner.text = `Fetching balance for ${getNetworkName(options.network)}...`;\n const balance = await wdk.getUsdt0Balance(chainName);\n spinner.succeed(\"Balance fetched\");\n\n printHeader(`Balance on ${getNetworkName(options.network)}`);\n console.log(` ${chalk.green(formatAmount(balance.toString()))} USDT0`);\n } else {\n // All balances\n const balances = await wdk.getAggregatedBalances();\n spinner.succeed(\"Balances fetched\");\n\n printHeader(\"Wallet Balances\");\n console.log(` Total USDT0: ${chalk.green(formatAmount(balances.totalUsdt0.toString()))}`);\n\n if (balances.chains.length > 0) {\n console.log();\n for (const chain of balances.chains) {\n const usdt0 = chain.tokens.find((t: { symbol: string }) => t.symbol === \"USDT0\");\n if (usdt0 && (options.all || usdt0.balance > 0n)) {\n const color = usdt0.balance > 0n ? chalk.green : chalk.gray;\n console.log(` ${chain.chain.padEnd(20)} ${color(formatAmount(usdt0.balance.toString()))} USDT0`);\n }\n }\n }\n }\n } catch (error) {\n printError(`Failed to fetch balances: ${error instanceof Error ? error.message : error}`);\n }\n });\n\n // wallet clear\n wallet\n .command(\"clear\")\n .description(\"Remove wallet from this device\")\n .option(\"-f, --force\", \"Skip confirmation\")\n .action(async (options: { force?: boolean }) => {\n if (!hasSeedConfigured()) {\n printWarning(\"No wallet configured.\");\n return;\n }\n\n if (!options.force) {\n console.log(chalk.yellow(\"⚠ WARNING: This will remove your wallet from this device.\"));\n console.log(chalk.yellow(\" Make sure you have your seed phrase backed up!\"));\n console.log();\n console.log(\"Run with --force to confirm.\");\n return;\n }\n\n clearSeed();\n printSuccess(\"Wallet removed from this device\");\n });\n\n // wallet export\n wallet\n .command(\"export\")\n .description(\"Export seed phrase (use with caution!)\")\n .option(\"-f, --force\", \"Skip warning\")\n .action(async (options: { force?: boolean }) => {\n const encrypted = getEncryptedSeed();\n if (!encrypted) {\n printError(\"No wallet configured.\");\n return;\n }\n\n if (!options.force) {\n console.log(chalk.red(\"⚠ DANGER: This will display your seed phrase on screen!\"));\n console.log(chalk.red(\" Anyone who sees this can steal your funds.\"));\n console.log();\n console.log(\"Run with --force to proceed.\");\n return;\n }\n\n const seedPhrase = decryptSeed(encrypted, MACHINE_KEY);\n console.log();\n console.log(chalk.bold(\"Seed phrase:\"));\n console.log();\n console.log(` ${chalk.cyan(seedPhrase)}`);\n console.log();\n });\n}\n","import Conf from \"conf\";\nimport type { CliConfig } from \"../types.js\";\nimport { DEFAULT_CONFIG } from \"../types.js\";\n\n/**\n * Configuration store for t402 CLI\n */\nconst config = new Conf<CliConfig>({\n projectName: \"t402\",\n defaults: DEFAULT_CONFIG,\n});\n\n/**\n * Get a configuration value\n */\nexport function getConfig<K extends keyof CliConfig>(key: K): CliConfig[K] {\n return config.get(key);\n}\n\n/**\n * Set a configuration value\n */\nexport function setConfig<K extends keyof CliConfig>(key: K, value: CliConfig[K]): void {\n config.set(key, value);\n}\n\n/**\n * Get all configuration values\n */\nexport function getAllConfig(): CliConfig {\n return config.store;\n}\n\n/**\n * Reset configuration to defaults\n */\nexport function resetConfig(): void {\n config.clear();\n}\n\n/**\n * Get the path to the configuration file\n */\nexport function getConfigPath(): string {\n return config.path;\n}\n\n/**\n * Check if a seed phrase is configured\n */\nexport function hasSeedConfigured(): boolean {\n return !!config.get(\"encryptedSeed\");\n}\n\n/**\n * Store encrypted seed phrase\n */\nexport function storeSeed(encryptedSeed: string): void {\n config.set(\"encryptedSeed\", encryptedSeed);\n}\n\n/**\n * Get encrypted seed phrase\n */\nexport function getEncryptedSeed(): string | undefined {\n return config.get(\"encryptedSeed\");\n}\n\n/**\n * Clear stored seed phrase\n */\nexport function clearSeed(): void {\n config.delete(\"encryptedSeed\");\n}\n\n/**\n * Set custom RPC endpoint for a network\n */\nexport function setRpcEndpoint(network: string, url: string): void {\n const endpoints = config.get(\"rpcEndpoints\");\n config.set(\"rpcEndpoints\", { ...endpoints, [network]: url });\n}\n\n/**\n * Get RPC endpoint for a network\n */\nexport function getRpcEndpoint(network: string): string | undefined {\n return config.get(\"rpcEndpoints\")[network];\n}\n\nexport { config };\n","/**\n * CLI configuration stored in user config file\n */\nexport interface CliConfig {\n /** Default network to use */\n defaultNetwork: string;\n /** Facilitator URL */\n facilitatorUrl: string;\n /** Whether to use testnet networks */\n testnet: boolean;\n /** Encrypted seed phrase (optional) */\n encryptedSeed?: string;\n /** Custom RPC endpoints by network */\n rpcEndpoints: Record<string, string>;\n}\n\n/**\n * Wallet information\n */\nexport interface WalletInfo {\n /** Wallet addresses by network type */\n addresses: {\n evm?: string;\n solana?: string;\n ton?: string;\n tron?: string;\n };\n /** Whether the wallet has a seed configured */\n hasSeed: boolean;\n}\n\n/**\n * Balance result for a specific network\n */\nexport interface BalanceResult {\n network: string;\n asset: string;\n balance: string;\n formatted: string;\n address: string;\n}\n\n/**\n * Payment result\n */\nexport interface PaymentResult {\n success: boolean;\n txHash?: string;\n network?: string;\n amount?: string;\n error?: string;\n}\n\n/**\n * Supported network information\n */\nexport interface NetworkInfo {\n id: string;\n name: string;\n type: \"evm\" | \"solana\" | \"ton\" | \"tron\";\n testnet: boolean;\n assets: string[];\n}\n\n/**\n * Default configuration values\n */\nexport const DEFAULT_CONFIG: CliConfig = {\n defaultNetwork: \"eip155:8453\",\n facilitatorUrl: \"https://facilitator.t402.io\",\n testnet: false,\n rpcEndpoints: {},\n};\n\n/**\n * Supported networks\n */\nexport const NETWORKS: NetworkInfo[] = [\n // EVM Mainnets\n { id: \"eip155:1\", name: \"Ethereum\", type: \"evm\", testnet: false, assets: [\"usdt\", \"usdt0\"] },\n { id: \"eip155:42161\", name: \"Arbitrum\", type: \"evm\", testnet: false, assets: [\"usdt0\"] },\n { id: \"eip155:8453\", name: \"Base\", type: \"evm\", testnet: false, assets: [\"usdt0\"] },\n { id: \"eip155:10\", name: \"Optimism\", type: \"evm\", testnet: false, assets: [\"usdt0\"] },\n { id: \"eip155:57073\", name: \"Ink\", type: \"evm\", testnet: false, assets: [\"usdt0\"] },\n { id: \"eip155:80094\", name: \"Berachain\", type: \"evm\", testnet: false, assets: [\"usdt0\"] },\n // EVM Testnets\n { id: \"eip155:11155111\", name: \"Sepolia\", type: \"evm\", testnet: true, assets: [\"usdt0\"] },\n { id: \"eip155:421614\", name: \"Arbitrum Sepolia\", type: \"evm\", testnet: true, assets: [\"usdt0\"] },\n { id: \"eip155:84532\", name: \"Base Sepolia\", type: \"evm\", testnet: true, assets: [\"usdt0\"] },\n // Solana\n {\n id: \"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp\",\n name: \"Solana\",\n type: \"solana\",\n testnet: false,\n assets: [\"usdt\"],\n },\n {\n id: \"solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1\",\n name: \"Solana Devnet\",\n type: \"solana\",\n testnet: true,\n assets: [\"usdt\"],\n },\n // TON\n { id: \"ton:-239\", name: \"TON\", type: \"ton\", testnet: false, assets: [\"usdt\"] },\n { id: \"ton:-3\", name: \"TON Testnet\", type: \"ton\", testnet: true, assets: [\"usdt\"] },\n // TRON\n { id: \"tron:mainnet\", name: \"TRON\", type: \"tron\", testnet: false, assets: [\"usdt\"] },\n { id: \"tron:nile\", name: \"TRON Nile\", type: \"tron\", testnet: true, assets: [\"usdt\"] },\n];\n","import chalk from \"chalk\";\nimport ora, { type Ora } from \"ora\";\nimport type { BalanceResult, NetworkInfo, PaymentResult } from \"../types.js\";\nimport { NETWORKS } from \"../types.js\";\n\n/**\n * Create a spinner with consistent styling\n */\nexport function createSpinner(text: string): Ora {\n return ora({\n text,\n color: \"cyan\",\n });\n}\n\n/**\n * Format an address for display (truncated)\n */\nexport function formatAddress(address: string, startChars = 6, endChars = 4): string {\n if (address.length <= startChars + endChars + 3) {\n return address;\n }\n return `${address.slice(0, startChars)}...${address.slice(-endChars)}`;\n}\n\n/**\n * Format a token amount with decimals\n */\nexport function formatAmount(amount: string, decimals = 6): string {\n const value = BigInt(amount);\n const divisor = BigInt(10 ** decimals);\n const whole = value / divisor;\n const fraction = value % divisor;\n\n if (fraction === 0n) {\n return whole.toString();\n }\n\n const fractionStr = fraction.toString().padStart(decimals, \"0\").replace(/0+$/, \"\");\n return `${whole}.${fractionStr}`;\n}\n\n/**\n * Format balance result for display\n */\nexport function formatBalanceResult(result: BalanceResult): string {\n const network = getNetworkInfo(result.network);\n const networkName = network?.name || result.network;\n const assetName = result.asset.toUpperCase();\n\n return `${chalk.bold(networkName)}: ${chalk.green(result.formatted)} ${assetName}`;\n}\n\n/**\n * Format payment result for display\n */\nexport function formatPaymentResult(result: PaymentResult): string {\n if (result.success) {\n const lines = [chalk.green(\"✓ Payment successful!\")];\n if (result.txHash) {\n lines.push(` Transaction: ${chalk.cyan(result.txHash)}`);\n }\n if (result.network) {\n const network = getNetworkInfo(result.network);\n lines.push(` Network: ${network?.name || result.network}`);\n }\n if (result.amount) {\n lines.push(` Amount: ${result.amount}`);\n }\n return lines.join(\"\\n\");\n } else {\n return chalk.red(`✗ Payment failed: ${result.error || \"Unknown error\"}`);\n }\n}\n\n/**\n * Get network info by ID\n */\nexport function getNetworkInfo(networkId: string): NetworkInfo | undefined {\n return NETWORKS.find((n) => n.id === networkId);\n}\n\n/**\n * Get network display name\n */\nexport function getNetworkName(networkId: string): string {\n const network = getNetworkInfo(networkId);\n return network?.name || networkId;\n}\n\n/**\n * Filter networks by testnet mode\n */\nexport function getAvailableNetworks(testnet: boolean): NetworkInfo[] {\n return NETWORKS.filter((n) => n.testnet === testnet);\n}\n\n/**\n * Print a table of key-value pairs\n */\nexport function printTable(data: Record<string, string>): void {\n const maxKeyLength = Math.max(...Object.keys(data).map((k) => k.length));\n\n for (const [key, value] of Object.entries(data)) {\n const paddedKey = key.padEnd(maxKeyLength);\n console.log(` ${chalk.gray(paddedKey)} ${value}`);\n }\n}\n\n/**\n * Print a success message\n */\nexport function printSuccess(message: string): void {\n console.log(chalk.green(`✓ ${message}`));\n}\n\n/**\n * Print an error message\n */\nexport function printError(message: string): void {\n console.error(chalk.red(`✗ ${message}`));\n}\n\n/**\n * Print a warning message\n */\nexport function printWarning(message: string): void {\n console.log(chalk.yellow(`⚠ ${message}`));\n}\n\n/**\n * Print an info message\n */\nexport function printInfo(message: string): void {\n console.log(chalk.cyan(`ℹ ${message}`));\n}\n\n/**\n * Print a header\n */\nexport function printHeader(title: string): void {\n console.log();\n console.log(chalk.bold.underline(title));\n console.log();\n}\n\n/**\n * Validate a seed phrase (basic check)\n */\nexport function isValidSeedPhrase(phrase: string): boolean {\n const words = phrase.trim().split(/\\s+/);\n return words.length === 12 || words.length === 24;\n}\n\n/**\n * Simple XOR encryption for seed storage\n * Note: This is basic obfuscation, not secure encryption.\n * For production, use proper encryption with a password.\n */\nexport function encryptSeed(seed: string, key: string): string {\n const seedBytes = Buffer.from(seed, \"utf8\");\n const keyBytes = Buffer.from(key, \"utf8\");\n const encrypted = Buffer.alloc(seedBytes.length);\n\n for (let i = 0; i < seedBytes.length; i++) {\n encrypted[i] = seedBytes[i] ^ keyBytes[i % keyBytes.length];\n }\n\n return encrypted.toString(\"base64\");\n}\n\n/**\n * Decrypt seed phrase\n */\nexport function decryptSeed(encrypted: string, key: string): string {\n const encryptedBytes = Buffer.from(encrypted, \"base64\");\n const keyBytes = Buffer.from(key, \"utf8\");\n const decrypted = Buffer.alloc(encryptedBytes.length);\n\n for (let i = 0; i < encryptedBytes.length; i++) {\n decrypted[i] = encryptedBytes[i] ^ keyBytes[i % keyBytes.length];\n }\n\n return decrypted.toString(\"utf8\");\n}\n\n/**\n * Parse amount string to smallest units\n */\nexport function parseAmount(amount: string, decimals = 6): string {\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) * BigInt(10 ** decimals) + BigInt(fraction)).toString();\n}\n\n/**\n * Validate URL format\n */\nexport function isValidUrl(url: string): boolean {\n try {\n new URL(url);\n return true;\n } catch {\n return false;\n }\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { getEncryptedSeed, getConfig } from \"../config/index.js\";\nimport {\n createSpinner,\n formatAddress,\n formatAmount,\n parseAmount,\n printSuccess,\n printError,\n printHeader,\n printTable,\n decryptSeed,\n getNetworkName,\n isValidUrl,\n} from \"../utils/index.js\";\n\n// Machine ID for basic encryption key\nconst MACHINE_KEY = `t402-cli-${process.env.USER || \"default\"}`;\n\n/**\n * Register payment-related commands\n */\nexport function registerPayCommands(program: Command): void {\n // pay command\n program\n .command(\"pay\")\n .description(\"Send a payment to an address\")\n .argument(\"<to>\", \"Recipient address\")\n .argument(\"<amount>\", \"Amount to send (e.g., 1.5)\")\n .option(\"-n, --network <network>\", \"Network to use (e.g., eip155:8453)\")\n .option(\"-a, --asset <asset>\", \"Asset to send (default: usdt0)\", \"usdt0\")\n .option(\"-g, --gasless\", \"Use gasless transaction (ERC-4337)\")\n .action(\n async (\n to: string,\n amount: string,\n options: { network?: string; asset: string; gasless?: boolean },\n ) => {\n const encrypted = getEncryptedSeed();\n if (!encrypted) {\n printError(\"No wallet configured. Run 'wallet create' or 'wallet import' first.\");\n return;\n }\n\n const network = options.network || getConfig(\"defaultNetwork\");\n const testnet = getConfig(\"testnet\");\n\n // Validate network matches testnet setting\n const isTestnetNetwork =\n network.includes(\"sepolia\") ||\n network.includes(\"testnet\") ||\n network.includes(\"devnet\") ||\n network.includes(\"nile\") ||\n network === \"ton:-3\";\n if (testnet !== isTestnetNetwork) {\n printError(\n `Network ${network} doesn't match testnet mode (${testnet ? \"testnet\" : \"mainnet\"}).`,\n );\n printError(`Run 'config set testnet ${isTestnetNetwork}' to switch modes.`);\n return;\n }\n\n try {\n const seedPhrase = decryptSeed(encrypted, MACHINE_KEY);\n\n printHeader(\"Payment Details\");\n printTable({\n To: formatAddress(to),\n Amount: `${amount} ${options.asset.toUpperCase()}`,\n Network: getNetworkName(network),\n Mode: options.gasless ? \"Gasless (ERC-4337)\" : \"Standard\",\n });\n console.log();\n\n const spinner = createSpinner(\"Preparing transaction...\").start();\n\n if (options.gasless) {\n // Gasless payment using ERC-4337\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const wdkGasless: any = await import(\"@t402/wdk-gasless\");\n const { WdkGaslessClient } = wdkGasless;\n\n spinner.text = \"Initializing gasless client...\";\n const client = await WdkGaslessClient.create({\n seedPhrase,\n chain: network.replace(\"eip155:\", \"\"),\n });\n\n spinner.text = \"Sending gasless payment...\";\n const result = await client.pay({\n to,\n amount: parseAmount(amount),\n });\n\n spinner.succeed(\"Payment sent!\");\n console.log();\n printSuccess(\"Transaction submitted\");\n console.log(` User Operation Hash: ${chalk.cyan(result.userOpHash)}`);\n if (result.txHash) {\n console.log(` Transaction Hash: ${chalk.cyan(result.txHash)}`);\n }\n } else {\n // Standard payment\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const wdk: any = await import(\"@t402/wdk\");\n const { createPaymentProcessor } = wdk;\n\n spinner.text = \"Initializing wallet...\";\n const processor = createPaymentProcessor({ seedPhrase });\n await processor.initialize();\n\n spinner.text = \"Sending payment...\";\n const txHash = await processor.pay({\n network,\n asset: options.asset,\n to,\n amount: parseAmount(amount),\n });\n\n spinner.succeed(\"Payment sent!\");\n console.log();\n printSuccess(\"Transaction submitted\");\n console.log(` Transaction Hash: ${chalk.cyan(txHash)}`);\n }\n } catch (error) {\n printError(`Payment failed: ${error instanceof Error ? error.message : error}`);\n }\n },\n );\n\n // pay-invoice command (pay a 402 response)\n program\n .command(\"pay-invoice\")\n .description(\"Pay a 402 Payment Required response\")\n .argument(\"<url>\", \"URL that returned 402\")\n .option(\"-g, --gasless\", \"Use gasless transaction (ERC-4337)\")\n .option(\"-i, --index <index>\", \"Payment option index (if multiple)\", \"0\")\n .action(async (url: string, options: { gasless?: boolean; index: string }) => {\n if (!isValidUrl(url)) {\n printError(\"Invalid URL format\");\n return;\n }\n\n const encrypted = getEncryptedSeed();\n if (!encrypted) {\n printError(\"No wallet configured. Run 'wallet create' or 'wallet import' first.\");\n return;\n }\n\n try {\n const spinner = createSpinner(\"Fetching payment requirements...\").start();\n\n // Fetch the 402 response\n const response = await fetch(url);\n if (response.status !== 402) {\n spinner.fail(`Expected 402 status, got ${response.status}`);\n return;\n }\n\n const paymentRequired = (await response.json()) as {\n accepts?: Array<{\n network: string;\n asset?: string;\n amount: string;\n payTo: string;\n }>;\n resource?: { description?: string };\n };\n if (!paymentRequired.accepts || !Array.isArray(paymentRequired.accepts)) {\n spinner.fail(\"Invalid 402 response format\");\n return;\n }\n\n const index = parseInt(options.index, 10);\n const requirement = paymentRequired.accepts[index];\n if (!requirement) {\n spinner.fail(`No payment option at index ${index}`);\n return;\n }\n\n spinner.succeed(\"Payment requirements fetched\");\n\n printHeader(\"Payment Requirements\");\n printTable({\n Resource: paymentRequired.resource?.description || url,\n Amount: `${formatAmount(requirement.amount)} ${requirement.asset?.toUpperCase() || \"USDT\"}`,\n Network: getNetworkName(requirement.network),\n Recipient: formatAddress(requirement.payTo),\n });\n console.log();\n\n const seedPhrase = decryptSeed(encrypted, MACHINE_KEY);\n const paySpinner = createSpinner(\"Processing payment...\").start();\n\n if (options.gasless) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const wdkGasless: any = await import(\"@t402/wdk-gasless\");\n const { WdkGaslessClient } = wdkGasless;\n\n paySpinner.text = \"Initializing gasless client...\";\n const client = await WdkGaslessClient.create({\n seedPhrase,\n chain: requirement.network.replace(\"eip155:\", \"\"),\n });\n\n paySpinner.text = \"Sending gasless payment...\";\n const result = await client.pay({\n to: requirement.payTo,\n amount: requirement.amount,\n });\n\n paySpinner.succeed(\"Payment sent!\");\n console.log();\n printSuccess(\"Payment completed\");\n console.log(` User Operation Hash: ${chalk.cyan(result.userOpHash)}`);\n\n // Retry the original request with payment header\n console.log();\n const retrySpinner = createSpinner(\"Retrying request with payment...\").start();\n\n const retryResponse = await fetch(url, {\n headers: {\n \"X-Payment\": result.userOpHash,\n },\n });\n\n if (retryResponse.ok) {\n retrySpinner.succeed(\"Request successful!\");\n console.log(` Status: ${chalk.green(retryResponse.status)}`);\n } else {\n retrySpinner.warn(`Request returned ${retryResponse.status}`);\n }\n } else {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const wdk: any = await import(\"@t402/wdk\");\n const { createPaymentProcessor } = wdk;\n\n paySpinner.text = \"Initializing wallet...\";\n const processor = createPaymentProcessor({ seedPhrase });\n await processor.initialize();\n\n paySpinner.text = \"Sending payment...\";\n const txHash = await processor.pay({\n network: requirement.network,\n asset: requirement.asset || \"usdt\",\n to: requirement.payTo,\n amount: requirement.amount,\n });\n\n paySpinner.succeed(\"Payment sent!\");\n console.log();\n printSuccess(\"Payment completed\");\n console.log(` Transaction Hash: ${chalk.cyan(txHash)}`);\n }\n } catch (error) {\n printError(`Failed to pay invoice: ${error instanceof Error ? error.message : error}`);\n }\n });\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { getEncryptedSeed, getConfig } from \"../config/index.js\";\nimport {\n createSpinner,\n formatAddress,\n formatAmount,\n printSuccess,\n printError,\n printWarning,\n printHeader,\n printTable,\n decryptSeed,\n getNetworkName,\n isValidUrl,\n} from \"../utils/index.js\";\nimport { VERSION } from \"../version.js\";\n\n// Machine ID for basic encryption key\nconst MACHINE_KEY = `t402-cli-${process.env.USER || \"default\"}`;\n\n/**\n * Register the request command\n */\nexport function registerRequestCommand(program: Command): void {\n program\n .command(\"request\")\n .description(\"Make an HTTP request with automatic 402 payment handling\")\n .argument(\"<url>\", \"URL to request\")\n .option(\"-X, --method <method>\", \"HTTP method\", \"GET\")\n .option(\"-H, --header <header...>\", \"Additional headers (key:value)\")\n .option(\"-d, --data <data>\", \"Request body data\")\n .option(\"-g, --gasless\", \"Use gasless payments (ERC-4337)\")\n .option(\"-n, --network <network>\", \"Preferred network for payment\")\n .option(\"-o, --output <file>\", \"Save response to file\")\n .option(\"-v, --verbose\", \"Show detailed output\")\n .option(\"--dry-run\", \"Show what would be paid without executing\")\n .action(\n async (\n url: string,\n options: {\n method: string;\n header?: string[];\n data?: string;\n gasless?: boolean;\n network?: string;\n output?: string;\n verbose?: boolean;\n dryRun?: boolean;\n },\n ) => {\n if (!isValidUrl(url)) {\n printError(\"Invalid URL format\");\n return;\n }\n\n const encrypted = getEncryptedSeed();\n if (!encrypted && !options.dryRun) {\n printError(\"No wallet configured. Run 'wallet create' or 'wallet import' first.\");\n return;\n }\n\n // Build request options\n const headers: Record<string, string> = {\n \"User-Agent\": `t402-cli/${VERSION}`,\n };\n\n if (options.header) {\n for (const h of options.header) {\n const [key, ...valueParts] = h.split(\":\");\n if (key && valueParts.length > 0) {\n headers[key.trim()] = valueParts.join(\":\").trim();\n }\n }\n }\n\n const fetchOptions: RequestInit = {\n method: options.method,\n headers,\n };\n\n if (options.data) {\n fetchOptions.body = options.data;\n if (!headers[\"Content-Type\"]) {\n headers[\"Content-Type\"] = \"application/json\";\n }\n }\n\n try {\n const spinner = createSpinner(`${options.method} ${url}`).start();\n\n // Make initial request\n const response = await fetch(url, fetchOptions);\n\n if (response.status === 402) {\n spinner.info(\"Payment required (402)\");\n\n // Parse 402 response\n const paymentRequired = (await response.json()) as {\n accepts?: Array<{\n network: string;\n asset?: string;\n amount: string;\n payTo: string;\n }>;\n resource?: { description?: string };\n };\n if (!paymentRequired.accepts || !Array.isArray(paymentRequired.accepts)) {\n printError(\"Invalid 402 response format\");\n return;\n }\n\n // Select payment option\n const preferredNetwork = options.network || getConfig(\"defaultNetwork\");\n let requirement = paymentRequired.accepts.find(\n (r) => r.network === preferredNetwork,\n );\n if (!requirement) {\n requirement = paymentRequired.accepts[0];\n }\n\n printHeader(\"Payment Required\");\n printTable({\n Resource: paymentRequired.resource?.description || url,\n Amount: `${formatAmount(requirement.amount)} ${requirement.asset?.toUpperCase() || \"USDT\"}`,\n Network: getNetworkName(requirement.network),\n Recipient: formatAddress(requirement.payTo),\n });\n console.log();\n\n if (options.dryRun) {\n printWarning(\"Dry run - no payment executed\");\n return;\n }\n\n if (!encrypted) {\n printError(\"No wallet configured.\");\n return;\n }\n\n const seedPhrase = decryptSeed(encrypted, MACHINE_KEY);\n const paySpinner = createSpinner(\"Processing payment...\").start();\n\n let paymentProof: string;\n\n if (options.gasless) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const wdkGasless: any = await import(\"@t402/wdk-gasless\");\n const { WdkGaslessClient } = wdkGasless;\n\n paySpinner.text = \"Initializing gasless client...\";\n const client = await WdkGaslessClient.create({\n seedPhrase,\n chain: requirement.network.replace(\"eip155:\", \"\"),\n });\n\n paySpinner.text = \"Sending gasless payment...\";\n const result = await client.pay({\n to: requirement.payTo,\n amount: requirement.amount,\n });\n\n paymentProof = result.userOpHash;\n paySpinner.succeed(\"Gasless payment sent\");\n\n if (options.verbose) {\n console.log(` User Operation Hash: ${chalk.cyan(result.userOpHash)}`);\n }\n } else {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const wdk: any = await import(\"@t402/wdk\");\n const { createPaymentProcessor } = wdk;\n\n paySpinner.text = \"Initializing wallet...\";\n const processor = createPaymentProcessor({ seedPhrase });\n await processor.initialize();\n\n paySpinner.text = \"Sending payment...\";\n const txHash = await processor.pay({\n network: requirement.network,\n asset: requirement.asset || \"usdt\",\n to: requirement.payTo,\n amount: requirement.amount,\n });\n\n paymentProof = txHash;\n paySpinner.succeed(\"Payment sent\");\n\n if (options.verbose) {\n console.log(` Transaction Hash: ${chalk.cyan(txHash)}`);\n }\n }\n\n // Retry with payment header\n console.log();\n const retrySpinner = createSpinner(\"Retrying request with payment proof...\").start();\n\n const retryResponse = await fetch(url, {\n ...fetchOptions,\n headers: {\n ...headers,\n \"X-Payment\": paymentProof,\n },\n });\n\n if (retryResponse.ok) {\n retrySpinner.succeed(`${retryResponse.status} ${retryResponse.statusText}`);\n await handleResponse(retryResponse, options);\n } else if (retryResponse.status === 402) {\n retrySpinner.fail(\"Payment not accepted - still requires payment\");\n printError(\"The server did not accept the payment proof.\");\n } else {\n retrySpinner.warn(`${retryResponse.status} ${retryResponse.statusText}`);\n await handleResponse(retryResponse, options);\n }\n } else if (response.ok) {\n spinner.succeed(`${response.status} ${response.statusText}`);\n await handleResponse(response, options);\n } else {\n spinner.fail(`${response.status} ${response.statusText}`);\n await handleResponse(response, options);\n }\n } catch (error) {\n printError(`Request failed: ${error instanceof Error ? error.message : error}`);\n }\n },\n );\n}\n\n/**\n * Handle and display response\n */\nasync function handleResponse(\n response: Response,\n options: { output?: string; verbose?: boolean },\n): Promise<void> {\n const contentType = response.headers.get(\"content-type\") || \"\";\n\n if (options.verbose) {\n console.log();\n console.log(chalk.gray(\"Response Headers:\"));\n response.headers.forEach((value, key) => {\n console.log(chalk.gray(` ${key}: ${value}`));\n });\n console.log();\n }\n\n if (options.output) {\n const { writeFile } = await import(\"fs/promises\");\n const buffer = await response.arrayBuffer();\n await writeFile(options.output, Buffer.from(buffer));\n printSuccess(`Response saved to ${options.output}`);\n } else if (contentType.includes(\"application/json\")) {\n const json = await response.json();\n console.log();\n console.log(JSON.stringify(json, null, 2));\n } else if (contentType.includes(\"text/\")) {\n const text = await response.text();\n console.log();\n console.log(text);\n } else {\n const size = response.headers.get(\"content-length\") || \"unknown\";\n console.log();\n console.log(chalk.gray(`Binary response (${size} bytes)`));\n console.log(chalk.gray(\"Use --output to save to file\"));\n }\n}\n","// Version is injected at build time or read from package.json\n// Using a simple constant that gets updated during release\nexport const VERSION = \"2.0.0\";\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport {\n getConfig,\n setConfig,\n getAllConfig,\n resetConfig,\n getConfigPath,\n setRpcEndpoint,\n} from \"../config/index.js\";\nimport {\n printSuccess,\n printError,\n printWarning,\n printHeader,\n printTable,\n getNetworkName,\n isValidUrl,\n} from \"../utils/index.js\";\nimport type { CliConfig } from \"../types.js\";\n\n/**\n * Register configuration commands\n */\nexport function registerConfigCommands(program: Command): void {\n const config = program.command(\"config\").description(\"Configuration management\");\n\n // config show\n config\n .command(\"show\")\n .description(\"Show current configuration\")\n .action(() => {\n const cfg = getAllConfig();\n\n printHeader(\"T402 CLI Configuration\");\n\n const displayConfig: Record<string, string> = {\n \"Default Network\": getNetworkName(cfg.defaultNetwork),\n \"Network ID\": cfg.defaultNetwork,\n \"Facilitator URL\": cfg.facilitatorUrl,\n \"Testnet Mode\": cfg.testnet ? chalk.yellow(\"Yes\") : \"No\",\n \"Wallet Configured\": cfg.encryptedSeed ? chalk.green(\"Yes\") : chalk.gray(\"No\"),\n \"Config File\": getConfigPath(),\n };\n\n printTable(displayConfig);\n\n // Show custom RPC endpoints if any\n const endpoints = cfg.rpcEndpoints;\n if (Object.keys(endpoints).length > 0) {\n console.log();\n console.log(chalk.bold(\"Custom RPC Endpoints:\"));\n for (const [network, url] of Object.entries(endpoints)) {\n console.log(` ${getNetworkName(network)}: ${url}`);\n }\n }\n });\n\n // config get\n config\n .command(\"get\")\n .description(\"Get a configuration value\")\n .argument(\"<key>\", \"Configuration key (defaultNetwork, facilitatorUrl, testnet)\")\n .action((key: string) => {\n const validKeys = [\"defaultNetwork\", \"facilitatorUrl\", \"testnet\", \"rpcEndpoints\"];\n if (!validKeys.includes(key)) {\n printError(`Invalid key. Valid keys: ${validKeys.join(\", \")}`);\n return;\n }\n\n const value = getConfig(key as keyof CliConfig);\n if (typeof value === \"object\") {\n console.log(JSON.stringify(value, null, 2));\n } else {\n console.log(value);\n }\n });\n\n // config set\n config\n .command(\"set\")\n .description(\"Set a configuration value\")\n .argument(\"<key>\", \"Configuration key\")\n .argument(\"<value>\", \"Value to set\")\n .action((key: string, value: string) => {\n switch (key) {\n case \"defaultNetwork\":\n setConfig(\"defaultNetwork\", value);\n printSuccess(`Default network set to ${getNetworkName(value)}`);\n break;\n\n case \"facilitatorUrl\":\n if (!isValidUrl(value)) {\n printError(\"Invalid URL format\");\n return;\n }\n setConfig(\"facilitatorUrl\", value);\n printSuccess(`Facilitator URL set to ${value}`);\n break;\n\n case \"testnet\": {\n const isTestnet = value.toLowerCase() === \"true\" || value === \"1\";\n setConfig(\"testnet\", isTestnet);\n printSuccess(`Testnet mode ${isTestnet ? \"enabled\" : \"disabled\"}`);\n\n // Suggest appropriate default network\n if (isTestnet) {\n setConfig(\"defaultNetwork\", \"eip155:84532\");\n console.log(chalk.gray(\" Default network changed to Base Sepolia\"));\n } else {\n setConfig(\"defaultNetwork\", \"eip155:8453\");\n console.log(chalk.gray(\" Default network changed to Base\"));\n }\n break;\n }\n\n default:\n printError(\n `Unknown key: ${key}. Valid keys: defaultNetwork, facilitatorUrl, testnet`,\n );\n }\n });\n\n // config rpc\n config\n .command(\"rpc\")\n .description(\"Set custom RPC endpoint for a network\")\n .argument(\"<network>\", \"Network ID (e.g., eip155:8453)\")\n .argument(\"<url>\", \"RPC endpoint URL\")\n .action((network: string, url: string) => {\n if (!isValidUrl(url)) {\n printError(\"Invalid URL format\");\n return;\n }\n\n setRpcEndpoint(network, url);\n printSuccess(`RPC endpoint set for ${getNetworkName(network)}`);\n });\n\n // config reset\n config\n .command(\"reset\")\n .description(\"Reset configuration to defaults\")\n .option(\"-f, --force\", \"Skip confirmation\")\n .action((options: { force?: boolean }) => {\n if (!options.force) {\n printWarning(\"This will reset all configuration to defaults.\");\n printWarning(\"Your wallet will NOT be removed.\");\n console.log();\n console.log(\"Run with --force to confirm.\");\n return;\n }\n\n // Preserve wallet\n const cfg = getAllConfig();\n const encryptedSeed = cfg.encryptedSeed;\n\n resetConfig();\n\n // Restore wallet if it existed\n if (encryptedSeed) {\n setConfig(\"encryptedSeed\", encryptedSeed);\n }\n\n printSuccess(\"Configuration reset to defaults\");\n });\n\n // config path\n config\n .command(\"path\")\n .description(\"Show configuration file path\")\n .action(() => {\n console.log(getConfigPath());\n });\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { getConfig } from \"../config/index.js\";\nimport { printHeader } from \"../utils/index.js\";\nimport { NETWORKS } from \"../types.js\";\nimport { VERSION } from \"../version.js\";\n\n/**\n * Register info command\n */\nexport function registerInfoCommand(program: Command): void {\n program\n .command(\"info\")\n .description(\"Show supported networks and assets\")\n .option(\"-a, --all\", \"Show all networks (mainnet and testnet)\")\n .option(\"-t, --testnet\", \"Show testnet networks only\")\n .action((options: { all?: boolean; testnet?: boolean }) => {\n const showTestnet = options.testnet || getConfig(\"testnet\");\n const showAll = options.all;\n\n printHeader(\"T402 Payment Protocol\");\n\n console.log(` Version: ${VERSION}`);\n console.log(\" Facilitator: \" + chalk.cyan(getConfig(\"facilitatorUrl\")));\n console.log();\n\n // Supported Networks\n console.log(chalk.bold(\"Supported Networks:\"));\n console.log();\n\n // EVM Networks\n const evmMainnets = NETWORKS.filter((n) => n.type === \"evm\" && !n.testnet);\n const evmTestnets = NETWORKS.filter((n) => n.type === \"evm\" && n.testnet);\n\n if (showAll || !showTestnet) {\n console.log(chalk.underline(\" EVM (Mainnet):\"));\n for (const network of evmMainnets) {\n console.log(\n ` ${chalk.green(\"●\")} ${network.name.padEnd(16)} ${chalk.gray(network.id)}`,\n );\n }\n console.log();\n }\n\n if (showAll || showTestnet) {\n console.log(chalk.underline(\" EVM (Testnet):\"));\n for (const network of evmTestnets) {\n console.log(\n ` ${chalk.yellow(\"●\")} ${network.name.padEnd(16)} ${chalk.gray(network.id)}`,\n );\n }\n console.log();\n }\n\n // Solana\n const solanaNetworks = NETWORKS.filter(\n (n) => n.type === \"solana\" && (showAll || n.testnet === showTestnet),\n );\n if (solanaNetworks.length > 0) {\n console.log(chalk.underline(\" Solana:\"));\n for (const network of solanaNetworks) {\n const color = network.testnet ? chalk.yellow : chalk.green;\n console.log(` ${color(\"●\")} ${network.name.padEnd(16)} ${chalk.gray(network.id)}`);\n }\n console.log();\n }\n\n // TON\n const tonNetworks = NETWORKS.filter(\n (n) => n.type === \"ton\" && (showAll || n.testnet === showTestnet),\n );\n if (tonNetworks.length > 0) {\n console.log(chalk.underline(\" TON:\"));\n for (const network of tonNetworks) {\n const color = network.testnet ? chalk.yellow : chalk.green;\n console.log(` ${color(\"●\")} ${network.name.padEnd(16)} ${chalk.gray(network.id)}`);\n }\n console.log();\n }\n\n // TRON\n const tronNetworks = NETWORKS.filter(\n (n) => n.type === \"tron\" && (showAll || n.testnet === showTestnet),\n );\n if (tronNetworks.length > 0) {\n console.log(chalk.underline(\" TRON:\"));\n for (const network of tronNetworks) {\n const color = network.testnet ? chalk.yellow : chalk.green;\n console.log(` ${color(\"●\")} ${network.name.padEnd(16)} ${chalk.gray(network.id)}`);\n }\n console.log();\n }\n\n // Supported Assets\n console.log(chalk.bold(\"Supported Assets:\"));\n console.log();\n console.log(` ${chalk.cyan(\"USDT0\")} - Tether USD (OFT) on EVM chains`);\n console.log(` ${chalk.cyan(\"USDT\")} - Tether USD on all chains`);\n console.log();\n\n // Payment Schemes\n console.log(chalk.bold(\"Payment Schemes:\"));\n console.log();\n console.log(` ${chalk.magenta(\"exact\")} - Exact amount payment (default)`);\n console.log(` ${chalk.magenta(\"upto\")} - Payment up to specified amount`);\n console.log();\n\n // Features\n console.log(chalk.bold(\"Features:\"));\n console.log();\n console.log(` ${chalk.green(\"✓\")} Standard payments (all chains)`);\n console.log(` ${chalk.green(\"✓\")} Gasless payments via ERC-4337 (EVM chains)`);\n console.log(` ${chalk.green(\"✓\")} Cross-chain bridging via LayerZero`);\n console.log(` ${chalk.green(\"✓\")} WDK wallet integration`);\n console.log();\n\n // Legend\n console.log(chalk.gray(\"Legend:\"));\n console.log(chalk.gray(` ${chalk.green(\"●\")} Mainnet ${chalk.yellow(\"●\")} Testnet`));\n });\n\n // version command (alias)\n program\n .command(\"version\")\n .description(\"Show CLI version\")\n .action(() => {\n console.log(`t402 CLI v${VERSION}`);\n });\n}\n"],"mappings":"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","names":["import_chalk","Conf","ora","chalk","chalk","import_chalk","MACHINE_KEY","chalk","import_chalk","MACHINE_KEY","chalk","import_chalk","config","chalk","import_chalk","chalk"]}
package/dist/esm/bin.js CHANGED
@@ -2,7 +2,7 @@
2
2
  #!/usr/bin/env node
3
3
  import {
4
4
  runCli
5
- } from "./chunk-2A2UCRTK.js";
5
+ } from "./chunk-KXVLGPES.js";
6
6
 
7
7
  // src/bin.ts
8
8
  runCli().catch((error) => {
@@ -765,7 +765,7 @@ function registerConfigCommands(program) {
765
765
  setConfig("facilitatorUrl", value);
766
766
  printSuccess(`Facilitator URL set to ${value}`);
767
767
  break;
768
- case "testnet":
768
+ case "testnet": {
769
769
  const isTestnet = value.toLowerCase() === "true" || value === "1";
770
770
  setConfig("testnet", isTestnet);
771
771
  printSuccess(`Testnet mode ${isTestnet ? "enabled" : "disabled"}`);
@@ -777,6 +777,7 @@ function registerConfigCommands(program) {
777
777
  console.log(chalk5.gray(" Default network changed to Base"));
778
778
  }
779
779
  break;
780
+ }
780
781
  default:
781
782
  printError(
782
783
  `Unknown key: ${key}. Valid keys: defaultNetwork, facilitatorUrl, testnet`
@@ -949,4 +950,4 @@ export {
949
950
  createCli,
950
951
  runCli
951
952
  };
952
- //# sourceMappingURL=chunk-2A2UCRTK.js.map
953
+ //# sourceMappingURL=chunk-KXVLGPES.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/types.ts","../../src/config/index.ts","../../src/utils/index.ts","../../src/cli.ts","../../src/commands/wallet.ts","../../src/commands/pay.ts","../../src/commands/request.ts","../../src/version.ts","../../src/commands/config.ts","../../src/commands/info.ts"],"sourcesContent":["/**\n * CLI configuration stored in user config file\n */\nexport interface CliConfig {\n /** Default network to use */\n defaultNetwork: string;\n /** Facilitator URL */\n facilitatorUrl: string;\n /** Whether to use testnet networks */\n testnet: boolean;\n /** Encrypted seed phrase (optional) */\n encryptedSeed?: string;\n /** Custom RPC endpoints by network */\n rpcEndpoints: Record<string, string>;\n}\n\n/**\n * Wallet information\n */\nexport interface WalletInfo {\n /** Wallet addresses by network type */\n addresses: {\n evm?: string;\n solana?: string;\n ton?: string;\n tron?: string;\n };\n /** Whether the wallet has a seed configured */\n hasSeed: boolean;\n}\n\n/**\n * Balance result for a specific network\n */\nexport interface BalanceResult {\n network: string;\n asset: string;\n balance: string;\n formatted: string;\n address: string;\n}\n\n/**\n * Payment result\n */\nexport interface PaymentResult {\n success: boolean;\n txHash?: string;\n network?: string;\n amount?: string;\n error?: string;\n}\n\n/**\n * Supported network information\n */\nexport interface NetworkInfo {\n id: string;\n name: string;\n type: \"evm\" | \"solana\" | \"ton\" | \"tron\";\n testnet: boolean;\n assets: string[];\n}\n\n/**\n * Default configuration values\n */\nexport const DEFAULT_CONFIG: CliConfig = {\n defaultNetwork: \"eip155:8453\",\n facilitatorUrl: \"https://facilitator.t402.io\",\n testnet: false,\n rpcEndpoints: {},\n};\n\n/**\n * Supported networks\n */\nexport const NETWORKS: NetworkInfo[] = [\n // EVM Mainnets\n { id: \"eip155:1\", name: \"Ethereum\", type: \"evm\", testnet: false, assets: [\"usdt\", \"usdt0\"] },\n { id: \"eip155:42161\", name: \"Arbitrum\", type: \"evm\", testnet: false, assets: [\"usdt0\"] },\n { id: \"eip155:8453\", name: \"Base\", type: \"evm\", testnet: false, assets: [\"usdt0\"] },\n { id: \"eip155:10\", name: \"Optimism\", type: \"evm\", testnet: false, assets: [\"usdt0\"] },\n { id: \"eip155:57073\", name: \"Ink\", type: \"evm\", testnet: false, assets: [\"usdt0\"] },\n { id: \"eip155:80094\", name: \"Berachain\", type: \"evm\", testnet: false, assets: [\"usdt0\"] },\n // EVM Testnets\n { id: \"eip155:11155111\", name: \"Sepolia\", type: \"evm\", testnet: true, assets: [\"usdt0\"] },\n { id: \"eip155:421614\", name: \"Arbitrum Sepolia\", type: \"evm\", testnet: true, assets: [\"usdt0\"] },\n { id: \"eip155:84532\", name: \"Base Sepolia\", type: \"evm\", testnet: true, assets: [\"usdt0\"] },\n // Solana\n {\n id: \"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp\",\n name: \"Solana\",\n type: \"solana\",\n testnet: false,\n assets: [\"usdt\"],\n },\n {\n id: \"solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1\",\n name: \"Solana Devnet\",\n type: \"solana\",\n testnet: true,\n assets: [\"usdt\"],\n },\n // TON\n { id: \"ton:-239\", name: \"TON\", type: \"ton\", testnet: false, assets: [\"usdt\"] },\n { id: \"ton:-3\", name: \"TON Testnet\", type: \"ton\", testnet: true, assets: [\"usdt\"] },\n // TRON\n { id: \"tron:mainnet\", name: \"TRON\", type: \"tron\", testnet: false, assets: [\"usdt\"] },\n { id: \"tron:nile\", name: \"TRON Nile\", type: \"tron\", testnet: true, assets: [\"usdt\"] },\n];\n","import Conf from \"conf\";\nimport type { CliConfig } from \"../types.js\";\nimport { DEFAULT_CONFIG } from \"../types.js\";\n\n/**\n * Configuration store for t402 CLI\n */\nconst config = new Conf<CliConfig>({\n projectName: \"t402\",\n defaults: DEFAULT_CONFIG,\n});\n\n/**\n * Get a configuration value\n */\nexport function getConfig<K extends keyof CliConfig>(key: K): CliConfig[K] {\n return config.get(key);\n}\n\n/**\n * Set a configuration value\n */\nexport function setConfig<K extends keyof CliConfig>(key: K, value: CliConfig[K]): void {\n config.set(key, value);\n}\n\n/**\n * Get all configuration values\n */\nexport function getAllConfig(): CliConfig {\n return config.store;\n}\n\n/**\n * Reset configuration to defaults\n */\nexport function resetConfig(): void {\n config.clear();\n}\n\n/**\n * Get the path to the configuration file\n */\nexport function getConfigPath(): string {\n return config.path;\n}\n\n/**\n * Check if a seed phrase is configured\n */\nexport function hasSeedConfigured(): boolean {\n return !!config.get(\"encryptedSeed\");\n}\n\n/**\n * Store encrypted seed phrase\n */\nexport function storeSeed(encryptedSeed: string): void {\n config.set(\"encryptedSeed\", encryptedSeed);\n}\n\n/**\n * Get encrypted seed phrase\n */\nexport function getEncryptedSeed(): string | undefined {\n return config.get(\"encryptedSeed\");\n}\n\n/**\n * Clear stored seed phrase\n */\nexport function clearSeed(): void {\n config.delete(\"encryptedSeed\");\n}\n\n/**\n * Set custom RPC endpoint for a network\n */\nexport function setRpcEndpoint(network: string, url: string): void {\n const endpoints = config.get(\"rpcEndpoints\");\n config.set(\"rpcEndpoints\", { ...endpoints, [network]: url });\n}\n\n/**\n * Get RPC endpoint for a network\n */\nexport function getRpcEndpoint(network: string): string | undefined {\n return config.get(\"rpcEndpoints\")[network];\n}\n\nexport { config };\n","import chalk from \"chalk\";\nimport ora, { type Ora } from \"ora\";\nimport type { BalanceResult, NetworkInfo, PaymentResult } from \"../types.js\";\nimport { NETWORKS } from \"../types.js\";\n\n/**\n * Create a spinner with consistent styling\n */\nexport function createSpinner(text: string): Ora {\n return ora({\n text,\n color: \"cyan\",\n });\n}\n\n/**\n * Format an address for display (truncated)\n */\nexport function formatAddress(address: string, startChars = 6, endChars = 4): string {\n if (address.length <= startChars + endChars + 3) {\n return address;\n }\n return `${address.slice(0, startChars)}...${address.slice(-endChars)}`;\n}\n\n/**\n * Format a token amount with decimals\n */\nexport function formatAmount(amount: string, decimals = 6): string {\n const value = BigInt(amount);\n const divisor = BigInt(10 ** decimals);\n const whole = value / divisor;\n const fraction = value % divisor;\n\n if (fraction === 0n) {\n return whole.toString();\n }\n\n const fractionStr = fraction.toString().padStart(decimals, \"0\").replace(/0+$/, \"\");\n return `${whole}.${fractionStr}`;\n}\n\n/**\n * Format balance result for display\n */\nexport function formatBalanceResult(result: BalanceResult): string {\n const network = getNetworkInfo(result.network);\n const networkName = network?.name || result.network;\n const assetName = result.asset.toUpperCase();\n\n return `${chalk.bold(networkName)}: ${chalk.green(result.formatted)} ${assetName}`;\n}\n\n/**\n * Format payment result for display\n */\nexport function formatPaymentResult(result: PaymentResult): string {\n if (result.success) {\n const lines = [chalk.green(\"✓ Payment successful!\")];\n if (result.txHash) {\n lines.push(` Transaction: ${chalk.cyan(result.txHash)}`);\n }\n if (result.network) {\n const network = getNetworkInfo(result.network);\n lines.push(` Network: ${network?.name || result.network}`);\n }\n if (result.amount) {\n lines.push(` Amount: ${result.amount}`);\n }\n return lines.join(\"\\n\");\n } else {\n return chalk.red(`✗ Payment failed: ${result.error || \"Unknown error\"}`);\n }\n}\n\n/**\n * Get network info by ID\n */\nexport function getNetworkInfo(networkId: string): NetworkInfo | undefined {\n return NETWORKS.find((n) => n.id === networkId);\n}\n\n/**\n * Get network display name\n */\nexport function getNetworkName(networkId: string): string {\n const network = getNetworkInfo(networkId);\n return network?.name || networkId;\n}\n\n/**\n * Filter networks by testnet mode\n */\nexport function getAvailableNetworks(testnet: boolean): NetworkInfo[] {\n return NETWORKS.filter((n) => n.testnet === testnet);\n}\n\n/**\n * Print a table of key-value pairs\n */\nexport function printTable(data: Record<string, string>): void {\n const maxKeyLength = Math.max(...Object.keys(data).map((k) => k.length));\n\n for (const [key, value] of Object.entries(data)) {\n const paddedKey = key.padEnd(maxKeyLength);\n console.log(` ${chalk.gray(paddedKey)} ${value}`);\n }\n}\n\n/**\n * Print a success message\n */\nexport function printSuccess(message: string): void {\n console.log(chalk.green(`✓ ${message}`));\n}\n\n/**\n * Print an error message\n */\nexport function printError(message: string): void {\n console.error(chalk.red(`✗ ${message}`));\n}\n\n/**\n * Print a warning message\n */\nexport function printWarning(message: string): void {\n console.log(chalk.yellow(`⚠ ${message}`));\n}\n\n/**\n * Print an info message\n */\nexport function printInfo(message: string): void {\n console.log(chalk.cyan(`ℹ ${message}`));\n}\n\n/**\n * Print a header\n */\nexport function printHeader(title: string): void {\n console.log();\n console.log(chalk.bold.underline(title));\n console.log();\n}\n\n/**\n * Validate a seed phrase (basic check)\n */\nexport function isValidSeedPhrase(phrase: string): boolean {\n const words = phrase.trim().split(/\\s+/);\n return words.length === 12 || words.length === 24;\n}\n\n/**\n * Simple XOR encryption for seed storage\n * Note: This is basic obfuscation, not secure encryption.\n * For production, use proper encryption with a password.\n */\nexport function encryptSeed(seed: string, key: string): string {\n const seedBytes = Buffer.from(seed, \"utf8\");\n const keyBytes = Buffer.from(key, \"utf8\");\n const encrypted = Buffer.alloc(seedBytes.length);\n\n for (let i = 0; i < seedBytes.length; i++) {\n encrypted[i] = seedBytes[i] ^ keyBytes[i % keyBytes.length];\n }\n\n return encrypted.toString(\"base64\");\n}\n\n/**\n * Decrypt seed phrase\n */\nexport function decryptSeed(encrypted: string, key: string): string {\n const encryptedBytes = Buffer.from(encrypted, \"base64\");\n const keyBytes = Buffer.from(key, \"utf8\");\n const decrypted = Buffer.alloc(encryptedBytes.length);\n\n for (let i = 0; i < encryptedBytes.length; i++) {\n decrypted[i] = encryptedBytes[i] ^ keyBytes[i % keyBytes.length];\n }\n\n return decrypted.toString(\"utf8\");\n}\n\n/**\n * Parse amount string to smallest units\n */\nexport function parseAmount(amount: string, decimals = 6): string {\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) * BigInt(10 ** decimals) + BigInt(fraction)).toString();\n}\n\n/**\n * Validate URL format\n */\nexport function isValidUrl(url: string): boolean {\n try {\n new URL(url);\n return true;\n } catch {\n return false;\n }\n}\n","import { Command } from \"commander\";\nimport { registerWalletCommands } from \"./commands/wallet.js\";\nimport { registerPayCommands } from \"./commands/pay.js\";\nimport { registerRequestCommand } from \"./commands/request.js\";\nimport { registerConfigCommands } from \"./commands/config.js\";\nimport { registerInfoCommand } from \"./commands/info.js\";\nimport { VERSION } from \"./version.js\";\n\n/**\n * Create and configure the CLI program\n */\nexport function createCli(): Command {\n const program = new Command();\n\n program\n .name(\"t402\")\n .description(\"Command-line interface for the T402 payment protocol\")\n .version(VERSION);\n\n // Register command groups\n registerWalletCommands(program);\n registerPayCommands(program);\n registerRequestCommand(program);\n registerConfigCommands(program);\n registerInfoCommand(program);\n\n return program;\n}\n\n/**\n * Run the CLI\n */\nexport async function runCli(args: string[] = process.argv): Promise<void> {\n const program = createCli();\n await program.parseAsync(args);\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport {\n hasSeedConfigured,\n storeSeed,\n getEncryptedSeed,\n clearSeed,\n getConfig,\n} from \"../config/index.js\";\nimport {\n createSpinner,\n formatAmount,\n printSuccess,\n printError,\n printWarning,\n printHeader,\n printTable,\n isValidSeedPhrase,\n encryptSeed,\n decryptSeed,\n getNetworkName,\n} from \"../utils/index.js\";\n\n// Machine ID for basic encryption key\nconst MACHINE_KEY = `t402-cli-${process.env.USER || \"default\"}`;\n\n/**\n * Register wallet-related commands\n */\nexport function registerWalletCommands(program: Command): void {\n const wallet = program.command(\"wallet\").description(\"Wallet management commands\");\n\n // wallet create\n wallet\n .command(\"create\")\n .description(\"Create a new wallet with a generated seed phrase\")\n .action(async () => {\n if (hasSeedConfigured()) {\n printWarning(\"A wallet is already configured. Use 'wallet clear' first to remove it.\");\n return;\n }\n\n try {\n // Use viem for seed phrase generation\n const { generateMnemonic, english } = await import(\"viem/accounts\");\n\n const spinner = createSpinner(\"Generating seed phrase...\").start();\n const mnemonic = generateMnemonic(english);\n spinner.succeed(\"Seed phrase generated\");\n\n console.log();\n console.log(chalk.yellow(\"⚠ IMPORTANT: Write down these words and store them safely!\"));\n console.log(chalk.yellow(\" This is the ONLY way to recover your wallet.\"));\n console.log();\n console.log(chalk.bold(\"Seed phrase:\"));\n console.log();\n console.log(` ${chalk.cyan(mnemonic)}`);\n console.log();\n\n // Store encrypted seed\n const encrypted = encryptSeed(mnemonic, MACHINE_KEY);\n storeSeed(encrypted);\n\n printSuccess(\"Wallet created and saved to config\");\n console.log();\n console.log(\"Run 'wallet show' to see your addresses.\");\n } catch (error) {\n printError(`Failed to create wallet: ${error instanceof Error ? error.message : error}`);\n }\n });\n\n // wallet import\n wallet\n .command(\"import\")\n .description(\"Import an existing wallet from a seed phrase\")\n .argument(\"<seed-phrase>\", \"12 or 24 word seed phrase (in quotes)\")\n .action(async (seedPhrase: string) => {\n if (hasSeedConfigured()) {\n printWarning(\"A wallet is already configured. Use 'wallet clear' first to remove it.\");\n return;\n }\n\n const phrase = seedPhrase.trim();\n if (!isValidSeedPhrase(phrase)) {\n printError(\"Invalid seed phrase. Must be 12 or 24 words.\");\n return;\n }\n\n try {\n // Validate by trying to create an account\n const { mnemonicToAccount } = await import(\"viem/accounts\");\n mnemonicToAccount(phrase); // Throws if invalid\n\n // Store encrypted seed\n const encrypted = encryptSeed(phrase, MACHINE_KEY);\n storeSeed(encrypted);\n\n printSuccess(\"Wallet imported successfully\");\n console.log();\n console.log(\"Run 'wallet show' to see your addresses.\");\n } catch (error) {\n printError(`Failed to import wallet: ${error instanceof Error ? error.message : error}`);\n }\n });\n\n // wallet show\n wallet\n .command(\"show\")\n .description(\"Show wallet addresses\")\n .action(async () => {\n const encrypted = getEncryptedSeed();\n if (!encrypted) {\n printError(\"No wallet configured. Run 'wallet create' or 'wallet import' first.\");\n return;\n }\n\n try {\n const seedPhrase = decryptSeed(encrypted, MACHINE_KEY);\n const { mnemonicToAccount } = await import(\"viem/accounts\");\n\n const spinner = createSpinner(\"Loading wallet...\").start();\n const account = mnemonicToAccount(seedPhrase);\n spinner.succeed(\"Wallet loaded\");\n\n printHeader(\"Wallet Addresses\");\n\n const addresses: Record<string, string> = {\n \"EVM (Ethereum, Arbitrum, Base, etc.)\": account.address,\n };\n\n printTable(addresses);\n\n console.log();\n console.log(chalk.gray(\"Note: Install @t402/wdk for full multi-chain support\"));\n } catch (error) {\n printError(`Failed to load wallet: ${error instanceof Error ? error.message : error}`);\n }\n });\n\n // wallet balance\n wallet\n .command(\"balance\")\n .description(\"Check wallet balances\")\n .option(\"-n, --network <network>\", \"Specific network to check (e.g., eip155:8453)\")\n .option(\"-a, --all\", \"Show all networks including zero balances\")\n .action(async (options: { network?: string; all?: boolean }) => {\n const encrypted = getEncryptedSeed();\n if (!encrypted) {\n printError(\"No wallet configured. Run 'wallet create' or 'wallet import' first.\");\n return;\n }\n\n try {\n const seedPhrase = decryptSeed(encrypted, MACHINE_KEY);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const wdkModule: any = await import(\"@t402/wdk\");\n const { T402WDK } = wdkModule;\n\n const spinner = createSpinner(\"Fetching balances...\").start();\n const testnet = getConfig(\"testnet\");\n\n // Create WDK with appropriate chains\n const chainConfig = testnet\n ? {\n \"arbitrum-sepolia\": \"https://sepolia-rollup.arbitrum.io/rpc\",\n \"base-sepolia\": \"https://sepolia.base.org\",\n }\n : {\n arbitrum: \"https://arb1.arbitrum.io/rpc\",\n base: \"https://mainnet.base.org\",\n };\n\n const wdk = new T402WDK(seedPhrase, chainConfig);\n\n if (options.network) {\n // Single network balance\n const chainName = options.network.replace(\"eip155:\", \"\").replace(\"8453\", \"base\").replace(\"42161\", \"arbitrum\");\n spinner.text = `Fetching balance for ${getNetworkName(options.network)}...`;\n const balance = await wdk.getUsdt0Balance(chainName);\n spinner.succeed(\"Balance fetched\");\n\n printHeader(`Balance on ${getNetworkName(options.network)}`);\n console.log(` ${chalk.green(formatAmount(balance.toString()))} USDT0`);\n } else {\n // All balances\n const balances = await wdk.getAggregatedBalances();\n spinner.succeed(\"Balances fetched\");\n\n printHeader(\"Wallet Balances\");\n console.log(` Total USDT0: ${chalk.green(formatAmount(balances.totalUsdt0.toString()))}`);\n\n if (balances.chains.length > 0) {\n console.log();\n for (const chain of balances.chains) {\n const usdt0 = chain.tokens.find((t: { symbol: string }) => t.symbol === \"USDT0\");\n if (usdt0 && (options.all || usdt0.balance > 0n)) {\n const color = usdt0.balance > 0n ? chalk.green : chalk.gray;\n console.log(` ${chain.chain.padEnd(20)} ${color(formatAmount(usdt0.balance.toString()))} USDT0`);\n }\n }\n }\n }\n } catch (error) {\n printError(`Failed to fetch balances: ${error instanceof Error ? error.message : error}`);\n }\n });\n\n // wallet clear\n wallet\n .command(\"clear\")\n .description(\"Remove wallet from this device\")\n .option(\"-f, --force\", \"Skip confirmation\")\n .action(async (options: { force?: boolean }) => {\n if (!hasSeedConfigured()) {\n printWarning(\"No wallet configured.\");\n return;\n }\n\n if (!options.force) {\n console.log(chalk.yellow(\"⚠ WARNING: This will remove your wallet from this device.\"));\n console.log(chalk.yellow(\" Make sure you have your seed phrase backed up!\"));\n console.log();\n console.log(\"Run with --force to confirm.\");\n return;\n }\n\n clearSeed();\n printSuccess(\"Wallet removed from this device\");\n });\n\n // wallet export\n wallet\n .command(\"export\")\n .description(\"Export seed phrase (use with caution!)\")\n .option(\"-f, --force\", \"Skip warning\")\n .action(async (options: { force?: boolean }) => {\n const encrypted = getEncryptedSeed();\n if (!encrypted) {\n printError(\"No wallet configured.\");\n return;\n }\n\n if (!options.force) {\n console.log(chalk.red(\"⚠ DANGER: This will display your seed phrase on screen!\"));\n console.log(chalk.red(\" Anyone who sees this can steal your funds.\"));\n console.log();\n console.log(\"Run with --force to proceed.\");\n return;\n }\n\n const seedPhrase = decryptSeed(encrypted, MACHINE_KEY);\n console.log();\n console.log(chalk.bold(\"Seed phrase:\"));\n console.log();\n console.log(` ${chalk.cyan(seedPhrase)}`);\n console.log();\n });\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { getEncryptedSeed, getConfig } from \"../config/index.js\";\nimport {\n createSpinner,\n formatAddress,\n formatAmount,\n parseAmount,\n printSuccess,\n printError,\n printHeader,\n printTable,\n decryptSeed,\n getNetworkName,\n isValidUrl,\n} from \"../utils/index.js\";\n\n// Machine ID for basic encryption key\nconst MACHINE_KEY = `t402-cli-${process.env.USER || \"default\"}`;\n\n/**\n * Register payment-related commands\n */\nexport function registerPayCommands(program: Command): void {\n // pay command\n program\n .command(\"pay\")\n .description(\"Send a payment to an address\")\n .argument(\"<to>\", \"Recipient address\")\n .argument(\"<amount>\", \"Amount to send (e.g., 1.5)\")\n .option(\"-n, --network <network>\", \"Network to use (e.g., eip155:8453)\")\n .option(\"-a, --asset <asset>\", \"Asset to send (default: usdt0)\", \"usdt0\")\n .option(\"-g, --gasless\", \"Use gasless transaction (ERC-4337)\")\n .action(\n async (\n to: string,\n amount: string,\n options: { network?: string; asset: string; gasless?: boolean },\n ) => {\n const encrypted = getEncryptedSeed();\n if (!encrypted) {\n printError(\"No wallet configured. Run 'wallet create' or 'wallet import' first.\");\n return;\n }\n\n const network = options.network || getConfig(\"defaultNetwork\");\n const testnet = getConfig(\"testnet\");\n\n // Validate network matches testnet setting\n const isTestnetNetwork =\n network.includes(\"sepolia\") ||\n network.includes(\"testnet\") ||\n network.includes(\"devnet\") ||\n network.includes(\"nile\") ||\n network === \"ton:-3\";\n if (testnet !== isTestnetNetwork) {\n printError(\n `Network ${network} doesn't match testnet mode (${testnet ? \"testnet\" : \"mainnet\"}).`,\n );\n printError(`Run 'config set testnet ${isTestnetNetwork}' to switch modes.`);\n return;\n }\n\n try {\n const seedPhrase = decryptSeed(encrypted, MACHINE_KEY);\n\n printHeader(\"Payment Details\");\n printTable({\n To: formatAddress(to),\n Amount: `${amount} ${options.asset.toUpperCase()}`,\n Network: getNetworkName(network),\n Mode: options.gasless ? \"Gasless (ERC-4337)\" : \"Standard\",\n });\n console.log();\n\n const spinner = createSpinner(\"Preparing transaction...\").start();\n\n if (options.gasless) {\n // Gasless payment using ERC-4337\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const wdkGasless: any = await import(\"@t402/wdk-gasless\");\n const { WdkGaslessClient } = wdkGasless;\n\n spinner.text = \"Initializing gasless client...\";\n const client = await WdkGaslessClient.create({\n seedPhrase,\n chain: network.replace(\"eip155:\", \"\"),\n });\n\n spinner.text = \"Sending gasless payment...\";\n const result = await client.pay({\n to,\n amount: parseAmount(amount),\n });\n\n spinner.succeed(\"Payment sent!\");\n console.log();\n printSuccess(\"Transaction submitted\");\n console.log(` User Operation Hash: ${chalk.cyan(result.userOpHash)}`);\n if (result.txHash) {\n console.log(` Transaction Hash: ${chalk.cyan(result.txHash)}`);\n }\n } else {\n // Standard payment\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const wdk: any = await import(\"@t402/wdk\");\n const { createPaymentProcessor } = wdk;\n\n spinner.text = \"Initializing wallet...\";\n const processor = createPaymentProcessor({ seedPhrase });\n await processor.initialize();\n\n spinner.text = \"Sending payment...\";\n const txHash = await processor.pay({\n network,\n asset: options.asset,\n to,\n amount: parseAmount(amount),\n });\n\n spinner.succeed(\"Payment sent!\");\n console.log();\n printSuccess(\"Transaction submitted\");\n console.log(` Transaction Hash: ${chalk.cyan(txHash)}`);\n }\n } catch (error) {\n printError(`Payment failed: ${error instanceof Error ? error.message : error}`);\n }\n },\n );\n\n // pay-invoice command (pay a 402 response)\n program\n .command(\"pay-invoice\")\n .description(\"Pay a 402 Payment Required response\")\n .argument(\"<url>\", \"URL that returned 402\")\n .option(\"-g, --gasless\", \"Use gasless transaction (ERC-4337)\")\n .option(\"-i, --index <index>\", \"Payment option index (if multiple)\", \"0\")\n .action(async (url: string, options: { gasless?: boolean; index: string }) => {\n if (!isValidUrl(url)) {\n printError(\"Invalid URL format\");\n return;\n }\n\n const encrypted = getEncryptedSeed();\n if (!encrypted) {\n printError(\"No wallet configured. Run 'wallet create' or 'wallet import' first.\");\n return;\n }\n\n try {\n const spinner = createSpinner(\"Fetching payment requirements...\").start();\n\n // Fetch the 402 response\n const response = await fetch(url);\n if (response.status !== 402) {\n spinner.fail(`Expected 402 status, got ${response.status}`);\n return;\n }\n\n const paymentRequired = (await response.json()) as {\n accepts?: Array<{\n network: string;\n asset?: string;\n amount: string;\n payTo: string;\n }>;\n resource?: { description?: string };\n };\n if (!paymentRequired.accepts || !Array.isArray(paymentRequired.accepts)) {\n spinner.fail(\"Invalid 402 response format\");\n return;\n }\n\n const index = parseInt(options.index, 10);\n const requirement = paymentRequired.accepts[index];\n if (!requirement) {\n spinner.fail(`No payment option at index ${index}`);\n return;\n }\n\n spinner.succeed(\"Payment requirements fetched\");\n\n printHeader(\"Payment Requirements\");\n printTable({\n Resource: paymentRequired.resource?.description || url,\n Amount: `${formatAmount(requirement.amount)} ${requirement.asset?.toUpperCase() || \"USDT\"}`,\n Network: getNetworkName(requirement.network),\n Recipient: formatAddress(requirement.payTo),\n });\n console.log();\n\n const seedPhrase = decryptSeed(encrypted, MACHINE_KEY);\n const paySpinner = createSpinner(\"Processing payment...\").start();\n\n if (options.gasless) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const wdkGasless: any = await import(\"@t402/wdk-gasless\");\n const { WdkGaslessClient } = wdkGasless;\n\n paySpinner.text = \"Initializing gasless client...\";\n const client = await WdkGaslessClient.create({\n seedPhrase,\n chain: requirement.network.replace(\"eip155:\", \"\"),\n });\n\n paySpinner.text = \"Sending gasless payment...\";\n const result = await client.pay({\n to: requirement.payTo,\n amount: requirement.amount,\n });\n\n paySpinner.succeed(\"Payment sent!\");\n console.log();\n printSuccess(\"Payment completed\");\n console.log(` User Operation Hash: ${chalk.cyan(result.userOpHash)}`);\n\n // Retry the original request with payment header\n console.log();\n const retrySpinner = createSpinner(\"Retrying request with payment...\").start();\n\n const retryResponse = await fetch(url, {\n headers: {\n \"X-Payment\": result.userOpHash,\n },\n });\n\n if (retryResponse.ok) {\n retrySpinner.succeed(\"Request successful!\");\n console.log(` Status: ${chalk.green(retryResponse.status)}`);\n } else {\n retrySpinner.warn(`Request returned ${retryResponse.status}`);\n }\n } else {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const wdk: any = await import(\"@t402/wdk\");\n const { createPaymentProcessor } = wdk;\n\n paySpinner.text = \"Initializing wallet...\";\n const processor = createPaymentProcessor({ seedPhrase });\n await processor.initialize();\n\n paySpinner.text = \"Sending payment...\";\n const txHash = await processor.pay({\n network: requirement.network,\n asset: requirement.asset || \"usdt\",\n to: requirement.payTo,\n amount: requirement.amount,\n });\n\n paySpinner.succeed(\"Payment sent!\");\n console.log();\n printSuccess(\"Payment completed\");\n console.log(` Transaction Hash: ${chalk.cyan(txHash)}`);\n }\n } catch (error) {\n printError(`Failed to pay invoice: ${error instanceof Error ? error.message : error}`);\n }\n });\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { getEncryptedSeed, getConfig } from \"../config/index.js\";\nimport {\n createSpinner,\n formatAddress,\n formatAmount,\n printSuccess,\n printError,\n printWarning,\n printHeader,\n printTable,\n decryptSeed,\n getNetworkName,\n isValidUrl,\n} from \"../utils/index.js\";\nimport { VERSION } from \"../version.js\";\n\n// Machine ID for basic encryption key\nconst MACHINE_KEY = `t402-cli-${process.env.USER || \"default\"}`;\n\n/**\n * Register the request command\n */\nexport function registerRequestCommand(program: Command): void {\n program\n .command(\"request\")\n .description(\"Make an HTTP request with automatic 402 payment handling\")\n .argument(\"<url>\", \"URL to request\")\n .option(\"-X, --method <method>\", \"HTTP method\", \"GET\")\n .option(\"-H, --header <header...>\", \"Additional headers (key:value)\")\n .option(\"-d, --data <data>\", \"Request body data\")\n .option(\"-g, --gasless\", \"Use gasless payments (ERC-4337)\")\n .option(\"-n, --network <network>\", \"Preferred network for payment\")\n .option(\"-o, --output <file>\", \"Save response to file\")\n .option(\"-v, --verbose\", \"Show detailed output\")\n .option(\"--dry-run\", \"Show what would be paid without executing\")\n .action(\n async (\n url: string,\n options: {\n method: string;\n header?: string[];\n data?: string;\n gasless?: boolean;\n network?: string;\n output?: string;\n verbose?: boolean;\n dryRun?: boolean;\n },\n ) => {\n if (!isValidUrl(url)) {\n printError(\"Invalid URL format\");\n return;\n }\n\n const encrypted = getEncryptedSeed();\n if (!encrypted && !options.dryRun) {\n printError(\"No wallet configured. Run 'wallet create' or 'wallet import' first.\");\n return;\n }\n\n // Build request options\n const headers: Record<string, string> = {\n \"User-Agent\": `t402-cli/${VERSION}`,\n };\n\n if (options.header) {\n for (const h of options.header) {\n const [key, ...valueParts] = h.split(\":\");\n if (key && valueParts.length > 0) {\n headers[key.trim()] = valueParts.join(\":\").trim();\n }\n }\n }\n\n const fetchOptions: RequestInit = {\n method: options.method,\n headers,\n };\n\n if (options.data) {\n fetchOptions.body = options.data;\n if (!headers[\"Content-Type\"]) {\n headers[\"Content-Type\"] = \"application/json\";\n }\n }\n\n try {\n const spinner = createSpinner(`${options.method} ${url}`).start();\n\n // Make initial request\n const response = await fetch(url, fetchOptions);\n\n if (response.status === 402) {\n spinner.info(\"Payment required (402)\");\n\n // Parse 402 response\n const paymentRequired = (await response.json()) as {\n accepts?: Array<{\n network: string;\n asset?: string;\n amount: string;\n payTo: string;\n }>;\n resource?: { description?: string };\n };\n if (!paymentRequired.accepts || !Array.isArray(paymentRequired.accepts)) {\n printError(\"Invalid 402 response format\");\n return;\n }\n\n // Select payment option\n const preferredNetwork = options.network || getConfig(\"defaultNetwork\");\n let requirement = paymentRequired.accepts.find(\n (r) => r.network === preferredNetwork,\n );\n if (!requirement) {\n requirement = paymentRequired.accepts[0];\n }\n\n printHeader(\"Payment Required\");\n printTable({\n Resource: paymentRequired.resource?.description || url,\n Amount: `${formatAmount(requirement.amount)} ${requirement.asset?.toUpperCase() || \"USDT\"}`,\n Network: getNetworkName(requirement.network),\n Recipient: formatAddress(requirement.payTo),\n });\n console.log();\n\n if (options.dryRun) {\n printWarning(\"Dry run - no payment executed\");\n return;\n }\n\n if (!encrypted) {\n printError(\"No wallet configured.\");\n return;\n }\n\n const seedPhrase = decryptSeed(encrypted, MACHINE_KEY);\n const paySpinner = createSpinner(\"Processing payment...\").start();\n\n let paymentProof: string;\n\n if (options.gasless) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const wdkGasless: any = await import(\"@t402/wdk-gasless\");\n const { WdkGaslessClient } = wdkGasless;\n\n paySpinner.text = \"Initializing gasless client...\";\n const client = await WdkGaslessClient.create({\n seedPhrase,\n chain: requirement.network.replace(\"eip155:\", \"\"),\n });\n\n paySpinner.text = \"Sending gasless payment...\";\n const result = await client.pay({\n to: requirement.payTo,\n amount: requirement.amount,\n });\n\n paymentProof = result.userOpHash;\n paySpinner.succeed(\"Gasless payment sent\");\n\n if (options.verbose) {\n console.log(` User Operation Hash: ${chalk.cyan(result.userOpHash)}`);\n }\n } else {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const wdk: any = await import(\"@t402/wdk\");\n const { createPaymentProcessor } = wdk;\n\n paySpinner.text = \"Initializing wallet...\";\n const processor = createPaymentProcessor({ seedPhrase });\n await processor.initialize();\n\n paySpinner.text = \"Sending payment...\";\n const txHash = await processor.pay({\n network: requirement.network,\n asset: requirement.asset || \"usdt\",\n to: requirement.payTo,\n amount: requirement.amount,\n });\n\n paymentProof = txHash;\n paySpinner.succeed(\"Payment sent\");\n\n if (options.verbose) {\n console.log(` Transaction Hash: ${chalk.cyan(txHash)}`);\n }\n }\n\n // Retry with payment header\n console.log();\n const retrySpinner = createSpinner(\"Retrying request with payment proof...\").start();\n\n const retryResponse = await fetch(url, {\n ...fetchOptions,\n headers: {\n ...headers,\n \"X-Payment\": paymentProof,\n },\n });\n\n if (retryResponse.ok) {\n retrySpinner.succeed(`${retryResponse.status} ${retryResponse.statusText}`);\n await handleResponse(retryResponse, options);\n } else if (retryResponse.status === 402) {\n retrySpinner.fail(\"Payment not accepted - still requires payment\");\n printError(\"The server did not accept the payment proof.\");\n } else {\n retrySpinner.warn(`${retryResponse.status} ${retryResponse.statusText}`);\n await handleResponse(retryResponse, options);\n }\n } else if (response.ok) {\n spinner.succeed(`${response.status} ${response.statusText}`);\n await handleResponse(response, options);\n } else {\n spinner.fail(`${response.status} ${response.statusText}`);\n await handleResponse(response, options);\n }\n } catch (error) {\n printError(`Request failed: ${error instanceof Error ? error.message : error}`);\n }\n },\n );\n}\n\n/**\n * Handle and display response\n */\nasync function handleResponse(\n response: Response,\n options: { output?: string; verbose?: boolean },\n): Promise<void> {\n const contentType = response.headers.get(\"content-type\") || \"\";\n\n if (options.verbose) {\n console.log();\n console.log(chalk.gray(\"Response Headers:\"));\n response.headers.forEach((value, key) => {\n console.log(chalk.gray(` ${key}: ${value}`));\n });\n console.log();\n }\n\n if (options.output) {\n const { writeFile } = await import(\"fs/promises\");\n const buffer = await response.arrayBuffer();\n await writeFile(options.output, Buffer.from(buffer));\n printSuccess(`Response saved to ${options.output}`);\n } else if (contentType.includes(\"application/json\")) {\n const json = await response.json();\n console.log();\n console.log(JSON.stringify(json, null, 2));\n } else if (contentType.includes(\"text/\")) {\n const text = await response.text();\n console.log();\n console.log(text);\n } else {\n const size = response.headers.get(\"content-length\") || \"unknown\";\n console.log();\n console.log(chalk.gray(`Binary response (${size} bytes)`));\n console.log(chalk.gray(\"Use --output to save to file\"));\n }\n}\n","// Version is injected at build time or read from package.json\n// Using a simple constant that gets updated during release\nexport const VERSION = \"2.0.0\";\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport {\n getConfig,\n setConfig,\n getAllConfig,\n resetConfig,\n getConfigPath,\n setRpcEndpoint,\n} from \"../config/index.js\";\nimport {\n printSuccess,\n printError,\n printWarning,\n printHeader,\n printTable,\n getNetworkName,\n isValidUrl,\n} from \"../utils/index.js\";\nimport type { CliConfig } from \"../types.js\";\n\n/**\n * Register configuration commands\n */\nexport function registerConfigCommands(program: Command): void {\n const config = program.command(\"config\").description(\"Configuration management\");\n\n // config show\n config\n .command(\"show\")\n .description(\"Show current configuration\")\n .action(() => {\n const cfg = getAllConfig();\n\n printHeader(\"T402 CLI Configuration\");\n\n const displayConfig: Record<string, string> = {\n \"Default Network\": getNetworkName(cfg.defaultNetwork),\n \"Network ID\": cfg.defaultNetwork,\n \"Facilitator URL\": cfg.facilitatorUrl,\n \"Testnet Mode\": cfg.testnet ? chalk.yellow(\"Yes\") : \"No\",\n \"Wallet Configured\": cfg.encryptedSeed ? chalk.green(\"Yes\") : chalk.gray(\"No\"),\n \"Config File\": getConfigPath(),\n };\n\n printTable(displayConfig);\n\n // Show custom RPC endpoints if any\n const endpoints = cfg.rpcEndpoints;\n if (Object.keys(endpoints).length > 0) {\n console.log();\n console.log(chalk.bold(\"Custom RPC Endpoints:\"));\n for (const [network, url] of Object.entries(endpoints)) {\n console.log(` ${getNetworkName(network)}: ${url}`);\n }\n }\n });\n\n // config get\n config\n .command(\"get\")\n .description(\"Get a configuration value\")\n .argument(\"<key>\", \"Configuration key (defaultNetwork, facilitatorUrl, testnet)\")\n .action((key: string) => {\n const validKeys = [\"defaultNetwork\", \"facilitatorUrl\", \"testnet\", \"rpcEndpoints\"];\n if (!validKeys.includes(key)) {\n printError(`Invalid key. Valid keys: ${validKeys.join(\", \")}`);\n return;\n }\n\n const value = getConfig(key as keyof CliConfig);\n if (typeof value === \"object\") {\n console.log(JSON.stringify(value, null, 2));\n } else {\n console.log(value);\n }\n });\n\n // config set\n config\n .command(\"set\")\n .description(\"Set a configuration value\")\n .argument(\"<key>\", \"Configuration key\")\n .argument(\"<value>\", \"Value to set\")\n .action((key: string, value: string) => {\n switch (key) {\n case \"defaultNetwork\":\n setConfig(\"defaultNetwork\", value);\n printSuccess(`Default network set to ${getNetworkName(value)}`);\n break;\n\n case \"facilitatorUrl\":\n if (!isValidUrl(value)) {\n printError(\"Invalid URL format\");\n return;\n }\n setConfig(\"facilitatorUrl\", value);\n printSuccess(`Facilitator URL set to ${value}`);\n break;\n\n case \"testnet\":\n const isTestnet = value.toLowerCase() === \"true\" || value === \"1\";\n setConfig(\"testnet\", isTestnet);\n printSuccess(`Testnet mode ${isTestnet ? \"enabled\" : \"disabled\"}`);\n\n // Suggest appropriate default network\n if (isTestnet) {\n setConfig(\"defaultNetwork\", \"eip155:84532\");\n console.log(chalk.gray(\" Default network changed to Base Sepolia\"));\n } else {\n setConfig(\"defaultNetwork\", \"eip155:8453\");\n console.log(chalk.gray(\" Default network changed to Base\"));\n }\n break;\n\n default:\n printError(\n `Unknown key: ${key}. Valid keys: defaultNetwork, facilitatorUrl, testnet`,\n );\n }\n });\n\n // config rpc\n config\n .command(\"rpc\")\n .description(\"Set custom RPC endpoint for a network\")\n .argument(\"<network>\", \"Network ID (e.g., eip155:8453)\")\n .argument(\"<url>\", \"RPC endpoint URL\")\n .action((network: string, url: string) => {\n if (!isValidUrl(url)) {\n printError(\"Invalid URL format\");\n return;\n }\n\n setRpcEndpoint(network, url);\n printSuccess(`RPC endpoint set for ${getNetworkName(network)}`);\n });\n\n // config reset\n config\n .command(\"reset\")\n .description(\"Reset configuration to defaults\")\n .option(\"-f, --force\", \"Skip confirmation\")\n .action((options: { force?: boolean }) => {\n if (!options.force) {\n printWarning(\"This will reset all configuration to defaults.\");\n printWarning(\"Your wallet will NOT be removed.\");\n console.log();\n console.log(\"Run with --force to confirm.\");\n return;\n }\n\n // Preserve wallet\n const cfg = getAllConfig();\n const encryptedSeed = cfg.encryptedSeed;\n\n resetConfig();\n\n // Restore wallet if it existed\n if (encryptedSeed) {\n setConfig(\"encryptedSeed\", encryptedSeed);\n }\n\n printSuccess(\"Configuration reset to defaults\");\n });\n\n // config path\n config\n .command(\"path\")\n .description(\"Show configuration file path\")\n .action(() => {\n console.log(getConfigPath());\n });\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { getConfig } from \"../config/index.js\";\nimport { printHeader } from \"../utils/index.js\";\nimport { NETWORKS } from \"../types.js\";\nimport { VERSION } from \"../version.js\";\n\n/**\n * Register info command\n */\nexport function registerInfoCommand(program: Command): void {\n program\n .command(\"info\")\n .description(\"Show supported networks and assets\")\n .option(\"-a, --all\", \"Show all networks (mainnet and testnet)\")\n .option(\"-t, --testnet\", \"Show testnet networks only\")\n .action((options: { all?: boolean; testnet?: boolean }) => {\n const showTestnet = options.testnet || getConfig(\"testnet\");\n const showAll = options.all;\n\n printHeader(\"T402 Payment Protocol\");\n\n console.log(` Version: ${VERSION}`);\n console.log(\" Facilitator: \" + chalk.cyan(getConfig(\"facilitatorUrl\")));\n console.log();\n\n // Supported Networks\n console.log(chalk.bold(\"Supported Networks:\"));\n console.log();\n\n // EVM Networks\n const evmMainnets = NETWORKS.filter((n) => n.type === \"evm\" && !n.testnet);\n const evmTestnets = NETWORKS.filter((n) => n.type === \"evm\" && n.testnet);\n\n if (showAll || !showTestnet) {\n console.log(chalk.underline(\" EVM (Mainnet):\"));\n for (const network of evmMainnets) {\n console.log(\n ` ${chalk.green(\"●\")} ${network.name.padEnd(16)} ${chalk.gray(network.id)}`,\n );\n }\n console.log();\n }\n\n if (showAll || showTestnet) {\n console.log(chalk.underline(\" EVM (Testnet):\"));\n for (const network of evmTestnets) {\n console.log(\n ` ${chalk.yellow(\"●\")} ${network.name.padEnd(16)} ${chalk.gray(network.id)}`,\n );\n }\n console.log();\n }\n\n // Solana\n const solanaNetworks = NETWORKS.filter(\n (n) => n.type === \"solana\" && (showAll || n.testnet === showTestnet),\n );\n if (solanaNetworks.length > 0) {\n console.log(chalk.underline(\" Solana:\"));\n for (const network of solanaNetworks) {\n const color = network.testnet ? chalk.yellow : chalk.green;\n console.log(` ${color(\"●\")} ${network.name.padEnd(16)} ${chalk.gray(network.id)}`);\n }\n console.log();\n }\n\n // TON\n const tonNetworks = NETWORKS.filter(\n (n) => n.type === \"ton\" && (showAll || n.testnet === showTestnet),\n );\n if (tonNetworks.length > 0) {\n console.log(chalk.underline(\" TON:\"));\n for (const network of tonNetworks) {\n const color = network.testnet ? chalk.yellow : chalk.green;\n console.log(` ${color(\"●\")} ${network.name.padEnd(16)} ${chalk.gray(network.id)}`);\n }\n console.log();\n }\n\n // TRON\n const tronNetworks = NETWORKS.filter(\n (n) => n.type === \"tron\" && (showAll || n.testnet === showTestnet),\n );\n if (tronNetworks.length > 0) {\n console.log(chalk.underline(\" TRON:\"));\n for (const network of tronNetworks) {\n const color = network.testnet ? chalk.yellow : chalk.green;\n console.log(` ${color(\"●\")} ${network.name.padEnd(16)} ${chalk.gray(network.id)}`);\n }\n console.log();\n }\n\n // Supported Assets\n console.log(chalk.bold(\"Supported Assets:\"));\n console.log();\n console.log(` ${chalk.cyan(\"USDT0\")} - Tether USD (OFT) on EVM chains`);\n console.log(` ${chalk.cyan(\"USDT\")} - Tether USD on all chains`);\n console.log();\n\n // Payment Schemes\n console.log(chalk.bold(\"Payment Schemes:\"));\n console.log();\n console.log(` ${chalk.magenta(\"exact\")} - Exact amount payment (default)`);\n console.log(` ${chalk.magenta(\"upto\")} - Payment up to specified amount`);\n console.log();\n\n // Features\n console.log(chalk.bold(\"Features:\"));\n console.log();\n console.log(` ${chalk.green(\"✓\")} Standard payments (all chains)`);\n console.log(` ${chalk.green(\"✓\")} Gasless payments via ERC-4337 (EVM chains)`);\n console.log(` ${chalk.green(\"✓\")} Cross-chain bridging via LayerZero`);\n console.log(` ${chalk.green(\"✓\")} WDK wallet integration`);\n console.log();\n\n // Legend\n console.log(chalk.gray(\"Legend:\"));\n console.log(chalk.gray(` ${chalk.green(\"●\")} Mainnet ${chalk.yellow(\"●\")} Testnet`));\n });\n\n // version command (alias)\n program\n .command(\"version\")\n .description(\"Show CLI version\")\n .action(() => {\n console.log(`t402 CLI v${VERSION}`);\n });\n}\n"],"mappings":"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","names":["chalk","chalk","chalk","MACHINE_KEY","chalk","chalk","MACHINE_KEY","chalk","chalk","config","chalk","chalk","chalk"]}
1
+ {"version":3,"sources":["../../src/types.ts","../../src/config/index.ts","../../src/utils/index.ts","../../src/cli.ts","../../src/commands/wallet.ts","../../src/commands/pay.ts","../../src/commands/request.ts","../../src/version.ts","../../src/commands/config.ts","../../src/commands/info.ts"],"sourcesContent":["/**\n * CLI configuration stored in user config file\n */\nexport interface CliConfig {\n /** Default network to use */\n defaultNetwork: string;\n /** Facilitator URL */\n facilitatorUrl: string;\n /** Whether to use testnet networks */\n testnet: boolean;\n /** Encrypted seed phrase (optional) */\n encryptedSeed?: string;\n /** Custom RPC endpoints by network */\n rpcEndpoints: Record<string, string>;\n}\n\n/**\n * Wallet information\n */\nexport interface WalletInfo {\n /** Wallet addresses by network type */\n addresses: {\n evm?: string;\n solana?: string;\n ton?: string;\n tron?: string;\n };\n /** Whether the wallet has a seed configured */\n hasSeed: boolean;\n}\n\n/**\n * Balance result for a specific network\n */\nexport interface BalanceResult {\n network: string;\n asset: string;\n balance: string;\n formatted: string;\n address: string;\n}\n\n/**\n * Payment result\n */\nexport interface PaymentResult {\n success: boolean;\n txHash?: string;\n network?: string;\n amount?: string;\n error?: string;\n}\n\n/**\n * Supported network information\n */\nexport interface NetworkInfo {\n id: string;\n name: string;\n type: \"evm\" | \"solana\" | \"ton\" | \"tron\";\n testnet: boolean;\n assets: string[];\n}\n\n/**\n * Default configuration values\n */\nexport const DEFAULT_CONFIG: CliConfig = {\n defaultNetwork: \"eip155:8453\",\n facilitatorUrl: \"https://facilitator.t402.io\",\n testnet: false,\n rpcEndpoints: {},\n};\n\n/**\n * Supported networks\n */\nexport const NETWORKS: NetworkInfo[] = [\n // EVM Mainnets\n { id: \"eip155:1\", name: \"Ethereum\", type: \"evm\", testnet: false, assets: [\"usdt\", \"usdt0\"] },\n { id: \"eip155:42161\", name: \"Arbitrum\", type: \"evm\", testnet: false, assets: [\"usdt0\"] },\n { id: \"eip155:8453\", name: \"Base\", type: \"evm\", testnet: false, assets: [\"usdt0\"] },\n { id: \"eip155:10\", name: \"Optimism\", type: \"evm\", testnet: false, assets: [\"usdt0\"] },\n { id: \"eip155:57073\", name: \"Ink\", type: \"evm\", testnet: false, assets: [\"usdt0\"] },\n { id: \"eip155:80094\", name: \"Berachain\", type: \"evm\", testnet: false, assets: [\"usdt0\"] },\n // EVM Testnets\n { id: \"eip155:11155111\", name: \"Sepolia\", type: \"evm\", testnet: true, assets: [\"usdt0\"] },\n { id: \"eip155:421614\", name: \"Arbitrum Sepolia\", type: \"evm\", testnet: true, assets: [\"usdt0\"] },\n { id: \"eip155:84532\", name: \"Base Sepolia\", type: \"evm\", testnet: true, assets: [\"usdt0\"] },\n // Solana\n {\n id: \"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp\",\n name: \"Solana\",\n type: \"solana\",\n testnet: false,\n assets: [\"usdt\"],\n },\n {\n id: \"solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1\",\n name: \"Solana Devnet\",\n type: \"solana\",\n testnet: true,\n assets: [\"usdt\"],\n },\n // TON\n { id: \"ton:-239\", name: \"TON\", type: \"ton\", testnet: false, assets: [\"usdt\"] },\n { id: \"ton:-3\", name: \"TON Testnet\", type: \"ton\", testnet: true, assets: [\"usdt\"] },\n // TRON\n { id: \"tron:mainnet\", name: \"TRON\", type: \"tron\", testnet: false, assets: [\"usdt\"] },\n { id: \"tron:nile\", name: \"TRON Nile\", type: \"tron\", testnet: true, assets: [\"usdt\"] },\n];\n","import Conf from \"conf\";\nimport type { CliConfig } from \"../types.js\";\nimport { DEFAULT_CONFIG } from \"../types.js\";\n\n/**\n * Configuration store for t402 CLI\n */\nconst config = new Conf<CliConfig>({\n projectName: \"t402\",\n defaults: DEFAULT_CONFIG,\n});\n\n/**\n * Get a configuration value\n */\nexport function getConfig<K extends keyof CliConfig>(key: K): CliConfig[K] {\n return config.get(key);\n}\n\n/**\n * Set a configuration value\n */\nexport function setConfig<K extends keyof CliConfig>(key: K, value: CliConfig[K]): void {\n config.set(key, value);\n}\n\n/**\n * Get all configuration values\n */\nexport function getAllConfig(): CliConfig {\n return config.store;\n}\n\n/**\n * Reset configuration to defaults\n */\nexport function resetConfig(): void {\n config.clear();\n}\n\n/**\n * Get the path to the configuration file\n */\nexport function getConfigPath(): string {\n return config.path;\n}\n\n/**\n * Check if a seed phrase is configured\n */\nexport function hasSeedConfigured(): boolean {\n return !!config.get(\"encryptedSeed\");\n}\n\n/**\n * Store encrypted seed phrase\n */\nexport function storeSeed(encryptedSeed: string): void {\n config.set(\"encryptedSeed\", encryptedSeed);\n}\n\n/**\n * Get encrypted seed phrase\n */\nexport function getEncryptedSeed(): string | undefined {\n return config.get(\"encryptedSeed\");\n}\n\n/**\n * Clear stored seed phrase\n */\nexport function clearSeed(): void {\n config.delete(\"encryptedSeed\");\n}\n\n/**\n * Set custom RPC endpoint for a network\n */\nexport function setRpcEndpoint(network: string, url: string): void {\n const endpoints = config.get(\"rpcEndpoints\");\n config.set(\"rpcEndpoints\", { ...endpoints, [network]: url });\n}\n\n/**\n * Get RPC endpoint for a network\n */\nexport function getRpcEndpoint(network: string): string | undefined {\n return config.get(\"rpcEndpoints\")[network];\n}\n\nexport { config };\n","import chalk from \"chalk\";\nimport ora, { type Ora } from \"ora\";\nimport type { BalanceResult, NetworkInfo, PaymentResult } from \"../types.js\";\nimport { NETWORKS } from \"../types.js\";\n\n/**\n * Create a spinner with consistent styling\n */\nexport function createSpinner(text: string): Ora {\n return ora({\n text,\n color: \"cyan\",\n });\n}\n\n/**\n * Format an address for display (truncated)\n */\nexport function formatAddress(address: string, startChars = 6, endChars = 4): string {\n if (address.length <= startChars + endChars + 3) {\n return address;\n }\n return `${address.slice(0, startChars)}...${address.slice(-endChars)}`;\n}\n\n/**\n * Format a token amount with decimals\n */\nexport function formatAmount(amount: string, decimals = 6): string {\n const value = BigInt(amount);\n const divisor = BigInt(10 ** decimals);\n const whole = value / divisor;\n const fraction = value % divisor;\n\n if (fraction === 0n) {\n return whole.toString();\n }\n\n const fractionStr = fraction.toString().padStart(decimals, \"0\").replace(/0+$/, \"\");\n return `${whole}.${fractionStr}`;\n}\n\n/**\n * Format balance result for display\n */\nexport function formatBalanceResult(result: BalanceResult): string {\n const network = getNetworkInfo(result.network);\n const networkName = network?.name || result.network;\n const assetName = result.asset.toUpperCase();\n\n return `${chalk.bold(networkName)}: ${chalk.green(result.formatted)} ${assetName}`;\n}\n\n/**\n * Format payment result for display\n */\nexport function formatPaymentResult(result: PaymentResult): string {\n if (result.success) {\n const lines = [chalk.green(\"✓ Payment successful!\")];\n if (result.txHash) {\n lines.push(` Transaction: ${chalk.cyan(result.txHash)}`);\n }\n if (result.network) {\n const network = getNetworkInfo(result.network);\n lines.push(` Network: ${network?.name || result.network}`);\n }\n if (result.amount) {\n lines.push(` Amount: ${result.amount}`);\n }\n return lines.join(\"\\n\");\n } else {\n return chalk.red(`✗ Payment failed: ${result.error || \"Unknown error\"}`);\n }\n}\n\n/**\n * Get network info by ID\n */\nexport function getNetworkInfo(networkId: string): NetworkInfo | undefined {\n return NETWORKS.find((n) => n.id === networkId);\n}\n\n/**\n * Get network display name\n */\nexport function getNetworkName(networkId: string): string {\n const network = getNetworkInfo(networkId);\n return network?.name || networkId;\n}\n\n/**\n * Filter networks by testnet mode\n */\nexport function getAvailableNetworks(testnet: boolean): NetworkInfo[] {\n return NETWORKS.filter((n) => n.testnet === testnet);\n}\n\n/**\n * Print a table of key-value pairs\n */\nexport function printTable(data: Record<string, string>): void {\n const maxKeyLength = Math.max(...Object.keys(data).map((k) => k.length));\n\n for (const [key, value] of Object.entries(data)) {\n const paddedKey = key.padEnd(maxKeyLength);\n console.log(` ${chalk.gray(paddedKey)} ${value}`);\n }\n}\n\n/**\n * Print a success message\n */\nexport function printSuccess(message: string): void {\n console.log(chalk.green(`✓ ${message}`));\n}\n\n/**\n * Print an error message\n */\nexport function printError(message: string): void {\n console.error(chalk.red(`✗ ${message}`));\n}\n\n/**\n * Print a warning message\n */\nexport function printWarning(message: string): void {\n console.log(chalk.yellow(`⚠ ${message}`));\n}\n\n/**\n * Print an info message\n */\nexport function printInfo(message: string): void {\n console.log(chalk.cyan(`ℹ ${message}`));\n}\n\n/**\n * Print a header\n */\nexport function printHeader(title: string): void {\n console.log();\n console.log(chalk.bold.underline(title));\n console.log();\n}\n\n/**\n * Validate a seed phrase (basic check)\n */\nexport function isValidSeedPhrase(phrase: string): boolean {\n const words = phrase.trim().split(/\\s+/);\n return words.length === 12 || words.length === 24;\n}\n\n/**\n * Simple XOR encryption for seed storage\n * Note: This is basic obfuscation, not secure encryption.\n * For production, use proper encryption with a password.\n */\nexport function encryptSeed(seed: string, key: string): string {\n const seedBytes = Buffer.from(seed, \"utf8\");\n const keyBytes = Buffer.from(key, \"utf8\");\n const encrypted = Buffer.alloc(seedBytes.length);\n\n for (let i = 0; i < seedBytes.length; i++) {\n encrypted[i] = seedBytes[i] ^ keyBytes[i % keyBytes.length];\n }\n\n return encrypted.toString(\"base64\");\n}\n\n/**\n * Decrypt seed phrase\n */\nexport function decryptSeed(encrypted: string, key: string): string {\n const encryptedBytes = Buffer.from(encrypted, \"base64\");\n const keyBytes = Buffer.from(key, \"utf8\");\n const decrypted = Buffer.alloc(encryptedBytes.length);\n\n for (let i = 0; i < encryptedBytes.length; i++) {\n decrypted[i] = encryptedBytes[i] ^ keyBytes[i % keyBytes.length];\n }\n\n return decrypted.toString(\"utf8\");\n}\n\n/**\n * Parse amount string to smallest units\n */\nexport function parseAmount(amount: string, decimals = 6): string {\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) * BigInt(10 ** decimals) + BigInt(fraction)).toString();\n}\n\n/**\n * Validate URL format\n */\nexport function isValidUrl(url: string): boolean {\n try {\n new URL(url);\n return true;\n } catch {\n return false;\n }\n}\n","import { Command } from \"commander\";\nimport { registerWalletCommands } from \"./commands/wallet.js\";\nimport { registerPayCommands } from \"./commands/pay.js\";\nimport { registerRequestCommand } from \"./commands/request.js\";\nimport { registerConfigCommands } from \"./commands/config.js\";\nimport { registerInfoCommand } from \"./commands/info.js\";\nimport { VERSION } from \"./version.js\";\n\n/**\n * Create and configure the CLI program\n */\nexport function createCli(): Command {\n const program = new Command();\n\n program\n .name(\"t402\")\n .description(\"Command-line interface for the T402 payment protocol\")\n .version(VERSION);\n\n // Register command groups\n registerWalletCommands(program);\n registerPayCommands(program);\n registerRequestCommand(program);\n registerConfigCommands(program);\n registerInfoCommand(program);\n\n return program;\n}\n\n/**\n * Run the CLI\n */\nexport async function runCli(args: string[] = process.argv): Promise<void> {\n const program = createCli();\n await program.parseAsync(args);\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport {\n hasSeedConfigured,\n storeSeed,\n getEncryptedSeed,\n clearSeed,\n getConfig,\n} from \"../config/index.js\";\nimport {\n createSpinner,\n formatAmount,\n printSuccess,\n printError,\n printWarning,\n printHeader,\n printTable,\n isValidSeedPhrase,\n encryptSeed,\n decryptSeed,\n getNetworkName,\n} from \"../utils/index.js\";\n\n// Machine ID for basic encryption key\nconst MACHINE_KEY = `t402-cli-${process.env.USER || \"default\"}`;\n\n/**\n * Register wallet-related commands\n */\nexport function registerWalletCommands(program: Command): void {\n const wallet = program.command(\"wallet\").description(\"Wallet management commands\");\n\n // wallet create\n wallet\n .command(\"create\")\n .description(\"Create a new wallet with a generated seed phrase\")\n .action(async () => {\n if (hasSeedConfigured()) {\n printWarning(\"A wallet is already configured. Use 'wallet clear' first to remove it.\");\n return;\n }\n\n try {\n // Use viem for seed phrase generation\n const { generateMnemonic, english } = await import(\"viem/accounts\");\n\n const spinner = createSpinner(\"Generating seed phrase...\").start();\n const mnemonic = generateMnemonic(english);\n spinner.succeed(\"Seed phrase generated\");\n\n console.log();\n console.log(chalk.yellow(\"⚠ IMPORTANT: Write down these words and store them safely!\"));\n console.log(chalk.yellow(\" This is the ONLY way to recover your wallet.\"));\n console.log();\n console.log(chalk.bold(\"Seed phrase:\"));\n console.log();\n console.log(` ${chalk.cyan(mnemonic)}`);\n console.log();\n\n // Store encrypted seed\n const encrypted = encryptSeed(mnemonic, MACHINE_KEY);\n storeSeed(encrypted);\n\n printSuccess(\"Wallet created and saved to config\");\n console.log();\n console.log(\"Run 'wallet show' to see your addresses.\");\n } catch (error) {\n printError(`Failed to create wallet: ${error instanceof Error ? error.message : error}`);\n }\n });\n\n // wallet import\n wallet\n .command(\"import\")\n .description(\"Import an existing wallet from a seed phrase\")\n .argument(\"<seed-phrase>\", \"12 or 24 word seed phrase (in quotes)\")\n .action(async (seedPhrase: string) => {\n if (hasSeedConfigured()) {\n printWarning(\"A wallet is already configured. Use 'wallet clear' first to remove it.\");\n return;\n }\n\n const phrase = seedPhrase.trim();\n if (!isValidSeedPhrase(phrase)) {\n printError(\"Invalid seed phrase. Must be 12 or 24 words.\");\n return;\n }\n\n try {\n // Validate by trying to create an account\n const { mnemonicToAccount } = await import(\"viem/accounts\");\n mnemonicToAccount(phrase); // Throws if invalid\n\n // Store encrypted seed\n const encrypted = encryptSeed(phrase, MACHINE_KEY);\n storeSeed(encrypted);\n\n printSuccess(\"Wallet imported successfully\");\n console.log();\n console.log(\"Run 'wallet show' to see your addresses.\");\n } catch (error) {\n printError(`Failed to import wallet: ${error instanceof Error ? error.message : error}`);\n }\n });\n\n // wallet show\n wallet\n .command(\"show\")\n .description(\"Show wallet addresses\")\n .action(async () => {\n const encrypted = getEncryptedSeed();\n if (!encrypted) {\n printError(\"No wallet configured. Run 'wallet create' or 'wallet import' first.\");\n return;\n }\n\n try {\n const seedPhrase = decryptSeed(encrypted, MACHINE_KEY);\n const { mnemonicToAccount } = await import(\"viem/accounts\");\n\n const spinner = createSpinner(\"Loading wallet...\").start();\n const account = mnemonicToAccount(seedPhrase);\n spinner.succeed(\"Wallet loaded\");\n\n printHeader(\"Wallet Addresses\");\n\n const addresses: Record<string, string> = {\n \"EVM (Ethereum, Arbitrum, Base, etc.)\": account.address,\n };\n\n printTable(addresses);\n\n console.log();\n console.log(chalk.gray(\"Note: Install @t402/wdk for full multi-chain support\"));\n } catch (error) {\n printError(`Failed to load wallet: ${error instanceof Error ? error.message : error}`);\n }\n });\n\n // wallet balance\n wallet\n .command(\"balance\")\n .description(\"Check wallet balances\")\n .option(\"-n, --network <network>\", \"Specific network to check (e.g., eip155:8453)\")\n .option(\"-a, --all\", \"Show all networks including zero balances\")\n .action(async (options: { network?: string; all?: boolean }) => {\n const encrypted = getEncryptedSeed();\n if (!encrypted) {\n printError(\"No wallet configured. Run 'wallet create' or 'wallet import' first.\");\n return;\n }\n\n try {\n const seedPhrase = decryptSeed(encrypted, MACHINE_KEY);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const wdkModule: any = await import(\"@t402/wdk\");\n const { T402WDK } = wdkModule;\n\n const spinner = createSpinner(\"Fetching balances...\").start();\n const testnet = getConfig(\"testnet\");\n\n // Create WDK with appropriate chains\n const chainConfig = testnet\n ? {\n \"arbitrum-sepolia\": \"https://sepolia-rollup.arbitrum.io/rpc\",\n \"base-sepolia\": \"https://sepolia.base.org\",\n }\n : {\n arbitrum: \"https://arb1.arbitrum.io/rpc\",\n base: \"https://mainnet.base.org\",\n };\n\n const wdk = new T402WDK(seedPhrase, chainConfig);\n\n if (options.network) {\n // Single network balance\n const chainName = options.network.replace(\"eip155:\", \"\").replace(\"8453\", \"base\").replace(\"42161\", \"arbitrum\");\n spinner.text = `Fetching balance for ${getNetworkName(options.network)}...`;\n const balance = await wdk.getUsdt0Balance(chainName);\n spinner.succeed(\"Balance fetched\");\n\n printHeader(`Balance on ${getNetworkName(options.network)}`);\n console.log(` ${chalk.green(formatAmount(balance.toString()))} USDT0`);\n } else {\n // All balances\n const balances = await wdk.getAggregatedBalances();\n spinner.succeed(\"Balances fetched\");\n\n printHeader(\"Wallet Balances\");\n console.log(` Total USDT0: ${chalk.green(formatAmount(balances.totalUsdt0.toString()))}`);\n\n if (balances.chains.length > 0) {\n console.log();\n for (const chain of balances.chains) {\n const usdt0 = chain.tokens.find((t: { symbol: string }) => t.symbol === \"USDT0\");\n if (usdt0 && (options.all || usdt0.balance > 0n)) {\n const color = usdt0.balance > 0n ? chalk.green : chalk.gray;\n console.log(` ${chain.chain.padEnd(20)} ${color(formatAmount(usdt0.balance.toString()))} USDT0`);\n }\n }\n }\n }\n } catch (error) {\n printError(`Failed to fetch balances: ${error instanceof Error ? error.message : error}`);\n }\n });\n\n // wallet clear\n wallet\n .command(\"clear\")\n .description(\"Remove wallet from this device\")\n .option(\"-f, --force\", \"Skip confirmation\")\n .action(async (options: { force?: boolean }) => {\n if (!hasSeedConfigured()) {\n printWarning(\"No wallet configured.\");\n return;\n }\n\n if (!options.force) {\n console.log(chalk.yellow(\"⚠ WARNING: This will remove your wallet from this device.\"));\n console.log(chalk.yellow(\" Make sure you have your seed phrase backed up!\"));\n console.log();\n console.log(\"Run with --force to confirm.\");\n return;\n }\n\n clearSeed();\n printSuccess(\"Wallet removed from this device\");\n });\n\n // wallet export\n wallet\n .command(\"export\")\n .description(\"Export seed phrase (use with caution!)\")\n .option(\"-f, --force\", \"Skip warning\")\n .action(async (options: { force?: boolean }) => {\n const encrypted = getEncryptedSeed();\n if (!encrypted) {\n printError(\"No wallet configured.\");\n return;\n }\n\n if (!options.force) {\n console.log(chalk.red(\"⚠ DANGER: This will display your seed phrase on screen!\"));\n console.log(chalk.red(\" Anyone who sees this can steal your funds.\"));\n console.log();\n console.log(\"Run with --force to proceed.\");\n return;\n }\n\n const seedPhrase = decryptSeed(encrypted, MACHINE_KEY);\n console.log();\n console.log(chalk.bold(\"Seed phrase:\"));\n console.log();\n console.log(` ${chalk.cyan(seedPhrase)}`);\n console.log();\n });\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { getEncryptedSeed, getConfig } from \"../config/index.js\";\nimport {\n createSpinner,\n formatAddress,\n formatAmount,\n parseAmount,\n printSuccess,\n printError,\n printHeader,\n printTable,\n decryptSeed,\n getNetworkName,\n isValidUrl,\n} from \"../utils/index.js\";\n\n// Machine ID for basic encryption key\nconst MACHINE_KEY = `t402-cli-${process.env.USER || \"default\"}`;\n\n/**\n * Register payment-related commands\n */\nexport function registerPayCommands(program: Command): void {\n // pay command\n program\n .command(\"pay\")\n .description(\"Send a payment to an address\")\n .argument(\"<to>\", \"Recipient address\")\n .argument(\"<amount>\", \"Amount to send (e.g., 1.5)\")\n .option(\"-n, --network <network>\", \"Network to use (e.g., eip155:8453)\")\n .option(\"-a, --asset <asset>\", \"Asset to send (default: usdt0)\", \"usdt0\")\n .option(\"-g, --gasless\", \"Use gasless transaction (ERC-4337)\")\n .action(\n async (\n to: string,\n amount: string,\n options: { network?: string; asset: string; gasless?: boolean },\n ) => {\n const encrypted = getEncryptedSeed();\n if (!encrypted) {\n printError(\"No wallet configured. Run 'wallet create' or 'wallet import' first.\");\n return;\n }\n\n const network = options.network || getConfig(\"defaultNetwork\");\n const testnet = getConfig(\"testnet\");\n\n // Validate network matches testnet setting\n const isTestnetNetwork =\n network.includes(\"sepolia\") ||\n network.includes(\"testnet\") ||\n network.includes(\"devnet\") ||\n network.includes(\"nile\") ||\n network === \"ton:-3\";\n if (testnet !== isTestnetNetwork) {\n printError(\n `Network ${network} doesn't match testnet mode (${testnet ? \"testnet\" : \"mainnet\"}).`,\n );\n printError(`Run 'config set testnet ${isTestnetNetwork}' to switch modes.`);\n return;\n }\n\n try {\n const seedPhrase = decryptSeed(encrypted, MACHINE_KEY);\n\n printHeader(\"Payment Details\");\n printTable({\n To: formatAddress(to),\n Amount: `${amount} ${options.asset.toUpperCase()}`,\n Network: getNetworkName(network),\n Mode: options.gasless ? \"Gasless (ERC-4337)\" : \"Standard\",\n });\n console.log();\n\n const spinner = createSpinner(\"Preparing transaction...\").start();\n\n if (options.gasless) {\n // Gasless payment using ERC-4337\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const wdkGasless: any = await import(\"@t402/wdk-gasless\");\n const { WdkGaslessClient } = wdkGasless;\n\n spinner.text = \"Initializing gasless client...\";\n const client = await WdkGaslessClient.create({\n seedPhrase,\n chain: network.replace(\"eip155:\", \"\"),\n });\n\n spinner.text = \"Sending gasless payment...\";\n const result = await client.pay({\n to,\n amount: parseAmount(amount),\n });\n\n spinner.succeed(\"Payment sent!\");\n console.log();\n printSuccess(\"Transaction submitted\");\n console.log(` User Operation Hash: ${chalk.cyan(result.userOpHash)}`);\n if (result.txHash) {\n console.log(` Transaction Hash: ${chalk.cyan(result.txHash)}`);\n }\n } else {\n // Standard payment\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const wdk: any = await import(\"@t402/wdk\");\n const { createPaymentProcessor } = wdk;\n\n spinner.text = \"Initializing wallet...\";\n const processor = createPaymentProcessor({ seedPhrase });\n await processor.initialize();\n\n spinner.text = \"Sending payment...\";\n const txHash = await processor.pay({\n network,\n asset: options.asset,\n to,\n amount: parseAmount(amount),\n });\n\n spinner.succeed(\"Payment sent!\");\n console.log();\n printSuccess(\"Transaction submitted\");\n console.log(` Transaction Hash: ${chalk.cyan(txHash)}`);\n }\n } catch (error) {\n printError(`Payment failed: ${error instanceof Error ? error.message : error}`);\n }\n },\n );\n\n // pay-invoice command (pay a 402 response)\n program\n .command(\"pay-invoice\")\n .description(\"Pay a 402 Payment Required response\")\n .argument(\"<url>\", \"URL that returned 402\")\n .option(\"-g, --gasless\", \"Use gasless transaction (ERC-4337)\")\n .option(\"-i, --index <index>\", \"Payment option index (if multiple)\", \"0\")\n .action(async (url: string, options: { gasless?: boolean; index: string }) => {\n if (!isValidUrl(url)) {\n printError(\"Invalid URL format\");\n return;\n }\n\n const encrypted = getEncryptedSeed();\n if (!encrypted) {\n printError(\"No wallet configured. Run 'wallet create' or 'wallet import' first.\");\n return;\n }\n\n try {\n const spinner = createSpinner(\"Fetching payment requirements...\").start();\n\n // Fetch the 402 response\n const response = await fetch(url);\n if (response.status !== 402) {\n spinner.fail(`Expected 402 status, got ${response.status}`);\n return;\n }\n\n const paymentRequired = (await response.json()) as {\n accepts?: Array<{\n network: string;\n asset?: string;\n amount: string;\n payTo: string;\n }>;\n resource?: { description?: string };\n };\n if (!paymentRequired.accepts || !Array.isArray(paymentRequired.accepts)) {\n spinner.fail(\"Invalid 402 response format\");\n return;\n }\n\n const index = parseInt(options.index, 10);\n const requirement = paymentRequired.accepts[index];\n if (!requirement) {\n spinner.fail(`No payment option at index ${index}`);\n return;\n }\n\n spinner.succeed(\"Payment requirements fetched\");\n\n printHeader(\"Payment Requirements\");\n printTable({\n Resource: paymentRequired.resource?.description || url,\n Amount: `${formatAmount(requirement.amount)} ${requirement.asset?.toUpperCase() || \"USDT\"}`,\n Network: getNetworkName(requirement.network),\n Recipient: formatAddress(requirement.payTo),\n });\n console.log();\n\n const seedPhrase = decryptSeed(encrypted, MACHINE_KEY);\n const paySpinner = createSpinner(\"Processing payment...\").start();\n\n if (options.gasless) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const wdkGasless: any = await import(\"@t402/wdk-gasless\");\n const { WdkGaslessClient } = wdkGasless;\n\n paySpinner.text = \"Initializing gasless client...\";\n const client = await WdkGaslessClient.create({\n seedPhrase,\n chain: requirement.network.replace(\"eip155:\", \"\"),\n });\n\n paySpinner.text = \"Sending gasless payment...\";\n const result = await client.pay({\n to: requirement.payTo,\n amount: requirement.amount,\n });\n\n paySpinner.succeed(\"Payment sent!\");\n console.log();\n printSuccess(\"Payment completed\");\n console.log(` User Operation Hash: ${chalk.cyan(result.userOpHash)}`);\n\n // Retry the original request with payment header\n console.log();\n const retrySpinner = createSpinner(\"Retrying request with payment...\").start();\n\n const retryResponse = await fetch(url, {\n headers: {\n \"X-Payment\": result.userOpHash,\n },\n });\n\n if (retryResponse.ok) {\n retrySpinner.succeed(\"Request successful!\");\n console.log(` Status: ${chalk.green(retryResponse.status)}`);\n } else {\n retrySpinner.warn(`Request returned ${retryResponse.status}`);\n }\n } else {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const wdk: any = await import(\"@t402/wdk\");\n const { createPaymentProcessor } = wdk;\n\n paySpinner.text = \"Initializing wallet...\";\n const processor = createPaymentProcessor({ seedPhrase });\n await processor.initialize();\n\n paySpinner.text = \"Sending payment...\";\n const txHash = await processor.pay({\n network: requirement.network,\n asset: requirement.asset || \"usdt\",\n to: requirement.payTo,\n amount: requirement.amount,\n });\n\n paySpinner.succeed(\"Payment sent!\");\n console.log();\n printSuccess(\"Payment completed\");\n console.log(` Transaction Hash: ${chalk.cyan(txHash)}`);\n }\n } catch (error) {\n printError(`Failed to pay invoice: ${error instanceof Error ? error.message : error}`);\n }\n });\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { getEncryptedSeed, getConfig } from \"../config/index.js\";\nimport {\n createSpinner,\n formatAddress,\n formatAmount,\n printSuccess,\n printError,\n printWarning,\n printHeader,\n printTable,\n decryptSeed,\n getNetworkName,\n isValidUrl,\n} from \"../utils/index.js\";\nimport { VERSION } from \"../version.js\";\n\n// Machine ID for basic encryption key\nconst MACHINE_KEY = `t402-cli-${process.env.USER || \"default\"}`;\n\n/**\n * Register the request command\n */\nexport function registerRequestCommand(program: Command): void {\n program\n .command(\"request\")\n .description(\"Make an HTTP request with automatic 402 payment handling\")\n .argument(\"<url>\", \"URL to request\")\n .option(\"-X, --method <method>\", \"HTTP method\", \"GET\")\n .option(\"-H, --header <header...>\", \"Additional headers (key:value)\")\n .option(\"-d, --data <data>\", \"Request body data\")\n .option(\"-g, --gasless\", \"Use gasless payments (ERC-4337)\")\n .option(\"-n, --network <network>\", \"Preferred network for payment\")\n .option(\"-o, --output <file>\", \"Save response to file\")\n .option(\"-v, --verbose\", \"Show detailed output\")\n .option(\"--dry-run\", \"Show what would be paid without executing\")\n .action(\n async (\n url: string,\n options: {\n method: string;\n header?: string[];\n data?: string;\n gasless?: boolean;\n network?: string;\n output?: string;\n verbose?: boolean;\n dryRun?: boolean;\n },\n ) => {\n if (!isValidUrl(url)) {\n printError(\"Invalid URL format\");\n return;\n }\n\n const encrypted = getEncryptedSeed();\n if (!encrypted && !options.dryRun) {\n printError(\"No wallet configured. Run 'wallet create' or 'wallet import' first.\");\n return;\n }\n\n // Build request options\n const headers: Record<string, string> = {\n \"User-Agent\": `t402-cli/${VERSION}`,\n };\n\n if (options.header) {\n for (const h of options.header) {\n const [key, ...valueParts] = h.split(\":\");\n if (key && valueParts.length > 0) {\n headers[key.trim()] = valueParts.join(\":\").trim();\n }\n }\n }\n\n const fetchOptions: RequestInit = {\n method: options.method,\n headers,\n };\n\n if (options.data) {\n fetchOptions.body = options.data;\n if (!headers[\"Content-Type\"]) {\n headers[\"Content-Type\"] = \"application/json\";\n }\n }\n\n try {\n const spinner = createSpinner(`${options.method} ${url}`).start();\n\n // Make initial request\n const response = await fetch(url, fetchOptions);\n\n if (response.status === 402) {\n spinner.info(\"Payment required (402)\");\n\n // Parse 402 response\n const paymentRequired = (await response.json()) as {\n accepts?: Array<{\n network: string;\n asset?: string;\n amount: string;\n payTo: string;\n }>;\n resource?: { description?: string };\n };\n if (!paymentRequired.accepts || !Array.isArray(paymentRequired.accepts)) {\n printError(\"Invalid 402 response format\");\n return;\n }\n\n // Select payment option\n const preferredNetwork = options.network || getConfig(\"defaultNetwork\");\n let requirement = paymentRequired.accepts.find(\n (r) => r.network === preferredNetwork,\n );\n if (!requirement) {\n requirement = paymentRequired.accepts[0];\n }\n\n printHeader(\"Payment Required\");\n printTable({\n Resource: paymentRequired.resource?.description || url,\n Amount: `${formatAmount(requirement.amount)} ${requirement.asset?.toUpperCase() || \"USDT\"}`,\n Network: getNetworkName(requirement.network),\n Recipient: formatAddress(requirement.payTo),\n });\n console.log();\n\n if (options.dryRun) {\n printWarning(\"Dry run - no payment executed\");\n return;\n }\n\n if (!encrypted) {\n printError(\"No wallet configured.\");\n return;\n }\n\n const seedPhrase = decryptSeed(encrypted, MACHINE_KEY);\n const paySpinner = createSpinner(\"Processing payment...\").start();\n\n let paymentProof: string;\n\n if (options.gasless) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const wdkGasless: any = await import(\"@t402/wdk-gasless\");\n const { WdkGaslessClient } = wdkGasless;\n\n paySpinner.text = \"Initializing gasless client...\";\n const client = await WdkGaslessClient.create({\n seedPhrase,\n chain: requirement.network.replace(\"eip155:\", \"\"),\n });\n\n paySpinner.text = \"Sending gasless payment...\";\n const result = await client.pay({\n to: requirement.payTo,\n amount: requirement.amount,\n });\n\n paymentProof = result.userOpHash;\n paySpinner.succeed(\"Gasless payment sent\");\n\n if (options.verbose) {\n console.log(` User Operation Hash: ${chalk.cyan(result.userOpHash)}`);\n }\n } else {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const wdk: any = await import(\"@t402/wdk\");\n const { createPaymentProcessor } = wdk;\n\n paySpinner.text = \"Initializing wallet...\";\n const processor = createPaymentProcessor({ seedPhrase });\n await processor.initialize();\n\n paySpinner.text = \"Sending payment...\";\n const txHash = await processor.pay({\n network: requirement.network,\n asset: requirement.asset || \"usdt\",\n to: requirement.payTo,\n amount: requirement.amount,\n });\n\n paymentProof = txHash;\n paySpinner.succeed(\"Payment sent\");\n\n if (options.verbose) {\n console.log(` Transaction Hash: ${chalk.cyan(txHash)}`);\n }\n }\n\n // Retry with payment header\n console.log();\n const retrySpinner = createSpinner(\"Retrying request with payment proof...\").start();\n\n const retryResponse = await fetch(url, {\n ...fetchOptions,\n headers: {\n ...headers,\n \"X-Payment\": paymentProof,\n },\n });\n\n if (retryResponse.ok) {\n retrySpinner.succeed(`${retryResponse.status} ${retryResponse.statusText}`);\n await handleResponse(retryResponse, options);\n } else if (retryResponse.status === 402) {\n retrySpinner.fail(\"Payment not accepted - still requires payment\");\n printError(\"The server did not accept the payment proof.\");\n } else {\n retrySpinner.warn(`${retryResponse.status} ${retryResponse.statusText}`);\n await handleResponse(retryResponse, options);\n }\n } else if (response.ok) {\n spinner.succeed(`${response.status} ${response.statusText}`);\n await handleResponse(response, options);\n } else {\n spinner.fail(`${response.status} ${response.statusText}`);\n await handleResponse(response, options);\n }\n } catch (error) {\n printError(`Request failed: ${error instanceof Error ? error.message : error}`);\n }\n },\n );\n}\n\n/**\n * Handle and display response\n */\nasync function handleResponse(\n response: Response,\n options: { output?: string; verbose?: boolean },\n): Promise<void> {\n const contentType = response.headers.get(\"content-type\") || \"\";\n\n if (options.verbose) {\n console.log();\n console.log(chalk.gray(\"Response Headers:\"));\n response.headers.forEach((value, key) => {\n console.log(chalk.gray(` ${key}: ${value}`));\n });\n console.log();\n }\n\n if (options.output) {\n const { writeFile } = await import(\"fs/promises\");\n const buffer = await response.arrayBuffer();\n await writeFile(options.output, Buffer.from(buffer));\n printSuccess(`Response saved to ${options.output}`);\n } else if (contentType.includes(\"application/json\")) {\n const json = await response.json();\n console.log();\n console.log(JSON.stringify(json, null, 2));\n } else if (contentType.includes(\"text/\")) {\n const text = await response.text();\n console.log();\n console.log(text);\n } else {\n const size = response.headers.get(\"content-length\") || \"unknown\";\n console.log();\n console.log(chalk.gray(`Binary response (${size} bytes)`));\n console.log(chalk.gray(\"Use --output to save to file\"));\n }\n}\n","// Version is injected at build time or read from package.json\n// Using a simple constant that gets updated during release\nexport const VERSION = \"2.0.0\";\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport {\n getConfig,\n setConfig,\n getAllConfig,\n resetConfig,\n getConfigPath,\n setRpcEndpoint,\n} from \"../config/index.js\";\nimport {\n printSuccess,\n printError,\n printWarning,\n printHeader,\n printTable,\n getNetworkName,\n isValidUrl,\n} from \"../utils/index.js\";\nimport type { CliConfig } from \"../types.js\";\n\n/**\n * Register configuration commands\n */\nexport function registerConfigCommands(program: Command): void {\n const config = program.command(\"config\").description(\"Configuration management\");\n\n // config show\n config\n .command(\"show\")\n .description(\"Show current configuration\")\n .action(() => {\n const cfg = getAllConfig();\n\n printHeader(\"T402 CLI Configuration\");\n\n const displayConfig: Record<string, string> = {\n \"Default Network\": getNetworkName(cfg.defaultNetwork),\n \"Network ID\": cfg.defaultNetwork,\n \"Facilitator URL\": cfg.facilitatorUrl,\n \"Testnet Mode\": cfg.testnet ? chalk.yellow(\"Yes\") : \"No\",\n \"Wallet Configured\": cfg.encryptedSeed ? chalk.green(\"Yes\") : chalk.gray(\"No\"),\n \"Config File\": getConfigPath(),\n };\n\n printTable(displayConfig);\n\n // Show custom RPC endpoints if any\n const endpoints = cfg.rpcEndpoints;\n if (Object.keys(endpoints).length > 0) {\n console.log();\n console.log(chalk.bold(\"Custom RPC Endpoints:\"));\n for (const [network, url] of Object.entries(endpoints)) {\n console.log(` ${getNetworkName(network)}: ${url}`);\n }\n }\n });\n\n // config get\n config\n .command(\"get\")\n .description(\"Get a configuration value\")\n .argument(\"<key>\", \"Configuration key (defaultNetwork, facilitatorUrl, testnet)\")\n .action((key: string) => {\n const validKeys = [\"defaultNetwork\", \"facilitatorUrl\", \"testnet\", \"rpcEndpoints\"];\n if (!validKeys.includes(key)) {\n printError(`Invalid key. Valid keys: ${validKeys.join(\", \")}`);\n return;\n }\n\n const value = getConfig(key as keyof CliConfig);\n if (typeof value === \"object\") {\n console.log(JSON.stringify(value, null, 2));\n } else {\n console.log(value);\n }\n });\n\n // config set\n config\n .command(\"set\")\n .description(\"Set a configuration value\")\n .argument(\"<key>\", \"Configuration key\")\n .argument(\"<value>\", \"Value to set\")\n .action((key: string, value: string) => {\n switch (key) {\n case \"defaultNetwork\":\n setConfig(\"defaultNetwork\", value);\n printSuccess(`Default network set to ${getNetworkName(value)}`);\n break;\n\n case \"facilitatorUrl\":\n if (!isValidUrl(value)) {\n printError(\"Invalid URL format\");\n return;\n }\n setConfig(\"facilitatorUrl\", value);\n printSuccess(`Facilitator URL set to ${value}`);\n break;\n\n case \"testnet\": {\n const isTestnet = value.toLowerCase() === \"true\" || value === \"1\";\n setConfig(\"testnet\", isTestnet);\n printSuccess(`Testnet mode ${isTestnet ? \"enabled\" : \"disabled\"}`);\n\n // Suggest appropriate default network\n if (isTestnet) {\n setConfig(\"defaultNetwork\", \"eip155:84532\");\n console.log(chalk.gray(\" Default network changed to Base Sepolia\"));\n } else {\n setConfig(\"defaultNetwork\", \"eip155:8453\");\n console.log(chalk.gray(\" Default network changed to Base\"));\n }\n break;\n }\n\n default:\n printError(\n `Unknown key: ${key}. Valid keys: defaultNetwork, facilitatorUrl, testnet`,\n );\n }\n });\n\n // config rpc\n config\n .command(\"rpc\")\n .description(\"Set custom RPC endpoint for a network\")\n .argument(\"<network>\", \"Network ID (e.g., eip155:8453)\")\n .argument(\"<url>\", \"RPC endpoint URL\")\n .action((network: string, url: string) => {\n if (!isValidUrl(url)) {\n printError(\"Invalid URL format\");\n return;\n }\n\n setRpcEndpoint(network, url);\n printSuccess(`RPC endpoint set for ${getNetworkName(network)}`);\n });\n\n // config reset\n config\n .command(\"reset\")\n .description(\"Reset configuration to defaults\")\n .option(\"-f, --force\", \"Skip confirmation\")\n .action((options: { force?: boolean }) => {\n if (!options.force) {\n printWarning(\"This will reset all configuration to defaults.\");\n printWarning(\"Your wallet will NOT be removed.\");\n console.log();\n console.log(\"Run with --force to confirm.\");\n return;\n }\n\n // Preserve wallet\n const cfg = getAllConfig();\n const encryptedSeed = cfg.encryptedSeed;\n\n resetConfig();\n\n // Restore wallet if it existed\n if (encryptedSeed) {\n setConfig(\"encryptedSeed\", encryptedSeed);\n }\n\n printSuccess(\"Configuration reset to defaults\");\n });\n\n // config path\n config\n .command(\"path\")\n .description(\"Show configuration file path\")\n .action(() => {\n console.log(getConfigPath());\n });\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { getConfig } from \"../config/index.js\";\nimport { printHeader } from \"../utils/index.js\";\nimport { NETWORKS } from \"../types.js\";\nimport { VERSION } from \"../version.js\";\n\n/**\n * Register info command\n */\nexport function registerInfoCommand(program: Command): void {\n program\n .command(\"info\")\n .description(\"Show supported networks and assets\")\n .option(\"-a, --all\", \"Show all networks (mainnet and testnet)\")\n .option(\"-t, --testnet\", \"Show testnet networks only\")\n .action((options: { all?: boolean; testnet?: boolean }) => {\n const showTestnet = options.testnet || getConfig(\"testnet\");\n const showAll = options.all;\n\n printHeader(\"T402 Payment Protocol\");\n\n console.log(` Version: ${VERSION}`);\n console.log(\" Facilitator: \" + chalk.cyan(getConfig(\"facilitatorUrl\")));\n console.log();\n\n // Supported Networks\n console.log(chalk.bold(\"Supported Networks:\"));\n console.log();\n\n // EVM Networks\n const evmMainnets = NETWORKS.filter((n) => n.type === \"evm\" && !n.testnet);\n const evmTestnets = NETWORKS.filter((n) => n.type === \"evm\" && n.testnet);\n\n if (showAll || !showTestnet) {\n console.log(chalk.underline(\" EVM (Mainnet):\"));\n for (const network of evmMainnets) {\n console.log(\n ` ${chalk.green(\"●\")} ${network.name.padEnd(16)} ${chalk.gray(network.id)}`,\n );\n }\n console.log();\n }\n\n if (showAll || showTestnet) {\n console.log(chalk.underline(\" EVM (Testnet):\"));\n for (const network of evmTestnets) {\n console.log(\n ` ${chalk.yellow(\"●\")} ${network.name.padEnd(16)} ${chalk.gray(network.id)}`,\n );\n }\n console.log();\n }\n\n // Solana\n const solanaNetworks = NETWORKS.filter(\n (n) => n.type === \"solana\" && (showAll || n.testnet === showTestnet),\n );\n if (solanaNetworks.length > 0) {\n console.log(chalk.underline(\" Solana:\"));\n for (const network of solanaNetworks) {\n const color = network.testnet ? chalk.yellow : chalk.green;\n console.log(` ${color(\"●\")} ${network.name.padEnd(16)} ${chalk.gray(network.id)}`);\n }\n console.log();\n }\n\n // TON\n const tonNetworks = NETWORKS.filter(\n (n) => n.type === \"ton\" && (showAll || n.testnet === showTestnet),\n );\n if (tonNetworks.length > 0) {\n console.log(chalk.underline(\" TON:\"));\n for (const network of tonNetworks) {\n const color = network.testnet ? chalk.yellow : chalk.green;\n console.log(` ${color(\"●\")} ${network.name.padEnd(16)} ${chalk.gray(network.id)}`);\n }\n console.log();\n }\n\n // TRON\n const tronNetworks = NETWORKS.filter(\n (n) => n.type === \"tron\" && (showAll || n.testnet === showTestnet),\n );\n if (tronNetworks.length > 0) {\n console.log(chalk.underline(\" TRON:\"));\n for (const network of tronNetworks) {\n const color = network.testnet ? chalk.yellow : chalk.green;\n console.log(` ${color(\"●\")} ${network.name.padEnd(16)} ${chalk.gray(network.id)}`);\n }\n console.log();\n }\n\n // Supported Assets\n console.log(chalk.bold(\"Supported Assets:\"));\n console.log();\n console.log(` ${chalk.cyan(\"USDT0\")} - Tether USD (OFT) on EVM chains`);\n console.log(` ${chalk.cyan(\"USDT\")} - Tether USD on all chains`);\n console.log();\n\n // Payment Schemes\n console.log(chalk.bold(\"Payment Schemes:\"));\n console.log();\n console.log(` ${chalk.magenta(\"exact\")} - Exact amount payment (default)`);\n console.log(` ${chalk.magenta(\"upto\")} - Payment up to specified amount`);\n console.log();\n\n // Features\n console.log(chalk.bold(\"Features:\"));\n console.log();\n console.log(` ${chalk.green(\"✓\")} Standard payments (all chains)`);\n console.log(` ${chalk.green(\"✓\")} Gasless payments via ERC-4337 (EVM chains)`);\n console.log(` ${chalk.green(\"✓\")} Cross-chain bridging via LayerZero`);\n console.log(` ${chalk.green(\"✓\")} WDK wallet integration`);\n console.log();\n\n // Legend\n console.log(chalk.gray(\"Legend:\"));\n console.log(chalk.gray(` ${chalk.green(\"●\")} Mainnet ${chalk.yellow(\"●\")} Testnet`));\n });\n\n // version command (alias)\n program\n .command(\"version\")\n .description(\"Show CLI version\")\n .action(() => {\n console.log(`t402 CLI v${VERSION}`);\n });\n}\n"],"mappings":"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","names":["chalk","chalk","chalk","MACHINE_KEY","chalk","chalk","MACHINE_KEY","chalk","chalk","config","chalk","chalk","chalk"]}
package/dist/esm/index.js CHANGED
@@ -29,7 +29,7 @@ import {
29
29
  runCli,
30
30
  setConfig,
31
31
  setRpcEndpoint
32
- } from "./chunk-2A2UCRTK.js";
32
+ } from "./chunk-KXVLGPES.js";
33
33
  export {
34
34
  DEFAULT_CONFIG,
35
35
  NETWORKS,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@t402/cli",
3
- "version": "2.3.0",
3
+ "version": "2.4.0",
4
4
  "description": "Command-line interface for the T402 payment protocol",
5
5
  "keywords": [
6
6
  "t402",
@@ -31,16 +31,16 @@
31
31
  ],
32
32
  "dependencies": {
33
33
  "chalk": "^5.3.0",
34
- "commander": "^12.1.0",
34
+ "commander": "^14.0.3",
35
35
  "conf": "^13.0.1",
36
36
  "ora": "^8.1.0",
37
37
  "viem": "^2.44.2",
38
- "@t402/core": "2.3.0",
39
- "@t402/wdk-gasless": "2.0.0-beta.1",
40
- "@t402/wdk": "2.3.0"
38
+ "@t402/core": "2.4.0",
39
+ "@t402/wdk": "2.4.0",
40
+ "@t402/wdk-gasless": "2.4.0"
41
41
  },
42
42
  "devDependencies": {
43
- "@types/node": "^22.10.0",
43
+ "@types/node": "^25.2.0",
44
44
  "glob": "^13.0.0",
45
45
  "tsup": "^8.5.0",
46
46
  "typescript": "^5.8.0",