Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
492 commits
Select commit Hold shift + click to select a range
2bbe5e8
Merge branch 'dev' into Implement-invoice-maturity-detection
The-Big-Danny Sep 26, 2026
276d17e
Merge upstream dev into Implement-invoice-maturity-detection
The-Big-Danny Sep 26, 2026
0e5797d
Merge branch 'Implement-invoice-maturity-detection' of https://github…
The-Big-Danny Sep 26, 2026
c9ab367
feat(api): investor ack, deadline extensions, admin metrics, portfoli…
thefadah Sep 26, 2026
2951b28
merge(dev): resolve conflicts for PR #530
Jaydbrown Sep 26, 2026
a935acb
feat: add highest rated keys
ONEONUORA Sep 26, 2026
a00d934
fixed all issues
Benalex8797 Sep 26, 2026
7333469
fix(typecheck): resolve implicit any types in invoice-submission sche…
Sep 26, 2026
58232bc
Merge pull request #525 from Jerry-Tekh/feature/455-investor-portfoli…
TS-mfon Sep 26, 2026
93a415f
feat(onchain): add buy limit, ACL, curve migration and swap read models
LamsOfJos Sep 26, 2026
4249ced
Merge pull request #552 from thefadah/feat/investor-ack-extension-met…
TS-mfon Sep 26, 2026
a794451
Merge branch 'dev' into highest-rated-keys
ONEONUORA Sep 26, 2026
5ce7aed
Merge pull request #553 from ONEONUORA/highest-rated-keys
TS-mfon Sep 26, 2026
23549fe
fix: resolve issues #449, #451, #452, #453
chiomailekuba Sep 25, 2026
ea8c60d
Merge pull request #568 from chiomailekuba/fix/issues-449-451-452-453
TS-mfon Sep 26, 2026
35ffda8
Merge pull request #554 from devmasalati/feat/375-378
TS-mfon Sep 27, 2026
0f1e5ed
Merge branch 'dev' into fixes/SS-backend-buy-limit-ACL-curve-migratio…
LamsOfJos Sep 27, 2026
5772570
Merge pull request #555 from LamsOfJos/fixes/SS-backend-buy-limit-ACL…
TS-mfon Sep 27, 2026
10cdf4f
feat: add secondary market, watchlist, KYC history and settlement worker
johnsmccain Sep 27, 2026
4f52a61
chore: fix pre-existing lint errors blocking commit hook and CI
johnsmccain Sep 27, 2026
224dba6
Merge pull request #569 from johnsmccain/feat/secondary-market-watchl…
TS-mfon Sep 27, 2026
986832e
feat: on-chain read models for royalties, dividends, subscriptions an…
CeceOs92 Sep 27, 2026
39e0e8c
Merge branch 'dev' into feat/onchain-royalty-dividend-subscription-re…
CeceOs92 Sep 27, 2026
1532064
fix: update invoice analytics authorization error code to FORBIDDEN (…
Sep 27, 2026
99540aa
test: add integration tests for issue #186 seller invoice analytics a…
Sep 27, 2026
abc6256
feat: add marketplace indexes migration for issue #144
Sep 27, 2026
4edc7ef
Merge pull request #571 from CeceOs92/feat/onchain-royalty-dividend-s…
TS-mfon Sep 28, 2026
d844b0b
feat(admin): add settlement endpoint for invoice repayment and invest…
Sep 25, 2026
37b2ed4
fix: resolve CI failures for admin settlement endpoint
Sep 25, 2026
3d6a427
fix: remove duplicate index on InvestorPayout.status
Sep 25, 2026
33805ba
fix(lint): resolve @typescript-eslint/no-explicit-any in admin-auth a…
Sep 26, 2026
abc571f
chore: trigger CI for admin settlement endpoint
Sep 26, 2026
b282256
chore: retrigger CI for admin settlement endpoint
Sep 26, 2026
342d6f6
fix(lint): remove unused imports and constants
Sep 28, 2026
df0ccda
chore: trigger CI
Sep 28, 2026
18196df
fix: resolve merge conflicts, unused imports, and type issues for CI
Sep 28, 2026
ca99d2f
fix: ipfs Buffer to Blob conversion for TypeScript compatibility
Sep 28, 2026
e2bfad2
Merge remote-tracking branch 'upstream/dev' into issue-144-marketplac…
Sep 28, 2026
f0d6143
fix: update tests for KycHistory, marketplace, mock dataSource, and a…
Sep 28, 2026
a59af52
fix: add SecondaryListing entity and mock InvestorAcknowledgement for…
Sep 28, 2026
5f017f2
Merge pull request #522 from Jerry-Tekh/feature/454-admin-settlement-…
TS-mfon Sep 29, 2026
d0d1d32
Merge pull request #509 from The-Big-Danny/Implement-batch-notification
TS-mfon Sep 29, 2026
bb5a59d
Merge branch 'dev' into Add-full-text-search
The-Big-Danny Sep 29, 2026
6f2667b
Merge branch 'dev' into Create-admin-user
The-Big-Danny Sep 29, 2026
e1dac98
Merge branch 'dev' into Implement-invoice-maturity-detection
The-Big-Danny Sep 29, 2026
c8cf282
Merge pull request #530 from stephanieefeakpokrire-droid/fix/issues-3…
TS-mfon Sep 29, 2026
ce4017d
Merge remote-tracking branch 'upstream/dev' into issue-186-seller-ana…
Sep 29, 2026
f3d553c
fix(types): remove duplicate INVOICE_DEADLINE_EXTENDED enum member
Sep 29, 2026
2085ec9
fix(app): wire the service projections that createApp already destruc…
Sep 29, 2026
375177f
test(investment): mock the terms-acknowledgement repository
Sep 29, 2026
228e4e5
test(investment): stub the terms-acknowledgement lookup in fake data …
Sep 29, 2026
3dddf60
fix(bootstrap): wire the onboarding service and drop the duplicate en…
Sep 29, 2026
0ab89e8
Merge remote-tracking branch 'upstream/dev' into dev
Ultra-Tech-code Sep 29, 2026
738f062
feat: add admin invoice review endpoints and enforce errors
Ultra-Tech-code Sep 29, 2026
c0cf025
test(entities): register the full User relation set and fix stale mocks
Sep 29, 2026
8ecdd61
Merge pull request #501 from Ultra-Tech-code/dev
TS-mfon Sep 29, 2026
57da643
test(entities): register the full User relation set and fix stale mocks
Sep 29, 2026
61efbc3
Merge remote-tracking branch 'upstream/dev' into issue-186-seller-ana…
Sep 29, 2026
6478074
fix(admin): align review routes with current service and pagination APIs
Sep 29, 2026
e3201e6
Merge remote-tracking branch 'upstream/dev' into issue-144-marketplac…
Sep 29, 2026
2fde09a
test(settlement): harden integration coverage for #371
emynogithub Sep 29, 2026
a449be7
fix(ci): merge dev and align admin review routes with current service…
Sep 30, 2026
e621f15
test(invoice): streamline error case coverage for #372
emynogithub Sep 30, 2026
ca0b87c
test(invoice): cover bounded listing and failure handling for #373
emynogithub Sep 30, 2026
6ed681b
test(e2e): restore environment after full flow for #374
emynogithub Sep 30, 2026
5c42ce3
Merge pull request #557 from Tekh134/issue-186-seller-analytics-acces…
TS-mfon Sep 30, 2026
a10a643
fix(tests): register missing entities, seed investor acknowledgement,…
Sep 30, 2026
29a0cbe
fix: merge dev and preserve ServiceError codes in the token holders h…
Sep 30, 2026
c6eb020
Merge pull request #556 from Tekh134/issue-144-marketplace-indexes
TS-mfon Sep 30, 2026
34525f2
Merge branch 'Add-full-text-search' into Implement-invoice-maturity-d…
The-Big-Danny Oct 1, 2026
2c83210
Merge branch 'Create-admin-user' into Implement-invoice-maturity-dete…
The-Big-Danny Oct 1, 2026
6924d0a
Merge branch 'dev' into Implement-invoice-maturity-detection
The-Big-Danny Oct 1, 2026
9d8e467
fix(tests): register missing entities in full-text search integration…
The-Big-Danny Oct 1, 2026
03eb0e7
Merge pull request #507 from The-Big-Danny/Implement-invoice-maturity…
TS-mfon Oct 1, 2026
7274618
Merge branch 'dev' into fix/issue-394-auth-middleware to resolve CI t…
Stephan-Thomas Oct 1, 2026
36e1daa
Merge branch 'dev' into fix/issue-393-contract-pause-guard to resolve…
Stephan-Thomas Oct 1, 2026
25c3d3c
Merge branch 'dev' into feat/issue-481-invoice-document-proxy
Stephan-Thomas Oct 2, 2026
325d3ce
Merge branch 'StellarState:dev' into feat/486-health-readiness
uche102 Oct 2, 2026
0956c3c
Merge branch 'dev' into feat/485-soroban-event-indexer
uche102 Oct 2, 2026
ce6a33a
Merge branch 'dev' into feat/232-structured-funding-logs
frank0277 Oct 2, 2026
9a5099a
Merge branch 'dev' into feat/236-soroban-error-mapper
frank0277 Oct 2, 2026
e9ba5c4
Merge pull request #521 from Stephan-Thomas/fix/issue-393-contract-pa…
TS-mfon Oct 2, 2026
0a0fe4d
Merge pull request #523 from Stephan-Thomas/fix/issue-394-auth-middle…
TS-mfon Oct 2, 2026
7d1605b
Merge pull request #536 from uche102/feat/486-health-readiness
TS-mfon Oct 2, 2026
f31f4bf
Merge pull request #262 from frank0277/feat/236-soroban-error-mapper
TS-mfon Oct 2, 2026
600e0f9
Merge pull request #261 from frank0277/feat/232-structured-funding-logs
TS-mfon Oct 2, 2026
dfd5763
perf(middleware): optimize contract pause guard logic
Stephan-Thomas Sep 25, 2026
d043cb0
feat: add readiness health probe
uche102 Sep 26, 2026
07d393c
test: fix IPFS mock config TS type errors
Stephan-Thomas Oct 2, 2026
ae63a85
Merge upstream/dev into test/360-361-362-363-invoice-jwt-test-hardening
Emeka-12 Oct 2, 2026
96ab02c
Merge branch 'dev' into perf/391-contract-pause-guard
uche102 Oct 3, 2026
ed4643e
Merge pull request #533 from uche102/fix/392-rate-limit-hardening
TS-mfon Oct 3, 2026
ab0f490
fix(indexer): resolve merge conflicts in soroban event indexer config…
frank0277 Oct 3, 2026
58e341f
Merge pull request #535 from uche102/perf/391-contract-pause-guard
TS-mfon Oct 3, 2026
bd0a23b
Merge pull request #527 from Stephan-Thomas/feat/issue-481-invoice-do…
TS-mfon Oct 3, 2026
bcb7c40
Merge pull request #532 from uche102/feat/485-soroban-event-indexer
TS-mfon Oct 3, 2026
ea1e186
Merge pull request #573 from emynogithub/test/settlement-integration-…
TS-mfon Oct 4, 2026
f2a6a0a
Merge pull request #574 from emynogithub/test/invoice-service-hardeni…
TS-mfon Oct 4, 2026
891fa38
Merge pull request #575 from emynogithub/test/invoice-service-hardeni…
TS-mfon Oct 4, 2026
ed225e6
Merge branch 'dev' into test/360-361-362-363-invoice-jwt-test-hardening
Emeka-12 Oct 5, 2026
43bf1fd
Merge pull request #502 from Emeka-12/test/360-361-362-363-invoice-jw…
TS-mfon Oct 5, 2026
0660065
Merge pull request #576 from emynogithub/test/full-flow-e2e-hardening…
TS-mfon Oct 6, 2026
e597ed2
fix(tests): repair broken duplicate-invoice-number test syntax
Oct 16, 2026
63f92a9
fix(tests): repair broken brace balance in invoice.service.test.ts
Oct 16, 2026
cde7d31
fix(tests): resolve remaining type errors blocking CI
Oct 16, 2026
2916324
fix(tests): remove nested it() in repository error handling
Oct 16, 2026
096f6f5
refactor(auth): optimize auth service with caching and concurrency
dee-john Oct 16, 2026
d1cfe2d
feat(logger): add withTimedLogging helper for operation duration trac…
Oct 16, 2026
462c664
feat(e2e): add timing and structured logging to full-flow test harness
Oct 16, 2026
43c1710
docs(readme): document invoice draft management API
Oct 16, 2026
ab64068
fix(invoice): restrict invoice deletion to draft state only
Oct 16, 2026
df2283d
Merge pull request #582 from Tekh134/fix/combined-413-367-412-565
TS-mfon Oct 16, 2026
60add92
feat: add invoice reports referrals and waitlist APIs
Obiajulu-gif Oct 16, 2026
f76d6d5
fix: expire invoices at their funding deadline
Obiajulu-gif Oct 16, 2026
9ed14d6
feat(db): add Soroban escrow fields migration and Invoice model updat…
TheHalalHunter Oct 16, 2026
c658885
feat: implement fee schedule, reputation, risk profiles, and invoice …
johnsmccain Oct 17, 2026
32968e2
feat: implement investor accreditation, refund, and price history fea…
Big-JoshCode Oct 17, 2026
82224ce
refactor(services): optimize and harden invoice.service.ts (#304)
TheHalalHunter Oct 17, 2026
7d34bfa
refactor(services): optimize and harden invoice-escrow-contract.servi…
TheHalalHunter Oct 17, 2026
280aa36
feat: add KYC notification triggers and missing NotificationType values
TheHalalHunter Oct 17, 2026
4836c5a
feat: add secondary market sold notification trigger
TheHalalHunter Oct 17, 2026
34d35c8
fix: address review findings for notification service (issue #564)
TheHalalHunter Oct 17, 2026
098cc26
fix(enums): restore KYC_STATUS_CHANGE to NotificationType (issue #564)
TheHalalHunter Oct 17, 2026
47b4c5a
Merge pull request #635 from Johnsmichael150/dev
TS-mfon Oct 17, 2026
e4f7416
Merge branch 'feature/optimize-invoice-service' into feature/issues-1…
TheHalalHunter Oct 17, 2026
fc51373
Merge branch 'feature/optimize-invoice-escrow-contract-service' into …
TheHalalHunter Oct 17, 2026
788b58c
Merge pull request #636 from Big-JoshCode/feat/investor-features-batch-1
TS-mfon Oct 17, 2026
bab511c
Merge pull request #641 from TheHalalHunter/feature/issues-142-304-30…
TS-mfon Oct 17, 2026
effc3dc
feat(keys): track key merge proposals with vote tallies and status
dee-john Oct 17, 2026
602a5fb
Merge branch 'dev' into feat/auth-service-optimization
dee-john Oct 17, 2026
30c7ad0
Merge branch 'dev' into feat/key-merge-proposals
dee-john Oct 17, 2026
de29b39
feat(subscriptions): implement key-based subscription expiry notifica…
dee-john Oct 17, 2026
63b527f
Merge branch 'dev' into feat/subscription-expiry-notifications
dee-john Oct 17, 2026
292d95a
docs: add Redis caching layer reference for #461
Big-JoshCode Oct 17, 2026
986389d
Merge pull request #645 from Big-JoshCode/feat/redis-caching-461
TS-mfon Oct 17, 2026
4f71c78
Fix #566,567,586,598
Smartdevs17 Oct 17, 2026
5f1b3ae
Fix #607,608,610,611
Smartdevs17 Oct 17, 2026
86a4708
fix: resolve TypeScript compilation and lint errors from upstream merge
dee-john Oct 17, 2026
ea9d189
fix: resolve TypeScript compilation and lint errors from upstream merge
dee-john Oct 17, 2026
72ddc8d
fix: compare invoice due dates against end-of-day, not midnight
The-Big-Danny Oct 17, 2026
ab4a040
fix: route invoice submission through InvoiceService state machine
The-Big-Danny Oct 17, 2026
a9ef04e
fix: resolve TypeScript compilation and lint errors from upstream merge
dee-john Oct 17, 2026
2e76441
fix: reject investments after an invoice's funding deadline passes
The-Big-Danny Oct 17, 2026
f323c8f
fix: index all deployed Soroban contracts, not just the escrow contract
The-Big-Danny Oct 17, 2026
4cc9ffa
fix: resolve pre-existing build/lint/test failures blocking CI
The-Big-Danny Oct 17, 2026
4a4d9df
fix(tests): resolve SQLite entity metadata and token generation for i…
dee-john Oct 17, 2026
1962dc7
fix(tests): resolve SQLite entity metadata and token generation for i…
dee-john Oct 17, 2026
33e545f
fix(tests): resolve SQLite entity metadata and token generation for i…
dee-john Oct 17, 2026
cdcaf32
Merge pull request #653 from The-Big-Danny/fix/invoice-investment-fix…
TS-mfon Oct 17, 2026
e6f636e
Merge branch 'dev' into feat/auth-service-optimization
dee-john Oct 17, 2026
baa9674
Merge branch 'dev' into feat/key-merge-proposals
dee-john Oct 17, 2026
b9cf28e
Merge branch 'dev' into feat/subscription-expiry-notifications
dee-john Oct 17, 2026
e4418f6
Merge pull request #581 from dee-john/feat/auth-service-optimization
TS-mfon Oct 17, 2026
de94ada
Merge pull request #642 from dee-john/feat/key-merge-proposals
TS-mfon Oct 17, 2026
f1824c0
Merge pull request #643 from dee-john/feat/subscription-expiry-notifi…
TS-mfon Oct 17, 2026
183a769
Merge pull request #651 from Smartdevs17/drips/fix-566-multi4
TS-mfon Oct 17, 2026
c03cc02
Merge dev into PR #650 branch - resolve conflicts
Big-JoshCode Oct 17, 2026
8eff04c
Merge pull request #654 from maikNeta/feat/issues-587-588-589-596-ana…
TS-mfon Oct 17, 2026
a6e7dfc
fix(api): restore a clean type check and build
dotmantissa Oct 18, 2026
9f249c6
fix(settlement): allow system actor to settle matured invoices
dotmantissa Oct 18, 2026
c735d5b
fix(migrations): run enum changes outside a transaction
dotmantissa Oct 18, 2026
5b8d92e
fix(cache): bound the in-process ttl cache
dotmantissa Oct 18, 2026
28bd0f9
chore: merge baseline api type check fixes
dotmantissa Oct 18, 2026
99628cc
chore: merge system actor settlement fix
dotmantissa Oct 18, 2026
f9cb000
chore: merge enum migration transaction fix
dotmantissa Oct 18, 2026
69b4d1a
chore: merge bounded ttl cache fix
dotmantissa Oct 18, 2026
6e16ae4
docs(openapi): document the investor, portfolio, seller and readiness…
dotmantissa Oct 18, 2026
c1ebce4
Merge pull request #656 from dotmantissa/fix/issues-628-632-633
TS-mfon Oct 18, 2026
4fae54c
Merge branch 'dev' into obiajulu/ss-backend-583-584-585-590
Obiajulu-gif Oct 18, 2026
8dde08d
Merge pull request #604 from Obiajulu-gif/obiajulu/ss-backend-583-584…
TS-mfon Oct 18, 2026
886ff78
feat: add order book depth, fx indexer, investor scoring, and announc…
Omoboi-dev Oct 18, 2026
135d77a
feat(api): implement endpoints and tests for orderbook, fx rates, sco…
Omoboi-dev Oct 18, 2026
2f89c19
fix: restrict jwt algorithms to hs256 and add notification, session a…
Pro-builder Oct 18, 2026
1fa4e79
Merge pull request #666 from Pro-builder/fix/jwt-hardening-and-servic…
TS-mfon Oct 18, 2026
e8903b6
Merge pull request #665 from Omoboi-dev/feat/batch-664-663-660-661
TS-mfon Oct 18, 2026
d0c8841
fix: address security vulnerabilities and implement waitlist management
Akanimoh12 Oct 18, 2026
34b7770
Merge pull request #667 from Akanimoh12/fix/security-and-waitlist-606…
TS-mfon Oct 18, 2026
9417d28
fix: prevent over-listing seller holdings
uche102 Oct 18, 2026
93d37af
fix: transfer holdings on secondary listing purchase
uche102 Oct 18, 2026
9fc8199
fix: persist settlement payout intents
uche102 Oct 18, 2026
ed8c626
chore(615): fix Stellar SDK typings
uche102 Oct 19, 2026
2ec1a48
fix(615): remove SDK migration lint errors
uche102 Oct 19, 2026
04c1d81
Merge branch 'dev' into fix/616-settlement-payout-intent
uche102 Oct 19, 2026
166486c
Merge branch 'dev' into fix/620-secondary-market-ownership-transfer
uche102 Oct 19, 2026
a30d4d0
Merge branch 'dev' into chore/615-fix-ts-imports
uche102 Oct 19, 2026
023fec1
Merge commit '34b7770c6113479482c9c52b19879575222be3c8' into fix/621-…
uche102 Oct 19, 2026
9ddc6aa
fix(ci): unblock PR 671 checks
uche102 Oct 19, 2026
720ef2f
Add minimal read views over indexed syndicate/risk/loyalty/pool events
gboigwe Oct 19, 2026
050d091
Cap result size and validate wallet format per security review
gboigwe Oct 19, 2026
97fa123
Merge pull request #692 from gboigwe/feat/672-673-674-675-onchain-eve…
TS-mfon Oct 19, 2026
c6657ce
feat: contract event indexers and REST APIs for benchmarks, referrals…
oldtaker24 Oct 19, 2026
52c5549
Merge pull request #693 from oldtaker24/fix/issues-676-677-678-679
TS-mfon Oct 19, 2026
2b0e9bf
feat(#680): add invoice insurance indexer and policy status REST API
franciscodes-ops Oct 19, 2026
0e6e36e
feat(#681): add invoice extension proposal indexer and vote tracking …
franciscodes-ops Oct 19, 2026
bdf2589
feat(#682): add platform upgrade registry REST API for contract versi…
franciscodes-ops Oct 19, 2026
27c5e46
feat(#685): add issuer blacklist indexer and status REST API
franciscodes-ops Oct 19, 2026
1f8eadf
Merge pull request #695 from franciscodes-ops/feat/issues-680-685
TS-mfon Oct 19, 2026
79dad50
feat: invoice rating indexer, pool rebalance indexer, bulk cancellati…
ogundelevictory Oct 19, 2026
20c0232
Merge branch 'dev' into fix/621-secondary-market-overlisting
uche102 Oct 20, 2026
4716110
fix(ci): resolve admin route auth test failures
uche102 Oct 20, 2026
821ca33
fix(ci): resolve admin route auth test failures
uche102 Oct 20, 2026
8e49b62
fix(ci): resolve admin route auth test failures
uche102 Oct 20, 2026
f87be92
fix(ci): resolve admin route auth test failures
uche102 Oct 20, 2026
dfa89fd
fix(ci): resolve shared CI failures
uche102 Oct 20, 2026
09bcc41
Merge remote-tracking branch 'upstream/dev' into ci-fix-615
uche102 Oct 20, 2026
118f81e
fix(ci): resolve shared CI failures
uche102 Oct 20, 2026
cd69fbb
Merge remote-tracking branch 'upstream/dev' into ci-fix-616
uche102 Oct 20, 2026
bac919c
Merge remote-tracking branch 'upstream/dev' into ci-fix-620
uche102 Oct 20, 2026
a89166d
fix(ci): resolve shared CI failures
uche102 Oct 20, 2026
2f30fd1
fix(ci): resolve shared CI failures
uche102 Oct 20, 2026
d9644a5
Merge pull request #696 from ogundelevictory/feat/rating-rebalance-bu…
TS-mfon Oct 20, 2026
4fe7bd5
fix(ci): finish CI compatibility fixes
uche102 Oct 20, 2026
0d807fa
fix(ci): finish CI compatibility fixes
uche102 Oct 20, 2026
3f7fcf9
fix(ci): finish CI compatibility fixes
uche102 Oct 20, 2026
d6025a9
Merge commit 'd9644a5a326a75689be8354b2ce323a931a0e800' into ci-fix-620
uche102 Oct 20, 2026
282734f
Merge commit 'd9644a5a326a75689be8354b2ce323a931a0e800' into ci-fix-615
uche102 Oct 20, 2026
d4b7199
Merge commit 'd9644a5a326a75689be8354b2ce323a931a0e800' into ci-fix-616
uche102 Oct 20, 2026
dc21bbb
fix(ci): resolve current dev type errors
uche102 Oct 20, 2026
ebba9a9
fix(ci): resolve current dev type errors
uche102 Oct 20, 2026
e6b6f47
fix(ci): resolve current dev type errors
uche102 Oct 20, 2026
4b1ebbf
Merge pull request #652 from Smartdevs17/drips/fix-607-multi4
TS-mfon Oct 21, 2026
1a0ba85
Merge pull request #671 from uche102/fix/621-secondary-market-overlis…
TS-mfon Oct 22, 2026
3d45f62
fix: resolve analytics volume, fee cache race, quote asset, and snapshot
dee-john Oct 22, 2026
76590cd
ci: add malware scan workflow (PolinRider / Drips Wave indicators)
TS-mfon Oct 22, 2026
f1db418
fix(kyc): remove requireSeller from document submission endpoints
Stephan-Thomas Oct 22, 2026
43c3a27
Merge pull request #718 from Johnjnr1/fix/analytics-and-platform-fixes
TS-mfon Oct 22, 2026
d6e3f5e
Merge branch 'dev' into fix/616-settlement-payout-intent
uche102 Oct 24, 2026
0cf5feb
Merge branch 'dev' into fix/620-secondary-market-ownership-transfer
uche102 Oct 24, 2026
0d70de9
Merge branch 'dev' into chore/615-fix-ts-imports
uche102 Oct 24, 2026
064ed53
fix: normalize Horizon transaction responses (#259)
zeemscript Aug 27, 2026
5d3d2ad
Merge branch 'dev' into feat/investor-onboarding-yield-alert-indexing
frank0277 Oct 24, 2026
0b3f257
fix: resolve stale lockfile and merge regressions
uche102 Oct 24, 2026
78157e9
fix: repair CI regressions across merged branches
uche102 Oct 24, 2026
b8c014f
fix: repair CI regressions across merged branches
uche102 Oct 24, 2026
de4849b
fix: repair CI regressions across merged branches
uche102 Oct 24, 2026
0749764
fix: drop unused typeorm import
uche102 Oct 24, 2026
9e50b67
Merge pull request #725 from frank0277/feat/investor-onboarding-yield…
TS-mfon Oct 24, 2026
8afbc24
Merge pull request #670 from uche102/fix/616-settlement-payout-intent
TS-mfon Oct 24, 2026
9025832
Merge branch 'dev' into fix/620-secondary-market-ownership-transfer
uche102 Oct 24, 2026
09428f8
Merge branch 'dev' into chore/615-fix-ts-imports
uche102 Oct 24, 2026
d11696c
fix: sync lockfile with merged dependencies
uche102 Oct 24, 2026
101a0e8
ci: serialize database integration tests
uche102 Oct 24, 2026
b8307ce
Merge pull request #669 from uche102/fix/620-secondary-market-ownersh…
TS-mfon Oct 24, 2026
6ac16d7
Merge pull request #668 from uche102/chore/615-fix-ts-imports
TS-mfon Oct 24, 2026
3d8e052
fix(ci): resolve openapi schema drift and update commitlint config
Stephan-Thomas Oct 25, 2026
087931a
fix(migrations): fix migration timestamps to run after initial schema
Stephan-Thomas Oct 25, 2026
45bbb57
fix(migrations): remove duplicated columns from initial schema
Stephan-Thomas Oct 25, 2026
d611f1b
fix(migrations): resolve duplicate soroban checkpoint migration conflict
Stephan-Thomas Oct 26, 2026
aa7aaaf
fix(migrations): ensure key_address and ratings columns exist on crea…
Stephan-Thomas Oct 26, 2026
af67b64
fix(migrations): replace invalid exclude syntax with partial unique i…
Stephan-Thomas Oct 26, 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
  •  
  •  
  •  
28 changes: 28 additions & 0 deletions .agents/tasks/task-notification-service-564/features/FEAT-001.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
{
"id": "FEAT-001",
"type": "feat",
"description": "Add missing NotificationType enum values and wire KYC status-change notifications. Adds KYC_STATUS_CHANGE and SECONDARY_MARKET_SOLD to the enum in src/types/enums.ts, then adds an optional notificationService dependency to KycService and fires createNotification after processWebhook commits a status change. Independent of FEAT-002.",
"status": "completed",
"steps": [
"1. In src/types/enums.ts, append two entries to the NotificationType enum: KYC_STATUS_CHANGE = 'kyc_status_change' and SECONDARY_MARKET_SOLD = 'secondary_market_sold'.",
"2. In src/services/kyc.service.ts, add two imports at the top: `import { NotificationService } from './notification.service'` (type-only is fine) and add NotificationType to the existing enums import from '../types/enums'.",
"3. In KycService constructor signature, add a fourth optional parameter: `private readonly notificationService?: NotificationService`. Constructor is: `constructor(private readonly dataSource: DataSource, private readonly webhookSecret: string, private readonly appLogger: AppLogger = logger, private readonly notificationService?: NotificationService)`.",
"4. In KycService.processWebhook(), after the `await this.dataSource.transaction(...)` call completes (but before the method returns), add a try/catch block that calls this.notificationService?.createNotification(payload.userId, notifType, title, message, { status: payload.status, reason: payload.reason ?? null }). Map KYCStatus.APPROVED → NotificationType.KYC_APPROVED with title 'KYC Approved' and message 'Your identity verification has been approved.'. Map KYCStatus.REJECTED → NotificationType.KYC_REJECTED with title 'KYC Status Updated' and message `Your KYC status has changed to ${payload.status}.`. Catch any error and call this.appLogger.warn('kyc.notification.failed', { user_id: payload.userId, error: ... }) — never rethrow.",
"5. In src/index.ts, update the KycService constructor call from `new KycService(dataSource, config.kyc.webhookSecret ?? '', logger)` to `new KycService(dataSource, config.kyc.webhookSecret ?? '', logger, notificationService)`. The notificationService variable is already defined earlier in bootstrap()."
],
"acceptance_criteria": [
"src/types/enums.ts compiles and exports KYC_STATUS_CHANGE and SECONDARY_MARKET_SOLD values.",
"KycService constructor accepts an optional fourth parameter of type NotificationService.",
"After processWebhook commits, if notificationService is provided, createNotification is called with the user's id, the correct type (KYC_APPROVED or KYC_REJECTED), and appropriate title/message.",
"If createNotification throws, processWebhook still returns successfully and logs a warn.",
"All existing KYC tests pass without modification: `npx jest --testPathPattern kyc`.",
"npm run type-check passes with no errors."
],
"verification": [
"npm run type-check — must produce zero TypeScript errors",
"npx jest --testPathPattern kyc --forceExit — all existing KYC tests pass",
"npx jest --testPathPattern notification --forceExit — existing notification tests still pass"
],
"blocked_reason": null,
"findings": "NotificationType enum now has KYC_STATUS_CHANGE and SECONDARY_MARKET_SOLD values. KycService constructor accepts optional fourth param notificationService?: NotificationService and fires createNotification after processWebhook commits. src/index.ts passes notificationService to KycService. Pre-existing failure in tests/notifications-endpoint.test.ts (SQLite3 package not installed in env) is unrelated to these changes and was failing before. FEAT-002 can rely on KYC_STATUS_CHANGE and SECONDARY_MARKET_SOLD being present in the enum."
}
28 changes: 28 additions & 0 deletions .agents/tasks/task-notification-service-564/features/FEAT-002.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
{
"id": "FEAT-002",
"type": "feat",
"description": "Wire secondary-market sold notifications into SecondaryMarketService. Adds optional notificationService dependency to SecondaryMarketService and its factory, calls createNotification with SECONDARY_MARKET_SOLD after a listing is fully sold in buyListing(), and passes notificationService in src/index.ts. Depends on FEAT-001 (SECONDARY_MARKET_SOLD enum value must exist first).",
"status": "completed",
"steps": [
"1. In src/services/secondary-market.service.ts, add a type import for NotificationService: `import type { NotificationService } from './notification.service'` and add NotificationType, ListingStatus to the existing enums import from '../types/enums' (ListingStatus is already imported — just ensure NotificationType is also imported).",
"2. In the SecondaryMarketService constructor, add an optional second parameter: `constructor(private readonly dataSource: DataSource, private readonly notificationService?: NotificationService)`.",
"3. In SecondaryMarketService.buyListing(), the method returns inside a `this.dataSource.transaction(...)` callback. To notify after the transaction, change the approach: capture the result of the transaction in a local variable, then fire the notification after the transaction resolves. Specifically: store the transaction result (keep existing BuyListingResult shape intact) and also track `soldListingId`, `soldSellerId`, and a `wasSold` boolean from inside the transaction callback. After `await this.dataSource.transaction(...)` resolves, if wasSold and this.notificationService is defined, call createNotification in a try/catch. Use `soldSellerId ?? soldListing.sellerWallet` as the userId (SecondaryListing.sellerId is the TypeORM User FK, nullable; sellerWallet is always present). Use NotificationType.SECONDARY_MARKET_SOLD, title 'Listing Sold', message 'Your listing for an invoice fraction has been fully purchased.', data { listingId, buyerWallet, quantity, totalPrice }. Catch any error and call logger.warn('secondary.notification.failed', { listing_id, error }).",
"4. In the factory function createSecondaryMarketService at the bottom of the file, update its signature to accept an optional second parameter and forward it: `export function createSecondaryMarketService(dataSource: DataSource, notificationService?: NotificationService): SecondaryMarketService { return new SecondaryMarketService(dataSource, notificationService); }`",
"5. In src/index.ts, update the factory call from `createSecondaryMarketService(dataSource)` to `createSecondaryMarketService(dataSource, notificationService)`."
],
"acceptance_criteria": [
"SecondaryMarketService constructor accepts optional second parameter of type NotificationService.",
"After buyListing() fully sells a listing (sets status to ListingStatus.SOLD), createNotification is called with the seller's userId, SECONDARY_MARKET_SOLD type, and metadata.",
"If createNotification throws, buyListing still returns the BuyListingResult successfully.",
"Partial sales (quantity < listing.quantity) do NOT trigger a notification.",
"All existing secondary market tests pass without modification.",
"npm run type-check passes with no errors."
],
"verification": [
"npm run type-check — must produce zero TypeScript errors",
"npx jest --testPathPattern secondary-market --forceExit — all existing secondary market tests pass",
"npm run test:ci — full suite passes with no regressions"
],
"blocked_reason": null,
"findings": "All 5 steps implemented. NotificationType and NotificationService import added to secondary-market.service.ts. SecondaryMarketService constructor updated with optional notificationService param. buyListing() refactored to capture sold state variables from within the transaction and fire createNotification after the transaction resolves. Notification is wrapped in try/catch and logs warnings on failure. Factory function updated to accept and forward notificationService. src/index.ts updated to pass notificationService to createSecondaryMarketService. Type-check passes with zero errors. Pre-existing CI failures (24 test suites) are unrelated to this change — all caused by a zod v4 module resolution issue."
}
53 changes: 51 additions & 2 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,32 @@ CORS_ALLOW_CREDENTIALS=true
HTTP_BODY_SIZE_LIMIT=1mb
HTTP_SHUTDOWN_TIMEOUT_MS=15000

# Rate Limiting
# Redis
REDIS_URL=redis://localhost:6379

# Rate Limiting (Global and Sensitive Endpoints)
RATE_LIMIT_ENABLED=true
RATE_LIMIT_WINDOW_MS=60000
RATE_LIMIT_MAX=100

# Rate Limiting - Auth Endpoints (per-IP and per-wallet)
RATE_LIMIT_AUTH_IP_WINDOW_MS=60000
RATE_LIMIT_AUTH_IP_MAX=20
RATE_LIMIT_AUTH_WALLET_WINDOW_MS=60000
RATE_LIMIT_AUTH_WALLET_MAX=10

# Rate Limiting - Invest Endpoints (per-IP and per-wallet)
RATE_LIMIT_INVEST_IP_WINDOW_MS=60000
RATE_LIMIT_INVEST_IP_MAX=30
RATE_LIMIT_INVEST_WALLET_WINDOW_MS=60000
RATE_LIMIT_INVEST_WALLET_MAX=10

# Rate Limiting - Invoice Submission Endpoints (per-IP and per-wallet)
RATE_LIMIT_INVOICE_SUBMIT_IP_WINDOW_MS=60000
RATE_LIMIT_INVOICE_SUBMIT_IP_MAX=30
RATE_LIMIT_INVOICE_SUBMIT_WALLET_WINDOW_MS=60000
RATE_LIMIT_INVOICE_SUBMIT_WALLET_MAX=10

# Database
DATABASE_URL=postgresql://user:password@localhost:5432/stellarsettle

Expand All @@ -32,6 +53,12 @@ PLATFORM_SECRET_KEY=SXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
# Smart Contracts
ESCROW_CONTRACT_ID=CXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
TOKEN_CONTRACT_ID=CXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
STELLAR_RPC_URL=https://soroban-testnet.stellar.org
SOROBAN_INDEXER_CONTRACT_IDS=CXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
ONBOARDING_BONUS_CONTRACT_ID=CXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
ONBOARDING_BONUS_POOL_STORAGE_KEY=pool_balance
NOTIFICATION_SERVICE_URL=http://localhost:3001/notifications
# NOTIFICATION_SERVICE_TOKEN=

# IPFS
IPFS_API_URL=https://api.pinata.cloud
Expand All @@ -46,6 +73,9 @@ JWT_SECRET=your-super-secret-jwt-key
JWT_EXPIRES_IN=15m
AUTH_CHALLENGE_TTL_MS=300000

# Admin JWT (for admin endpoints, separate from user JWT)
ADMIN_JWT_SECRET=your-admin-jwt-secret

# Observability
METRICS_ENABLED=true

Expand All @@ -61,4 +91,23 @@ SENDGRID_API_KEY=SG.xxxxxxxxxxxxx
FROM_EMAIL=noreply@stellarsettle.com

#dev-secret-key
ADMIN_API_KEY=dev-secret-key
ADMIN_API_KEY=dev-secret-key
# Investor accreditation terms version (issue #473). Bump to force re-acknowledgement.
TERMS_VERSION=1

# IP Whitelist for admin routes (comma-separated CIDR blocks)
ADMIN_IP_WHITELIST=127.0.0.1,::1

# Caching (Redis)
REDIS_URL=redis://localhost:6379
CACHE_ENABLED=true
CACHE_TTL_INVOICES_LIST=30
CACHE_TTL_INVOICE_DETAIL=60

# Webhooks
KYC_WEBHOOK_SECRET=your-kyc-webhook-secret
WEBHOOK_SECRET=your-shared-webhook-secret

# Ratings Leaderboard
# Minimum number of ratings a key must have before it qualifies for the leaderboard
LEADERBOARD_MIN_RATING_COUNT=5
1 change: 1 addition & 0 deletions .eslintrc.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ module.exports = {
],
ignorePatterns: ["dist/", "node_modules/", "coverage/", "*.cjs"],
rules: {
"no-useless-escape": "off",
"@typescript-eslint/no-unused-vars": [
"error",
{
Expand Down
17 changes: 15 additions & 2 deletions .github/workflows/api-cy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -44,14 +44,27 @@ jobs:
- name: Install dependencies
run: npm ci

- name: OpenAPI Schema Drift Check
run: npm run verify:openapi

- name: Database Migration Safety Check
run: bash scripts/test-migrations.sh

- name: Run linter
run: npm run lint

- name: Type check
run: npm run type-check

- name: Run tests
run: npm test
- name: Run tests with coverage
run: npm test -- --coverage

- name: Build
run: npm run build

- name: Upload coverage reports
uses: actions/upload-artifact@v4
if: always()
with:
name: coverage-report
path: coverage/
110 changes: 110 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
name: API CI

on:
pull_request:
branches: [dev]
push:
branches: [dev]

jobs:
lint:
name: Lint
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '22'
cache: 'npm'
- name: Install dependencies
run: npm ci
timeout-minutes: 10
- name: Run linter
run: npm run lint
timeout-minutes: 5

type-check:
name: Type Check
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '22'
cache: 'npm'
- name: Install dependencies
run: npm ci
timeout-minutes: 10
- name: Run type check
run: npm run type-check
timeout-minutes: 5

build:
name: Build
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '22'
cache: 'npm'
- name: Install dependencies
run: npm ci
timeout-minutes: 10
- name: Build project
run: npm run build
timeout-minutes: 5

test:
name: Test
runs-on: ubuntu-latest
timeout-minutes: 15
services:
postgres:
image: postgres:15-alpine
env:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: password
POSTGRES_DB: stellarsettle_test
ports:
- 5432:5432
options: >-
--health-cmd "pg_isready -U postgres -d stellarsettle_test"
--health-interval 10s
--health-timeout 5s
--health-retries 5
--health-start-period 10s

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

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '22'
cache: 'npm'
- name: Install dependencies
run: npm ci
timeout-minutes: 10
- name: Wait for PostgreSQL
run: |
for i in {1..30}; do
if pg_isready -h localhost -p 5432 -U postgres; then
echo "PostgreSQL is ready"
exit 0
fi
echo "Waiting for PostgreSQL... ($i/30)"
sleep 2
done
echo "PostgreSQL did not become ready in time"
exit 1
timeout-minutes: 2
- name: Run tests
run: npm test -- --runInBand
timeout-minutes: 10
env:
DATABASE_URL: postgresql://postgres:password@localhost:5432/stellarsettle_test
2 changes: 1 addition & 1 deletion .github/workflows/commitlint.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ name: Commitlint

on:
pull_request:
branches: [main, develop]
branches: [main, dev]

jobs:
commitlint:
Expand Down
Loading
Loading