Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
391 commits
Select commit Hold shift + click to select a range
5f279a5
Merge branch 'main' into feat/4-issues-fix
Petah1 Jun 29, 2026
184f0f3
Merge pull request #436 from jhayniffy/feat/test-coverage-and-securit…
Petah1 Jun 29, 2026
e63710a
Merge pull request #437 from martinzhames/feat/4-issues-fix
Petah1 Jun 29, 2026
e795f30
fix(#269): add wallet ownership check to getPaymentHistory
AnnabelJoe Jun 30, 2026
cadf615
fix(#277): add IP allowlist middleware for admin endpoints
AnnabelJoe Jun 30, 2026
f0cf4c5
fix(#279): restrict introspect to caller own token only
AnnabelJoe Jun 30, 2026
ef3c3cf
fix(#294): propagate actual on-chain tier in getSubscription
magaret457 Jun 30, 2026
521ca1c
feat(#286): add validators table for registered validator wallets
magaret457 Jun 30, 2026
aaf4985
fix(#271): validate req.body.wallet matches req.account in registerPl…
magaret457 Jun 30, 2026
f75ac2c
fix: validate ADMIN_WALLET env var in production
Gloriachinedu Jun 30, 2026
100d133
feat: add Helmet.js for comprehensive HTTP security headers
Gloriachinedu Jun 30, 2026
ae9d746
fix: remove mock-tx fallback from getPaymentHistory
Gloriachinedu Jun 30, 2026
9e22d66
feat(#278): log all failed authentication attempts to audit trail
magaret457 Jun 30, 2026
72b0ce8
refactor: extract subscription-lookup into getActiveSubscription utility
Gloriachinedu Jun 30, 2026
e434f0e
feat(#274): add token revocation/blocklist mechanism
PrincessnJoy Jun 30, 2026
6e036a1
feat(db): add migration 002 for trial_offers table (#289)
devEunicee Jun 30, 2026
ce9f302
fix(scout): remove (req as any) cast, add submitTrialOffer (#297)
devEunicee Jun 30, 2026
00a939d
Merge branch 'main' into feat/274-token-revocation
PrincessnJoy Jun 30, 2026
d084cb2
fix(admin): remove duplicate STELLAR_ADDRESS_RE, extract to shared ut…
devEunicee Jun 30, 2026
6eecb4f
fix(player): return 404 when player not found in milestones endpoint …
devEunicee Jun 30, 2026
dab297b
Merge pull request #456 from jabir-dev788/FIX-scout-off-backend
Petah1 Jun 30, 2026
7722ebb
Merge branch 'main' into fix/issue-301-milestones-404-player-not-found
Petah1 Jun 30, 2026
9a442de
Merge pull request #455 from devEunicee/fix/issue-301-milestones-404-…
Petah1 Jun 30, 2026
f5f29fa
Merge branch 'main' into fix/issue-299-remove-duplicate-stellar-regex
Petah1 Jun 30, 2026
78e34b5
Merge pull request #454 from devEunicee/fix/issue-299-remove-duplicat…
Petah1 Jun 30, 2026
fd58662
Merge pull request #453 from PrincessnJoy/feat/274-token-revocation
Petah1 Jun 30, 2026
efb99dc
Merge branch 'main' into feat/issue-289-trial-offers-migration
Petah1 Jun 30, 2026
6bcef72
Merge pull request #451 from devEunicee/feat/issue-289-trial-offers-m…
Petah1 Jun 30, 2026
d027843
Merge branch 'main' into feat/278-audit-auth-failures
Petah1 Jun 30, 2026
77e19ef
Merge pull request #450 from magaret457/feat/278-audit-auth-failures
Petah1 Jun 30, 2026
a5ca25f
Merge branch 'main' into fix/271-register-player-wallet-check
Petah1 Jun 30, 2026
6387227
Merge pull request #449 from magaret457/fix/271-register-player-walle…
Petah1 Jun 30, 2026
0f2b2bc
Merge branch 'main' into fix/294-subscription-tier
Petah1 Jun 30, 2026
3912523
Merge pull request #447 from magaret457/fix/294-subscription-tier
Petah1 Jun 30, 2026
c96a644
Merge branch 'main' into fix/issue-297-scout-req-account-type
Petah1 Jun 30, 2026
4e9386e
Merge pull request #452 from devEunicee/fix/issue-297-scout-req-accou…
Petah1 Jun 30, 2026
934b313
Merge pull request #446 from Gloriachinedu/fix/295-extract-subscripti…
Petah1 Jun 30, 2026
d2bd923
Merge branch 'main' into fix/296-remove-mock-tx-fallback
Petah1 Jun 30, 2026
5ef7fed
Merge pull request #445 from Gloriachinedu/fix/296-remove-mock-tx-fal…
Petah1 Jun 30, 2026
1f2ed08
Merge branch 'main' into fix/281-add-helmet
Petah1 Jun 30, 2026
eb204c1
Merge pull request #444 from Gloriachinedu/fix/281-add-helmet
Petah1 Jun 30, 2026
1f86104
Merge branch 'main' into fix/272-validate-admin-wallet
Petah1 Jun 30, 2026
0fbdb4f
Merge pull request #443 from Gloriachinedu/fix/272-validate-admin-wallet
Petah1 Jun 30, 2026
0780124
Merge branch 'main' into fix/277-admin-ip-allowlist
Petah1 Jun 30, 2026
1966599
Merge pull request #441 from AnnabelJoe/fix/277-admin-ip-allowlist
Petah1 Jun 30, 2026
a4abab7
Merge branch 'main' into fix/269-payment-history-wallet-check
Petah1 Jun 30, 2026
fe09779
Merge pull request #440 from AnnabelJoe/fix/269-payment-history-walle…
Petah1 Jun 30, 2026
202e9b5
Merge pull request #438 from devoclan/feat/issue-tests-subscribe-tria…
Petah1 Jun 30, 2026
bb26c9f
Merge branch 'main' into FIX-scout-off-backend
jabir-dev788 Jun 30, 2026
dcc8e95
Fix CI: resolve merge conflict marker, lint errors, and test failures
Petah1 Jul 1, 2026
4801281
Merge pull request #457 from jabir-dev788/FIX-scout-off-backend
Petah1 Jul 2, 2026
0b1a44d
Merge branch 'main' into feat/286-validators-table
Petah1 Jul 2, 2026
748a9c5
Merge pull request #448 from magaret457/feat/286-validators-table
Petah1 Jul 2, 2026
79284e1
Merge branch 'main' into fix/279-introspect-own-token
Petah1 Jul 2, 2026
3a31cfd
Merge pull request #442 from AnnabelJoe/fix/279-introspect-own-token
Petah1 Jul 2, 2026
92be4be
Fix CI: lint, env validation, compile errors, and 190+ failing tests
Petah1 Jul 2, 2026
08637e8
ci: invoke jest/tsc via node_modules/.bin directly instead of npx
Petah1 Jul 2, 2026
b159ef5
ci: drop npm caching in Backend CI — stale cache was corrupting jest'…
Petah1 Jul 2, 2026
adfe4e0
fix: bypass node_modules/.bin/jest — collides with jest-cli's identic…
Petah1 Jul 2, 2026
5b05be9
docs: add GitHub issue templates for bug reports and feature requests…
latiblack Jul 19, 2026
e72139c
docs: replace inline issue template with reference to new template forms
latiblack Jul 19, 2026
dd9182a
feat(routes): return 405 Method Not Allowed for unsupported HTTP methods
abimbolaalabi Jul 19, 2026
1498765
docs: add tier promotion state diagram
liukaisweetsmile-pixel Jul 19, 2026
46b79ef
chore: add .nvmrc and read Node version from file in CI
Anichris-koded Jul 19, 2026
8cb803d
Add test:watch npm script for Jest watch mode
GazzyLee Jul 19, 2026
aae0cab
test: add unit tests for backfill logic and INDEXER_BACKFILL_FROM_LED…
Songu3020 Jul 19, 2026
057f621
docs: update API documentation for player filtering and add new scout…
Songu3020 Jul 19, 2026
497c7ad
Merge pull request #553 from GazzyLee/add-test-watch-script
Petah1 Jul 19, 2026
c41a2bd
Merge pull request #552 from Songu3020/main
Petah1 Jul 19, 2026
4c4399f
Merge pull request #551 from Anichris-koded/add-nvmrc-node-version-file
Petah1 Jul 19, 2026
6206c2a
Merge pull request #550 from latiblack/docs/issue-templates-515
Petah1 Jul 19, 2026
be86cbc
Merge pull request #549 from abimbolaalabi/feat/405-method
Petah1 Jul 19, 2026
43f1aa5
test: add migration integration test suite (#508)
Anichris-koded Jul 19, 2026
152396d
fix(lint): remove unused initDb import in backfill.test.ts
Anichris-koded Jul 19, 2026
faa5286
feat: add POST /api/admin/validators/import for bulk validator onboar…
Anichris-koded Jul 19, 2026
71d20c1
Merge pull request #1 from Anichris-koded/feat/bulk-validator-import-493
Anichris-koded Jul 19, 2026
56f2855
make ipfs metadata pin deduplication atomic using pending pins mutex
Jul 19, 2026
6998a5b
test: add errorCodes unit tests and generate code coverage reports
TobyKing007 Jul 19, 2026
5f5b685
feat(#488): add private scout notes on player profiles
Nusirat12345 Jul 19, 2026
9ee713b
feat(#488): add private scout notes on player profiles
Nusirat12345 Jul 19, 2026
937fd56
feat(#490): add API key issuance and rotation for server-to-server sc…
Nusirat12345 Jul 19, 2026
fe894d6
feat(#488): add private scout notes on player profiles
Nusirat12345 Jul 19, 2026
721bf92
feat(#487): add scout bookmark/favorite-players endpoints
Nusirat12345 Jul 19, 2026
49af5a2
Merge pull request #560 from Nusirat12345/feat/487-scout-bookmarks
Petah1 Jul 19, 2026
8c63f96
Merge pull request #559 from Nusirat12345/feat/490-api-keys
Petah1 Jul 19, 2026
837a425
test(#685): add unit tests for useRequireSubscription hook
Nusirat12345 Jul 19, 2026
8f2229e
Merge pull request #558 from Nusirat12345/feat/488-scout-notes
Petah1 Jul 19, 2026
c626bee
Merge pull request #557 from akinboyewaSamson/test/add-error-codes-co…
Petah1 Jul 19, 2026
70c80d4
Merge pull request #554 from Anichris-koded/feat/migration-integratio…
Petah1 Jul 19, 2026
d00a034
Merge branch 'main' into fix/ipfs-dedup-mutex-466
Petah1 Jul 19, 2026
414c442
Merge pull request #561 from Nusirat12345/test/685-use-require-subscr…
Petah1 Jul 19, 2026
174a71c
test(#683): add unit tests for ScoutDashboardContent component
Nusirat12345 Jul 19, 2026
403b57c
Merge pull request #562 from Nusirat12345/test/683-scout-dashboard-co…
Petah1 Jul 19, 2026
e16e8a7
Merge pull request #556 from dotmantissa/fix/ipfs-dedup-mutex-466
Petah1 Jul 19, 2026
b2e9e33
feat: add scout saved-search persistence (#486)
Anichris-koded Jul 19, 2026
19592ce
fix: resolve pre-existing lint errors blocking CI
Anichris-koded Jul 19, 2026
706d722
Merge pull request #564 from Anichris-koded/feat/scout-saved-searches…
Petah1 Jul 19, 2026
94847d9
feat: wire cancel_subscription() to real Soroban contract call (#460)
Anichris-koded Jul 19, 2026
ae62e71
Updated Project file
veemakama Jul 19, 2026
91be36b
fix: resolve TS2352 type error in cancelSubscriptionOnChain
Anichris-koded Jul 19, 2026
e323dba
fix(#683): correct import path depth in ScoutDashboardContent test
Nusirat12345 Jul 19, 2026
db48466
test(#682): add unit tests for ReferralPanel component
Nusirat12345 Jul 19, 2026
330ed20
Merge pull request #573 from Nusirat12345/test/682-referral-panel-v2
Petah1 Jul 19, 2026
10e0233
Merge pull request #572 from Nusirat12345/fix/683-scout-dashboard-con…
Petah1 Jul 19, 2026
ff35545
Merge pull request #570 from liukaisweetsmile-pixel/codex/add-tier-st…
Petah1 Jul 19, 2026
b744b39
Merge pull request #569 from veemakama/main
Petah1 Jul 19, 2026
0a5d522
Merge pull request #567 from Anichris-koded/feat/wire-cancel-subscrip…
Petah1 Jul 19, 2026
f80ec74
Add unit tests for src/middleware/securityHeaders.ts
Chigybillionz Jul 19, 2026
9462f06
test: add unit tests for playerIdValidator
OpadijoIdris Jul 20, 2026
bfea508
test: add comprehensive unit tests for sanitizeInput utility
Silver36-ship-it Jul 20, 2026
a09f5c9
test: add comprehensive unit tests for STELLAR_ADDRESS_RE validator
Silver36-ship-it Jul 20, 2026
0fbff07
docs: add table of contents to BACKEND_API_DOCS.md
Silver36-ship-it Jul 20, 2026
97e2b18
docs: convert docs/auth.md reference to markdown link in README.md
Silver36-ship-it Jul 20, 2026
f092a1e
feat: add graceful shutdown handling for SIGTERM/SIGINT (#517)
temisan0x Jul 20, 2026
f434f8e
docs: expand .env.example with inline comments and example values for…
JesseJohn7 Jul 20, 2026
d7a07bf
test: add unit tests for src/utils/response.ts
JesseJohn7 Jul 20, 2026
9cd42f9
Add .editorconfig for consistent formatting across editors
Christopherdominic Jul 20, 2026
c511a1b
Add GET /version endpoint returning package version and commit SHA
Christopherdominic Jul 20, 2026
4b4f970
Add SQLite writability check to the readiness endpoint
Christopherdominic Jul 20, 2026
e0a4d7f
document and enforece
Chigybillionz Jul 20, 2026
a72c2ad
Merge pull request #592 from Chigybillionz/document-and-enforcemento-…
Petah1 Jul 20, 2026
f1ebe12
Merge pull request #591 from Christopherdominic/fix/533-ready-db-writ…
Petah1 Jul 20, 2026
d206857
Merge pull request #590 from Christopherdominic/feat/538-version-endp…
Petah1 Jul 20, 2026
dca7564
Merge pull request #589 from Christopherdominic/feat/544-editorconfig
Petah1 Jul 20, 2026
2a85ebd
Merge pull request #588 from Martins-594/test/response-utils-520
Petah1 Jul 20, 2026
5dd6292
Merge pull request #587 from Martins-594/docs/expand-env-example-525
Petah1 Jul 20, 2026
6f48331
Merge pull request #586 from temisan0x/fix/graceful-shutdown-517
Petah1 Jul 20, 2026
0fcc710
Merge branch 'main' into FixTyposAndBrokenLinksInMarkdown
Petah1 Jul 20, 2026
40f1a5f
Merge pull request #584 from Silver36-ship-it/FixTyposAndBrokenLinksI…
Petah1 Jul 20, 2026
d1c6689
Merge pull request #580 from vj570145-web/test/issue-519-playerid-val…
Petah1 Jul 20, 2026
de77c3f
Add automated restore verification to database backup scripts
miss-yusrah Jul 20, 2026
9c3ef1b
Add runtime feature flags with admin API and saved-searches gating
miss-yusrah Jul 20, 2026
c6e3d4e
Merge pull request #594 from miss-yusrah/feat/auth
Petah1 Jul 20, 2026
a3840db
feat-Implement multi-signature admin action flow with persistent prop…
obswrld Jul 20, 2026
406e049
Implement multi-signature admin action flow with persistent proposals…
obswrld Jul 20, 2026
850db6f
test: add unit test suite for subscription contract (#509)
temisan0x Jul 20, 2026
32b8e5a
Audit and fix slow admin aggregation queries with proper indexes
Chigybillionz Jul 20, 2026
8526f40
Merge upstream main
Chigybillionz Jul 20, 2026
09d3642
fix(ci): resolve ESLint, environment validation, and test suite regre…
Chigybillionz Jul 20, 2026
69b53f1
fix(test): resolve db mock error and prevent flaky timeout in CORS test
Chigybillionz Jul 20, 2026
f65827d
chore: ignore and untrack coverage files
Chigybillionz Jul 20, 2026
8ca6129
fix(ci): pass SQL to sqlite3 CLI via stdin to prevent option parsing …
Chigybillionz Jul 20, 2026
2f130cf
Merge pull request #597 from Chigybillionz/audit-and-fix
Petah1 Jul 20, 2026
4a51e2b
Merge pull request #596 from temisan0x/test/subscription-contract-509
Petah1 Jul 20, 2026
3a4ea22
Merge pull request #595 from obswrld/feat-Implement-multi-signature-c…
Petah1 Jul 20, 2026
24d990f
Add a player profile soft-delete/deactivation endpoint
Chigybillionz Jul 20, 2026
ca0ecca
test/soroban-invariant-property-testing
Wetshakat Jul 20, 2026
314f59e
fix: resolve 3 broken test suites on main
Jul 21, 2026
c07da47
Merge branch 'main' into fix/test-suite-broken-assertions-and-sqlite-…
ShantelPeters Jul 21, 2026
714c70a
audit: confirm SQL parameterization, add injection regression tests
GazzyLee Jul 21, 2026
78634ca
fix lint: replace s any with s unknown as ContractEventType in inje…
GazzyLee Jul 21, 2026
9154f33
Add real DB end-to-end milestone promotion test
GazzyLee Jul 21, 2026
6c08258
Merge remote-tracking branch 'upstream/main' into audit/sql-parameter…
GazzyLee Jul 21, 2026
144fb30
fix pre-existing lint errors from upstream merge: remove unused impor…
GazzyLee Jul 21, 2026
1db6649
fix: correct injection test param names to match actual DB function s…
GazzyLee Jul 21, 2026
e074f74
fix: add missing ADMIN_ACTION_TTL_MS to .env.example for validate-env CI
GazzyLee Jul 21, 2026
185998b
CI: add ADMIN_ACTION_TTL_MS and relax ESLint unused-vars for tests
GazzyLee Jul 21, 2026
92eba3c
fix(lint): use type-only imports in adminController to avoid unused-v…
GazzyLee Jul 21, 2026
d94b166
chore(merge): resolve upstream/main merge conflicts in adminController
GazzyLee Jul 21, 2026
dc17757
fix: remove duplicate imports and use isValidStellarAddress
GazzyLee Jul 21, 2026
e5ec9e3
chore: deduplicate imports in adminController
GazzyLee Jul 21, 2026
0bc84ca
test: remove unused createId import
GazzyLee Jul 21, 2026
44ddf75
Extract isValidEvidenceUri into shared utils/uriValidator
pitah23 Jul 21, 2026
978d1ff
chore: reimplement milestone promotion fix on a fresh upstream branch
GazzyLee Jul 21, 2026
56ec03d
Wire logTrialOffer() to the Soroban log_trial_offer contract call
pitah23 Jul 21, 2026
5a4689e
Add controller-level unit tests for the subscribe handler
pitah23 Jul 21, 2026
bb981d8
Add regression test guarding validateBody import in routes/scout.ts
pitah23 Jul 21, 2026
56dc801
Merge pull request #604 from pitah23/fix/issue-251-subscribe-controll…
Petah1 Jul 21, 2026
e8f4c07
Merge pull request #603 from pitah23/fix/issue-257-wire-log-trial-off…
Petah1 Jul 21, 2026
a96279f
Merge pull request #602 from pitah23/fix/issue-254-import-evidence-ur…
Petah1 Jul 21, 2026
0525b95
Merge pull request #601 from GazzyLee/feature/e2e-milestone-promotion…
Petah1 Jul 21, 2026
4084cd9
Merge branch 'main' into audit/sql-parameterization
Petah1 Jul 21, 2026
2fbe282
Merge pull request #600 from GazzyLee/audit/sql-parameterization
Petah1 Jul 21, 2026
62e043c
Merge pull request #599 from ShantelPeters/fix/test-suite-broken-asse…
Petah1 Jul 21, 2026
a48246f
Merge pull request #598 from Wetshakat/test/soroban-invariant-propert…
Petah1 Jul 21, 2026
8b39aa7
Wire purchaseSubscription() to the Soroban subscribe contract call
pitah23 Jul 21, 2026
cdb6eec
Merge branch 'main' into jsdoc-stellar-service-upstream
GazzyLee Jul 21, 2026
b96f622
Merge pull request #607 from GazzyLee/jsdoc-stellar-service-upstream
Petah1 Jul 21, 2026
e0ae902
Merge branch 'main' into fix/issue-259-wire-purchase-subscription-onc…
pitah23 Jul 21, 2026
1ff18cb
Merge pull request #605 from pitah23/fix/issue-249-validate-body-impo…
Petah1 Jul 21, 2026
b7138b2
Merge pull request #606 from pitah23/fix/issue-259-wire-purchase-subs…
Petah1 Jul 21, 2026
8c33b0e
docs: add PR template mirroring CONTRIBUTING.md checklist
OpadijoIdris Jul 21, 2026
9f4ef9a
docs: add runnable curl examples for every BACKEND_API_DOCS.md endpoint
OpadijoIdris Jul 21, 2026
2336f7d
fix: resolve CI contract compilation, route milestone tests, and lint…
Chigybillionz Jul 21, 2026
519e695
test: verify cache invalidation returns fresh data after player updat…
code-cannot-be-blank Jul 21, 2026
9515135
feat: add load-testing script and documented performance budget (#504)
code-cannot-be-blank Jul 21, 2026
356a6e0
fix(contracts): target-specific dev-dependencies to prevent features …
Chigybillionz Jul 21, 2026
489991e
Merge remote-tracking branch 'upstream/main' into player-profile
Chigybillionz Jul 21, 2026
563374e
feat: add manual OTel spans around IPFS and Stellar RPC calls
OpadijoIdris Jul 21, 2026
4ac1b4e
fix(sanitizer, tests): align sanitizer with upstream main, fix mock v…
Chigybillionz Jul 21, 2026
eb4f909
test(e2e): cover subscribe → unlock-to-contact flow, fix double-charg…
OpadijoIdris Jul 21, 2026
5451c1b
fix: return 415 for missing/incorrect Content-Type on JSON-body routes
OpadijoIdris Jul 21, 2026
95322e4
add code coverage reporting to ci
Chigybillionz Jul 21, 2026
96f3b3e
Merge pull request #615 from Hafgans-oss/fix/issue-536
Petah1 Jul 21, 2026
d5692d8
Merge pull request #613 from Hafgans-oss/fix/issue-505
Petah1 Jul 21, 2026
a24c08b
Merge pull request #614 from Hafgans-oss/feat/issue-507-scout-unlock-…
Petah1 Jul 21, 2026
2617908
Merge pull request #616 from Chigybillionz/code-coverage
Petah1 Jul 21, 2026
26fa024
Merge pull request #612 from code-cannot-be-blank/fix/issue-504-load-…
Petah1 Jul 21, 2026
154e133
Merge pull request #611 from code-cannot-be-blank/fix/issue-498-cache…
Petah1 Jul 21, 2026
88bdca0
Merge pull request #610 from Hafgans-oss/fix/issue-514
Petah1 Jul 21, 2026
8c5ee0f
Merge pull request #609 from Hafgans-oss/fix/issue-543
Petah1 Jul 21, 2026
eaef3df
Wire revoke_validator admin action to the Soroban contract
pitah23 Jul 21, 2026
4fc3f4f
Replace in-memory search cache with a pluggable CacheStore (Redis or …
pitah23 Jul 21, 2026
7b8e9e7
Wire pause_contract() to real Soroban transactions
pitah23 Jul 21, 2026
7727f2c
Mock revokeValidatorOnChain in the validator import e2e test
pitah23 Jul 21, 2026
c984115
Merge branch 'main' into fix/issue-465-redis-cache-backend
Petah1 Jul 21, 2026
98950b0
Merge pull request #619 from pitah23/fix/issue-462-pause-contract-onc…
Petah1 Jul 21, 2026
7772aca
Merge pull request #617 from pitah23/fix/issue-465-redis-cache-backend
Petah1 Jul 21, 2026
4571f3d
Merge branch 'main' into fix/issue-461-revoke-validator-onchain
Petah1 Jul 21, 2026
5178145
Merge pull request #621 from pitah23/fix/issue-461-revoke-validator-o…
Petah1 Jul 21, 2026
a6138d1
Replace stubbed CSV export with a real streaming pipeline (#471)
pitah23 Jul 21, 2026
4809be8
fix(cache): repair botched PR #617 merge, actually wire up pluggable …
pitah23 Jul 21, 2026
d977d00
Merge pull request #618 from pitah23/fix/issue-471-streaming-csv-export
Petah1 Jul 21, 2026
08ed7f5
Sign outbound webhooks with HMAC-SHA256 and dead-letter exhausted del…
pitah23 Jul 21, 2026
50a92f3
Merge pull request #620 from pitah23/fix/issue-470-webhook-hmac-dead-…
Petah1 Jul 21, 2026
56ec8c1
Merge pull request #622 from pitah23/fix/issue-465-redis-cache-followup
Petah1 Jul 21, 2026
11014a8
Replace in-memory audit log with a persistent, hash-chained audit_log…
pitah23 Jul 21, 2026
f60414f
Merge pull request #623 from pitah23/fix/issue-464-persistent-audit-log
Petah1 Jul 21, 2026
414d11b
fix(routes): import missing submitTrialOffer handler
jameshassana221-droid Jul 21, 2026
63632ed
Add regression test guarding stellar.ts module wiring
pitah23 Jul 21, 2026
305431c
Restore revokeValidatorOnChain/ValidatorActionError dropped in a bad …
pitah23 Jul 21, 2026
044e034
Wire withdrawFees() to the Soroban withdraw_fees contract call
pitah23 Jul 21, 2026
715f85c
Wire queryMilestones() to the Soroban get_milestones contract call
pitah23 Jul 21, 2026
531195f
Wire registerValidator admin action to Soroban contract
pitah23 Jul 21, 2026
2964650
Merge pull request #625 from pitah23/fix/issue-252-purchase-subscript…
Petah1 Jul 21, 2026
6d33f84
Merge pull request #629 from pitah23/fix/issue-262-wire-register-vali…
Petah1 Jul 21, 2026
f3a227a
Merge pull request #628 from pitah23/fix/issue-261-wire-query-milesto…
Petah1 Jul 21, 2026
5da3079
Merge branch 'main' into fix/issue-258-wire-withdraw-fees-onchain
Petah1 Jul 21, 2026
8af195d
Merge pull request #627 from pitah23/fix/issue-258-wire-withdraw-fees…
Petah1 Jul 21, 2026
65173ed
Merge branch 'main' into fix/issue-255-typescript-strict-mode
Petah1 Jul 21, 2026
d889665
Merge pull request #626 from pitah23/fix/issue-255-typescript-strict-…
Petah1 Jul 21, 2026
207d581
Merge pull request #624 from jameshassana221-droid/fix/import-submit-…
Petah1 Jul 21, 2026
2f5500f
Wire updateProfile() to the Soroban update_profile contract call
pitah23 Jul 21, 2026
8835377
feat: add SSE real-time event stream for milestone and subscription u…
Anichris-koded Jul 21, 2026
a080f57
feat(subscriptions): wire renewSubscription() to real Soroban contrac…
Cyber-Mitch Jul 21, 2026
195d24f
Merge branch 'main' into feat/sse-event-stream-478
Anichris-koded Jul 21, 2026
3489714
feat: add configurable CORS allowlist per deployment environment (#489)
Killerjunior Jul 22, 2026
486c7eb
Merge pull request #633 from Killerjunior/feat/cors-allowlist-config
Petah1 Jul 22, 2026
8392ecd
Merge pull request #632 from Cyber-Mitch/feat/459-wire-renew-subscrip…
Petah1 Jul 22, 2026
44c3e55
Merge pull request #631 from Anichris-koded/feat/sse-event-stream-478
Petah1 Jul 22, 2026
9976c59
feat: add SQLite-to-PostgreSQL migration path for horizontal scaling …
MooreTheAnalyst Jul 22, 2026
f3acfe3
Merge pull request #634 from MooreTheAnalyst/feature/database-abstrac…
Petah1 Jul 22, 2026
dccd55b
Add Node 18/20/22 version matrix to CI lint/test jobs
pitah23 Jul 23, 2026
db87d36
Add bulk player import endpoint for admins
pitah23 Jul 23, 2026
ee87a33
Add npm audit CI job gating high/critical vulnerabilities
pitah23 Jul 23, 2026
3cb2aca
Merge branch 'main' into fix/issue-501-npm-audit-ci-gate
Petah1 Jul 23, 2026
24fb688
Merge pull request #637 from pitah23/fix/issue-501-npm-audit-ci-gate
Petah1 Jul 23, 2026
233c67a
Merge pull request #636 from pitah23/fix/issue-483-bulk-player-import
Petah1 Jul 23, 2026
bdc1d10
Merge pull request #635 from pitah23/fix/issue-503-node-version-matrix
Petah1 Jul 23, 2026
6e196d0
fix: correct dependency/build ordering in deploy-staging.sh (#697)
gadst12 Jul 24, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 38 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
# Dependencies — reinstalled inside the image
node_modules/

# TypeScript source — only dist/ is needed in the runtime stage
src/

# Test files
tests/
__mocks__/

# Build artifacts already copied by the builder stage
dist/

# Environment secrets — never bake these into the image
.env
.env.*
!.env.example

# Git and CI
.git/
.github/
.claude/

# Dev tooling
.eslintrc.cjs
tsconfig.json

# Docs and scripts (not needed at runtime)
docs/
scripts/
contracts/
db/
*.md

# OS / editor noise
.DS_Store
Thumbs.db
*.log
16 changes: 16 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
root = true

[*]
charset = utf-8
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true
indent_style = space
indent_size = 2

[*.md]
trim_trailing_whitespace = false

[*.{sql,yml,yaml,json}]
indent_style = space
indent_size = 2
249 changes: 237 additions & 12 deletions .env.example
Original file line number Diff line number Diff line change
@@ -1,62 +1,287 @@
# ============================================================
# ScoutOff Backend — Environment Variables
# Copy this file to .env and fill in real values for your setup.
# Never commit .env — only .env.example should be tracked in git.
# ============================================================

# ----------------------------------------
# Stellar / Soroban
# ----------------------------------------
# CONTRACT_ID — Required. Deployed Soroban contract address.
CONTRACT_ID=

# HORIZON_URL — Required. Stellar Horizon RPC endpoint.
HORIZON_URL=https://horizon-testnet.stellar.org

# SOROBAN_RPC_URL — Required. Soroban RPC endpoint for contract calls.
SOROBAN_RPC_URL=https://soroban-testnet.stellar.org

# NETWORK — Required. Which Stellar network to target: "testnet" or "mainnet".
NETWORK=testnet
NETWORK_PASSPHRASE=Test SDF Network ; September 2015

# Runtime
NODE_ENV=development
PORT=4000
# NETWORK_PASSPHRASE — Required. Network passphrase matching NETWORK above.
# Testnet: Test SDF Network ; September 2015
# Mainnet: Public Global Stellar Network ; September 2015
NETWORK_PASSPHRASE=Test SDF Network ; September 2015

# ----------------------------------------
# Auth
JWT_SECRET=change-me-to-a-long-random-secret
# ----------------------------------------
# JWT_SECRET — Required. Minimum 32 characters. Rotate immediately on suspected compromise.
# Generate locally: `openssl rand -hex 32`
JWT_SECRET=change-me-to-a-long-random-secret-min-32-chars

# JWT_SECRET_PREVIOUS — Optional. Used only during key rotation.
# Rotation procedure:
# 1. Copy JWT_SECRET value into JWT_SECRET_PREVIOUS
# 2. Set JWT_SECRET to a new secret (openssl rand -hex 32)
# 3. Deploy — old tokens still work via JWT_SECRET_PREVIOUS
# 4. After all sessions expire, remove JWT_SECRET_PREVIOUS and redeploy
JWT_SECRET_PREVIOUS=

# ADMIN_WALLET — Optional. Single admin Stellar address, for backward compatibility.
# Prefer ADMIN_WALLETS below.
ADMIN_WALLET=

# ADMIN_WALLETS — Optional. Comma-separated admin Stellar addresses.
# Example: GABC123...,GDEF456...
ADMIN_WALLETS=

# ADMIN_THRESHOLD — Optional. Admin signatures required for high-value operations. Default: 1.
ADMIN_THRESHOLD=1

# ----------------------------------------
# IPFS / Pinata
# ----------------------------------------
# PINATA_API_KEY — Required. Pinata IPFS upload credential.
PINATA_API_KEY=

# PINATA_SECRET — Required. Pinata IPFS upload credential — keep private, never commit.
PINATA_SECRET=

# PINATA_GATEWAY — Optional. IPFS gateway used to resolve pinned content.
PINATA_GATEWAY=https://gateway.pinata.cloud

# IPFS_GATEWAYS — Optional. Comma-separated fallback IPFS gateways
# (defaults to Pinata/Cloudflare/ipfs.io when unset).
IPFS_GATEWAYS=

# PIN_JSON_CACHE_TTL_MS — Optional. TTL for IPFS pin dedup cache, in ms. Default: 300000.
PIN_JSON_CACHE_TTL_MS=300000

# ----------------------------------------
# Runtime
# ----------------------------------------
# NODE_ENV — Required. "development", "production", or "test".
NODE_ENV=development

# PORT — Optional. API port. Default: 4000.
PORT=4000

# ----------------------------------------
# Platform
# ----------------------------------------
# PLATFORM_FEE_BPS — Optional. Platform fee in basis points (1 bps = 0.01%). Default: 500 (5%).
PLATFORM_FEE_BPS=500

# PLATFORM_SECRET_KEY — Required in staging/production. Platform signing keypair secret.
# Generate with: stellar keys generate --network testnet
PLATFORM_SECRET_KEY=

# PLATFORM_SECRET — Legacy/deprecated, used by src/utils/contract.ts. Prefer PLATFORM_SECRET_KEY.
PLATFORM_SECRET=

# ----------------------------------------
# Logging
# ----------------------------------------
# LOG_LEVEL — Optional. debug | info | warn | error. Default: info.
LOG_LEVEL=info

# LOG_SKIP_PATHS — Optional. Comma-separated paths requestLogger never logs
# (default: health + metrics probes).
LOG_SKIP_PATHS=/health,/health/liveness,/health/readiness,/ready,/metrics

# LOG_SAMPLE_RATE — Optional. Float 0–1 sample rate for non-skipped paths. Default: 1 (log all).
LOG_SAMPLE_RATE=1

# ----------------------------------------
# Database
# ----------------------------------------
# DB_PATH — Optional. SQLite file path. Default: scout-off.db.
DB_PATH=scout-off.db

# SLOW_QUERY_THRESHOLD_MS — Optional. Log queries slower than this, in ms. Default: 50.
SLOW_QUERY_THRESHOLD_MS=50

# ----------------------------------------
# Security headers (optional overrides)
# ----------------------------------------
SECURITY_HSTS=max-age=31536000; includeSubDomains
SECURITY_X_CONTENT_TYPE_OPTIONS=nosniff
SECURITY_X_FRAME_OPTIONS=DENY
SECURITY_REFERRER_POLICY=no-referrer
SECURITY_CSP=default-src 'none'

# ----------------------------------------
# Feature flags
# ----------------------------------------
# STELLAR_HEALTH_CHECK — Optional. Set false in staging to skip the Stellar RPC health
# check on startup. Default: true.
# ⚠️ VERIFY: DEPLOYMENT.md currently calls this STELLAR_HEALTH_CHECK_ENABLED — confirm
# the actual variable name against the code before merging, then fix whichever file is wrong.
STELLAR_HEALTH_CHECK=true

# JSON_PAYLOAD_LIMIT — Optional. Max size of JSON request bodies. Default: 1mb.
JSON_PAYLOAD_LIMIT=1mb

# COMPRESSION_THRESHOLD — Optional. Response compression threshold, in bytes. Default: 1024.
COMPRESSION_THRESHOLD=1024

# ----------------------------------------
# Caching
# ----------------------------------------
# PLAYER_CACHE_TTL_MS — Optional. Cache TTL for player lookups, in ms. Default: 60000.
PLAYER_CACHE_TTL_MS=60000

# PLAYER_IMPORT_MAX_BATCH — Optional. Max rows accepted per bulk player
# import request (POST /api/admin/players/import). Default: 500.
PLAYER_IMPORT_MAX_BATCH=500

# ----------------------------------------
# CORS
# ----------------------------------------
# CORS_ALLOWED_ORIGINS — Comma-separated list of allowed origins.
# Recommended values per environment:
# development: * (or http://localhost:3000,http://localhost:4000)
# staging: https://staging.scoutoff.io
# production: https://app.scoutoff.io,https://scoutoff.io
# Falls back to environment-specific defaults if unset:
# development/test: *
# staging: https://staging.scoutoff.io
# production: https://app.scoutoff.io,https://scoutoff.io
CORS_ALLOWED_ORIGINS=

# ALLOWED_ORIGINS — Legacy alias for CORS_ALLOWED_ORIGINS.
ALLOWED_ORIGINS=

# ----------------------------------------
# Rate limiting
# ----------------------------------------
# RATE_LIMIT_ENABLED — Optional. Default: true.
RATE_LIMIT_ENABLED=true

# RATE_LIMIT_WINDOW_MS / RATE_LIMIT_MAX — Optional. Defaults: 60000 / 60.
RATE_LIMIT_WINDOW_MS=60000
RATE_LIMIT_MAX=60

# AUTH_RATE_LIMIT_WINDOW_MS / AUTH_RATE_LIMIT_MAX — Optional. Stricter limits on
# /auth/challenge and /auth/token for brute-force protection. Defaults: 60000 / 5.
AUTH_RATE_LIMIT_WINDOW_MS=60000
AUTH_RATE_LIMIT_MAX=5

# ----------------------------------------
# Webhooks
# ----------------------------------------
# WEBHOOK_ENABLED — Optional. Default: false.
WEBHOOK_ENABLED=false

# WEBHOOK_URL — Required if WEBHOOK_ENABLED=true. Destination for webhook events.
# Example: https://example.com/webhooks/scout-off
WEBHOOK_URL=
WEBHOOK_SECRET=

# Security headers
SECURITY_HSTS=max-age=31536000; includeSubDomains
SECURITY_X_CONTENT_TYPE_OPTIONS=nosniff
SECURITY_X_FRAME_OPTIONS=DENY
SECURITY_REFERRER_POLICY=no-referrer
# WEBHOOK_SECRET — Optional. HMAC secret used to sign the X-Webhook-Signature
# header for the legacy single-subscriber webhook (WEBHOOK_URL).
WEBHOOK_SECRET=

# ----------------------------------------
# API versioning
# ----------------------------------------
# API_PREFIX — Optional. Default: /api.
API_PREFIX=/api

# API_V — Optional. Default: v1.
API_V=v1

# ----------------------------------------
# Metrics
# ----------------------------------------
# METRICS_ENABLED — Optional. Expose a /metrics endpoint. Default: false.
METRICS_ENABLED=false

# ----------------------------------------
# Milestone rate limiting
# ----------------------------------------
# MILESTONE_RATE_WINDOW_MS / MILESTONE_RATE_MAX — Optional. Defaults: 60000 / 10.
MILESTONE_RATE_WINDOW_MS=60000
MILESTONE_RATE_MAX=10

# Redis (optional — used for distributed caching)
# ----------------------------------------
# Redis (optional — distributed caching)
# ----------------------------------------
# REDIS_URL — Optional. Falls back to in-memory caching when unset.
# Format: redis://<user>:<password>@<host>:<port>
REDIS_URL=

# ----------------------------------------
# Proxy
TRUSTED_PROXY_COUNT=0
# ----------------------------------------
# TRUSTED_PROXY_COUNT — Optional. Number of trusted reverse-proxy hops in front of
# this server, used to resolve real client IPs.
# ⚠️ VERIFY: DEPLOYMENT.md says default 1; this file currently ships 0 — confirm the
# real default against the code before merging.
TRUSTED_PROXY_COUNT=0

# ----------------------------------------
# Indexer
# ----------------------------------------
# INDEXER_BACKFILL_FROM_LEDGER — Optional. Replay indexing from this ledger if earlier
# than the stored last_ledger. Leave unset to disable.
INDEXER_BACKFILL_FROM_LEDGER=

# INDEXER_LAG_WARN_THRESHOLD — Optional. Ledgers behind tip before a lag warning logs.
# Default: 100.
INDEXER_LAG_WARN_THRESHOLD=100

# ----------------------------------------
# Subscriptions
# ----------------------------------------
# SUBSCRIPTION_GRACE_PERIOD_HOURS — Optional. Grace period after expiry during which
# access is still granted. Default: 24.
SUBSCRIPTION_GRACE_PERIOD_HOURS=24

# ----------------------------------------
# Requests
# ----------------------------------------
# REQUEST_TIMEOUT_MS — Optional. Global request timeout before responding 503.
# Default: 30000.
REQUEST_TIMEOUT_MS=30000

# ----------------------------------------
# Admin
# ----------------------------------------
# ADMIN_IP_ALLOWLIST — Optional. Comma-separated IPs/CIDRs allowed on admin routes.
# Leave unset to allow all.
ADMIN_IP_ALLOWLIST=
# TTL for admin actions (milliseconds). Controls how long admin actions (like multisig approvals)
# remain valid before expiring. Default: 1 hour.
ADMIN_ACTION_TTL_MS=3600000

# ADMIN_ACTION_TTL_MS — Optional. Time-to-live for pending admin multi-sig actions, in ms.
# Default: 3600000 (1 hour).
ADMIN_ACTION_TTL_MS=3600000

# ----------------------------------------
# Tracing (OpenTelemetry)
# ----------------------------------------
# OTEL_EXPORTER_OTLP_ENDPOINT — Optional. Leave unset to disable tracing export.
OTEL_EXPORTER_OTLP_ENDPOINT=

# OTEL_SERVICE_NAME — Optional. Service name reported to the tracing backend.
OTEL_SERVICE_NAME=scout-off-backend

# ----------------------------------------
# System / Build
# ----------------------------------------
# GIT_COMMIT — Optional. Overrides the build commit hash returned by the version endpoint.
GIT_COMMIT=
20 changes: 18 additions & 2 deletions .eslintrc.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,22 @@ module.exports = {
es2021: true
},
rules: {
'@typescript-eslint/no-unused-vars': ['error', { argsIgnorePattern: '^_', varsIgnorePattern: '^_' }]
}
'@typescript-eslint/no-unused-vars': ['error', { argsIgnorePattern: '^_', varsIgnorePattern: '^_' }],
'no-console': 'error'
},
overrides: [
{
files: ['src/utils/logger.ts'],
rules: { 'no-console': 'off' }
}
,
{
// Tests sometimes import helpers or types that are intentionally unused
// during setup; treat unused vars as warnings in tests to avoid CI failures
files: ['tests/**/*.ts'],
rules: {
'@typescript-eslint/no-unused-vars': ['warn', { argsIgnorePattern: '^_', varsIgnorePattern: '^_' }]
}
}
]
};
Loading
Loading