Technical Due Diligence · June 2026
XOX eWallet
Technical Analysis
A full-stack assessment of the existing eWallet codebase — covering current architecture, technical findings, and a proposed roadmap for v2.0. Prepared by Fast Technology Sdn Bhd.
Part 01
Current Architecture
As-built system map based on full codebase review. ~10,000 files across Django backend, React Native mobile app, and PHP back-office portal.
What works well
JWT authentication (5-min access / 15-day refresh with blacklist). Atomic transactions +
select_for_update on DuitNow flows. PIN lockout (3 attempts → suspend). Step-up auth for large amounts. Audit trail logging. Live DuitNow / NPG / Zoloz eKYC integrations. ~1,360 commits of history. The duitnow_balance_handler.py module is well-structured with proper available_balance vs current_balance separation and daily limit aggregation.
Django Backend
3.2 / Python 3.6 · 7 apps · ~1,360 commits · Last active Nov 2025 (7 months dark). JWT + sessions. Real money logic lives here.
React Native App
Expo · JavaScript → partial TypeScript migration. 466 files. Consumer + merchant wallets. JWT stored in Redux (not secure storage).
PHPRunner Portal
~300 PHP files. Low-code generated. Ops, finance, compliance. Hardcoded credentials. Not auditable. Should be internal-network only.
Part 02
Technical Findings
15 findings from full codebase review. Severity rated: Critical (fix now) → High (fix this sprint) → Medium (fix this quarter).
5 Critical
3 High
7 Medium
1 Well Done
One thing done right:
duitnow_balance_handler.pyThis is the newest, best-written module in the codebase. It uses proper
available_balance vs current_balance separation (hold pattern), atomic transactions with select_for_update, daily limit aggregation inclusive of pending states, and min/max guards. Whoever authored this module understood financial system design. This person is the key technical asset Fast Tech needs to identify and engage.Part 03
eWallet 2.0 — What to Build
Six core changes that must happen, plus the recommended tech stack and delivery phases. Total timeline: 11–17 months with a dedicated team.
1
Double-Entry Ledger
Current mutable balance can drift permanently. Every transaction in 2.0 must produce 2 immutable entries (debit + credit). Balance is derived by summing entries — never written directly. Store as integer sen (1234 = RM12.34). No floats. This is the foundational change that everything else depends on.
2
Secrets Out of Code
Signing keys are compromised right now. Immediate: rotate all keys and remove from git history. Long-term: all secrets via Vault or AWS Secrets Manager. HSM for signing keys — they never leave the HSM. CI secret scanner (gitleaks) blocks any future credential commit.
3
Upgrade Runtime
Python 3.6 has had zero security patches since Dec 2021. Upgrade path: Python 3.11 → Django 4.2 LTS → audit all dependencies with
pip-audit. This is a prerequisite for anything else — running on EOL software makes every other security effort moot.
4
Test Coverage on Money Logic
Zero coverage means no change can be made safely. Unit tests required: balance arithmetic, transaction state machine, freeze/deduct/return cycle, negative balance guards, daily limit enforcement. These run on every PR via CI — no merge without green tests.
5
Single Payment Module
NPG gateway logic exists in 4 diverged copies. Extract into one
payment_gateway/ service. All apps call it. One bug fix propagates everywhere instead of being applied 4 times (or missed in 3 copies). Same pattern for DuitNow callbacks.
6
Replace PHPRunner Portal
Hardcoded credentials, low-code generated, not auditable. Replace with React + TypeScript admin portal. RBAC, maker-checker on all money actions, full audit view. Uses the same APIs as the mobile app — no separate backend surface.
Recommended Tech Stack
Delivery Phases
P0
Security Triage
1–2 weeks · Starts now
Rotate all committed keys. Remove from git history. Deploy secret scanner. Patch Python CVEs. Restrict PHPRunner to internal network only. Deliverable: no known active exploits.
P1
Ledger Core
2–3 months
Double-entry ledger, idempotency keys, transactional outbox, test harness (≥80% coverage on money logic). This is the foundation — every feature after this is safe to build on.
P2
Rails + Identity
2–3 months
Single payment service (DuitNow / NPG), KYC / liveness re-integration (Zoloz), risk engine and daily limits, BNM compliance reporting.
P3
New Clients
3–4 months
New React Native + TypeScript mobile app and React back-office portal at full feature parity with current system. Tokens in secure storage. Zero PHPRunner dependencies.
P4
Harden
1–2 months
Load testing, penetration test, automated reconciliation between new ledger and legacy data, formal security review. Pre-migration sign-off.
P5
Migration
2–3 months
Parallel run with shadow ledger validation. Phased user cohort cutover (5% → 25% → 100%). Legacy decommission. BNM licence stays with XOX throughout — no re-certification required.
BNM Licence — no disruption
The e-money licence stays with XOX throughout. As long as the licensed entity remains unchanged, there is no re-certification requirement. The rebuild is a backend infrastructure change, not a licence change. Fast Technology partners with XOX as the technical arm — XOX remains the regulated entity.
Next Steps
Fast Technology's Engagement Model
Three phases of engagement — from immediate security triage to long-term technical partnership.
Immediate — P0 Triage
Rotate compromised keys. Deploy secret scanner. Patch CVEs. 2 weeks, low cost. High trust signal — Fast Tech shows up with a fix, not just a proposal.
Medium Term — Tech Partner
Fast Tech becomes XOX's de facto engineering arm on retainer. Covers maintenance of existing system while P1 ledger core is built in parallel. No service gap.
Long Term — 2.0 Build
Full 2.0 rebuild on outcome-based commercial terms. Retainer baseline + milestone payments tied to phase delivery. Shared upside on cost savings and new revenue enabled by the platform.