A backend service that bridges African mobile money providers (MTN MoMo, Airtel Money, Orange Money) with the Stellar blockchain network β enabling low-cost cross-border payments and remittances across Africa and beyond.
Sending money across African borders is expensive and slow. Traditional remittance services charge 7β10% in fees and take hours to days. Meanwhile, 500+ million people across Africa already use mobile money for everyday transactions β but mobile money stops at the border.
ProxyPay connects mobile money wallets to the Stellar blockchain, allowing users to:
- Deposit mobile money (XAF) β receive Stellar tokens (XLM, USDC)
- Transfer tokens across Stellar's network in ~5 seconds, for fractions of a cent
- Withdraw Stellar tokens β receive mobile money in the destination country
The sender and recipient interact with their familiar mobile money apps. Stellar handles the cross-border settlement invisibly.
π± MTN MoMo (Cameroon) π± Airtel Money (Kenya)
β β²
βΌ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β ProxyPay Bridge β
β β
β Deposit (XAF β USDC) βββΊ Stellar Network βββΊ Withdraw β
β (settles in ~5s) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
- Remittances β Send money home across borders at ~1β2% vs 7β10% with traditional services
- Cross-border B2B payments β Pay suppliers in other African countries without expensive wire transfers
- Stable savings β Convert volatile local currency to USDC via mobile money
- Merchant payments β Accept crypto, settle in local mobile money
- Developer integrations β Build payment apps on top of our REST + GraphQL APIs
- Mobile Money Integration β MTN MoMo, Airtel Money, Orange Money with circuit breaker, failover, and batch payouts
- Stellar Blockchain β XLM, USDC, and custom asset support via Stellar SDK + Horizon API
- Dual API β REST (40+ endpoints) and GraphQL (queries, mutations, and real-time subscriptions)
- Real-time Processing β BullMQ job queues with Redis, admin dashboard at
/admin/queues - WebSocket β Live transaction updates with JWT auth, per-user rooms, and Redis pub/sub for horizontal scaling
- Provider Mock Server β Full mock for MTN + Airtel APIs for local development without real credentials
- Multi-tier KYC β Tiered identity verification with document upload (S3) and third-party verification (Entrust)
- AML Monitoring β Auto-flagging of suspicious patterns (large transactions, rapid structuring, daily totals)
- Travel Rule Compliance β FATF travel rule data collection for qualifying transactions
- GDPR / Privacy β Data export, deletion, and consent management endpoints
- Sanctions Screening β Automated screening against sanctions lists
- 2FA (TOTP) β Time-based one-time passwords via Speakeasy, required for withdrawals
- RBAC β Role-based access control via Casbin
- Rate Limiting & Audit Logging β Multi-layer rate limiting with full audit trail
- PII Encryption β AES-256-GCM encryption for sensitive data at rest
- Dynamic Fee Engine β Configurable fee strategies with VIP tiers (25KB+ fee strategy engine)
- Transaction Limits β Provider-specific and KYC-tiered daily limits
- Vault System β Secure fund storage with distributed locking
- Double-Entry Ledger β Internal accounting system with full transaction journal
- Dispute Management β Complete dispute workflow with state machine
- Monthly Statements β Automated PDF statement generation
- Reconciliation β Provider reconciliation workflows
- SEP-06 β Deposit and Withdrawal API
- SEP-10 β Web Authentication (challenge-response)
- SEP-12 β KYC API (customer CRUD with document upload)
- SEP-24 β Interactive Deposit and Withdrawal (hosted flow)
- SEP-31 β Cross-Border Payments (send-side anchor)
- Escrow Contract β Soroban smart contract for escrowed payments (Rust)
- HTLC Contract β Hash Time-Locked Contract for atomic cross-chain swaps (Rust)
- Email β SendGrid integration
- SMS β Twilio integration
- Push Notifications β Firebase Cloud Messaging
- WhatsApp β Twilio WhatsApp channel
- PagerDuty β Operational alerting
- CLI (
momo-cli) β Admin tool for auth, status checks, and transaction retries - Kotlin SDK β Auto-generated from OpenAPI spec
- Postman Collections β Pre-built API collections for testing
- VS Code Extension β Transaction monitor with live WebSocket logs
- Swagger UI β Auto-generated from Zod schemas at
/docs(dev mode)
- Node.js 20+ (LTS)
- PostgreSQL 16+
- Redis 7+
- Docker (optional, recommended for local dev)
git clone https://github.com/sublime247/proxypay.git
cd proxypay
npm installcp .env.example .envEdit .env with your configuration (see .env.example for all ~470 configuration options):
# Database
DATABASE_URL=postgresql://user:password@localhost:5432/proxypay_stellar
# Redis
REDIS_URL=redis://localhost:6379
# Stellar
STELLAR_NETWORK=testnet # or 'mainnet'
STELLAR_HORIZON_URL=https://horizon-testnet.stellar.org
STELLAR_ISSUER_SECRET=S...
# Mobile Money Providers
MTN_API_KEY=your_mtn_api_key
AIRTEL_API_KEY=your_airtel_key
ORANGE_API_KEY=your_orange_key
# Security
JWT_SECRET=your_jwt_secret_min_32_chars
SESSION_SECRET=your_session_secret
# Optional: Notifications
SENDGRID_API_KEY=your_sendgrid_key
TWILIO_ACCOUNT_SID=your_twilio_sidnpm run migrate:up
npm run seed # Optional: development dataDevelopment (with provider mocks):
npm run docker:dev # Starts app + Postgres + Redis + provider mock serverDevelopment (standalone):
npm run devProduction:
npm run build
npm startServer starts at http://localhost:3000
npm test # Unit tests (Jest)
npm run test:coverage # With coverage report
npm run test:watch # Watch mode
npm run test:e2e # End-to-end (Playwright)
npm run test:load # Load testing (k6 / autocannon)
npm run test:mutation # Mutation testing (Stryker)Test infrastructure includes:
- Unit & integration tests across controllers, services, middleware, routes
- Pact consumer-driven contract tests for provider APIs
- Playwright end-to-end tests
- k6 load/stress tests with benchmarking against Go vs Node ingest services
- Stryker mutation testing
- Fuzz testing
Coverage reports upload to Codecov on every push to main.
Start the dev server and visit:
- Swagger UI:
http://localhost:3000/docs - OpenAPI JSON:
http://localhost:3000/docs/openapi.json
The API spec is auto-generated from Zod validation schemas at runtime β no manual YAML to maintain.
# Health
GET /health # Liveness probe
GET /ready # Readiness (DB + Redis)
GET /health/lb # Load balancer health
# Transactions
POST /api/transactions/deposit # Mobile money β Stellar
POST /api/transactions/withdraw # Stellar β Mobile money
GET /api/transactions # List (paginated, filterable)
GET /api/transactions/:id # Transaction details
GET /api/transactions/:id/invoice # Download completed transaction invoice
POST /api/transactions/:id/cancel # Cancel pending transaction
POST /api/transactions/:id/dispute # Open dispute
POST /api/transactions/bulk # Bulk operations
# Auth
POST /api/auth/register # Register
POST /api/auth/login # Login (returns JWT)
POST /api/auth/2fa/enable # Enable TOTP 2FA
POST /oauth/token # OAuth2 client credentials
# KYC
POST /api/kyc/submit # Submit documents
GET /api/kyc/status # Check verification status
# Vaults
POST /api/vaults # Create vault
GET /api/vaults # List vaults
POST /api/vaults/:id/transfer # Deposit/withdraw funds
# Disputes
GET /api/disputes # List disputes
PUT /api/disputes/:id # Update dispute status
# Compliance
GET /api/v1/compliance/travel-rule # Travel rule data
GET /api/gdpr/export # GDPR data export
DELETE /api/gdpr/delete # Right to be forgotten
# Stellar SEP Endpoints
POST /sep10/auth # SEP-10 authentication
GET /sep12/customer # SEP-12 KYC
POST /sep24/transactions/deposit/interactive # SEP-24 deposit
POST /sep31/transactions # SEP-31 cross-border
# Admin
GET /api/admin/* # Admin dashboard endpoints
GET /api/stats # Transaction statistics
GET /api/reconciliation # Provider reconciliation
GET /metrics # Prometheus metricsPOST /graphqlPlayground: http://localhost:3000/graphql (dev only)
| Type | Limit | Purpose |
|---|---|---|
| Minimum | 100 XAF | Prevent spam |
| Maximum | 1,000,000 XAF | Fraud prevention |
| Level | Daily Limit | Requirements |
|---|---|---|
| Unverified | 10,000 XAF | Email only |
| Basic | 100,000 XAF | ID + selfie |
| Full | 1,000,000 XAF | Proof of address + video |
| Layer | Technology |
|---|---|
| API Server | Node.js, TypeScript, Express, Apollo Server (GraphQL) |
| Database | PostgreSQL 16 (primary + read replicas), Redis 7 (cache, sessions, pub/sub) |
| Blockchain | Stellar SDK, Horizon API, Soroban smart contracts (Rust) |
| Job Processing | BullMQ workers, node-cron scheduled jobs |
| Ingest (High-throughput) | Go service (fasthttp) + Node.js service (Fastify), Redis Streams, NATS JetStream |
| Security | Helmet, bcrypt, JWT, Speakeasy (TOTP), Casbin (RBAC), AES-256-GCM (PII) |
| Monitoring | Prometheus, Datadog (dd-trace), Sentry, PagerDuty |
| Logging | Structured JSON β Loki/Grafana (primary), ELK stack (secondary) |
| Edge | Cloudflare Workers (.well-known caching) |
| Infrastructure | Docker, Kubernetes (+ Helm, KEDA), Terraform (AWS) |
| CI/CD | GitHub Actions (lint, test, build, deploy, rollback) |
proxypay/
βββ src/
β βββ auth/ # Authentication & authorization
β βββ compliance/ # Travel rule, sanctions
β βββ config/ # Centralized configuration
β βββ constants/ # Error codes, enums
β βββ controllers/ # Request handlers
β βββ crypto/ # Encryption utilities
β βββ graphql/ # Schema, resolvers, subscriptions, APQ cache
β βββ jobs/ # Scheduled & background jobs
β βββ locales/ # i18n translations
β βββ middleware/ # Auth, RBAC, rate limiting, audit, error handling
β βββ models/ # Database models (15 models)
β βββ openapi/ # Auto-generated API docs (Zod β OpenAPI)
β βββ queue/ # BullMQ job queue management
β βββ reports/ # Statement & report generation
β βββ routes/ # API routes (40+ route files, versioned)
β βββ services/ # Business logic (58 service files)
β β βββ mobilemoney/ # MTN, Airtel, Orange providers + orchestration
β β βββ stellar/ # Stellar operations, asset management, HSM
β βββ stellar/ # SEP protocol implementations (6, 10, 12, 24, 31)
β βββ types/ # TypeScript type definitions
β βββ utils/ # Helpers & utilities
β βββ websocket/ # WebSocket server (JWT auth, Redis scaling)
βββ contracts/ # Soroban smart contracts (Escrow, HTLC)
βββ ingest-go/ # High-performance Go callback ingestion
βββ ingest-node/ # Node.js baseline for benchmarking
βββ workers/ # Cloudflare Workers (edge caching)
βββ cli/ # CLI admin tool (momo-cli)
βββ sdk/ # Auto-generated Kotlin SDK
βββ benchmarks/ # k6 load testing suite
βββ bridge-starter-node/ # Webhook bridge starter template
βββ docs/ # Extensive documentation (59 docs)
βββ extensions/ # VS Code transaction monitor extension
βββ postman/ # API testing collections
βββ migrations/ # Database migrations (47 migrations)
βββ k8s/ # Kubernetes manifests + Helm chart
βββ terraform/ # AWS infrastructure (VPC, ECS, RDS, ElastiCache)
βββ elk/ # ELK stack config (Filebeat, Logstash, Kibana)
βββ logging/ # Loki + Grafana + Promtail config
βββ scripts/ # Operational scripts (mock server, DB scrub, etc.)
βββ tests/ # Test suites (unit, integration, e2e, pact, fuzz)
npm run migrate:create -- migration_name # Create
npm run migrate:up # Run all pending
npm run migrate:down # Rollback last
npm run migrate:status # Check status# Development (with mocks, hot reload, Grafana)
docker compose up
# Production build
docker build -t proxypay:latest .
docker run -p 3000:3000 --env-file .env proxypay:latestkubectl apply -f k8s/cd terraform
cp terraform.tfvars.example terraform.tfvars
terraform init
terraform plan -var-file=environments/production.tfvars
terraform applyWe welcome contributions! See CONTRIBUTING.md.
Check good first issue label.
MIT License β see LICENSE file.
- Stellar Development Foundation
- Mobile money providers (MTN, Airtel, Orange)
- Open source community
- Issues: GitHub Issues
- Discussions: GitHub Discussions
Built with β€οΈ for financial inclusion in Africa