Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
410 commits
Select commit Hold shift + click to select a range
4b67973
feat(webhooks): add OpenAPI examples to all webhook endpoints
yungjay21 Jun 30, 2026
a5b2d89
feat(webhooks): Add comprehensive integration tests
silver257-web Jun 30, 2026
62135bb
feat(wallets): Add feature flag guard to Wallet API
silver257-web Jun 30, 2026
df89218
feat(wallets): Add cache layer stub for wallet API service
silver257-web Jun 30, 2026
c8525f1
feat(wallets): Add comprehensive integration tests
silver257-web Jun 30, 2026
21d3fc6
Merge pull request #461 from OxDev-max/fix/balance-indexer-cache-feat…
Jambox11 Jun 30, 2026
5fb31f6
Merge pull request #462 from dami-005/fix/key-management-improvements
Jambox11 Jun 30, 2026
9619e3c
Merge branch 'staging' into fix/key-management-improvements
Jambox11 Jun 30, 2026
8e2f25a
Merge pull request #463 from levi0005/fix/key-management-improvements
Jambox11 Jun 30, 2026
d6cabad
Merge pull request #464 from vitalis200/clean
Jambox11 Jun 30, 2026
3a9ceed
Merge branch 'staging' into fix/key-management-improvements
Jambox11 Jun 30, 2026
ea9a212
Merge pull request #465 from james2177/fix/key-management-improvements
Jambox11 Jun 30, 2026
5bc6fb8
Merge branch 'staging' into mspot
Jambox11 Jun 30, 2026
d8d5e7f
Merge pull request #466 from mspotless/mspot
Jambox11 Jun 30, 2026
7651313
Merge branch 'staging' into staging
Jambox11 Jun 30, 2026
5f67c8b
Merge pull request #467 from Emmy6654/staging
Jambox11 Jun 30, 2026
767d1e1
Merge branch 'staging' into feat/wallet-orchestrator-metrics-env-e2e-…
Jambox11 Jun 30, 2026
78980d3
Merge pull request #468 from Ayilojay/feat/wallet-orchestrator-metric…
Jambox11 Jun 30, 2026
7887625
Merge pull request #469 from Prasiejames/feat/recovery-api-improvements
Jambox11 Jun 30, 2026
91bde72
Merge branch 'staging' into feat/418-wallet-orchestrator-retry-backoff
Jambox11 Jun 30, 2026
20688fa
Merge pull request #470 from Emeka000/feat/418-wallet-orchestrator-re…
Jambox11 Jun 30, 2026
e9a57f8
Merge pull request #471 from yungjay21/feat/webhooks-openapi-examples
Jambox11 Jun 30, 2026
d8efa30
Merge branch 'staging' into feature/webhooks-integration-tests
Jambox11 Jun 30, 2026
604555b
Merge pull request #472 from silver257-web/feature/webhooks-integrati…
Jambox11 Jun 30, 2026
ecd8a43
Merge pull request #473 from silver257-web/feature/wallet-api-feature…
Jambox11 Jun 30, 2026
68fe7df
Merge pull request #474 from silver257-web/feature/wallet-cache-layer…
Jambox11 Jun 30, 2026
0d72dd3
Merge pull request #475 from silver257-web/feature/wallet-api-integra…
Jambox11 Jun 30, 2026
a5a9d5f
feat: Return remaining daily limit on limits GET (#564)
aji70 Jul 23, 2026
256f21e
feat: Poll pending transactions for confirmation (#565)
aji70 Jul 23, 2026
8e143d7
feat: Secure internal cron triggers with shared secret (#566)
aji70 Jul 23, 2026
28a3f51
feat: Add optional OpenTelemetry tracing (#567)
aji70 Jul 23, 2026
27c63a5
feat: add asset code validation to payment DTOs (#568)
Mimah97 Jul 23, 2026
ba7f72f
docs: write failed migration recovery runbook (#569)
Mimah97 Jul 23, 2026
4b6576e
feat: throttle testnet faucet proxy calls (#570)
Mimah97 Jul 23, 2026
b7e7509
test: add auth guard matrix contract tests (#571)
Mimah97 Jul 23, 2026
bca82da
feat(recovery): add recovery status API for wallets
abdegenius Jul 24, 2026
d2d7cee
feat(limits): deactivate spending limits without hard delete
abdegenius Jul 24, 2026
7dd1a00
feat(limits): add update spending limits endpoint
abdegenius Jul 24, 2026
1bbc25c
feat: webhook delivery filters, Horizon retry jitter, wallet transiti…
zeekman Jul 24, 2026
8dd8900
Merge branch 'staging' into feat/issues-528-531-webhook-horizon-walle…
zeekman Jul 24, 2026
aab81ad
Add Horizon circuit breaker, login metadata, API versioning, and logi…
autostack-art Jul 24, 2026
5e2155e
feat(wallets): persist per-user network preference
Meshmulla Jul 24, 2026
0d756a0
feat(payments): add idempotency keys to payment create
Meshmulla Jul 24, 2026
4d85ed4
fix(payments): enforce daily spending limits before payment submit
Meshmulla Jul 24, 2026
7362f69
fix(payments): enforce per-transaction amount caps
Meshmulla Jul 24, 2026
e33b579
feat: graceful shutdown, log redaction, wallet archiving
constantvictory Jul 24, 2026
b44c3f6
issues
llinsss Jul 24, 2026
b9073af
Merge remote-tracking branch 'upstream/staging' into feat/wallet-arch…
constantvictory Jul 24, 2026
c02f7e2
Merge pull request #601 from aji70/feature/wallet-limits-polling-cron…
Jambox11 Jul 24, 2026
87e94bd
Merge pull request #602 from Mimah97/feature/wallet-payment-validations
Jambox11 Jul 24, 2026
e1e4c65
Merge pull request #608 from abdegenius/feature/506-recovery-status-w…
Jambox11 Jul 24, 2026
26eb4ce
Merge branch 'staging' into feature/505-deactivate-spending-limits
Jambox11 Jul 24, 2026
0904960
Merge pull request #609 from abdegenius/feature/505-deactivate-spendi…
Jambox11 Jul 24, 2026
d17244f
Merge branch 'staging' into feature/504-update-spending-limits
Jambox11 Jul 24, 2026
5dce695
Merge pull request #610 from abdegenius/feature/504-update-spending-l…
Jambox11 Jul 24, 2026
14c2d1f
Merge pull request #611 from zeekman/feat/issues-528-531-webhook-hori…
Jambox11 Jul 24, 2026
14745d3
Merge pull request #612 from autostack-art/feature/stellar-wave-536-539
Jambox11 Jul 24, 2026
2e8be20
Merge pull request #613 from Meshmulla/feature/476-wallet-network-pre…
Jambox11 Jul 24, 2026
e3aa03d
Merge pull request #614 from Meshmulla/feature/477-payment-idempotenc…
Jambox11 Jul 24, 2026
5352c76
Merge branch 'staging' into feature/478-daily-spending-limits
Jambox11 Jul 24, 2026
6c610e6
Merge pull request #615 from Meshmulla/feature/478-daily-spending-limits
Jambox11 Jul 24, 2026
f57f048
Merge branch 'staging' into feature/479-per-transaction-caps
Jambox11 Jul 24, 2026
a657016
Merge pull request #616 from Meshmulla/feature/479-per-transaction-caps
Jambox11 Jul 24, 2026
d0db963
Merge branch 'staging' into feat/wallet-archive-shutdown-redaction
Jambox11 Jul 24, 2026
20a03ef
Merge pull request #617 from constantvictory/feat/wallet-archive-shut…
Jambox11 Jul 24, 2026
ebe35e9
Merge pull request #618 from llinsss/llins
Jambox11 Jul 24, 2026
97ae9b6
feat(recovery): add initiate recovery request endpoint
abdegenius Jul 24, 2026
6b84a96
feat: pagination envelope, memo validation, webhook DLQ, horizon netw…
scriptnovaa Jul 24, 2026
93e81ab
Merge branch 'staging' into feat/stellar-wave-532-535
scriptnovaa Jul 24, 2026
ee26103
Implement somzilla_Issues: clean up duplicates, fix bugs, add balance…
charityagbenu12-cmd Jul 24, 2026
8a38db0
fix(webhooks): repair broken merge in webhook CRUD/dispatch and wire …
priscaenoch Jul 24, 2026
0eab654
feat: memo search, spend-limit warnings, network validation, hot-path…
smartdev-stack Jul 24, 2026
c6838c0
vatixxx
kaynaomi-oss Jul 24, 2026
422799f
feat: add payment metrics and Horizon account cache
kaynaomi-oss Jul 24, 2026
c169439
Merge pull request #619 from abdegenius/feature/507-initiate-recovery…
Jambox11 Jul 25, 2026
aa74251
Merge branch 'staging' into feature/508-approve-recovery-admin-action
Jambox11 Jul 25, 2026
7eda016
Merge pull request #620 from talatu4sambo-cmyk/feature/508-approve-re…
Jambox11 Jul 25, 2026
23245b7
Merge branch 'staging' into feature/509-rate-limit-auth-endpoints-sta…
Jambox11 Jul 25, 2026
576c28b
Merge pull request #621 from talatu4sambo-cmyk/feature/509-rate-limit…
Jambox11 Jul 25, 2026
557b10a
Merge branch 'staging' into feature/510-rotate-refresh-tokens-on-use-…
Jambox11 Jul 25, 2026
17506aa
Merge pull request #622 from talatu4sambo-cmyk/feature/510-rotate-ref…
Jambox11 Jul 25, 2026
a3739c9
Merge branch 'staging' into feature/511-revoke-sessions-credential-ch…
Jambox11 Jul 25, 2026
4a8b799
Merge pull request #623 from talatu4sambo-cmyk/feature/511-revoke-ses…
Jambox11 Jul 25, 2026
2f1b964
Merge pull request #624 from scriptnovaa/feat/stellar-wave-532-535
Jambox11 Jul 25, 2026
13611fc
Merge branch 'staging' into somzilla_Issues
Jambox11 Jul 25, 2026
91bc772
Merge pull request #626 from charityagbenu12-cmd/somzilla_Issues
Jambox11 Jul 25, 2026
23def3d
Merge branch 'staging' into feature/480-483-webhook-events-signing-re…
Jambox11 Jul 25, 2026
6fe216d
Merge pull request #628 from priscaenoch/feature/480-483-webhook-even…
Jambox11 Jul 25, 2026
9cb3028
Merge branch 'staging' into feat/544-547-memo-search-limit-warning-ne…
Jambox11 Jul 25, 2026
e5997ba
Merge pull request #630 from kaynaomi-oss/vatix
Jambox11 Jul 25, 2026
7b81849
Merge branch 'staging' into feat/544-547-memo-search-limit-warning-ne…
Jambox11 Jul 25, 2026
0c05372
Merge pull request #629 from smartdev-stack/feat/544-547-memo-search-…
Jambox11 Jul 25, 2026
145e589
Implement somzilla issues #492, #493, #495
sommy92 Jul 25, 2026
b8fb8e8
Merge pull request #632 from sommy92/somzilla_issues
Jambox11 Jul 25, 2026
7f1b657
feat: Ensure createdAt and updatedAt on wallets (#573)
Tukura11 Jul 26, 2026
10200f4
feat: Define payment amount precision rules (#575)
Tukura11 Jul 26, 2026
2a7a663
feat: Harden credentialed CORS configuration (#574)
Tukura11 Jul 26, 2026
45beb2d
feat: Publish API changelog process (#572)
Tukura11 Jul 26, 2026
74e3e4d
feat: Mark idempotent replay responses with headers (#576)
Almikefred Jul 26, 2026
f0090e3
feat: Admin list of stuck pending transactions (#577)
Almikefred Jul 26, 2026
36fe4ef
test: Add unique DB constraint verification for idempotency keys (#583)
Saboleee Jul 26, 2026
2db10d1
feat: Add local demo data seed script with transactions (#581)
Saboleee Jul 26, 2026
377e6e6
feat: Support network scoped API keys (#578)
Almikefred Jul 26, 2026
4e62155
feat: Log Horizon summaries in debug mode (#582)
Saboleee Jul 26, 2026
b41377a
feat: Document database backup restore drill (#579)
Almikefred Jul 26, 2026
c93c04e
feat: Normalize private resource 404 versus 403 policy (#580)
Saboleee Jul 26, 2026
2937af2
feat: Version internal domain event schemas (#584)
favourawaku Jul 26, 2026
19b8fb4
feat: Add load test profile for wallet list (#585)
favourawaku Jul 26, 2026
9a2270c
feat: Optionally block payments to self (#586)
favourawaku Jul 26, 2026
14c996e
feat: Standardize structured logging fields (#587)
favourawaku Jul 26, 2026
9a9b538
Merge pull request #633 from Tukura11/feat/wallet-api-hardening-572-575
Jambox11 Jul 26, 2026
430852d
Merge branch 'staging' into feature/replay-headers-stuck-txs-network-…
Jambox11 Jul 26, 2026
a73f5d1
Merge pull request #634 from Almikefred/feature/replay-headers-stuck-…
Jambox11 Jul 26, 2026
a73c24b
Merge pull request #635 from Saboleee/feature/normalize-404-403-seed-…
Jambox11 Jul 26, 2026
02e4638
Merge pull request #636 from favourawaku/feature/584-587-wallet-event…
Jambox11 Jul 26, 2026
0a686fa
feat: #593 DLQ alerts, #594 CI prisma generate, #595 tenant scoping, …
Raven062 Jul 27, 2026
1f449d0
feat(payments): reject empty payment batch payloads
joyyakubu41 Jul 27, 2026
4e295f9
docs: add Docker Compose local setup with Dockerfile and guide
joyyakubu41 Jul 27, 2026
c3cd747
ci: lint OpenAPI spec in CI pipeline
joyyakubu41 Jul 27, 2026
7b08bd3
feat(webhooks): add optional mTLS for outbound webhook delivery
joyyakubu41 Jul 27, 2026
22b99fc
Merge pull request #637 from Raven062/feature/593-594-595-596-dlq-ale…
Jambox11 Jul 27, 2026
b46c0c9
Merge pull request #638 from joyyakubu41/feature/597-reject-empty-pay…
Jambox11 Jul 27, 2026
027f0b4
Merge pull request #639 from joyyakubu41/feature/598-docker-compose-l…
Jambox11 Jul 27, 2026
16c390e
Merge pull request #640 from joyyakubu41/feature/599-lint-openapi-spe…
Jambox11 Jul 27, 2026
adbafee
Merge pull request #641 from joyyakubu41/feature/600-optional-mtls-ou…
Jambox11 Jul 27, 2026
445520d
feat(rate-limit): add Retry-After header and guard unit tests
Prasiejames Jul 27, 2026
0f545d7
feat(wallets): make wallet network immutable after creation
Prasiejames Jul 27, 2026
e63f666
refactor(config): centralize validated env config module
Prasiejames Jul 27, 2026
30a0b6a
feat(payments): add payment status history table
Prasiejames Jul 27, 2026
f045dc6
Merge branch 'staging' into feat/recovery-api-improvements
Prasiejames Jul 27, 2026
bac4956
Merge pull request #1 from Prasiejames/feat/recovery-api-improvements
Prasiejames Jul 27, 2026
6ad9ad1
feat: implement #494 rollback, #496 pagination, #497 tx filters, #498…
code-vortexIII Jul 28, 2026
ec8ac09
feat: CORS/security headers, multi-asset balances, custody & orchestr…
llinsss Jul 29, 2026
c1ea7b2
Merge pull request #642 from Prasiejames/staging
Jambox11 Jul 29, 2026
c82ad98
Merge pull request #643 from code-vortexIII/feature/494-496-497-498
Jambox11 Jul 29, 2026
799a963
Merge branch 'staging' into llins
Jambox11 Jul 29, 2026
4559793
Merge pull request #644 from ivieasakome/llins
Jambox11 Jul 29, 2026
98b5a98
feat(api): limit public request body size (#555)
jxsonyx Jul 29, 2026
6f80e9f
feat(api): add maintenance mode for mutating routes (#561)
jxsonyx Jul 29, 2026
3d04d0b
feat(wallets): implement wallet nickname feature
yvl4life Jul 29, 2026
a884226
feat(slo): implement latency SLO tracking
yvl4life Jul 29, 2026
4f02620
feat(transactions): implement fee-bump transaction submission
yvl4life Jul 29, 2026
b8cced4
feat(wallets): implement address uniqueness enforcement and lookup
yvl4life Jul 29, 2026
814bf9b
Merge pull request #646 from yvl4life/feature/implement-issues-1-4
Jambox11 Jul 29, 2026
e803f62
Merge branch 'staging' into feat/add-solutions
Jambox11 Jul 29, 2026
7ed0f8a
Merge pull request #645 from jxsonyx/feat/add-solutions
Jambox11 Jul 29, 2026
cbc6d96
Add webhook signature verification tests (#559)
Jul 29, 2026
106120b
fix(wallets): block wallet delete when transactions are pending (#558)
Jul 29, 2026
3dded72
feat(logging): capture X-Client-Version header for support logs (#562)
Jul 29, 2026
eb0c2ff
feat(horizon): resume Horizon history import with persisted cursors
Jul 29, 2026
8521900
fix(transactions): add validation decorators to BuildTransactionDto s…
D-Ochuko Jul 29, 2026
cb4ffdb
feat(transactions): wire HorizonSubmissionService and add POST /trans…
D-Ochuko Jul 29, 2026
ed96fc6
fix(transactions): distinguish Horizon insufficient-balance rejection…
D-Ochuko Jul 29, 2026
43a28a9
feat(payments): add dry-run validation endpoint
jxsonyx Jul 30, 2026
8b47d6e
feat: webhook subscriptions, signed export links, recovery cancel, IS…
Kinghezzy Jul 30, 2026
da2a370
Standardize wallet limits, error envelope, and Prisma migration hygiene
Dannyswiss1 Jul 30, 2026
2d4b349
Add Stellar address validation, mainnet payment kill-switch, build SH…
CeceOs92 Jul 30, 2026
f84fcf3
Merge pull request #647 from rudeus112266/feat/559-webhook-signature-…
Jambox11 Jul 30, 2026
c030097
Merge pull request #648 from rudeus112266/fix/558-block-delete-pendin…
Jambox11 Jul 30, 2026
40fc1b5
Merge pull request #649 from rudeus112266/feat/562-client-version-header
Jambox11 Jul 30, 2026
857a3d6
Merge pull request #650 from rudeus112266/feat/560-horizon-cursor-resume
Jambox11 Jul 30, 2026
561e6d2
Merge pull request #651 from D-Ochuko/fix/stellar-tx-build-submit-bal…
Jambox11 Jul 30, 2026
c99f62c
Merge branch 'staging' into feat/soln
Jambox11 Jul 30, 2026
e6a521e
Merge pull request #652 from jxsonyx/feat/soln
Jambox11 Jul 30, 2026
2905c33
Merge pull request #653 from Kinghezzy/feat/551-552-553-556-webhook-s…
Jambox11 Jul 30, 2026
db360be
Merge branch 'staging' into Feat/Standardize-wallet-limits-error-enve…
Jambox11 Jul 30, 2026
8adcd94
Merge pull request #654 from Dannyswiss1/Feat/Standardize-wallet-limi…
Jambox11 Jul 30, 2026
89b8b90
Merge branch 'staging' into feat/Stellar-address-validation-mainnet-p…
Jambox11 Jul 30, 2026
68cb790
Merge pull request #655 from CeceOs92/feat/Stellar-address-validation…
Jambox11 Jul 30, 2026
f9a710d
fix: import MaintenanceGuard symbol in AppModule (#658)
aji70 Aug 25, 2026
72e3338
fix: import MaintenanceModule in AppModule so MaintenanceGuard can re…
aji70 Aug 25, 2026
c40fa44
fix: import RefreshTokenService in AuthModule providers (#659)
aji70 Aug 25, 2026
76d69e7
fix: import RefreshTokenService in AuthOrchestratorController (#660)
aji70 Aug 25, 2026
48f70e3
Merge pull request #822 from aji70/fix/di-import-gaps-maintenance-and…
Jambox11 Aug 25, 2026
330bc92
fix: correct RefreshTokenService Prisma import path (#662)
Mimah97 Aug 25, 2026
e610c77
fix: correct SessionService Prisma import path (#663)
Mimah97 Aug 25, 2026
33881a5
fix: correct AdminRecoveryService Prisma import path (#664)
Mimah97 Aug 25, 2026
3b35cfb
feat: wire refresh-token issue/rotate into POST /auth/authenticate (#…
Mimah97 Aug 25, 2026
45f868a
Merge pull request #823 from Mimah97/fix/prisma-import-paths-and-refr…
Jambox11 Aug 26, 2026
41c25bb
fix: remove unused SessionService and dead session persistence code (…
Almikefred Aug 26, 2026
38cff38
fix: import BackupModule so /v1/backup/* routes are reachable (#667)
Almikefred Aug 26, 2026
9c625b7
fix: register HttpExceptionFilter globally in production bootstrap (#…
Almikefred Aug 26, 2026
3d77841
fix: split /health (liveness) and /ready (readiness) probes per READM…
Saboleee Aug 26, 2026
19fece7
fix: return 503 ServiceUnavailableException from /v1/ready on DB fail…
Saboleee Aug 26, 2026
b556afe
fix: mark GET /v1/ready as @Public() so orchestrators can call it wit…
Saboleee Aug 26, 2026
1f0cd04
fix: mark GET /v1/maintenance as @Public() to align access control wi…
Saboleee Aug 26, 2026
7c67875
Merge pull request #824 from Almikefred/fix/wire-session-backup-error…
Jambox11 Aug 26, 2026
43166b1
Merge pull request #825 from Saboleee/fix/health-probes-and-public-ro…
Jambox11 Aug 26, 2026
61de134
fix: verify Clerk/Better Auth JWTs instead of trusting client-supplie…
favourawaku Aug 26, 2026
0ce2bdf
fix: enforce INACTIVE/SUSPENDED user status in validateAuthentication…
favourawaku Aug 26, 2026
eec0e6b
docs: correct auth trust model to reflect real server-side verificati…
favourawaku Aug 26, 2026
fb45639
fix: enforce explicit self-scoped auth policy on GET /auth/sessions (…
favourawaku Aug 26, 2026
968c207
Merge pull request #826 from favourawaku/fix/auth-trust-model-and-ses…
Jambox11 Aug 26, 2026
3accade
fix: migrate workflow tests, deduplicate Node setup, add OTel tracing…
Pvsaint Aug 27, 2026
682a0cd
Merge branch 'staging' into fix/683-684-686-687-migrate-workflow-otel…
Pvsaint Aug 27, 2026
2c4135c
fix: feature flags default-enabled, CI lint + e2e, env docs (#677 #67…
Creed1759 Aug 27, 2026
57eee6b
Merge branch 'staging' into fix/feature-flags-ci-677-678-681-682
Creed1759 Aug 27, 2026
33d7447
fix: fail-closed rate limiting, migrate on startup, OTEL validation
flavor365 Aug 27, 2026
59eea40
Merge pull request #827 from Pvsaint/fix/683-684-686-687-migrate-work…
Jambox11 Aug 28, 2026
0eede6d
Merge branch 'staging' into fix/feature-flags-ci-677-678-681-682
Jambox11 Aug 28, 2026
650d587
Merge pull request #829 from flavor365/fix/679-680-685-688-fail-close…
Jambox11 Aug 28, 2026
ed3418b
Merge pull request #828 from Creed1759/fix/feature-flags-ci-677-678-6…
Jambox11 Aug 28, 2026
7b245ce
fix: fail-closed idempotency cache, scheduled wallet cleanup & tx pol…
vrickish Aug 28, 2026
e0b4061
fix: add inbound webhook receiver, webhook env validation, and idempo…
jpetee21-design Aug 28, 2026
f4edcc9
feat: secure recovery and orchestrate payments
Jambox11 Aug 28, 2026
2cfd268
feat(key-management): shared-store cache split, internal route guard,…
Meshmulla Aug 28, 2026
465ed89
feat: relayer funding, Soroban invocation, wallet rotation audit, enc…
Oryke Aug 28, 2026
bd04079
fix(security): fail-closed guards for metrics, horizon import, tenant…
studiomonkeyx Aug 28, 2026
e3e1ac0
fix(config): validate STELLAR_HORIZON_MAX_RETRIES and require MAINTEN…
Markodiba Aug 29, 2026
76d52da
fix(config): validate CORS, Stellar network, and balance sync env vars
quartune Aug 29, 2026
bb111f7
fix: include payment usage in daily limits and fail-closed export sig…
Aug 29, 2026
2008ada
Merge pull request #830 from vrickish/vrick_issue_701-704
Jambox11 Aug 29, 2026
ef563c4
Merge branch 'staging' into jpete_issue_697-700
Jambox11 Aug 29, 2026
5c605dc
Merge pull request #831 from jpetee21-design/jpete_issue_697-700
Jambox11 Aug 29, 2026
1c6fd99
Merge branch 'staging' into feature/recovery-admin-payment-orchestration
Jambox11 Aug 29, 2026
87f6580
Merge pull request #832 from darcszn/feature/recovery-admin-payment-o…
Jambox11 Aug 29, 2026
512b7b2
Merge branch 'staging' into feature/689-692-key-management-custody-ha…
Jambox11 Aug 29, 2026
faf69cb
Merge pull request #833 from Meshmulla/feature/689-692-key-management…
Jambox11 Aug 29, 2026
68c00da
Merge branch 'staging' into feature/765-766-767-768-wallet-encryption…
Jambox11 Aug 29, 2026
3bf3682
Merge pull request #834 from Oryke/feature/765-766-767-768-wallet-enc…
Jambox11 Aug 29, 2026
d9a557c
Merge branch 'staging' into feature/713-714-715-716-security-guards
Jambox11 Aug 29, 2026
0ec7682
Merge pull request #835 from studiomonkeyx/feature/713-714-715-716-se…
Jambox11 Aug 29, 2026
bb5a6e2
Merge pull request #836 from lachlan63-cyber/feature/761-762-763-env-…
Jambox11 Aug 29, 2026
937f415
Merge branch 'staging' into fix/717-720-env-validation-cors-stellar-b…
Jambox11 Aug 29, 2026
b0baa0b
Merge pull request #837 from quartune/fix/717-720-env-validation-cors…
Jambox11 Aug 29, 2026
b143480
Merge pull request #838 from meetdarc-tech/fix/daily-limit-export-sig…
Jambox11 Aug 29, 2026
a01b36d
fix: resolve #793 #794 #795 #796
charityagbenu12-cmd Aug 30, 2026
15c8006
Merge branch 'staging' into somzilla_793-796
charityagbenu12-cmd Aug 30, 2026
f5701a8
fix(#801): timing-safe CronSecretGuard comparison + test coverage
claude Aug 30, 2026
1ef46a5
Somzilla
sommy92 Aug 30, 2026
ac02577
fix(balance-indexer): repair botched merge in reconcileBalance and st…
sommy92 Aug 30, 2026
c2d67e7
fix: bound prometheus metric cardinality for wallet/transaction ids
Aug 30, 2026
8fde3ff
feat: harden SECURITY.md for private vulnerability disclosure (issue …
Aug 30, 2026
6a34784
fix: fail production boot when mainnet payment enabled without Horizo…
Aug 30, 2026
56f24da
feat: Implement security & reliability tasks #789-#792
oncleweynom Aug 31, 2026
41036a1
feat(key-management): rotate WALLET_ENCRYPTION_KEY and harden wallet …
priscaenoch Aug 31, 2026
42a3e10
fix(users): clean up owned resources on user deletion
Emmy6654 Aug 31, 2026
3f5136c
feat(wallets): sanitize nickname labels and enforce per-owner uniqueness
augustinemartins Aug 31, 2026
60593ba
Merge pull request #843 from charityagbenu12-cmd/somzilla_793-796
Jambox11 Aug 31, 2026
4df6e4d
Merge pull request #844 from pharuq411/fix/801-cron-secret-timing-saf…
Jambox11 Aug 31, 2026
6e155b8
Merge pull request #845 from sommy92/somzilla_issues
Jambox11 Aug 31, 2026
461ebcf
Merge branch 'staging' into fix/bound-prometheus-metric-cardinality
Jambox11 Aug 31, 2026
15b294a
Merge pull request #846 from pharuq411/fix/bound-prometheus-metric-ca…
Jambox11 Aug 31, 2026
b9a118c
Merge pull request #847 from pharuq411/fix/803-harden-security-md-pri…
Jambox11 Aug 31, 2026
e84c206
Merge pull request #848 from pharuq411/fix/804-fail-prod-boot-mainnet…
Jambox11 Aug 31, 2026
1c25979
Merge pull request #853 from oncleweynom/feat/security-reliability-ta…
Jambox11 Aug 31, 2026
9adbb8b
Merge pull request #854 from priscaenoch/feature/693-694-695-696-wall…
Jambox11 Aug 31, 2026
4e5eb6e
Merge pull request #855 from Emmy6654/fix/user-deletion-cleanup
Jambox11 Aug 31, 2026
6972ff7
Merge pull request #856 from augustinemartins/feature/794-795-nicknam…
Jambox11 Aug 31, 2026
378beba
fix(recovery): add explicit PrismaModule import to RecoveryModule
Xaxxoo Sep 1, 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
  •  
  •  
  •  
167 changes: 167 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@
# Never commit .env to version control.
# ============================================================

# Stellar Configuration
STELLAR_HORIZON_TESTNET_URL=https://horizon-testnet.stellar.org
STELLAR_HORIZON_MAINNET_URL=https://horizon.stellar.org
# ------------------------------------------------------------
# Database
# Required: PostgreSQL connection string (Prisma)
Expand All @@ -16,21 +19,98 @@ DATABASE_URL=postgresql://user:password@localhost:5432/mux_db?sslmode=require
# ------------------------------------------------------------
PORT=3000

# Git commit SHA of the running build, exposed via GET /health for build
# identity/traceability. Injected by CI/Docker (--build-arg GIT_SHA=...);
# defaults to "unknown" if not set.
GIT_SHA=

# Maximum JSON/form request body size in bytes (default: 102400 / 100 KiB).
# Requests above this limit receive HTTP 413.
JSON_BODY_LIMIT_BYTES=102400

# Shared secret required in X-Maintenance-Secret when toggling maintenance mode.
# Required in production (startup fails if unset); leave unset in dev/test to
# disable remote maintenance-mode changes.
MAINTENANCE_ADMIN_SECRET=

# Shared secret required in the X-Cron-Secret header for internal cron/background
# endpoints (e.g. POST /v1/transactions/internal/poll-pending).
# Required in production (startup validation fails without it); in local/dev the
# endpoints simply return 401 when unset.
# Generate with: openssl rand -hex 32
CRON_SECRET=

# Optional: interval (ms) for the stale PROVISIONING wallet cleanup scheduler.
# Default: 300000 (5 minutes)
STALE_PROVISIONING_CLEANUP_INTERVAL_MS=300000

# Optional: interval (ms) for the transaction polling scheduler that confirms
# submitted transactions against Horizon. Default: 60000 (1 minute)
TRANSACTION_POLL_INTERVAL_MS=60000

# ---------------------------------------------------------------------------
# Fee-bump sponsorship cap (issue #800)
# ---------------------------------------------------------------------------
# Maximum fee (in stroops) Mux will sponsor on a fee-bump transaction before
# refusing to build/submit it. This prevents the relayer from being drained by
# unbounded sponsorship of transaction fees.
# - 1 stroop = 0.0000001 XLM.
# - REQUIRED in production: the service refuses to start (fail-fast) if it is
# unset there. Outside production a bounded local default (10x the base fee)
# is used so dev/test remain functional.
# FEE_BUMP_MAX_FEE=50000

# ------------------------------------------------------------
# Key Management (internal API)
# ------------------------------------------------------------

# Shared secret required in the `x-internal-api-key` header for every
# /v1/internal/key-management/* route (issue #690). These routes custody
# Stellar private keys and are internal-only.
# - Not set → all key-management requests are denied (503, fail-closed).
# - Set → requests must send a matching `x-internal-api-key` header.
# Generate with: openssl rand -hex 32
KEY_MANAGEMENT_INTERNAL_API_KEY=

# Backend for the key-pair validation cache (issue #689).
# - memory → in-process cache (per-replica, lost on restart)
# - disabled → no cache; every validation is recomputed (fail-closed)
# Outside production this defaults to "memory". In production it MUST be set
# explicitly — the app refuses to boot otherwise (no silent in-process stub).
KEY_VALIDATION_CACHE_MODE=

# ------------------------------------------------------------
# Wallet Encryption
# Required: Secret used to derive the AES-256-GCM encryption key
# for Stellar private keys at rest. Use a long random string.
# Generate with: openssl rand -hex 32
# The documented placeholder below is rejected at startup — replace it.
# ------------------------------------------------------------
WALLET_ENCRYPTION_KEY=your-secret-encryption-key-min-32-chars

# Optional: the PREVIOUS WALLET_ENCRYPTION_KEY, set only while a master-key
# rotation is in flight. When present it must be a real secret (>= 32 chars)
# distinct from WALLET_ENCRYPTION_KEY. The internal job
# POST /v1/internal/key-management/re-encrypt-wallet-keys
# re-encrypts stored wallet keys under the new key; remove this once a run
# reports reEncrypted=0 and failed=0.
WALLET_ENCRYPTION_KEY_PREVIOUS=

# Required for signed export download links. Never use a default fallback in production.
# Generate with: openssl rand -hex 32
EXPORT_SIGNING_SECRET=your-export-signing-secret-min-32-chars

# ------------------------------------------------------------
# Stellar / Horizon
# Required: Horizon RPC endpoint for the target network
# Testnet: https://horizon-testnet.stellar.org
# Mainnet: https://horizon.stellar.org
# ------------------------------------------------------------
STELLAR_HORIZON_URL=https://horizon-testnet.stellar.org
STELLAR_NETWORK=TESTNET
STELLAR_HORIZON_MAX_RETRIES=3
STELLAR_HORIZON_RETRY_BACKOFF_MS=500
STELLAR_HORIZON_RETRY_JITTER_MS=250

# ------------------------------------------------------------
# Balance Indexer
Expand All @@ -39,6 +119,17 @@ STELLAR_HORIZON_URL=https://horizon-testnet.stellar.org
# ------------------------------------------------------------
BALANCE_STALE_THRESHOLD_MS=300000

# Optional: Interval between scheduled balance sync runs, in ms (default: 600000 / 10 minutes)
BALANCE_SYNC_INTERVAL_MS=600000
# Optional: Max retries for a failed balance sync run (default: 3)
BALANCE_SYNC_MAX_RETRIES=3

# ------------------------------------------------------------
# CORS
# Optional: Comma-separated list of allowed origins (default: http://localhost:3000)
# ------------------------------------------------------------
CORS_ORIGINS=http://localhost:3000

# ------------------------------------------------------------
# Webhooks
# Optional: Delivery retry configuration
Expand All @@ -47,9 +138,85 @@ WEBHOOK_MAX_RETRIES=5
WEBHOOK_RETRY_BACKOFF_MS=1000
WEBHOOK_TIMEOUT_MS=10000
WEBHOOK_MAX_CONSECUTIVE_FAILURES=10
WEBHOOK_QUEUE_INTERVAL_MS=30000

# Secret for verifying incoming webhooks (HMAC-SHA256 signature verification)
WEBHOOK_INBOUND_SECRET=your-inbound-webhook-secret

# ------------------------------------------------------------
# Recovery
# Optional: Time-to-live for recovery requests before they are expired
# Default: 604800000 (7 days)
# ------------------------------------------------------------
RECOVERY_REQUEST_TTL_MS=604800000

# Auth Rate Limiting Configuration
# Maximum number of authentication attempts per IP address per window
AUTH_RATE_LIMIT_MAX=10
# Time window in milliseconds for auth rate limiting (default: 60 seconds)
AUTH_RATE_LIMIT_WINDOW_MS=60000

# ------------------------------------------------------------
# OpenTelemetry / Tracing
# Optional: Set OTEL_ENABLED=true to activate distributed tracing.
# When omitted or set to any other value, tracing is a no-op.
# ------------------------------------------------------------
OTEL_ENABLED=false
# OTLP HTTP endpoint for the trace exporter (Jaeger, Tempo, Honeycomb, etc.)
OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4318/v1/traces
# Service name reported in spans
OTEL_SERVICE_NAME=mux-backend
# Service version reported in spans
OTEL_SERVICE_VERSION=1.0.0
# JWT Verification (Identity Provider Configuration)
# CRITICAL: POST /auth/authenticate now requires a signed JWT token.
# Identity (authId, authProvider) is extracted ONLY from verified JWT claims,
# never from client-supplied request body fields.
# ------------------------------------------------------------

# Identity provider to verify tokens against (CLERK or BETTER_AUTH)
# Required for production deployment. If not set, JWT verification will fail
# in production (fail-closed behavior).
AUTH_IDENTITY_PROVIDER=CLERK

# CLERK configuration: Public key for verifying Clerk JWTs
# Obtain from Clerk dashboard (Settings > API Keys > Verification keys)
# Required only if AUTH_IDENTITY_PROVIDER=CLERK
CLERK_JWT_PUBLIC_KEY=

# BETTER_AUTH configuration: JWKS URL for verifying Better Auth tokens
# The application will fetch and cache the JWKS for signature verification
# Required only if AUTH_IDENTITY_PROVIDER=BETTER_AUTH
BETTER_AUTH_JWKS_URL=

# Dev/test mode: Skip JWT verification for local development without live provider credentials
# MUST be unset or false in production. If enabled in production, POST /auth/authenticate
# will require tokens in format: dev-<provider>-<userid> (e.g., dev-clerk-user123)
AUTH_SKIP_JWT_VERIFICATION=

# ------------------------------------------------------------
# OpenTelemetry / Tracing (optional)
# Set OTEL_ENABLED=true to enable distributed tracing.
# When enabled, OTEL_EXPORTER_OTLP_ENDPOINT is required and must be a valid
# http/https URL; the application will fail to start if it is missing or
# malformed to prevent silent trace loss.
# ------------------------------------------------------------

# Enable OpenTelemetry tracing (default: false)
OTEL_ENABLED=false

# OTLP collector endpoint — required when OTEL_ENABLED=true
# Example: http://localhost:4318 (Jaeger / any OTLP-compatible backend)
OTEL_EXPORTER_OTLP_ENDPOINT=

# Wire protocol for OTLP export: http/protobuf (default) or grpc
OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf

# Logical service name that appears in traces (default: mux-backend)
OTEL_SERVICE_NAME=mux-backend

# Optional additional OTEL standard variables (not validated at startup):
# OTEL_SERVICE_VERSION=
# OTEL_SERVICE_NAMESPACE=
# OTEL_TRACES_SAMPLER=always_on
# OTEL_RESOURCE_ATTRIBUTES=deployment.environment=production
155 changes: 155 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,155 @@
name: CI

on:
push:
branches:
- main
- staging
pull_request:
branches:
- main
- staging

jobs:
test:
name: Build and test
runs-on: ubuntu-latest

steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup pnpm
uses: pnpm/action-setup@v4
with:
version: latest

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '22'
cache: 'pnpm'

- name: Install dependencies
run: pnpm install --frozen-lockfile

- name: Run ESLint
run: pnpm lint

unit-tests:
name: Unit Tests
runs-on: ubuntu-latest

steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup pnpm
uses: pnpm/action-setup@v4
with:
version: latest

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '22'
cache: 'pnpm'

- name: Install dependencies
run: pnpm install --frozen-lockfile

- name: Generate Prisma client
run: pnpm prisma:generate

- name: Run unit tests
run: pnpm test
env:
NODE_ENV: test
DATABASE_URL: postgresql://postgres:postgres@localhost:5432/mux_test
WALLET_ENCRYPTION_KEY: ci-test-encryption-key-min-32-chars-long!!

e2e-tests:
name: E2E Tests
runs-on: ubuntu-latest

services:
postgres:
image: postgres:16
env:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
POSTGRES_DB: mux_test
ports:
- 5432:5432
options: >-
--health-cmd pg_isready
--health-interval 10s
--health-timeout 5s
--health-retries 5

env:
NODE_ENV: test
DATABASE_URL: postgresql://postgres:postgres@localhost:5432/mux_test
WALLET_ENCRYPTION_KEY: ci-test-encryption-key-min-32-chars-long!!
STELLAR_HORIZON_URL: https://horizon-testnet.stellar.org

steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup pnpm
uses: pnpm/action-setup@v4
with:
version: latest

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '22'
cache: 'pnpm'

- name: Install dependencies
run: pnpm install --frozen-lockfile

- name: Generate Prisma client
run: pnpm prisma:generate

- name: Run database migrations
run: pnpm prisma:migrate:prod

- name: Run e2e tests
run: pnpm test:e2e
- name: Check Prisma migration naming
run: pnpm run prisma:check-migrations

- name: Build
run: pnpm run build

- name: Generate OpenAPI spec
run: pnpm run openapi:generate
env:
DATABASE_URL: postgresql://stub:stub@localhost:5432/stub
WALLET_ENCRYPTION_KEY: ${{ secrets.WALLET_ENCRYPTION_KEY || '0000000000000000000000000000000000000000000000000000000000000000' }}
STELLAR_HORIZON_URL: https://horizon-testnet.stellar.org
STELLAR_NETWORK: TESTNET
STELLAR_HORIZON_TESTNET_URL: https://horizon-testnet.stellar.org
STELLAR_HORIZON_MAINNET_URL: https://horizon.stellar.org
STELLAR_HORIZON_MAX_RETRIES: 3
STELLAR_HORIZON_RETRY_BACKOFF_MS: 500
STELLAR_HORIZON_RETRY_JITTER_MS: 250
BALANCE_STALE_THRESHOLD_MS: 300000
WEBHOOK_MAX_RETRIES: 5
WEBHOOK_RETRY_BACKOFF_MS: 1000
WEBHOOK_TIMEOUT_MS: 10000
WEBHOOK_MAX_CONSECUTIVE_FAILURES: 10
AUTH_RATE_LIMIT_MAX: 10
AUTH_RATE_LIMIT_WINDOW_MS: 60000

- name: Lint OpenAPI spec
run: pnpm run openapi:lint

- name: Test
run: pnpm test

- name: Test scripts
run: pnpm run test:scripts
Loading