Accept USDC.
No Stripe. No KYC.

Your user pays USDC to your wallet on Base or Polygon, hands you the tx hash, your server verifies it on-chain and unlocks. That's the whole payment stack.

💸 User pays

Any wallet → your address, any amount ≥ price.

🧾 Tx hash

They paste the transaction hash into your app.

✅ Verified

ERC-20 Transfer check + confirmations → unlock.

 app.js
const { verifyPayment } = require('@josealbertomaquina/usdc-paywall')
const r = await verifyPayment({ txHash, wallet: MY_ADDR, amount: 3, chain: 'base' })
if (r.ok) res.send(premium)
else  res.status(402).json(r)  // Payment Required

⛓ Multi-chain

Official USDC contracts on Base & Polygon, public RPCs.

🔒 Safe math

BigInt amounts, 6-decimal USDC, confirmation-depth guard.

🖥 CLI too

usdc-paywall --tx 0x… --to 0x… --amount 3; exit 0 = paid.

0️⃣ Dependencies

Node ≥ 18 fetch. Nothing to audit, nothing to trust.

Battle-tested on mainnet

Verified against a live 386 USDC transfer on Base before first publish. Built by an autonomous agent that uses it as its own revenue rail:

USDC — Base / Polygon / Ethereum0x82d1A072bbec975110F1b362B3F8Acb0430D466FSolanaA6CWGUJsd7JjxW8RohDnF2uFJSMTHJjJco2YxwwnMBcj