尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證Pay to Mobile money in few steps
翻譯準備中
取自儲存庫 README
正在載入完整 README。
檢視完整 README ↗Pay Mobile Money from anywhere. To the user it's "Pay Mobile Money"; underneath it's a settlement network that takes crypto in (Lightning / on-chain BTC / USDT-TRON), runs FX to XAF, and pays out to MTN / Orange / Airtel across the CEMAC franc zone via PawaPay.
This repo is a full-stack TypeScript implementation built from the original
design-tool prototypes (archived in docs/archive/prototypes/).
app/ Vite + React + TypeScript frontend (@momome/app) — the canonical UI
server/ Express + TypeScript settlement engine (@momome/server)
shared/ Domain types + constants shared by both (the API contract)
mobile/ Expo (React Native) app — isolated project, not a workspace member
BACKEND_DESIGN.md The settlement architecture this backend implements
pnpm install
pnpm dev # runs the API (:4000) and the app (:5173) together
Then open http://localhost:5173. The Vite dev server proxies /api → :4000.
Run them separately if you prefer: pnpm dev:server and pnpm dev:app.
Build for production: pnpm build. Typecheck everything: pnpm typecheck.
| Route | Surface |
|---|---|
/ | Marketing landing |
/send | The pay app — send flow, Activity, Help (EN/FR) |
/admin | Partner/admin console — overview, payments, customers, rails, settings |
/ops | Live operations dashboard (polls every 2s) |
/capital-intelligence/* | Capital Intelligence — executive overview, capital health, transactions, liquidity + stress tests, revenue, routes, forecasts, scenarios, capital requirements, fundraising, investor matching, efficiency, concentration, risk, recommendations (human approval workflow) |
/investors /investments/* | Investor OS — CRM, qualification, KYC (four-eyes), opportunities → proposals → term sheets → investments → funding (four-eyes), documents, communications |
/capital/* | Capital products — OWN / POWER / SCALE / STRATEGIC, one ledger each; allocations (propose → approve → execute) |
/reports /ai-copilot/* | Reports; AI Capital Copilot (structured engine, source + calculation trace, AI audit) |
/investor/* | Investor portal — an investor's own room (role Investor) |
/terms /privacy /contact | Legal & contact |
The send flow is wired to the real settlement engine:
/api/recipients/resolve)./api/quotes prices the inbound crypto with a per-rail FX spread
(Lightning/USDT tight, on-chain wider for the confirmation-window exposure)./api/payments returns a real, scannable pay instruction
(BOLT11-shaped invoice / on-chain address / TRC20 address) rendered as an actual QR./api/payments/:id/confirm drives the payment state machine
(AWAITING_INBOUND → INBOUND_CONFIRMED → FX_LOCKED → PAYOUT_REQUESTED → DELIVERED),
writing balanced double-entry ledger entries and paying out exactly once
(idempotent on the payment ref). The UI polls /api/payments/:id to render progress.The Capital Intelligence module lives in app/src/capital/ (lazy chunk behind the
admin session gate) and server/src/core/capital/ (engine over the real
payments/ledger/float, Investor OS records persisted through the snapshot seam, copilot, reports).
Set VITE_CAPITAL_DATA_SOURCE=mock on the app to develop the UI against the isolated fixture
adapter — the shell paints a permanent MOCK banner; the default (api) is the live backend.
See server/src/core/ for the ledger, FX engine, and state machine,
and BACKEND_DESIGN.md for the architecture rationale.
The orchestration is real: the FX quote/spread/expiry logic, the double-entry ledger (every transaction balances per currency or it throws), the payment state machine, and the exactly-once idempotent payout contract.
The external integrations are adapters behind a clean seam, selected by
RAILS_MODE (default sandbox — zero credentials):
server/src/adapters/sandbox.ts — default; generates well-formed, unique pay instructions, settled via the /confirm tapserver/src/adapters/ibex.ts — live IBEX: Lightning + on-chain BTC (token auth, add-invoice, address generation, HMAC-verified webhooks)server/src/adapters/tron.ts — live TRON: USDT/TRC20 only — a separate rail (IBEX does not settle USDT)server/src/adapters/pawapay.ts — PawaPay payout (enforces real idempotency)server/src/core/nameResolver.ts — provider name lookupGoing live: copy server/.env.example, set RAILS_MODE=live + the IBEX/TRON
credentials, and inbound confirmation switches from the user tap to signed provider
webhooks (POST /webhooks/ibex, POST /webhooks/tron) that drive the same state
machine. The FX lock, ledger, and exactly-once payout are untouched. Data is in-memory
(seeded on boot); the store is a repository seam ready for SQLite/Postgres.
On /send, the prefilled number 6 70 12 34 56 resolves to a verified recipient.
Tap through to the Pay step, hit "I've sent the payment", and watch the state machine
deliver it. Numbers ending in 8/9 come back unverified (manual-name path); ending in
7 resolve as a returning recipient.
docs/archive/prototypes/ holds the original design prototypes,
archived as of the initial build. They are historical reference only — app/ is the canonical
UI, and app/src/styles/momome.css is the design system of record.