moltspay 0.9.7 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +42 -3
- package/dist/cdp/index.js +1 -1
- package/dist/cdp/index.js.map +1 -1
- package/dist/cdp/index.mjs +1 -1
- package/dist/cdp/index.mjs.map +1 -1
- package/dist/chains/index.js +1 -1
- package/dist/chains/index.js.map +1 -1
- package/dist/chains/index.mjs +1 -1
- package/dist/chains/index.mjs.map +1 -1
- package/dist/cli/index.js +206 -47
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/index.mjs +206 -47
- package/dist/cli/index.mjs.map +1 -1
- package/dist/client/index.d.mts +11 -1
- package/dist/client/index.d.ts +11 -1
- package/dist/client/index.js +76 -6
- package/dist/client/index.js.map +1 -1
- package/dist/client/index.mjs +76 -6
- package/dist/client/index.mjs.map +1 -1
- package/dist/facilitators/index.js +1 -1
- package/dist/facilitators/index.js.map +1 -1
- package/dist/facilitators/index.mjs +1 -1
- package/dist/facilitators/index.mjs.map +1 -1
- package/dist/index.js +180 -32
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +180 -32
- package/dist/index.mjs.map +1 -1
- package/dist/server/index.d.mts +25 -5
- package/dist/server/index.d.ts +25 -5
- package/dist/server/index.js +104 -26
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +104 -26
- package/dist/server/index.mjs.map +1 -1
- package/dist/verify/index.js +1 -1
- package/dist/verify/index.js.map +1 -1
- package/dist/verify/index.mjs +1 -1
- package/dist/verify/index.mjs.map +1 -1
- package/dist/wallet/index.js +1 -1
- package/dist/wallet/index.js.map +1 -1
- package/dist/wallet/index.mjs +1 -1
- package/dist/wallet/index.mjs.map +1 -1
- package/package.json +1 -1
- package/schemas/moltspay.services.schema.json +58 -2
package/dist/chains/index.js
CHANGED
package/dist/chains/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/chains/index.ts"],"sourcesContent":["/**\n * Blockchain Configuration\n */\n\nimport type { ChainConfig, ChainName, TokenSymbol } 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 tokens: {\n USDC: {\n address: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',\n decimals: 6,\n symbol: 'USDC',\n },\n USDT: {\n address: '0xfde4C96c8593536E31F229EA8f37b2ADa2699bb2',\n decimals: 6,\n symbol: 'USDT',\n },\n },\n usdc: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913', // deprecated, for backward compat\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 tokens: {\n USDC: {\n address: '0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359',\n decimals: 6,\n symbol: 'USDC',\n },\n USDT: {\n address: '0xc2132D05D31c914a87C6611C10748AEb04B58e8F',\n decimals: 6,\n symbol: 'USDT',\n },\n },\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 tokens: {\n USDC: {\n address: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',\n decimals: 6,\n symbol: 'USDC',\n },\n USDT: {\n address: '0xdAC17F958D2ee523a2206206994597C13D831ec7',\n decimals: 6,\n symbol: 'USDT',\n },\n },\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 tokens: {\n USDC: {\n address: '0x036CbD53842c5426634e7929541eC2318f3dCF7e',\n decimals: 6,\n symbol: 'USDC',\n },\n USDT: {\n address: '0x036CbD53842c5426634e7929541eC2318f3dCF7e', // Same as USDC on testnet (no official USDT)\n decimals: 6,\n symbol: 'USDT',\n },\n },\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 tokens: {\n USDC: {\n address: '0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238',\n decimals: 6,\n symbol: 'USDC',\n },\n USDT: {\n address: '0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238', // Same as USDC on testnet\n decimals: 6,\n symbol: 'USDT',\n },\n },\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 token address for a chain\n */\nexport function getTokenAddress(chainName: ChainName, token: TokenSymbol): string {\n const chain = CHAINS[chainName];\n if (!chain) {\n throw new Error(`Unsupported chain: ${chainName}`);\n }\n const tokenConfig = chain.tokens[token];\n if (!tokenConfig) {\n throw new Error(`Token ${token} not supported on ${chainName}`);\n }\n return tokenConfig.address;\n}\n\n/**\n * Get token config for a chain\n */\nexport function getTokenConfig(chainName: ChainName, token: TokenSymbol) {\n const chain = CHAINS[chainName];\n if (!chain) {\n throw new Error(`Unsupported chain: ${chainName}`);\n }\n return chain.tokens[token];\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, TokenSymbol };\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/chains/index.ts"],"sourcesContent":["/**\n * Blockchain Configuration\n */\n\nimport type { ChainConfig, ChainName, TokenSymbol } 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 tokens: {\n USDC: {\n address: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',\n decimals: 6,\n symbol: 'USDC',\n },\n USDT: {\n address: '0xfde4C96c8593536E31F229EA8f37b2ADa2699bb2',\n decimals: 6,\n symbol: 'USDT',\n },\n },\n usdc: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913', // deprecated, for backward compat\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-bor-rpc.publicnode.com',\n tokens: {\n USDC: {\n address: '0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359',\n decimals: 6,\n symbol: 'USDC',\n },\n USDT: {\n address: '0xc2132D05D31c914a87C6611C10748AEb04B58e8F',\n decimals: 6,\n symbol: 'USDT',\n },\n },\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 tokens: {\n USDC: {\n address: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',\n decimals: 6,\n symbol: 'USDC',\n },\n USDT: {\n address: '0xdAC17F958D2ee523a2206206994597C13D831ec7',\n decimals: 6,\n symbol: 'USDT',\n },\n },\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 tokens: {\n USDC: {\n address: '0x036CbD53842c5426634e7929541eC2318f3dCF7e',\n decimals: 6,\n symbol: 'USDC',\n },\n USDT: {\n address: '0x036CbD53842c5426634e7929541eC2318f3dCF7e', // Same as USDC on testnet (no official USDT)\n decimals: 6,\n symbol: 'USDT',\n },\n },\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 tokens: {\n USDC: {\n address: '0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238',\n decimals: 6,\n symbol: 'USDC',\n },\n USDT: {\n address: '0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238', // Same as USDC on testnet\n decimals: 6,\n symbol: 'USDT',\n },\n },\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 token address for a chain\n */\nexport function getTokenAddress(chainName: ChainName, token: TokenSymbol): string {\n const chain = CHAINS[chainName];\n if (!chain) {\n throw new Error(`Unsupported chain: ${chainName}`);\n }\n const tokenConfig = chain.tokens[token];\n if (!tokenConfig) {\n throw new Error(`Token ${token} not supported on ${chainName}`);\n }\n return tokenConfig.address;\n}\n\n/**\n * Get token config for a chain\n */\nexport function getTokenConfig(chainName: ChainName, token: TokenSymbol) {\n const chain = CHAINS[chainName];\n if (!chain) {\n throw new Error(`Unsupported chain: ${chainName}`);\n }\n return chain.tokens[token];\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, TokenSymbol };\n"],"mappings":"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","names":[]}
|
package/dist/chains/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/chains/index.ts"],"sourcesContent":["/**\n * Blockchain Configuration\n */\n\nimport type { ChainConfig, ChainName, TokenSymbol } 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 tokens: {\n USDC: {\n address: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',\n decimals: 6,\n symbol: 'USDC',\n },\n USDT: {\n address: '0xfde4C96c8593536E31F229EA8f37b2ADa2699bb2',\n decimals: 6,\n symbol: 'USDT',\n },\n },\n usdc: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913', // deprecated, for backward compat\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 tokens: {\n USDC: {\n address: '0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359',\n decimals: 6,\n symbol: 'USDC',\n },\n USDT: {\n address: '0xc2132D05D31c914a87C6611C10748AEb04B58e8F',\n decimals: 6,\n symbol: 'USDT',\n },\n },\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 tokens: {\n USDC: {\n address: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',\n decimals: 6,\n symbol: 'USDC',\n },\n USDT: {\n address: '0xdAC17F958D2ee523a2206206994597C13D831ec7',\n decimals: 6,\n symbol: 'USDT',\n },\n },\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 tokens: {\n USDC: {\n address: '0x036CbD53842c5426634e7929541eC2318f3dCF7e',\n decimals: 6,\n symbol: 'USDC',\n },\n USDT: {\n address: '0x036CbD53842c5426634e7929541eC2318f3dCF7e', // Same as USDC on testnet (no official USDT)\n decimals: 6,\n symbol: 'USDT',\n },\n },\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 tokens: {\n USDC: {\n address: '0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238',\n decimals: 6,\n symbol: 'USDC',\n },\n USDT: {\n address: '0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238', // Same as USDC on testnet\n decimals: 6,\n symbol: 'USDT',\n },\n },\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 token address for a chain\n */\nexport function getTokenAddress(chainName: ChainName, token: TokenSymbol): string {\n const chain = CHAINS[chainName];\n if (!chain) {\n throw new Error(`Unsupported chain: ${chainName}`);\n }\n const tokenConfig = chain.tokens[token];\n if (!tokenConfig) {\n throw new Error(`Token ${token} not supported on ${chainName}`);\n }\n return tokenConfig.address;\n}\n\n/**\n * Get token config for a chain\n */\nexport function getTokenConfig(chainName: ChainName, token: TokenSymbol) {\n const chain = CHAINS[chainName];\n if (!chain) {\n throw new Error(`Unsupported chain: ${chainName}`);\n }\n return chain.tokens[token];\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, TokenSymbol };\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/chains/index.ts"],"sourcesContent":["/**\n * Blockchain Configuration\n */\n\nimport type { ChainConfig, ChainName, TokenSymbol } 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 tokens: {\n USDC: {\n address: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',\n decimals: 6,\n symbol: 'USDC',\n },\n USDT: {\n address: '0xfde4C96c8593536E31F229EA8f37b2ADa2699bb2',\n decimals: 6,\n symbol: 'USDT',\n },\n },\n usdc: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913', // deprecated, for backward compat\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-bor-rpc.publicnode.com',\n tokens: {\n USDC: {\n address: '0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359',\n decimals: 6,\n symbol: 'USDC',\n },\n USDT: {\n address: '0xc2132D05D31c914a87C6611C10748AEb04B58e8F',\n decimals: 6,\n symbol: 'USDT',\n },\n },\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 tokens: {\n USDC: {\n address: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',\n decimals: 6,\n symbol: 'USDC',\n },\n USDT: {\n address: '0xdAC17F958D2ee523a2206206994597C13D831ec7',\n decimals: 6,\n symbol: 'USDT',\n },\n },\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 tokens: {\n USDC: {\n address: '0x036CbD53842c5426634e7929541eC2318f3dCF7e',\n decimals: 6,\n symbol: 'USDC',\n },\n USDT: {\n address: '0x036CbD53842c5426634e7929541eC2318f3dCF7e', // Same as USDC on testnet (no official USDT)\n decimals: 6,\n symbol: 'USDT',\n },\n },\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 tokens: {\n USDC: {\n address: '0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238',\n decimals: 6,\n symbol: 'USDC',\n },\n USDT: {\n address: '0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238', // Same as USDC on testnet\n decimals: 6,\n symbol: 'USDT',\n },\n },\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 token address for a chain\n */\nexport function getTokenAddress(chainName: ChainName, token: TokenSymbol): string {\n const chain = CHAINS[chainName];\n if (!chain) {\n throw new Error(`Unsupported chain: ${chainName}`);\n }\n const tokenConfig = chain.tokens[token];\n if (!tokenConfig) {\n throw new Error(`Token ${token} not supported on ${chainName}`);\n }\n return tokenConfig.address;\n}\n\n/**\n * Get token config for a chain\n */\nexport function getTokenConfig(chainName: ChainName, token: TokenSymbol) {\n const chain = CHAINS[chainName];\n if (!chain) {\n throw new Error(`Unsupported chain: ${chainName}`);\n }\n return chain.tokens[token];\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, TokenSymbol };\n"],"mappings":"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","names":[]}
|
package/dist/cli/index.js
CHANGED
|
@@ -64,7 +64,7 @@ var CHAINS = {
|
|
|
64
64
|
polygon: {
|
|
65
65
|
name: "Polygon",
|
|
66
66
|
chainId: 137,
|
|
67
|
-
rpc: "https://polygon-rpc.com",
|
|
67
|
+
rpc: "https://polygon-bor-rpc.publicnode.com",
|
|
68
68
|
tokens: {
|
|
69
69
|
USDC: {
|
|
70
70
|
address: "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359",
|
|
@@ -240,10 +240,14 @@ var MoltsPayClient = class {
|
|
|
240
240
|
throw new Error("Client not initialized. Run: npx moltspay init");
|
|
241
241
|
}
|
|
242
242
|
console.log(`[MoltsPay] Requesting service: ${service}`);
|
|
243
|
+
const requestBody = { service, params };
|
|
244
|
+
if (options.chain) {
|
|
245
|
+
requestBody.chain = options.chain;
|
|
246
|
+
}
|
|
243
247
|
const initialRes = await fetch(`${serverUrl}/execute`, {
|
|
244
248
|
method: "POST",
|
|
245
249
|
headers: { "Content-Type": "application/json" },
|
|
246
|
-
body: JSON.stringify(
|
|
250
|
+
body: JSON.stringify(requestBody)
|
|
247
251
|
});
|
|
248
252
|
if (initialRes.status !== 402) {
|
|
249
253
|
const data = await initialRes.json();
|
|
@@ -270,11 +274,41 @@ var MoltsPayClient = class {
|
|
|
270
274
|
} catch {
|
|
271
275
|
throw new Error("Invalid x-payment-required header");
|
|
272
276
|
}
|
|
273
|
-
const
|
|
277
|
+
const networkToChainName = (network2) => {
|
|
278
|
+
const match = network2.match(/^eip155:(\d+)$/);
|
|
279
|
+
if (!match) return null;
|
|
280
|
+
const chainId = parseInt(match[1]);
|
|
281
|
+
if (chainId === 8453) return "base";
|
|
282
|
+
if (chainId === 137) return "polygon";
|
|
283
|
+
if (chainId === 84532) return "base_sepolia";
|
|
284
|
+
return null;
|
|
285
|
+
};
|
|
286
|
+
const serverChains = requirements.map((r) => networkToChainName(r.network)).filter((c) => c !== null);
|
|
287
|
+
let chainName;
|
|
288
|
+
const userSpecifiedChain = options.chain;
|
|
289
|
+
if (userSpecifiedChain) {
|
|
290
|
+
if (!serverChains.includes(userSpecifiedChain)) {
|
|
291
|
+
throw new Error(
|
|
292
|
+
`Server doesn't accept '${userSpecifiedChain}'.
|
|
293
|
+
Server accepts: ${serverChains.join(", ")}`
|
|
294
|
+
);
|
|
295
|
+
}
|
|
296
|
+
chainName = userSpecifiedChain;
|
|
297
|
+
} else {
|
|
298
|
+
if (serverChains.length === 1 && serverChains[0] === "base") {
|
|
299
|
+
chainName = "base";
|
|
300
|
+
} else {
|
|
301
|
+
throw new Error(
|
|
302
|
+
`Server accepts: ${serverChains.join(", ")}
|
|
303
|
+
Please specify: --chain base or --chain polygon`
|
|
304
|
+
);
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
const chain = getChain(chainName);
|
|
274
308
|
const network = `eip155:${chain.chainId}`;
|
|
275
309
|
const req = requirements.find((r) => r.scheme === "exact" && r.network === network);
|
|
276
310
|
if (!req) {
|
|
277
|
-
throw new Error(`
|
|
311
|
+
throw new Error(`Failed to find payment requirement for ${chainName}`);
|
|
278
312
|
}
|
|
279
313
|
const amountRaw = req.amount || req.maxAmountRequired;
|
|
280
314
|
if (!amountRaw) {
|
|
@@ -327,13 +361,17 @@ var MoltsPayClient = class {
|
|
|
327
361
|
};
|
|
328
362
|
const paymentHeader = Buffer.from(JSON.stringify(payload)).toString("base64");
|
|
329
363
|
console.log(`[MoltsPay] Sending request with payment...`);
|
|
364
|
+
const paidRequestBody = { service, params };
|
|
365
|
+
if (options.chain) {
|
|
366
|
+
paidRequestBody.chain = options.chain;
|
|
367
|
+
}
|
|
330
368
|
const paidRes = await fetch(`${serverUrl}/execute`, {
|
|
331
369
|
method: "POST",
|
|
332
370
|
headers: {
|
|
333
371
|
"Content-Type": "application/json",
|
|
334
372
|
[PAYMENT_HEADER]: paymentHeader
|
|
335
373
|
},
|
|
336
|
-
body: JSON.stringify(
|
|
374
|
+
body: JSON.stringify(paidRequestBody)
|
|
337
375
|
});
|
|
338
376
|
const result = await paidRes.json();
|
|
339
377
|
if (!paidRes.ok) {
|
|
@@ -502,7 +540,7 @@ var MoltsPayClient = class {
|
|
|
502
540
|
return { address: wallet.address, configDir };
|
|
503
541
|
}
|
|
504
542
|
/**
|
|
505
|
-
* Get wallet balance (USDC, USDT, and native token)
|
|
543
|
+
* Get wallet balance (USDC, USDT, and native token) on default chain
|
|
506
544
|
*/
|
|
507
545
|
async getBalance() {
|
|
508
546
|
if (!this.wallet) {
|
|
@@ -527,6 +565,38 @@ var MoltsPayClient = class {
|
|
|
527
565
|
native: parseFloat(import_ethers.ethers.formatEther(nativeBalance))
|
|
528
566
|
};
|
|
529
567
|
}
|
|
568
|
+
/**
|
|
569
|
+
* Get wallet balances on all supported chains (Base + Polygon)
|
|
570
|
+
*/
|
|
571
|
+
async getAllBalances() {
|
|
572
|
+
if (!this.wallet) {
|
|
573
|
+
throw new Error("Client not initialized");
|
|
574
|
+
}
|
|
575
|
+
const supportedChains = ["base", "polygon"];
|
|
576
|
+
const tokenAbi = ["function balanceOf(address) view returns (uint256)"];
|
|
577
|
+
const results = {};
|
|
578
|
+
await Promise.all(
|
|
579
|
+
supportedChains.map(async (chainName) => {
|
|
580
|
+
try {
|
|
581
|
+
const chain = getChain(chainName);
|
|
582
|
+
const provider = new import_ethers.ethers.JsonRpcProvider(chain.rpc);
|
|
583
|
+
const [nativeBalance, usdcBalance, usdtBalance] = await Promise.all([
|
|
584
|
+
provider.getBalance(this.wallet.address),
|
|
585
|
+
new import_ethers.ethers.Contract(chain.tokens.USDC.address, tokenAbi, provider).balanceOf(this.wallet.address),
|
|
586
|
+
new import_ethers.ethers.Contract(chain.tokens.USDT.address, tokenAbi, provider).balanceOf(this.wallet.address)
|
|
587
|
+
]);
|
|
588
|
+
results[chainName] = {
|
|
589
|
+
usdc: parseFloat(import_ethers.ethers.formatUnits(usdcBalance, chain.tokens.USDC.decimals)),
|
|
590
|
+
usdt: parseFloat(import_ethers.ethers.formatUnits(usdtBalance, chain.tokens.USDT.decimals)),
|
|
591
|
+
native: parseFloat(import_ethers.ethers.formatEther(nativeBalance))
|
|
592
|
+
};
|
|
593
|
+
} catch (err) {
|
|
594
|
+
results[chainName] = { usdc: 0, usdt: 0, native: 0 };
|
|
595
|
+
}
|
|
596
|
+
})
|
|
597
|
+
);
|
|
598
|
+
return results;
|
|
599
|
+
}
|
|
530
600
|
};
|
|
531
601
|
|
|
532
602
|
// src/server/index.ts
|
|
@@ -591,7 +661,7 @@ var CDPFacilitator = class extends BaseFacilitator {
|
|
|
591
661
|
this.apiKeyId = config.apiKeyId || process.env.CDP_API_KEY_ID;
|
|
592
662
|
this.apiKeySecret = config.apiKeySecret || process.env.CDP_API_KEY_SECRET;
|
|
593
663
|
this.endpoint = this.useMainnet ? CDP_MAINNET_URL : CDP_TESTNET_URL;
|
|
594
|
-
this.supportedNetworks = this.useMainnet ? ["eip155:8453"] : ["eip155:8453", "eip155:84532"];
|
|
664
|
+
this.supportedNetworks = this.useMainnet ? ["eip155:8453", "eip155:137"] : ["eip155:8453", "eip155:84532", "eip155:137"];
|
|
595
665
|
if (this.useMainnet && (!this.apiKeyId || !this.apiKeySecret)) {
|
|
596
666
|
console.warn("[CDPFacilitator] WARNING: Mainnet mode but missing CDP credentials!");
|
|
597
667
|
console.warn("[CDPFacilitator] Set CDP_API_KEY_ID and CDP_API_KEY_SECRET");
|
|
@@ -992,8 +1062,17 @@ var TOKEN_ADDRESSES = {
|
|
|
992
1062
|
USDC: "0x036CbD53842c5426634e7929541eC2318f3dCF7e",
|
|
993
1063
|
USDT: "0x036CbD53842c5426634e7929541eC2318f3dCF7e"
|
|
994
1064
|
// Same as USDC on testnet
|
|
1065
|
+
},
|
|
1066
|
+
"eip155:137": {
|
|
1067
|
+
USDC: "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359",
|
|
1068
|
+
USDT: "0xc2132D05D31c914a87C6611C10748AEb04B58e8F"
|
|
995
1069
|
}
|
|
996
1070
|
};
|
|
1071
|
+
var CHAIN_TO_NETWORK = {
|
|
1072
|
+
"base": "eip155:8453",
|
|
1073
|
+
"base_sepolia": "eip155:84532",
|
|
1074
|
+
"polygon": "eip155:137"
|
|
1075
|
+
};
|
|
997
1076
|
var TOKEN_DOMAINS = {
|
|
998
1077
|
USDC: { name: "USD Coin", version: "2" },
|
|
999
1078
|
USDT: { name: "Tether USD", version: "2" }
|
|
@@ -1059,11 +1138,17 @@ var MoltsPayServer = class {
|
|
|
1059
1138
|
};
|
|
1060
1139
|
this.registry = new FacilitatorRegistry(facilitatorConfig);
|
|
1061
1140
|
const primaryFacilitator = this.registry.get(facilitatorConfig.primary);
|
|
1062
|
-
const networkName = this.useMainnet ? "Base mainnet" : "Base Sepolia (testnet)";
|
|
1063
1141
|
console.log(`[MoltsPay] Loaded ${this.manifest.services.length} services from ${servicesPath}`);
|
|
1064
1142
|
console.log(`[MoltsPay] Provider: ${this.manifest.provider.name}`);
|
|
1065
1143
|
console.log(`[MoltsPay] Receive wallet: ${this.manifest.provider.wallet}`);
|
|
1066
|
-
|
|
1144
|
+
const chains = this.manifest.provider.chains;
|
|
1145
|
+
if (chains && chains.length > 0) {
|
|
1146
|
+
const chainNames = chains.map((c) => c.chain || c.network).join(", ");
|
|
1147
|
+
console.log(`[MoltsPay] Chains: ${chainNames} (multi-chain enabled)`);
|
|
1148
|
+
} else {
|
|
1149
|
+
const networkName = this.useMainnet ? "Base mainnet" : "Base Sepolia (testnet)";
|
|
1150
|
+
console.log(`[MoltsPay] Network: ${this.networkId} (${networkName})`);
|
|
1151
|
+
}
|
|
1067
1152
|
console.log(`[MoltsPay] Facilitator: ${primaryFacilitator.displayName} (${facilitatorConfig.strategy || "failover"})`);
|
|
1068
1153
|
console.log(`[MoltsPay] Protocol: x402 (gasless for both client AND server)`);
|
|
1069
1154
|
}
|
|
@@ -1078,6 +1163,42 @@ var MoltsPayServer = class {
|
|
|
1078
1163
|
this.skills.set(serviceId, { id: serviceId, config, handler });
|
|
1079
1164
|
return this;
|
|
1080
1165
|
}
|
|
1166
|
+
/**
|
|
1167
|
+
* Get all configured chains for this provider
|
|
1168
|
+
* Returns array of { network, wallet, tokens } for each chain
|
|
1169
|
+
*/
|
|
1170
|
+
getProviderChains() {
|
|
1171
|
+
const provider = this.manifest.provider;
|
|
1172
|
+
if (provider.chains && provider.chains.length > 0) {
|
|
1173
|
+
return provider.chains.map((c) => ({
|
|
1174
|
+
network: c.network || CHAIN_TO_NETWORK[c.chain] || "eip155:8453",
|
|
1175
|
+
wallet: c.wallet || provider.wallet,
|
|
1176
|
+
tokens: c.tokens || ["USDC"]
|
|
1177
|
+
}));
|
|
1178
|
+
}
|
|
1179
|
+
const chain = provider.chain || "base";
|
|
1180
|
+
const network = CHAIN_TO_NETWORK[chain] || this.networkId;
|
|
1181
|
+
return [{
|
|
1182
|
+
network,
|
|
1183
|
+
wallet: provider.wallet,
|
|
1184
|
+
tokens: ["USDC"]
|
|
1185
|
+
}];
|
|
1186
|
+
}
|
|
1187
|
+
/**
|
|
1188
|
+
* Get wallet address for a specific network
|
|
1189
|
+
*/
|
|
1190
|
+
getWalletForNetwork(network) {
|
|
1191
|
+
const chains = this.getProviderChains();
|
|
1192
|
+
const chain = chains.find((c) => c.network === network);
|
|
1193
|
+
return chain?.wallet || this.manifest.provider.wallet;
|
|
1194
|
+
}
|
|
1195
|
+
/**
|
|
1196
|
+
* Check if a network is accepted by this provider
|
|
1197
|
+
*/
|
|
1198
|
+
isNetworkAccepted(network) {
|
|
1199
|
+
const chains = this.getProviderChains();
|
|
1200
|
+
return chains.some((c) => c.network === network);
|
|
1201
|
+
}
|
|
1081
1202
|
/**
|
|
1082
1203
|
* Start HTTP server
|
|
1083
1204
|
*/
|
|
@@ -1260,7 +1381,9 @@ var MoltsPayServer = class {
|
|
|
1260
1381
|
error: `Token ${paymentToken} not accepted. Accepted: ${accepted.join(", ")}`
|
|
1261
1382
|
});
|
|
1262
1383
|
}
|
|
1263
|
-
const
|
|
1384
|
+
const paymentNetwork = payment.accepted?.network || payment.network || this.networkId;
|
|
1385
|
+
const paymentWallet = this.getWalletForNetwork(paymentNetwork);
|
|
1386
|
+
const requirements = this.buildPaymentRequirements(skill.config, paymentNetwork, paymentWallet, paymentToken);
|
|
1264
1387
|
console.log(`[MoltsPay] Verifying payment...`);
|
|
1265
1388
|
const verifyResult = await this.registry.verify(payment, requirements);
|
|
1266
1389
|
if (!verifyResult.valid) {
|
|
@@ -1315,15 +1438,29 @@ var MoltsPayServer = class {
|
|
|
1315
1438
|
}
|
|
1316
1439
|
/**
|
|
1317
1440
|
* Return 402 with x402 payment requirements (v2 format)
|
|
1318
|
-
* Includes requirements for all accepted currencies
|
|
1441
|
+
* Includes requirements for all chains and all accepted currencies
|
|
1319
1442
|
*/
|
|
1320
1443
|
sendPaymentRequired(config, res) {
|
|
1321
1444
|
const acceptedTokens = getAcceptedCurrencies(config);
|
|
1322
|
-
const
|
|
1445
|
+
const providerChains = this.getProviderChains();
|
|
1446
|
+
const accepts = [];
|
|
1447
|
+
for (const chainConfig of providerChains) {
|
|
1448
|
+
for (const token of acceptedTokens) {
|
|
1449
|
+
if (chainConfig.tokens.includes(token)) {
|
|
1450
|
+
accepts.push(this.buildPaymentRequirements(config, chainConfig.network, chainConfig.wallet, token));
|
|
1451
|
+
}
|
|
1452
|
+
}
|
|
1453
|
+
}
|
|
1454
|
+
const acceptedChains = providerChains.map((c) => {
|
|
1455
|
+
if (c.network === "eip155:8453") return "base";
|
|
1456
|
+
if (c.network === "eip155:137") return "polygon";
|
|
1457
|
+
return c.network;
|
|
1458
|
+
});
|
|
1323
1459
|
const paymentRequired = {
|
|
1324
1460
|
x402Version: X402_VERSION3,
|
|
1325
1461
|
accepts,
|
|
1326
1462
|
acceptedCurrencies: acceptedTokens,
|
|
1463
|
+
acceptedChains,
|
|
1327
1464
|
resource: {
|
|
1328
1465
|
url: `/execute?service=${config.id}`,
|
|
1329
1466
|
description: `${config.name} - $${config.price} ${config.currency}`,
|
|
@@ -1339,6 +1476,7 @@ var MoltsPayServer = class {
|
|
|
1339
1476
|
error: "Payment required",
|
|
1340
1477
|
message: `Service requires $${config.price} ${config.currency}`,
|
|
1341
1478
|
acceptedCurrencies: acceptedTokens,
|
|
1479
|
+
acceptedChains,
|
|
1342
1480
|
x402: paymentRequired
|
|
1343
1481
|
}, null, 2));
|
|
1344
1482
|
}
|
|
@@ -1350,46 +1488,50 @@ var MoltsPayServer = class {
|
|
|
1350
1488
|
return { valid: false, error: `Unsupported x402 version: ${payment.x402Version}` };
|
|
1351
1489
|
}
|
|
1352
1490
|
const scheme = payment.accepted?.scheme || payment.scheme;
|
|
1353
|
-
const network = payment.accepted?.network || payment.network;
|
|
1491
|
+
const network = payment.accepted?.network || payment.network || this.networkId;
|
|
1354
1492
|
if (scheme !== "exact") {
|
|
1355
1493
|
return { valid: false, error: `Unsupported scheme: ${scheme}` };
|
|
1356
1494
|
}
|
|
1357
|
-
if (
|
|
1358
|
-
|
|
1495
|
+
if (!this.isNetworkAccepted(network)) {
|
|
1496
|
+
const acceptedChains = this.getProviderChains().map((c) => c.network).join(", ");
|
|
1497
|
+
return { valid: false, error: `Network not accepted: ${network}. Accepted: ${acceptedChains}` };
|
|
1359
1498
|
}
|
|
1360
1499
|
return { valid: true };
|
|
1361
1500
|
}
|
|
1362
1501
|
/**
|
|
1363
1502
|
* Build payment requirements for facilitator
|
|
1364
|
-
*
|
|
1365
|
-
* Server accepts any of the acceptedCurrencies
|
|
1503
|
+
* Now supports multi-chain: takes network and wallet as parameters
|
|
1366
1504
|
*/
|
|
1367
|
-
buildPaymentRequirements(config, token) {
|
|
1505
|
+
buildPaymentRequirements(config, network, wallet, token) {
|
|
1368
1506
|
const amountInUnits = Math.floor(config.price * 1e6).toString();
|
|
1369
1507
|
const acceptedTokens = getAcceptedCurrencies(config);
|
|
1508
|
+
const selectedNetwork = network || this.networkId;
|
|
1509
|
+
const selectedWallet = wallet || this.manifest.provider.wallet;
|
|
1370
1510
|
const selectedToken = token && acceptedTokens.includes(token) ? token : acceptedTokens[0];
|
|
1371
|
-
const tokenAddresses = TOKEN_ADDRESSES[
|
|
1511
|
+
const tokenAddresses = TOKEN_ADDRESSES[selectedNetwork] || {};
|
|
1372
1512
|
const tokenAddress = tokenAddresses[selectedToken];
|
|
1373
1513
|
const tokenDomain = TOKEN_DOMAINS[selectedToken] || TOKEN_DOMAINS.USDC;
|
|
1374
1514
|
return {
|
|
1375
1515
|
scheme: "exact",
|
|
1376
|
-
network:
|
|
1516
|
+
network: selectedNetwork,
|
|
1377
1517
|
asset: tokenAddress,
|
|
1378
1518
|
amount: amountInUnits,
|
|
1379
|
-
payTo:
|
|
1519
|
+
payTo: selectedWallet,
|
|
1380
1520
|
maxTimeoutSeconds: 300,
|
|
1381
1521
|
extra: tokenDomain
|
|
1382
1522
|
};
|
|
1383
1523
|
}
|
|
1384
1524
|
/**
|
|
1385
1525
|
* Detect which token is being used in the payment
|
|
1526
|
+
* Checks across all supported networks
|
|
1386
1527
|
*/
|
|
1387
1528
|
detectPaymentToken(payment) {
|
|
1388
1529
|
const asset = payment.accepted?.asset || payment.payload?.asset;
|
|
1389
1530
|
if (!asset) return void 0;
|
|
1390
|
-
const
|
|
1531
|
+
const paymentNetwork = payment.accepted?.network || payment.network || this.networkId;
|
|
1532
|
+
const tokenAddresses = TOKEN_ADDRESSES[paymentNetwork] || {};
|
|
1391
1533
|
for (const [symbol, address] of Object.entries(tokenAddresses)) {
|
|
1392
|
-
if (address.toLowerCase() === asset.toLowerCase()) {
|
|
1534
|
+
if (address && address.toLowerCase() === asset.toLowerCase()) {
|
|
1393
1535
|
return symbol;
|
|
1394
1536
|
}
|
|
1395
1537
|
}
|
|
@@ -1464,6 +1606,10 @@ var MoltsPayServer = class {
|
|
|
1464
1606
|
if (isNaN(amountNum) || amountNum <= 0) {
|
|
1465
1607
|
return this.sendJson(res, 400, { error: "Invalid amount" });
|
|
1466
1608
|
}
|
|
1609
|
+
const supportedChains = ["base", "polygon", "base_sepolia"];
|
|
1610
|
+
if (chain && !supportedChains.includes(chain)) {
|
|
1611
|
+
return this.sendJson(res, 400, { error: `Unsupported chain: ${chain}. Supported: ${supportedChains.join(", ")}` });
|
|
1612
|
+
}
|
|
1467
1613
|
const proxyConfig = {
|
|
1468
1614
|
id: serviceId || "proxy",
|
|
1469
1615
|
name: description || "Proxy Payment",
|
|
@@ -1475,9 +1621,9 @@ var MoltsPayServer = class {
|
|
|
1475
1621
|
input: {},
|
|
1476
1622
|
output: {}
|
|
1477
1623
|
};
|
|
1478
|
-
const requirements = this.buildProxyPaymentRequirements(proxyConfig, wallet);
|
|
1624
|
+
const requirements = this.buildProxyPaymentRequirements(proxyConfig, wallet, currency, chain);
|
|
1479
1625
|
if (!paymentHeader) {
|
|
1480
|
-
return this.sendProxyPaymentRequired(proxyConfig, wallet, memo, res);
|
|
1626
|
+
return this.sendProxyPaymentRequired(proxyConfig, wallet, memo, chain, res);
|
|
1481
1627
|
}
|
|
1482
1628
|
let payment;
|
|
1483
1629
|
try {
|
|
@@ -1494,8 +1640,9 @@ var MoltsPayServer = class {
|
|
|
1494
1640
|
if (scheme !== "exact") {
|
|
1495
1641
|
return this.sendJson(res, 402, { error: `Unsupported scheme: ${scheme}` });
|
|
1496
1642
|
}
|
|
1497
|
-
|
|
1498
|
-
|
|
1643
|
+
const expectedNetwork = chain ? CHAIN_TO_NETWORK[chain] || this.networkId : this.networkId;
|
|
1644
|
+
if (network !== expectedNetwork) {
|
|
1645
|
+
return this.sendJson(res, 402, { error: `Network mismatch: expected ${expectedNetwork}, got ${network}` });
|
|
1499
1646
|
}
|
|
1500
1647
|
console.log(`[MoltsPay] /proxy: Verifying payment for ${wallet}...`);
|
|
1501
1648
|
const verifyResult = await this.registry.verify(payment, requirements);
|
|
@@ -1601,16 +1748,17 @@ var MoltsPayServer = class {
|
|
|
1601
1748
|
/**
|
|
1602
1749
|
* Build payment requirements for proxy endpoint (uses provided wallet)
|
|
1603
1750
|
*/
|
|
1604
|
-
buildProxyPaymentRequirements(config, wallet, token) {
|
|
1751
|
+
buildProxyPaymentRequirements(config, wallet, token, chain) {
|
|
1605
1752
|
const amountInUnits = Math.floor(config.price * 1e6).toString();
|
|
1606
1753
|
const acceptedTokens = getAcceptedCurrencies(config);
|
|
1754
|
+
const networkId = chain ? CHAIN_TO_NETWORK[chain] || this.networkId : this.networkId;
|
|
1607
1755
|
const selectedToken = token && acceptedTokens.includes(token) ? token : acceptedTokens[0];
|
|
1608
|
-
const tokenAddresses = TOKEN_ADDRESSES[this.networkId] || {};
|
|
1756
|
+
const tokenAddresses = TOKEN_ADDRESSES[networkId] || TOKEN_ADDRESSES[this.networkId] || {};
|
|
1609
1757
|
const tokenAddress = tokenAddresses[selectedToken];
|
|
1610
1758
|
const tokenDomain = TOKEN_DOMAINS[selectedToken] || TOKEN_DOMAINS.USDC;
|
|
1611
1759
|
return {
|
|
1612
1760
|
scheme: "exact",
|
|
1613
|
-
network:
|
|
1761
|
+
network: networkId,
|
|
1614
1762
|
asset: tokenAddress,
|
|
1615
1763
|
amount: amountInUnits,
|
|
1616
1764
|
payTo: wallet,
|
|
@@ -1622,8 +1770,8 @@ var MoltsPayServer = class {
|
|
|
1622
1770
|
/**
|
|
1623
1771
|
* Return 402 with x402 payment requirements for proxy endpoint
|
|
1624
1772
|
*/
|
|
1625
|
-
sendProxyPaymentRequired(config, wallet, memo, res) {
|
|
1626
|
-
const requirements = this.buildProxyPaymentRequirements(config, wallet);
|
|
1773
|
+
sendProxyPaymentRequired(config, wallet, memo, chain, res) {
|
|
1774
|
+
const requirements = this.buildProxyPaymentRequirements(config, wallet, config.currency, chain);
|
|
1627
1775
|
const paymentRequired = {
|
|
1628
1776
|
x402Version: X402_VERSION3,
|
|
1629
1777
|
accepts: [requirements],
|
|
@@ -1749,29 +1897,31 @@ program.command("status").description("Show wallet status and balance").option("
|
|
|
1749
1897
|
return;
|
|
1750
1898
|
}
|
|
1751
1899
|
const config = client.getConfig();
|
|
1752
|
-
let
|
|
1900
|
+
let allBalances = {};
|
|
1753
1901
|
try {
|
|
1754
|
-
|
|
1902
|
+
allBalances = await client.getAllBalances();
|
|
1755
1903
|
} catch (err) {
|
|
1756
|
-
console.error("Warning: Could not fetch
|
|
1904
|
+
console.error("Warning: Could not fetch balances:", err.message);
|
|
1757
1905
|
}
|
|
1758
1906
|
if (options.json) {
|
|
1759
1907
|
console.log(JSON.stringify({
|
|
1760
1908
|
address: client.address,
|
|
1761
|
-
|
|
1762
|
-
balance,
|
|
1909
|
+
balances: allBalances,
|
|
1763
1910
|
limits: config.limits
|
|
1764
1911
|
}, null, 2));
|
|
1765
1912
|
} else {
|
|
1766
|
-
console.log("\n\u{1F4CA} MoltsPay Status\n");
|
|
1767
|
-
console.log(`
|
|
1768
|
-
console.log(
|
|
1769
|
-
console.log(
|
|
1770
|
-
|
|
1913
|
+
console.log("\n\u{1F4CA} MoltsPay Wallet Status\n");
|
|
1914
|
+
console.log(` Address: ${client.address}`);
|
|
1915
|
+
console.log("");
|
|
1916
|
+
console.log(" Balances:");
|
|
1917
|
+
for (const [chainName, balance] of Object.entries(allBalances)) {
|
|
1918
|
+
const chainLabel = chainName.charAt(0).toUpperCase() + chainName.slice(1);
|
|
1919
|
+
console.log(` ${chainLabel.padEnd(10)} ${balance.usdc.toFixed(2)} USDC | ${balance.usdt.toFixed(2)} USDT`);
|
|
1920
|
+
}
|
|
1771
1921
|
console.log("");
|
|
1772
|
-
console.log(" Limits:");
|
|
1773
|
-
console.log(`
|
|
1774
|
-
console.log(`
|
|
1922
|
+
console.log(" Spending Limits:");
|
|
1923
|
+
console.log(` Per Transaction: $${config.limits.maxPerTx}`);
|
|
1924
|
+
console.log(` Daily: $${config.limits.maxPerDay}`);
|
|
1775
1925
|
console.log("");
|
|
1776
1926
|
}
|
|
1777
1927
|
});
|
|
@@ -2010,7 +2160,7 @@ program.command("stop").description("Stop the running MoltsPay server").action(a
|
|
|
2010
2160
|
process.exit(1);
|
|
2011
2161
|
}
|
|
2012
2162
|
});
|
|
2013
|
-
program.command("pay <server> <service> [params]").description("Pay for a service and get the result").option("--prompt <text>", "Prompt for the service").option("--image <path>", "Image URL or local file path").option("--token <token>", "Token to pay with (USDC or USDT)", "USDC").option("--json", "Output raw JSON only").action(async (server, service, paramsJson, options) => {
|
|
2163
|
+
program.command("pay <server> <service> [params]").description("Pay for a service and get the result").option("--prompt <text>", "Prompt for the service").option("--image <path>", "Image URL or local file path").option("--token <token>", "Token to pay with (USDC or USDT)", "USDC").option("--chain <chain>", "Chain to pay on (base or polygon). Required if server accepts multiple chains.").option("--json", "Output raw JSON only").action(async (server, service, paramsJson, options) => {
|
|
2014
2164
|
const client = new MoltsPayClient();
|
|
2015
2165
|
if (!client.isInitialized) {
|
|
2016
2166
|
console.error("\u274C Wallet not initialized. Run: npx moltspay init");
|
|
@@ -2044,6 +2194,11 @@ program.command("pay <server> <service> [params]").description("Pay for a servic
|
|
|
2044
2194
|
console.error("\u274C Missing prompt. Use --prompt or pass JSON params");
|
|
2045
2195
|
process.exit(1);
|
|
2046
2196
|
}
|
|
2197
|
+
const chain = options.chain?.toLowerCase();
|
|
2198
|
+
if (chain && !["base", "polygon"].includes(chain)) {
|
|
2199
|
+
console.error(`\u274C Unknown chain: ${chain}. Supported: base, polygon`);
|
|
2200
|
+
process.exit(1);
|
|
2201
|
+
}
|
|
2047
2202
|
const imageDisplay = params.image_url || (params.image_base64 ? `[local file: ${options.image}]` : null);
|
|
2048
2203
|
const token = (options.token || "USDC").toUpperCase();
|
|
2049
2204
|
if (token === "USDT") {
|
|
@@ -2066,12 +2221,16 @@ program.command("pay <server> <service> [params]").description("Pay for a servic
|
|
|
2066
2221
|
console.log(` Service: ${service}`);
|
|
2067
2222
|
console.log(` Prompt: ${params.prompt}`);
|
|
2068
2223
|
if (imageDisplay) console.log(` Image: ${imageDisplay}`);
|
|
2224
|
+
console.log(` Chain: ${chain || "(auto)"}`);
|
|
2069
2225
|
console.log(` Token: ${token}`);
|
|
2070
2226
|
console.log(` Wallet: ${client.address}`);
|
|
2071
2227
|
console.log("");
|
|
2072
2228
|
}
|
|
2073
2229
|
try {
|
|
2074
|
-
const result = await client.pay(server, service, params, {
|
|
2230
|
+
const result = await client.pay(server, service, params, {
|
|
2231
|
+
token,
|
|
2232
|
+
chain
|
|
2233
|
+
});
|
|
2075
2234
|
if (options.json) {
|
|
2076
2235
|
console.log(JSON.stringify(result));
|
|
2077
2236
|
} else {
|