payx3: Multi-Chain Crypto Payment SDK You've Been Waiting For
The Problem Every crypto payment integration follows the same painful pattern: Read blockchain docs for each chain Implement RPC calls Handle WebSocket reconnections Parse transaction data Calculate correct decimals (looking at you, BSC USDT with 18 decimals while everyone else uses 6) Build block explorer URLs Write confirmation logic And that's just one chain. What about the other 8 your client wants? const { watchAll } = require("payx3"); await watchAll({ btcAddress: "bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq", evmAddress: "0xb2C65C9C98C2216099A37AF7FE12A93b8A37AFBd", solAddress: "CbWki5xkrnde7TYj11jDWNEJ3h7bRTmk5Q22uANNfEt", infuraKey: "YOUR_KEY", onPayment: (payment) => { console.log(`${payment.amount} ${payment.symbol} received on ${payment.chain}`); // Fires for EVERYTHING: BTC, ETH, BNB, SOL, USDT, USDC... }, }); One call. All chains. All tokens. Real-time. Generate a BIP-39 mnemonic and derive addresses for all supported chains simultaneously: const { generateMnemonic, deriveAll } = require("payx3"); const mnemonic = generateMnemonic(128); // 12 words const wallet = await deriveAll(mnemonic); console.log(wallet.bitcoin[2].address); // bc1... Native SegWit console.log(wallet.evm.address); // 0x... For ETH, BNB, MATIC, AVAX, ARB, OP console.log(wallet.solana.address); // Solana address Chain Native Token Supported Tokens Bitcoin BTC ā Ethereum ETH USDT, USDC, DAI, WBTC, WETH, LINK, UNI, AAVE, SHIB BNB Chain BNB USDT, USDC, DAI, LINK Polygon MATIC USDT, USDC, DAI, WBTC, WETH, LINK, UNI, AAVE Avalanche AVAX USDT, USDC, DAI, WBTC, WETH, LINK, AAVE Arbitrum ETH USDT, USDC, DAI, WBTC, WETH, LINK, UNI Optimism ETH USDT, USDC, DAI, WBTC, WETH, LINK Solana SOL Any SPL token const { watchToken } = require("payx3"); watchToken({ address: "0x...", infuraKey: "YOUR_KEY", chain: "ETH", contractAddress: "0x6982508145454Ce325dDbE47a25d4ec3d2311933", // PEPE decimals: 18, symbol: "PEPE", name: "Pepe", onPayment: (p) => console.log(`${p.amount} PEPE received!`), }); Every callback receives a consistent object regardless of chain: { chain: "Ethereum", chainSymbol: "ETH", symbol: "USDT", name: "Tether USD", amount: "100.50", txHash: "0xa1b2c3...", status: "unconfirmed", // or "confirmed" explorerUrl: "https://etherscan.io/tx/0xa1b2c3...", contract: "0xdAC17F...", // null for native coins timestamp: 1715000000000, blockNumber: 19500000 // onConfirmed only } No code? No problem. Install globally: npm install -g payx3 Generate a wallet: payx3 generate Watch for payments using config.json: { "infuraKey": "YOUR_INFURA_KEY", "addresses": { "BTC": "bc1q...", "EVM": "0x...", "SOL": "CbWk..." } } payx3 watch Or watch specific addresses inline: payx3 watch --btc bc1q... --evm 0x... --sol CbWk... --key YOUR_INFURA_KEY Run as a full API server: node examples/server.js # Server running on http://localhost:3000 Method Endpoint Description POST /wallet/create Generate wallet + addresses POST /watch/btc Watch BTC address POST /watch/eth Watch ETH POST /watch/bnb Watch BNB POST /watch/polygon Watch MATIC POST /watch/avalanche Watch AVAX POST /watch/arbitrum Watch ETH on Arbitrum POST /watch/optimism Watch ETH on Optimism POST /watch/sol Watch SOL + SPL tokens POST /watch/usdt Watch USDT (any chain) POST /watch/usdc Watch USDC (any chain) POST /watch/token Watch any ERC-20 POST /watch/all Watch everything at once GET /payments List all received payments DELETE /watch/:id Stop a watcher const { generateMnemonic, deriveAll, watchAll } = require("payx3"); async function createPaymentSession(orderId, amountUSD) { // Generate a fresh wallet for this order const mnemonic = generateMnemonic(128); const wallet = await deriveAll(mnemonic); // Store mnemonic temporarily (in DB with orderId) await db.saveOrderWallet(orderId, mnemonic); // Start watching watchAll({ btcAddress: wallet.bitcoin[2].address, evmAddress: wallet.evm.address, solAddress: wallet.solana.address, infuraKey: process.env.INFURA_KEY, onPayment: async (payment) => { // Mark order as paid await db.updateOrderStatus(orderId, "paid", payment); // Send confirmation email await email.send(orderEmail, `Payment received: ${payment.amount} ${payment.symbol}`); // Trigger fulfillment webhook await axios.post(fulfillmentUrl, { orderId, payment }); }, }); return { addresses: { BTC: wallet.bitcoin[2].address, EVM: wallet.evm.address, SOL: wallet.solana.address, }, }; } const { watchUSDC } = require("payx3"); // Watch for $50 USDC monthly subscription payments watchUSDC({ address: companyWallet, infuraKey: process.env.INFURA_KEY, chain: "ETH", onPayment: async (payment) => { if (parseFloat(payment.amount) >= 50) { // Find user by transaction sender const user = await db.findUserByAddress(payment.from); if (user) { // Extend subscription by 30 days await db.extendSubscription(user.id, 30); // Send receipt await email.send(user.email, `Subscription renewed ā ${payment.amount} USDC`); } } }, }); You never share private keys. The library only reads blockchain data. Your funds stay where they belong. USDT has 6 decimals on Ethereum but 18 on BNB Chain. payx3 handles this automatically. You always get human-readable amounts. WebSockets disconnect? payx3 reconnects automatically. Your payment detection never stops. From npm install to watching payments on 8 chains. No blockchain experience required. npm install payx3 Get a free Infura key: https://app.infura.io/register github.com/susheelhbti/payx3 Full API documentation Examples for every chain and token REST API server example MIT license ā free for commercial use If payx3 saves you development time, consider: ā Starring the repo on GitHub š Reporting issues you find š§ Submitting PRs for new chains or tokens š¬ Sharing with other developers I'm Susheel, a blockchain developer available for freelance and full-time work. Need a custom integration? Multi-chain payment system? Web3 infrastructure? š§ [email protected]
