moltspay 0.5.4 → 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/README.md +0 -124
  2. package/dist/cdp/index.d.mts +111 -0
  3. package/dist/cdp/index.d.ts +111 -0
  4. package/dist/cdp/index.js +30655 -0
  5. package/dist/cdp/index.js.map +1 -0
  6. package/dist/cdp/index.mjs +30631 -0
  7. package/dist/cdp/index.mjs.map +1 -0
  8. package/dist/chains/index.d.mts +1 -1
  9. package/dist/chains/index.d.ts +1 -1
  10. package/dist/cli/index.js +990 -0
  11. package/dist/cli/index.js.map +1 -0
  12. package/dist/cli/index.mjs +967 -0
  13. package/dist/cli/index.mjs.map +1 -0
  14. package/dist/client/index.d.mts +134 -0
  15. package/dist/client/index.d.ts +134 -0
  16. package/dist/client/index.js +331 -0
  17. package/dist/client/index.js.map +1 -0
  18. package/dist/client/index.mjs +296 -0
  19. package/dist/client/index.mjs.map +1 -0
  20. package/dist/createWallet-D53qu7ie.d.mts +77 -0
  21. package/dist/createWallet-D53qu7ie.d.ts +77 -0
  22. package/dist/index-Dg8n6wdW.d.mts +32 -0
  23. package/dist/index-Dg8n6wdW.d.ts +32 -0
  24. package/dist/index.d.mts +6 -1483
  25. package/dist/index.d.ts +6 -1483
  26. package/dist/index.js +31039 -4254
  27. package/dist/index.js.map +1 -1
  28. package/dist/index.mjs +31042 -4203
  29. package/dist/index.mjs.map +1 -1
  30. package/dist/server/index.d.mts +120 -0
  31. package/dist/server/index.d.ts +120 -0
  32. package/dist/server/index.js +418 -0
  33. package/dist/server/index.js.map +1 -0
  34. package/dist/server/index.mjs +393 -0
  35. package/dist/server/index.mjs.map +1 -0
  36. package/dist/wallet/index.d.mts +3 -451
  37. package/dist/wallet/index.d.ts +3 -451
  38. package/dist/wallet/index.js +5 -1021
  39. package/dist/wallet/index.js.map +1 -1
  40. package/dist/wallet/index.mjs +16 -1015
  41. package/dist/wallet/index.mjs.map +1 -1
  42. package/package.json +19 -19
  43. package/dist/cli.js +0 -1984
  44. package/dist/cli.js.map +0 -1
  45. package/dist/cli.mjs +0 -1969
  46. package/dist/cli.mjs.map +0 -1
  47. package/dist/guide/index.d.mts +0 -39
  48. package/dist/guide/index.d.ts +0 -39
  49. package/dist/guide/index.js +0 -181
  50. package/dist/guide/index.js.map +0 -1
  51. package/dist/guide/index.mjs +0 -152
  52. package/dist/guide/index.mjs.map +0 -1
  53. package/dist/index-CyFg9s2m.d.mts +0 -161
  54. package/dist/index-CyFg9s2m.d.ts +0 -161
  55. package/dist/orders/index.d.mts +0 -97
  56. package/dist/orders/index.d.ts +0 -97
  57. package/dist/orders/index.js +0 -162
  58. package/dist/orders/index.js.map +0 -1
  59. package/dist/orders/index.mjs +0 -136
  60. package/dist/orders/index.mjs.map +0 -1
  61. package/dist/permit/index.d.mts +0 -49
  62. package/dist/permit/index.d.ts +0 -49
  63. package/dist/permit/index.js +0 -273
  64. package/dist/permit/index.js.map +0 -1
  65. package/dist/permit/index.mjs +0 -246
  66. package/dist/permit/index.mjs.map +0 -1
  67. /package/dist/{cli.d.mts → cli/index.d.mts} +0 -0
  68. /package/dist/{cli.d.ts → cli/index.d.ts} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/client/index.ts","../../src/chains/index.ts"],"sourcesContent":["/**\n * MoltsPay Client - Pay for AI Agent services\n * \n * Usage:\n * const client = new MoltsPayClient(); // Loads from ~/.moltspay/\n * const services = await client.getServices('http://provider:3000');\n * const result = await client.pay('http://provider:3000', 'text-to-video', { prompt: '...' });\n */\n\nimport { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';\nimport { homedir } from 'os';\nimport { join } from 'path';\nimport { Wallet } from 'ethers';\nimport { getChain, type ChainName } from '../chains/index.js';\nimport {\n ClientConfig,\n WalletData,\n PaymentRequired,\n ServicesResponse,\n VerifyResponse,\n MoltsPayClientOptions,\n} from './types.js';\n\nexport * from './types.js';\n\nconst DEFAULT_CONFIG: ClientConfig = {\n chain: 'base',\n limits: {\n maxPerTx: 100,\n maxPerDay: 1000,\n },\n};\n\nexport class MoltsPayClient {\n private configDir: string;\n private config: ClientConfig;\n private walletData: WalletData | null = null;\n private wallet: Wallet | null = null;\n private todaySpending: number = 0;\n private lastSpendingReset: number = 0;\n\n constructor(options: MoltsPayClientOptions = {}) {\n this.configDir = options.configDir || join(homedir(), '.moltspay');\n this.config = this.loadConfig();\n this.walletData = this.loadWallet();\n \n if (this.walletData) {\n this.wallet = new Wallet(this.walletData.privateKey);\n }\n }\n\n /**\n * Check if client is initialized (has wallet)\n */\n get isInitialized(): boolean {\n return this.wallet !== null;\n }\n\n /**\n * Get wallet address\n */\n get address(): string | null {\n return this.wallet?.address || null;\n }\n\n /**\n * Get current config\n */\n getConfig(): ClientConfig {\n return { ...this.config };\n }\n\n /**\n * Update config\n */\n updateConfig(updates: Partial<ClientConfig['limits']>): void {\n if (updates.maxPerTx !== undefined) {\n this.config.limits.maxPerTx = updates.maxPerTx;\n }\n if (updates.maxPerDay !== undefined) {\n this.config.limits.maxPerDay = updates.maxPerDay;\n }\n this.saveConfig();\n }\n\n /**\n * Get services from a provider\n */\n async getServices(serverUrl: string): Promise<ServicesResponse> {\n const res = await fetch(`${serverUrl}/services`);\n if (!res.ok) {\n throw new Error(`Failed to get services: ${res.statusText}`);\n }\n return res.json() as Promise<ServicesResponse>;\n }\n\n /**\n * Pay for a service and get the result\n */\n async pay(\n serverUrl: string,\n service: string,\n params: Record<string, any>\n ): Promise<Record<string, any>> {\n if (!this.wallet) {\n throw new Error('Client not initialized. Run: npx moltspay init');\n }\n\n // Step 1: Request payment info\n const payRes = await fetch(`${serverUrl}/pay`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ service, params }),\n });\n\n if (payRes.status !== 402) {\n const err = await payRes.json() as { error?: string };\n throw new Error(err.error || 'Unexpected response');\n }\n\n const paymentReq = await payRes.json() as PaymentRequired;\n const { payment } = paymentReq;\n\n // Step 2: Check limits\n this.checkLimits(payment.amount);\n\n // Step 3: Execute payment on-chain\n console.log(`[MoltsPay] Paying $${payment.amount} ${payment.currency} to ${payment.wallet}`);\n const txHash = await this.executePayment(payment);\n console.log(`[MoltsPay] Payment tx: ${txHash}`);\n\n // Step 4: Verify and get result\n const verifyRes = await fetch(`${serverUrl}/verify`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n chargeId: payment.chargeId,\n txHash,\n }),\n });\n\n if (!verifyRes.ok) {\n const err = await verifyRes.json() as { error?: string };\n throw new Error(err.error || 'Verification failed');\n }\n\n const result = await verifyRes.json() as VerifyResponse;\n \n // Update spending tracking\n this.recordSpending(payment.amount);\n \n return result.result;\n }\n\n /**\n * Check spending limits\n */\n private checkLimits(amount: number): void {\n // Check per-tx limit\n if (amount > this.config.limits.maxPerTx) {\n throw new Error(\n `Amount $${amount} exceeds max per transaction ($${this.config.limits.maxPerTx})`\n );\n }\n\n // Reset daily spending if new day\n const today = new Date().setHours(0, 0, 0, 0);\n if (today > this.lastSpendingReset) {\n this.todaySpending = 0;\n this.lastSpendingReset = today;\n }\n\n // Check daily limit\n if (this.todaySpending + amount > this.config.limits.maxPerDay) {\n throw new Error(\n `Would exceed daily limit ($${this.todaySpending} + $${amount} > $${this.config.limits.maxPerDay})`\n );\n }\n }\n\n /**\n * Record spending\n */\n private recordSpending(amount: number): void {\n this.todaySpending += amount;\n }\n\n /**\n * Execute payment on-chain\n */\n private async executePayment(payment: PaymentRequired['payment']): Promise<string> {\n let chain;\n try {\n chain = getChain(payment.chain as ChainName);\n } catch {\n throw new Error(`Unknown chain: ${payment.chain}`);\n }\n\n // For now, we'll use a simple USDC transfer\n // In production, this would connect to the actual chain\n const { ethers } = await import('ethers');\n \n const provider = new ethers.JsonRpcProvider(chain.rpc);\n const signer = new ethers.Wallet(this.walletData!.privateKey, provider);\n\n // USDC contract (Base mainnet)\n const usdcAddress = chain.usdc;\n const usdcAbi = [\n 'function transfer(address to, uint256 amount) returns (bool)',\n 'function balanceOf(address account) view returns (uint256)',\n ];\n \n const usdc = new ethers.Contract(usdcAddress, usdcAbi, signer);\n\n // Convert amount to USDC decimals (6)\n const amountInUnits = ethers.parseUnits(payment.amount.toString(), 6);\n\n // Check balance\n const balance = await usdc.balanceOf(this.wallet!.address);\n if (balance < amountInUnits) {\n throw new Error(\n `Insufficient USDC balance: ${ethers.formatUnits(balance, 6)} < ${payment.amount}`\n );\n }\n\n // Send transaction\n const tx = await usdc.transfer(payment.wallet, amountInUnits);\n const receipt = await tx.wait();\n\n return receipt.hash;\n }\n\n // --- Config & Wallet Management ---\n\n private loadConfig(): ClientConfig {\n const configPath = join(this.configDir, 'config.json');\n if (existsSync(configPath)) {\n const content = readFileSync(configPath, 'utf-8');\n return { ...DEFAULT_CONFIG, ...JSON.parse(content) };\n }\n return { ...DEFAULT_CONFIG };\n }\n\n private saveConfig(): void {\n mkdirSync(this.configDir, { recursive: true });\n const configPath = join(this.configDir, 'config.json');\n writeFileSync(configPath, JSON.stringify(this.config, null, 2));\n }\n\n private loadWallet(): WalletData | null {\n const walletPath = join(this.configDir, 'wallet.json');\n if (existsSync(walletPath)) {\n const content = readFileSync(walletPath, 'utf-8');\n return JSON.parse(content);\n }\n return null;\n }\n\n /**\n * Initialize a new wallet (called by CLI)\n */\n static init(\n configDir: string,\n options: { chain: string; maxPerTx: number; maxPerDay: number }\n ): { address: string; configDir: string } {\n mkdirSync(configDir, { recursive: true });\n\n // Create wallet\n const wallet = Wallet.createRandom();\n const walletData: WalletData = {\n address: wallet.address,\n privateKey: wallet.privateKey,\n createdAt: Date.now(),\n };\n\n // Save wallet\n const walletPath = join(configDir, 'wallet.json');\n writeFileSync(walletPath, JSON.stringify(walletData, null, 2));\n\n // Save config\n const config: ClientConfig = {\n chain: options.chain,\n limits: {\n maxPerTx: options.maxPerTx,\n maxPerDay: options.maxPerDay,\n },\n };\n const configPath = join(configDir, 'config.json');\n writeFileSync(configPath, JSON.stringify(config, null, 2));\n\n return { address: wallet.address, configDir };\n }\n\n /**\n * Get wallet balance\n */\n async getBalance(): Promise<{ usdc: number; native: number }> {\n if (!this.wallet) {\n throw new Error('Client not initialized');\n }\n\n let chain;\n try {\n chain = getChain(this.config.chain as ChainName);\n } catch {\n throw new Error(`Unknown chain: ${this.config.chain}`);\n }\n\n const { ethers } = await import('ethers');\n const provider = new ethers.JsonRpcProvider(chain.rpc);\n\n // Get native balance\n const nativeBalance = await provider.getBalance(this.wallet.address);\n\n // Get USDC balance\n const usdcAbi = ['function balanceOf(address) view returns (uint256)'];\n const usdc = new ethers.Contract(chain.usdc, usdcAbi, provider);\n const usdcBalance = await usdc.balanceOf(this.wallet.address);\n\n return {\n usdc: parseFloat(ethers.formatUnits(usdcBalance, 6)),\n native: parseFloat(ethers.formatEther(nativeBalance)),\n };\n }\n}\n","/**\n * Blockchain Configuration\n */\n\nimport type { ChainConfig, ChainName } from '../types/index.js';\n\nexport const CHAINS: Record<ChainName, ChainConfig> = {\n // ============ Mainnet ============\n base: {\n name: 'Base',\n chainId: 8453,\n rpc: 'https://mainnet.base.org',\n usdc: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',\n explorer: 'https://basescan.org/address/',\n explorerTx: 'https://basescan.org/tx/',\n avgBlockTime: 2,\n },\n polygon: {\n name: 'Polygon',\n chainId: 137,\n rpc: 'https://polygon-rpc.com',\n usdc: '0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359',\n explorer: 'https://polygonscan.com/address/',\n explorerTx: 'https://polygonscan.com/tx/',\n avgBlockTime: 2,\n },\n ethereum: {\n name: 'Ethereum',\n chainId: 1,\n rpc: 'https://eth.llamarpc.com',\n usdc: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',\n explorer: 'https://etherscan.io/address/',\n explorerTx: 'https://etherscan.io/tx/',\n avgBlockTime: 12,\n },\n\n // ============ Testnet ============\n base_sepolia: {\n name: 'Base Sepolia',\n chainId: 84532,\n rpc: 'https://sepolia.base.org',\n usdc: '0x036CbD53842c5426634e7929541eC2318f3dCF7e',\n explorer: 'https://sepolia.basescan.org/address/',\n explorerTx: 'https://sepolia.basescan.org/tx/',\n avgBlockTime: 2,\n },\n sepolia: {\n name: 'Sepolia',\n chainId: 11155111,\n rpc: 'https://rpc.sepolia.org',\n usdc: '0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238',\n explorer: 'https://sepolia.etherscan.io/address/',\n explorerTx: 'https://sepolia.etherscan.io/tx/',\n avgBlockTime: 12,\n },\n};\n\n/**\n * Get chain configuration\n */\nexport function getChain(name: ChainName): ChainConfig {\n const config = CHAINS[name];\n if (!config) {\n throw new Error(`Unsupported chain: ${name}. Supported: ${Object.keys(CHAINS).join(', ')}`);\n }\n return config;\n}\n\n/**\n * List all supported chains\n */\nexport function listChains(): ChainName[] {\n return Object.keys(CHAINS) as ChainName[];\n}\n\n/**\n * Get chain config by chainId\n */\nexport function getChainById(chainId: number): ChainConfig | undefined {\n return Object.values(CHAINS).find(c => c.chainId === chainId);\n}\n\n/**\n * ERC20 ABI (minimal, only required methods)\n */\nexport const ERC20_ABI = [\n 'function balanceOf(address owner) view returns (uint256)',\n 'function transfer(address to, uint256 amount) returns (bool)',\n 'function approve(address spender, uint256 amount) returns (bool)',\n 'function allowance(address owner, address spender) view returns (uint256)',\n 'function decimals() view returns (uint8)',\n 'function symbol() view returns (string)',\n 'function name() view returns (string)',\n 'function nonces(address owner) view returns (uint256)',\n 'function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s)',\n 'event Transfer(address indexed from, address indexed to, uint256 value)',\n 'event Approval(address indexed owner, address indexed spender, uint256 value)',\n];\n\nexport type { ChainConfig, ChainName };\n"],"mappings":";AASA,SAAS,YAAY,cAAc,eAAe,iBAAiB;AACnE,SAAS,eAAe;AACxB,SAAS,YAAY;AACrB,SAAS,cAAc;;;ACNhB,IAAM,SAAyC;AAAA;AAAA,EAEpD,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA,IACT,KAAK;AAAA,IACL,MAAM;AAAA,IACN,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,cAAc;AAAA,EAChB;AAAA,EACA,SAAS;AAAA,IACP,MAAM;AAAA,IACN,SAAS;AAAA,IACT,KAAK;AAAA,IACL,MAAM;AAAA,IACN,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,cAAc;AAAA,EAChB;AAAA,EACA,UAAU;AAAA,IACR,MAAM;AAAA,IACN,SAAS;AAAA,IACT,KAAK;AAAA,IACL,MAAM;AAAA,IACN,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,cAAc;AAAA,EAChB;AAAA;AAAA,EAGA,cAAc;AAAA,IACZ,MAAM;AAAA,IACN,SAAS;AAAA,IACT,KAAK;AAAA,IACL,MAAM;AAAA,IACN,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,cAAc;AAAA,EAChB;AAAA,EACA,SAAS;AAAA,IACP,MAAM;AAAA,IACN,SAAS;AAAA,IACT,KAAK;AAAA,IACL,MAAM;AAAA,IACN,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,cAAc;AAAA,EAChB;AACF;AAKO,SAAS,SAAS,MAA8B;AACrD,QAAM,SAAS,OAAO,IAAI;AAC1B,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI,MAAM,sBAAsB,IAAI,gBAAgB,OAAO,KAAK,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE;AAAA,EAC5F;AACA,SAAO;AACT;;;ADzCA,IAAM,iBAA+B;AAAA,EACnC,OAAO;AAAA,EACP,QAAQ;AAAA,IACN,UAAU;AAAA,IACV,WAAW;AAAA,EACb;AACF;AAEO,IAAM,iBAAN,MAAqB;AAAA,EAClB;AAAA,EACA;AAAA,EACA,aAAgC;AAAA,EAChC,SAAwB;AAAA,EACxB,gBAAwB;AAAA,EACxB,oBAA4B;AAAA,EAEpC,YAAY,UAAiC,CAAC,GAAG;AAC/C,SAAK,YAAY,QAAQ,aAAa,KAAK,QAAQ,GAAG,WAAW;AACjE,SAAK,SAAS,KAAK,WAAW;AAC9B,SAAK,aAAa,KAAK,WAAW;AAElC,QAAI,KAAK,YAAY;AACnB,WAAK,SAAS,IAAI,OAAO,KAAK,WAAW,UAAU;AAAA,IACrD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,gBAAyB;AAC3B,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,UAAyB;AAC3B,WAAO,KAAK,QAAQ,WAAW;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,YAA0B;AACxB,WAAO,EAAE,GAAG,KAAK,OAAO;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,SAAgD;AAC3D,QAAI,QAAQ,aAAa,QAAW;AAClC,WAAK,OAAO,OAAO,WAAW,QAAQ;AAAA,IACxC;AACA,QAAI,QAAQ,cAAc,QAAW;AACnC,WAAK,OAAO,OAAO,YAAY,QAAQ;AAAA,IACzC;AACA,SAAK,WAAW;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,WAA8C;AAC9D,UAAM,MAAM,MAAM,MAAM,GAAG,SAAS,WAAW;AAC/C,QAAI,CAAC,IAAI,IAAI;AACX,YAAM,IAAI,MAAM,2BAA2B,IAAI,UAAU,EAAE;AAAA,IAC7D;AACA,WAAO,IAAI,KAAK;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IACJ,WACA,SACA,QAC8B;AAC9B,QAAI,CAAC,KAAK,QAAQ;AAChB,YAAM,IAAI,MAAM,gDAAgD;AAAA,IAClE;AAGA,UAAM,SAAS,MAAM,MAAM,GAAG,SAAS,QAAQ;AAAA,MAC7C,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAC9C,MAAM,KAAK,UAAU,EAAE,SAAS,OAAO,CAAC;AAAA,IAC1C,CAAC;AAED,QAAI,OAAO,WAAW,KAAK;AACzB,YAAM,MAAM,MAAM,OAAO,KAAK;AAC9B,YAAM,IAAI,MAAM,IAAI,SAAS,qBAAqB;AAAA,IACpD;AAEA,UAAM,aAAa,MAAM,OAAO,KAAK;AACrC,UAAM,EAAE,QAAQ,IAAI;AAGpB,SAAK,YAAY,QAAQ,MAAM;AAG/B,YAAQ,IAAI,sBAAsB,QAAQ,MAAM,IAAI,QAAQ,QAAQ,OAAO,QAAQ,MAAM,EAAE;AAC3F,UAAM,SAAS,MAAM,KAAK,eAAe,OAAO;AAChD,YAAQ,IAAI,0BAA0B,MAAM,EAAE;AAG9C,UAAM,YAAY,MAAM,MAAM,GAAG,SAAS,WAAW;AAAA,MACnD,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAC9C,MAAM,KAAK,UAAU;AAAA,QACnB,UAAU,QAAQ;AAAA,QAClB;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAED,QAAI,CAAC,UAAU,IAAI;AACjB,YAAM,MAAM,MAAM,UAAU,KAAK;AACjC,YAAM,IAAI,MAAM,IAAI,SAAS,qBAAqB;AAAA,IACpD;AAEA,UAAM,SAAS,MAAM,UAAU,KAAK;AAGpC,SAAK,eAAe,QAAQ,MAAM;AAElC,WAAO,OAAO;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAY,QAAsB;AAExC,QAAI,SAAS,KAAK,OAAO,OAAO,UAAU;AACxC,YAAM,IAAI;AAAA,QACR,WAAW,MAAM,kCAAkC,KAAK,OAAO,OAAO,QAAQ;AAAA,MAChF;AAAA,IACF;AAGA,UAAM,SAAQ,oBAAI,KAAK,GAAE,SAAS,GAAG,GAAG,GAAG,CAAC;AAC5C,QAAI,QAAQ,KAAK,mBAAmB;AAClC,WAAK,gBAAgB;AACrB,WAAK,oBAAoB;AAAA,IAC3B;AAGA,QAAI,KAAK,gBAAgB,SAAS,KAAK,OAAO,OAAO,WAAW;AAC9D,YAAM,IAAI;AAAA,QACR,8BAA8B,KAAK,aAAa,OAAO,MAAM,OAAO,KAAK,OAAO,OAAO,SAAS;AAAA,MAClG;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAe,QAAsB;AAC3C,SAAK,iBAAiB;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,eAAe,SAAsD;AACjF,QAAI;AACJ,QAAI;AACF,cAAQ,SAAS,QAAQ,KAAkB;AAAA,IAC7C,QAAQ;AACN,YAAM,IAAI,MAAM,kBAAkB,QAAQ,KAAK,EAAE;AAAA,IACnD;AAIA,UAAM,EAAE,OAAO,IAAI,MAAM,OAAO,QAAQ;AAExC,UAAM,WAAW,IAAI,OAAO,gBAAgB,MAAM,GAAG;AACrD,UAAM,SAAS,IAAI,OAAO,OAAO,KAAK,WAAY,YAAY,QAAQ;AAGtE,UAAM,cAAc,MAAM;AAC1B,UAAM,UAAU;AAAA,MACd;AAAA,MACA;AAAA,IACF;AAEA,UAAM,OAAO,IAAI,OAAO,SAAS,aAAa,SAAS,MAAM;AAG7D,UAAM,gBAAgB,OAAO,WAAW,QAAQ,OAAO,SAAS,GAAG,CAAC;AAGpE,UAAM,UAAU,MAAM,KAAK,UAAU,KAAK,OAAQ,OAAO;AACzD,QAAI,UAAU,eAAe;AAC3B,YAAM,IAAI;AAAA,QACR,8BAA8B,OAAO,YAAY,SAAS,CAAC,CAAC,MAAM,QAAQ,MAAM;AAAA,MAClF;AAAA,IACF;AAGA,UAAM,KAAK,MAAM,KAAK,SAAS,QAAQ,QAAQ,aAAa;AAC5D,UAAM,UAAU,MAAM,GAAG,KAAK;AAE9B,WAAO,QAAQ;AAAA,EACjB;AAAA;AAAA,EAIQ,aAA2B;AACjC,UAAM,aAAa,KAAK,KAAK,WAAW,aAAa;AACrD,QAAI,WAAW,UAAU,GAAG;AAC1B,YAAM,UAAU,aAAa,YAAY,OAAO;AAChD,aAAO,EAAE,GAAG,gBAAgB,GAAG,KAAK,MAAM,OAAO,EAAE;AAAA,IACrD;AACA,WAAO,EAAE,GAAG,eAAe;AAAA,EAC7B;AAAA,EAEQ,aAAmB;AACzB,cAAU,KAAK,WAAW,EAAE,WAAW,KAAK,CAAC;AAC7C,UAAM,aAAa,KAAK,KAAK,WAAW,aAAa;AACrD,kBAAc,YAAY,KAAK,UAAU,KAAK,QAAQ,MAAM,CAAC,CAAC;AAAA,EAChE;AAAA,EAEQ,aAAgC;AACtC,UAAM,aAAa,KAAK,KAAK,WAAW,aAAa;AACrD,QAAI,WAAW,UAAU,GAAG;AAC1B,YAAM,UAAU,aAAa,YAAY,OAAO;AAChD,aAAO,KAAK,MAAM,OAAO;AAAA,IAC3B;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,KACL,WACA,SACwC;AACxC,cAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AAGxC,UAAM,SAAS,OAAO,aAAa;AACnC,UAAM,aAAyB;AAAA,MAC7B,SAAS,OAAO;AAAA,MAChB,YAAY,OAAO;AAAA,MACnB,WAAW,KAAK,IAAI;AAAA,IACtB;AAGA,UAAM,aAAa,KAAK,WAAW,aAAa;AAChD,kBAAc,YAAY,KAAK,UAAU,YAAY,MAAM,CAAC,CAAC;AAG7D,UAAM,SAAuB;AAAA,MAC3B,OAAO,QAAQ;AAAA,MACf,QAAQ;AAAA,QACN,UAAU,QAAQ;AAAA,QAClB,WAAW,QAAQ;AAAA,MACrB;AAAA,IACF;AACA,UAAM,aAAa,KAAK,WAAW,aAAa;AAChD,kBAAc,YAAY,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAEzD,WAAO,EAAE,SAAS,OAAO,SAAS,UAAU;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAwD;AAC5D,QAAI,CAAC,KAAK,QAAQ;AAChB,YAAM,IAAI,MAAM,wBAAwB;AAAA,IAC1C;AAEA,QAAI;AACJ,QAAI;AACF,cAAQ,SAAS,KAAK,OAAO,KAAkB;AAAA,IACjD,QAAQ;AACN,YAAM,IAAI,MAAM,kBAAkB,KAAK,OAAO,KAAK,EAAE;AAAA,IACvD;AAEA,UAAM,EAAE,OAAO,IAAI,MAAM,OAAO,QAAQ;AACxC,UAAM,WAAW,IAAI,OAAO,gBAAgB,MAAM,GAAG;AAGrD,UAAM,gBAAgB,MAAM,SAAS,WAAW,KAAK,OAAO,OAAO;AAGnE,UAAM,UAAU,CAAC,oDAAoD;AACrE,UAAM,OAAO,IAAI,OAAO,SAAS,MAAM,MAAM,SAAS,QAAQ;AAC9D,UAAM,cAAc,MAAM,KAAK,UAAU,KAAK,OAAO,OAAO;AAE5D,WAAO;AAAA,MACL,MAAM,WAAW,OAAO,YAAY,aAAa,CAAC,CAAC;AAAA,MACnD,QAAQ,WAAW,OAAO,YAAY,aAAa,CAAC;AAAA,IACtD;AAAA,EACF;AACF;","names":[]}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * createWallet - Create a new wallet for Agent
3
+ *
4
+ * Features:
5
+ * - Generate new Ethereum wallet
6
+ * - Securely store private key (encrypted or plaintext, depending on config)
7
+ * - Return wallet address (never return private key)
8
+ */
9
+ interface CreateWalletOptions {
10
+ /** Storage path, default ~/.moltspay/wallet.json */
11
+ storagePath?: string;
12
+ /** Encryption password (optional, plaintext if not provided) */
13
+ password?: string;
14
+ /** Wallet label/name */
15
+ label?: string;
16
+ /** Overwrite if wallet exists */
17
+ overwrite?: boolean;
18
+ }
19
+ interface WalletData {
20
+ address: string;
21
+ label?: string;
22
+ createdAt: string;
23
+ encrypted: boolean;
24
+ /** Encrypted or plaintext private key */
25
+ privateKey: string;
26
+ /** Encryption IV */
27
+ iv?: string;
28
+ /** Encryption salt */
29
+ salt?: string;
30
+ }
31
+ interface CreateWalletResult {
32
+ success: boolean;
33
+ address?: string;
34
+ storagePath?: string;
35
+ error?: string;
36
+ /** Whether newly created (false means loaded existing) */
37
+ isNew?: boolean;
38
+ }
39
+ /**
40
+ * Create new wallet
41
+ *
42
+ * @example
43
+ * ```typescript
44
+ * // Create unencrypted wallet
45
+ * const result = await createWallet();
46
+ * console.log('Wallet address:', result.address);
47
+ *
48
+ * // Create encrypted wallet
49
+ * const result = await createWallet({ password: 'mySecurePassword' });
50
+ *
51
+ * // Specify storage path
52
+ * const result = await createWallet({ storagePath: './my-wallet.json' });
53
+ * ```
54
+ */
55
+ declare function createWallet(options?: CreateWalletOptions): CreateWalletResult;
56
+ /**
57
+ * Load existing wallet
58
+ */
59
+ declare function loadWallet(options?: {
60
+ storagePath?: string;
61
+ password?: string;
62
+ }): {
63
+ success: boolean;
64
+ address?: string;
65
+ privateKey?: string;
66
+ error?: string;
67
+ };
68
+ /**
69
+ * Get wallet address (no password required)
70
+ */
71
+ declare function getWalletAddress(storagePath?: string): string | null;
72
+ /**
73
+ * Check if wallet exists
74
+ */
75
+ declare function walletExists(storagePath?: string): boolean;
76
+
77
+ export { type CreateWalletOptions as C, type WalletData as W, type CreateWalletResult as a, createWallet as c, getWalletAddress as g, loadWallet as l, walletExists as w };
@@ -0,0 +1,77 @@
1
+ /**
2
+ * createWallet - Create a new wallet for Agent
3
+ *
4
+ * Features:
5
+ * - Generate new Ethereum wallet
6
+ * - Securely store private key (encrypted or plaintext, depending on config)
7
+ * - Return wallet address (never return private key)
8
+ */
9
+ interface CreateWalletOptions {
10
+ /** Storage path, default ~/.moltspay/wallet.json */
11
+ storagePath?: string;
12
+ /** Encryption password (optional, plaintext if not provided) */
13
+ password?: string;
14
+ /** Wallet label/name */
15
+ label?: string;
16
+ /** Overwrite if wallet exists */
17
+ overwrite?: boolean;
18
+ }
19
+ interface WalletData {
20
+ address: string;
21
+ label?: string;
22
+ createdAt: string;
23
+ encrypted: boolean;
24
+ /** Encrypted or plaintext private key */
25
+ privateKey: string;
26
+ /** Encryption IV */
27
+ iv?: string;
28
+ /** Encryption salt */
29
+ salt?: string;
30
+ }
31
+ interface CreateWalletResult {
32
+ success: boolean;
33
+ address?: string;
34
+ storagePath?: string;
35
+ error?: string;
36
+ /** Whether newly created (false means loaded existing) */
37
+ isNew?: boolean;
38
+ }
39
+ /**
40
+ * Create new wallet
41
+ *
42
+ * @example
43
+ * ```typescript
44
+ * // Create unencrypted wallet
45
+ * const result = await createWallet();
46
+ * console.log('Wallet address:', result.address);
47
+ *
48
+ * // Create encrypted wallet
49
+ * const result = await createWallet({ password: 'mySecurePassword' });
50
+ *
51
+ * // Specify storage path
52
+ * const result = await createWallet({ storagePath: './my-wallet.json' });
53
+ * ```
54
+ */
55
+ declare function createWallet(options?: CreateWalletOptions): CreateWalletResult;
56
+ /**
57
+ * Load existing wallet
58
+ */
59
+ declare function loadWallet(options?: {
60
+ storagePath?: string;
61
+ password?: string;
62
+ }): {
63
+ success: boolean;
64
+ address?: string;
65
+ privateKey?: string;
66
+ error?: string;
67
+ };
68
+ /**
69
+ * Get wallet address (no password required)
70
+ */
71
+ declare function getWalletAddress(storagePath?: string): string | null;
72
+ /**
73
+ * Check if wallet exists
74
+ */
75
+ declare function walletExists(storagePath?: string): boolean;
76
+
77
+ export { type CreateWalletOptions as C, type WalletData as W, type CreateWalletResult as a, createWallet as c, getWalletAddress as g, loadWallet as l, walletExists as w };
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Payment Agent Type Definitions
3
+ */
4
+ interface ChainConfig {
5
+ name: string;
6
+ chainId: number;
7
+ rpc: string;
8
+ usdc: string;
9
+ explorer: string;
10
+ explorerTx: string;
11
+ avgBlockTime: number;
12
+ }
13
+ type ChainName = 'base' | 'base_sepolia' | 'polygon' | 'ethereum' | 'sepolia';
14
+ interface WalletBalance {
15
+ address: string;
16
+ eth: string;
17
+ usdc: string;
18
+ chain: string;
19
+ }
20
+ interface TransferResult {
21
+ success: boolean;
22
+ tx_hash?: string;
23
+ from?: string;
24
+ to?: string;
25
+ amount?: number;
26
+ gas_used?: number;
27
+ block_number?: number;
28
+ explorer_url?: string;
29
+ error?: string;
30
+ }
31
+
32
+ export type { ChainName as C, TransferResult as T, WalletBalance as W, ChainConfig as a };
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Payment Agent Type Definitions
3
+ */
4
+ interface ChainConfig {
5
+ name: string;
6
+ chainId: number;
7
+ rpc: string;
8
+ usdc: string;
9
+ explorer: string;
10
+ explorerTx: string;
11
+ avgBlockTime: number;
12
+ }
13
+ type ChainName = 'base' | 'base_sepolia' | 'polygon' | 'ethereum' | 'sepolia';
14
+ interface WalletBalance {
15
+ address: string;
16
+ eth: string;
17
+ usdc: string;
18
+ chain: string;
19
+ }
20
+ interface TransferResult {
21
+ success: boolean;
22
+ tx_hash?: string;
23
+ from?: string;
24
+ to?: string;
25
+ amount?: number;
26
+ gas_used?: number;
27
+ block_number?: number;
28
+ explorer_url?: string;
29
+ error?: string;
30
+ }
31
+
32
+ export type { ChainName as C, TransferResult as T, WalletBalance as W, ChainConfig as a };