moltspay 1.6.0 → 2.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 +1 -0
- package/dist/cdp/index.js.map +1 -1
- package/dist/cdp/index.mjs.map +1 -1
- package/dist/{cdp-DeohBe1o.d.ts → cdp-B5PhDUTC.d.ts} +1 -1
- package/dist/{cdp-p_eHuQpb.d.mts → cdp-D-5Hg3y_.d.mts} +1 -1
- package/dist/chains/index.d.mts +37 -1
- package/dist/chains/index.d.ts +37 -1
- package/dist/chains/index.js +22 -0
- package/dist/chains/index.js.map +1 -1
- package/dist/chains/index.mjs +19 -0
- package/dist/chains/index.mjs.map +1 -1
- package/dist/cli/index.js +1466 -61
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/index.mjs +1466 -61
- package/dist/cli/index.mjs.map +1 -1
- package/dist/client/index.d.mts +41 -0
- package/dist/client/index.d.ts +41 -0
- package/dist/client/index.js +824 -10
- package/dist/client/index.js.map +1 -1
- package/dist/client/index.mjs +824 -10
- package/dist/client/index.mjs.map +1 -1
- package/dist/client/web/index.d.mts +17 -1
- package/dist/client/web/index.mjs +11 -0
- package/dist/client/web/index.mjs.map +1 -1
- package/dist/facilitators/index.d.mts +161 -4
- package/dist/facilitators/index.d.ts +161 -4
- package/dist/facilitators/index.js +370 -0
- package/dist/facilitators/index.js.map +1 -1
- package/dist/facilitators/index.mjs +365 -0
- package/dist/facilitators/index.mjs.map +1 -1
- package/dist/index.d.mts +77 -2
- package/dist/index.d.ts +77 -2
- package/dist/index.js +1412 -31
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1406 -31
- package/dist/index.mjs.map +1 -1
- package/dist/mcp/index.js +828 -14
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/index.mjs +828 -14
- package/dist/mcp/index.mjs.map +1 -1
- package/dist/{registry-OsEO2dOu.d.mts → registry-DIo0WNoO.d.mts} +8 -1
- package/dist/{registry-OsEO2dOu.d.ts → registry-DIo0WNoO.d.ts} +8 -1
- package/dist/server/index.d.mts +95 -2
- package/dist/server/index.d.ts +95 -2
- package/dist/server/index.js +554 -14
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +554 -14
- package/dist/server/index.mjs.map +1 -1
- package/dist/verify/index.js.map +1 -1
- package/dist/verify/index.mjs.map +1 -1
- package/dist/wallet/index.js.map +1 -1
- package/dist/wallet/index.mjs.map +1 -1
- package/package.json +7 -1
- package/schemas/moltspay.services.schema.json +100 -6
- package/scripts/postinstall.js +91 -0
package/README.md
CHANGED
|
@@ -25,6 +25,7 @@ MoltsPay enables agent-to-agent commerce using the [x402 protocol](https://www.x
|
|
|
25
25
|
- **Payment Verification** - Automatic on-chain verification
|
|
26
26
|
- **Secure Wallet** - Spending limits, whitelist, and audit logging
|
|
27
27
|
- **Multi-chain** - Base, Polygon, Solana, BNB, Tempo (mainnet & testnet)
|
|
28
|
+
- **Fiat Rail (`2.0.0`)** - Accept CNY via 支付宝 AI 收 from China mainland merchants. CLI-only (Node), browser unsupported. See [`docs/ALIPAY-RAIL.md`](docs/ALIPAY-RAIL.md)
|
|
28
29
|
- **Agent-to-Agent** - Complete A2A payment flow support
|
|
29
30
|
- **Multi-VM** - EVM chains + Solana (SVM) with unified API
|
|
30
31
|
- **MCP Server** - Expose wallet + payments to Claude Desktop, Cursor, and other MCP hosts
|
package/dist/cdp/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cdp/index.ts","../../src/chains/index.ts"],"sourcesContent":["/**\n * CDP (Coinbase Developer Platform) Wallet Integration\n * \n * Creates and manages wallets via Coinbase's CDP SDK.\n * These wallets are hosted by Coinbase, making them easy to use for AI Agents.\n * \n * @see https://docs.cdp.coinbase.com/\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport type { EvmChainName } from '../types/index.js';\nimport { getChain } from '../chains/index.js';\n\n// CDP config file location\nconst DEFAULT_STORAGE_DIR = path.join(process.env.HOME || '.', '.moltspay');\nconst CDP_CONFIG_FILE = 'cdp-wallet.json';\n\nexport interface CDPWalletConfig {\n /** Storage directory (default: ~/.moltspay) */\n storageDir?: string;\n /** Chain name */\n chain?: EvmChainName;\n /** CDP API credentials (or use env vars) */\n apiKeyId?: string;\n apiKeySecret?: string;\n walletSecret?: string;\n}\n\nexport interface CDPWalletData {\n /** Wallet address */\n address: string;\n /** CDP wallet ID */\n walletId: string;\n /** Chain */\n chain: EvmChainName;\n /** Created timestamp */\n createdAt: string;\n /** CDP account data (for restoration) */\n accountData?: string;\n}\n\nexport interface CDPInitResult {\n success: boolean;\n address?: string;\n walletId?: string;\n isNew?: boolean;\n error?: string;\n storagePath?: string;\n}\n\n/**\n * Check if CDP SDK is available\n */\nexport function isCDPAvailable(): boolean {\n try {\n require.resolve('@coinbase/cdp-sdk');\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Get CDP credentials from environment\n */\nfunction getCDPCredentials(config: CDPWalletConfig): {\n apiKeyId: string;\n apiKeySecret: string;\n walletSecret?: string;\n} | null {\n const apiKeyId = config.apiKeyId || process.env.CDP_API_KEY_ID;\n const apiKeySecret = config.apiKeySecret || process.env.CDP_API_KEY_SECRET;\n const walletSecret = config.walletSecret || process.env.CDP_WALLET_SECRET;\n\n if (!apiKeyId || !apiKeySecret) {\n return null;\n }\n\n return { apiKeyId, apiKeySecret, walletSecret };\n}\n\n/**\n * Initialize CDP wallet\n * \n * Creates a new CDP wallet or loads existing one.\n * \n * @example\n * ```bash\n * # Set credentials\n * export CDP_API_KEY_ID=your-key-id\n * export CDP_API_KEY_SECRET=your-key-secret\n * \n * # Initialize\n * npx moltspay init --cdp --chain base\n * ```\n */\nexport async function initCDPWallet(config: CDPWalletConfig = {}): Promise<CDPInitResult> {\n const storageDir = config.storageDir || DEFAULT_STORAGE_DIR;\n const chain = config.chain || 'base';\n const storagePath = path.join(storageDir, CDP_CONFIG_FILE);\n\n // Check for existing wallet\n if (fs.existsSync(storagePath)) {\n try {\n const data = JSON.parse(fs.readFileSync(storagePath, 'utf-8')) as CDPWalletData;\n return {\n success: true,\n address: data.address,\n walletId: data.walletId,\n isNew: false,\n storagePath,\n };\n } catch (error) {\n // Continue to create new\n }\n }\n\n // Check CDP availability\n if (!isCDPAvailable()) {\n return {\n success: false,\n error: 'CDP SDK not installed. Run: npm install @coinbase/cdp-sdk',\n };\n }\n\n // Get credentials\n const creds = getCDPCredentials(config);\n if (!creds) {\n return {\n success: false,\n error: 'CDP credentials not found. Set CDP_API_KEY_ID and CDP_API_KEY_SECRET environment variables.',\n };\n }\n\n try {\n // Dynamic import to avoid errors when CDP SDK is not installed\n const { CdpClient } = await import('@coinbase/cdp-sdk');\n\n // Initialize CDP client\n const cdp = new CdpClient({\n apiKeyId: creds.apiKeyId,\n apiKeySecret: creds.apiKeySecret,\n walletSecret: creds.walletSecret,\n });\n\n // Create EVM account\n const account = await cdp.evm.createAccount();\n\n // Ensure storage directory exists\n if (!fs.existsSync(storageDir)) {\n fs.mkdirSync(storageDir, { recursive: true });\n }\n\n // Save wallet data\n const walletData: CDPWalletData = {\n address: account.address,\n walletId: account.address, // CDP uses address as ID for EVM\n chain,\n createdAt: new Date().toISOString(),\n };\n\n fs.writeFileSync(storagePath, JSON.stringify(walletData, null, 2), { mode: 0o600 });\n\n return {\n success: true,\n address: account.address,\n walletId: account.address,\n isNew: true,\n storagePath,\n };\n } catch (error) {\n return {\n success: false,\n error: (error as Error).message,\n };\n }\n}\n\n/**\n * Load existing CDP wallet\n */\nexport function loadCDPWallet(config: CDPWalletConfig = {}): CDPWalletData | null {\n const storageDir = config.storageDir || DEFAULT_STORAGE_DIR;\n const storagePath = path.join(storageDir, CDP_CONFIG_FILE);\n\n if (!fs.existsSync(storagePath)) {\n return null;\n }\n\n try {\n return JSON.parse(fs.readFileSync(storagePath, 'utf-8')) as CDPWalletData;\n } catch {\n return null;\n }\n}\n\n/**\n * Get CDP wallet address (quick check without full init)\n */\nexport function getCDPWalletAddress(storageDir?: string): string | null {\n const data = loadCDPWallet({ storageDir });\n return data?.address || null;\n}\n\n/**\n * CDP Wallet class for making payments\n * \n * Uses CDP SDK for wallet operations with x402 support.\n */\nexport class CDPWallet {\n readonly address: string;\n readonly chain: EvmChainName;\n readonly chainConfig: ReturnType<typeof getChain>;\n private storageDir: string;\n\n constructor(config: CDPWalletConfig = {}) {\n this.storageDir = config.storageDir || DEFAULT_STORAGE_DIR;\n this.chain = config.chain || 'base';\n this.chainConfig = getChain(this.chain);\n\n // Load existing wallet\n const data = loadCDPWallet(config);\n if (!data) {\n throw new Error('CDP wallet not initialized. Run: npx moltspay init --cdp');\n }\n this.address = data.address;\n }\n\n /**\n * Get USDC balance\n */\n async getBalance(): Promise<{ usdc: string; eth: string }> {\n // Use ethers to check balance (read-only, no CDP needed)\n const { ethers } = await import('ethers');\n const provider = new ethers.JsonRpcProvider(this.chainConfig.rpc);\n \n const usdcContract = new ethers.Contract(\n this.chainConfig.usdc,\n ['function balanceOf(address) view returns (uint256)'],\n provider\n );\n\n const [usdcBalance, ethBalance] = await Promise.all([\n usdcContract.balanceOf(this.address),\n provider.getBalance(this.address),\n ]);\n\n return {\n usdc: (Number(usdcBalance) / 1e6).toFixed(2),\n eth: ethers.formatEther(ethBalance),\n };\n }\n\n /**\n * Transfer USDC to a recipient\n * \n * Requires CDP SDK and credentials to sign transactions.\n */\n async transfer(params: { to: string; amount: number }): Promise<{\n success: boolean;\n txHash?: string;\n error?: string;\n explorerUrl?: string;\n }> {\n if (!isCDPAvailable()) {\n return { success: false, error: 'CDP SDK not installed' };\n }\n\n const creds = getCDPCredentials({});\n if (!creds) {\n return { success: false, error: 'CDP credentials not found' };\n }\n\n try {\n const { CdpClient } = await import('@coinbase/cdp-sdk');\n const { ethers } = await import('ethers');\n\n const cdp = new CdpClient({\n apiKeyId: creds.apiKeyId,\n apiKeySecret: creds.apiKeySecret,\n walletSecret: creds.walletSecret,\n });\n\n // Get the account\n const account = await cdp.evm.getAccount({ address: this.address as `0x${string}` });\n\n // Build transfer transaction\n const amountWei = BigInt(Math.floor(params.amount * 1e6));\n const iface = new ethers.Interface([\n 'function transfer(address to, uint256 amount) returns (bool)',\n ]);\n const callData = iface.encodeFunctionData('transfer', [params.to, amountWei]);\n\n // Send transaction (use any to avoid type issues with CDP SDK versions)\n const txOptions: any = {\n to: this.chainConfig.usdc,\n data: callData,\n };\n const tx = await account.sendTransaction(txOptions);\n\n return {\n success: true,\n txHash: tx.transactionHash,\n explorerUrl: `${this.chainConfig.explorerTx}${tx.transactionHash}`,\n };\n } catch (error) {\n return {\n success: false,\n error: (error as Error).message,\n };\n }\n }\n\n /**\n * Create viem-compatible signer for x402\n * \n * This allows using CDP wallet with x402 protocol.\n */\n async getViemAccount(): Promise<unknown> {\n if (!isCDPAvailable()) {\n throw new Error('CDP SDK not installed');\n }\n\n const creds = getCDPCredentials({});\n if (!creds) {\n throw new Error('CDP credentials not found');\n }\n\n const { CdpClient } = await import('@coinbase/cdp-sdk');\n const { toAccount } = await import('viem/accounts');\n\n const cdp = new CdpClient({\n apiKeyId: creds.apiKeyId,\n apiKeySecret: creds.apiKeySecret,\n walletSecret: creds.walletSecret,\n });\n\n const account = await cdp.evm.getAccount({ address: this.address as `0x${string}` });\n return toAccount(account);\n }\n}\n","/**\n * Blockchain Configuration\n */\n\nimport type { ChainConfig, ChainName, EvmChainName, TokenSymbol } from '../types/index.js';\n\nexport const CHAINS: Record<EvmChainName, 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 eip712Name: 'USD Coin', // EIP-712 domain name\n },\n USDT: {\n address: '0xfde4C96c8593536E31F229EA8f37b2ADa2699bb2',\n decimals: 6,\n symbol: 'USDT',\n eip712Name: 'Tether USD',\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 eip712Name: 'USD Coin',\n },\n USDT: {\n address: '0xc2132D05D31c914a87C6611C10748AEb04B58e8F',\n decimals: 6,\n symbol: 'USDT',\n eip712Name: '(PoS) Tether USD', // Polygon uses this name\n },\n },\n usdc: '0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359',\n explorer: 'https://polygonscan.com/address/',\n explorerTx: 'https://polygonscan.com/tx/',\n avgBlockTime: 2,\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 eip712Name: 'USDC', // Testnet USDC uses 'USDC' not 'USD Coin'\n },\n USDT: {\n address: '0x036CbD53842c5426634e7929541eC2318f3dCF7e', // Same as USDC on testnet (no official USDT)\n decimals: 6,\n symbol: 'USDT',\n eip712Name: 'USDC', // Uses same contract as USDC\n },\n },\n usdc: '0x036CbD53842c5426634e7929541eC2318f3dCF7e',\n explorer: 'https://sepolia.basescan.org/address/',\n explorerTx: 'https://sepolia.basescan.org/tx/',\n avgBlockTime: 2,\n },\n // ============ Tempo Testnet (Moderato) ============\n tempo_moderato: {\n name: 'Tempo Moderato',\n chainId: 42431,\n rpc: 'https://rpc.moderato.tempo.xyz',\n tokens: {\n // TIP-20 stablecoins on Tempo testnet (from mppx SDK)\n // Note: Tempo uses USD as native gas token, not ETH\n USDC: {\n address: '0x20c0000000000000000000000000000000000000', // pathUSD - primary testnet stablecoin\n decimals: 6,\n symbol: 'USDC',\n eip712Name: 'pathUSD',\n },\n USDT: {\n address: '0x20c0000000000000000000000000000000000001', // alphaUSD\n decimals: 6,\n symbol: 'USDT',\n eip712Name: 'alphaUSD',\n },\n },\n usdc: '0x20c0000000000000000000000000000000000000',\n explorer: 'https://explore.testnet.tempo.xyz/address/',\n explorerTx: 'https://explore.testnet.tempo.xyz/tx/',\n avgBlockTime: 0.5, // ~500ms finality\n },\n // ============ BNB Chain Testnet ============\n bnb_testnet: {\n name: 'BNB Testnet',\n chainId: 97,\n rpc: 'https://data-seed-prebsc-1-s1.binance.org:8545',\n tokens: {\n // Note: BNB uses 18 decimals for stablecoins (unlike Base/Polygon which use 6)\n // Using official Binance-Peg testnet tokens\n USDC: {\n address: '0x64544969ed7EBf5f083679233325356EbE738930', // Testnet USDC\n decimals: 18,\n symbol: 'USDC',\n eip712Name: 'USD Coin',\n },\n USDT: {\n address: '0x337610d27c682E347C9cD60BD4b3b107C9d34dDd', // Testnet USDT\n decimals: 18,\n symbol: 'USDT',\n eip712Name: 'Tether USD',\n },\n },\n usdc: '0x64544969ed7EBf5f083679233325356EbE738930',\n explorer: 'https://testnet.bscscan.com/address/',\n explorerTx: 'https://testnet.bscscan.com/tx/',\n avgBlockTime: 3,\n // BNB-specific: requires approval for pay-for-success flow\n requiresApproval: true,\n },\n // ============ BNB Chain Mainnet ============\n bnb: {\n name: 'BNB Smart Chain',\n chainId: 56,\n rpc: 'https://bsc-dataseed.binance.org',\n tokens: {\n // Note: BNB uses 18 decimals for stablecoins\n USDC: {\n address: '0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d',\n decimals: 18,\n symbol: 'USDC',\n eip712Name: 'USD Coin',\n },\n USDT: {\n address: '0x55d398326f99059fF775485246999027B3197955',\n decimals: 18,\n symbol: 'USDT',\n eip712Name: 'Tether USD',\n },\n },\n usdc: '0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d',\n explorer: 'https://bscscan.com/address/',\n explorerTx: 'https://bscscan.com/tx/',\n avgBlockTime: 3,\n // BNB-specific: requires approval for pay-for-success flow\n requiresApproval: true,\n },\n};\n\n/**\n * Get token address for a chain\n */\nexport function getTokenAddress(chainName: EvmChainName, 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: EvmChainName, 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: EvmChainName): 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 EVM chains\n */\nexport function listChains(): EvmChainName[] {\n return Object.keys(CHAINS) as EvmChainName[];\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, EvmChainName, TokenSymbol };\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/cdp/index.ts","../../src/chains/index.ts"],"sourcesContent":["/**\n * CDP (Coinbase Developer Platform) Wallet Integration\n * \n * Creates and manages wallets via Coinbase's CDP SDK.\n * These wallets are hosted by Coinbase, making them easy to use for AI Agents.\n * \n * @see https://docs.cdp.coinbase.com/\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport type { EvmChainName } from '../types/index.js';\nimport { getChain } from '../chains/index.js';\n\n// CDP config file location\nconst DEFAULT_STORAGE_DIR = path.join(process.env.HOME || '.', '.moltspay');\nconst CDP_CONFIG_FILE = 'cdp-wallet.json';\n\nexport interface CDPWalletConfig {\n /** Storage directory (default: ~/.moltspay) */\n storageDir?: string;\n /** Chain name */\n chain?: EvmChainName;\n /** CDP API credentials (or use env vars) */\n apiKeyId?: string;\n apiKeySecret?: string;\n walletSecret?: string;\n}\n\nexport interface CDPWalletData {\n /** Wallet address */\n address: string;\n /** CDP wallet ID */\n walletId: string;\n /** Chain */\n chain: EvmChainName;\n /** Created timestamp */\n createdAt: string;\n /** CDP account data (for restoration) */\n accountData?: string;\n}\n\nexport interface CDPInitResult {\n success: boolean;\n address?: string;\n walletId?: string;\n isNew?: boolean;\n error?: string;\n storagePath?: string;\n}\n\n/**\n * Check if CDP SDK is available\n */\nexport function isCDPAvailable(): boolean {\n try {\n require.resolve('@coinbase/cdp-sdk');\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Get CDP credentials from environment\n */\nfunction getCDPCredentials(config: CDPWalletConfig): {\n apiKeyId: string;\n apiKeySecret: string;\n walletSecret?: string;\n} | null {\n const apiKeyId = config.apiKeyId || process.env.CDP_API_KEY_ID;\n const apiKeySecret = config.apiKeySecret || process.env.CDP_API_KEY_SECRET;\n const walletSecret = config.walletSecret || process.env.CDP_WALLET_SECRET;\n\n if (!apiKeyId || !apiKeySecret) {\n return null;\n }\n\n return { apiKeyId, apiKeySecret, walletSecret };\n}\n\n/**\n * Initialize CDP wallet\n * \n * Creates a new CDP wallet or loads existing one.\n * \n * @example\n * ```bash\n * # Set credentials\n * export CDP_API_KEY_ID=your-key-id\n * export CDP_API_KEY_SECRET=your-key-secret\n * \n * # Initialize\n * npx moltspay init --cdp --chain base\n * ```\n */\nexport async function initCDPWallet(config: CDPWalletConfig = {}): Promise<CDPInitResult> {\n const storageDir = config.storageDir || DEFAULT_STORAGE_DIR;\n const chain = config.chain || 'base';\n const storagePath = path.join(storageDir, CDP_CONFIG_FILE);\n\n // Check for existing wallet\n if (fs.existsSync(storagePath)) {\n try {\n const data = JSON.parse(fs.readFileSync(storagePath, 'utf-8')) as CDPWalletData;\n return {\n success: true,\n address: data.address,\n walletId: data.walletId,\n isNew: false,\n storagePath,\n };\n } catch (error) {\n // Continue to create new\n }\n }\n\n // Check CDP availability\n if (!isCDPAvailable()) {\n return {\n success: false,\n error: 'CDP SDK not installed. Run: npm install @coinbase/cdp-sdk',\n };\n }\n\n // Get credentials\n const creds = getCDPCredentials(config);\n if (!creds) {\n return {\n success: false,\n error: 'CDP credentials not found. Set CDP_API_KEY_ID and CDP_API_KEY_SECRET environment variables.',\n };\n }\n\n try {\n // Dynamic import to avoid errors when CDP SDK is not installed\n const { CdpClient } = await import('@coinbase/cdp-sdk');\n\n // Initialize CDP client\n const cdp = new CdpClient({\n apiKeyId: creds.apiKeyId,\n apiKeySecret: creds.apiKeySecret,\n walletSecret: creds.walletSecret,\n });\n\n // Create EVM account\n const account = await cdp.evm.createAccount();\n\n // Ensure storage directory exists\n if (!fs.existsSync(storageDir)) {\n fs.mkdirSync(storageDir, { recursive: true });\n }\n\n // Save wallet data\n const walletData: CDPWalletData = {\n address: account.address,\n walletId: account.address, // CDP uses address as ID for EVM\n chain,\n createdAt: new Date().toISOString(),\n };\n\n fs.writeFileSync(storagePath, JSON.stringify(walletData, null, 2), { mode: 0o600 });\n\n return {\n success: true,\n address: account.address,\n walletId: account.address,\n isNew: true,\n storagePath,\n };\n } catch (error) {\n return {\n success: false,\n error: (error as Error).message,\n };\n }\n}\n\n/**\n * Load existing CDP wallet\n */\nexport function loadCDPWallet(config: CDPWalletConfig = {}): CDPWalletData | null {\n const storageDir = config.storageDir || DEFAULT_STORAGE_DIR;\n const storagePath = path.join(storageDir, CDP_CONFIG_FILE);\n\n if (!fs.existsSync(storagePath)) {\n return null;\n }\n\n try {\n return JSON.parse(fs.readFileSync(storagePath, 'utf-8')) as CDPWalletData;\n } catch {\n return null;\n }\n}\n\n/**\n * Get CDP wallet address (quick check without full init)\n */\nexport function getCDPWalletAddress(storageDir?: string): string | null {\n const data = loadCDPWallet({ storageDir });\n return data?.address || null;\n}\n\n/**\n * CDP Wallet class for making payments\n * \n * Uses CDP SDK for wallet operations with x402 support.\n */\nexport class CDPWallet {\n readonly address: string;\n readonly chain: EvmChainName;\n readonly chainConfig: ReturnType<typeof getChain>;\n private storageDir: string;\n\n constructor(config: CDPWalletConfig = {}) {\n this.storageDir = config.storageDir || DEFAULT_STORAGE_DIR;\n this.chain = config.chain || 'base';\n this.chainConfig = getChain(this.chain);\n\n // Load existing wallet\n const data = loadCDPWallet(config);\n if (!data) {\n throw new Error('CDP wallet not initialized. Run: npx moltspay init --cdp');\n }\n this.address = data.address;\n }\n\n /**\n * Get USDC balance\n */\n async getBalance(): Promise<{ usdc: string; eth: string }> {\n // Use ethers to check balance (read-only, no CDP needed)\n const { ethers } = await import('ethers');\n const provider = new ethers.JsonRpcProvider(this.chainConfig.rpc);\n \n const usdcContract = new ethers.Contract(\n this.chainConfig.usdc,\n ['function balanceOf(address) view returns (uint256)'],\n provider\n );\n\n const [usdcBalance, ethBalance] = await Promise.all([\n usdcContract.balanceOf(this.address),\n provider.getBalance(this.address),\n ]);\n\n return {\n usdc: (Number(usdcBalance) / 1e6).toFixed(2),\n eth: ethers.formatEther(ethBalance),\n };\n }\n\n /**\n * Transfer USDC to a recipient\n * \n * Requires CDP SDK and credentials to sign transactions.\n */\n async transfer(params: { to: string; amount: number }): Promise<{\n success: boolean;\n txHash?: string;\n error?: string;\n explorerUrl?: string;\n }> {\n if (!isCDPAvailable()) {\n return { success: false, error: 'CDP SDK not installed' };\n }\n\n const creds = getCDPCredentials({});\n if (!creds) {\n return { success: false, error: 'CDP credentials not found' };\n }\n\n try {\n const { CdpClient } = await import('@coinbase/cdp-sdk');\n const { ethers } = await import('ethers');\n\n const cdp = new CdpClient({\n apiKeyId: creds.apiKeyId,\n apiKeySecret: creds.apiKeySecret,\n walletSecret: creds.walletSecret,\n });\n\n // Get the account\n const account = await cdp.evm.getAccount({ address: this.address as `0x${string}` });\n\n // Build transfer transaction\n const amountWei = BigInt(Math.floor(params.amount * 1e6));\n const iface = new ethers.Interface([\n 'function transfer(address to, uint256 amount) returns (bool)',\n ]);\n const callData = iface.encodeFunctionData('transfer', [params.to, amountWei]);\n\n // Send transaction (use any to avoid type issues with CDP SDK versions)\n const txOptions: any = {\n to: this.chainConfig.usdc,\n data: callData,\n };\n const tx = await account.sendTransaction(txOptions);\n\n return {\n success: true,\n txHash: tx.transactionHash,\n explorerUrl: `${this.chainConfig.explorerTx}${tx.transactionHash}`,\n };\n } catch (error) {\n return {\n success: false,\n error: (error as Error).message,\n };\n }\n }\n\n /**\n * Create viem-compatible signer for x402\n * \n * This allows using CDP wallet with x402 protocol.\n */\n async getViemAccount(): Promise<unknown> {\n if (!isCDPAvailable()) {\n throw new Error('CDP SDK not installed');\n }\n\n const creds = getCDPCredentials({});\n if (!creds) {\n throw new Error('CDP credentials not found');\n }\n\n const { CdpClient } = await import('@coinbase/cdp-sdk');\n const { toAccount } = await import('viem/accounts');\n\n const cdp = new CdpClient({\n apiKeyId: creds.apiKeyId,\n apiKeySecret: creds.apiKeySecret,\n walletSecret: creds.walletSecret,\n });\n\n const account = await cdp.evm.getAccount({ address: this.address as `0x${string}` });\n return toAccount(account);\n }\n}\n","/**\n * Blockchain Configuration\n */\n\nimport type { ChainConfig, ChainName, EvmChainName, TokenSymbol } from '../types/index.js';\n\nexport const CHAINS: Record<EvmChainName, 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 eip712Name: 'USD Coin', // EIP-712 domain name\n },\n USDT: {\n address: '0xfde4C96c8593536E31F229EA8f37b2ADa2699bb2',\n decimals: 6,\n symbol: 'USDT',\n eip712Name: 'Tether USD',\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 eip712Name: 'USD Coin',\n },\n USDT: {\n address: '0xc2132D05D31c914a87C6611C10748AEb04B58e8F',\n decimals: 6,\n symbol: 'USDT',\n eip712Name: '(PoS) Tether USD', // Polygon uses this name\n },\n },\n usdc: '0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359',\n explorer: 'https://polygonscan.com/address/',\n explorerTx: 'https://polygonscan.com/tx/',\n avgBlockTime: 2,\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 eip712Name: 'USDC', // Testnet USDC uses 'USDC' not 'USD Coin'\n },\n USDT: {\n address: '0x036CbD53842c5426634e7929541eC2318f3dCF7e', // Same as USDC on testnet (no official USDT)\n decimals: 6,\n symbol: 'USDT',\n eip712Name: 'USDC', // Uses same contract as USDC\n },\n },\n usdc: '0x036CbD53842c5426634e7929541eC2318f3dCF7e',\n explorer: 'https://sepolia.basescan.org/address/',\n explorerTx: 'https://sepolia.basescan.org/tx/',\n avgBlockTime: 2,\n },\n // ============ Tempo Testnet (Moderato) ============\n tempo_moderato: {\n name: 'Tempo Moderato',\n chainId: 42431,\n rpc: 'https://rpc.moderato.tempo.xyz',\n tokens: {\n // TIP-20 stablecoins on Tempo testnet (from mppx SDK)\n // Note: Tempo uses USD as native gas token, not ETH\n USDC: {\n address: '0x20c0000000000000000000000000000000000000', // pathUSD - primary testnet stablecoin\n decimals: 6,\n symbol: 'USDC',\n eip712Name: 'pathUSD',\n },\n USDT: {\n address: '0x20c0000000000000000000000000000000000001', // alphaUSD\n decimals: 6,\n symbol: 'USDT',\n eip712Name: 'alphaUSD',\n },\n },\n usdc: '0x20c0000000000000000000000000000000000000',\n explorer: 'https://explore.testnet.tempo.xyz/address/',\n explorerTx: 'https://explore.testnet.tempo.xyz/tx/',\n avgBlockTime: 0.5, // ~500ms finality\n },\n // ============ BNB Chain Testnet ============\n bnb_testnet: {\n name: 'BNB Testnet',\n chainId: 97,\n rpc: 'https://data-seed-prebsc-1-s1.binance.org:8545',\n tokens: {\n // Note: BNB uses 18 decimals for stablecoins (unlike Base/Polygon which use 6)\n // Using official Binance-Peg testnet tokens\n USDC: {\n address: '0x64544969ed7EBf5f083679233325356EbE738930', // Testnet USDC\n decimals: 18,\n symbol: 'USDC',\n eip712Name: 'USD Coin',\n },\n USDT: {\n address: '0x337610d27c682E347C9cD60BD4b3b107C9d34dDd', // Testnet USDT\n decimals: 18,\n symbol: 'USDT',\n eip712Name: 'Tether USD',\n },\n },\n usdc: '0x64544969ed7EBf5f083679233325356EbE738930',\n explorer: 'https://testnet.bscscan.com/address/',\n explorerTx: 'https://testnet.bscscan.com/tx/',\n avgBlockTime: 3,\n // BNB-specific: requires approval for pay-for-success flow\n requiresApproval: true,\n },\n // ============ BNB Chain Mainnet ============\n bnb: {\n name: 'BNB Smart Chain',\n chainId: 56,\n rpc: 'https://bsc-dataseed.binance.org',\n tokens: {\n // Note: BNB uses 18 decimals for stablecoins\n USDC: {\n address: '0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d',\n decimals: 18,\n symbol: 'USDC',\n eip712Name: 'USD Coin',\n },\n USDT: {\n address: '0x55d398326f99059fF775485246999027B3197955',\n decimals: 18,\n symbol: 'USDT',\n eip712Name: 'Tether USD',\n },\n },\n usdc: '0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d',\n explorer: 'https://bscscan.com/address/',\n explorerTx: 'https://bscscan.com/tx/',\n avgBlockTime: 3,\n // BNB-specific: requires approval for pay-for-success flow\n requiresApproval: true,\n },\n};\n\n/**\n * Get token address for a chain\n */\nexport function getTokenAddress(chainName: EvmChainName, 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: EvmChainName, 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: EvmChainName): 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 EVM chains\n */\nexport function listChains(): EvmChainName[] {\n return Object.keys(CHAINS) as EvmChainName[];\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// ============ Alipay AI 收 Fiat Rail (2.0.0+) ============\n\n/**\n * Chain-id string for the Alipay AI 收 fiat rail.\n * Used in `provider.chains: [\"alipay\", ...]` to opt the provider into\n * accepting CNY payments alongside USDC.\n */\nexport const ALIPAY_CHAIN_ID = 'alipay' as const;\n\n/**\n * Rail metadata for the Alipay AI 收 fiat rail (2.0.0+).\n *\n * Intentionally kept **outside** the {@link CHAINS} Record because that\n * Record is `Record<EvmChainName, ChainConfig>` and an EVM `ChainConfig`\n * (rpc / tokens / chainId) is not meaningful for a fiat rail.\n *\n * The rail uses `type: \"fiat-rail\"`, distinct from `ChainFamily`'s\n * existing `\"evm\"` and `\"svm\"`. Server dispatch detects alipay via\n * {@link isAlipayChainId} rather than via the EVM/SVM type guards.\n */\nexport const ALIPAY_RAIL = {\n /** Chain-id string used in user manifests + routing. */\n id: ALIPAY_CHAIN_ID,\n /** Rail family — distinct from `ChainFamily` ('evm' | 'svm'). */\n type: 'fiat-rail' as const,\n /** Quote currency. */\n currency: 'CNY' as const,\n /** Decimal places for the `amount` field (元 with up to 2 decimals). */\n decimals: 2 as const,\n /** x402 `scheme` string — matches `ALIPAY_SCHEME` in src/facilitators/alipay.ts. */\n facilitator: 'alipay-aipay' as const,\n} as const;\n\n/**\n * Runtime type guard: is this chain-id string the Alipay fiat rail?\n *\n * Used by the server layer to route a `Payment-Proof` request to\n * {@link AlipayFacilitator} instead of an EVM/SVM verifier.\n */\nexport function isAlipayChainId(id: string): id is typeof ALIPAY_CHAIN_ID {\n return id === ALIPAY_CHAIN_ID;\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, EvmChainName, TokenSymbol };\n"],"mappings":"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","names":[]}
|
package/dist/cdp/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cdp/index.ts","../../src/chains/index.ts"],"sourcesContent":["/**\n * CDP (Coinbase Developer Platform) Wallet Integration\n * \n * Creates and manages wallets via Coinbase's CDP SDK.\n * These wallets are hosted by Coinbase, making them easy to use for AI Agents.\n * \n * @see https://docs.cdp.coinbase.com/\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport type { EvmChainName } from '../types/index.js';\nimport { getChain } from '../chains/index.js';\n\n// CDP config file location\nconst DEFAULT_STORAGE_DIR = path.join(process.env.HOME || '.', '.moltspay');\nconst CDP_CONFIG_FILE = 'cdp-wallet.json';\n\nexport interface CDPWalletConfig {\n /** Storage directory (default: ~/.moltspay) */\n storageDir?: string;\n /** Chain name */\n chain?: EvmChainName;\n /** CDP API credentials (or use env vars) */\n apiKeyId?: string;\n apiKeySecret?: string;\n walletSecret?: string;\n}\n\nexport interface CDPWalletData {\n /** Wallet address */\n address: string;\n /** CDP wallet ID */\n walletId: string;\n /** Chain */\n chain: EvmChainName;\n /** Created timestamp */\n createdAt: string;\n /** CDP account data (for restoration) */\n accountData?: string;\n}\n\nexport interface CDPInitResult {\n success: boolean;\n address?: string;\n walletId?: string;\n isNew?: boolean;\n error?: string;\n storagePath?: string;\n}\n\n/**\n * Check if CDP SDK is available\n */\nexport function isCDPAvailable(): boolean {\n try {\n require.resolve('@coinbase/cdp-sdk');\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Get CDP credentials from environment\n */\nfunction getCDPCredentials(config: CDPWalletConfig): {\n apiKeyId: string;\n apiKeySecret: string;\n walletSecret?: string;\n} | null {\n const apiKeyId = config.apiKeyId || process.env.CDP_API_KEY_ID;\n const apiKeySecret = config.apiKeySecret || process.env.CDP_API_KEY_SECRET;\n const walletSecret = config.walletSecret || process.env.CDP_WALLET_SECRET;\n\n if (!apiKeyId || !apiKeySecret) {\n return null;\n }\n\n return { apiKeyId, apiKeySecret, walletSecret };\n}\n\n/**\n * Initialize CDP wallet\n * \n * Creates a new CDP wallet or loads existing one.\n * \n * @example\n * ```bash\n * # Set credentials\n * export CDP_API_KEY_ID=your-key-id\n * export CDP_API_KEY_SECRET=your-key-secret\n * \n * # Initialize\n * npx moltspay init --cdp --chain base\n * ```\n */\nexport async function initCDPWallet(config: CDPWalletConfig = {}): Promise<CDPInitResult> {\n const storageDir = config.storageDir || DEFAULT_STORAGE_DIR;\n const chain = config.chain || 'base';\n const storagePath = path.join(storageDir, CDP_CONFIG_FILE);\n\n // Check for existing wallet\n if (fs.existsSync(storagePath)) {\n try {\n const data = JSON.parse(fs.readFileSync(storagePath, 'utf-8')) as CDPWalletData;\n return {\n success: true,\n address: data.address,\n walletId: data.walletId,\n isNew: false,\n storagePath,\n };\n } catch (error) {\n // Continue to create new\n }\n }\n\n // Check CDP availability\n if (!isCDPAvailable()) {\n return {\n success: false,\n error: 'CDP SDK not installed. Run: npm install @coinbase/cdp-sdk',\n };\n }\n\n // Get credentials\n const creds = getCDPCredentials(config);\n if (!creds) {\n return {\n success: false,\n error: 'CDP credentials not found. Set CDP_API_KEY_ID and CDP_API_KEY_SECRET environment variables.',\n };\n }\n\n try {\n // Dynamic import to avoid errors when CDP SDK is not installed\n const { CdpClient } = await import('@coinbase/cdp-sdk');\n\n // Initialize CDP client\n const cdp = new CdpClient({\n apiKeyId: creds.apiKeyId,\n apiKeySecret: creds.apiKeySecret,\n walletSecret: creds.walletSecret,\n });\n\n // Create EVM account\n const account = await cdp.evm.createAccount();\n\n // Ensure storage directory exists\n if (!fs.existsSync(storageDir)) {\n fs.mkdirSync(storageDir, { recursive: true });\n }\n\n // Save wallet data\n const walletData: CDPWalletData = {\n address: account.address,\n walletId: account.address, // CDP uses address as ID for EVM\n chain,\n createdAt: new Date().toISOString(),\n };\n\n fs.writeFileSync(storagePath, JSON.stringify(walletData, null, 2), { mode: 0o600 });\n\n return {\n success: true,\n address: account.address,\n walletId: account.address,\n isNew: true,\n storagePath,\n };\n } catch (error) {\n return {\n success: false,\n error: (error as Error).message,\n };\n }\n}\n\n/**\n * Load existing CDP wallet\n */\nexport function loadCDPWallet(config: CDPWalletConfig = {}): CDPWalletData | null {\n const storageDir = config.storageDir || DEFAULT_STORAGE_DIR;\n const storagePath = path.join(storageDir, CDP_CONFIG_FILE);\n\n if (!fs.existsSync(storagePath)) {\n return null;\n }\n\n try {\n return JSON.parse(fs.readFileSync(storagePath, 'utf-8')) as CDPWalletData;\n } catch {\n return null;\n }\n}\n\n/**\n * Get CDP wallet address (quick check without full init)\n */\nexport function getCDPWalletAddress(storageDir?: string): string | null {\n const data = loadCDPWallet({ storageDir });\n return data?.address || null;\n}\n\n/**\n * CDP Wallet class for making payments\n * \n * Uses CDP SDK for wallet operations with x402 support.\n */\nexport class CDPWallet {\n readonly address: string;\n readonly chain: EvmChainName;\n readonly chainConfig: ReturnType<typeof getChain>;\n private storageDir: string;\n\n constructor(config: CDPWalletConfig = {}) {\n this.storageDir = config.storageDir || DEFAULT_STORAGE_DIR;\n this.chain = config.chain || 'base';\n this.chainConfig = getChain(this.chain);\n\n // Load existing wallet\n const data = loadCDPWallet(config);\n if (!data) {\n throw new Error('CDP wallet not initialized. Run: npx moltspay init --cdp');\n }\n this.address = data.address;\n }\n\n /**\n * Get USDC balance\n */\n async getBalance(): Promise<{ usdc: string; eth: string }> {\n // Use ethers to check balance (read-only, no CDP needed)\n const { ethers } = await import('ethers');\n const provider = new ethers.JsonRpcProvider(this.chainConfig.rpc);\n \n const usdcContract = new ethers.Contract(\n this.chainConfig.usdc,\n ['function balanceOf(address) view returns (uint256)'],\n provider\n );\n\n const [usdcBalance, ethBalance] = await Promise.all([\n usdcContract.balanceOf(this.address),\n provider.getBalance(this.address),\n ]);\n\n return {\n usdc: (Number(usdcBalance) / 1e6).toFixed(2),\n eth: ethers.formatEther(ethBalance),\n };\n }\n\n /**\n * Transfer USDC to a recipient\n * \n * Requires CDP SDK and credentials to sign transactions.\n */\n async transfer(params: { to: string; amount: number }): Promise<{\n success: boolean;\n txHash?: string;\n error?: string;\n explorerUrl?: string;\n }> {\n if (!isCDPAvailable()) {\n return { success: false, error: 'CDP SDK not installed' };\n }\n\n const creds = getCDPCredentials({});\n if (!creds) {\n return { success: false, error: 'CDP credentials not found' };\n }\n\n try {\n const { CdpClient } = await import('@coinbase/cdp-sdk');\n const { ethers } = await import('ethers');\n\n const cdp = new CdpClient({\n apiKeyId: creds.apiKeyId,\n apiKeySecret: creds.apiKeySecret,\n walletSecret: creds.walletSecret,\n });\n\n // Get the account\n const account = await cdp.evm.getAccount({ address: this.address as `0x${string}` });\n\n // Build transfer transaction\n const amountWei = BigInt(Math.floor(params.amount * 1e6));\n const iface = new ethers.Interface([\n 'function transfer(address to, uint256 amount) returns (bool)',\n ]);\n const callData = iface.encodeFunctionData('transfer', [params.to, amountWei]);\n\n // Send transaction (use any to avoid type issues with CDP SDK versions)\n const txOptions: any = {\n to: this.chainConfig.usdc,\n data: callData,\n };\n const tx = await account.sendTransaction(txOptions);\n\n return {\n success: true,\n txHash: tx.transactionHash,\n explorerUrl: `${this.chainConfig.explorerTx}${tx.transactionHash}`,\n };\n } catch (error) {\n return {\n success: false,\n error: (error as Error).message,\n };\n }\n }\n\n /**\n * Create viem-compatible signer for x402\n * \n * This allows using CDP wallet with x402 protocol.\n */\n async getViemAccount(): Promise<unknown> {\n if (!isCDPAvailable()) {\n throw new Error('CDP SDK not installed');\n }\n\n const creds = getCDPCredentials({});\n if (!creds) {\n throw new Error('CDP credentials not found');\n }\n\n const { CdpClient } = await import('@coinbase/cdp-sdk');\n const { toAccount } = await import('viem/accounts');\n\n const cdp = new CdpClient({\n apiKeyId: creds.apiKeyId,\n apiKeySecret: creds.apiKeySecret,\n walletSecret: creds.walletSecret,\n });\n\n const account = await cdp.evm.getAccount({ address: this.address as `0x${string}` });\n return toAccount(account);\n }\n}\n","/**\n * Blockchain Configuration\n */\n\nimport type { ChainConfig, ChainName, EvmChainName, TokenSymbol } from '../types/index.js';\n\nexport const CHAINS: Record<EvmChainName, 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 eip712Name: 'USD Coin', // EIP-712 domain name\n },\n USDT: {\n address: '0xfde4C96c8593536E31F229EA8f37b2ADa2699bb2',\n decimals: 6,\n symbol: 'USDT',\n eip712Name: 'Tether USD',\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 eip712Name: 'USD Coin',\n },\n USDT: {\n address: '0xc2132D05D31c914a87C6611C10748AEb04B58e8F',\n decimals: 6,\n symbol: 'USDT',\n eip712Name: '(PoS) Tether USD', // Polygon uses this name\n },\n },\n usdc: '0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359',\n explorer: 'https://polygonscan.com/address/',\n explorerTx: 'https://polygonscan.com/tx/',\n avgBlockTime: 2,\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 eip712Name: 'USDC', // Testnet USDC uses 'USDC' not 'USD Coin'\n },\n USDT: {\n address: '0x036CbD53842c5426634e7929541eC2318f3dCF7e', // Same as USDC on testnet (no official USDT)\n decimals: 6,\n symbol: 'USDT',\n eip712Name: 'USDC', // Uses same contract as USDC\n },\n },\n usdc: '0x036CbD53842c5426634e7929541eC2318f3dCF7e',\n explorer: 'https://sepolia.basescan.org/address/',\n explorerTx: 'https://sepolia.basescan.org/tx/',\n avgBlockTime: 2,\n },\n // ============ Tempo Testnet (Moderato) ============\n tempo_moderato: {\n name: 'Tempo Moderato',\n chainId: 42431,\n rpc: 'https://rpc.moderato.tempo.xyz',\n tokens: {\n // TIP-20 stablecoins on Tempo testnet (from mppx SDK)\n // Note: Tempo uses USD as native gas token, not ETH\n USDC: {\n address: '0x20c0000000000000000000000000000000000000', // pathUSD - primary testnet stablecoin\n decimals: 6,\n symbol: 'USDC',\n eip712Name: 'pathUSD',\n },\n USDT: {\n address: '0x20c0000000000000000000000000000000000001', // alphaUSD\n decimals: 6,\n symbol: 'USDT',\n eip712Name: 'alphaUSD',\n },\n },\n usdc: '0x20c0000000000000000000000000000000000000',\n explorer: 'https://explore.testnet.tempo.xyz/address/',\n explorerTx: 'https://explore.testnet.tempo.xyz/tx/',\n avgBlockTime: 0.5, // ~500ms finality\n },\n // ============ BNB Chain Testnet ============\n bnb_testnet: {\n name: 'BNB Testnet',\n chainId: 97,\n rpc: 'https://data-seed-prebsc-1-s1.binance.org:8545',\n tokens: {\n // Note: BNB uses 18 decimals for stablecoins (unlike Base/Polygon which use 6)\n // Using official Binance-Peg testnet tokens\n USDC: {\n address: '0x64544969ed7EBf5f083679233325356EbE738930', // Testnet USDC\n decimals: 18,\n symbol: 'USDC',\n eip712Name: 'USD Coin',\n },\n USDT: {\n address: '0x337610d27c682E347C9cD60BD4b3b107C9d34dDd', // Testnet USDT\n decimals: 18,\n symbol: 'USDT',\n eip712Name: 'Tether USD',\n },\n },\n usdc: '0x64544969ed7EBf5f083679233325356EbE738930',\n explorer: 'https://testnet.bscscan.com/address/',\n explorerTx: 'https://testnet.bscscan.com/tx/',\n avgBlockTime: 3,\n // BNB-specific: requires approval for pay-for-success flow\n requiresApproval: true,\n },\n // ============ BNB Chain Mainnet ============\n bnb: {\n name: 'BNB Smart Chain',\n chainId: 56,\n rpc: 'https://bsc-dataseed.binance.org',\n tokens: {\n // Note: BNB uses 18 decimals for stablecoins\n USDC: {\n address: '0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d',\n decimals: 18,\n symbol: 'USDC',\n eip712Name: 'USD Coin',\n },\n USDT: {\n address: '0x55d398326f99059fF775485246999027B3197955',\n decimals: 18,\n symbol: 'USDT',\n eip712Name: 'Tether USD',\n },\n },\n usdc: '0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d',\n explorer: 'https://bscscan.com/address/',\n explorerTx: 'https://bscscan.com/tx/',\n avgBlockTime: 3,\n // BNB-specific: requires approval for pay-for-success flow\n requiresApproval: true,\n },\n};\n\n/**\n * Get token address for a chain\n */\nexport function getTokenAddress(chainName: EvmChainName, 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: EvmChainName, 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: EvmChainName): 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 EVM chains\n */\nexport function listChains(): EvmChainName[] {\n return Object.keys(CHAINS) as EvmChainName[];\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, EvmChainName, TokenSymbol };\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/cdp/index.ts","../../src/chains/index.ts"],"sourcesContent":["/**\n * CDP (Coinbase Developer Platform) Wallet Integration\n * \n * Creates and manages wallets via Coinbase's CDP SDK.\n * These wallets are hosted by Coinbase, making them easy to use for AI Agents.\n * \n * @see https://docs.cdp.coinbase.com/\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport type { EvmChainName } from '../types/index.js';\nimport { getChain } from '../chains/index.js';\n\n// CDP config file location\nconst DEFAULT_STORAGE_DIR = path.join(process.env.HOME || '.', '.moltspay');\nconst CDP_CONFIG_FILE = 'cdp-wallet.json';\n\nexport interface CDPWalletConfig {\n /** Storage directory (default: ~/.moltspay) */\n storageDir?: string;\n /** Chain name */\n chain?: EvmChainName;\n /** CDP API credentials (or use env vars) */\n apiKeyId?: string;\n apiKeySecret?: string;\n walletSecret?: string;\n}\n\nexport interface CDPWalletData {\n /** Wallet address */\n address: string;\n /** CDP wallet ID */\n walletId: string;\n /** Chain */\n chain: EvmChainName;\n /** Created timestamp */\n createdAt: string;\n /** CDP account data (for restoration) */\n accountData?: string;\n}\n\nexport interface CDPInitResult {\n success: boolean;\n address?: string;\n walletId?: string;\n isNew?: boolean;\n error?: string;\n storagePath?: string;\n}\n\n/**\n * Check if CDP SDK is available\n */\nexport function isCDPAvailable(): boolean {\n try {\n require.resolve('@coinbase/cdp-sdk');\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Get CDP credentials from environment\n */\nfunction getCDPCredentials(config: CDPWalletConfig): {\n apiKeyId: string;\n apiKeySecret: string;\n walletSecret?: string;\n} | null {\n const apiKeyId = config.apiKeyId || process.env.CDP_API_KEY_ID;\n const apiKeySecret = config.apiKeySecret || process.env.CDP_API_KEY_SECRET;\n const walletSecret = config.walletSecret || process.env.CDP_WALLET_SECRET;\n\n if (!apiKeyId || !apiKeySecret) {\n return null;\n }\n\n return { apiKeyId, apiKeySecret, walletSecret };\n}\n\n/**\n * Initialize CDP wallet\n * \n * Creates a new CDP wallet or loads existing one.\n * \n * @example\n * ```bash\n * # Set credentials\n * export CDP_API_KEY_ID=your-key-id\n * export CDP_API_KEY_SECRET=your-key-secret\n * \n * # Initialize\n * npx moltspay init --cdp --chain base\n * ```\n */\nexport async function initCDPWallet(config: CDPWalletConfig = {}): Promise<CDPInitResult> {\n const storageDir = config.storageDir || DEFAULT_STORAGE_DIR;\n const chain = config.chain || 'base';\n const storagePath = path.join(storageDir, CDP_CONFIG_FILE);\n\n // Check for existing wallet\n if (fs.existsSync(storagePath)) {\n try {\n const data = JSON.parse(fs.readFileSync(storagePath, 'utf-8')) as CDPWalletData;\n return {\n success: true,\n address: data.address,\n walletId: data.walletId,\n isNew: false,\n storagePath,\n };\n } catch (error) {\n // Continue to create new\n }\n }\n\n // Check CDP availability\n if (!isCDPAvailable()) {\n return {\n success: false,\n error: 'CDP SDK not installed. Run: npm install @coinbase/cdp-sdk',\n };\n }\n\n // Get credentials\n const creds = getCDPCredentials(config);\n if (!creds) {\n return {\n success: false,\n error: 'CDP credentials not found. Set CDP_API_KEY_ID and CDP_API_KEY_SECRET environment variables.',\n };\n }\n\n try {\n // Dynamic import to avoid errors when CDP SDK is not installed\n const { CdpClient } = await import('@coinbase/cdp-sdk');\n\n // Initialize CDP client\n const cdp = new CdpClient({\n apiKeyId: creds.apiKeyId,\n apiKeySecret: creds.apiKeySecret,\n walletSecret: creds.walletSecret,\n });\n\n // Create EVM account\n const account = await cdp.evm.createAccount();\n\n // Ensure storage directory exists\n if (!fs.existsSync(storageDir)) {\n fs.mkdirSync(storageDir, { recursive: true });\n }\n\n // Save wallet data\n const walletData: CDPWalletData = {\n address: account.address,\n walletId: account.address, // CDP uses address as ID for EVM\n chain,\n createdAt: new Date().toISOString(),\n };\n\n fs.writeFileSync(storagePath, JSON.stringify(walletData, null, 2), { mode: 0o600 });\n\n return {\n success: true,\n address: account.address,\n walletId: account.address,\n isNew: true,\n storagePath,\n };\n } catch (error) {\n return {\n success: false,\n error: (error as Error).message,\n };\n }\n}\n\n/**\n * Load existing CDP wallet\n */\nexport function loadCDPWallet(config: CDPWalletConfig = {}): CDPWalletData | null {\n const storageDir = config.storageDir || DEFAULT_STORAGE_DIR;\n const storagePath = path.join(storageDir, CDP_CONFIG_FILE);\n\n if (!fs.existsSync(storagePath)) {\n return null;\n }\n\n try {\n return JSON.parse(fs.readFileSync(storagePath, 'utf-8')) as CDPWalletData;\n } catch {\n return null;\n }\n}\n\n/**\n * Get CDP wallet address (quick check without full init)\n */\nexport function getCDPWalletAddress(storageDir?: string): string | null {\n const data = loadCDPWallet({ storageDir });\n return data?.address || null;\n}\n\n/**\n * CDP Wallet class for making payments\n * \n * Uses CDP SDK for wallet operations with x402 support.\n */\nexport class CDPWallet {\n readonly address: string;\n readonly chain: EvmChainName;\n readonly chainConfig: ReturnType<typeof getChain>;\n private storageDir: string;\n\n constructor(config: CDPWalletConfig = {}) {\n this.storageDir = config.storageDir || DEFAULT_STORAGE_DIR;\n this.chain = config.chain || 'base';\n this.chainConfig = getChain(this.chain);\n\n // Load existing wallet\n const data = loadCDPWallet(config);\n if (!data) {\n throw new Error('CDP wallet not initialized. Run: npx moltspay init --cdp');\n }\n this.address = data.address;\n }\n\n /**\n * Get USDC balance\n */\n async getBalance(): Promise<{ usdc: string; eth: string }> {\n // Use ethers to check balance (read-only, no CDP needed)\n const { ethers } = await import('ethers');\n const provider = new ethers.JsonRpcProvider(this.chainConfig.rpc);\n \n const usdcContract = new ethers.Contract(\n this.chainConfig.usdc,\n ['function balanceOf(address) view returns (uint256)'],\n provider\n );\n\n const [usdcBalance, ethBalance] = await Promise.all([\n usdcContract.balanceOf(this.address),\n provider.getBalance(this.address),\n ]);\n\n return {\n usdc: (Number(usdcBalance) / 1e6).toFixed(2),\n eth: ethers.formatEther(ethBalance),\n };\n }\n\n /**\n * Transfer USDC to a recipient\n * \n * Requires CDP SDK and credentials to sign transactions.\n */\n async transfer(params: { to: string; amount: number }): Promise<{\n success: boolean;\n txHash?: string;\n error?: string;\n explorerUrl?: string;\n }> {\n if (!isCDPAvailable()) {\n return { success: false, error: 'CDP SDK not installed' };\n }\n\n const creds = getCDPCredentials({});\n if (!creds) {\n return { success: false, error: 'CDP credentials not found' };\n }\n\n try {\n const { CdpClient } = await import('@coinbase/cdp-sdk');\n const { ethers } = await import('ethers');\n\n const cdp = new CdpClient({\n apiKeyId: creds.apiKeyId,\n apiKeySecret: creds.apiKeySecret,\n walletSecret: creds.walletSecret,\n });\n\n // Get the account\n const account = await cdp.evm.getAccount({ address: this.address as `0x${string}` });\n\n // Build transfer transaction\n const amountWei = BigInt(Math.floor(params.amount * 1e6));\n const iface = new ethers.Interface([\n 'function transfer(address to, uint256 amount) returns (bool)',\n ]);\n const callData = iface.encodeFunctionData('transfer', [params.to, amountWei]);\n\n // Send transaction (use any to avoid type issues with CDP SDK versions)\n const txOptions: any = {\n to: this.chainConfig.usdc,\n data: callData,\n };\n const tx = await account.sendTransaction(txOptions);\n\n return {\n success: true,\n txHash: tx.transactionHash,\n explorerUrl: `${this.chainConfig.explorerTx}${tx.transactionHash}`,\n };\n } catch (error) {\n return {\n success: false,\n error: (error as Error).message,\n };\n }\n }\n\n /**\n * Create viem-compatible signer for x402\n * \n * This allows using CDP wallet with x402 protocol.\n */\n async getViemAccount(): Promise<unknown> {\n if (!isCDPAvailable()) {\n throw new Error('CDP SDK not installed');\n }\n\n const creds = getCDPCredentials({});\n if (!creds) {\n throw new Error('CDP credentials not found');\n }\n\n const { CdpClient } = await import('@coinbase/cdp-sdk');\n const { toAccount } = await import('viem/accounts');\n\n const cdp = new CdpClient({\n apiKeyId: creds.apiKeyId,\n apiKeySecret: creds.apiKeySecret,\n walletSecret: creds.walletSecret,\n });\n\n const account = await cdp.evm.getAccount({ address: this.address as `0x${string}` });\n return toAccount(account);\n }\n}\n","/**\n * Blockchain Configuration\n */\n\nimport type { ChainConfig, ChainName, EvmChainName, TokenSymbol } from '../types/index.js';\n\nexport const CHAINS: Record<EvmChainName, 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 eip712Name: 'USD Coin', // EIP-712 domain name\n },\n USDT: {\n address: '0xfde4C96c8593536E31F229EA8f37b2ADa2699bb2',\n decimals: 6,\n symbol: 'USDT',\n eip712Name: 'Tether USD',\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 eip712Name: 'USD Coin',\n },\n USDT: {\n address: '0xc2132D05D31c914a87C6611C10748AEb04B58e8F',\n decimals: 6,\n symbol: 'USDT',\n eip712Name: '(PoS) Tether USD', // Polygon uses this name\n },\n },\n usdc: '0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359',\n explorer: 'https://polygonscan.com/address/',\n explorerTx: 'https://polygonscan.com/tx/',\n avgBlockTime: 2,\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 eip712Name: 'USDC', // Testnet USDC uses 'USDC' not 'USD Coin'\n },\n USDT: {\n address: '0x036CbD53842c5426634e7929541eC2318f3dCF7e', // Same as USDC on testnet (no official USDT)\n decimals: 6,\n symbol: 'USDT',\n eip712Name: 'USDC', // Uses same contract as USDC\n },\n },\n usdc: '0x036CbD53842c5426634e7929541eC2318f3dCF7e',\n explorer: 'https://sepolia.basescan.org/address/',\n explorerTx: 'https://sepolia.basescan.org/tx/',\n avgBlockTime: 2,\n },\n // ============ Tempo Testnet (Moderato) ============\n tempo_moderato: {\n name: 'Tempo Moderato',\n chainId: 42431,\n rpc: 'https://rpc.moderato.tempo.xyz',\n tokens: {\n // TIP-20 stablecoins on Tempo testnet (from mppx SDK)\n // Note: Tempo uses USD as native gas token, not ETH\n USDC: {\n address: '0x20c0000000000000000000000000000000000000', // pathUSD - primary testnet stablecoin\n decimals: 6,\n symbol: 'USDC',\n eip712Name: 'pathUSD',\n },\n USDT: {\n address: '0x20c0000000000000000000000000000000000001', // alphaUSD\n decimals: 6,\n symbol: 'USDT',\n eip712Name: 'alphaUSD',\n },\n },\n usdc: '0x20c0000000000000000000000000000000000000',\n explorer: 'https://explore.testnet.tempo.xyz/address/',\n explorerTx: 'https://explore.testnet.tempo.xyz/tx/',\n avgBlockTime: 0.5, // ~500ms finality\n },\n // ============ BNB Chain Testnet ============\n bnb_testnet: {\n name: 'BNB Testnet',\n chainId: 97,\n rpc: 'https://data-seed-prebsc-1-s1.binance.org:8545',\n tokens: {\n // Note: BNB uses 18 decimals for stablecoins (unlike Base/Polygon which use 6)\n // Using official Binance-Peg testnet tokens\n USDC: {\n address: '0x64544969ed7EBf5f083679233325356EbE738930', // Testnet USDC\n decimals: 18,\n symbol: 'USDC',\n eip712Name: 'USD Coin',\n },\n USDT: {\n address: '0x337610d27c682E347C9cD60BD4b3b107C9d34dDd', // Testnet USDT\n decimals: 18,\n symbol: 'USDT',\n eip712Name: 'Tether USD',\n },\n },\n usdc: '0x64544969ed7EBf5f083679233325356EbE738930',\n explorer: 'https://testnet.bscscan.com/address/',\n explorerTx: 'https://testnet.bscscan.com/tx/',\n avgBlockTime: 3,\n // BNB-specific: requires approval for pay-for-success flow\n requiresApproval: true,\n },\n // ============ BNB Chain Mainnet ============\n bnb: {\n name: 'BNB Smart Chain',\n chainId: 56,\n rpc: 'https://bsc-dataseed.binance.org',\n tokens: {\n // Note: BNB uses 18 decimals for stablecoins\n USDC: {\n address: '0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d',\n decimals: 18,\n symbol: 'USDC',\n eip712Name: 'USD Coin',\n },\n USDT: {\n address: '0x55d398326f99059fF775485246999027B3197955',\n decimals: 18,\n symbol: 'USDT',\n eip712Name: 'Tether USD',\n },\n },\n usdc: '0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d',\n explorer: 'https://bscscan.com/address/',\n explorerTx: 'https://bscscan.com/tx/',\n avgBlockTime: 3,\n // BNB-specific: requires approval for pay-for-success flow\n requiresApproval: true,\n },\n};\n\n/**\n * Get token address for a chain\n */\nexport function getTokenAddress(chainName: EvmChainName, 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: EvmChainName, 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: EvmChainName): 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 EVM chains\n */\nexport function listChains(): EvmChainName[] {\n return Object.keys(CHAINS) as EvmChainName[];\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// ============ Alipay AI 收 Fiat Rail (2.0.0+) ============\n\n/**\n * Chain-id string for the Alipay AI 收 fiat rail.\n * Used in `provider.chains: [\"alipay\", ...]` to opt the provider into\n * accepting CNY payments alongside USDC.\n */\nexport const ALIPAY_CHAIN_ID = 'alipay' as const;\n\n/**\n * Rail metadata for the Alipay AI 收 fiat rail (2.0.0+).\n *\n * Intentionally kept **outside** the {@link CHAINS} Record because that\n * Record is `Record<EvmChainName, ChainConfig>` and an EVM `ChainConfig`\n * (rpc / tokens / chainId) is not meaningful for a fiat rail.\n *\n * The rail uses `type: \"fiat-rail\"`, distinct from `ChainFamily`'s\n * existing `\"evm\"` and `\"svm\"`. Server dispatch detects alipay via\n * {@link isAlipayChainId} rather than via the EVM/SVM type guards.\n */\nexport const ALIPAY_RAIL = {\n /** Chain-id string used in user manifests + routing. */\n id: ALIPAY_CHAIN_ID,\n /** Rail family — distinct from `ChainFamily` ('evm' | 'svm'). */\n type: 'fiat-rail' as const,\n /** Quote currency. */\n currency: 'CNY' as const,\n /** Decimal places for the `amount` field (元 with up to 2 decimals). */\n decimals: 2 as const,\n /** x402 `scheme` string — matches `ALIPAY_SCHEME` in src/facilitators/alipay.ts. */\n facilitator: 'alipay-aipay' as const,\n} as const;\n\n/**\n * Runtime type guard: is this chain-id string the Alipay fiat rail?\n *\n * Used by the server layer to route a `Payment-Proof` request to\n * {@link AlipayFacilitator} instead of an EVM/SVM verifier.\n */\nexport function isAlipayChainId(id: string): id is typeof ALIPAY_CHAIN_ID {\n return id === ALIPAY_CHAIN_ID;\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, EvmChainName, TokenSymbol };\n"],"mappings":"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","names":[]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { B as BaseFacilitator,
|
|
1
|
+
import { B as BaseFacilitator, F as FacilitatorConfig, H as HealthCheckResult, X as X402PaymentPayload, a as X402PaymentRequirements, V as VerifyResult, S as SettleResult, b as FacilitatorFee } from './registry-DIo0WNoO.js';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* CDP Facilitator
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { B as BaseFacilitator,
|
|
1
|
+
import { B as BaseFacilitator, F as FacilitatorConfig, H as HealthCheckResult, X as X402PaymentPayload, a as X402PaymentRequirements, V as VerifyResult, S as SettleResult, b as FacilitatorFee } from './registry-DIo0WNoO.mjs';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* CDP Facilitator
|
package/dist/chains/index.d.mts
CHANGED
|
@@ -22,9 +22,45 @@ declare function listChains(): EvmChainName[];
|
|
|
22
22
|
* Get chain config by chainId
|
|
23
23
|
*/
|
|
24
24
|
declare function getChainById(chainId: number): ChainConfig | undefined;
|
|
25
|
+
/**
|
|
26
|
+
* Chain-id string for the Alipay AI 收 fiat rail.
|
|
27
|
+
* Used in `provider.chains: ["alipay", ...]` to opt the provider into
|
|
28
|
+
* accepting CNY payments alongside USDC.
|
|
29
|
+
*/
|
|
30
|
+
declare const ALIPAY_CHAIN_ID: "alipay";
|
|
31
|
+
/**
|
|
32
|
+
* Rail metadata for the Alipay AI 收 fiat rail (2.0.0+).
|
|
33
|
+
*
|
|
34
|
+
* Intentionally kept **outside** the {@link CHAINS} Record because that
|
|
35
|
+
* Record is `Record<EvmChainName, ChainConfig>` and an EVM `ChainConfig`
|
|
36
|
+
* (rpc / tokens / chainId) is not meaningful for a fiat rail.
|
|
37
|
+
*
|
|
38
|
+
* The rail uses `type: "fiat-rail"`, distinct from `ChainFamily`'s
|
|
39
|
+
* existing `"evm"` and `"svm"`. Server dispatch detects alipay via
|
|
40
|
+
* {@link isAlipayChainId} rather than via the EVM/SVM type guards.
|
|
41
|
+
*/
|
|
42
|
+
declare const ALIPAY_RAIL: {
|
|
43
|
+
/** Chain-id string used in user manifests + routing. */
|
|
44
|
+
readonly id: "alipay";
|
|
45
|
+
/** Rail family — distinct from `ChainFamily` ('evm' | 'svm'). */
|
|
46
|
+
readonly type: "fiat-rail";
|
|
47
|
+
/** Quote currency. */
|
|
48
|
+
readonly currency: "CNY";
|
|
49
|
+
/** Decimal places for the `amount` field (元 with up to 2 decimals). */
|
|
50
|
+
readonly decimals: 2;
|
|
51
|
+
/** x402 `scheme` string — matches `ALIPAY_SCHEME` in src/facilitators/alipay.ts. */
|
|
52
|
+
readonly facilitator: "alipay-aipay";
|
|
53
|
+
};
|
|
54
|
+
/**
|
|
55
|
+
* Runtime type guard: is this chain-id string the Alipay fiat rail?
|
|
56
|
+
*
|
|
57
|
+
* Used by the server layer to route a `Payment-Proof` request to
|
|
58
|
+
* {@link AlipayFacilitator} instead of an EVM/SVM verifier.
|
|
59
|
+
*/
|
|
60
|
+
declare function isAlipayChainId(id: string): id is typeof ALIPAY_CHAIN_ID;
|
|
25
61
|
/**
|
|
26
62
|
* ERC20 ABI (minimal, only required methods)
|
|
27
63
|
*/
|
|
28
64
|
declare const ERC20_ABI: string[];
|
|
29
65
|
|
|
30
|
-
export { CHAINS, ChainConfig, ERC20_ABI, EvmChainName, TokenSymbol, getChain, getChainById, getTokenAddress, getTokenConfig, listChains };
|
|
66
|
+
export { ALIPAY_CHAIN_ID, ALIPAY_RAIL, CHAINS, ChainConfig, ERC20_ABI, EvmChainName, TokenSymbol, getChain, getChainById, getTokenAddress, getTokenConfig, isAlipayChainId, listChains };
|
package/dist/chains/index.d.ts
CHANGED
|
@@ -22,9 +22,45 @@ declare function listChains(): EvmChainName[];
|
|
|
22
22
|
* Get chain config by chainId
|
|
23
23
|
*/
|
|
24
24
|
declare function getChainById(chainId: number): ChainConfig | undefined;
|
|
25
|
+
/**
|
|
26
|
+
* Chain-id string for the Alipay AI 收 fiat rail.
|
|
27
|
+
* Used in `provider.chains: ["alipay", ...]` to opt the provider into
|
|
28
|
+
* accepting CNY payments alongside USDC.
|
|
29
|
+
*/
|
|
30
|
+
declare const ALIPAY_CHAIN_ID: "alipay";
|
|
31
|
+
/**
|
|
32
|
+
* Rail metadata for the Alipay AI 收 fiat rail (2.0.0+).
|
|
33
|
+
*
|
|
34
|
+
* Intentionally kept **outside** the {@link CHAINS} Record because that
|
|
35
|
+
* Record is `Record<EvmChainName, ChainConfig>` and an EVM `ChainConfig`
|
|
36
|
+
* (rpc / tokens / chainId) is not meaningful for a fiat rail.
|
|
37
|
+
*
|
|
38
|
+
* The rail uses `type: "fiat-rail"`, distinct from `ChainFamily`'s
|
|
39
|
+
* existing `"evm"` and `"svm"`. Server dispatch detects alipay via
|
|
40
|
+
* {@link isAlipayChainId} rather than via the EVM/SVM type guards.
|
|
41
|
+
*/
|
|
42
|
+
declare const ALIPAY_RAIL: {
|
|
43
|
+
/** Chain-id string used in user manifests + routing. */
|
|
44
|
+
readonly id: "alipay";
|
|
45
|
+
/** Rail family — distinct from `ChainFamily` ('evm' | 'svm'). */
|
|
46
|
+
readonly type: "fiat-rail";
|
|
47
|
+
/** Quote currency. */
|
|
48
|
+
readonly currency: "CNY";
|
|
49
|
+
/** Decimal places for the `amount` field (元 with up to 2 decimals). */
|
|
50
|
+
readonly decimals: 2;
|
|
51
|
+
/** x402 `scheme` string — matches `ALIPAY_SCHEME` in src/facilitators/alipay.ts. */
|
|
52
|
+
readonly facilitator: "alipay-aipay";
|
|
53
|
+
};
|
|
54
|
+
/**
|
|
55
|
+
* Runtime type guard: is this chain-id string the Alipay fiat rail?
|
|
56
|
+
*
|
|
57
|
+
* Used by the server layer to route a `Payment-Proof` request to
|
|
58
|
+
* {@link AlipayFacilitator} instead of an EVM/SVM verifier.
|
|
59
|
+
*/
|
|
60
|
+
declare function isAlipayChainId(id: string): id is typeof ALIPAY_CHAIN_ID;
|
|
25
61
|
/**
|
|
26
62
|
* ERC20 ABI (minimal, only required methods)
|
|
27
63
|
*/
|
|
28
64
|
declare const ERC20_ABI: string[];
|
|
29
65
|
|
|
30
|
-
export { CHAINS, ChainConfig, ERC20_ABI, EvmChainName, TokenSymbol, getChain, getChainById, getTokenAddress, getTokenConfig, listChains };
|
|
66
|
+
export { ALIPAY_CHAIN_ID, ALIPAY_RAIL, CHAINS, ChainConfig, ERC20_ABI, EvmChainName, TokenSymbol, getChain, getChainById, getTokenAddress, getTokenConfig, isAlipayChainId, listChains };
|
package/dist/chains/index.js
CHANGED
|
@@ -20,12 +20,15 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
20
20
|
// src/chains/index.ts
|
|
21
21
|
var chains_exports = {};
|
|
22
22
|
__export(chains_exports, {
|
|
23
|
+
ALIPAY_CHAIN_ID: () => ALIPAY_CHAIN_ID,
|
|
24
|
+
ALIPAY_RAIL: () => ALIPAY_RAIL,
|
|
23
25
|
CHAINS: () => CHAINS,
|
|
24
26
|
ERC20_ABI: () => ERC20_ABI,
|
|
25
27
|
getChain: () => getChain,
|
|
26
28
|
getChainById: () => getChainById,
|
|
27
29
|
getTokenAddress: () => getTokenAddress,
|
|
28
30
|
getTokenConfig: () => getTokenConfig,
|
|
31
|
+
isAlipayChainId: () => isAlipayChainId,
|
|
29
32
|
listChains: () => listChains
|
|
30
33
|
});
|
|
31
34
|
module.exports = __toCommonJS(chains_exports);
|
|
@@ -225,6 +228,22 @@ function listChains() {
|
|
|
225
228
|
function getChainById(chainId) {
|
|
226
229
|
return Object.values(CHAINS).find((c) => c.chainId === chainId);
|
|
227
230
|
}
|
|
231
|
+
var ALIPAY_CHAIN_ID = "alipay";
|
|
232
|
+
var ALIPAY_RAIL = {
|
|
233
|
+
/** Chain-id string used in user manifests + routing. */
|
|
234
|
+
id: ALIPAY_CHAIN_ID,
|
|
235
|
+
/** Rail family — distinct from `ChainFamily` ('evm' | 'svm'). */
|
|
236
|
+
type: "fiat-rail",
|
|
237
|
+
/** Quote currency. */
|
|
238
|
+
currency: "CNY",
|
|
239
|
+
/** Decimal places for the `amount` field (元 with up to 2 decimals). */
|
|
240
|
+
decimals: 2,
|
|
241
|
+
/** x402 `scheme` string — matches `ALIPAY_SCHEME` in src/facilitators/alipay.ts. */
|
|
242
|
+
facilitator: "alipay-aipay"
|
|
243
|
+
};
|
|
244
|
+
function isAlipayChainId(id) {
|
|
245
|
+
return id === ALIPAY_CHAIN_ID;
|
|
246
|
+
}
|
|
228
247
|
var ERC20_ABI = [
|
|
229
248
|
"function balanceOf(address owner) view returns (uint256)",
|
|
230
249
|
"function transfer(address to, uint256 amount) returns (bool)",
|
|
@@ -240,12 +259,15 @@ var ERC20_ABI = [
|
|
|
240
259
|
];
|
|
241
260
|
// Annotate the CommonJS export names for ESM import in node:
|
|
242
261
|
0 && (module.exports = {
|
|
262
|
+
ALIPAY_CHAIN_ID,
|
|
263
|
+
ALIPAY_RAIL,
|
|
243
264
|
CHAINS,
|
|
244
265
|
ERC20_ABI,
|
|
245
266
|
getChain,
|
|
246
267
|
getChainById,
|
|
247
268
|
getTokenAddress,
|
|
248
269
|
getTokenConfig,
|
|
270
|
+
isAlipayChainId,
|
|
249
271
|
listChains
|
|
250
272
|
});
|
|
251
273
|
//# sourceMappingURL=index.js.map
|
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, EvmChainName, TokenSymbol } from '../types/index.js';\n\nexport const CHAINS: Record<EvmChainName, 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 eip712Name: 'USD Coin', // EIP-712 domain name\n },\n USDT: {\n address: '0xfde4C96c8593536E31F229EA8f37b2ADa2699bb2',\n decimals: 6,\n symbol: 'USDT',\n eip712Name: 'Tether USD',\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 eip712Name: 'USD Coin',\n },\n USDT: {\n address: '0xc2132D05D31c914a87C6611C10748AEb04B58e8F',\n decimals: 6,\n symbol: 'USDT',\n eip712Name: '(PoS) Tether USD', // Polygon uses this name\n },\n },\n usdc: '0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359',\n explorer: 'https://polygonscan.com/address/',\n explorerTx: 'https://polygonscan.com/tx/',\n avgBlockTime: 2,\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 eip712Name: 'USDC', // Testnet USDC uses 'USDC' not 'USD Coin'\n },\n USDT: {\n address: '0x036CbD53842c5426634e7929541eC2318f3dCF7e', // Same as USDC on testnet (no official USDT)\n decimals: 6,\n symbol: 'USDT',\n eip712Name: 'USDC', // Uses same contract as USDC\n },\n },\n usdc: '0x036CbD53842c5426634e7929541eC2318f3dCF7e',\n explorer: 'https://sepolia.basescan.org/address/',\n explorerTx: 'https://sepolia.basescan.org/tx/',\n avgBlockTime: 2,\n },\n // ============ Tempo Testnet (Moderato) ============\n tempo_moderato: {\n name: 'Tempo Moderato',\n chainId: 42431,\n rpc: 'https://rpc.moderato.tempo.xyz',\n tokens: {\n // TIP-20 stablecoins on Tempo testnet (from mppx SDK)\n // Note: Tempo uses USD as native gas token, not ETH\n USDC: {\n address: '0x20c0000000000000000000000000000000000000', // pathUSD - primary testnet stablecoin\n decimals: 6,\n symbol: 'USDC',\n eip712Name: 'pathUSD',\n },\n USDT: {\n address: '0x20c0000000000000000000000000000000000001', // alphaUSD\n decimals: 6,\n symbol: 'USDT',\n eip712Name: 'alphaUSD',\n },\n },\n usdc: '0x20c0000000000000000000000000000000000000',\n explorer: 'https://explore.testnet.tempo.xyz/address/',\n explorerTx: 'https://explore.testnet.tempo.xyz/tx/',\n avgBlockTime: 0.5, // ~500ms finality\n },\n // ============ BNB Chain Testnet ============\n bnb_testnet: {\n name: 'BNB Testnet',\n chainId: 97,\n rpc: 'https://data-seed-prebsc-1-s1.binance.org:8545',\n tokens: {\n // Note: BNB uses 18 decimals for stablecoins (unlike Base/Polygon which use 6)\n // Using official Binance-Peg testnet tokens\n USDC: {\n address: '0x64544969ed7EBf5f083679233325356EbE738930', // Testnet USDC\n decimals: 18,\n symbol: 'USDC',\n eip712Name: 'USD Coin',\n },\n USDT: {\n address: '0x337610d27c682E347C9cD60BD4b3b107C9d34dDd', // Testnet USDT\n decimals: 18,\n symbol: 'USDT',\n eip712Name: 'Tether USD',\n },\n },\n usdc: '0x64544969ed7EBf5f083679233325356EbE738930',\n explorer: 'https://testnet.bscscan.com/address/',\n explorerTx: 'https://testnet.bscscan.com/tx/',\n avgBlockTime: 3,\n // BNB-specific: requires approval for pay-for-success flow\n requiresApproval: true,\n },\n // ============ BNB Chain Mainnet ============\n bnb: {\n name: 'BNB Smart Chain',\n chainId: 56,\n rpc: 'https://bsc-dataseed.binance.org',\n tokens: {\n // Note: BNB uses 18 decimals for stablecoins\n USDC: {\n address: '0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d',\n decimals: 18,\n symbol: 'USDC',\n eip712Name: 'USD Coin',\n },\n USDT: {\n address: '0x55d398326f99059fF775485246999027B3197955',\n decimals: 18,\n symbol: 'USDT',\n eip712Name: 'Tether USD',\n },\n },\n usdc: '0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d',\n explorer: 'https://bscscan.com/address/',\n explorerTx: 'https://bscscan.com/tx/',\n avgBlockTime: 3,\n // BNB-specific: requires approval for pay-for-success flow\n requiresApproval: true,\n },\n};\n\n/**\n * Get token address for a chain\n */\nexport function getTokenAddress(chainName: EvmChainName, 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: EvmChainName, 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: EvmChainName): 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 EVM chains\n */\nexport function listChains(): EvmChainName[] {\n return Object.keys(CHAINS) as EvmChainName[];\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, EvmChainName, 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, EvmChainName, TokenSymbol } from '../types/index.js';\n\nexport const CHAINS: Record<EvmChainName, 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 eip712Name: 'USD Coin', // EIP-712 domain name\n },\n USDT: {\n address: '0xfde4C96c8593536E31F229EA8f37b2ADa2699bb2',\n decimals: 6,\n symbol: 'USDT',\n eip712Name: 'Tether USD',\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 eip712Name: 'USD Coin',\n },\n USDT: {\n address: '0xc2132D05D31c914a87C6611C10748AEb04B58e8F',\n decimals: 6,\n symbol: 'USDT',\n eip712Name: '(PoS) Tether USD', // Polygon uses this name\n },\n },\n usdc: '0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359',\n explorer: 'https://polygonscan.com/address/',\n explorerTx: 'https://polygonscan.com/tx/',\n avgBlockTime: 2,\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 eip712Name: 'USDC', // Testnet USDC uses 'USDC' not 'USD Coin'\n },\n USDT: {\n address: '0x036CbD53842c5426634e7929541eC2318f3dCF7e', // Same as USDC on testnet (no official USDT)\n decimals: 6,\n symbol: 'USDT',\n eip712Name: 'USDC', // Uses same contract as USDC\n },\n },\n usdc: '0x036CbD53842c5426634e7929541eC2318f3dCF7e',\n explorer: 'https://sepolia.basescan.org/address/',\n explorerTx: 'https://sepolia.basescan.org/tx/',\n avgBlockTime: 2,\n },\n // ============ Tempo Testnet (Moderato) ============\n tempo_moderato: {\n name: 'Tempo Moderato',\n chainId: 42431,\n rpc: 'https://rpc.moderato.tempo.xyz',\n tokens: {\n // TIP-20 stablecoins on Tempo testnet (from mppx SDK)\n // Note: Tempo uses USD as native gas token, not ETH\n USDC: {\n address: '0x20c0000000000000000000000000000000000000', // pathUSD - primary testnet stablecoin\n decimals: 6,\n symbol: 'USDC',\n eip712Name: 'pathUSD',\n },\n USDT: {\n address: '0x20c0000000000000000000000000000000000001', // alphaUSD\n decimals: 6,\n symbol: 'USDT',\n eip712Name: 'alphaUSD',\n },\n },\n usdc: '0x20c0000000000000000000000000000000000000',\n explorer: 'https://explore.testnet.tempo.xyz/address/',\n explorerTx: 'https://explore.testnet.tempo.xyz/tx/',\n avgBlockTime: 0.5, // ~500ms finality\n },\n // ============ BNB Chain Testnet ============\n bnb_testnet: {\n name: 'BNB Testnet',\n chainId: 97,\n rpc: 'https://data-seed-prebsc-1-s1.binance.org:8545',\n tokens: {\n // Note: BNB uses 18 decimals for stablecoins (unlike Base/Polygon which use 6)\n // Using official Binance-Peg testnet tokens\n USDC: {\n address: '0x64544969ed7EBf5f083679233325356EbE738930', // Testnet USDC\n decimals: 18,\n symbol: 'USDC',\n eip712Name: 'USD Coin',\n },\n USDT: {\n address: '0x337610d27c682E347C9cD60BD4b3b107C9d34dDd', // Testnet USDT\n decimals: 18,\n symbol: 'USDT',\n eip712Name: 'Tether USD',\n },\n },\n usdc: '0x64544969ed7EBf5f083679233325356EbE738930',\n explorer: 'https://testnet.bscscan.com/address/',\n explorerTx: 'https://testnet.bscscan.com/tx/',\n avgBlockTime: 3,\n // BNB-specific: requires approval for pay-for-success flow\n requiresApproval: true,\n },\n // ============ BNB Chain Mainnet ============\n bnb: {\n name: 'BNB Smart Chain',\n chainId: 56,\n rpc: 'https://bsc-dataseed.binance.org',\n tokens: {\n // Note: BNB uses 18 decimals for stablecoins\n USDC: {\n address: '0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d',\n decimals: 18,\n symbol: 'USDC',\n eip712Name: 'USD Coin',\n },\n USDT: {\n address: '0x55d398326f99059fF775485246999027B3197955',\n decimals: 18,\n symbol: 'USDT',\n eip712Name: 'Tether USD',\n },\n },\n usdc: '0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d',\n explorer: 'https://bscscan.com/address/',\n explorerTx: 'https://bscscan.com/tx/',\n avgBlockTime: 3,\n // BNB-specific: requires approval for pay-for-success flow\n requiresApproval: true,\n },\n};\n\n/**\n * Get token address for a chain\n */\nexport function getTokenAddress(chainName: EvmChainName, 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: EvmChainName, 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: EvmChainName): 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 EVM chains\n */\nexport function listChains(): EvmChainName[] {\n return Object.keys(CHAINS) as EvmChainName[];\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// ============ Alipay AI 收 Fiat Rail (2.0.0+) ============\n\n/**\n * Chain-id string for the Alipay AI 收 fiat rail.\n * Used in `provider.chains: [\"alipay\", ...]` to opt the provider into\n * accepting CNY payments alongside USDC.\n */\nexport const ALIPAY_CHAIN_ID = 'alipay' as const;\n\n/**\n * Rail metadata for the Alipay AI 收 fiat rail (2.0.0+).\n *\n * Intentionally kept **outside** the {@link CHAINS} Record because that\n * Record is `Record<EvmChainName, ChainConfig>` and an EVM `ChainConfig`\n * (rpc / tokens / chainId) is not meaningful for a fiat rail.\n *\n * The rail uses `type: \"fiat-rail\"`, distinct from `ChainFamily`'s\n * existing `\"evm\"` and `\"svm\"`. Server dispatch detects alipay via\n * {@link isAlipayChainId} rather than via the EVM/SVM type guards.\n */\nexport const ALIPAY_RAIL = {\n /** Chain-id string used in user manifests + routing. */\n id: ALIPAY_CHAIN_ID,\n /** Rail family — distinct from `ChainFamily` ('evm' | 'svm'). */\n type: 'fiat-rail' as const,\n /** Quote currency. */\n currency: 'CNY' as const,\n /** Decimal places for the `amount` field (元 with up to 2 decimals). */\n decimals: 2 as const,\n /** x402 `scheme` string — matches `ALIPAY_SCHEME` in src/facilitators/alipay.ts. */\n facilitator: 'alipay-aipay' as const,\n} as const;\n\n/**\n * Runtime type guard: is this chain-id string the Alipay fiat rail?\n *\n * Used by the server layer to route a `Payment-Proof` request to\n * {@link AlipayFacilitator} instead of an EVM/SVM verifier.\n */\nexport function isAlipayChainId(id: string): id is typeof ALIPAY_CHAIN_ID {\n return id === ALIPAY_CHAIN_ID;\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, EvmChainName, TokenSymbol };\n"],"mappings":"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","names":[]}
|
package/dist/chains/index.mjs
CHANGED
|
@@ -195,6 +195,22 @@ function listChains() {
|
|
|
195
195
|
function getChainById(chainId) {
|
|
196
196
|
return Object.values(CHAINS).find((c) => c.chainId === chainId);
|
|
197
197
|
}
|
|
198
|
+
var ALIPAY_CHAIN_ID = "alipay";
|
|
199
|
+
var ALIPAY_RAIL = {
|
|
200
|
+
/** Chain-id string used in user manifests + routing. */
|
|
201
|
+
id: ALIPAY_CHAIN_ID,
|
|
202
|
+
/** Rail family — distinct from `ChainFamily` ('evm' | 'svm'). */
|
|
203
|
+
type: "fiat-rail",
|
|
204
|
+
/** Quote currency. */
|
|
205
|
+
currency: "CNY",
|
|
206
|
+
/** Decimal places for the `amount` field (元 with up to 2 decimals). */
|
|
207
|
+
decimals: 2,
|
|
208
|
+
/** x402 `scheme` string — matches `ALIPAY_SCHEME` in src/facilitators/alipay.ts. */
|
|
209
|
+
facilitator: "alipay-aipay"
|
|
210
|
+
};
|
|
211
|
+
function isAlipayChainId(id) {
|
|
212
|
+
return id === ALIPAY_CHAIN_ID;
|
|
213
|
+
}
|
|
198
214
|
var ERC20_ABI = [
|
|
199
215
|
"function balanceOf(address owner) view returns (uint256)",
|
|
200
216
|
"function transfer(address to, uint256 amount) returns (bool)",
|
|
@@ -209,12 +225,15 @@ var ERC20_ABI = [
|
|
|
209
225
|
"event Approval(address indexed owner, address indexed spender, uint256 value)"
|
|
210
226
|
];
|
|
211
227
|
export {
|
|
228
|
+
ALIPAY_CHAIN_ID,
|
|
229
|
+
ALIPAY_RAIL,
|
|
212
230
|
CHAINS,
|
|
213
231
|
ERC20_ABI,
|
|
214
232
|
getChain,
|
|
215
233
|
getChainById,
|
|
216
234
|
getTokenAddress,
|
|
217
235
|
getTokenConfig,
|
|
236
|
+
isAlipayChainId,
|
|
218
237
|
listChains
|
|
219
238
|
};
|
|
220
239
|
//# sourceMappingURL=index.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/chains/index.ts"],"sourcesContent":["/**\n * Blockchain Configuration\n */\n\nimport type { ChainConfig, ChainName, EvmChainName, TokenSymbol } from '../types/index.js';\n\nexport const CHAINS: Record<EvmChainName, 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 eip712Name: 'USD Coin', // EIP-712 domain name\n },\n USDT: {\n address: '0xfde4C96c8593536E31F229EA8f37b2ADa2699bb2',\n decimals: 6,\n symbol: 'USDT',\n eip712Name: 'Tether USD',\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 eip712Name: 'USD Coin',\n },\n USDT: {\n address: '0xc2132D05D31c914a87C6611C10748AEb04B58e8F',\n decimals: 6,\n symbol: 'USDT',\n eip712Name: '(PoS) Tether USD', // Polygon uses this name\n },\n },\n usdc: '0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359',\n explorer: 'https://polygonscan.com/address/',\n explorerTx: 'https://polygonscan.com/tx/',\n avgBlockTime: 2,\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 eip712Name: 'USDC', // Testnet USDC uses 'USDC' not 'USD Coin'\n },\n USDT: {\n address: '0x036CbD53842c5426634e7929541eC2318f3dCF7e', // Same as USDC on testnet (no official USDT)\n decimals: 6,\n symbol: 'USDT',\n eip712Name: 'USDC', // Uses same contract as USDC\n },\n },\n usdc: '0x036CbD53842c5426634e7929541eC2318f3dCF7e',\n explorer: 'https://sepolia.basescan.org/address/',\n explorerTx: 'https://sepolia.basescan.org/tx/',\n avgBlockTime: 2,\n },\n // ============ Tempo Testnet (Moderato) ============\n tempo_moderato: {\n name: 'Tempo Moderato',\n chainId: 42431,\n rpc: 'https://rpc.moderato.tempo.xyz',\n tokens: {\n // TIP-20 stablecoins on Tempo testnet (from mppx SDK)\n // Note: Tempo uses USD as native gas token, not ETH\n USDC: {\n address: '0x20c0000000000000000000000000000000000000', // pathUSD - primary testnet stablecoin\n decimals: 6,\n symbol: 'USDC',\n eip712Name: 'pathUSD',\n },\n USDT: {\n address: '0x20c0000000000000000000000000000000000001', // alphaUSD\n decimals: 6,\n symbol: 'USDT',\n eip712Name: 'alphaUSD',\n },\n },\n usdc: '0x20c0000000000000000000000000000000000000',\n explorer: 'https://explore.testnet.tempo.xyz/address/',\n explorerTx: 'https://explore.testnet.tempo.xyz/tx/',\n avgBlockTime: 0.5, // ~500ms finality\n },\n // ============ BNB Chain Testnet ============\n bnb_testnet: {\n name: 'BNB Testnet',\n chainId: 97,\n rpc: 'https://data-seed-prebsc-1-s1.binance.org:8545',\n tokens: {\n // Note: BNB uses 18 decimals for stablecoins (unlike Base/Polygon which use 6)\n // Using official Binance-Peg testnet tokens\n USDC: {\n address: '0x64544969ed7EBf5f083679233325356EbE738930', // Testnet USDC\n decimals: 18,\n symbol: 'USDC',\n eip712Name: 'USD Coin',\n },\n USDT: {\n address: '0x337610d27c682E347C9cD60BD4b3b107C9d34dDd', // Testnet USDT\n decimals: 18,\n symbol: 'USDT',\n eip712Name: 'Tether USD',\n },\n },\n usdc: '0x64544969ed7EBf5f083679233325356EbE738930',\n explorer: 'https://testnet.bscscan.com/address/',\n explorerTx: 'https://testnet.bscscan.com/tx/',\n avgBlockTime: 3,\n // BNB-specific: requires approval for pay-for-success flow\n requiresApproval: true,\n },\n // ============ BNB Chain Mainnet ============\n bnb: {\n name: 'BNB Smart Chain',\n chainId: 56,\n rpc: 'https://bsc-dataseed.binance.org',\n tokens: {\n // Note: BNB uses 18 decimals for stablecoins\n USDC: {\n address: '0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d',\n decimals: 18,\n symbol: 'USDC',\n eip712Name: 'USD Coin',\n },\n USDT: {\n address: '0x55d398326f99059fF775485246999027B3197955',\n decimals: 18,\n symbol: 'USDT',\n eip712Name: 'Tether USD',\n },\n },\n usdc: '0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d',\n explorer: 'https://bscscan.com/address/',\n explorerTx: 'https://bscscan.com/tx/',\n avgBlockTime: 3,\n // BNB-specific: requires approval for pay-for-success flow\n requiresApproval: true,\n },\n};\n\n/**\n * Get token address for a chain\n */\nexport function getTokenAddress(chainName: EvmChainName, 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: EvmChainName, 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: EvmChainName): 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 EVM chains\n */\nexport function listChains(): EvmChainName[] {\n return Object.keys(CHAINS) as EvmChainName[];\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, EvmChainName, 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, EvmChainName, TokenSymbol } from '../types/index.js';\n\nexport const CHAINS: Record<EvmChainName, 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 eip712Name: 'USD Coin', // EIP-712 domain name\n },\n USDT: {\n address: '0xfde4C96c8593536E31F229EA8f37b2ADa2699bb2',\n decimals: 6,\n symbol: 'USDT',\n eip712Name: 'Tether USD',\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 eip712Name: 'USD Coin',\n },\n USDT: {\n address: '0xc2132D05D31c914a87C6611C10748AEb04B58e8F',\n decimals: 6,\n symbol: 'USDT',\n eip712Name: '(PoS) Tether USD', // Polygon uses this name\n },\n },\n usdc: '0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359',\n explorer: 'https://polygonscan.com/address/',\n explorerTx: 'https://polygonscan.com/tx/',\n avgBlockTime: 2,\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 eip712Name: 'USDC', // Testnet USDC uses 'USDC' not 'USD Coin'\n },\n USDT: {\n address: '0x036CbD53842c5426634e7929541eC2318f3dCF7e', // Same as USDC on testnet (no official USDT)\n decimals: 6,\n symbol: 'USDT',\n eip712Name: 'USDC', // Uses same contract as USDC\n },\n },\n usdc: '0x036CbD53842c5426634e7929541eC2318f3dCF7e',\n explorer: 'https://sepolia.basescan.org/address/',\n explorerTx: 'https://sepolia.basescan.org/tx/',\n avgBlockTime: 2,\n },\n // ============ Tempo Testnet (Moderato) ============\n tempo_moderato: {\n name: 'Tempo Moderato',\n chainId: 42431,\n rpc: 'https://rpc.moderato.tempo.xyz',\n tokens: {\n // TIP-20 stablecoins on Tempo testnet (from mppx SDK)\n // Note: Tempo uses USD as native gas token, not ETH\n USDC: {\n address: '0x20c0000000000000000000000000000000000000', // pathUSD - primary testnet stablecoin\n decimals: 6,\n symbol: 'USDC',\n eip712Name: 'pathUSD',\n },\n USDT: {\n address: '0x20c0000000000000000000000000000000000001', // alphaUSD\n decimals: 6,\n symbol: 'USDT',\n eip712Name: 'alphaUSD',\n },\n },\n usdc: '0x20c0000000000000000000000000000000000000',\n explorer: 'https://explore.testnet.tempo.xyz/address/',\n explorerTx: 'https://explore.testnet.tempo.xyz/tx/',\n avgBlockTime: 0.5, // ~500ms finality\n },\n // ============ BNB Chain Testnet ============\n bnb_testnet: {\n name: 'BNB Testnet',\n chainId: 97,\n rpc: 'https://data-seed-prebsc-1-s1.binance.org:8545',\n tokens: {\n // Note: BNB uses 18 decimals for stablecoins (unlike Base/Polygon which use 6)\n // Using official Binance-Peg testnet tokens\n USDC: {\n address: '0x64544969ed7EBf5f083679233325356EbE738930', // Testnet USDC\n decimals: 18,\n symbol: 'USDC',\n eip712Name: 'USD Coin',\n },\n USDT: {\n address: '0x337610d27c682E347C9cD60BD4b3b107C9d34dDd', // Testnet USDT\n decimals: 18,\n symbol: 'USDT',\n eip712Name: 'Tether USD',\n },\n },\n usdc: '0x64544969ed7EBf5f083679233325356EbE738930',\n explorer: 'https://testnet.bscscan.com/address/',\n explorerTx: 'https://testnet.bscscan.com/tx/',\n avgBlockTime: 3,\n // BNB-specific: requires approval for pay-for-success flow\n requiresApproval: true,\n },\n // ============ BNB Chain Mainnet ============\n bnb: {\n name: 'BNB Smart Chain',\n chainId: 56,\n rpc: 'https://bsc-dataseed.binance.org',\n tokens: {\n // Note: BNB uses 18 decimals for stablecoins\n USDC: {\n address: '0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d',\n decimals: 18,\n symbol: 'USDC',\n eip712Name: 'USD Coin',\n },\n USDT: {\n address: '0x55d398326f99059fF775485246999027B3197955',\n decimals: 18,\n symbol: 'USDT',\n eip712Name: 'Tether USD',\n },\n },\n usdc: '0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d',\n explorer: 'https://bscscan.com/address/',\n explorerTx: 'https://bscscan.com/tx/',\n avgBlockTime: 3,\n // BNB-specific: requires approval for pay-for-success flow\n requiresApproval: true,\n },\n};\n\n/**\n * Get token address for a chain\n */\nexport function getTokenAddress(chainName: EvmChainName, 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: EvmChainName, 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: EvmChainName): 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 EVM chains\n */\nexport function listChains(): EvmChainName[] {\n return Object.keys(CHAINS) as EvmChainName[];\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// ============ Alipay AI 收 Fiat Rail (2.0.0+) ============\n\n/**\n * Chain-id string for the Alipay AI 收 fiat rail.\n * Used in `provider.chains: [\"alipay\", ...]` to opt the provider into\n * accepting CNY payments alongside USDC.\n */\nexport const ALIPAY_CHAIN_ID = 'alipay' as const;\n\n/**\n * Rail metadata for the Alipay AI 收 fiat rail (2.0.0+).\n *\n * Intentionally kept **outside** the {@link CHAINS} Record because that\n * Record is `Record<EvmChainName, ChainConfig>` and an EVM `ChainConfig`\n * (rpc / tokens / chainId) is not meaningful for a fiat rail.\n *\n * The rail uses `type: \"fiat-rail\"`, distinct from `ChainFamily`'s\n * existing `\"evm\"` and `\"svm\"`. Server dispatch detects alipay via\n * {@link isAlipayChainId} rather than via the EVM/SVM type guards.\n */\nexport const ALIPAY_RAIL = {\n /** Chain-id string used in user manifests + routing. */\n id: ALIPAY_CHAIN_ID,\n /** Rail family — distinct from `ChainFamily` ('evm' | 'svm'). */\n type: 'fiat-rail' as const,\n /** Quote currency. */\n currency: 'CNY' as const,\n /** Decimal places for the `amount` field (元 with up to 2 decimals). */\n decimals: 2 as const,\n /** x402 `scheme` string — matches `ALIPAY_SCHEME` in src/facilitators/alipay.ts. */\n facilitator: 'alipay-aipay' as const,\n} as const;\n\n/**\n * Runtime type guard: is this chain-id string the Alipay fiat rail?\n *\n * Used by the server layer to route a `Payment-Proof` request to\n * {@link AlipayFacilitator} instead of an EVM/SVM verifier.\n */\nexport function isAlipayChainId(id: string): id is typeof ALIPAY_CHAIN_ID {\n return id === ALIPAY_CHAIN_ID;\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, EvmChainName, TokenSymbol };\n"],"mappings":"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","names":[]}
|