moltspay 0.9.6 → 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 +110 -48
- 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 +229 -48
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/index.mjs +229 -48
- 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 +87 -7
- package/dist/client/index.js.map +1 -1
- package/dist/client/index.mjs +87 -7
- 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 +191 -33
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +191 -33
- 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) {
|
|
@@ -293,7 +327,17 @@ var MoltsPayClient = class {
|
|
|
293
327
|
throw new Error(`Insufficient balance: need $${amount}, have ${balances.usdc} USDC / ${balances.usdt} USDT`);
|
|
294
328
|
}
|
|
295
329
|
}
|
|
296
|
-
|
|
330
|
+
if (token === "USDT") {
|
|
331
|
+
const balances = await this.getBalance();
|
|
332
|
+
if (balances.native < 1e-4) {
|
|
333
|
+
throw new Error(
|
|
334
|
+
`USDT requires ETH for gas (~$0.01 on Base). Your ETH balance: ${balances.native.toFixed(6)} ETH. Please add a small amount of ETH to your wallet, or use USDC (gasless).`
|
|
335
|
+
);
|
|
336
|
+
}
|
|
337
|
+
console.log(`[MoltsPay] \u26A0\uFE0F USDT requires gas (~$0.01). Proceeding with payment...`);
|
|
338
|
+
} else {
|
|
339
|
+
console.log(`[MoltsPay] Signing payment: $${amount} ${token} (gasless)`);
|
|
340
|
+
}
|
|
297
341
|
const payTo = req.payTo || req.resource;
|
|
298
342
|
if (!payTo) {
|
|
299
343
|
throw new Error("Missing payTo address in payment requirements");
|
|
@@ -317,13 +361,17 @@ var MoltsPayClient = class {
|
|
|
317
361
|
};
|
|
318
362
|
const paymentHeader = Buffer.from(JSON.stringify(payload)).toString("base64");
|
|
319
363
|
console.log(`[MoltsPay] Sending request with payment...`);
|
|
364
|
+
const paidRequestBody = { service, params };
|
|
365
|
+
if (options.chain) {
|
|
366
|
+
paidRequestBody.chain = options.chain;
|
|
367
|
+
}
|
|
320
368
|
const paidRes = await fetch(`${serverUrl}/execute`, {
|
|
321
369
|
method: "POST",
|
|
322
370
|
headers: {
|
|
323
371
|
"Content-Type": "application/json",
|
|
324
372
|
[PAYMENT_HEADER]: paymentHeader
|
|
325
373
|
},
|
|
326
|
-
body: JSON.stringify(
|
|
374
|
+
body: JSON.stringify(paidRequestBody)
|
|
327
375
|
});
|
|
328
376
|
const result = await paidRes.json();
|
|
329
377
|
if (!paidRes.ok) {
|
|
@@ -492,7 +540,7 @@ var MoltsPayClient = class {
|
|
|
492
540
|
return { address: wallet.address, configDir };
|
|
493
541
|
}
|
|
494
542
|
/**
|
|
495
|
-
* Get wallet balance (USDC, USDT, and native token)
|
|
543
|
+
* Get wallet balance (USDC, USDT, and native token) on default chain
|
|
496
544
|
*/
|
|
497
545
|
async getBalance() {
|
|
498
546
|
if (!this.wallet) {
|
|
@@ -517,6 +565,38 @@ var MoltsPayClient = class {
|
|
|
517
565
|
native: parseFloat(import_ethers.ethers.formatEther(nativeBalance))
|
|
518
566
|
};
|
|
519
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
|
+
}
|
|
520
600
|
};
|
|
521
601
|
|
|
522
602
|
// src/server/index.ts
|
|
@@ -581,7 +661,7 @@ var CDPFacilitator = class extends BaseFacilitator {
|
|
|
581
661
|
this.apiKeyId = config.apiKeyId || process.env.CDP_API_KEY_ID;
|
|
582
662
|
this.apiKeySecret = config.apiKeySecret || process.env.CDP_API_KEY_SECRET;
|
|
583
663
|
this.endpoint = this.useMainnet ? CDP_MAINNET_URL : CDP_TESTNET_URL;
|
|
584
|
-
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"];
|
|
585
665
|
if (this.useMainnet && (!this.apiKeyId || !this.apiKeySecret)) {
|
|
586
666
|
console.warn("[CDPFacilitator] WARNING: Mainnet mode but missing CDP credentials!");
|
|
587
667
|
console.warn("[CDPFacilitator] Set CDP_API_KEY_ID and CDP_API_KEY_SECRET");
|
|
@@ -982,8 +1062,17 @@ var TOKEN_ADDRESSES = {
|
|
|
982
1062
|
USDC: "0x036CbD53842c5426634e7929541eC2318f3dCF7e",
|
|
983
1063
|
USDT: "0x036CbD53842c5426634e7929541eC2318f3dCF7e"
|
|
984
1064
|
// Same as USDC on testnet
|
|
1065
|
+
},
|
|
1066
|
+
"eip155:137": {
|
|
1067
|
+
USDC: "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359",
|
|
1068
|
+
USDT: "0xc2132D05D31c914a87C6611C10748AEb04B58e8F"
|
|
985
1069
|
}
|
|
986
1070
|
};
|
|
1071
|
+
var CHAIN_TO_NETWORK = {
|
|
1072
|
+
"base": "eip155:8453",
|
|
1073
|
+
"base_sepolia": "eip155:84532",
|
|
1074
|
+
"polygon": "eip155:137"
|
|
1075
|
+
};
|
|
987
1076
|
var TOKEN_DOMAINS = {
|
|
988
1077
|
USDC: { name: "USD Coin", version: "2" },
|
|
989
1078
|
USDT: { name: "Tether USD", version: "2" }
|
|
@@ -1049,11 +1138,17 @@ var MoltsPayServer = class {
|
|
|
1049
1138
|
};
|
|
1050
1139
|
this.registry = new FacilitatorRegistry(facilitatorConfig);
|
|
1051
1140
|
const primaryFacilitator = this.registry.get(facilitatorConfig.primary);
|
|
1052
|
-
const networkName = this.useMainnet ? "Base mainnet" : "Base Sepolia (testnet)";
|
|
1053
1141
|
console.log(`[MoltsPay] Loaded ${this.manifest.services.length} services from ${servicesPath}`);
|
|
1054
1142
|
console.log(`[MoltsPay] Provider: ${this.manifest.provider.name}`);
|
|
1055
1143
|
console.log(`[MoltsPay] Receive wallet: ${this.manifest.provider.wallet}`);
|
|
1056
|
-
|
|
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
|
+
}
|
|
1057
1152
|
console.log(`[MoltsPay] Facilitator: ${primaryFacilitator.displayName} (${facilitatorConfig.strategy || "failover"})`);
|
|
1058
1153
|
console.log(`[MoltsPay] Protocol: x402 (gasless for both client AND server)`);
|
|
1059
1154
|
}
|
|
@@ -1068,6 +1163,42 @@ var MoltsPayServer = class {
|
|
|
1068
1163
|
this.skills.set(serviceId, { id: serviceId, config, handler });
|
|
1069
1164
|
return this;
|
|
1070
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
|
+
}
|
|
1071
1202
|
/**
|
|
1072
1203
|
* Start HTTP server
|
|
1073
1204
|
*/
|
|
@@ -1250,7 +1381,9 @@ var MoltsPayServer = class {
|
|
|
1250
1381
|
error: `Token ${paymentToken} not accepted. Accepted: ${accepted.join(", ")}`
|
|
1251
1382
|
});
|
|
1252
1383
|
}
|
|
1253
|
-
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);
|
|
1254
1387
|
console.log(`[MoltsPay] Verifying payment...`);
|
|
1255
1388
|
const verifyResult = await this.registry.verify(payment, requirements);
|
|
1256
1389
|
if (!verifyResult.valid) {
|
|
@@ -1305,15 +1438,29 @@ var MoltsPayServer = class {
|
|
|
1305
1438
|
}
|
|
1306
1439
|
/**
|
|
1307
1440
|
* Return 402 with x402 payment requirements (v2 format)
|
|
1308
|
-
* Includes requirements for all accepted currencies
|
|
1441
|
+
* Includes requirements for all chains and all accepted currencies
|
|
1309
1442
|
*/
|
|
1310
1443
|
sendPaymentRequired(config, res) {
|
|
1311
1444
|
const acceptedTokens = getAcceptedCurrencies(config);
|
|
1312
|
-
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
|
+
});
|
|
1313
1459
|
const paymentRequired = {
|
|
1314
1460
|
x402Version: X402_VERSION3,
|
|
1315
1461
|
accepts,
|
|
1316
1462
|
acceptedCurrencies: acceptedTokens,
|
|
1463
|
+
acceptedChains,
|
|
1317
1464
|
resource: {
|
|
1318
1465
|
url: `/execute?service=${config.id}`,
|
|
1319
1466
|
description: `${config.name} - $${config.price} ${config.currency}`,
|
|
@@ -1329,6 +1476,7 @@ var MoltsPayServer = class {
|
|
|
1329
1476
|
error: "Payment required",
|
|
1330
1477
|
message: `Service requires $${config.price} ${config.currency}`,
|
|
1331
1478
|
acceptedCurrencies: acceptedTokens,
|
|
1479
|
+
acceptedChains,
|
|
1332
1480
|
x402: paymentRequired
|
|
1333
1481
|
}, null, 2));
|
|
1334
1482
|
}
|
|
@@ -1340,46 +1488,50 @@ var MoltsPayServer = class {
|
|
|
1340
1488
|
return { valid: false, error: `Unsupported x402 version: ${payment.x402Version}` };
|
|
1341
1489
|
}
|
|
1342
1490
|
const scheme = payment.accepted?.scheme || payment.scheme;
|
|
1343
|
-
const network = payment.accepted?.network || payment.network;
|
|
1491
|
+
const network = payment.accepted?.network || payment.network || this.networkId;
|
|
1344
1492
|
if (scheme !== "exact") {
|
|
1345
1493
|
return { valid: false, error: `Unsupported scheme: ${scheme}` };
|
|
1346
1494
|
}
|
|
1347
|
-
if (
|
|
1348
|
-
|
|
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}` };
|
|
1349
1498
|
}
|
|
1350
1499
|
return { valid: true };
|
|
1351
1500
|
}
|
|
1352
1501
|
/**
|
|
1353
1502
|
* Build payment requirements for facilitator
|
|
1354
|
-
*
|
|
1355
|
-
* Server accepts any of the acceptedCurrencies
|
|
1503
|
+
* Now supports multi-chain: takes network and wallet as parameters
|
|
1356
1504
|
*/
|
|
1357
|
-
buildPaymentRequirements(config, token) {
|
|
1505
|
+
buildPaymentRequirements(config, network, wallet, token) {
|
|
1358
1506
|
const amountInUnits = Math.floor(config.price * 1e6).toString();
|
|
1359
1507
|
const acceptedTokens = getAcceptedCurrencies(config);
|
|
1508
|
+
const selectedNetwork = network || this.networkId;
|
|
1509
|
+
const selectedWallet = wallet || this.manifest.provider.wallet;
|
|
1360
1510
|
const selectedToken = token && acceptedTokens.includes(token) ? token : acceptedTokens[0];
|
|
1361
|
-
const tokenAddresses = TOKEN_ADDRESSES[
|
|
1511
|
+
const tokenAddresses = TOKEN_ADDRESSES[selectedNetwork] || {};
|
|
1362
1512
|
const tokenAddress = tokenAddresses[selectedToken];
|
|
1363
1513
|
const tokenDomain = TOKEN_DOMAINS[selectedToken] || TOKEN_DOMAINS.USDC;
|
|
1364
1514
|
return {
|
|
1365
1515
|
scheme: "exact",
|
|
1366
|
-
network:
|
|
1516
|
+
network: selectedNetwork,
|
|
1367
1517
|
asset: tokenAddress,
|
|
1368
1518
|
amount: amountInUnits,
|
|
1369
|
-
payTo:
|
|
1519
|
+
payTo: selectedWallet,
|
|
1370
1520
|
maxTimeoutSeconds: 300,
|
|
1371
1521
|
extra: tokenDomain
|
|
1372
1522
|
};
|
|
1373
1523
|
}
|
|
1374
1524
|
/**
|
|
1375
1525
|
* Detect which token is being used in the payment
|
|
1526
|
+
* Checks across all supported networks
|
|
1376
1527
|
*/
|
|
1377
1528
|
detectPaymentToken(payment) {
|
|
1378
1529
|
const asset = payment.accepted?.asset || payment.payload?.asset;
|
|
1379
1530
|
if (!asset) return void 0;
|
|
1380
|
-
const
|
|
1531
|
+
const paymentNetwork = payment.accepted?.network || payment.network || this.networkId;
|
|
1532
|
+
const tokenAddresses = TOKEN_ADDRESSES[paymentNetwork] || {};
|
|
1381
1533
|
for (const [symbol, address] of Object.entries(tokenAddresses)) {
|
|
1382
|
-
if (address.toLowerCase() === asset.toLowerCase()) {
|
|
1534
|
+
if (address && address.toLowerCase() === asset.toLowerCase()) {
|
|
1383
1535
|
return symbol;
|
|
1384
1536
|
}
|
|
1385
1537
|
}
|
|
@@ -1454,6 +1606,10 @@ var MoltsPayServer = class {
|
|
|
1454
1606
|
if (isNaN(amountNum) || amountNum <= 0) {
|
|
1455
1607
|
return this.sendJson(res, 400, { error: "Invalid amount" });
|
|
1456
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
|
+
}
|
|
1457
1613
|
const proxyConfig = {
|
|
1458
1614
|
id: serviceId || "proxy",
|
|
1459
1615
|
name: description || "Proxy Payment",
|
|
@@ -1465,9 +1621,9 @@ var MoltsPayServer = class {
|
|
|
1465
1621
|
input: {},
|
|
1466
1622
|
output: {}
|
|
1467
1623
|
};
|
|
1468
|
-
const requirements = this.buildProxyPaymentRequirements(proxyConfig, wallet);
|
|
1624
|
+
const requirements = this.buildProxyPaymentRequirements(proxyConfig, wallet, currency, chain);
|
|
1469
1625
|
if (!paymentHeader) {
|
|
1470
|
-
return this.sendProxyPaymentRequired(proxyConfig, wallet, memo, res);
|
|
1626
|
+
return this.sendProxyPaymentRequired(proxyConfig, wallet, memo, chain, res);
|
|
1471
1627
|
}
|
|
1472
1628
|
let payment;
|
|
1473
1629
|
try {
|
|
@@ -1484,8 +1640,9 @@ var MoltsPayServer = class {
|
|
|
1484
1640
|
if (scheme !== "exact") {
|
|
1485
1641
|
return this.sendJson(res, 402, { error: `Unsupported scheme: ${scheme}` });
|
|
1486
1642
|
}
|
|
1487
|
-
|
|
1488
|
-
|
|
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}` });
|
|
1489
1646
|
}
|
|
1490
1647
|
console.log(`[MoltsPay] /proxy: Verifying payment for ${wallet}...`);
|
|
1491
1648
|
const verifyResult = await this.registry.verify(payment, requirements);
|
|
@@ -1591,16 +1748,17 @@ var MoltsPayServer = class {
|
|
|
1591
1748
|
/**
|
|
1592
1749
|
* Build payment requirements for proxy endpoint (uses provided wallet)
|
|
1593
1750
|
*/
|
|
1594
|
-
buildProxyPaymentRequirements(config, wallet, token) {
|
|
1751
|
+
buildProxyPaymentRequirements(config, wallet, token, chain) {
|
|
1595
1752
|
const amountInUnits = Math.floor(config.price * 1e6).toString();
|
|
1596
1753
|
const acceptedTokens = getAcceptedCurrencies(config);
|
|
1754
|
+
const networkId = chain ? CHAIN_TO_NETWORK[chain] || this.networkId : this.networkId;
|
|
1597
1755
|
const selectedToken = token && acceptedTokens.includes(token) ? token : acceptedTokens[0];
|
|
1598
|
-
const tokenAddresses = TOKEN_ADDRESSES[this.networkId] || {};
|
|
1756
|
+
const tokenAddresses = TOKEN_ADDRESSES[networkId] || TOKEN_ADDRESSES[this.networkId] || {};
|
|
1599
1757
|
const tokenAddress = tokenAddresses[selectedToken];
|
|
1600
1758
|
const tokenDomain = TOKEN_DOMAINS[selectedToken] || TOKEN_DOMAINS.USDC;
|
|
1601
1759
|
return {
|
|
1602
1760
|
scheme: "exact",
|
|
1603
|
-
network:
|
|
1761
|
+
network: networkId,
|
|
1604
1762
|
asset: tokenAddress,
|
|
1605
1763
|
amount: amountInUnits,
|
|
1606
1764
|
payTo: wallet,
|
|
@@ -1612,8 +1770,8 @@ var MoltsPayServer = class {
|
|
|
1612
1770
|
/**
|
|
1613
1771
|
* Return 402 with x402 payment requirements for proxy endpoint
|
|
1614
1772
|
*/
|
|
1615
|
-
sendProxyPaymentRequired(config, wallet, memo, res) {
|
|
1616
|
-
const requirements = this.buildProxyPaymentRequirements(config, wallet);
|
|
1773
|
+
sendProxyPaymentRequired(config, wallet, memo, chain, res) {
|
|
1774
|
+
const requirements = this.buildProxyPaymentRequirements(config, wallet, config.currency, chain);
|
|
1617
1775
|
const paymentRequired = {
|
|
1618
1776
|
x402Version: X402_VERSION3,
|
|
1619
1777
|
accepts: [requirements],
|
|
@@ -1739,29 +1897,31 @@ program.command("status").description("Show wallet status and balance").option("
|
|
|
1739
1897
|
return;
|
|
1740
1898
|
}
|
|
1741
1899
|
const config = client.getConfig();
|
|
1742
|
-
let
|
|
1900
|
+
let allBalances = {};
|
|
1743
1901
|
try {
|
|
1744
|
-
|
|
1902
|
+
allBalances = await client.getAllBalances();
|
|
1745
1903
|
} catch (err) {
|
|
1746
|
-
console.error("Warning: Could not fetch
|
|
1904
|
+
console.error("Warning: Could not fetch balances:", err.message);
|
|
1747
1905
|
}
|
|
1748
1906
|
if (options.json) {
|
|
1749
1907
|
console.log(JSON.stringify({
|
|
1750
1908
|
address: client.address,
|
|
1751
|
-
|
|
1752
|
-
balance,
|
|
1909
|
+
balances: allBalances,
|
|
1753
1910
|
limits: config.limits
|
|
1754
1911
|
}, null, 2));
|
|
1755
1912
|
} else {
|
|
1756
|
-
console.log("\n\u{1F4CA} MoltsPay Status\n");
|
|
1757
|
-
console.log(`
|
|
1758
|
-
console.log(
|
|
1759
|
-
console.log(
|
|
1760
|
-
|
|
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
|
+
}
|
|
1761
1921
|
console.log("");
|
|
1762
|
-
console.log(" Limits:");
|
|
1763
|
-
console.log(`
|
|
1764
|
-
console.log(`
|
|
1922
|
+
console.log(" Spending Limits:");
|
|
1923
|
+
console.log(` Per Transaction: $${config.limits.maxPerTx}`);
|
|
1924
|
+
console.log(` Daily: $${config.limits.maxPerDay}`);
|
|
1765
1925
|
console.log("");
|
|
1766
1926
|
}
|
|
1767
1927
|
});
|
|
@@ -2000,7 +2160,7 @@ program.command("stop").description("Stop the running MoltsPay server").action(a
|
|
|
2000
2160
|
process.exit(1);
|
|
2001
2161
|
}
|
|
2002
2162
|
});
|
|
2003
|
-
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) => {
|
|
2004
2164
|
const client = new MoltsPayClient();
|
|
2005
2165
|
if (!client.isInitialized) {
|
|
2006
2166
|
console.error("\u274C Wallet not initialized. Run: npx moltspay init");
|
|
@@ -2034,8 +2194,25 @@ program.command("pay <server> <service> [params]").description("Pay for a servic
|
|
|
2034
2194
|
console.error("\u274C Missing prompt. Use --prompt or pass JSON params");
|
|
2035
2195
|
process.exit(1);
|
|
2036
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
|
+
}
|
|
2037
2202
|
const imageDisplay = params.image_url || (params.image_base64 ? `[local file: ${options.image}]` : null);
|
|
2038
2203
|
const token = (options.token || "USDC").toUpperCase();
|
|
2204
|
+
if (token === "USDT") {
|
|
2205
|
+
const balance = await client.getBalance();
|
|
2206
|
+
if (balance.native < 1e-4) {
|
|
2207
|
+
console.log("\n\u26A0\uFE0F USDT requires a small amount of ETH for gas (~$0.01)");
|
|
2208
|
+
console.log(` Your ETH balance: ${balance.native.toFixed(6)} ETH`);
|
|
2209
|
+
console.log(" Please add a tiny amount of ETH to your wallet.\n");
|
|
2210
|
+
process.exit(1);
|
|
2211
|
+
}
|
|
2212
|
+
if (!options.json) {
|
|
2213
|
+
console.log("\n\u26A0\uFE0F Note: USDT payments require gas (~$0.01 on Base)");
|
|
2214
|
+
}
|
|
2215
|
+
}
|
|
2039
2216
|
if (!options.json) {
|
|
2040
2217
|
console.log(`
|
|
2041
2218
|
\u{1F4B3} MoltsPay - Paying for service
|
|
@@ -2044,12 +2221,16 @@ program.command("pay <server> <service> [params]").description("Pay for a servic
|
|
|
2044
2221
|
console.log(` Service: ${service}`);
|
|
2045
2222
|
console.log(` Prompt: ${params.prompt}`);
|
|
2046
2223
|
if (imageDisplay) console.log(` Image: ${imageDisplay}`);
|
|
2224
|
+
console.log(` Chain: ${chain || "(auto)"}`);
|
|
2047
2225
|
console.log(` Token: ${token}`);
|
|
2048
2226
|
console.log(` Wallet: ${client.address}`);
|
|
2049
2227
|
console.log("");
|
|
2050
2228
|
}
|
|
2051
2229
|
try {
|
|
2052
|
-
const result = await client.pay(server, service, params, {
|
|
2230
|
+
const result = await client.pay(server, service, params, {
|
|
2231
|
+
token,
|
|
2232
|
+
chain
|
|
2233
|
+
});
|
|
2053
2234
|
if (options.json) {
|
|
2054
2235
|
console.log(JSON.stringify(result));
|
|
2055
2236
|
} else {
|