Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
197 commits
Select commit Hold shift + click to select a range
21f9b10
fix: resolve issue #1338
olalekanali Jun 23, 2026
b9d5c5b
#Closes 1296: 2FA Verification
martoniel Jun 23, 2026
33bbe6f
feat(docs-portal): embed interactive GraphQL Playground (#1026)
Emelie-Dev Jun 23, 2026
4afd62b
feat(benchmarks): build Soroban contract gas consumption benchmark CL…
olalekanali Jun 23, 2026
e49584f
Closes #1300: format GDPR data export
martoniel Jun 23, 2026
f4a6de5
Closes #1345: format autocannon benchemark
martoniel Jun 23, 2026
fb86ed4
feat(accounting): support Xero multi-tenant connections and token syn…
olalekanali Jun 23, 2026
e93a8fc
feat: add rate limiting to ingest endpoint
Opulencechuks Jun 23, 2026
9b9ef8f
feat: format amount and balance output in PDF invoices using Currency…
Anadudev Jun 23, 2026
574083a
test: add coverage for GDPRService serializeUser, serializeTransactio…
martoniel Jun 23, 2026
91eff20
test: add coverage for TwoFactorWithdrawalService and validate2FAForW…
martoniel Jun 23, 2026
7a80900
feat: Add structured Pino logging to bridge-starter-node
amankoli09 Jun 23, 2026
2a7f416
feat: Add retry queue for failed accounting sync operations
amankoli09 Jun 23, 2026
f844344
feat(kyc): implement HSM file signing for KYC PII uploads
pixels26 Jun 23, 2026
ddefd31
feat(i18n): add French translation support for Docusaurus portal
samuelfrancis163-eng Jun 23, 2026
00171a7
feat(sep31): implement dynamic fee bump strategy using Horizon base fee
samuelfrancis163-eng Jun 23, 2026
d447cea
fix(mtn): standardize error logs in callback handler with transactionId
mc-stephen Jun 23, 2026
a6b7705
feat(sdk): add offline API response caching to Kotlin SDK
Anadudev Jun 23, 2026
434668d
feat: implement Orange Money Madagascar API integration with OAuth 2.…
EmeditWeb Jun 23, 2026
977311d
Merge pull request #1 from samuelfrancis163-eng/i18n-support
samuelfrancis163-eng Jun 23, 2026
be95850
fix dev port configuration
LawalRahman Jun 23, 2026
031b376
Commit local changes before push
Jun 23, 2026
13bf2d4
fix dev port configuration
LawalRahman Jun 23, 2026
e413db9
feat(stellar): ping Horizon on startup and halt if unreachable (issue…
aigbagbobila Jun 23, 2026
5a471e5
test: add tests for Orange Madagascar provider, middleware, and routes
EmeditWeb Jun 23, 2026
a48422a
fix: add strict stellar address validation
manueldezman Jun 23, 2026
18d1d52
fix(bridge-starter-node): correct webhook signature verification logic
Anadudev Jun 23, 2026
3f407ea
feat(stellar): implement high-throughput transaction partitioning que…
Francis6-git Jun 23, 2026
e79734c
Add withParentTrace helper to propagate trace IDs to child jobs
Opulencechuks Jun 23, 2026
114c016
ci: add markdownlint workflow for automated docs linting
EmeditWeb Jun 23, 2026
ec6bec4
feat(cli): add configuration profile management for dev staging and p…
Jun 23, 2026
c1d3cd4
feat: implement headless browser automation simulator for legacy SMS …
EmeditWeb Jun 23, 2026
b1adf0e
feat(stellar): add Horizon event subscription for escrow lock/release
DevALVIN-24 Jun 23, 2026
2c0e1ee
feat: track request durations with timing metrics and error handling
Opulencechuks Jun 23, 2026
d05be36
test: add unit tests for SMS portal simulator, provider, and fallback…
EmeditWeb Jun 23, 2026
ad57792
fix: validate Senegal phone numbers
aqin236 Jun 23, 2026
2798cd1
test: cover Senegal phone validation
aqin236 Jun 23, 2026
c93b0d4
chore: preserve mobile money service line endings
aqin236 Jun 23, 2026
90b047a
chore: restore service file LF endings
aqin236 Jun 23, 2026
678786a
Implement Soroban HTLC contract interaction in htlcService
Jun 23, 2026
661fda3
feat(cli): add interactive dashboard for system status
amankoli09 Jun 23, 2026
562ec96
feat(benchmarks): add k6 peak-day traffic spike scenarios (#1339)
k-deejah Jun 23, 2026
75de97a
feat(settlement): daily provider settlement automation job (#1310)
k-deejah Jun 23, 2026
9b693b7
Merge branch 'main' into feature/1310-daily-provider-settlement-autom…
k-deejah Jun 23, 2026
a02e122
fix: resolve issues #1258, #1261, and #1273
whiteghost0001 Jun 23, 2026
5140da2
feat: add readiness endpoint with dependency verification to ingest-node
dominiccreates Jun 23, 2026
a2edc0e
fix: resolve issues #1309, #1313, #1316
k2ghostyou Jun 23, 2026
f496101
fix: resolve flaky circuit breaker tests and use toJSON state API
K1NGD4VID Jun 23, 2026
fffe9e9
feat: add geo-aware routing to edge-router Worker
K1NGD4VID Jun 23, 2026
06e3658
feat(docs-portal): add interactive Swagger UI sandbox page
nice-bills Jun 23, 2026
52eab78
feat: implement automatic failover routing with provider mapping chai…
K1NGD4VID Jun 23, 2026
d71388b
feat(docs-portal): integrate Algolia DocSearch full-text search
fadesany Jun 23, 2026
17abd34
Add configurable Orange Money request timeout
web-flow Jun 23, 2026
cdc9e8c
feat(grafana): configure Azure AD OAuth SSO for Grafana
fadesany Jun 23, 2026
dabd226
Build reserve rebalancing and receipt sync
Johnpii1 Jun 23, 2026
4a299e9
feat(analytics): add versioned snapshot export
Johnpii1 Jun 23, 2026
825f7dd
implement liquidity vault locks
beebozy Jun 23, 2026
d084562
Merge pull request #5 from Johnpii1/codex/add-json-analytics-snapshot…
Johnpii1 Jun 23, 2026
94f6069
Merge pull request #4 from Johnpii1/codex/build-liquidity-pool-rebala…
Johnpii1 Jun 23, 2026
a8acbe4
feat(cli): add telemetry config toggle to momo-cli setup wizard
olufunsoolutayo Jun 23, 2026
0038a9a
feat(providers): map Vodacom and Tigo transaction codes to global err…
samjay8 Jun 23, 2026
8553c1b
Add VIP fee discount tier logic
AugistineCreates Jun 23, 2026
e159f35
implement double entry ledger
beebozy Jun 23, 2026
a6a8446
third party kyc
beebozy Jun 24, 2026
a7a130a
feat(webhook): add dynamic webhook payload schema version validator a…
Jess52487 Jun 24, 2026
13142e7
build(workers): compress worker bundle assets
aigbagbobila Jun 24, 2026
41bf07e
Merge pull request #1352 from dhareymu/edgerouting-failover
sublime247 Jun 24, 2026
e26ce4a
Merge pull request #1354 from Emelie-Dev/feat/graphql-playground-docs
sublime247 Jun 24, 2026
98c5017
chore: add temporary comment for PR creation
samuelfrancis163-eng Jun 24, 2026
6ffdfc5
feat: add SSE-C encryption to KYC S3 upload
samuelfrancis163-eng Jun 24, 2026
0854b12
feat(cli): wrap transaction hashes in clickable StellarExpert explore…
Opulencechuks Jun 24, 2026
25c59fc
Merge pull request #1396 from fadesany/Configure-Grafana
sublime247 Jun 24, 2026
516ffbd
Merge pull request #1390 from K1NGD4VID/Circuit-Breaker
sublime247 Jun 24, 2026
7efa506
Merge pull request #1391 from K1NGD4VID/Cloudflare
sublime247 Jun 24, 2026
f932085
Merge pull request #1393 from K1NGD4VID/Automated-Provider
sublime247 Jun 24, 2026
84a7d8c
Merge branch 'main' into fix-dev-port-confirguration
LawalRahman Jun 24, 2026
9a0d479
feat(pagerduty): tune balance-shortfall escalation thresholds (#1018)
fadesany Jun 24, 2026
0ac262e
AML scoring pipeline
beebozy Jun 24, 2026
a96bcc9
fix(circuitbreaker): pin opossum to 9.0.0 and augment CircuitBreaker …
fadesany Jun 24, 2026
6d53c39
feat: configure NATS consumer groups for workload scaling
N-thnI Jun 24, 2026
abc4764
fix(circuitbreaker): inject toJSON via type intersection
fadesany Jun 24, 2026
878847a
fix: resolve circuit breaker compilation error
N-thnI Jun 24, 2026
fd4d8b8
Add reference to issue #1292 for PR tracking
samuelfrancis163-eng Jun 24, 2026
3d94a11
test: add unit test coverage for nats consumer group and circuit breaker
N-thnI Jun 24, 2026
73b7709
fix(circuitbreaker): declare missing opossum runtime properties
fadesany Jun 24, 2026
d3a2b08
chore: merge upstream/main into Create-PagerDuty
fadesany Jun 24, 2026
c46b385
test: achieve full patch coverage for syncWorker
N-thnI Jun 24, 2026
8956182
feat: add Wave Senegal mobile money provider (#1256)
maztah1 Jun 24, 2026
c531847
Merge branch 'main' into feature/wave-senegal-provider
maztah1 Jun 24, 2026
56068f0
Log Provider Status Changes on Dashboard
Danto1606 Jun 24, 2026
0cd3701
Merge branch 'main' into rust-soroban
sublime247 Jun 24, 2026
2e9ae1b
Merge pull request #1356 from dhareymu/rust-soroban
sublime247 Jun 24, 2026
f4c965d
Merge pull request #1358 from dhareymu/feat/xero-multi-tenant-sync-1302
sublime247 Jun 24, 2026
76aaccf
Merge pull request #1359 from Anadudev/issue-1314-format-balance-pdf-…
sublime247 Jun 24, 2026
4e75de1
Merge branch 'main' into implement-hardware-security
sublime247 Jun 24, 2026
deee885
Merge branch 'main' into i18n-support
sublime247 Jun 24, 2026
d31343a
Merge pull request #1363 from samuelfrancis163-eng/i18n-support
sublime247 Jun 24, 2026
9a23c79
Merge pull request #1353 from martoniel/simple-totp-2fa
sublime247 Jun 24, 2026
f634e2e
Tune performance metric of parsing in the pipeline
muhahahmad68 Jun 24, 2026
5a67e75
Merge pull request #1355 from martoniel/format-GDPR-data-export
sublime247 Jun 24, 2026
0f40fc9
Merge pull request #1381 from aqin236/codex/senegal-phone-validation-…
sublime247 Jun 24, 2026
c638fd6
Merge pull request #1389 from k2ghostyou/fix/statements-disputes-acco…
sublime247 Jun 24, 2026
2c1d2cd
Merge branch 'main' into AML-scoring-pipeline
sublime247 Jun 24, 2026
9211369
Merge pull request #1410 from beebozy/AML-scoring-pipeline
sublime247 Jun 24, 2026
7bc7061
Merge pull request #1384 from k-deejah/feature/1339-k6-peak-day-traff…
sublime247 Jun 24, 2026
faaaf43
Merge pull request #1387 from dominiccreates/standardize-mock-assertions
sublime247 Jun 24, 2026
977c6b5
Merge pull request #1366 from Anadudev/feat/1328-add-api-response-cac…
sublime247 Jun 24, 2026
6d01a82
feat(compliance): add controller with IVMS101, TRISA TLS connections …
Jess52487 Jun 24, 2026
f50eeb4
fix: password complexity validation and configurable tax rates
dev-fani Jun 24, 2026
e7f4de6
fix(compliance): fix class method parsing error for ESLint
Jess52487 Jun 24, 2026
0136c67
Merge pull request #1409 from fadesany/Create-PagerDuty
sublime247 Jun 24, 2026
24ec6a9
Merge branch 'main' into Orange-Money-Madagascar-API
sublime247 Jun 24, 2026
3c9f6e8
Merge pull request #1365 from EmeditWeb/Orange-Money-Madagascar-API
sublime247 Jun 24, 2026
578efe5
Merge branch 'main' into headless-browser
sublime247 Jun 24, 2026
3340dec
feat(mobile-money): add Moov Money provider client with SOAP request …
dorismaduegbunam Jun 24, 2026
13f7b96
Merge pull request #1377 from EmeditWeb/headless-browser
sublime247 Jun 24, 2026
f9ca98c
feat(docs-portal): add image compression pipeline using sharp (#1029)
Rajkoli145 Jun 24, 2026
79282d4
Merge branch 'main' into feature/webhook-compliance-ivms101
Jess52487 Jun 24, 2026
1c32a21
feat: add IP blacklist middleware and worker-level IP check
Whiznificent Jun 24, 2026
0f2db4c
Merge branch 'main' into feature/ip-blacklist-middleware
Whiznificent Jun 24, 2026
78050c1
Implement sanctions matching engine and revert Go optimization
muhahahmad68 Jun 24, 2026
c61aa1f
Add provider maintenance outage scheduling
sochima2 Jun 24, 2026
1100c7d
Merge pull request #1 from sochima2/codex/automate-api-specs-generati…
sochima2 Jun 24, 2026
eda14cf
Fix module resolution and standardize error output
Jun 24, 2026
645a4da
Resolve merge conflicts with upstream/main
Jun 24, 2026
66135f7
feat(aml): implement periodic sanctions list sync cron (#1293)
softnationz Jun 24, 2026
2801df0
Merge branch 'main' into feature/1293-sanctions-sync-cron
softnationz Jun 24, 2026
d0c1b53
Add Datadog APM tracing for GraphQL resolvers execution
teeschima Jun 24, 2026
eaebe42
feat: cache network fee variables in StellarService
Jun 24, 2026
b0b8cf2
feat: dynamic tax configuration via taxService
Jun 24, 2026
002a9e4
feat(webhooks): add Airtel webhook route with asymmetric public-key s…
dorismaduegbunam Jun 24, 2026
839bee0
feat(sdk): add openapitools config and publishing scripts for TypeScr…
dorismaduegbunam Jun 24, 2026
3abe8e6
Merge pull request #1399 from Johnpii1/issue-1308
sublime247 Jun 24, 2026
3e18434
Merge branch 'main' into feature/nats-consumer-groups
sublime247 Jun 24, 2026
3d1894e
Merge pull request #1411 from N-thnI/feature/nats-consumer-groups
sublime247 Jun 24, 2026
7154d91
Merge pull request #1406 from samuelfrancis163-eng/i18n-support-v2
sublime247 Jun 24, 2026
ec1be6d
Merge branch 'main' into fix/issues-1258-1261-1273
sublime247 Jun 24, 2026
6dee099
Merge pull request #1386 from whiteghost0001/fix/issues-1258-1261-1273
sublime247 Jun 24, 2026
1a1db3a
Merge pull request #1376 from Anadudev/feat/1329-fix-webhook-signatur…
sublime247 Jun 24, 2026
59aff92
Merge branch 'main' into format-autocannon-benchmark
sublime247 Jun 24, 2026
970887e
Merge pull request #1357 from martoniel/format-autocannon-benchmark
sublime247 Jun 24, 2026
6c4da32
Merge pull request #1360 from amankoli09/feature/add-structured-pino-…
sublime247 Jun 24, 2026
2569561
Merge branch 'main' into feature/add-retry-queue-accounting-operations
sublime247 Jun 24, 2026
78ba796
Merge pull request #1361 from amankoli09/feature/add-retry-queue-acco…
sublime247 Jun 24, 2026
4fe731b
Merge branch 'main' into implement-hardware-security
sublime247 Jun 24, 2026
4396aba
Merge pull request #1362 from pixels26/implement-hardware-security
sublime247 Jun 24, 2026
b32bd1e
Merge pull request #1367 from Opulencechuks/merchant-tier-implementation
sublime247 Jun 24, 2026
efc8c15
Merge pull request #1364 from mc-stephen/fix/standardize-mtn-callback…
sublime247 Jun 24, 2026
c3d50b2
Merge branch 'main' into issue-1262-orange-timeout
sublime247 Jun 24, 2026
9ad9425
Merge pull request #1395 from emickwrld/issue-1262-orange-timeout
sublime247 Jun 24, 2026
39d9947
Merge pull request #1369 from LawalRahman/fix-dev-port-confirguration
sublime247 Jun 24, 2026
849092c
Merge pull request #1370 from aigbagbobila/issue-1282-add-horizon-ping
sublime247 Jun 24, 2026
b3e68c2
Merge branch 'main' into main
sublime247 Jun 24, 2026
8761e7a
Merge pull request #1371 from fredericklamar342-prog/main
sublime247 Jun 24, 2026
d8ad223
Merge branch 'main' into feature/stellar-transaction-partitioning-que…
sublime247 Jun 24, 2026
87cfb47
Merge pull request #1373 from Francis6-git/feature/stellar-transactio…
sublime247 Jun 24, 2026
ec9df77
Merge pull request #1372 from manueldezman/fix-stellar-address-validator
sublime247 Jun 24, 2026
de9b4d0
Merge pull request #1374 from Opulencechuks/trace-context-propagation
sublime247 Jun 24, 2026
7db44f7
Merge pull request #1379 from DevALVIN-24/main
sublime247 Jun 24, 2026
e78578f
Merge pull request #1380 from Opulencechuks/track-request-durations
sublime247 Jun 24, 2026
6dad685
Merge pull request #1382 from DatboiCaleb/feature/1272-htlc-soroban
sublime247 Jun 24, 2026
bd5e94d
Merge pull request #1383 from amankoli09/feature/cli-dashboard
sublime247 Jun 24, 2026
c952406
Merge pull request #1385 from k-deejah/feature/1310-daily-provider-se…
sublime247 Jun 24, 2026
8986b33
Merge branch 'main' into feature/docs-portal-swagger-sandbox
sublime247 Jun 24, 2026
c005395
Merge pull request #1392 from nice-bills/feature/docs-portal-swagger-…
sublime247 Jun 24, 2026
f4277d6
Merge branch 'main' into main
sublime247 Jun 24, 2026
c6d4fe9
Merge pull request #1398 from Johnpii1/main
sublime247 Jun 24, 2026
4e97877
Merge branch 'main' into Add-Telemetry
sublime247 Jun 24, 2026
d0d9939
Merge pull request #1400 from olufunsoolutayo/Add-Telemetry
sublime247 Jun 24, 2026
53a5c6b
Merge pull request #1401 from samjay8/fix/map-vodacom-global-error-ma…
sublime247 Jun 24, 2026
cd4f5e3
Merge pull request #1405 from aigbagbobila/issue-1048-compress-worker…
sublime247 Jun 24, 2026
451000a
Merge branch 'main' into vip-fee-discount
sublime247 Jun 24, 2026
2589fbd
Merge pull request #1402 from AugistineCreates/vip-fee-discount
sublime247 Jun 24, 2026
acaa59e
Merge pull request #1412 from samuelfrancis163-eng/pr-issue-1292
sublime247 Jun 24, 2026
f466453
Merge pull request #1413 from N-thnI/feature/syncworker-test-coverage
sublime247 Jun 24, 2026
9da6ad8
Merge branch 'main' into feature/wave-senegal-provider
sublime247 Jun 24, 2026
b81bdb3
Merge pull request #1414 from maztah1/feature/wave-senegal-provider
sublime247 Jun 24, 2026
4b5a0f7
Merge pull request #1417 from muhahahmad68/feature/optimize-callback-…
sublime247 Jun 24, 2026
849d49b
Merge pull request #1420 from muhahahmad68/feature/automated-sanction…
sublime247 Jun 24, 2026
82731fe
Merge pull request #1415 from Danto1606/main
sublime247 Jun 24, 2026
28bbb03
Merge branch 'main' into feature/webhook-compliance-ivms101
sublime247 Jun 24, 2026
4e51923
Merge pull request #1416 from Jess52487/feature/webhook-compliance-iv…
sublime247 Jun 24, 2026
aa5cc22
Merge pull request #1418 from dev-fani/fix/password-complexity-tax-co…
sublime247 Jun 24, 2026
5e4f272
Merge branch 'main' into feat/1029-optimize-image-load-times
sublime247 Jun 24, 2026
7e744f2
Merge pull request #1419 from Rajkoli145/feat/1029-optimize-image-loa…
sublime247 Jun 24, 2026
5edebd4
Merge pull request #1421 from Whiznificent/feature/ip-blacklist-middl…
sublime247 Jun 24, 2026
f63faf1
Merge branch 'main' into main
sublime247 Jun 24, 2026
c7a5997
Merge pull request #1422 from sochima2/main
sublime247 Jun 24, 2026
619c7d8
Merge branch 'main' into feature/1293-sanctions-sync-cron
sublime247 Jun 24, 2026
5cf856c
Merge pull request #1425 from softnationz/feature/1293-sanctions-sync…
sublime247 Jun 24, 2026
f96e6c6
Merge pull request #1426 from teeschima/tracing/graphql-resolver-spans
sublime247 Jun 24, 2026
0cadcf4
Merge branch 'main' into feat/stellar-fee-cache
sublime247 Jun 24, 2026
41906b5
Merge pull request #1427 from Devadakene/feat/stellar-fee-cache
sublime247 Jun 24, 2026
b6fff1f
Merge pull request #1429 from Devadakene/feature/dynamic-tax-config
sublime247 Jun 24, 2026
9142451
Merge pull request #1430 from dorismaduegbunam/feature/mobile-money-u…
sublime247 Jun 24, 2026
87b5dec
Add multi-currency ledger support for GHS and NGN
AugistineCreates Jun 25, 2026
0490b0e
Merge branch 'main' into feature/dynamic-token-mapping
AugistineCreates Jun 25, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
117 changes: 41 additions & 76 deletions .env.config.example
Original file line number Diff line number Diff line change
@@ -1,82 +1,47 @@
# Configuration Guide - Environment Variables

# This file documents all environment variables that can override configuration.
# Copy this to .env and modify as needed for your environment.

# Environment
NODE_ENV=development

# Database
DATABASE_URL=postgresql://localhost/mobile_money_dev

# Redis
REDIS_URL=redis://localhost:6379

# ===== PROVIDER LIMITS (XAF) =====
# MTN Provider
MTN_MIN_AMOUNT=100
MTN_MAX_AMOUNT=500000
MTN_CALLBACK_SECRET=your_mtn_callback_secret
MTN_CALLBACK_SIGNATURE_HEADER=X-Callback-Signature

# Airtel Provider
AIRTEL_MIN_AMOUNT=100
AIRTEL_MAX_AMOUNT=1000000

# Orange Provider
ORANGE_MIN_AMOUNT=500
ORANGE_MAX_AMOUNT=750000

# ===== TRANSACTION LIMITS BY KYC LEVEL (XAF) =====
LIMIT_UNVERIFIED=10000
LIMIT_BASIC=100000
LIMIT_FULL=1000000

# ===== GENERAL TRANSACTION LIMITS (XAF) =====
MIN_TRANSACTION_AMOUNT=100
MAX_TRANSACTION_AMOUNT=1000000

# ===== TRANSACTION TIMEOUTS & TTL =====
TRANSACTION_TIMEOUT_MINUTES=30
IDEMPOTENCY_KEY_TTL_HOURS=24

# ===== AUTHENTICATION =====
MAX_LOGIN_ATTEMPTS=5
ADMIN_API_KEY=dev-admin-key

# ===== CACHE SETTINGS =====
SLOW_QUERY_THRESHOLD_MS=1000
ENABLE_SLOW_QUERY_LOGGING=false

# ===== STELLAR CONFIGURATION =====
# Stellar network configuration
STELLAR_NETWORK_PASSPHRASE=Test SDF Network ; September 2015
# Single URL or comma-separated list (primary first, then fallbacks) for
# automatic Horizon node rotation/failover.
STELLAR_HORIZON_URL=https://horizon-testnet.stellar.org

# ===== THIRD-PARTY INTEGRATIONS =====
# AWS S3
AWS_ACCESS_KEY_ID=your_access_key
AWS_SECRET_ACCESS_KEY=your_secret_key
AWS_REGION=us-east-1
AWS_S3_BUCKET=your_bucket

# SendGrid Email
SENDGRID_API_KEY=your_sendgrid_key

# Sentry Error Tracking
SENTRY_DSN=your_sentry_dsn

# DataDog APM
DATADOG_API_KEY=your_datadog_key

# PagerDuty
PAGERDUTY_API_KEY=your_pagerduty_key

# ===== NOTES =====
# - All provider limits are in XAF (West African CFA franc)
# - KYC transaction limits should follow: unverified <= basic <= full
# - Min transaction amount should be <= max transaction amount
# - Cache TTLs are in seconds or milliseconds as indicated
# - See docs/CENTRALIZED_CONFIG.md for complete configuration reference
#
# Grafana Azure AD setup checklist:
# 1. Create an App Registration in Azure Portal (Authentication blade)
# 2. Under "Redirect URIs", select "Web" and add:
# <GF_SERVER_ROOT_URL>/login/azuread
# (e.g. http://localhost:3001/login/azuread for local dev)
# 3. Under "API permissions", grant Microsoft Graph "User.Read" (delegated)
# 4. Set "Supported account types" based on your needs (single vs multi-tenant)
# 5. Copy the Application (client) ID → GF_AUTH_AZUREAD_CLIENT_ID
# 6. Create a client secret under "Certificates & secrets" → GF_AUTH_AZUREAD_CLIENT_SECRET
# 7. For production, set GF_AUTH_AZUREAD_ALLOWED_DOMAINS or GF_AUTH_AZUREAD_ALLOWED_GROUPS

# ===== PAGERDUTY (alert routing for balance shortfalls and provider errors) =====
# PagerDuty Events API V2 integration key. REQUIRED to enable PagerDuty alert
# routing. Without this, the service starts in disabled mode (no-op).
PAGERDUTY_INTEGRATION_KEY=

# Prefix used for all dedup_keys. Each alert appends a contextual suffix
# (e.g. "-mtn-XAF-balance-shortfall") so incidents are grouped per asset.
PAGERDUTY_DEDUP_KEY=mobile-money

# ----- Balance Shortfall Tier Escalation Matrix (issue #1018) -----
# Three strictly-ordered tiers map a shortfall percentage to a PagerDuty
# severity + escalation path:
#
# | Tier | shortfallPct range | Severity | Escalation path |
# |----------|-------------------------------------------------------|-----------|------------------------------|
# | minor | >= BALANCE_SHORTFALL_MINOR_PCT and < _MODERATE_PCT | warning | team-notification |
# | moderate | >= BALANCE_SHORTFALL_MODERATE_PCT and < _CRITICAL_PCT | error | operational-escalation |
# | critical | >= BALANCE_SHORTFALL_CRITICAL_PCT | critical | immediate-escalation |
# | (none) | < BALANCE_SHORTFALL_MINOR_PCT | n/a | no PagerDuty alert (noise) |
#
# INVARIANT: tiers MUST satisfy 0 < MINOR_PCT < MODERATE_PCT < CRITICAL_PCT < 100.
# If misconfigured (out-of-order, equal, NaN, out-of-range), the service logs
# a warning at startup and falls back to safe defaults (10/25/50). The active
# tier matrix is logged once per process start so on-call can verify routing.
#
# Defaults (used when env vars are unset): minor=10, moderate=25, critical=50.
BALANCE_SHORTFALL_CRITICAL_PCT=50
BALANCE_SHORTFALL_MODERATE_PCT=25
BALANCE_SHORTFALL_MINOR_PCT=10
73 changes: 71 additions & 2 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -230,6 +230,8 @@ AIRTEL_CURRENCY=NGN
# and a merchant web portal session must be maintained by the backend.
AIRTEL_MODE=direct
AIRTEL_WEB_BASE_URL=https://airtel-money.example
AIRTEL_DIRECT_BASE_URL=your_airtel_direct_base_url
AIRTEL_SANDBOX_BASE_URL=your_airtel_sandbox_base_url
AIRTEL_USERNAME=your_airtel_portal_username
AIRTEL_PASSWORD=your_airtel_portal_password
AIRTEL_LOGIN_PATH=/login
Expand Down Expand Up @@ -499,12 +501,26 @@ MOCK_WEBHOOK_LATENCY_MS=3000
MOCK_WEBHOOK_LATENCY_ENABLED=true

# ---------------------------------------------------------------------------
# Provider Health Check
# Provider Health Check & Circuit Breaker
# ---------------------------------------------------------------------------
# Cron schedule for provider health checks (default: every 5 minutes)
PROVIDER_HEALTH_CHECK_CRON=*/5 * * * *
# Webhook URLs for provider health alerts (comma-separated or individual)
PROVIDER_HEALTH_WEBHOOK_URL=
#
# Number of consecutive ping failures before the health-check circuit breaker
# opens for a provider (default: 3)
PROVIDER_HEALTH_FAILURE_THRESHOLD=3
#
# Duration (ms) to keep the health-check circuit breaker open before allowing
# a retry (default: 60000 = 1 minute)
PROVIDER_HEALTH_OPEN_DURATION_MS=60000
#
# Optional per-provider override for the opossum circuit breaker failure
# threshold (number of failures in the rolling window before opening).
# When set, takes precedence over PROVIDER_CIRCUIT_BREAKER_VOLUME_THRESHOLD
# for the specified provider.
# Example: VODACOM_CIRCUIT_BREAKER_FAILURE_THRESHOLD=5

# ---------------------------------------------------------------------------
# PII Encryption (AES-256-GCM)
Expand Down Expand Up @@ -581,5 +597,58 @@ LOG_SHARD_RETENTION_DAYS=7
# ---------------------------------------------------------------------------
# Dedicated Sandbox Environment
# ---------------------------------------------------------------------------
AWS_REGION=us-east-1
AWS_ACCESS_KEY_ID=your_aws_access_key_id
AWS_SECRET_ACCESS_KEY=your_aws_secret_access_key
AWS_S3_BUCKET=mobile-money-kyc-documents

# KYC Provider Configuration
KYC_API_URL=https://api.entrust.com
KYC_API_KEY=your_kyc_api_key
KYC_WEBHOOK_SECRET=your_webhook_secret

# --- Twilio Configuration ---
TWILIO_ACCOUNT_SID=your_twilio_account_sid
TWILIO_AUTH_TOKEN=your_twilio_auth_token
TWILIO_PHONE_NUMBER=your_twilio_sms_number
SMS_PROVIDER=twilio # 'twilio' or 'none'

# WhatsApp Official API (Twilio)
WHATSAPP_ENABLED=false
TWILIO_WHATSAPP_NUMBER=whatsapp:+14155238886
TWILIO_WHATSAPP_TRANSACTION_TEMPLATE_SID=HX...
TWILIO_WHATSAPP_OTP_TEMPLATE_SID=HX...
USE_HTTP2=false # Set to true with valid certs to enable HTTP/2

# Intercom Configuration
INTERCOM_ACCESS_TOKEN=your_intercom_access_token
# Optional: Admin ID for sending messages
INTERCOM_ADMIN_ID=

# Support API Timeout and Retry Configuration
SUPPORT_API_TIMEOUT_MS=10000
SUPPORT_RETRY_ATTEMPTS=3
SUPPORT_RETRY_DELAY_MS=1000

# Refresh Token
REFRESH_TOKEN_EXPIRES_IN=
REFRESH_TOKEN_SECRET=
REFRESH_TOKEN_ISSUER=

# ---------------------------------------------------------------------------
# IP Blacklisting
# ---------------------------------------------------------------------------
# Comma-separated list of individual IPs to block at the worker/middleware layer.
# Example: IP_BLACKLIST_IPS=203.0.113.42,198.51.100.7
IP_BLACKLIST_IPS=

# Comma-separated list of CIDR ranges to block at the worker/middleware layer.
# Example: IP_BLACKLIST_CIDRS=203.0.113.0/24,198.51.100.0/24
IP_BLACKLIST_CIDRS=

# Dynamic blacklist entries can also be managed at runtime via Redis keys:
# Exact IP — SET ip:blacklist:<ip> 1 [EX <ttl>]
# CIDR set — SADD ip:blacklist:cidrs <cidr>
# ---------------------------------------------------------------------------
IS_SANDBOX=false
SANDBOX_DATABASE_URL=postgresql://user:password@localhost:5432/mobile_money_sandbox?schema=public
SANDBOX_DATABASE_URL=postgresql://user:password@localhost:5432/mobile_money_sandbox?schema=public
37 changes: 37 additions & 0 deletions .github/workflows/markdownlint.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
name: Markdown Lint

on:
pull_request:
branches: [main, develop]
paths:
- "**/*.md"

jobs:
markdownlint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0

- uses: actions/setup-node@v4
with:
node-version: "20"
cache: npm

- name: Install dependencies
run: npm ci --ignore-scripts

- name: Get changed markdown files
id: changed-files
run: |
files=$(git diff --name-only --diff-filter=ACMRT ${{ github.event.pull_request.base.sha }} ${{ github.event.pull_request.head.sha }} -- '*.md' | tr '\n' ' ')
echo "files=${files}" >> $GITHUB_OUTPUT

- name: Lint changed markdown files
run: |
if [ -n "${{ steps.changed-files.outputs.files }}" ]; then
npx markdownlint ${{ steps.changed-files.outputs.files }}
else
echo "No markdown files changed, skipping."
fi
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ node_modules/
dist/
contracts/target/
*.tsbuildinfo
.docusaurus/

# Kotlin SDK build artifacts
sdk/build/
Expand Down
1 change: 1 addition & 0 deletions .kilo/kilo.json
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
{
"$schema": "https://app.kilo.ai/config.json",
"snapshot": false
}
17 changes: 17 additions & 0 deletions .markdownlint.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
{
"default": true,
"MD004": { "style": "asterisk" },
"MD009": { "br_spaces": 2 },
"MD013": false,
"MD024": { "allow_different_nesting": true },
"MD029": { "style": "ordered" },
"MD030": { "ol_multi": 1, "ul_multi": 1 },
"MD033": false,
"MD040": false,
"MD041": false,
"MD046": { "style": "fenced" },
"MD047": true,
"MD048": { "style": "backtick" },
"MD058": false,
"MD060": false
}
11 changes: 11 additions & 0 deletions benchmarks/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
[package]
name = "soroban-gas-benchmark"
version = "0.1.0"
edition = "2021"

[dependencies]
soroban-sdk = { version = "25.3.0", features = ["testutils"] }
escrow = { path = "../contracts/escrow" }
htlc = { path = "../contracts/htlc" }
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
Loading
Loading