npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, πŸ‘‹, I’m Ryan HefnerΒ  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you πŸ™

Β© 2026 – Pkg Stats / Ryan Hefner

payx3

v3.0.1

Published

πŸ’³ Multi-chain crypto wallet β€” generate addresses & watch for incoming payments. BTC, ETH, BNB, MATIC, AVAX, ARB, OP, SOL.

Readme

πŸ’³ payx3 v2.0.0

Multi-Chain Crypto Payment SDK Generate wallet addresses + watch for incoming payments with a single function call.

npm version license node


πŸ’Ό Open to Work

πŸ“§ [email protected] β€” available for freelance & full-time work!


πŸ“¦ Install

npm install payx3

πŸ”‘ Get a Free Infura Key

πŸ‘‰ https://app.infura.io/register β€” free, no credit card needed.


πŸ“– Table of Contents


πŸ”‘ Generate Addresses

const { generateMnemonic, deriveAll } = require("payx3");

async function main() {
  // Generate a 12-word mnemonic (use 256 for 24 words)
  const mnemonic = generateMnemonic(128);
  console.log("Mnemonic:", mnemonic);
  // ⚠ Save this safely β€” it controls ALL your wallets

  // Derive all chain addresses from the mnemonic
  const wallet = await deriveAll(mnemonic);

  // Bitcoin β€” 3 formats
  console.log("BTC Legacy:      ", wallet.bitcoin[0].address); // 1...
  console.log("BTC SegWit:      ", wallet.bitcoin[1].address); // 3...
  console.log("BTC NativeSegWit:", wallet.bitcoin[2].address); // bc1...

  // Solana
  console.log("SOL:", wallet.solana.address);

  // EVM β€” same address works for ETH, BNB, MATIC, AVAX, ARB, OP
  console.log("ETH/EVM:", wallet.evm.address);

  // Use your own existing mnemonic
  const wallet2 = await deriveAll("witch collapse practice feed shame open despair creek road again ice least");
  console.log("ETH from my mnemonic:", wallet2.evm.address);

  // Multiple accounts from same mnemonic
  const acc0 = await deriveAll(mnemonic, { accountIndex: 0 });
  const acc1 = await deriveAll(mnemonic, { accountIndex: 1 });
  console.log("Account 0:", acc0.evm.address);
  console.log("Account 1:", acc1.evm.address);
}

main();

β‚Ώ Bitcoin (BTC)

const { watchBTC } = require("payx3");

watchBTC({
  address:  "bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq",

  onPayment: (payment) => {
    console.log("πŸ’Έ BTC received!");
    console.log("Amount:", payment.amount, "BTC");
    console.log("Status:", payment.status);       // "unconfirmed"
    console.log("TxHash:", payment.txHash);
    console.log("View:  ", payment.explorerUrl);  // https://blockstream.info/tx/...
  },

  onConfirmed: (payment) => {
    console.log("βœ… BTC confirmed in block!", payment.blockNumber);
  },

  pollSecs: 20,  // optional: how often to poll (default 20s)
});

Ξ Ethereum (ETH)

const { watchETH } = require("payx3");

watchETH({
  address:   "0xe3d7373f2dD3DA124f912AC3B5883F0caf7689D1",
  infuraKey: "YOUR_INFURA_API_KEY",

  onPayment: (payment) => {
    console.log("πŸ’Έ ETH received!");
    console.log("Amount:", payment.amount, "ETH");
    console.log("Status:", payment.status);      // "unconfirmed"
    console.log("TxHash:", payment.txHash);
    console.log("View:  ", payment.explorerUrl); // https://etherscan.io/tx/...
  },

  onConfirmed: (payment) => {
    console.log("βœ… ETH confirmed!", payment.blockNumber);
  },
});

πŸ”Ά BNB Chain (BNB)

const { watchBNB } = require("payx3");

watchBNB({
  address:   "0xe3d7373f2dD3DA124f912AC3B5883F0caf7689D1",
  infuraKey: "YOUR_INFURA_API_KEY",

  onPayment: (payment) => {
    console.log("πŸ’Έ BNB received!");
    console.log("Amount:", payment.amount, "BNB");
    console.log("View:  ", payment.explorerUrl); // https://bscscan.com/tx/...
  },

  onConfirmed: (payment) => {
    console.log("βœ… BNB confirmed!", payment.blockNumber);
  },
});

β“‚ Polygon (MATIC)

const { watchPolygon } = require("payx3");

watchPolygon({
  address:   "0xe3d7373f2dD3DA124f912AC3B5883F0caf7689D1",
  infuraKey: "YOUR_INFURA_API_KEY",

  onPayment: (payment) => {
    console.log("πŸ’Έ MATIC received!");
    console.log("Amount:", payment.amount, "MATIC");
    console.log("View:  ", payment.explorerUrl); // https://polygonscan.com/tx/...
  },

  onConfirmed: (payment) => {
    console.log("βœ… MATIC confirmed!", payment.blockNumber);
  },
});

πŸ”Ί Avalanche (AVAX)

const { watchAvalanche } = require("payx3");

watchAvalanche({
  address:   "0xe3d7373f2dD3DA124f912AC3B5883F0caf7689D1",
  infuraKey: "YOUR_INFURA_API_KEY",

  onPayment: (payment) => {
    console.log("πŸ’Έ AVAX received!");
    console.log("Amount:", payment.amount, "AVAX");
    console.log("View:  ", payment.explorerUrl); // https://snowtrace.io/tx/...
  },

  onConfirmed: (payment) => {
    console.log("βœ… AVAX confirmed!", payment.blockNumber);
  },
});

πŸ”΅ Arbitrum (ARB)

const { watchArbitrum } = require("payx3");

watchArbitrum({
  address:   "0xe3d7373f2dD3DA124f912AC3B5883F0caf7689D1",
  infuraKey: "YOUR_INFURA_API_KEY",

  onPayment: (payment) => {
    console.log("πŸ’Έ ETH on Arbitrum received!");
    console.log("Amount:", payment.amount, "ETH");
    console.log("View:  ", payment.explorerUrl); // https://arbiscan.io/tx/...
  },

  onConfirmed: (payment) => {
    console.log("βœ… Arbitrum tx confirmed!", payment.blockNumber);
  },
});

πŸ”΄ Optimism (OP)

const { watchOptimism } = require("payx3");

watchOptimism({
  address:   "0xe3d7373f2dD3DA124f912AC3B5883F0caf7689D1",
  infuraKey: "YOUR_INFURA_API_KEY",

  onPayment: (payment) => {
    console.log("πŸ’Έ ETH on Optimism received!");
    console.log("Amount:", payment.amount, "ETH");
    console.log("View:  ", payment.explorerUrl); // https://optimistic.etherscan.io/tx/...
  },

  onConfirmed: (payment) => {
    console.log("βœ… Optimism tx confirmed!", payment.blockNumber);
  },
});

β—Ž Solana (SOL)

const { watchSOL } = require("payx3");

watchSOL({
  address:   "AzjZrrKMDHTGpzM2e68T5S8nEM5TahcTMczJ6T9Vcev",
  infuraKey: "YOUR_INFURA_API_KEY",

  onPayment: (payment) => {
    console.log("πŸ’Έ SOL received!");
    console.log("Amount:", payment.amount, "SOL");
    console.log("View:  ", payment.explorerUrl); // https://solscan.io/tx/...

    // SPL token transfers also fire here
    if (payment.contract) {
      console.log("SPL Token mint:", payment.contract);
    }
  },

  onConfirmed: (payment) => {
    console.log("βœ… SOL confirmed!");
  },
});

πŸ’΅ USDT β€” Tether

Watch USDT on any chain by passing chain:

const { watchUSDT } = require("payx3");

// ── On Ethereum ──────────────────────────────────────────────────────────────
watchUSDT({
  address:   "0xe3d7373f2dD3DA124f912AC3B5883F0caf7689D1",
  infuraKey: "YOUR_INFURA_API_KEY",
  chain:     "ETH",   // ETH | BNB | MATIC | AVAX | ARB | OP

  onPayment: (payment) => {
    console.log("πŸ’Έ USDT received on Ethereum!");
    console.log("Amount:  ", payment.amount, "USDT");
    console.log("Contract:", payment.contract); // 0xdAC17F...
    console.log("TxHash:  ", payment.txHash);
    console.log("View:    ", payment.explorerUrl);
  },

  onConfirmed: (payment) => {
    console.log("βœ… USDT confirmed! Block:", payment.blockNumber);
  },
});

// ── On BNB Chain ─────────────────────────────────────────────────────────────
watchUSDT({
  address:   "0xe3d7373f2dD3DA124f912AC3B5883F0caf7689D1",
  infuraKey: "YOUR_INFURA_API_KEY",
  chain:     "BNB",   // ← just change this

  onPayment: (payment) => {
    console.log("πŸ’Έ USDT received on BNB Chain!");
    console.log("Amount:", payment.amount, "USDT");
    console.log("View:  ", payment.explorerUrl); // https://bscscan.com/tx/...
  },
});

// ── On Polygon ───────────────────────────────────────────────────────────────
watchUSDT({
  address:   "0xe3d7373f2dD3DA124f912AC3B5883F0caf7689D1",
  infuraKey: "YOUR_INFURA_API_KEY",
  chain:     "MATIC",

  onPayment: (payment) => {
    console.log("πŸ’Έ USDT on Polygon:", payment.amount, "USDT");
  },
});

// ── On Arbitrum ──────────────────────────────────────────────────────────────
watchUSDT({ address: "0x...", infuraKey: "...", chain: "ARB", onPayment: (p) => console.log(p) });

// ── On Optimism ──────────────────────────────────────────────────────────────
watchUSDT({ address: "0x...", infuraKey: "...", chain: "OP", onPayment: (p) => console.log(p) });

// ── On Avalanche ─────────────────────────────────────────────────────────────
watchUSDT({ address: "0x...", infuraKey: "...", chain: "AVAX", onPayment: (p) => console.log(p) });

πŸ’΅ USDC β€” USD Coin

const { watchUSDC } = require("payx3");

// On Ethereum
watchUSDC({
  address:   "0xe3d7373f2dD3DA124f912AC3B5883F0caf7689D1",
  infuraKey: "YOUR_INFURA_API_KEY",
  chain:     "ETH",   // ETH | BNB | MATIC | AVAX | ARB | OP

  onPayment: (payment) => {
    console.log("πŸ’Έ USDC received!");
    console.log("Amount:  ", payment.amount, "USDC");
    console.log("Chain:   ", payment.chain);       // "Ethereum"
    console.log("Contract:", payment.contract);    // 0xA0b869...
    console.log("View:    ", payment.explorerUrl);
  },
});

// On Polygon β€” just change chain
watchUSDC({ address: "0x...", infuraKey: "...", chain: "MATIC", onPayment: (p) => console.log(p.amount, "USDC on Polygon") });

// On Arbitrum
watchUSDC({ address: "0x...", infuraKey: "...", chain: "ARB",  onPayment: (p) => console.log(p.amount, "USDC on Arbitrum") });

πŸ’› DAI

const { watchDAI } = require("payx3");

watchDAI({
  address:   "0xe3d7373f2dD3DA124f912AC3B5883F0caf7689D1",
  infuraKey: "YOUR_INFURA_API_KEY",
  chain:     "ETH",   // ETH | BNB | MATIC | AVAX | ARB | OP

  onPayment: (payment) => {
    console.log("πŸ’Έ DAI received!");
    console.log("Amount:", payment.amount, "DAI");
    console.log("View:  ", payment.explorerUrl);
  },

  onConfirmed: (payment) => {
    console.log("βœ… DAI confirmed! Block:", payment.blockNumber);
  },
});

// On Optimism
watchDAI({ address: "0x...", infuraKey: "...", chain: "OP", onPayment: (p) => console.log(p) });

🟠 WBTC β€” Wrapped Bitcoin

const { watchWBTC } = require("payx3");

watchWBTC({
  address:   "0xe3d7373f2dD3DA124f912AC3B5883F0caf7689D1",
  infuraKey: "YOUR_INFURA_API_KEY",
  chain:     "ETH",   // ETH | MATIC | AVAX | ARB | OP

  onPayment: (payment) => {
    console.log("πŸ’Έ WBTC received!");
    console.log("Amount:", payment.amount, "WBTC"); // 8 decimals like real BTC
    console.log("View:  ", payment.explorerUrl);
  },
});

// On Arbitrum
watchWBTC({ address: "0x...", infuraKey: "...", chain: "ARB", onPayment: (p) => console.log(p) });

πŸ”΅ WETH β€” Wrapped Ether

const { watchWETH } = require("payx3");

watchWETH({
  address:   "0xe3d7373f2dD3DA124f912AC3B5883F0caf7689D1",
  infuraKey: "YOUR_INFURA_API_KEY",
  chain:     "ETH",   // ETH | MATIC | AVAX | ARB | OP

  onPayment: (payment) => {
    console.log("πŸ’Έ WETH received!");
    console.log("Amount:", payment.amount, "WETH");
    console.log("View:  ", payment.explorerUrl);
  },
});

πŸ”— LINK β€” Chainlink

const { watchLINK } = require("payx3");

watchLINK({
  address:   "0xe3d7373f2dD3DA124f912AC3B5883F0caf7689D1",
  infuraKey: "YOUR_INFURA_API_KEY",
  chain:     "ETH",   // ETH | BNB | MATIC | AVAX | ARB | OP

  onPayment: (payment) => {
    console.log("πŸ’Έ LINK received!");
    console.log("Amount:", payment.amount, "LINK");
    console.log("View:  ", payment.explorerUrl);
  },
});

// On Polygon
watchLINK({ address: "0x...", infuraKey: "...", chain: "MATIC", onPayment: (p) => console.log(p) });

πŸ¦„ UNI β€” Uniswap

const { watchUNI } = require("payx3");

watchUNI({
  address:   "0xe3d7373f2dD3DA124f912AC3B5883F0caf7689D1",
  infuraKey: "YOUR_INFURA_API_KEY",
  chain:     "ETH",   // ETH | MATIC | ARB

  onPayment: (payment) => {
    console.log("πŸ’Έ UNI received!");
    console.log("Amount:", payment.amount, "UNI");
    console.log("View:  ", payment.explorerUrl);
  },
});

πŸ‘» AAVE

const { watchAAVE } = require("payx3");

watchAAVE({
  address:   "0xe3d7373f2dD3DA124f912AC3B5883F0caf7689D1",
  infuraKey: "YOUR_INFURA_API_KEY",
  chain:     "ETH",   // ETH | MATIC | AVAX

  onPayment: (payment) => {
    console.log("πŸ’Έ AAVE received!");
    console.log("Amount:", payment.amount, "AAVE");
    console.log("View:  ", payment.explorerUrl);
  },
});

πŸ• SHIB β€” Shiba Inu

const { watchSHIB } = require("payx3");

watchSHIB({
  address:   "0xe3d7373f2dD3DA124f912AC3B5883F0caf7689D1",
  infuraKey: "YOUR_INFURA_API_KEY",

  onPayment: (payment) => {
    console.log("πŸ’Έ SHIB received!");
    console.log("Amount:", Number(payment.amount).toLocaleString(), "SHIB");
    console.log("View:  ", payment.explorerUrl);
  },
});

πŸ” Custom β€” Any ERC-20 Token

Watch any token by providing its contract address:

const { watchToken } = require("payx3");

// Example: PEPE token on Ethereum
watchToken({
  address:         "0xe3d7373f2dD3DA124f912AC3B5883F0caf7689D1",
  infuraKey:       "YOUR_INFURA_API_KEY",
  chain:           "ETH",                                          // ETH | BNB | MATIC | AVAX | ARB | OP
  contractAddress: "0x6982508145454Ce325dDbE47a25d4ec3d2311933", // PEPE contract
  decimals:        18,
  symbol:          "PEPE",
  name:            "Pepe",

  onPayment: (payment) => {
    console.log("πŸ’Έ PEPE received!");
    console.log("Amount:  ", payment.amount, "PEPE");
    console.log("Contract:", payment.contract);
    console.log("View:    ", payment.explorerUrl);
  },
});

// Example: any unknown token
watchToken({
  address:         "0x...",
  infuraKey:       "YOUR_INFURA_API_KEY",
  chain:           "BNB",
  contractAddress: "0xContractAddressHere",
  decimals:        18,
  symbol:          "MYTOKEN",
  name:            "My Token",
  onPayment:       (p) => console.log("Received:", p.amount, p.symbol),
});

🌐 Watch Everything at Once

One call watches ALL coins + ALL tokens across ALL chains simultaneously:

const { generateMnemonic, deriveAll, watchAll } = require("payx3");

async function main() {
  // Generate wallet
  const mnemonic  = generateMnemonic(128);
  const wallet    = await deriveAll(mnemonic);

  const btcAddress = wallet.bitcoin[2].address; // Native SegWit (bc1...)
  const evmAddress = wallet.evm.address;         // Same for ETH/BNB/MATIC/AVAX/ARB/OP
  const solAddress = wallet.solana.address;

  console.log("BTC:", btcAddress);
  console.log("EVM:", evmAddress);
  console.log("SOL:", solAddress);
  console.log("\nπŸš€ Watching everything...\n");

  // Watches:
  //   βœ… BTC (native)
  //   βœ… ETH, BNB, MATIC, AVAX, ARB, OP (native)
  //   βœ… USDT on ETH, BNB, MATIC, AVAX, ARB, OP
  //   βœ… USDC on ETH, BNB, MATIC, AVAX, ARB, OP
  //   βœ… DAI, WBTC, WETH, LINK, UNI, AAVE, SHIB
  //   βœ… SOL + SPL tokens
  await watchAll({
    btcAddress,
    evmAddress,
    solAddress,
    infuraKey: "YOUR_INFURA_API_KEY",

    onPayment: (payment) => {
      // Fires for EVERY incoming payment across all chains
      console.log(`\nπŸ’Έ Payment received!`);
      console.log(`   Chain  : ${payment.chain}`);
      console.log(`   Token  : ${payment.symbol}`);
      console.log(`   Amount : ${payment.amount} ${payment.symbol}`);
      console.log(`   Status : ${payment.status}`);
      console.log(`   TxHash : ${payment.txHash}`);
      console.log(`   View   : ${payment.explorerUrl}`);
      if (payment.contract) {
        console.log(`   Contract: ${payment.contract}`);
      }
    },

    onConfirmed: (payment) => {
      // Fires when transaction is confirmed on-chain
      console.log(`\nβœ… ${payment.symbol} CONFIRMED on ${payment.chain}!`);
      console.log(`   Amount : ${payment.amount} ${payment.symbol}`);
      console.log(`   Block  : ${payment.blockNumber}`);
    },
  });
}

main();

πŸ“¦ Payment Object Shape

Every onPayment and onConfirmed callback receives this object:

{
  chain:       "Ethereum",             // Chain name
  chainSymbol: "ETH",                  // Chain symbol
  symbol:      "USDT",                 // Token/coin symbol
  name:        "Tether USD",           // Token/coin full name
  amount:      "100.000000",           // Human-readable amount (string)
  txHash:      "0xa1b2c3...",          // Transaction hash
  status:      "unconfirmed",          // "unconfirmed" | "confirmed"
  explorerUrl: "https://etherscan.io/tx/0xa1b2c3...", // Block explorer link
  contract:    "0xdAC17F...",          // Contract address (null for native coins)
  timestamp:   1715000000000,          // Date.now() when detected
  blockNumber: 19500000,               // Block number (onConfirmed only)
}

βš™οΈ Token Decimals Reference

| Token | ETH | BNB | MATIC | AVAX | ARB | OP | |---|---|---|---|---|---|---| | USDT | 6 | 18 ← different! | 6 | 6 | 6 | 6 | | USDC | 6 | 18 ← different! | 6 | 6 | 6 | 6 | | DAI | 18 | 18 | 18 | 18 | 18 | 18 | | WBTC | 8 | β€” | 8 | 8 | 8 | 8 | | WETH | 18 | β€” | 18 | 18 | 18 | 18 | | LINK | 18 | 18 | 18 | 18 | 18 | 18 |

payx3 handles all decimals automatically β€” you always get the correct human-readable amount.


πŸš€ Express.js REST API

Run payx3 as a REST API server using the included example:

node examples/server.js
# Server starts on http://localhost:3000

All Endpoints

| Method | Endpoint | Description | |---|---|---| | GET | / | List all endpoints | | POST | /wallet/create | Generate wallet + all addresses | | POST | /watch/btc | Watch BTC address | | POST | /watch/eth | Watch ETH payments | | POST | /watch/bnb | Watch BNB payments | | POST | /watch/polygon | Watch MATIC payments | | POST | /watch/avalanche | Watch AVAX payments | | 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/dai | Watch DAI (any chain) | | POST | /watch/wbtc | Watch WBTC | | POST | /watch/link | Watch LINK | | POST | /watch/shib | Watch SHIB | | POST | /watch/token | Watch any custom ERC-20 | | POST | /watch/all | Watch everything at once | | GET | /payments | Get all received payments | | GET | /payments/:txHash | Get a specific payment | | GET | /watchers | List active watchers | | DELETE | /watch/:id | Stop a watcher |


Generate a Wallet

curl -X POST http://localhost:3000/wallet/create \
  -H "Content-Type: application/json" \
  -d '{ "words": 12 }'
{
  "success": true,
  "mnemonic": "witch collapse practice feed shame open despair creek road again ice least",
  "addresses": {
    "BTC": {
      "legacy":       "1A1zP1eP5QGefi2DMPTfTL5SLmv7Divfna",
      "segwit":       "3J98t1WpEZ73CNmQviecrnyiWrnqRhWNLy",
      "nativeSegwit": "bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq"
    },
    "EVM": "0xe3d7373f2dD3DA124f912AC3B5883F0caf7689D1",
    "SOL": "AzjZrrKMDHTGpzM2e68T5S8nEM5TahcTMczJ6T9Vcev"
  },
  "warning": "Save your mnemonic securely. Never share it with anyone."
}

Watch BTC (no API key needed)

curl -X POST http://localhost:3000/watch/btc \
  -H "Content-Type: application/json" \
  -d '{ "address": "bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq" }'
{ "success": true, "watcherId": "btc-1", "message": "Watching BTC address: bc1q..." }

Watch ETH

curl -X POST http://localhost:3000/watch/eth \
  -H "Content-Type: application/json" \
  -d '{
    "address":   "0xe3d7373f2dD3DA124f912AC3B5883F0caf7689D1",
    "infuraKey": "YOUR_INFURA_API_KEY"
  }'
{ "success": true, "watcherId": "eth-2" }

Watch USDT on Any Chain

# On Ethereum
curl -X POST http://localhost:3000/watch/usdt \
  -H "Content-Type: application/json" \
  -d '{ "address": "0xe3d7...", "infuraKey": "YOUR_KEY", "chain": "ETH" }'

# On BNB Chain
curl -X POST http://localhost:3000/watch/usdt \
  -H "Content-Type: application/json" \
  -d '{ "address": "0xe3d7...", "infuraKey": "YOUR_KEY", "chain": "BNB" }'

# On Polygon
curl -X POST http://localhost:3000/watch/usdt \
  -H "Content-Type: application/json" \
  -d '{ "address": "0xe3d7...", "infuraKey": "YOUR_KEY", "chain": "MATIC" }'

Watch a Custom Token

curl -X POST http://localhost:3000/watch/token \
  -H "Content-Type: application/json" \
  -d '{
    "address":         "0xe3d7373f2dD3DA124f912AC3B5883F0caf7689D1",
    "infuraKey":       "YOUR_INFURA_API_KEY",
    "chain":           "ETH",
    "contractAddress": "0x6982508145454Ce325dDbE47a25d4ec3d2311933",
    "decimals":        18,
    "symbol":          "PEPE",
    "name":            "Pepe"
  }'

Watch Everything at Once

curl -X POST http://localhost:3000/watch/all \
  -H "Content-Type: application/json" \
  -d '{
    "btcAddress": "bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq",
    "evmAddress": "0xe3d7373f2dD3DA124f912AC3B5883F0caf7689D1",
    "solAddress": "AzjZrrKMDHTGpzM2e68T5S8nEM5TahcTMczJ6T9Vcev",
    "infuraKey":  "YOUR_INFURA_API_KEY"
  }'
{
  "success":   true,
  "watcherId": "all-4",
  "message":   "Watching BTC + ETH + BNB + MATIC + AVAX + ARB + OP + SOL + USDT + USDC + DAI + WBTC + WETH + LINK + UNI + AAVE + SHIB"
}

Get All Received Payments

curl http://localhost:3000/payments
curl "http://localhost:3000/payments?chain=Ethereum&symbol=USDT&status=confirmed&limit=10"
{
  "total": 2,
  "payments": [
    {
      "chain":       "Ethereum",
      "chainSymbol": "ETH",
      "symbol":      "USDT",
      "name":        "Tether USD",
      "amount":      "250.000000",
      "txHash":      "0xa1b2c3d4e5f6...",
      "status":      "confirmed",
      "explorerUrl": "https://etherscan.io/tx/0xa1b2c3...",
      "contract":    "0xdAC17F958D2ee523a2206206994597C13D831ec7",
      "timestamp":   1715000000000
    },
    {
      "chain":       "Bitcoin",
      "chainSymbol": "BTC",
      "symbol":      "BTC",
      "amount":      "0.00500000",
      "txHash":      "a1b2c3d4e5f6...",
      "status":      "unconfirmed",
      "explorerUrl": "https://blockstream.info/tx/a1b2c3...",
      "contract":    null,
      "timestamp":   1715000001000
    }
  ]
}

List Active Watchers

curl http://localhost:3000/watchers
{
  "total": 3,
  "watchers": [
    { "id": "btc-1",      "type": "BTC",      "address": "bc1q...",  "startedAt": "2026-05-10T10:00:00.000Z" },
    { "id": "eth-2",      "type": "ETH",      "address": "0xe3d7...", "startedAt": "2026-05-10T10:00:01.000Z" },
    { "id": "usdt-ETH-3", "type": "USDT-ETH", "address": "0xe3d7...", "startedAt": "2026-05-10T10:00:02.000Z" }
  ]
}

Stop a Watcher

curl -X DELETE http://localhost:3000/watch/btc-1
{ "success": true, "message": "Watcher btc-1 removed" }

⚠️ Security

  • NEVER share your mnemonic or private key
  • This tool only reads blockchain data β€” no private keys needed for watching
  • Run payx3 generate on an offline machine, then copy addresses to config.json

πŸ“„ License

MIT Β© Susheel


πŸ’Ό Open to Work

Looking for freelance or full-time in Web3, blockchain, Node.js, full-stack. πŸ“§ [email protected] β€” let's build together!