Instant QR Payments for Street Vendors & Small Businesses β Built on Stellar
"Get paid in seconds. No bank required."
VendorPay is a 100% frontend dApp on the Stellar Testnet that gives any small business β street vendors, freelancers, market stalls, local shops β a complete digital point-of-sale system in under 60 seconds.
No bank account. No card machine. No backend server. Just a Stellar wallet and a QR code.
The flow is simple:
- Connect your Freighter wallet
- Build your product catalog with local currency prices
- Tap a product β a dynamic QR code is generated
- Customer scans the QR β pays with their Stellar wallet
- Payment appears on your screen in real time
- Digital receipt generated automatically
VendorPay is built for the 1.4 billion people globally who live without access to traditional banking infrastructure β but have a smartphone.
| Feature | Description |
|---|---|
| π² Smart QR Codes | SEP-0007 payment URI with amount + memo baked in β not just a static address |
| β‘ Live Payment Stream | Horizon EventSource streams payments in real time β screen flashes green instantly |
| πͺ Product Catalog | Build a full menu/catalog with local currency pricing (INR/USD/NGN/KES/EUR) |
| π± Live FX Conversion | XLM price fetched from Stellar DEX; prices shown in local currency automatically |
| π Analytics Dashboard | 30-day revenue chart, peak hours heatmap, unique customer count |
| π Business Score | On-chain credit score (0β100) from payment volume, consistency, and reach |
| π§Ύ Digital Receipts | Auto-generated printable receipt for every payment with Stellar Explorer link |
| π Payment Celebrations | Ripple animation + confetti burst the moment payment is confirmed |
VendorPay has zero backend. Every call goes directly from the React app running in the browser:
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β User's Browser β
β β
β ββββββββββββββββ ββββββββββββββββββββββββββββββββββββ β
β β Freighter β β React App (VendorPay) β β
β β Extension βββββΊβ β β
β β (Wallet) β β ββββββββββββββ βββββββββββββββ β β
β ββββββββββββββββ β β Horizon β β Soroban β β β
β β β Hook β β Contract β β β
β β βββββββ¬βββββββ ββββββββ¬βββββββ β β
β ββββββββββΌββββββββββββββββΌββββββββββ β
βββββββββββββββββββββββββββββββββββΌββββββββββββββββΌβββββββββββββ
β β
ββββββββββββββΌβββ ββββββββββΌβββββββββββ
β Stellar β β Soroban RPC β
β Horizon API β β (testnet.stellar) β
β (testnet) β β β
βββββββββββββββββ ββββββββββββββββββββββ
| Layer | Technology |
|---|---|
| Frontend | React 18 + Vite |
| Styling | Tailwind CSS + custom CSS animations |
| Animations | Framer Motion |
| Charts | Recharts |
| Wallet | @stellar/freighter-api |
| Blockchain | @stellar/stellar-sdk + Stellar Horizon Testnet API |
| Smart Contract | Soroban (Rust) on Stellar Testnet |
| QR Codes | qrcode.react |
| Testing | Vitest + @testing-library/react |
| Routing | React Router v6 |
| Deployment | Vercel |
- Node.js 18 or higher
- Freighter browser extension β set to Testnet in settings
- A funded Stellar Testnet wallet (see below)
- Install Freighter β create a wallet
- In Freighter settings β switch network to Testnet
- Go to Stellar Laboratory Friendbot
- Click "Generate Keypair" β copy your Public Key
- Click "Fund with Friendbot" β you now have 10,000 testnet XLM
- Import this address into Freighter
# Clone the repository
git clone https://github.com/YOUR_USERNAME/vendorpay
cd vendorpay
# Install dependencies
npm install
# Copy environment variables
cp .env.example .env
# Start development server
npm run devVITE_HORIZON_URL=https://horizon-testnet.stellar.org
VITE_SOROBAN_RPC=https://soroban-testnet.stellar.org
VITE_NETWORK_PASSPHRASE=Test SDF Network ; September 2015
VITE_CONTRACT_ID=your_deployed_contract_id_here# Run all tests
npm run test
# Run with visual UI
npm run test:ui
# Run once (CI mode)
npm run test:runβ src/tests/formatters.test.js (6 tests)
β truncates a Stellar address correctly
β formats XLM amounts correctly
β converts local currency to XLM
β formats USD from XLM amount
β generates a valid payment memo
β handles empty address gracefully
β src/tests/businessScore.test.js (4 tests)
β returns zero score for empty data
β calculates a positive score for active wallet
β has correct breakdown structure
β score does not exceed 100
β src/tests/errorHandler.test.js (6 tests)
β identifies wallet not found error
β identifies insufficient funds error
β identifies network error
β identifies user rejection
β handles unknown errors gracefully
β handles null/undefined errors
Test Files 3 passed (3)
Tests 16 passed (16)
Duration 1.23s
VendorPay uses a VendorRegistry Soroban smart contract deployed on Stellar Testnet.
register_vendor(address, name, category)β registers a vendor on-chainrecord_payment(vendor, amount, memo)β logs each payment to the ledgerget_vendor(address)β retrieves vendor info and statsis_registered(address)β checks if a vendor existsvendor_count()β returns total registered vendors
vendorpay/
βββ src/
β βββ components/ # UI components (QRModal, PaymentNotification, etc.)
β βββ pages/ # Route pages (Dashboard, Catalog, Analytics, etc.)
β βββ hooks/ # Custom React hooks (useWallet, useBalance, etc.)
β βββ utils/ # Utilities (horizonClient, stellarTx, errorHandler, etc.)
β βββ tests/ # Vitest test files
β βββ context/ # Global app state (AppContext)
βββ contracts/
β βββ vendor_registry/ # Soroban smart contract (Rust)
βββ public/
βββ .env.example
βββ README.md
βββ ARCHITECTURE.md
| Route | Page | Description |
|---|---|---|
/ |
Landing | Hero, features, how it works |
/dashboard |
Dashboard | QR generator, balance, live stream |
/catalog |
Catalog | Product/service catalog manager |
/analytics |
Analytics | Revenue chart, business score |
/transactions |
Transactions | Full payment history |
/send |
Send Payment | Direct XLM send with full feedback |
User clicks "Send" / "Generate QR"
β
βΌ
useTransaction hook
β
βΌ
Status: SIGNING βββΊ "Waiting for Freighter..."
β
βΌ (user approves in extension)
Status: SUBMITTING βββΊ Progress bar animation
β
βΌ (Horizon confirms)
Status: SUCCESS βββΊ tx hash + confetti
β
ββββΊ (on error) Status: FAILED βββΊ specific error + action
# Push to GitHub
git push origin main
# On vercel.com:
# New Project β Import from GitHub β Configure:
# Environment Variables:
VITE_HORIZON_URL = https://horizon-testnet.stellar.org
VITE_SOROBAN_RPC = https://soroban-testnet.stellar.org
VITE_NETWORK_PASSPHRASE = Test SDF Network ; September 2015
VITE_CONTRACT_ID = your_contract_id
# Deploy β Live URL ready in ~30 secondsNo server configuration needed. Vercel serves VendorPay as a static site.
- Fork the repo
- Create a feature branch:
git checkout -b feat/amazing-feature - Commit:
git commit -m 'feat: add amazing feature' - Push:
git push origin feat/amazing-feature - Open a Pull Request
VendorPay targets markets where:
- 40%+ of adults are unbanked (Sub-Saharan Africa, South Asia)
- Card terminals cost $200β$500 to set up
- Payment processor fees eat 2β5% of every transaction
- Remittance fees run 5β10% per transfer
With VendorPay + Stellar, a street vendor needs only:
- A smartphone (any Android/iOS)
- A printed QR code (or screen)
- A Stellar wallet (free, 1 minute to set up)
Transaction fees on Stellar: 0.00001 XLM (~$0.000001). That's it.
MIT License β see LICENSE for details.