From 7198e715b84822c51bb35f7a16943d9f48276c2a Mon Sep 17 00:00:00 2001 From: Ved Patel Date: Tue, 10 Mar 2026 15:02:44 -0400 Subject: [PATCH 01/13] feat: Refactor header and add category bar, mobile menu, and search functionality --- frontend/src/App.css | 4 +- .../src/components/Category/CategoryBar.tsx | 29 +++++++++++ frontend/src/components/Header.tsx | 15 ------ frontend/src/components/Header/Header.tsx | 21 ++++++++ .../src/components/{ => Header}/MaxLogo.tsx | 0 frontend/src/components/Header/SearchBar.tsx | 25 ++++++++++ .../src/components/{ => Header}/UserAuth.tsx | 2 +- .../src/components/MobileMenu/MobileMenu.tsx | 49 +++++++++++++++++++ frontend/src/components/SearchBar.tsx | 26 ---------- frontend/src/index.css | 9 ++++ frontend/src/pages/Home.tsx | 4 +- 11 files changed, 139 insertions(+), 45 deletions(-) create mode 100644 frontend/src/components/Category/CategoryBar.tsx delete mode 100644 frontend/src/components/Header.tsx create mode 100644 frontend/src/components/Header/Header.tsx rename frontend/src/components/{ => Header}/MaxLogo.tsx (100%) create mode 100644 frontend/src/components/Header/SearchBar.tsx rename frontend/src/components/{ => Header}/UserAuth.tsx (92%) create mode 100644 frontend/src/components/MobileMenu/MobileMenu.tsx delete mode 100644 frontend/src/components/SearchBar.tsx diff --git a/frontend/src/App.css b/frontend/src/App.css index 8e9aca3..c446417 100644 --- a/frontend/src/App.css +++ b/frontend/src/App.css @@ -1,6 +1,6 @@ #root { - max-width: 1315px; + margin: 0 auto; - padding: 0.5rem; + } diff --git a/frontend/src/components/Category/CategoryBar.tsx b/frontend/src/components/Category/CategoryBar.tsx new file mode 100644 index 0000000..407ada8 --- /dev/null +++ b/frontend/src/components/Category/CategoryBar.tsx @@ -0,0 +1,29 @@ +const categories = [ + "Trending", + "Politics", + "Sports", + "Culture", + "Crypto", + "Climate", + "Economics", + "Mentions", + "Companies", + "Financials", + "Tech & Science", +]; + +export default function CategoryBar() { + return ( +
+ {categories.map((category) => ( + + {category} + + ))} +
+ ); +} \ No newline at end of file diff --git a/frontend/src/components/Header.tsx b/frontend/src/components/Header.tsx deleted file mode 100644 index a186012..0000000 --- a/frontend/src/components/Header.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import MaxLogo from "./MaxLogo"; -import SearchBar from "./SearchBar"; -import UserAuth from "./UserAuth"; - -export default function Header() { - return ( -
- - - - - -
- ); -} diff --git a/frontend/src/components/Header/Header.tsx b/frontend/src/components/Header/Header.tsx new file mode 100644 index 0000000..1bceca1 --- /dev/null +++ b/frontend/src/components/Header/Header.tsx @@ -0,0 +1,21 @@ +import CategoryBar from "../Category/CategoryBar"; +import MaxLogo from "./MaxLogo"; +import SearchBar from "./SearchBar"; +import UserAuth from "./UserAuth"; + +export default function Header() { + return ( +
+
+ + +
+ +
+ + +
+ +
+ ); +} diff --git a/frontend/src/components/MaxLogo.tsx b/frontend/src/components/Header/MaxLogo.tsx similarity index 100% rename from frontend/src/components/MaxLogo.tsx rename to frontend/src/components/Header/MaxLogo.tsx diff --git a/frontend/src/components/Header/SearchBar.tsx b/frontend/src/components/Header/SearchBar.tsx new file mode 100644 index 0000000..731c5c3 --- /dev/null +++ b/frontend/src/components/Header/SearchBar.tsx @@ -0,0 +1,25 @@ +export default function MaxLogo() { + return ( +
+
+ + + +
+ + +
+ ); +} diff --git a/frontend/src/components/UserAuth.tsx b/frontend/src/components/Header/UserAuth.tsx similarity index 92% rename from frontend/src/components/UserAuth.tsx rename to frontend/src/components/Header/UserAuth.tsx index 74bc37e..cb98874 100644 --- a/frontend/src/components/UserAuth.tsx +++ b/frontend/src/components/Header/UserAuth.tsx @@ -1,6 +1,6 @@ export default function MaxLogo() { return ( -
+
diff --git a/frontend/src/components/MobileMenu/MobileMenu.tsx b/frontend/src/components/MobileMenu/MobileMenu.tsx new file mode 100644 index 0000000..af130a8 --- /dev/null +++ b/frontend/src/components/MobileMenu/MobileMenu.tsx @@ -0,0 +1,49 @@ +export default function MobileMenu() { + const menuItems = [ + { name: "Home", href: "/" }, + { name: "Wallet", href: "/wallet" }, + { name: "Search", href: "/search" }, + { name: "Profile", href: "/profile" }, + ]; + + const icons = { + Home: ( + + + + ), + Wallet: ( + + + + + ), + Search: ( + + + + ), + Profile: ( + + + + ), + }; + + return ( +
+
+ {menuItems.map((item) => ( + + {icons[item.name as keyof typeof icons]} + {item.name} + + ))} +
+
+ ); +} diff --git a/frontend/src/components/SearchBar.tsx b/frontend/src/components/SearchBar.tsx deleted file mode 100644 index 041344f..0000000 --- a/frontend/src/components/SearchBar.tsx +++ /dev/null @@ -1,26 +0,0 @@ -export default function MaxLogo() { - return ( -
-
- - - -
- - -
- ) -} \ No newline at end of file diff --git a/frontend/src/index.css b/frontend/src/index.css index 47b87ef..ac5bf85 100644 --- a/frontend/src/index.css +++ b/frontend/src/index.css @@ -4,6 +4,15 @@ background-color: #000000; } +@layer utilities { + .scrollbar-hide::-webkit-scrollbar { + display: none; + } + .scrollbar-hide { + -ms-overflow-style: none; + scrollbar-width: none; + } +} body { min-width: 320px; diff --git a/frontend/src/pages/Home.tsx b/frontend/src/pages/Home.tsx index 19b55df..ee88061 100644 --- a/frontend/src/pages/Home.tsx +++ b/frontend/src/pages/Home.tsx @@ -1,8 +1,10 @@ -import Header from "../components/Header"; +import Header from "../components/Header/Header"; +import MobileMenu from "../components/MobileMenu/MobileMenu"; export default function Home() { return ( <>
+ ) } \ No newline at end of file From 2f3f89e30b3d05699d877218388cb22b31591918 Mon Sep 17 00:00:00 2001 From: Ved Patel Date: Tue, 10 Mar 2026 23:45:39 -0400 Subject: [PATCH 02/13] feat: Enhance header and category bar with scroll functionality, update search components, and remove mobile menu --- .../src/components/Category/CategoryBar.tsx | 17 ++++++- frontend/src/components/Header/Header.tsx | 12 ++--- frontend/src/components/Header/MaxLogo.tsx | 2 +- frontend/src/components/Header/UserAuth.tsx | 8 +-- .../src/components/MobileMenu/MobileMenu.tsx | 49 ------------------- .../src/components/Search/MobileSearch.tsx | 17 +++++++ .../{Header => Search}/SearchBar.tsx | 2 +- frontend/src/pages/Home.tsx | 3 +- 8 files changed, 47 insertions(+), 63 deletions(-) delete mode 100644 frontend/src/components/MobileMenu/MobileMenu.tsx create mode 100644 frontend/src/components/Search/MobileSearch.tsx rename frontend/src/components/{Header => Search}/SearchBar.tsx (86%) diff --git a/frontend/src/components/Category/CategoryBar.tsx b/frontend/src/components/Category/CategoryBar.tsx index 407ada8..444ee99 100644 --- a/frontend/src/components/Category/CategoryBar.tsx +++ b/frontend/src/components/Category/CategoryBar.tsx @@ -1,3 +1,5 @@ +import { useRef } from "react"; + const categories = [ "Trending", "Politics", @@ -13,8 +15,21 @@ const categories = [ ]; export default function CategoryBar() { + const scrollRef = useRef(null); + + const handleWheel = (e: React.WheelEvent) => { + if (scrollRef.current) { + e.preventDefault(); + scrollRef.current.scrollLeft += e.deltaY; + } + }; + return ( -
+
{categories.map((category) => ( -
+
+
-
- -
+ + +
diff --git a/frontend/src/components/Header/MaxLogo.tsx b/frontend/src/components/Header/MaxLogo.tsx index 6368239..d95b6b5 100644 --- a/frontend/src/components/Header/MaxLogo.tsx +++ b/frontend/src/components/Header/MaxLogo.tsx @@ -2,7 +2,7 @@ export default function MaxLogo() { return (
) diff --git a/frontend/src/components/Header/UserAuth.tsx b/frontend/src/components/Header/UserAuth.tsx index cb98874..1756e8f 100644 --- a/frontend/src/components/Header/UserAuth.tsx +++ b/frontend/src/components/Header/UserAuth.tsx @@ -1,10 +1,12 @@ +import MobileSearch from "../Search/MobileSearch"; export default function MaxLogo() { return ( -
- -
diff --git a/frontend/src/components/MobileMenu/MobileMenu.tsx b/frontend/src/components/MobileMenu/MobileMenu.tsx deleted file mode 100644 index af130a8..0000000 --- a/frontend/src/components/MobileMenu/MobileMenu.tsx +++ /dev/null @@ -1,49 +0,0 @@ -export default function MobileMenu() { - const menuItems = [ - { name: "Home", href: "/" }, - { name: "Wallet", href: "/wallet" }, - { name: "Search", href: "/search" }, - { name: "Profile", href: "/profile" }, - ]; - - const icons = { - Home: ( - - - - ), - Wallet: ( - - - - - ), - Search: ( - - - - ), - Profile: ( - - - - ), - }; - - return ( -
- -
- ); -} diff --git a/frontend/src/components/Search/MobileSearch.tsx b/frontend/src/components/Search/MobileSearch.tsx new file mode 100644 index 0000000..42f135f --- /dev/null +++ b/frontend/src/components/Search/MobileSearch.tsx @@ -0,0 +1,17 @@ +export default function MobileSearch() { + return ( + + ); +} diff --git a/frontend/src/components/Header/SearchBar.tsx b/frontend/src/components/Search/SearchBar.tsx similarity index 86% rename from frontend/src/components/Header/SearchBar.tsx rename to frontend/src/components/Search/SearchBar.tsx index 731c5c3..8f42510 100644 --- a/frontend/src/components/Header/SearchBar.tsx +++ b/frontend/src/components/Search/SearchBar.tsx @@ -1,6 +1,6 @@ export default function MaxLogo() { return ( -
+
- + ) } \ No newline at end of file From 29227c5e4d7f2aa81b2a5636b9aa5cdceb223803 Mon Sep 17 00:00:00 2001 From: aumpatel Date: Wed, 11 Mar 2026 19:27:28 -0400 Subject: [PATCH 03/13] .. --- matching-engine/journals/engine.log | 3 ++ .../api/service/MarketManagmentService.java | 5 +++ .../Wallets/InMemoryWalletService.class | Bin 6574 -> 0 bytes .../matching/Wallets/RiskManager.class | Bin 1091 -> 0 bytes .../matching/Wallets/WalletService.class | Bin 834 -> 0 bytes .../api/controller/MarketController.class | Bin 3131 -> 0 bytes .../api/controller/OrderController.class | Bin 3858 -> 0 bytes .../api/controller/WalletController.class | Bin 5380 -> 0 bytes .../matching/api/dto/DepositRequest.class | Bin 2719 -> 0 bytes .../EventRequest$EventRequestBuilder.class | Bin 2415 -> 0 bytes ...ookResponse$OrderBookResponseBuilder.class | Bin 2330 -> 0 bytes .../matching/api/dto/OrderBookResponse.class | Bin 3760 -> 0 bytes .../matching/api/dto/OrderMapper.class | Bin 2026 -> 0 bytes .../matching/api/dto/OrderRequest.class | Bin 4622 -> 0 bytes .../OrderResponse$OrderResponseBuilder.class | Bin 1996 -> 0 bytes .../matching/api/dto/OrderResponse.class | Bin 3436 -> 0 bytes .../example/matching/api/dto/PriceLevel.class | Bin 2373 -> 0 bytes ...WalletResponse$WalletResponseBuilder.class | Bin 2661 -> 0 bytes .../matching/api/dto/WalletResponse.class | Bin 4498 -> 0 bytes .../matching/api/dto/enums/EventStatus.class | Bin 1285 -> 0 bytes .../matching/api/service/OrderService.class | Bin 8403 -> 0 bytes .../app/MatchingEngineApplication.class | Bin 886 -> 0 bytes .../config/MatchingEngineConfig.class | Bin 2020 -> 0 bytes .../matching/journal/EventJournal.class | Bin 3303 -> 0 bytes .../matching/matching/MatchingEngine.class | Bin 7989 -> 0 bytes .../org/example/matching/model/Order.class | Bin 3466 -> 0 bytes .../example/matching/model/OrderBook.class | Bin 10331 -> 0 bytes .../example/matching/model/OrderSide.class | Bin 1163 -> 0 bytes .../example/matching/model/Reservation.class | Bin 3100 -> 0 bytes .../org/example/matching/model/Trade.class | Bin 2905 -> 0 bytes .../org/example/matching/model/Wallet.class | Bin 4473 -> 0 bytes .../orderbook/InMemoryOrderRepository.class | Bin 1658 -> 0 bytes .../matching/orderbook/OrderRepository.class | Bin 592 -> 0 bytes .../compile/default-compile/createdFiles.lst | 31 ------------------ 34 files changed, 8 insertions(+), 31 deletions(-) delete mode 100644 matching-engine/target/classes/org/example/matching/Wallets/InMemoryWalletService.class delete mode 100644 matching-engine/target/classes/org/example/matching/Wallets/RiskManager.class delete mode 100644 matching-engine/target/classes/org/example/matching/Wallets/WalletService.class delete mode 100644 matching-engine/target/classes/org/example/matching/api/controller/MarketController.class delete mode 100644 matching-engine/target/classes/org/example/matching/api/controller/OrderController.class delete mode 100644 matching-engine/target/classes/org/example/matching/api/controller/WalletController.class delete mode 100644 matching-engine/target/classes/org/example/matching/api/dto/DepositRequest.class delete mode 100644 matching-engine/target/classes/org/example/matching/api/dto/EventRequest$EventRequestBuilder.class delete mode 100644 matching-engine/target/classes/org/example/matching/api/dto/OrderBookResponse$OrderBookResponseBuilder.class delete mode 100644 matching-engine/target/classes/org/example/matching/api/dto/OrderBookResponse.class delete mode 100644 matching-engine/target/classes/org/example/matching/api/dto/OrderMapper.class delete mode 100644 matching-engine/target/classes/org/example/matching/api/dto/OrderRequest.class delete mode 100644 matching-engine/target/classes/org/example/matching/api/dto/OrderResponse$OrderResponseBuilder.class delete mode 100644 matching-engine/target/classes/org/example/matching/api/dto/OrderResponse.class delete mode 100644 matching-engine/target/classes/org/example/matching/api/dto/PriceLevel.class delete mode 100644 matching-engine/target/classes/org/example/matching/api/dto/WalletResponse$WalletResponseBuilder.class delete mode 100644 matching-engine/target/classes/org/example/matching/api/dto/WalletResponse.class delete mode 100644 matching-engine/target/classes/org/example/matching/api/dto/enums/EventStatus.class delete mode 100644 matching-engine/target/classes/org/example/matching/api/service/OrderService.class delete mode 100644 matching-engine/target/classes/org/example/matching/app/MatchingEngineApplication.class delete mode 100644 matching-engine/target/classes/org/example/matching/config/MatchingEngineConfig.class delete mode 100644 matching-engine/target/classes/org/example/matching/journal/EventJournal.class delete mode 100644 matching-engine/target/classes/org/example/matching/matching/MatchingEngine.class delete mode 100644 matching-engine/target/classes/org/example/matching/model/Order.class delete mode 100644 matching-engine/target/classes/org/example/matching/model/OrderBook.class delete mode 100644 matching-engine/target/classes/org/example/matching/model/OrderSide.class delete mode 100644 matching-engine/target/classes/org/example/matching/model/Reservation.class delete mode 100644 matching-engine/target/classes/org/example/matching/model/Trade.class delete mode 100644 matching-engine/target/classes/org/example/matching/model/Wallet.class delete mode 100644 matching-engine/target/classes/org/example/matching/orderbook/InMemoryOrderRepository.class delete mode 100644 matching-engine/target/classes/org/example/matching/orderbook/OrderRepository.class diff --git a/matching-engine/journals/engine.log b/matching-engine/journals/engine.log index 1dbd384..f9417cf 100644 --- a/matching-engine/journals/engine.log +++ b/matching-engine/journals/engine.log @@ -436,6 +436,7 @@ ORDER_PLACED: HOUSE_BOT-LOW_N-BUY-1773271525754 ORDER HOUSE_BOT-LOW_N-BUY-1773271525754 HOUSE_BOT BUY 47 500 1773271525754 ORDER_PLACED: HOUSE_BOT-LOW_N-SELL-1773271525754 ORDER HOUSE_BOT-LOW_N-SELL-1773271525754 HOUSE_BOT SELL 49 500 1773271525754 +<<<<<<< HEAD ORDER_PLACED: HOUSE_BOT-EVENT_Y-BUY-1773272988202 ORDER HOUSE_BOT-EVENT_Y-BUY-1773272988202 HOUSE_BOT BUY 49 500 1773272988202 ORDER_PLACED: HOUSE_BOT-EVENT_Y-SELL-1773272988206 @@ -458,3 +459,5 @@ ORDER_PLACED: HOUSE_BOT-EVENT_N-SELL-1773272994021 ORDER HOUSE_BOT-EVENT_N-SELL-1773272994021 HOUSE_BOT SELL 51 500 1773272994021 ORDER_PLACED: 528ff941-d66a-495e-9f51-687ce8ec7d84 ORDER 528ff941-d66a-495e-9f51-687ce8ec7d84 STOCK_TRADER BUY 150 10 1773272994036 +======= +>>>>>>> cb3b478 ( liquidity feature parameter/arg added! and latest final ready max1) diff --git a/matching-engine/src/main/java/org/example/matching/api/service/MarketManagmentService.java b/matching-engine/src/main/java/org/example/matching/api/service/MarketManagmentService.java index 9784e52..e95945b 100644 --- a/matching-engine/src/main/java/org/example/matching/api/service/MarketManagmentService.java +++ b/matching-engine/src/main/java/org/example/matching/api/service/MarketManagmentService.java @@ -51,6 +51,11 @@ public MarketEvent getEventByTicker(String ticker) { return tickerToEvent.get(ticker); } + // Check if ticker belongs to an event (prediction market) vs regular stock + public boolean isEventTicker(String ticker) { + return tickerToEvent.containsKey(ticker); + } + // Check if ticker belongs to an event (prediction market) vs regular stock public boolean isEventTicker(String ticker) { return tickerToEvent.containsKey(ticker); diff --git a/matching-engine/target/classes/org/example/matching/Wallets/InMemoryWalletService.class b/matching-engine/target/classes/org/example/matching/Wallets/InMemoryWalletService.class deleted file mode 100644 index 0092731cb682f44a6baf69333c4dd9405945a9d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6574 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 N$~hAfVNs3fe*sqHxg`Jq diff --git a/matching-engine/target/classes/org/example/matching/Wallets/RiskManager.class b/matching-engine/target/classes/org/example/matching/Wallets/RiskManager.class deleted file mode 100644 index 54bd4dd3b450fb358a529b2fe733e07a8d1ef778..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1091 zcma)4+iuf95IyVMNa8kWpf|2rG4li5Dag zf(Jf;k3!7aDQYDb@iOC?opa92cz*r<@e{xkY**kQS3=%J0Y!%TF+bs6z@w3OI5-x* zVJJS9ku*;ka?Mu1jB6;DP;pU(%g|JMa|HP&o^XiV3U35`HouQ`mQ0ShRs#qGO&lnzMQzdl+r6%6tWkjcn z2CkQI!^JXI7~22e3CU{_(+px?>4cVHyP2&Ys-Xx{?M~|*L;g7>h@dMY@p2XpgnrEj z0c9Fp<@2D=wY2d(nKxq@Q*YVa87uBEyuYH8^Xkh>&1SxOYpp)r$AK_oHGIW24}}q$ zI;{C);ZOFWVJ}?_Lm}Z{*veM8xEF@Xk(y~=>`S|e`h}BuXit%0y*G=D3`JkYlD4xK zMapm^RYcP1xbale)qSuXohm)?V(LpMb2b&;`Tby%4#=U4cj(X4<H+!ThJxJ8kryiEv8`Idan zViL+7OSzjtxlEKRM7c_oYYF8>3Y$|}QQLXaUDCUQJ49P{C~Y6D>RqBpRiBZ!16SK$ tP}=#9B?q4vl`8Jh3rn~Qi~ygh(#7o^c}8GGQ^E{7i}i)}NedhdrweVv*eB&!(s=Zf&CbcpWB*cW z8ImEL2-M@;VxUQpOz6AymL`ZJfsNs`jCYOZQpckkfu{EVGd^D~oI-1$DT9`ft5f+zz6|=rp8=``0T|Ph~O} zsCo8i&B)|~5csmdd-Ph9bKzK^%PuEM6%!TM9***&QWGfWH0D8jS$CP*a)VhUO{%$d zlmF0;-Vu7tUTrr{wMS=xVzWV>UhL6fHp7O1K$RB}SmL#+qru-z{;CTsA=|VT+9lMn z&@#Fu)U(hE`UTXgV3qZQ0$wZNZq>r;&%ZWaDmJZR3)`hP8*v36u*1+UD=XOJ+edr* F^aOS`*fanD diff --git a/matching-engine/target/classes/org/example/matching/api/controller/MarketController.class b/matching-engine/target/classes/org/example/matching/api/controller/MarketController.class deleted file mode 100644 index c6237223232ed5c79fa10db18a52e7edda64f34e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3131 zcmbtWYgZdp6y29cQ^FJ|O`)|uYEcUbWopGf44@QfeT0I9;;TMxl53cf%*2@+YM0Bu z;&0Hk1g#(Z0sbhL`_AM|sA2U(a%aw*d(J-lJnsGH-@pC_u!zDC`p_T4fQ3Pv5}5b= zqOE?E4#j*3At9`FjQog+|{XL~u8Ulfly6T!+bX+Acm+5M#u0|7) z=}12v$7u}35VtT4OJMdSn+1l8N@rbJ33fd#usWT2Ecc~dl0=@>J_AV4bcbW&DrnE% z@C(Yn>v?-yDyVpFpa^ILqcMzGIE!(Cs|HX|F}A+xy09vF2(=KNaZn z_5>DNA#CIxtGup3=)p$Xq$FYCJSGIrmP4*rrIuOc?>l*NJAZsIL8Md5P|Gd`bO9G* zc*(*gyeu%*NfBAp-or{o`71J@lf?AQQ5xfT6|co`*~06%B5|-&+E=nH zaH-8sBsIm&k2E!pcVoC|;TCQSOg2rm>Cu|@GETr28E>;@WF+A|q+?jHI24xJ>LaRO z?p|tJRwrwZBr+fkZVuUt3hT$z7Er%9KZJIBo4XX)ThX6X_9yN1-ZN9JSV<5$b>oL7F zYst3FW0CuCf`q-wDcIf=Pb>AtsDW?j{!g()CwYi649Mvn=L>l<S;6U;#sfi=hZ#O45ag&*Pl64J_5J9X1H4$ZK)rsDrjk?;qZnP zoopvF6trB!(ma*>IL3i~jGOBmpT^BKB3yZTavgxc`}lxgm-)77E`MA{lD|Ww4iQ_Q z{S#+?rKAsc`5)&BT*eSBuY^ybHde95H}1nd+^5AM+WQb6QTt;`2L;8zC;asxgY{5R z-~kmkzJdto_EXAYf`TnR2xJ?GR=CCZ93`T2L^OGbSK1(*qBdr_-$zRyAawq-whj4-g3wT{{isl BhSmT8 diff --git a/matching-engine/target/classes/org/example/matching/api/controller/OrderController.class b/matching-engine/target/classes/org/example/matching/api/controller/OrderController.class deleted file mode 100644 index 49b34838ff8e3235935bbb9c3b025fb2d929c4c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3858 zcmcInS##4?6#lMBqAUWtF3^T81Oj9O(Xti;EeQ!*OwuGx3v|1-l|)3Agd_)2petSf zLH`AvDJk&K>2s$)snhAFC0@YJIGyQ(e07iSIp;g;J^J&X=f49uho3r-z$OJPDq7Jd zaLjfWH2t0|I;O4_rJr9ktOZRvhL*Q2-?dFsceP2kpu3~xy?|;5lo{P!HuAcFHqlUu z7oCYj#0;5Ew4*~or;0A90*5!mP3?|r=XK8uVF}#mZ>+xH+mY&N{Z2{u{LDa8XFbQZ zJe@eVAgLgw;uWL?1{>n6QWLQXbS&upj4%C?C$P1DVB)r1mYON)+!^1ck2CGqD$qVX zc6DrYcI;v&w&OJgudC?B4uRB*#|7GGfix*?TYr_X$=q!{PqS`zVi$HR*rTEcdj$>! zSUo4uH1Eoye%E%Fv_;={v}rwpIA-~Vzar3?lZDtj0;hpaw9osW} z+oh_b^|K*7m$U7qwcJ_bpq(0yDtJT1n>Z$Lq;5tuWM{nR4XZG+a-|^9Uu|Zb6LFf9 ze8bcx9pA7mX=c(a+!HEJ;*>zEbR3hwd)6{4JUU;p^1)$kJbs}U-ohCL85L)7P9Pno zQ;k@GO-1Q2R56SOg6bj)eEhbGcW{9gS++lJmn>RzW&_D{S(nTkuaZBbxTs)E#W*er zoNP7+YsJt%xga40hMI>G`s#{`tGLD@v)wV%V@o?&9i6ozd%5m9k;QcdlPae0ZcW)n zJd}9Wunhk^-Q7Ph$7*v-nb+gaHMjB3)kINcSV^OHfkq@J3`@UWD&}-|R_07n(i3)G znsd@Mf_+SE@fQvDl@s-gVg0*+$`m*1t@L_h2~{03YQ)SOH||6N!%Z>9U0Gl=8*6?k zE1lSYR95#F?ZT7{I-Sq7V*8yj7A$sOmqtJOU)+3lBbd+APueclDf>W5dv7`K&f&dp<39f-6K|cdg9X6{lA24yNpqbbYBUOVcQX>a@Aw zmCXBUnal3`kI3RnB)AqRyq))7oaQwRz1-=VEOClT7_8`YRq@3#1Y~uUZd7uE02Wy~ z?7qQ(lL^9hJdATQp}C}2MW&SwFEROAwfjclAzND0Vy2|OxK^RmpIaw;>rPko^RnTk zlnL9?j9qf``nVA^iLIgWm3i+-aC-=xZrTEl7=DGFHf)47Y!8(T?+S;}5IyT8HDcSo z=eyF0O5RK1TCxp?Qus_D+rU%R5p8XUbH3JH4slAOAd?#?=C70E+UcnCnd)7b7t2A;I zdO6c&ITR(34nAV|mJS9yuA3k*jTzErxqA?N>TvBF{1swo6-st^6`Rwqu43EI*!&bb zho7N0fycv7ap-Z#{T_eQXyI=+I7hw=i5S+0SvlY_ruVsPjQ#NhA~ z4E{n=1SqgOaBjtw$ufv!7{=iLWEjXq2&W@Ka*Bi$BXTDcQ~{ue{ijcxz{ diff --git a/matching-engine/target/classes/org/example/matching/api/controller/WalletController.class b/matching-engine/target/classes/org/example/matching/api/controller/WalletController.class deleted file mode 100644 index 92d4fffb7bca474094b9e146a05797c05e73ad04..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5380 zcmcIo`Fj)B6+O?}V0ml{6QIT=F~I>ZI71Rb2*$L=fdDb!BFE6CZ9105_TbTsGBYw! zQ@W@7zHjNirEAh8icQ-z-P<(X_x6A3*YjpZ(#R4Ze@%ao^ybaG_ny0*_nw~n&*f(T zjN{+!XhO4s78R{%6WHgt3!3qup3PZ?meu|AqG>N^dd}3+j_tdSWf`t^PUnw5S)LH+ zyckTS40qW~8v=W#>govvy+}c{daMH*(5@h%q64bHaO0u^?F)t)Lp|P@WG)F zK;Abk8LxESbq(9s7^!G@T=y1F={cIb4x1HhQLz;-64({szNVPK2C8!lDZ>}oSY?e< zjN>-+DR{Ap?YN#fsVEHu+C1Mi^sGQ%m1H<8P!EP0U7^01e@yNiWtev#)xQtY*?=T7i=c9}Tp4TdlMYHy0 zJl1PXFcc%$qhM6U&Cmq4)}RU96;RS4EP=goEHw%vYe8w9nY%zo#uVIA6=ZrOE9o{B z`(znyWQm+LJa&YU2`i+Bt;RUrfddNeRB;ev0wZ;cP4-*HccKENmYidIY%66hZ(13{ z6*$VAtV47l?2(eDBcU3W;W!Q}c!`RaVnSfzf7U3_mZ!@nG6Lrs@5cJ>UJ-K_CRN;p zqXNlz8&0yf1eynjPD;1#R&g9Bm>@Dj*rwt8V}mDOn8}4g~2(FdsWOzlU*e&p+yPvyo#6O6>P|$umrUA zl@$xX4 zZ~JnqT2f(wG}@JRjf@#+2}^5B+#M2(+<#6E&2E6h4I={3pUS7xhUd-aEotEa6|Mx| zNed@zvQ9orhL=`+6?rVP#4A=xg)&&jPVLSYSbk7odnnc)0WdN#2v#A1*Ww`suTyae zucx(uC}S+ghCXE4rhho-tl18{5pPoPW)*M2TLm^%c$Eb^z~s8j?FKqCt6O;zR&{90 z#QC->ZF#!yWX-fT5&TR!_Cf*=;~gsADbvtQy$QS6}$vvY1?$|CWS%vu_4@4WvXnhs+37Mi>s=X}a zN}k?UZRJoc@Ysw@)!1RGOP(_PMJF?@OS13{c{FHGnG3e==Uv9ss#E9OXXB)U6lmf$R1W@Dzbh67uJON7AY>Yfehn}}=G?-fX-oV=Sh zj+v6|Hiu>_H^7^v5rG2@hnnYs*aebC*CQJ2;gu#+gZpX7ifq;75y$blmFl^WUA!co z;eHe6lJZ%j5}RnMyB*KUP434kej<0cHpciKqmabU1ct61;fSQW+whA7Py4@AQN$BT zJi&?QtTp_Z)%|sJqtoygwD7utl~lodh93w zO+f%;Ljkw&Uz=M4rz9X5kdjkd@hHAQ)e)da`7#9b%`%{Gl>vRb0_ZzjDDd4fpcH{g z&3!RIxe%1sik^#gKpntl+!+JaR|eI$9#D_11$7CJ6ABBF8EgtbC5E3yVR+;zh{rh_ z21b@Fkc`<+lyjr4`9!LUIzPq}qd25eN^j;thhu`*0C&U%|U%*~OLb43w*p zp(pVa?Ik4Hty9nTT0Knv(}A^>AWiaLlT|)nrslAAzK6gkMPrI^mF_w i8vUB1KXcVKt{CTEE`LEgS$!}5+SZQ0;UD-HdjAWT`8(wR diff --git a/matching-engine/target/classes/org/example/matching/api/dto/DepositRequest.class b/matching-engine/target/classes/org/example/matching/api/dto/DepositRequest.class deleted file mode 100644 index 050c9684b9645709bef8b3258bec89bfa9c73e03..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2719 zcmb7G+j84f6kW%bEXR=>*KN|8UXnlxj-Axy-o{CwO;hUNq^0Qv+F=IO(bR5i%a!B| zec*`~K7a?{1L#Ycff*WR`oO?Tnc*UdjC2Xmy%qsb#pedZT@>WON#(4c97NG&`2laIcvUx~Ag_B)X1i zS2hH))%(VlQED1gUUzNUl%?aOjv=I|XSA$tn+9Sk@raHL z4hke|Mtk`|*Juii<|B@;+`Vts-178oseDMsVT=k4-80?uf%kZRdPSZc(Qybu_$WrIjkdYgZQV8P>&D$Cab>Gk&1l{~go;~l5Xo%ye-yt=dL7g4 z(YvcqK^D^ll36v~y0vlDu#J}Knl{5ovtGrN{EE~{Q`D!FZDQ?isi5)#s^!*ATVPls zp6YdM}!DNTzK%-6q>ro9Z>L7J46^ zin>XvY>km8T0QEZ&{oWmqhyoW&Mzguza7{LzUTL>Yd#PzS zj_GJ1p{MrcGzhAOj|EQtw<@de=f%q&<9Gn#Tsa%Li^*x`tsGxmbqG0V_mmKsyN)d+wjVQN@h3}y%kBh$}_8rvtu=>D-^SMXIyR@w{(<3~@(c$bL7&Yj+jyy`KR%~YWqdA?Q>9Mg z8M2R%&Z)UXPf2;q$ni*xeWEY>h(e;baE=AycMt~3Y?>IKi)U%bB^37d;)G5Rd^*=B`FeW zv>l^8(d%W|)nx__J(fMT`B|h$w%HC9B->Xq<#}a6a(dx-rd*%QOnfo<En)8{{M8CqJOIKXiUUVehp_4!rs^xJ&|MO+ID%D%a5hjlJt% znBaviYkaD>&Nq4cZ{QX_LGB+9g8H-o diff --git a/matching-engine/target/classes/org/example/matching/api/dto/EventRequest$EventRequestBuilder.class b/matching-engine/target/classes/org/example/matching/api/dto/EventRequest$EventRequestBuilder.class deleted file mode 100644 index cbadbde7038ec6867ab38149b6812f741794a0f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2415 zcmcIm>rN9v6#k}MTIy zX!*5hYKFlZ(vkWmLtm-9G=vO>(#Tra0gIug+*cLxmbW{$sI<9mu1M149a(8_-)jYGyLe9J~Zkg@Fo>c zm0=;l&GNQU^ACkyQLV?^IHMJ@#fu}*E z%!WOdkn=ti_(k?yv1P}kSUrmgS69xr&G#I zVV~06^(jqSpVDykDNR$NL$v581PmwWR3XX?XX-Q92RfusqTPHpqGj5xKmb!XNjFB% zogyitTqSCZNKc*oMB95hZdD%*L_&2E_U)xsAn5^vmM6?yGUm>nF^%sLX3obfBxB}# z#x!w^Fbh8BNHXSd&zL4B5$1@GIfgS7qRsI<@Cl#j)piI`t-6!;TrF+}ahMZXv?;j&MQxI)xeeVx`-+@@QBB9x*319zy-r*RiE*!L3) Ci76=n diff --git a/matching-engine/target/classes/org/example/matching/api/dto/OrderBookResponse$OrderBookResponseBuilder.class b/matching-engine/target/classes/org/example/matching/api/dto/OrderBookResponse$OrderBookResponseBuilder.class deleted file mode 100644 index b7f8866d3f61442959e88bb44dde8b3d800629b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2330 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 diff --git a/matching-engine/target/classes/org/example/matching/api/dto/OrderMapper.class b/matching-engine/target/classes/org/example/matching/api/dto/OrderMapper.class deleted file mode 100644 index 1113c3b2c4206dd266061f6e9afecee63c66d402..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2026 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 W@MW#H@$AsgF-n2@kUl~TbN>Z=mVTlD diff --git a/matching-engine/target/classes/org/example/matching/api/dto/OrderResponse$OrderResponseBuilder.class b/matching-engine/target/classes/org/example/matching/api/dto/OrderResponse$OrderResponseBuilder.class deleted file mode 100644 index 9e8af789bc6ab9de48c38a44a26fd98096ec5f83..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1996 zcmb_ddruQV5dUo{Tw4!Y%i9N31#Jsb-w(<|!4SX-Mi68CYiT!daJ_BrwnV;(A43xe z2_}93Ka_E{cPZ31q#Dxf&Ft*VZ)av_roVol`~)zAxfnv|Fc3D;i7tl3F5l-ln>*XN zwXI!IR196ymSd?|hK_V*Gl~eJ24W^I!DN_|?siUm;pK`ga%HZHI~G~;ij^xVnOk#9 z!hJ8iigY|N+OV6iS~eXr7*Z=Oml%?T)4SJ|OF(&j+hr4ReN~sIxT<&e7}$z|L56JmPR1~Rt2!0e7^c$A4z(j$$!sPmw>L}-V}xO# z%=g5Cbc$SkwA2o9>FQ&cO#cfS zg&I-PuS|wsvTdqYhS<8Sx<#>Q)iU2u@{?MfFjlENm!wCXm6(@OdCKJ#KU6P*2MlYC zRt>wLZPG#0%&>`+-xit+xS%jA8WDbIaM6dm`tD<(KIq zFDmICFnm4xvVo%S=@NHJw(v#^QtnkN`Q}WVku(@?98^RL_0MPY{kfAro8ACof!p@F zr3Af%x$HQ?U9h?52`Y@O48!pGsx*T9aB-97O^8}NOkWy<#D(;X zs!uA)v||K6Mp`N2^F;Nf zMt1y&KHrFKHt+XU0&{)8_K)EXX?JS01a0E2F}vHw)Unnv<2B4=Ys^I3m^yED%w!F- z4|ge?6uF*92mN&HBS+|I8&khQ9kZ{7nMQ_08grhK!-x+4z`&>MAz>e)n^uBW&oPEt zC)j_V!TS4TF&^N(q=(jc{eNSf;5u*~T7Q5R#st}ia1WC;IzR;jDm8|OwC>|M?UHmJ Qp+Bh?R4-GQ#w>>Z0HI*i9smFU diff --git a/matching-engine/target/classes/org/example/matching/api/dto/OrderResponse.class b/matching-engine/target/classes/org/example/matching/api/dto/OrderResponse.class deleted file mode 100644 index 434c332504461831e6a5d06fd37d21f2247d2751..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3436 zcmbVP{cjUx9RED+UGLi6SQ%{4fox#WuHC32zR)qi%>f(hKsJZGsNC9fJ=XPRdm~~( zVq#+a1N=edcliYqO&lbc82tqk|0WSX&)u!PZq+Oj?(X}1-=6Qw=lMR}pMO936~H)F z;)o!sK{22rCXjXN%X#Zlb9Jq1kWb4+1utFGha2SJMY$MGNwTnIJ0wa={DaJ>vok}C7>Z;pbG{!J7w2w_q0GXGrTCH z-esUihO9Xt7Ya5;W_8i5+j1Q+6}MtDj*;1&gJz7~U-F?MFv()? z+_WR!=r7R-^{)*LK~07i*|VbMR-E!>vu>_hu2pB)aoYI}@_httAzmm5;YG>JNDsnk zKQ#f=1XRbZSaq7oYNP{b3v_$z*1F3Rvv=P4Gkj@t=?Q})(6nu>8E0vwXs!i?S1(_g zE>1C~X+p1VHP)*xb4Z7di{9E;OK^AFKEv*bGUy8_>Y^9~gKpe~rTa@A_2XB}r{eQj*} z2?}xA3>WUMSsm1Gg!DHjREQP0m^7=^dE2!JX=A!pv+9#ov(d0vw7qTR2_~(EWr3sH zQtgz123z3Jf2$Hme!3ir5l$vR;g{o@R7Bo1-j}1=`*J+<+XG%dIKuavT;=%{{HocX zA%67K-r_svG56pkX~S1Q0b^Xnafh7?Wkkhw=adNA1Pe)^3BTeH7DL=_QKahxof=qTaK8-Wfk`*fOE7Oc+a~tUXX^XY) zS@-)IL5XDfWDf++Qd<>VB)NFIvrDm4m$IErm#XJ-qO;57PF+f5G+p+3E+_F$Gw~>* zUgCor*t1iY5@b!6eV$9+zrIUxp7@N@<^5dtd#K98-0z5d2Q~UI_ZuR`k?bSv^OhtI zjPUvTTPfsfaE{Btf-?FCx>Cwh?0x`aG^ISki<|nHf=ZQ4A(m35PV6aqAD}y>reYzb zTtTB!uArwhsiX%=T1wwkQXVqAXb2vDgKzp_HyeB(Q#i*w`|u^s^ISx595ybHCv8iZ zCZ*s#zGwKTxIrjfBo)JFJQ1^`G<=Q&D3a1K$2~{Tt?7SZmxf69GxTdn^S>^hVZTqt z!{jEgrdVG^{B2c%7o# z$+1()xa`Zs!Q@!waB}G0;V-_rB{_oyRkCE=^MiGP^#WF78GGkO>;ayS@$ou39!58K4$0FvLl*(2d#{#Js*ZaJ7 zXkM}JA@&?Os4TV+3JVM&p0ko61_jUA-dIzmrPa<06t%EoOLrTa>I{1kn}h8v!<4hB zUsjS&hEI;qfhUX|TPL00Lw_Ro2gTrR?ak=+asC)@Y(27xj+3qnR|E7^Svz@C3}k8S zO}p&K21Isr1IcW^(qRa6c^*$N1zI&BH4scc$&*7%B62|f!9f3#k|RR#0JmH5W}_Tt ta{9<|q2PTgMQ{z*`BhjOji-lq45<(K+(enHUTU!5Y{wshbY{n2m zSc9TNMMU6+?d;~wZ;ky%&CKr`Zl!9~ck@QW%I~;#e$%lkX30D>YXWLRZUj=Lr^ca? zuNkx}+4bF`^cd99Y1>#W8|Q8b)=DNzbVc6yKRZ#FUYm(&c3xY3VXSm!Gw9jo^xo z3B1WrRijy5ws)9Rcs8>>OoFcIn8bB~@qJ^@T(;{K!~Mc?X;g2zOspxe(4B#YsTX56 z=q=YFpG66KO2;&22yoG=Tkc&i<`V(M2aqgTb#vojf7^5(8{0KP8ZOxtqxQsbEV&Pq zid(e^B2#+JvK5(SvrXv81?(9jNR>^uYVT|sjO#IEo8 zno%qZT2L3eg)i{1=3{8{P-We25%egwaGPZb@m9Q#cc=?Xub+U7I}9lcqDmGd z(*LTM+D57ppF|o|?6yZQzc{FpP4FjOs9X!F;-a$TkvNemR!Lzrl{|D1|r%x7dP`uqlkANJ;U?c?ji<3Wekd zK|&zJ8I3x7s?SKg+A?U_DCbo)W4uNFTJSTKG3B5Q$|Pk%&v6y#9U8yw{fQe4(DTy6 zOyH$6uD{@|-Ug5Mow#ZCgFkU)u3kC6Ts-qF9^ diff --git a/matching-engine/target/classes/org/example/matching/api/dto/WalletResponse$WalletResponseBuilder.class b/matching-engine/target/classes/org/example/matching/api/dto/WalletResponse$WalletResponseBuilder.class deleted file mode 100644 index 01386259ae73383b3e99256bbbebe67e3724309b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2661 zcmb_eZBH9V5PlW|XWUEd0C5P=gtR2JA<4B((>D{^;M4`zkg7(Ys-G5ngD;%#th+Tz z{z-pED-oqirT&2asH(HKXLGhsk&*atw>z^l&%EC3{rlg$e*iqeUIr6L8JILNg=vP| zOMc2Nhr7qt^P`udAsMDOY}b~X45>o#UMb?FmQNtwH9B8wcu74pn> z_>m*ZJZLensydxDF{e&VUl7cxXsSbXaNR^6HyE;gwR($_5OK7fuCyI%mv=%VH%%-m z>8m{$Eo@+!Vf_L@X0U`?Dwnqz9v4Ofs#b@L50S-#4DR3~10S1M#od8|=$tSZr`+j^ z=PwxU#VzQ1m5QTAXQ|Ymm?)sgaHGvnMA>s2Tprr8MY}+9S5jJPaj+==J$J)~hh`hAW!D!Bj|QXM7=?&&Y91ASv&1l2_L`)et=X>F>$Z=CzptvV8pUgH=YadR zq9f*{Y}ph=xpskSCATD*K1|3(@lud;yF#|S=Fi;cZ6SqEE>{ZG%fa4{yzY1Q<-q0# z)BU>BOZlrIdt=r0a(tRPQsaZcDqIMUN}HBm??aj=<&lxYkg0oJzac8N>b1GSsr69F z6Ud$jkc+72io(!bVJG!z#8s9U>A+j_Zd4e9x>8GeuVdnBmC+2(H35y5KB z^G>>*(rCV7oB_ps>XQWV-(vC!6Dxu!)6G%0rJ#D5JFYAIvcrQw4e#rTnKV#kxH}SS zQV0fW47c7dN|%z3mu7LAE=bTopHMd*?IzT16s~mdgezS$U|0+H>vT>RNsLYtpRQKo z+^3yID^r}cw_tyUDi7$bjzI<<(%aMmB>E{)jJTf>s8TM`s+=*_*5AeTA>d zri!hC8QKBMe`D#_wKFR18I|G;*XWt2XW=bAOfI$#YPsJl-{9K_vr2_mm@A||fcIC( zTA<|}?g8(^U5Rifsq<8;ZO{*+T9>d%Ynt$%((@gDBx;uUX*$`aSa$Fe)$8W}cuI)n diff --git a/matching-engine/target/classes/org/example/matching/api/dto/WalletResponse.class b/matching-engine/target/classes/org/example/matching/api/dto/WalletResponse.class deleted file mode 100644 index be44d0cfea16314acb188e37b4aa6fe7dfb47941..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4498 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 diff --git a/matching-engine/target/classes/org/example/matching/api/service/OrderService.class b/matching-engine/target/classes/org/example/matching/api/service/OrderService.class deleted file mode 100644 index 2eadd8c4fcd78a31cbe3aa5e007fd488571b2353..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8403 zcmb_hd3+q_S$c@^wB^1j_g$cz1xnhqJl{9F)=E2TtG{3W z*qxbg-tYb1`*o;BoJqXXWhkuD6&>hp&?Z zH9Pth5v?ZHAtq?gI*%2d%%B@wJ>(9J@0wJNuG-XZz!cneU2azIYr_U?G|+Bh6FLO@ zzdl9;#=IR2+E!k$r)%`Ab{&YzE%=rpk1#A~oa&|R0mOyGu^ny?=$+CG)CiIg2%KHz@) zf?!KmHA$0!QdoZ*cH*@L;wE)Q0z9b2YUsL zJXf$c3a(Zh2D$`^wQ%JZ+`Mnckib3zJtlgwU(j{^os?q1_5`hgJM8AjhhV&`zJ0Bh zBXt;gM$XOH*-+wIr?;B84Yv!nf zPjw`wPEgVfxzuTq}!{FcD|VNlX~N1U=&V-OZ^dyM=tOEH zH8hnPZp8_Dy5=+P_;KG3f~=j1_r~*XJjW2$i%~Vq@H>rHZp{!7wq)nKwgP~S&KoHkvURF)l%qwuoaIAcF=8#b8}AG zp_#|$iusIBamW1y%d>rzwPsDEk>M#?2@`g~^&N(8#?~+i)>xp1n|0mAN_ej9VBDR< zynzK14$jsy{<_-*O}@2e?q(G2Sra)h{+YIN;t{v#<*lq>U$k`2hVMg%D+B9TR50@G%bQBO?(U9B-l_XbyE3xCr=yMA1#Cm7^7BL8inwb z!&~rH1K(=m+wkpzo@o23lv67=3u1+=mA19l2o9{pI;+ZpQO6HxJ8#2x7VYC%$_XyS@U!@!fr}
&*Ehhm(-gL zd^2fhv*lME5L{7l;Uj{(A`nLLv23B%vUQ^wao^ zfzO)wb^OLkl5{yur01+`(H@^$74<5`axLQ>bcNqiqWW#YLu(RMEsolih)O?(-^K44 z_u$*D#es$ zER0sBgkiThn^jKpMZ99-%L-`)dca>)A?#HXU&YrLK8iXNDU4HYfhEJ;5o}b6w~V=V zrF*7Tgi&;0Xef0;mDAElqn<3L)3)!kQI%#>TEt-JD5%h}A~uzMvRAgQ|G9z5bZ2mkow&G^JfO3GRtB*GfCJ0z)J| zl1Il=p-(U!A=EmyvGxNr!JAFlqNr_QSYU6ac-Usj4Qk2AQS#P2ed(jpY07q$$u^~n zp2sS5%E{SdPB!c49Xm|9Np>>q1Y9PfTtP70HS&$2FmB2&Vbj&DmBo_p>rxe&+%0ZYyijO97%xxCmEEI5n>$@(-ir`L=rNpvjr zc-k(gDWz}7-Q@;yHL0^4-1$j0zVokwQ?p}su;6A+SZb2VtiOU6t@kDz>e(u?vNYogG+3)uCv-)zVh3(NXJN^!}VbFLJFRW5s5dvv#?A=#M_O z(!Epie&ZpR7Z~3BqtJS`-r2W z#U`!Vve@>kFw3H7f>k6F$Bg4U3?Tz~R#^H&16pUM6Ibn0`BwKPkHH*&GNN+`ZiYsKRlPRO_B29Jw5^ z(%~fPx#}ce1`Js_YUMLo+uuD(4F@*ZvQ^RT$2ZqcGc3vBlu_t5~yU-xJA<}~wI#dJC(N%|< zQ|c?{Li);yguZfArmr0L=_|+kyf&!MX8OvHS9+bFa)@)kT9YK-irgxB?o!e%-G9IgKCht zs17)VM)ujj&cugddlOh9tK2OL*WS!KMjz>V@*+new95a~XC6_+1@SE!W@2I7YKP=&oU%*WoP(A#~ z3uxC^^uzPmLo6MCPUu7le_1*B0}4|Ke_O)mUqqXN_yQqb{MvAtBg*OD4mR^4B(=GO z|LWx5|CR8SM9*fn!qPy=Xuh=Y$(uAa;$&xwQf!k}>^pEX@9#o8Klbe6hn~Is%5XdG z#SjKChGE)x3bXvwk;O4Q!H*A5;W+L81TNwMd;$~r9H!YM&*1a)hc6KNOMLz^PRlwx zB)jmibaM(n#0mNRn3dy5%V`e5AB8P8=Hx8qCCBFi$JkF|QJzLt8`cC`dB*$Yu-v13 zMxLqIH}CG10h--jIV*$2+rUp}kI1m3XnIevr8*+_k+0LZQ;y0p+WnK1!3fW8kx_D~ z3^s%sBa|}Oo6)-KRrO);fPvJOSJ7kOZ3dqH3f^hp*x{%yU_y+a4B(!Zx zqme!a?6@SYG;OyeW=}~vdP}nPlH6F5*OcV7O3n>h&O4PKpuioEaWddxBYbplbaNw$ z{6t&Od?!MD6>d3lP&_I(-N7E|xc2oOGS0h3P1O2E8Kii&@Hb8%VS{m^Oxy=aTr1c5 z5--cmiH}J4sh5SJWV4DV?@RP7VLH*fgeMZ6O-pz#(b>F&#YAVz60Ah0v4rGu#0edL zJ1OfX&D*c)hp4a8*{5ToqO(s&MHQp^)V!QTs5=!Im8AOAX9OLJ`kr#OE3P|3>})pv>|O TM`W^|4R;#rBqMXOfX@F1Fxk)f diff --git a/matching-engine/target/classes/org/example/matching/app/MatchingEngineApplication.class b/matching-engine/target/classes/org/example/matching/app/MatchingEngineApplication.class deleted file mode 100644 index 0a053464eea86b94b90b85337a023b6581dcdbce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 886 zcmb7DO>fgc5Ph2_O_~~7(o!fN1#W2$v4l`Bfl3g;DTRulaOi35Zk=uIU2DCD{w+=* z4*URq6k^t-GzW7aQg$?7Z)V?H|NQm+2Y?rN+(iQ`Z8QV4uqv>5PM;`DNhjgE=v>B5 zVD-7u${h-<^!I0NbOfFnn}qU`vOJYxMlPN!uBSW?j~32rohU6|=6R}Oa?0o~x>#=` z2yg>81qL3W$SwDsS<2*RV=uzU7#B{f;8G{gwWSt_`jhM3#wiuW=wvA}bslWAKdD2G zjdt?Vg=3@7R8m@s(&gni?9(HG=GdG{fsF}o|F+B`X+QW{f!@T#l+MU1?=ON)H&=zg zvufu5@!@A>r1)Mt{km(+I8QcV^sSmS>vSaD+?*bhXU|E?h25zsZ7km?zwh2Zl^A*! z1$N(;+Nn&=RG~Z@S{qj>#Yl&>Bv$fJ=?t@3u_zZ}y<**#1mmk6)B;?oK!0bkAX#p- z)NUG+=EfkRLLO6mL5bu=wpq;Kg4p5JL&Foa`O*4c1HwOBJ~!A4*$TF;!B>bcReF<8 zp9a=&i_hRs0eaY~V%xaQAinva0s}g|_TU@VK3@0xF9cZUp}`VH2RpdK@w@zQv5IUO Y*saccxX-r7{sXoTdF0*+M1e=Y0XrD-xBvhE diff --git a/matching-engine/target/classes/org/example/matching/config/MatchingEngineConfig.class b/matching-engine/target/classes/org/example/matching/config/MatchingEngineConfig.class deleted file mode 100644 index 89e72b62ae3767ac6aa48d4f0d5364c1b0864ba3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2020 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 N1k`zIP;Ei&e*se)QI-Gz diff --git a/matching-engine/target/classes/org/example/matching/model/Order.class b/matching-engine/target/classes/org/example/matching/model/Order.class deleted file mode 100644 index 18eb3374ab42acd7e9eb6d0703004cc64c3a1fb7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3466 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 diff --git a/matching-engine/target/classes/org/example/matching/model/Trade.class b/matching-engine/target/classes/org/example/matching/model/Trade.class deleted file mode 100644 index 1a0f9feb633c7b155bec82f6c2953727ddebbc02..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2905 zcma)8>sA|87~Ln33t_kvxky{C(hyQ?>iq((6%-*tp#`a0{|w)WWYQ(?-~;&2 zCvYuYOVrgLeE=WI<^IluNl3=ZkC}7k%lY>CF8kZ?_dhRQ0=S3ovPhsSjcyA`q!b39 z+0X5wYgdno+Xv5dIZ#L~J5?vRuh5lW*zZ9GJ!xbu^ukh@_WYxw{=u%Cy1H1ggYvOM z&x&`b-Qu2aA8Li{LH%soKh*xlp~BE+6Mr}Gd3Z?>`z;IzTyIUgZsV}nuUQzvYYNFz z-zgJImBcz?VN|S{@9TCoaDuZeUdMPE*Dc(@%}Y7#p49?fQMgvF`@XIQdrn1fIj-x} zOgaW`(!!L$^#uH}7BCmNWX8g*gp_rvwZN}e=$xf_&cZF^6#9;Iu+oy)aDJgPHF3yW zSP+MPI_x&Hlb>!|Sd@4({AouL6yqHWMKSi$_$bORgSRZaEq04`$-)FG4)0oc?;@g& zDApl%_X7(b;vEWuX3Gw4oBsZ{DT#-yvTbVa-vxP680 zRq{q*VAHAUhxN*V_V?@qmzJSTuWY;fw(rPy!`K}hOBZK1|Br%8WW<&Zj=jSj+qWw^ z&_4b8YL^>05)=9YgX-tGmcFrDG?;EN;CxArkhM{(*dTsI4GQmRwnbq%=AO=S#Fw0R zWdbjp8!~g(tNUfW=17UMX4>w^bTQo(&kM*}`!vkEmch2dV{;_m9LIZVak^#TbBfPpxHW z91Me9x2uP)uFY+F-bwv*sk1gMmP?L%XQw*m_|um2p`7oYP;^P6KImf+Nf5w zzv|kxny#hswZg5AoZ>=F<6DKvS0AOChIwIzqnqH6rue3ma+eSdG%GdFtW-I(Ql898 zLE<_H3L-w{`6Yh+j4mPp^Mya53b)UZE-ap-uP}3t!NO?r9K(gbFm{fK!g%@|)4v&@ zWxi*P+bFs*h8_xNKgM~@b-r(48aI){1pht&_ZcGLxqiY`b`q{KI|*2lm=~F5AhMI7 zlV&I3rtyILktChK{J?|Y5xE`&p_cM3c@(({XtMA-(!X+(fJB)x#%U8tcx$o|i4t9n zaqeq(o{M#+@phJA)HO;UvA&KmF0@I=)3RHN|^SfV6V&k%7n9^2QNa1t@Icgxkh=-iGDx}PG1UY3O*W+v1GPAF4 zkIY*HIcp%3*l5)9M^-Y+&gK4FCq^j{l!=~8G7(|s9Yok zxkw6f@()(SSAy&@4IdXm4VtD)m!zyxhl{}F;>*H7ford>70dHdG$iZ1OH^gD@CV-D zGtZ~M=S@C$`MmQ2?*r}A)7OGJ*~qpFUlJ#QO>A+^5Os&oL+tY_%iR-vgQpn(7hq2T A&j0`b diff --git a/matching-engine/target/classes/org/example/matching/model/Wallet.class b/matching-engine/target/classes/org/example/matching/model/Wallet.class deleted file mode 100644 index 41fecd14a5302a94ae950bbcd688b97cd4d6fac1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4473 zcmb_f-)|dL7XHSu<6qOnbyIKLgeEDW%`Y%C*==b`AayBCNYZZIrnGdIo!FCP8rx&W z<3RbjOUo-yydd%37mz@rsZ=DiPppJ^N4)Tdpt8H)z4OE4*zHDI)YfzFoqNvt&Ue0Z z@AQX%Kll#73%H#?2whQxRYcIOAazsQ)^cU7x{n^zwm7~T$3FB#(W@eb{R&1* zYa^$>tyOAeJy+4};-YED2mi88VR>V4>qE7@; zExoQ=+j>d(h$8c-4Dx<5=ecoNt0iy{UBXjV#UTtR==I?gHZ^*EB%n4|63`PW4huIu z9w5hyh%l^T1V_mB6+&G&t03)UDoatYEmAWp2pv`N6ppeO8-gB|WKpb+sTjwEg1A;H z%~wmWh+@@MN=HGy zL*PKA+ue0UrC>TuIZu;^g0WH6?1rT)C8qw3aa_N8e219l?T&<**b$in+ zUDPbCqT9Mf4{_>4N~xrv&#O&POzd@TnfKZ&FWak^OPAbcaaK}7QLUT0wTjsgRZ|uz zW!t*tS~vzmcGrb2gb_tou(jeAd&$e%(#yJ5*IR7%m-IDbSKxFIo!4z0NhXSfQLWon zqawxBwXHGm{y-|8`GiNr?z5{+3}knG&zt{G<)oSvdO$NB#3X4|-P2Zx?!l`m`cx?YdsLj_N@andQhDE^_~@Z-1gSaZ1GeYlUOIrssQ7Iz~@Y4PD8 zpS;)QleaRcJ&r^Cnn{c6H84NGaRhUG_ab-P;aK=PIdLD##J7lEi{D559@M}%&GEr& z_wk2&=x+`OCnoP<=xZ6}CH@}fl?(JDj2IEcF$fjMi1s*VCx~pGZ!=CToI##5M#Wj? zpx|YWBMK+r)!Z@>;fT(1g3mgQ!cEFTut!ZL-dA! zMSm;IKl=<^Hk!~chdKr?Bu(E%P!Yje2OHp^xZ$XgWNw6U7q?EqVc|9We~<1w)<~&i)=43V6-sA=r!kyL)j# z#%k?F=lr=Q6Y1n+aJQ4?$2z%=*IgvPQ2jA7v?43=fQ^nF{E1~b73Rv|o;vyow;O3@!b)1yi+Rwvrl%4ihjv})7X>|RDQ5K(noo>oV z5yV4u0U8S-yurZEner7Oicm8$QAdn2YfqV{nDF;VX2Zj>-LjGIk#Lg~9pNPCoYZBi zu)_brnHWNi2SA;TZnFosWpXp}fSK`An(*rDS_D znxD-3gd>TdCn zmmG%pif-!8Dnm4r-IvhIFy{s}9oW4Yz-IX0z|@5g0akua*@Dy}gM zbcm4$^(I-elnEU4e9Cw41nGW|pkG%ojtN3h8sudND&(My8<>(XtzZVT4C!`SyLCsm zOwC}Bt%IGWVQ58zGi1)^x{W(K<`#TYK}Mt$x5@k?E+NOT5Nc$*Q(YbE+tVwi<}__m z-{@@8O28c7=Rznx(5L)ro*}kQjT1fBO}^8t6}kP^D=%HJN}92+*}7Q!n=z-V(}XOA zv)iekGh{-qp&gOlY$hBLOfS1nljJfPrY;VrPivbyRjd43v$Yy`xJ{Y%9_VIy?N|(B zN56cJ{5k0C7ehp+_;k0W4259R{{vaMIA7tuOdkzp>LoZF#wHKqUJym^SxvjdU+QA~ z#?JA0K@2X6YaEq=X@)dD<-lm;3MClDk=1#zJKOwz8LEl%% zpWWyMdJa;Ac*dX*Ckd5SigyNgaFi|3)?H>g|DLcDsz$U62{5oiGYaG5>dKE7*<;zz4GCS ZGmlOY#-AqBX9E00i=POy=&4)(vw!~lh?)QZ diff --git a/matching-engine/target/classes/org/example/matching/orderbook/OrderRepository.class b/matching-engine/target/classes/org/example/matching/orderbook/OrderRepository.class deleted file mode 100644 index ad66fe97e4258169c2a3f6b40b705f3e3c35fb51..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 592 zcma)3+e*Vg5S@)}qxDv`75o69Md*G&RL}=Os8m|$`!<=T+a|kVv#IvieDDMOC~-DH z3Z-*yq0Pf(@2aiEto0#LfNV5caDr`8HD(2cmXr@{(`Oy81Fw?oT z+N^!3F=#EsO7KJwa5!CHXc^RUu|fvd-N8=2R7aRpTtRO_3@>QsI(ijGq-fFP4C>`f z2KzIqqQ~`f#Gu<9Y$lDZA!R|YDiu}|UuLCNA_*AyWw&cO7|U1*TNsiv_$R^b->UCv zNRv#E+Dcq!7dKh+B#CHLNNO4D!i4xF6Oz;33bXIrF}NBP%E}ZcGMCc?AC%HoIA@f~ zO{px;ocEav>rI;_&nYt0cAX*LtR`qMV6aEK1*p-M>d>IOPq#XyN;S#`n&ADG4(a8H eJ`axR=>$$U=vIk7+ae(3d5OP(Hl2>W1MmY0@}N5a diff --git a/matching-engine/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/matching-engine/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst index acd2cd4..e69de29 100644 --- a/matching-engine/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +++ b/matching-engine/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -1,31 +0,0 @@ -org/example/matching/api/controller/MarketController.class -org/example/matching/app/MatchingEngineApplication.class -org/example/matching/api/dto/EventRequest$EventRequestBuilder.class -org/example/matching/model/Trade.class -org/example/matching/model/OrderSide.class -org/example/matching/api/dto/OrderResponse.class -org/example/matching/journal/EventJournal.class -org/example/matching/Wallets/WalletService.class -org/example/matching/Wallets/InMemoryWalletService.class -org/example/matching/model/Reservation.class -org/example/matching/api/controller/OrderController.class -org/example/matching/api/dto/OrderBookResponse$OrderBookResponseBuilder.class -org/example/matching/model/OrderBook.class -org/example/matching/api/dto/WalletResponse$WalletResponseBuilder.class -org/example/matching/api/dto/OrderResponse$OrderResponseBuilder.class -org/example/matching/orderbook/InMemoryOrderRepository.class -org/example/matching/matching/MatchingEngine.class -org/example/matching/model/Order.class -org/example/matching/api/dto/DepositRequest.class -org/example/matching/api/dto/PriceLevel.class -org/example/matching/api/dto/WalletResponse.class -org/example/matching/api/controller/WalletController.class -org/example/matching/Wallets/RiskManager.class -org/example/matching/api/dto/OrderMapper.class -org/example/matching/api/dto/OrderBookResponse.class -org/example/matching/api/dto/enums/EventStatus.class -org/example/matching/api/dto/OrderRequest.class -org/example/matching/config/MatchingEngineConfig.class -org/example/matching/orderbook/OrderRepository.class -org/example/matching/model/Wallet.class -org/example/matching/api/service/OrderService.class From 3ad518d144f3397c94c65c88e7e73bb4ffcf91c2 Mon Sep 17 00:00:00 2001 From: Ved Patel Date: Wed, 11 Mar 2026 20:22:33 -0400 Subject: [PATCH 04/13] feat: Update Header and MobileSearch components with improved layout and search functionality --- frontend/src/components/Header/Header.tsx | 2 +- .../src/components/Search/MobileSearch.tsx | 65 +++++++++++++++---- 2 files changed, 54 insertions(+), 13 deletions(-) diff --git a/frontend/src/components/Header/Header.tsx b/frontend/src/components/Header/Header.tsx index 50c0282..5a0e71f 100644 --- a/frontend/src/components/Header/Header.tsx +++ b/frontend/src/components/Header/Header.tsx @@ -6,7 +6,7 @@ import UserAuth from "./UserAuth"; export default function Header() { return (
-
+
diff --git a/frontend/src/components/Search/MobileSearch.tsx b/frontend/src/components/Search/MobileSearch.tsx index 42f135f..7b9faf2 100644 --- a/frontend/src/components/Search/MobileSearch.tsx +++ b/frontend/src/components/Search/MobileSearch.tsx @@ -1,17 +1,58 @@ +import { useState } from "react"; +import MaxLogo from "../Header/MaxLogo"; export default function MobileSearch() { + const [isSearchOpen, setIsSearchOpen] = useState(false); return ( - + + + + + {isSearchOpen && ( +
+
+ + +
+
+
+ +
+
+
+ )} + ); } From b36d699e65312ab00501c807e602f6722c39032c Mon Sep 17 00:00:00 2001 From: Ved Patel Date: Wed, 11 Mar 2026 21:08:02 -0400 Subject: [PATCH 05/13] feat: Add shake animation to search components and improve focus handling --- .../src/components/Search/MobileSearch.tsx | 36 ++++++++++++++++--- frontend/src/components/Search/SearchBar.tsx | 34 +++++++++++------- frontend/src/index.css | 16 +++++++++ 3 files changed, 68 insertions(+), 18 deletions(-) diff --git a/frontend/src/components/Search/MobileSearch.tsx b/frontend/src/components/Search/MobileSearch.tsx index 7b9faf2..742009b 100644 --- a/frontend/src/components/Search/MobileSearch.tsx +++ b/frontend/src/components/Search/MobileSearch.tsx @@ -1,7 +1,21 @@ -import { useState } from "react"; +import { useState, useEffect, useRef } from "react"; import MaxLogo from "../Header/MaxLogo"; export default function MobileSearch() { const [isSearchOpen, setIsSearchOpen] = useState(false); + const [shouldShake, setShouldShake] = useState(false); + + const handleFocus = () => { + setShouldShake(true); + setTimeout(() => setShouldShake(false), 500); + }; + + useEffect(() => { + if (isSearchOpen) { + setShouldShake(true); + const timer = setTimeout(() => setShouldShake(false), 500); + return () => clearTimeout(timer); + } + }, [isSearchOpen]); return ( <>
-
-
+
+
+ + +
diff --git a/frontend/src/components/Search/SearchBar.tsx b/frontend/src/components/Search/SearchBar.tsx index 8f42510..b7112ef 100644 --- a/frontend/src/components/Search/SearchBar.tsx +++ b/frontend/src/components/Search/SearchBar.tsx @@ -1,23 +1,31 @@ +import { useState } from "react"; + export default function MaxLogo() { + const [shouldShake, setShouldShake] = useState(false); + + const handleFocus = () => { + setShouldShake(true); + setTimeout(() => setShouldShake(false), 500); + }; + return (
-
- - - -
+ + +
diff --git a/frontend/src/index.css b/frontend/src/index.css index ac5bf85..b605005 100644 --- a/frontend/src/index.css +++ b/frontend/src/index.css @@ -12,6 +12,22 @@ -ms-overflow-style: none; scrollbar-width: none; } + + @keyframes shake { + 0%, 100% { + transform: rotate(0deg); + } + 25% { + transform: rotate(15deg); + } + 75% { + transform: rotate(-15deg); + } + } + + .animate-shake { + animation: shake 0.5s ease-in-out; + } } body { From 9a4817421ddb08a97733606314300bef5fa8c396 Mon Sep 17 00:00:00 2001 From: Ved Patel Date: Wed, 11 Mar 2026 21:19:30 -0400 Subject: [PATCH 06/13] feat: Add comprehensive README files for backend and frontend, detailing project structure, technology stack, and setup instructions --- README.md | 145 ++++++++++++++ backend/README.md | 249 ++++++++++++++++++++++++ frontend/README.md | 458 ++++++++++++++++++++++++++++++++++++++------- 3 files changed, 780 insertions(+), 72 deletions(-) create mode 100644 README.md create mode 100644 backend/README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..601cd26 --- /dev/null +++ b/README.md @@ -0,0 +1,145 @@ +# Max - Stock Exchange Platform + +Max is a modern stock exchange platform built with a Spring Boot backend and React frontend. The platform provides real-time trading capabilities with a sleek, responsive user interface. + +## 🏗️ Project Structure + +``` +Max/ +├── backend/ # Spring Boot backend services +│ ├── matching-engine/ # Order matching engine +│ └── common/ # Shared utilities and models +└── frontend/ # React + TypeScript frontend + └── src/ + ├── components/ # Reusable UI components + └── pages/ # Application pages +``` + +## 🚀 Features + +- **Real-time Trading**: High-performance order matching engine +- **Responsive Design**: Mobile-first UI with tablet and desktop support +- **Modern UI/UX**: Built with React 19 and Tailwind CSS 4 +- **Category Navigation**: Browse markets by categories (Trending, Politics, Sports, Crypto, etc.) +- **Search Functionality**: Advanced search with smooth animations +- **User Authentication**: Login and signup functionality + +## 🛠️ Tech Stack + +### Backend +- **Framework**: Spring Boot 3.2.2 +- **Language**: Java +- **Build Tool**: Maven +- **Key Dependencies**: + - Spring Web + - Spring Validation + - Lombok + +### Frontend +- **Framework**: React 19.2.0 +- **Language**: TypeScript 5.9.3 +- **Build Tool**: Vite 7.3.1 +- **Styling**: Tailwind CSS 4.2.1 +- **Routing**: React Router DOM 7.13.1 + +## 📋 Prerequisites + +- **Java**: JDK 17 or higher +- **Node.js**: v18 or higher +- **npm**: v9 or higher +- **Maven**: 3.6 or higher + +## 🚀 Quick Start + +### 1. Clone the Repository +```bash +git clone +cd Max +``` + +### 2. Start Backend +```bash +cd backend/matching-engine +mvn clean install +mvn spring-boot:run +``` + +The backend will start on `http://localhost:8080` + +### 3. Start Frontend +```bash +cd frontend +npm install +npm run dev +``` + +The frontend will start on `http://localhost:5173` + +## 📚 Documentation + +For detailed setup and development instructions, see: +- [Backend README](./backend/README.md) +- [Frontend README](./frontend/README.md) + +## 🎨 UI Features + +- **Responsive Header**: Adaptive navigation for mobile, tablet, and desktop +- **Category Bar**: Horizontal scrolling with mouse wheel support +- **Search Modal**: Animated search with blur background +- **Mobile Menu**: Bottom navigation for mobile devices +- **Custom Animations**: Shake effects and smooth transitions + +## 🔧 Development + +### Backend Development +```bash +cd backend/matching-engine +mvn spring-boot:run +``` + +### Frontend Development +```bash +cd frontend +npm run dev +``` + +### Build for Production + +**Backend:** +```bash +cd backend/matching-engine +mvn clean package +``` + +**Frontend:** +```bash +cd frontend +npm run build +``` + +## 📝 Project Status + +This project is currently in active development. Features are being added and refined regularly. + +## 🤝 Contributing + +1. Fork the repository +2. Create your feature branch (`git checkout -b feature/AmazingFeature`) +3. Commit your changes (`git commit -m 'Add some AmazingFeature'`) +4. Push to the branch (`git push origin feature/AmazingFeature`) +5. Open a Pull Request + +## 📄 License + +This project is private and proprietary. + +## 👥 Authors + +- Aum Patel +- Ved Patel + +## 🙏 Acknowledgments + +- Spring Boot team for the excellent framework +- React team for the powerful UI library +- Tailwind CSS for the utility-first CSS framework diff --git a/backend/README.md b/backend/README.md new file mode 100644 index 0000000..749a73a --- /dev/null +++ b/backend/README.md @@ -0,0 +1,249 @@ +# Max Backend - Stock Exchange Matching Engine + +The backend service for Max stock exchange platform, built with Spring Boot. This service handles order matching, trade execution, and provides RESTful APIs for the frontend. + +## 🏗️ Architecture + +``` +backend/ +├── matching-engine/ # Main matching engine service +│ ├── src/ +│ │ ├── main/ +│ │ │ ├── java/org/example/ +│ │ │ └── resources/ +│ │ │ └── application.properties +│ │ └── test/ +│ ├── journals/ # Engine logs +│ └── pom.xml +├── common/ # Shared utilities and models +│ ├── src/main/java/org/example/ +│ └── pom.xml +└── src/ # Additional source files +``` + +## 🛠️ Technology Stack + +- **Framework**: Spring Boot 3.2.2 +- **Language**: Java 17+ +- **Build Tool**: Maven +- **Parent**: Spring Boot Starter Parent 3.2.2 + +### Key Dependencies + +- **Spring Boot Starter Web**: RESTful API development +- **Spring Boot Starter Validation**: Input validation +- **Lombok**: Reduce boilerplate code +- **JUnit Jupiter 5.10.0**: Unit testing + +## 📋 Prerequisites + +- Java Development Kit (JDK) 17 or higher +- Maven 3.6 or higher +- IDE (IntelliJ IDEA, Eclipse, or VS Code recommended) + +## 🚀 Getting Started + +### 1. Install Dependencies + +Navigate to the matching-engine directory: +```bash +cd backend/matching-engine +``` + +Install all dependencies: +```bash +mvn clean install +``` + +### 2. Configure Application + +Edit `src/main/resources/application.properties`: +```properties +# Server Configuration +server.port=8080 + +# Application Name +spring.application.name=matching-engine + +# Logging Configuration +logging.level.org.example=DEBUG +logging.file.name=journals/engine.log +``` + +### 3. Run the Application + +**Using Maven:** +```bash +mvn spring-boot:run +``` + +**Using Java:** +```bash +mvn clean package +java -jar target/matching-engine-1.0-SNAPSHOT.jar +``` + +The application will start on `http://localhost:8080` + +## 🧪 Testing + +### Run All Tests +```bash +mvn test +``` + +### Run Specific Test +```bash +mvn test -Dtest=YourTestClassName +``` + +### Generate Test Coverage Report +```bash +mvn clean test jacoco:report +``` + +## 📁 Project Modules + +### Matching Engine +The core service that handles: +- Order matching logic +- Trade execution +- Market data management +- RESTful API endpoints + +### Common Module +Shared utilities and models used across services: +- Data models +- Utility classes +- Common configurations +- Shared constants + +## 🔧 Development + +### Build the Project +```bash +mvn clean install +``` + +### Run in Development Mode +```bash +mvn spring-boot:run -Dspring-boot.run.profiles=dev +``` + +### Package for Production +```bash +mvn clean package -DskipTests +``` + +## 📊 API Endpoints + +### Health Check +``` +GET /actuator/health +``` + +### Order Management +``` +POST /api/orders # Create new order +GET /api/orders/{id} # Get order by ID +GET /api/orders # List all orders +DELETE /api/orders/{id} # Cancel order +``` + +### Market Data +``` +GET /api/markets # List all markets +GET /api/markets/{id} # Get market details +``` + +## 🐛 Debugging + +### Enable Debug Logging +Add to `application.properties`: +```properties +logging.level.org.example=DEBUG +logging.level.org.springframework.web=DEBUG +``` + +### View Logs +```bash +tail -f journals/engine.log +``` + +## 🔒 Security Considerations + +- Input validation using Spring Validation +- CORS configuration for frontend integration +- Request/Response logging for audit trails + +## 📈 Performance + +- Optimized order matching algorithm +- Efficient data structures for order books +- Asynchronous processing where applicable + +## 🚀 Deployment + +### Build Docker Image (Future) +```bash +docker build -t max-backend:latest . +docker run -p 8080:8080 max-backend:latest +``` + +### Environment Variables +```bash +SPRING_PROFILES_ACTIVE=prod +SERVER_PORT=8080 +``` + +## 📝 Code Style + +- Follow Java naming conventions +- Use Lombok annotations to reduce boilerplate +- Write unit tests for all business logic +- Document complex algorithms + +## 🔄 CI/CD + +### Maven Lifecycle +1. `mvn clean` - Clean build artifacts +2. `mvn compile` - Compile source code +3. `mvn test` - Run tests +4. `mvn package` - Create JAR file +5. `mvn install` - Install to local repository + +## 🐞 Troubleshooting + +### Port Already in Use +```bash +# Change port in application.properties +server.port=8081 +``` + +### Maven Build Fails +```bash +# Clean and rebuild +mvn clean install -U +``` + +### Lombok Not Working +- Install Lombok plugin in your IDE +- Enable annotation processing + +## 📚 Additional Resources + +- [Spring Boot Documentation](https://spring.io/projects/spring-boot) +- [Maven Documentation](https://maven.apache.org/guides/) +- [Lombok Documentation](https://projectlombok.org/) + +## 🤝 Contributing + +1. Create a feature branch +2. Write tests for new features +3. Ensure all tests pass +4. Follow code style guidelines +5. Submit a pull request + +## 📄 License + +This project is private and proprietary. diff --git a/frontend/README.md b/frontend/README.md index d2e7761..5dbf533 100644 --- a/frontend/README.md +++ b/frontend/README.md @@ -1,73 +1,387 @@ -# React + TypeScript + Vite - -This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. - -Currently, two official plugins are available: - -- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Babel](https://babeljs.io/) (or [oxc](https://oxc.rs) when used in [rolldown-vite](https://vite.dev/guide/rolldown)) for Fast Refresh -- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh - -## React Compiler - -The React Compiler is not enabled on this template because of its impact on dev & build performances. To add it, see [this documentation](https://react.dev/learn/react-compiler/installation). - -## Expanding the ESLint configuration - -If you are developing a production application, we recommend updating the configuration to enable type-aware lint rules: - -```js -export default defineConfig([ - globalIgnores(['dist']), - { - files: ['**/*.{ts,tsx}'], - extends: [ - // Other configs... - - // Remove tseslint.configs.recommended and replace with this - tseslint.configs.recommendedTypeChecked, - // Alternatively, use this for stricter rules - tseslint.configs.strictTypeChecked, - // Optionally, add this for stylistic rules - tseslint.configs.stylisticTypeChecked, - - // Other configs... - ], - languageOptions: { - parserOptions: { - project: ['./tsconfig.node.json', './tsconfig.app.json'], - tsconfigRootDir: import.meta.dirname, - }, - // other options... - }, - }, -]) -``` - -You can also install [eslint-plugin-react-x](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-x) and [eslint-plugin-react-dom](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-dom) for React-specific lint rules: - -```js -// eslint.config.js -import reactX from 'eslint-plugin-react-x' -import reactDom from 'eslint-plugin-react-dom' - -export default defineConfig([ - globalIgnores(['dist']), - { - files: ['**/*.{ts,tsx}'], - extends: [ - // Other configs... - // Enable lint rules for React - reactX.configs['recommended-typescript'], - // Enable lint rules for React DOM - reactDom.configs.recommended, - ], - languageOptions: { - parserOptions: { - project: ['./tsconfig.node.json', './tsconfig.app.json'], - tsconfigRootDir: import.meta.dirname, - }, - // other options... - }, - }, -]) +# Max Frontend - Stock Exchange UI + +Modern, responsive frontend for the Max stock exchange platform built with React, TypeScript, and Tailwind CSS. + +## 🏗️ Project Structure + +``` +frontend/ +├── public/ # Static assets +│ └── vite.svg +├── src/ +│ ├── components/ # Reusable UI components +│ │ ├── Category/ +│ │ │ └── CategoryBar.tsx +│ │ ├── Header/ +│ │ │ ├── Header.tsx +│ │ │ ├── MaxLogo.tsx +│ │ │ └── UserAuth.tsx +│ │ └── Search/ +│ │ ├── MobileSearch.tsx +│ │ └── SearchBar.tsx +│ ├── pages/ # Application pages +│ │ └── Home.tsx +│ ├── App.tsx # Main app component +│ ├── main.tsx # Application entry point +│ ├── index.css # Global styles +│ └── App.css # App-specific styles +├── index.html # HTML template +├── package.json # Dependencies and scripts +├── vite.config.ts # Vite configuration +└── tsconfig.json # TypeScript configuration +``` + +## 🛠️ Technology Stack + +- **Framework**: React 19.2.0 +- **Language**: TypeScript 5.9.3 +- **Build Tool**: Vite 7.3.1 +- **Styling**: Tailwind CSS 4.2.1 +- **Routing**: React Router DOM 7.13.1 +- **Linting**: ESLint 9.39.1 + +## 📋 Prerequisites + +- Node.js v18 or higher +- npm v9 or higher (or yarn/pnpm) + +## 🚀 Getting Started + +### 1. Install Dependencies + +```bash +cd frontend +npm install +``` + +### 2. Start Development Server + +```bash +npm run dev ``` + +The application will start on `http://localhost:5173` + +### 3. Build for Production + +```bash +npm run build +``` + +Build output will be in the `dist/` directory. + +### 4. Preview Production Build + +```bash +npm run preview +``` + +## 📜 Available Scripts + +| Script | Description | +|--------|-------------| +| `npm run dev` | Start development server with hot reload | +| `npm run build` | Build for production | +| `npm run preview` | Preview production build locally | +| `npm run lint` | Run ESLint to check code quality | + +## 🎨 UI Components + +### Header Components + +#### MaxLogo +- Responsive logo with different sizes for mobile, tablet, and desktop +- Sizes: `text-3xl` (mobile), `text-4xl` (tablet), `text-5xl` (desktop) + +#### UserAuth +- Login and Sign up buttons +- Responsive padding and text sizing +- Fixed height for consistency across devices +- Search button for mobile/tablet views + +#### SearchBar +- Desktop search input with animated icon +- Shake animation on focus +- Color changes from gray to `#48CAE4` when focused + +### Search Components + +#### MobileSearch +- Full-screen search modal for mobile/tablet +- Blur background overlay +- Animated search icon +- Auto-focus input field +- Close button with X icon + +### Category Components + +#### CategoryBar +- Horizontal scrolling category navigation +- Mouse wheel horizontal scrolling support +- Smooth scroll behavior +- Categories: Trending, Politics, Sports, Culture, Crypto, Climate, Economics, Mentions, Companies, Financials, Tech & Science + +## 🎨 Styling + +### Tailwind CSS Configuration + +The project uses Tailwind CSS 4 with custom utilities: + +```css +/* Custom Scrollbar Hide */ +.scrollbar-hide::-webkit-scrollbar { + display: none; +} +.scrollbar-hide { + -ms-overflow-style: none; + scrollbar-width: none; +} + +/* Custom Shake Animation */ +@keyframes shake { + 0%, 100% { transform: rotate(0deg); } + 25% { transform: rotate(15deg); } + 75% { transform: rotate(-15deg); } +} +.animate-shake { + animation: shake 0.5s ease-in-out; +} +``` + +### Color Palette + +- **Primary**: `#48CAE4` (Cyan) +- **Background**: `#000000` (Black) +- **Secondary Background**: `#242423` (Dark Gray) +- **Text**: `#ffffff` (White) +- **Text Secondary**: `rgba(255, 255, 255, 0.6)` (White 60%) + +### Responsive Breakpoints + +- **Mobile**: < 640px (default) +- **Tablet**: ≥ 640px (`sm:`) +- **Desktop**: ≥ 768px (`md:`) + +## 🔧 Development + +### Component Development + +Create new components in `src/components/`: + +```tsx +// Example component +export default function MyComponent() { + return ( +
+ {/* Component content */} +
+ ); +} +``` + +### Adding New Pages + +1. Create page in `src/pages/` +2. Add route in `App.tsx`: + +```tsx +} /> +``` + +### Custom Hooks + +Create custom hooks in `src/hooks/` (create directory if needed): + +```tsx +export function useCustomHook() { + // Hook logic +} +``` + +## 🎯 Features + +### Responsive Design +- Mobile-first approach +- Adaptive layouts for all screen sizes +- Touch-friendly interactions + +### Animations +- Smooth transitions +- Shake effects on focus +- Scale animations on button clicks +- Blur backgrounds for modals + +### User Experience +- Auto-focus on search inputs +- Keyboard navigation support +- Mouse wheel horizontal scrolling +- Visual feedback on interactions + +## 🐛 Debugging + +### Enable React DevTools +Install React Developer Tools browser extension + +### TypeScript Errors +```bash +# Check TypeScript errors +npx tsc --noEmit +``` + +### Vite Issues +```bash +# Clear Vite cache +rm -rf node_modules/.vite +npm run dev +``` + +## 📦 Building + +### Development Build +```bash +npm run dev +``` + +### Production Build +```bash +npm run build +``` + +### Analyze Bundle Size +```bash +npm run build -- --mode analyze +``` + +## 🚀 Deployment + +### Deploy to Vercel +```bash +npm install -g vercel +vercel +``` + +### Deploy to Netlify +```bash +npm run build +# Upload dist/ folder to Netlify +``` + +### Environment Variables +Create `.env` file: +```env +VITE_API_URL=http://localhost:8080 +VITE_APP_NAME=Max +``` + +Access in code: +```tsx +const apiUrl = import.meta.env.VITE_API_URL; +``` + +## 🧪 Testing (Future) + +### Setup Testing +```bash +npm install -D vitest @testing-library/react @testing-library/jest-dom +``` + +### Run Tests +```bash +npm run test +``` + +## 📱 Mobile Optimization + +- Bottom navigation for mobile devices +- Touch-optimized button sizes +- Responsive font sizes +- Optimized images and assets + +## ♿ Accessibility + +- Semantic HTML elements +- ARIA labels where needed +- Keyboard navigation support +- Focus indicators +- Color contrast compliance + +## 🔒 Security + +- No sensitive data in client-side code +- Environment variables for API endpoints +- Input sanitization +- XSS protection + +## 📈 Performance + +- Code splitting with React.lazy +- Optimized images +- Minimal bundle size +- Fast initial load time + +## 🎨 Design System + +### Typography +- Font: System fonts for optimal performance +- Sizes: Responsive with Tailwind utilities + +### Spacing +- Consistent padding and margins +- Gap utilities for flex/grid layouts + +### Components +- Reusable and composable +- Props for customization +- TypeScript for type safety + +## 🤝 Contributing + +1. Follow the existing code style +2. Use TypeScript for type safety +3. Write responsive components +4. Test on multiple devices +5. Use meaningful commit messages + +## 📚 Resources + +- [React Documentation](https://react.dev/) +- [TypeScript Documentation](https://www.typescriptlang.org/) +- [Tailwind CSS Documentation](https://tailwindcss.com/) +- [Vite Documentation](https://vitejs.dev/) +- [React Router Documentation](https://reactrouter.com/) + +## 🐞 Common Issues + +### Port Already in Use +```bash +# Change port +npm run dev -- --port 3000 +``` + +### Module Not Found +```bash +# Reinstall dependencies +rm -rf node_modules package-lock.json +npm install +``` + +### TypeScript Errors +```bash +# Update TypeScript +npm install -D typescript@latest +``` + +## 📄 License + +This project is private and proprietary. + +## 👥 Authors + +- Aum Patel +- Ved Patel + +## 🙏 Acknowledgments + +- React team for the amazing framework +- Tailwind CSS for the utility-first approach +- Vite for the blazing fast build tool From 383066e68c7314894bb1bdf8ce2052d8f00cd61d Mon Sep 17 00:00:00 2001 From: Ved Patel Date: Thu, 12 Mar 2026 17:36:31 -0400 Subject: [PATCH 07/13] Just keeping the frontend as I am working on frontend for now. --- .idea/compiler.xml | 13 - ..._ch_qos_logback_logback_classic_1_4_14.xml | 13 - ...en__ch_qos_logback_logback_core_1_4_14.xml | 13 - .../Maven__com_fasterxml_classmate_1_6_0.xml | 13 - ...ackson_core_jackson_annotations_2_15_3.xml | 13 - ...erxml_jackson_core_jackson_core_2_15_3.xml | 13 - ...l_jackson_core_jackson_databind_2_15_3.xml | 13 - ..._datatype_jackson_datatype_jdk8_2_15_3.xml | 13 - ...atatype_jackson_datatype_jsr310_2_15_3.xml | 13 - ..._jackson_module_parameter_names_2_15_3.xml | 13 - ...o_micrometer_micrometer_commons_1_12_2.xml | 13 - ...crometer_micrometer_observation_1_12_2.xml | 13 - ...nnotation_jakarta_annotation_api_2_1_1.xml | 13 - ...alidation_jakarta_validation_api_3_0_2.xml | 13 - ..._apache_logging_log4j_log4j_api_2_21_1.xml | 13 - ...he_logging_log4j_log4j_to_slf4j_2_21_1.xml | 13 - ...tomcat_embed_tomcat_embed_core_10_1_18.xml | 13 - ...e_tomcat_embed_tomcat_embed_el_10_1_18.xml | 13 - ...t_embed_tomcat_embed_websocket_10_1_18.xml | 13 - ..._org_apiguardian_apiguardian_api_1_1_2.xml | 13 - ...idator_hibernate_validator_8_0_1_Final.xml | 13 - ...boss_logging_jboss_logging_3_5_3_Final.xml | 13 - ...org_junit_jupiter_junit_jupiter_5_10_0.xml | 13 - ...junit_jupiter_junit_jupiter_api_5_10_1.xml | 13 - ...it_jupiter_junit_jupiter_engine_5_10_1.xml | 13 - ...it_jupiter_junit_jupiter_params_5_10_1.xml | 13 - ...platform_junit_platform_commons_1_10_1.xml | 13 - ..._platform_junit_platform_engine_1_10_1.xml | 13 - ...Maven__org_opentest4j_opentest4j_1_3_0.xml | 13 - ...aven__org_projectlombok_lombok_1_18_30.xml | 13 - ...aven__org_projectlombok_lombok_1_18_42.xml | 13 - .../Maven__org_slf4j_jul_to_slf4j_2_0_11.xml | 13 - .../Maven__org_slf4j_slf4j_api_2_0_11.xml | 13 - ...springframework_boot_spring_boot_3_2_2.xml | 13 - ...k_boot_spring_boot_autoconfigure_3_2_2.xml | 13 - ...amework_boot_spring_boot_starter_3_2_2.xml | 13 - ...rk_boot_spring_boot_starter_json_3_2_2.xml | 13 - ...boot_spring_boot_starter_logging_3_2_2.xml | 13 - ..._boot_spring_boot_starter_tomcat_3_2_2.xml | 13 - ...t_spring_boot_starter_validation_3_2_2.xml | 13 - ...ork_boot_spring_boot_starter_web_3_2_2.xml | 13 - ...__org_springframework_spring_aop_6_1_3.xml | 13 - ...org_springframework_spring_beans_6_1_3.xml | 13 - ...g_springframework_spring_context_6_1_3.xml | 13 - ..._org_springframework_spring_core_6_1_3.xml | 13 - ...pringframework_spring_expression_6_1_3.xml | 13 - ...__org_springframework_spring_jcl_6_1_3.xml | 13 - ...__org_springframework_spring_web_6_1_3.xml | 13 - ...rg_springframework_spring_webmvc_6_1_3.xml | 13 - .../Maven__org_yaml_snakeyaml_2_2.xml | 13 - .idea/misc.xml | 6 - .idea/modules.xml | 10 - .../InMemoryWalletService.class" | Bin 6359 -> 0 bytes .../MarketController.class" | Bin 3590 -> 0 bytes .../MatchingEngine.class" | Bin 11725 -> 0 bytes .../MatchingEngineApplication.class" | Bin 771 -> 0 bytes .../MatchingEngineConfig.class" | Bin 2224 -> 0 bytes .../OrderService.class" | Bin 5980 -> 0 bytes .../Reservation.class" | Bin 3101 -> 0 bytes .../WalletController.class" | Bin 5531 -> 0 bytes .../WalletService.class" | Bin 834 -> 0 bytes .../shelved.patch" | 805 ------------------ .../InMemoryWalletService.class" | Bin 6359 -> 0 bytes .../MarketController.class" | Bin 3590 -> 0 bytes .../MatchingEngine.class" | Bin 11725 -> 0 bytes .../MatchingEngineApplication.class" | Bin 771 -> 0 bytes .../MatchingEngineConfig.class" | Bin 2224 -> 0 bytes .../OrderService.class" | Bin 5980 -> 0 bytes .../Reservation.class" | Bin 3101 -> 0 bytes .../WalletController.class" | Bin 5531 -> 0 bytes .../WalletService.class" | Bin 834 -> 0 bytes .../shelved.patch" | 196 ----- ...e_Update_at_09_03_26__7_40pm__Changes_.xml | 4 - ..._Update_at_09_03_26__7_40pm__Changes_1.xml | 49 -- .idea/workspace.xml | 337 -------- Strongx.iml | 9 - backend/.gitignore | 1 - backend/README.md | 249 ------ backend/common/pom.xml | 18 - .../src/main/java/org/example/Main.java | 7 - .../target/classes/org/example/Main.class | Bin 540 -> 0 bytes .../compile/default-compile/createdFiles.lst | 1 - .../compile/default-compile/inputFiles.lst | 1 - backend/journals/engine.log | 87 -- backend/matching-engine/README.md | 1 - backend/matching-engine/journals/engine.log | 53 -- backend/matching-engine/pom.xml | 50 -- .../src/main/java/org/example/Main.java | 109 --- .../matching/MatchingEngineApplication.java | 11 - .../java/org/example/matching/Replay.java | 98 --- .../Wallets/InMemoryWalletService.java | 138 --- .../example/matching/Wallets/RiskManager.java | 34 - .../matching/Wallets/WalletService.java | 17 - .../api/advice/ApiExceptionHandler.java | 29 - .../api/controller/EventController.java | 38 - .../api/controller/MarketController.java | 36 - .../api/controller/OrderController.java | 39 - .../api/controller/WalletController.java | 59 -- .../matching/api/dto/DepositRequest.java | 26 - .../matching/api/dto/EventRequest.java | 12 - .../example/matching/api/dto/EventStatus.java | 6 - .../matching/api/dto/OrderBookResponse.java | 18 - .../example/matching/api/dto/OrderMapper.java | 21 - .../matching/api/dto/OrderRequest.java | 57 -- .../matching/api/dto/OrderResponse.java | 21 - .../example/matching/api/dto/PriceLevel.java | 13 - .../matching/api/dto/WalletResponse.java | 20 - .../api/service/LiquidBotService.java | 29 - .../api/service/MarketDataService.java | 67 -- .../matching/api/service/OrderService.java | 78 -- .../app/MatchingEngineApplication.java | 4 - .../matching/config/MatchingEngineConfig.java | 40 - .../matching/journal/EventJournal.java | 100 --- .../matching/matching/MatchingEngine.java | 184 ---- .../org/example/matching/model/Order.java | 93 -- .../org/example/matching/model/OrderBook.java | 259 ------ .../org/example/matching/model/OrderSide.java | 8 - .../example/matching/model/Reservation.java | 97 --- .../org/example/matching/model/Trade.java | 40 - .../org/example/matching/model/Wallet.java | 134 --- .../orderbook/InMemoryOrderRepository.java | 24 - .../matching/orderbook/OrderOrchestrator.java | 114 --- .../matching/orderbook/OrderRepository.java | 14 - .../example/matching/util/IdGenerator.java | 10 - .../matching/validation/OrderValidator.java | 34 - .../src/main/resources/application.properties | 12 - .../target/classes/application.properties | 12 - .../target/classes/org/example/Main.class | Bin 5934 -> 0 bytes .../matching/MatchingEngineApplication.class | Bin 771 -> 0 bytes .../classes/org/example/matching/Replay.class | Bin 3251 -> 0 bytes .../Wallets/InMemoryWalletService.class | Bin 6159 -> 0 bytes .../matching/Wallets/RiskManager.class | Bin 1091 -> 0 bytes .../matching/Wallets/WalletService.class | Bin 699 -> 0 bytes .../api/advice/ApiExceptionHandler.class | Bin 3503 -> 0 bytes .../api/controller/MarketController.class | Bin 2248 -> 0 bytes .../api/controller/OrderController.class | Bin 3858 -> 0 bytes .../api/controller/WalletController.class | Bin 5380 -> 0 bytes .../matching/api/dto/DepositRequest.class | Bin 2719 -> 0 bytes ...ookResponse$OrderBookResponseBuilder.class | Bin 2330 -> 0 bytes .../matching/api/dto/OrderBookResponse.class | Bin 3760 -> 0 bytes .../matching/api/dto/OrderMapper.class | Bin 1364 -> 0 bytes .../matching/api/dto/OrderRequest.class | Bin 4622 -> 0 bytes .../OrderResponse$OrderResponseBuilder.class | Bin 1996 -> 0 bytes .../matching/api/dto/OrderResponse.class | Bin 3436 -> 0 bytes .../example/matching/api/dto/PriceLevel.class | Bin 2373 -> 0 bytes ...WalletResponse$WalletResponseBuilder.class | Bin 2661 -> 0 bytes .../matching/api/dto/WalletResponse.class | Bin 4498 -> 0 bytes .../matching/api/service/OrderService.class | Bin 5896 -> 0 bytes .../app/MatchingEngineApplication.class | Bin 350 -> 0 bytes .../config/MatchingEngineConfig.class | Bin 2066 -> 0 bytes .../matching/journal/EventJournal.class | Bin 3303 -> 0 bytes .../matching/matching/MatchingEngine.class | Bin 8341 -> 0 bytes .../org/example/matching/model/Order.class | Bin 3369 -> 0 bytes .../example/matching/model/OrderBook.class | Bin 8420 -> 0 bytes .../example/matching/model/OrderSide.class | Bin 1163 -> 0 bytes .../example/matching/model/Reservation.class | Bin 3100 -> 0 bytes .../org/example/matching/model/Trade.class | Bin 2300 -> 0 bytes .../org/example/matching/model/Wallet.class | Bin 4473 -> 0 bytes .../orderbook/InMemoryOrderRepository.class | Bin 1488 -> 0 bytes .../orderbook/OrderOrchestrator.class | Bin 4555 -> 0 bytes .../matching/orderbook/OrderRepository.class | Bin 417 -> 0 bytes .../example/matching/util/IdGenerator.class | Bin 471 -> 0 bytes .../matching/validation/OrderValidator.class | Bin 947 -> 0 bytes .../compile/default-compile/createdFiles.lst | 37 - .../compile/default-compile/inputFiles.lst | 34 - .../default-testCompile/inputFiles.lst | 0 backend/src/main/java/org/example/Main.java | 7 - backend/src/pom.xml | 30 - common.iml | 19 - journals/engine.log | 38 - matching-engine/journals/engine.log | 463 ---------- matching-engine/matching-engine.iml | 67 -- matching-engine/pom.xml | 50 -- .../Wallets/InMemoryWalletService.java | 147 ---- .../example/matching/Wallets/RiskManager.java | 34 - .../matching/Wallets/WalletService.java | 18 - .../api/controller/EventController.java | 47 - .../api/controller/MarketController.java | 46 - .../api/controller/OrderController.java | 39 - .../api/controller/WalletController.java | 59 -- .../matching/api/dto/DepositRequest.java | 26 - .../matching/api/dto/EventRequest.java | 19 - .../example/matching/api/dto/MarketEvent.java | 42 - .../matching/api/dto/OrderBookResponse.java | 18 - .../example/matching/api/dto/OrderMapper.java | 28 - .../matching/api/dto/OrderRequest.java | 57 -- .../matching/api/dto/OrderResponse.java | 21 - .../example/matching/api/dto/PriceLevel.java | 13 - .../matching/api/dto/WalletResponse.java | 20 - .../matching/api/dto/enums/EventStatus.java | 7 - .../api/service/LiquidBotService.java | 154 ---- .../api/service/MarketDataService.java | 67 -- .../api/service/MarketManagmentService.java | 99 --- .../matching/api/service/OrderService.java | 120 --- .../api/service/SettlementService.java | 69 -- .../app/MatchingEngineApplication.java | 13 - .../matching/config/MatchingEngineConfig.java | 37 - .../matching/journal/EventJournal.java | 100 --- .../matching/matching/MatchingEngine.java | 118 --- .../org/example/matching/model/Order.java | 98 --- .../org/example/matching/model/OrderBook.java | 175 ---- .../org/example/matching/model/OrderSide.java | 8 - .../example/matching/model/Reservation.java | 101 --- .../org/example/matching/model/Trade.java | 50 -- .../org/example/matching/model/Wallet.java | 134 --- .../orderbook/InMemoryOrderRepository.java | 37 - .../matching/orderbook/OrderRepository.java | 16 - .../src/main/resources/application.properties | 12 - .../target/classes/application.properties | 12 - .../api/controller/EventController.class | Bin 4074 -> 0 bytes .../matching/api/dto/EventRequest.class | Bin 4403 -> 0 bytes .../dto/MarketEvent$MarketEventBuilder.class | Bin 3054 -> 0 bytes .../matching/api/dto/MarketEvent.class | Bin 6367 -> 0 bytes .../api/service/LiquidBotService.class | Bin 8897 -> 0 bytes .../api/service/MarketDataService.class | Bin 4477 -> 0 bytes .../api/service/MarketManagmentService.class | Bin 5797 -> 0 bytes .../api/service/SettlementService.class | Bin 3900 -> 0 bytes .../compile/default-compile/createdFiles.lst | 0 .../compile/default-compile/inputFiles.lst | 34 - .../default-testCompile/createdFiles.lst | 0 .../default-testCompile/inputFiles.lst | 0 src/main/java/org/example/Main.java | 7 - 222 files changed, 7536 deletions(-) delete mode 100644 .idea/compiler.xml delete mode 100644 .idea/libraries/Maven__ch_qos_logback_logback_classic_1_4_14.xml delete mode 100644 .idea/libraries/Maven__ch_qos_logback_logback_core_1_4_14.xml delete mode 100644 .idea/libraries/Maven__com_fasterxml_classmate_1_6_0.xml delete mode 100644 .idea/libraries/Maven__com_fasterxml_jackson_core_jackson_annotations_2_15_3.xml delete mode 100644 .idea/libraries/Maven__com_fasterxml_jackson_core_jackson_core_2_15_3.xml delete mode 100644 .idea/libraries/Maven__com_fasterxml_jackson_core_jackson_databind_2_15_3.xml delete mode 100644 .idea/libraries/Maven__com_fasterxml_jackson_datatype_jackson_datatype_jdk8_2_15_3.xml delete mode 100644 .idea/libraries/Maven__com_fasterxml_jackson_datatype_jackson_datatype_jsr310_2_15_3.xml delete mode 100644 .idea/libraries/Maven__com_fasterxml_jackson_module_jackson_module_parameter_names_2_15_3.xml delete mode 100644 .idea/libraries/Maven__io_micrometer_micrometer_commons_1_12_2.xml delete mode 100644 .idea/libraries/Maven__io_micrometer_micrometer_observation_1_12_2.xml delete mode 100644 .idea/libraries/Maven__jakarta_annotation_jakarta_annotation_api_2_1_1.xml delete mode 100644 .idea/libraries/Maven__jakarta_validation_jakarta_validation_api_3_0_2.xml delete mode 100644 .idea/libraries/Maven__org_apache_logging_log4j_log4j_api_2_21_1.xml delete mode 100644 .idea/libraries/Maven__org_apache_logging_log4j_log4j_to_slf4j_2_21_1.xml delete mode 100644 .idea/libraries/Maven__org_apache_tomcat_embed_tomcat_embed_core_10_1_18.xml delete mode 100644 .idea/libraries/Maven__org_apache_tomcat_embed_tomcat_embed_el_10_1_18.xml delete mode 100644 .idea/libraries/Maven__org_apache_tomcat_embed_tomcat_embed_websocket_10_1_18.xml delete mode 100644 .idea/libraries/Maven__org_apiguardian_apiguardian_api_1_1_2.xml delete mode 100644 .idea/libraries/Maven__org_hibernate_validator_hibernate_validator_8_0_1_Final.xml delete mode 100644 .idea/libraries/Maven__org_jboss_logging_jboss_logging_3_5_3_Final.xml delete mode 100644 .idea/libraries/Maven__org_junit_jupiter_junit_jupiter_5_10_0.xml delete mode 100644 .idea/libraries/Maven__org_junit_jupiter_junit_jupiter_api_5_10_1.xml delete mode 100644 .idea/libraries/Maven__org_junit_jupiter_junit_jupiter_engine_5_10_1.xml delete mode 100644 .idea/libraries/Maven__org_junit_jupiter_junit_jupiter_params_5_10_1.xml delete mode 100644 .idea/libraries/Maven__org_junit_platform_junit_platform_commons_1_10_1.xml delete mode 100644 .idea/libraries/Maven__org_junit_platform_junit_platform_engine_1_10_1.xml delete mode 100644 .idea/libraries/Maven__org_opentest4j_opentest4j_1_3_0.xml delete mode 100644 .idea/libraries/Maven__org_projectlombok_lombok_1_18_30.xml delete mode 100644 .idea/libraries/Maven__org_projectlombok_lombok_1_18_42.xml delete mode 100644 .idea/libraries/Maven__org_slf4j_jul_to_slf4j_2_0_11.xml delete mode 100644 .idea/libraries/Maven__org_slf4j_slf4j_api_2_0_11.xml delete mode 100644 .idea/libraries/Maven__org_springframework_boot_spring_boot_3_2_2.xml delete mode 100644 .idea/libraries/Maven__org_springframework_boot_spring_boot_autoconfigure_3_2_2.xml delete mode 100644 .idea/libraries/Maven__org_springframework_boot_spring_boot_starter_3_2_2.xml delete mode 100644 .idea/libraries/Maven__org_springframework_boot_spring_boot_starter_json_3_2_2.xml delete mode 100644 .idea/libraries/Maven__org_springframework_boot_spring_boot_starter_logging_3_2_2.xml delete mode 100644 .idea/libraries/Maven__org_springframework_boot_spring_boot_starter_tomcat_3_2_2.xml delete mode 100644 .idea/libraries/Maven__org_springframework_boot_spring_boot_starter_validation_3_2_2.xml delete mode 100644 .idea/libraries/Maven__org_springframework_boot_spring_boot_starter_web_3_2_2.xml delete mode 100644 .idea/libraries/Maven__org_springframework_spring_aop_6_1_3.xml delete mode 100644 .idea/libraries/Maven__org_springframework_spring_beans_6_1_3.xml delete mode 100644 .idea/libraries/Maven__org_springframework_spring_context_6_1_3.xml delete mode 100644 .idea/libraries/Maven__org_springframework_spring_core_6_1_3.xml delete mode 100644 .idea/libraries/Maven__org_springframework_spring_expression_6_1_3.xml delete mode 100644 .idea/libraries/Maven__org_springframework_spring_jcl_6_1_3.xml delete mode 100644 .idea/libraries/Maven__org_springframework_spring_web_6_1_3.xml delete mode 100644 .idea/libraries/Maven__org_springframework_spring_webmvc_6_1_3.xml delete mode 100644 .idea/libraries/Maven__org_yaml_snakeyaml_2_2.xml delete mode 100644 .idea/misc.xml delete mode 100644 .idea/modules.xml delete mode 100644 ".idea/shelf/Uncommitted_changes_before_Update_at_09_03_26,_7_40\342\200\257pm_[Changes]/InMemoryWalletService.class" delete mode 100644 ".idea/shelf/Uncommitted_changes_before_Update_at_09_03_26,_7_40\342\200\257pm_[Changes]/MarketController.class" delete mode 100644 ".idea/shelf/Uncommitted_changes_before_Update_at_09_03_26,_7_40\342\200\257pm_[Changes]/MatchingEngine.class" delete mode 100644 ".idea/shelf/Uncommitted_changes_before_Update_at_09_03_26,_7_40\342\200\257pm_[Changes]/MatchingEngineApplication.class" delete mode 100644 ".idea/shelf/Uncommitted_changes_before_Update_at_09_03_26,_7_40\342\200\257pm_[Changes]/MatchingEngineConfig.class" delete mode 100644 ".idea/shelf/Uncommitted_changes_before_Update_at_09_03_26,_7_40\342\200\257pm_[Changes]/OrderService.class" delete mode 100644 ".idea/shelf/Uncommitted_changes_before_Update_at_09_03_26,_7_40\342\200\257pm_[Changes]/Reservation.class" delete mode 100644 ".idea/shelf/Uncommitted_changes_before_Update_at_09_03_26,_7_40\342\200\257pm_[Changes]/WalletController.class" delete mode 100644 ".idea/shelf/Uncommitted_changes_before_Update_at_09_03_26,_7_40\342\200\257pm_[Changes]/WalletService.class" delete mode 100644 ".idea/shelf/Uncommitted_changes_before_Update_at_09_03_26,_7_40\342\200\257pm_[Changes]/shelved.patch" delete mode 100644 ".idea/shelf/Uncommitted_changes_before_Update_at_09_03_26,_7_40\342\200\257pm_[Changes]1/InMemoryWalletService.class" delete mode 100644 ".idea/shelf/Uncommitted_changes_before_Update_at_09_03_26,_7_40\342\200\257pm_[Changes]1/MarketController.class" delete mode 100644 ".idea/shelf/Uncommitted_changes_before_Update_at_09_03_26,_7_40\342\200\257pm_[Changes]1/MatchingEngine.class" delete mode 100644 ".idea/shelf/Uncommitted_changes_before_Update_at_09_03_26,_7_40\342\200\257pm_[Changes]1/MatchingEngineApplication.class" delete mode 100644 ".idea/shelf/Uncommitted_changes_before_Update_at_09_03_26,_7_40\342\200\257pm_[Changes]1/MatchingEngineConfig.class" delete mode 100644 ".idea/shelf/Uncommitted_changes_before_Update_at_09_03_26,_7_40\342\200\257pm_[Changes]1/OrderService.class" delete mode 100644 ".idea/shelf/Uncommitted_changes_before_Update_at_09_03_26,_7_40\342\200\257pm_[Changes]1/Reservation.class" delete mode 100644 ".idea/shelf/Uncommitted_changes_before_Update_at_09_03_26,_7_40\342\200\257pm_[Changes]1/WalletController.class" delete mode 100644 ".idea/shelf/Uncommitted_changes_before_Update_at_09_03_26,_7_40\342\200\257pm_[Changes]1/WalletService.class" delete mode 100644 ".idea/shelf/Uncommitted_changes_before_Update_at_09_03_26,_7_40\342\200\257pm_[Changes]1/shelved.patch" delete mode 100644 .idea/shelf/Uncommitted_changes_before_Update_at_09_03_26__7_40pm__Changes_.xml delete mode 100644 .idea/shelf/Uncommitted_changes_before_Update_at_09_03_26__7_40pm__Changes_1.xml delete mode 100644 .idea/workspace.xml delete mode 100644 Strongx.iml delete mode 100644 backend/.gitignore delete mode 100644 backend/README.md delete mode 100644 backend/common/pom.xml delete mode 100644 backend/common/src/main/java/org/example/Main.java delete mode 100644 backend/common/target/classes/org/example/Main.class delete mode 100644 backend/common/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst delete mode 100644 backend/common/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst delete mode 100644 backend/journals/engine.log delete mode 100644 backend/matching-engine/README.md delete mode 100644 backend/matching-engine/journals/engine.log delete mode 100644 backend/matching-engine/pom.xml delete mode 100644 backend/matching-engine/src/main/java/org/example/Main.java delete mode 100644 backend/matching-engine/src/main/java/org/example/matching/MatchingEngineApplication.java delete mode 100644 backend/matching-engine/src/main/java/org/example/matching/Replay.java delete mode 100644 backend/matching-engine/src/main/java/org/example/matching/Wallets/InMemoryWalletService.java delete mode 100644 backend/matching-engine/src/main/java/org/example/matching/Wallets/RiskManager.java delete mode 100644 backend/matching-engine/src/main/java/org/example/matching/Wallets/WalletService.java delete mode 100644 backend/matching-engine/src/main/java/org/example/matching/api/advice/ApiExceptionHandler.java delete mode 100644 backend/matching-engine/src/main/java/org/example/matching/api/controller/EventController.java delete mode 100644 backend/matching-engine/src/main/java/org/example/matching/api/controller/MarketController.java delete mode 100644 backend/matching-engine/src/main/java/org/example/matching/api/controller/OrderController.java delete mode 100644 backend/matching-engine/src/main/java/org/example/matching/api/controller/WalletController.java delete mode 100644 backend/matching-engine/src/main/java/org/example/matching/api/dto/DepositRequest.java delete mode 100644 backend/matching-engine/src/main/java/org/example/matching/api/dto/EventRequest.java delete mode 100644 backend/matching-engine/src/main/java/org/example/matching/api/dto/EventStatus.java delete mode 100644 backend/matching-engine/src/main/java/org/example/matching/api/dto/OrderBookResponse.java delete mode 100644 backend/matching-engine/src/main/java/org/example/matching/api/dto/OrderMapper.java delete mode 100644 backend/matching-engine/src/main/java/org/example/matching/api/dto/OrderRequest.java delete mode 100644 backend/matching-engine/src/main/java/org/example/matching/api/dto/OrderResponse.java delete mode 100644 backend/matching-engine/src/main/java/org/example/matching/api/dto/PriceLevel.java delete mode 100644 backend/matching-engine/src/main/java/org/example/matching/api/dto/WalletResponse.java delete mode 100644 backend/matching-engine/src/main/java/org/example/matching/api/service/LiquidBotService.java delete mode 100644 backend/matching-engine/src/main/java/org/example/matching/api/service/MarketDataService.java delete mode 100644 backend/matching-engine/src/main/java/org/example/matching/api/service/OrderService.java delete mode 100644 backend/matching-engine/src/main/java/org/example/matching/app/MatchingEngineApplication.java delete mode 100644 backend/matching-engine/src/main/java/org/example/matching/config/MatchingEngineConfig.java delete mode 100644 backend/matching-engine/src/main/java/org/example/matching/journal/EventJournal.java delete mode 100644 backend/matching-engine/src/main/java/org/example/matching/matching/MatchingEngine.java delete mode 100644 backend/matching-engine/src/main/java/org/example/matching/model/Order.java delete mode 100644 backend/matching-engine/src/main/java/org/example/matching/model/OrderBook.java delete mode 100644 backend/matching-engine/src/main/java/org/example/matching/model/OrderSide.java delete mode 100644 backend/matching-engine/src/main/java/org/example/matching/model/Reservation.java delete mode 100644 backend/matching-engine/src/main/java/org/example/matching/model/Trade.java delete mode 100644 backend/matching-engine/src/main/java/org/example/matching/model/Wallet.java delete mode 100644 backend/matching-engine/src/main/java/org/example/matching/orderbook/InMemoryOrderRepository.java delete mode 100644 backend/matching-engine/src/main/java/org/example/matching/orderbook/OrderOrchestrator.java delete mode 100644 backend/matching-engine/src/main/java/org/example/matching/orderbook/OrderRepository.java delete mode 100644 backend/matching-engine/src/main/java/org/example/matching/util/IdGenerator.java delete mode 100644 backend/matching-engine/src/main/java/org/example/matching/validation/OrderValidator.java delete mode 100644 backend/matching-engine/src/main/resources/application.properties delete mode 100644 backend/matching-engine/target/classes/application.properties delete mode 100644 backend/matching-engine/target/classes/org/example/Main.class delete mode 100644 backend/matching-engine/target/classes/org/example/matching/MatchingEngineApplication.class delete mode 100644 backend/matching-engine/target/classes/org/example/matching/Replay.class delete mode 100644 backend/matching-engine/target/classes/org/example/matching/Wallets/InMemoryWalletService.class delete mode 100644 backend/matching-engine/target/classes/org/example/matching/Wallets/RiskManager.class delete mode 100644 backend/matching-engine/target/classes/org/example/matching/Wallets/WalletService.class delete mode 100644 backend/matching-engine/target/classes/org/example/matching/api/advice/ApiExceptionHandler.class delete mode 100644 backend/matching-engine/target/classes/org/example/matching/api/controller/MarketController.class delete mode 100644 backend/matching-engine/target/classes/org/example/matching/api/controller/OrderController.class delete mode 100644 backend/matching-engine/target/classes/org/example/matching/api/controller/WalletController.class delete mode 100644 backend/matching-engine/target/classes/org/example/matching/api/dto/DepositRequest.class delete mode 100644 backend/matching-engine/target/classes/org/example/matching/api/dto/OrderBookResponse$OrderBookResponseBuilder.class delete mode 100644 backend/matching-engine/target/classes/org/example/matching/api/dto/OrderBookResponse.class delete mode 100644 backend/matching-engine/target/classes/org/example/matching/api/dto/OrderMapper.class delete mode 100644 backend/matching-engine/target/classes/org/example/matching/api/dto/OrderRequest.class delete mode 100644 backend/matching-engine/target/classes/org/example/matching/api/dto/OrderResponse$OrderResponseBuilder.class delete mode 100644 backend/matching-engine/target/classes/org/example/matching/api/dto/OrderResponse.class delete mode 100644 backend/matching-engine/target/classes/org/example/matching/api/dto/PriceLevel.class delete mode 100644 backend/matching-engine/target/classes/org/example/matching/api/dto/WalletResponse$WalletResponseBuilder.class delete mode 100644 backend/matching-engine/target/classes/org/example/matching/api/dto/WalletResponse.class delete mode 100644 backend/matching-engine/target/classes/org/example/matching/api/service/OrderService.class delete mode 100644 backend/matching-engine/target/classes/org/example/matching/app/MatchingEngineApplication.class delete mode 100644 backend/matching-engine/target/classes/org/example/matching/config/MatchingEngineConfig.class delete mode 100644 backend/matching-engine/target/classes/org/example/matching/journal/EventJournal.class delete mode 100644 backend/matching-engine/target/classes/org/example/matching/matching/MatchingEngine.class delete mode 100644 backend/matching-engine/target/classes/org/example/matching/model/Order.class delete mode 100644 backend/matching-engine/target/classes/org/example/matching/model/OrderBook.class delete mode 100644 backend/matching-engine/target/classes/org/example/matching/model/OrderSide.class delete mode 100644 backend/matching-engine/target/classes/org/example/matching/model/Reservation.class delete mode 100644 backend/matching-engine/target/classes/org/example/matching/model/Trade.class delete mode 100644 backend/matching-engine/target/classes/org/example/matching/model/Wallet.class delete mode 100644 backend/matching-engine/target/classes/org/example/matching/orderbook/InMemoryOrderRepository.class delete mode 100644 backend/matching-engine/target/classes/org/example/matching/orderbook/OrderOrchestrator.class delete mode 100644 backend/matching-engine/target/classes/org/example/matching/orderbook/OrderRepository.class delete mode 100644 backend/matching-engine/target/classes/org/example/matching/util/IdGenerator.class delete mode 100644 backend/matching-engine/target/classes/org/example/matching/validation/OrderValidator.class delete mode 100644 backend/matching-engine/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst delete mode 100644 backend/matching-engine/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst delete mode 100644 backend/matching-engine/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst delete mode 100644 backend/src/main/java/org/example/Main.java delete mode 100644 backend/src/pom.xml delete mode 100644 common.iml delete mode 100644 journals/engine.log delete mode 100644 matching-engine/journals/engine.log delete mode 100644 matching-engine/matching-engine.iml delete mode 100644 matching-engine/pom.xml delete mode 100644 matching-engine/src/main/java/org/example/matching/Wallets/InMemoryWalletService.java delete mode 100644 matching-engine/src/main/java/org/example/matching/Wallets/RiskManager.java delete mode 100644 matching-engine/src/main/java/org/example/matching/Wallets/WalletService.java delete mode 100644 matching-engine/src/main/java/org/example/matching/api/controller/EventController.java delete mode 100644 matching-engine/src/main/java/org/example/matching/api/controller/MarketController.java delete mode 100644 matching-engine/src/main/java/org/example/matching/api/controller/OrderController.java delete mode 100644 matching-engine/src/main/java/org/example/matching/api/controller/WalletController.java delete mode 100644 matching-engine/src/main/java/org/example/matching/api/dto/DepositRequest.java delete mode 100644 matching-engine/src/main/java/org/example/matching/api/dto/EventRequest.java delete mode 100644 matching-engine/src/main/java/org/example/matching/api/dto/MarketEvent.java delete mode 100644 matching-engine/src/main/java/org/example/matching/api/dto/OrderBookResponse.java delete mode 100644 matching-engine/src/main/java/org/example/matching/api/dto/OrderMapper.java delete mode 100644 matching-engine/src/main/java/org/example/matching/api/dto/OrderRequest.java delete mode 100644 matching-engine/src/main/java/org/example/matching/api/dto/OrderResponse.java delete mode 100644 matching-engine/src/main/java/org/example/matching/api/dto/PriceLevel.java delete mode 100644 matching-engine/src/main/java/org/example/matching/api/dto/WalletResponse.java delete mode 100644 matching-engine/src/main/java/org/example/matching/api/dto/enums/EventStatus.java delete mode 100644 matching-engine/src/main/java/org/example/matching/api/service/LiquidBotService.java delete mode 100644 matching-engine/src/main/java/org/example/matching/api/service/MarketDataService.java delete mode 100644 matching-engine/src/main/java/org/example/matching/api/service/MarketManagmentService.java delete mode 100644 matching-engine/src/main/java/org/example/matching/api/service/OrderService.java delete mode 100644 matching-engine/src/main/java/org/example/matching/api/service/SettlementService.java delete mode 100644 matching-engine/src/main/java/org/example/matching/app/MatchingEngineApplication.java delete mode 100644 matching-engine/src/main/java/org/example/matching/config/MatchingEngineConfig.java delete mode 100644 matching-engine/src/main/java/org/example/matching/journal/EventJournal.java delete mode 100644 matching-engine/src/main/java/org/example/matching/matching/MatchingEngine.java delete mode 100644 matching-engine/src/main/java/org/example/matching/model/Order.java delete mode 100644 matching-engine/src/main/java/org/example/matching/model/OrderBook.java delete mode 100644 matching-engine/src/main/java/org/example/matching/model/OrderSide.java delete mode 100644 matching-engine/src/main/java/org/example/matching/model/Reservation.java delete mode 100644 matching-engine/src/main/java/org/example/matching/model/Trade.java delete mode 100644 matching-engine/src/main/java/org/example/matching/model/Wallet.java delete mode 100644 matching-engine/src/main/java/org/example/matching/orderbook/InMemoryOrderRepository.java delete mode 100644 matching-engine/src/main/java/org/example/matching/orderbook/OrderRepository.java delete mode 100644 matching-engine/src/main/resources/application.properties delete mode 100644 matching-engine/target/classes/application.properties delete mode 100644 matching-engine/target/classes/org/example/matching/api/controller/EventController.class delete mode 100644 matching-engine/target/classes/org/example/matching/api/dto/EventRequest.class delete mode 100644 matching-engine/target/classes/org/example/matching/api/dto/MarketEvent$MarketEventBuilder.class delete mode 100644 matching-engine/target/classes/org/example/matching/api/dto/MarketEvent.class delete mode 100644 matching-engine/target/classes/org/example/matching/api/service/LiquidBotService.class delete mode 100644 matching-engine/target/classes/org/example/matching/api/service/MarketDataService.class delete mode 100644 matching-engine/target/classes/org/example/matching/api/service/MarketManagmentService.class delete mode 100644 matching-engine/target/classes/org/example/matching/api/service/SettlementService.class delete mode 100644 matching-engine/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst delete mode 100644 matching-engine/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst delete mode 100644 matching-engine/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst delete mode 100644 matching-engine/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst delete mode 100644 src/main/java/org/example/Main.java diff --git a/.idea/compiler.xml b/.idea/compiler.xml deleted file mode 100644 index 1c6ecb9..0000000 --- a/.idea/compiler.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Maven__ch_qos_logback_logback_classic_1_4_14.xml b/.idea/libraries/Maven__ch_qos_logback_logback_classic_1_4_14.xml deleted file mode 100644 index ac6986a..0000000 --- a/.idea/libraries/Maven__ch_qos_logback_logback_classic_1_4_14.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Maven__ch_qos_logback_logback_core_1_4_14.xml b/.idea/libraries/Maven__ch_qos_logback_logback_core_1_4_14.xml deleted file mode 100644 index 7a38623..0000000 --- a/.idea/libraries/Maven__ch_qos_logback_logback_core_1_4_14.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Maven__com_fasterxml_classmate_1_6_0.xml b/.idea/libraries/Maven__com_fasterxml_classmate_1_6_0.xml deleted file mode 100644 index fb8a548..0000000 --- a/.idea/libraries/Maven__com_fasterxml_classmate_1_6_0.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_annotations_2_15_3.xml b/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_annotations_2_15_3.xml deleted file mode 100644 index b194d9d..0000000 --- a/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_annotations_2_15_3.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_core_2_15_3.xml b/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_core_2_15_3.xml deleted file mode 100644 index b1af432..0000000 --- a/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_core_2_15_3.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_databind_2_15_3.xml b/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_databind_2_15_3.xml deleted file mode 100644 index 86cd658..0000000 --- a/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_databind_2_15_3.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Maven__com_fasterxml_jackson_datatype_jackson_datatype_jdk8_2_15_3.xml b/.idea/libraries/Maven__com_fasterxml_jackson_datatype_jackson_datatype_jdk8_2_15_3.xml deleted file mode 100644 index bffd290..0000000 --- a/.idea/libraries/Maven__com_fasterxml_jackson_datatype_jackson_datatype_jdk8_2_15_3.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Maven__com_fasterxml_jackson_datatype_jackson_datatype_jsr310_2_15_3.xml b/.idea/libraries/Maven__com_fasterxml_jackson_datatype_jackson_datatype_jsr310_2_15_3.xml deleted file mode 100644 index 50fc069..0000000 --- a/.idea/libraries/Maven__com_fasterxml_jackson_datatype_jackson_datatype_jsr310_2_15_3.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Maven__com_fasterxml_jackson_module_jackson_module_parameter_names_2_15_3.xml b/.idea/libraries/Maven__com_fasterxml_jackson_module_jackson_module_parameter_names_2_15_3.xml deleted file mode 100644 index 65bce52..0000000 --- a/.idea/libraries/Maven__com_fasterxml_jackson_module_jackson_module_parameter_names_2_15_3.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Maven__io_micrometer_micrometer_commons_1_12_2.xml b/.idea/libraries/Maven__io_micrometer_micrometer_commons_1_12_2.xml deleted file mode 100644 index cf8ca3f..0000000 --- a/.idea/libraries/Maven__io_micrometer_micrometer_commons_1_12_2.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Maven__io_micrometer_micrometer_observation_1_12_2.xml b/.idea/libraries/Maven__io_micrometer_micrometer_observation_1_12_2.xml deleted file mode 100644 index 54e7a97..0000000 --- a/.idea/libraries/Maven__io_micrometer_micrometer_observation_1_12_2.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Maven__jakarta_annotation_jakarta_annotation_api_2_1_1.xml b/.idea/libraries/Maven__jakarta_annotation_jakarta_annotation_api_2_1_1.xml deleted file mode 100644 index 3f660ae..0000000 --- a/.idea/libraries/Maven__jakarta_annotation_jakarta_annotation_api_2_1_1.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Maven__jakarta_validation_jakarta_validation_api_3_0_2.xml b/.idea/libraries/Maven__jakarta_validation_jakarta_validation_api_3_0_2.xml deleted file mode 100644 index 96ee2a5..0000000 --- a/.idea/libraries/Maven__jakarta_validation_jakarta_validation_api_3_0_2.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Maven__org_apache_logging_log4j_log4j_api_2_21_1.xml b/.idea/libraries/Maven__org_apache_logging_log4j_log4j_api_2_21_1.xml deleted file mode 100644 index ba17f0e..0000000 --- a/.idea/libraries/Maven__org_apache_logging_log4j_log4j_api_2_21_1.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Maven__org_apache_logging_log4j_log4j_to_slf4j_2_21_1.xml b/.idea/libraries/Maven__org_apache_logging_log4j_log4j_to_slf4j_2_21_1.xml deleted file mode 100644 index 30065dd..0000000 --- a/.idea/libraries/Maven__org_apache_logging_log4j_log4j_to_slf4j_2_21_1.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Maven__org_apache_tomcat_embed_tomcat_embed_core_10_1_18.xml b/.idea/libraries/Maven__org_apache_tomcat_embed_tomcat_embed_core_10_1_18.xml deleted file mode 100644 index 25acdc6..0000000 --- a/.idea/libraries/Maven__org_apache_tomcat_embed_tomcat_embed_core_10_1_18.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Maven__org_apache_tomcat_embed_tomcat_embed_el_10_1_18.xml b/.idea/libraries/Maven__org_apache_tomcat_embed_tomcat_embed_el_10_1_18.xml deleted file mode 100644 index b3b3c18..0000000 --- a/.idea/libraries/Maven__org_apache_tomcat_embed_tomcat_embed_el_10_1_18.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Maven__org_apache_tomcat_embed_tomcat_embed_websocket_10_1_18.xml b/.idea/libraries/Maven__org_apache_tomcat_embed_tomcat_embed_websocket_10_1_18.xml deleted file mode 100644 index ff7564a..0000000 --- a/.idea/libraries/Maven__org_apache_tomcat_embed_tomcat_embed_websocket_10_1_18.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Maven__org_apiguardian_apiguardian_api_1_1_2.xml b/.idea/libraries/Maven__org_apiguardian_apiguardian_api_1_1_2.xml deleted file mode 100644 index 6ac1c42..0000000 --- a/.idea/libraries/Maven__org_apiguardian_apiguardian_api_1_1_2.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Maven__org_hibernate_validator_hibernate_validator_8_0_1_Final.xml b/.idea/libraries/Maven__org_hibernate_validator_hibernate_validator_8_0_1_Final.xml deleted file mode 100644 index 69ad872..0000000 --- a/.idea/libraries/Maven__org_hibernate_validator_hibernate_validator_8_0_1_Final.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Maven__org_jboss_logging_jboss_logging_3_5_3_Final.xml b/.idea/libraries/Maven__org_jboss_logging_jboss_logging_3_5_3_Final.xml deleted file mode 100644 index d63874a..0000000 --- a/.idea/libraries/Maven__org_jboss_logging_jboss_logging_3_5_3_Final.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Maven__org_junit_jupiter_junit_jupiter_5_10_0.xml b/.idea/libraries/Maven__org_junit_jupiter_junit_jupiter_5_10_0.xml deleted file mode 100644 index 44d38c7..0000000 --- a/.idea/libraries/Maven__org_junit_jupiter_junit_jupiter_5_10_0.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Maven__org_junit_jupiter_junit_jupiter_api_5_10_1.xml b/.idea/libraries/Maven__org_junit_jupiter_junit_jupiter_api_5_10_1.xml deleted file mode 100644 index 3135587..0000000 --- a/.idea/libraries/Maven__org_junit_jupiter_junit_jupiter_api_5_10_1.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Maven__org_junit_jupiter_junit_jupiter_engine_5_10_1.xml b/.idea/libraries/Maven__org_junit_jupiter_junit_jupiter_engine_5_10_1.xml deleted file mode 100644 index 68b7903..0000000 --- a/.idea/libraries/Maven__org_junit_jupiter_junit_jupiter_engine_5_10_1.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Maven__org_junit_jupiter_junit_jupiter_params_5_10_1.xml b/.idea/libraries/Maven__org_junit_jupiter_junit_jupiter_params_5_10_1.xml deleted file mode 100644 index dad8df0..0000000 --- a/.idea/libraries/Maven__org_junit_jupiter_junit_jupiter_params_5_10_1.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Maven__org_junit_platform_junit_platform_commons_1_10_1.xml b/.idea/libraries/Maven__org_junit_platform_junit_platform_commons_1_10_1.xml deleted file mode 100644 index a0f728d..0000000 --- a/.idea/libraries/Maven__org_junit_platform_junit_platform_commons_1_10_1.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Maven__org_junit_platform_junit_platform_engine_1_10_1.xml b/.idea/libraries/Maven__org_junit_platform_junit_platform_engine_1_10_1.xml deleted file mode 100644 index 90b8509..0000000 --- a/.idea/libraries/Maven__org_junit_platform_junit_platform_engine_1_10_1.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Maven__org_opentest4j_opentest4j_1_3_0.xml b/.idea/libraries/Maven__org_opentest4j_opentest4j_1_3_0.xml deleted file mode 100644 index 87e7ec8..0000000 --- a/.idea/libraries/Maven__org_opentest4j_opentest4j_1_3_0.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Maven__org_projectlombok_lombok_1_18_30.xml b/.idea/libraries/Maven__org_projectlombok_lombok_1_18_30.xml deleted file mode 100644 index 291270e..0000000 --- a/.idea/libraries/Maven__org_projectlombok_lombok_1_18_30.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Maven__org_projectlombok_lombok_1_18_42.xml b/.idea/libraries/Maven__org_projectlombok_lombok_1_18_42.xml deleted file mode 100644 index 0a48dda..0000000 --- a/.idea/libraries/Maven__org_projectlombok_lombok_1_18_42.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Maven__org_slf4j_jul_to_slf4j_2_0_11.xml b/.idea/libraries/Maven__org_slf4j_jul_to_slf4j_2_0_11.xml deleted file mode 100644 index 01d6d92..0000000 --- a/.idea/libraries/Maven__org_slf4j_jul_to_slf4j_2_0_11.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Maven__org_slf4j_slf4j_api_2_0_11.xml b/.idea/libraries/Maven__org_slf4j_slf4j_api_2_0_11.xml deleted file mode 100644 index 893675a..0000000 --- a/.idea/libraries/Maven__org_slf4j_slf4j_api_2_0_11.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_boot_spring_boot_3_2_2.xml b/.idea/libraries/Maven__org_springframework_boot_spring_boot_3_2_2.xml deleted file mode 100644 index b90568e..0000000 --- a/.idea/libraries/Maven__org_springframework_boot_spring_boot_3_2_2.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_boot_spring_boot_autoconfigure_3_2_2.xml b/.idea/libraries/Maven__org_springframework_boot_spring_boot_autoconfigure_3_2_2.xml deleted file mode 100644 index 28aabc8..0000000 --- a/.idea/libraries/Maven__org_springframework_boot_spring_boot_autoconfigure_3_2_2.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_3_2_2.xml b/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_3_2_2.xml deleted file mode 100644 index a8563e6..0000000 --- a/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_3_2_2.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_json_3_2_2.xml b/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_json_3_2_2.xml deleted file mode 100644 index 8a26ba4..0000000 --- a/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_json_3_2_2.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_logging_3_2_2.xml b/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_logging_3_2_2.xml deleted file mode 100644 index 4b4c5f7..0000000 --- a/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_logging_3_2_2.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_tomcat_3_2_2.xml b/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_tomcat_3_2_2.xml deleted file mode 100644 index df7e906..0000000 --- a/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_tomcat_3_2_2.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_validation_3_2_2.xml b/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_validation_3_2_2.xml deleted file mode 100644 index a227960..0000000 --- a/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_validation_3_2_2.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_web_3_2_2.xml b/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_web_3_2_2.xml deleted file mode 100644 index d801436..0000000 --- a/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_web_3_2_2.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_spring_aop_6_1_3.xml b/.idea/libraries/Maven__org_springframework_spring_aop_6_1_3.xml deleted file mode 100644 index d0f8376..0000000 --- a/.idea/libraries/Maven__org_springframework_spring_aop_6_1_3.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_spring_beans_6_1_3.xml b/.idea/libraries/Maven__org_springframework_spring_beans_6_1_3.xml deleted file mode 100644 index ad680b1..0000000 --- a/.idea/libraries/Maven__org_springframework_spring_beans_6_1_3.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_spring_context_6_1_3.xml b/.idea/libraries/Maven__org_springframework_spring_context_6_1_3.xml deleted file mode 100644 index d1f8c22..0000000 --- a/.idea/libraries/Maven__org_springframework_spring_context_6_1_3.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_spring_core_6_1_3.xml b/.idea/libraries/Maven__org_springframework_spring_core_6_1_3.xml deleted file mode 100644 index 95226e9..0000000 --- a/.idea/libraries/Maven__org_springframework_spring_core_6_1_3.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_spring_expression_6_1_3.xml b/.idea/libraries/Maven__org_springframework_spring_expression_6_1_3.xml deleted file mode 100644 index 822f494..0000000 --- a/.idea/libraries/Maven__org_springframework_spring_expression_6_1_3.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_spring_jcl_6_1_3.xml b/.idea/libraries/Maven__org_springframework_spring_jcl_6_1_3.xml deleted file mode 100644 index 526a8ca..0000000 --- a/.idea/libraries/Maven__org_springframework_spring_jcl_6_1_3.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_spring_web_6_1_3.xml b/.idea/libraries/Maven__org_springframework_spring_web_6_1_3.xml deleted file mode 100644 index d30a176..0000000 --- a/.idea/libraries/Maven__org_springframework_spring_web_6_1_3.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_spring_webmvc_6_1_3.xml b/.idea/libraries/Maven__org_springframework_spring_webmvc_6_1_3.xml deleted file mode 100644 index 6d24fc7..0000000 --- a/.idea/libraries/Maven__org_springframework_spring_webmvc_6_1_3.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Maven__org_yaml_snakeyaml_2_2.xml b/.idea/libraries/Maven__org_yaml_snakeyaml_2_2.xml deleted file mode 100644 index 998e133..0000000 --- a/.idea/libraries/Maven__org_yaml_snakeyaml_2_2.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index 03f397c..0000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index e03607b..0000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git "a/.idea/shelf/Uncommitted_changes_before_Update_at_09_03_26,_7_40\342\200\257pm_[Changes]/InMemoryWalletService.class" "b/.idea/shelf/Uncommitted_changes_before_Update_at_09_03_26,_7_40\342\200\257pm_[Changes]/InMemoryWalletService.class" deleted file mode 100644 index 9dbce519e410222620ce906a03a078d01491e5dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6359 zcmbtY33yc189g_%yv*b=69S126$C{{LU0gKlmJR1NPq-nAPBbV%ghT5%o5(b3F6Xf z)w)(~YpdAST5W4Hj|ZIDkc>A&ffsH28G{5EN+KY786kjFHQ%WDNqe+U^EwjKK zhMmsm3iX&sctt+nP*zL2(wN?^{an()=SfqZ^jeD%m3olPWpijHG3RUlvt4P_|gq}I`D+dOs+ z7IR5yLwuRr=xo4oI9|ha9VcLhz_<|{5N9%<9V*&p&)|}Q0zDzn?N#CUv2#ofu6~c- zJ2kWlOsi>cHlH#xuG7M3$1DvUI%eZUfvIC`P~-@NHkdRb)1IN8D~_M zNT(Qat;F?4mdKUd-id`87U@_l;ZA=un*{thBWu>*UeNw4%o| zRu$n7$GW`Y|5B5v%~wG7O{izn4yF z{1rOhDa~lIO!~fHy7Q8431g1@xLU`%beS%7 zCU)m}nyC`b;N68gG<;CUhu)|$ zDINDo+ad&>Ff$n!xt!W93lB@sE-aV6yaqqeEV<3+*gK`<&&k^H*kPr!Y(MWapBHGa zNo)C1a@b`glt^#R8Fta4vzB@I<8@@AC&|jysix==C(zn>!bu#+p1t_01GW~{?mVI~7Z*NJ{@AGOOfMr%{Ue&1k zU{kY4k%K1RjT_3kraGv0W;e7L9`!$ws9Xqdl9ZS8{3;E z>_v0C*o)YMO2(J@If)WLxe`Yd6WDLYRK)mPorHs&kyX!BkJWX8z!H%Sf??@NMau>$L_B{yCn)N6q1N$+} zM?Pmhpw>z=B~9S{PnzT?m{?IT5zi=MT?Nl@iNLe?nxjBmju7fOwr5reZN2=6_qBJF zFn58U?Nduw&~!!#OLk!myJz!n<<;r=ftbG~P{Qgv5b*6jfW$_QukR=?@IQicXYa%L z3$&Ofml=fKC|AU^{V;vla4(j}{Iiv;64JGW_{u^8v4FcWTagoRPc~$-k>gxJIUeL(vqP0-V8gJd=sAghAKE;OizS%dm(~ zbQwGCj>d|Si}9k0oe1fZ6x4CoamqBGGA#<W;T>PQ#KkeDN?j_k*KWHgPcAQvc=P6ZjQazq9B32t-wokvBo{Dh_G{kT=|F(r$b%uA;* zC6!pG)`ne6o=|IE=FXquXO5)0mGo32aW_y>jFEEtetekcND22mf%aZ^@RQ!bzK(;? zW|vcX3Ixh z&*3+!0G`dm^tWsUi18u(jx{7mq<7)>sxuei{E0e3M0cIaum)9OPJ{Lu z=Bm2cj@N0IU}q&>VJYINcdS-{j8X;A~bo@q;e^Gh1DV~uY`mu&-F!wCleub z05do8Y(H>#uzF9?kV-bLCa%A#O6bSm*sH_eX|)sH|K#_-_$R~rzZCu|%ld0Vrg@l` L&!DI$tFiw9nB01+ diff --git "a/.idea/shelf/Uncommitted_changes_before_Update_at_09_03_26,_7_40\342\200\257pm_[Changes]/MarketController.class" "b/.idea/shelf/Uncommitted_changes_before_Update_at_09_03_26,_7_40\342\200\257pm_[Changes]/MarketController.class" deleted file mode 100644 index 01508e26473cb07d89a90dfcae0e639800afd102..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3590 zcmbtWYjYGu6g`~>o5zsHvf<$i1e9bG7(kwGh(ZX6CL|^hMexzP+a^PHXV#hCAZ7Vi zEPsMlNwoZ6`Pm<3dAetJv)N2wQhu22p5EK{o_p?N?mz$j`4@m2Q2ppacLqHUdT~JD zQV_1W>U&wORg_zmy0q^3Yp$$$ZYl6}7*r}MbQff}q4aF)KwzjTI_Ix>z7jY$pQxxQ zMisH@SiUfTKJ;fW;9wArz|?*&3ks@I+vD?3<)(BilE_zdNCyfN$#9Hc zWgWPSVOfQ@f?#7=MYX_>6afukID-)fqsR)JF@U0)(e-U8tLj-0Zn*1O*WBifIbVDF zxj0YLjyBn|KFpf3DQPe83mKeawQRdL??u`GIq%>CE;0zE zP)V(<9)WrSIlH5h=H%WhDj+UtYnH@Z!sQIEIJk;yJ5nW1Wq||Jp6}@yf$s5%)i|WB z66(nQR!CD;P(h$)HYhU#hv(Tz?$@hD6+V!~3Qw~0K}l9tW$2mr#$k_M_sIB_z4PED zor~56JU`N5-DHNb&{-Fh=!;st<^0}OlKTkhTTpsEC@)FVH?#_gwSUE1^QEqb^eIRP zaU81@tzvq=aAxSvvE@2@RaLEekw+SD`hK9LNlqe*TT7?qXR7EHJ-_VAmaKbMX_jWq zG*^M%O2IpI!pL!UM{h6 zXIyE`Bookvx>1m6P8v<4Gaw1yJp$MAn1#F#u+Q8Olee$d=zs-9ohiadyW z0zW4ND-E*UGU>7Ili16)#yUAjDv6~aYO9GMSJ{t&8+Y_(hf1SpSy>uwk&xM+#*@o@ zuVE@#`lX-cLfSi>U%!Is{{t&QJuIm^o@vr!ab|8$hv!U530zCfW5fOJ_A+P((5jt; z_NORnn^FrLTDtgY1G@%XNrC zAMv^O7$U;Q_=IN}RtV;~5m;y;GCGXSVIn$2L`Syp<_<^)C=Q&qa1O_!EjYssIJ-dH zPXMvl31SJK(mg}VW!f-S1_|QS7S8;Qv)i1+046K|Cl+e}h#g)|u(d+D3wY3A-DhNM zY>fKJsk6s=#(KBlCb)UgTA67?vdMZD4=w8^x~tq7zOwj?I}^(+KIg8-?jGR_+B9^G z_3{!Z4hn)Iz#~2}IDwv&%VH^UwIzqRLtL~^(-IDw*r_W+W7yR&0FJH&Wy$M%y@CIn*t;JYlMd*RQQcm QD=q#k--|8$C6s~x00;B^!vFvP diff --git "a/.idea/shelf/Uncommitted_changes_before_Update_at_09_03_26,_7_40\342\200\257pm_[Changes]/MatchingEngine.class" "b/.idea/shelf/Uncommitted_changes_before_Update_at_09_03_26,_7_40\342\200\257pm_[Changes]/MatchingEngine.class" deleted file mode 100644 index e303a3f78b7f5577210b2194d6b0406efc3a2e0a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11725 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 X*>~u#6U?M4*e&E+yd&+}z6YKF5$4Q5 diff --git "a/.idea/shelf/Uncommitted_changes_before_Update_at_09_03_26,_7_40\342\200\257pm_[Changes]/MatchingEngineConfig.class" "b/.idea/shelf/Uncommitted_changes_before_Update_at_09_03_26,_7_40\342\200\257pm_[Changes]/MatchingEngineConfig.class" deleted file mode 100644 index 8566c3b725ab24dd84c6de5011cab09109e84a90..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2224 zcmb_d-A)rh7(G)8g{Ayh6+}@%6kA$Y1m&h;q6DLciUEVc3(d3)WuV<9+b!S|=;P>B z6G?mkAIkX6bX!W96*cst^ONs8=X`&&KYxAy0bmge79!|~AsR;~x)=s``2n{}+$q|t z`CU=)8M+=zNBU0~I+Cf47`ho!u2;0h5ijqTgk9!-VMmhvu3PmSUb2@DgyX-eA1uTa zdN0F*(Z}_+gqL^SJ^Q7T6J^)?w5o2_#J*dRJ{>Js3ZS21&Is_1mrBB~G~Mgxb>SVz zg0RqsK^52~hWX@*5#U5Y8*^3#dzm3=bZhXg$;w`iJG>}73kh6RY(oqmL)aQ_r(|aT zN7*%oj8R#$9=V_}%T7@`l#5|pSL$vsyuSc-rfTby-DH?G3M;tIwk+DGWi9DThUk*J zB^U-)Nb2iqIWN4oJYS-l#EM(sr48;$bq+40{*J6rOPCY)2cj%PT(tBj!*nubMllA+ zFtS#4d|4J7vLZ>)Q^#?A?n~DpJ<}SgvhUG2YWvkaa znH`2NA)?J1{#C#^0k%vrl_g_FH!ET2Z%kZ$&=@{nKq$uU3yGq^-!@tlN!lEV5uCwV zr$@UWo=Y`%Bc?f>QC|mo%Qfs@^m%={tDYW^EXFZPUmNx70#n}``oBddn^s0^=Tr^s z8*L)E9T)-q7^8i>Za@%s=)^FAyJV%D=V(>V-N%S+*3k2n_O1Sj7XR+R{~p;W@=015 z?jv~?%Ob3JJJ#^ISSd`QL+e_kRR!B~jK0lu4Fm09qZ(|eZWIV3bCQ!LQ5kaWRN8>k zYNs(1FuXvNc7Sz^#AZ5E!W5rzVSNvYrTC!$3HT2WJU~HQ`7* d;pDl56S`n3x`1$^Ey4)q=_Z1Q&A1-{zX8@7Uhn__ diff --git "a/.idea/shelf/Uncommitted_changes_before_Update_at_09_03_26,_7_40\342\200\257pm_[Changes]/OrderService.class" "b/.idea/shelf/Uncommitted_changes_before_Update_at_09_03_26,_7_40\342\200\257pm_[Changes]/OrderService.class" deleted file mode 100644 index db2376610e328844b4cbf882ee07e55ed0b665c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5980 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 diff --git "a/.idea/shelf/Uncommitted_changes_before_Update_at_09_03_26,_7_40\342\200\257pm_[Changes]/Reservation.class" "b/.idea/shelf/Uncommitted_changes_before_Update_at_09_03_26,_7_40\342\200\257pm_[Changes]/Reservation.class" deleted file mode 100644 index 79bf7e04598d78d0dd4852573bc88bad1a652f7b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3101 zcmbVOU2_v<6n-{MvPqgk`e|cBKlljgLP?A$N&%%mwGhTSD_?$P%c1ag>oMiHzec$u-JmRiw;lv&)4B7&%nSRBKMYe+Zk-K_Pc zS$|NovUSrbRjRbCH_KKnd(&!J_CwRDHX9oB>vq|)3uO&sYkMI!9h>^g;`Bfq2gPH! zO{+p#wnpO^!?=b65A15mGM%nNOM_OFxCZPiVt*x0?{e8t0p946y<6Ehk@ z)z(UzyW^gyE6rxjG8@Yg9Adoni#M;X-V&R+IOZjVShdk|>~`I1I58Z?5gkY4IEFMc z*-L%hbSk8zUM09trchWc#E`+F4kL~eIH_TDPq!D4sqS<`Z=1C?agfkE68KacSpiBU zLYY;*WVR}D@Kzjo#X$dHvtm-za4zG)(_?Y}PO;$G>!V)W))2hJ3TZgFR&7|<+VvgF zzGd#zxHGoaESa@!)2_;MZ!_prs*IUg`)|cwX0@CBYA4n$r_wBMn6_EB9LuJkYyUrY z51bxoK{K-Hn5Fyc<^z?l4z{YNjk}5(BDPg-m#h^wLoicVERy~&q+cSXW~0Sovo#|n z^1js)F}7aRaZwS7rL!B`I2^@cCt;CUJI)NtNJsIQO|zAzFl2! zTeDXR^wAph5zG{YgHg{x--$Th7`QqklBe6=eTUvaLXMD1hhD`=pQ?%8hR^-M zUg?TOk6xc9aT(iew(XL2xhfr*=u)P}$SJu}Sm4D7aCk*H9XNz2jmhXxE9V8*fD8t; z@;drv?_p*F`VC?NQB2|hqmMIw64RLD?=ePuml_uk=5HEj@E%u@-e-22 zk|ck@l$MFdJVX)(p(bC{Tqy={u?4m{Ru)Y zpdk;S6agI~pjiT%V^Z^kvOwuDXVnn}=!&8%=K{*PfO4uJ0x0JK%DI4Yihdy@Cj*yW z&QWImFJM5|5z%p;-=L-=!xda3FNo3SDA3hb+$6)k+|1Lrh7a&zkDotCs?d6W<}qT% zb4+}PQ1sc1NIzrYd~}7<^p80H4brJcloQnzM@7%RAz0yop;qp3ZU=M#9Dnug)HzZd>ZF03)N)1v91Q`WCkLx#Udu%b> zobSCVKIyr9%38{cCI9*vJ8MkoGBl>tKu8Yr<>8O$GtOChbE}?LFE+WId3TcL-AS5v zCuv^IPno27)hF`$%JVbc^CvHkVbwbe5ef-9OVCY%4iYp?&?rIm1P8Lb3qPfK0Jr}E D%fj-V diff --git "a/.idea/shelf/Uncommitted_changes_before_Update_at_09_03_26,_7_40\342\200\257pm_[Changes]/WalletController.class" "b/.idea/shelf/Uncommitted_changes_before_Update_at_09_03_26,_7_40\342\200\257pm_[Changes]/WalletController.class" deleted file mode 100644 index 5d8e922f4afa01901a42e59aa332c5781064d723..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5531 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 I#-+Ud1*quQOaK4? diff --git "a/.idea/shelf/Uncommitted_changes_before_Update_at_09_03_26,_7_40\342\200\257pm_[Changes]/shelved.patch" "b/.idea/shelf/Uncommitted_changes_before_Update_at_09_03_26,_7_40\342\200\257pm_[Changes]/shelved.patch" deleted file mode 100644 index d6a1148..0000000 --- "a/.idea/shelf/Uncommitted_changes_before_Update_at_09_03_26,_7_40\342\200\257pm_[Changes]/shelved.patch" +++ /dev/null @@ -1,805 +0,0 @@ -Index: matching-engine/src/main/java/org/example/matching/MatchingEngineApplication.java -IDEA additional info: -Subsystem: com.intellij.openapi.diff.impl.patch.BaseRevisionTextPatchEP -<+>package org.example.matching;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class MatchingEngineApplication {\n public static void main(String[] args) {\n SpringApplication.run(MatchingEngineApplication.class, args);\n }\n}\n -=================================================================== -diff --git a/matching-engine/src/main/java/org/example/matching/MatchingEngineApplication.java b/matching-engine/src/main/java/org/example/matching/MatchingEngineApplication.java ---- a/matching-engine/src/main/java/org/example/matching/MatchingEngineApplication.java -+++ b/matching-engine/src/main/java/org/example/matching/MatchingEngineApplication.java -@@ -6,6 +6,7 @@ - @SpringBootApplication - public class MatchingEngineApplication { - public static void main(String[] args) { -+ - SpringApplication.run(MatchingEngineApplication.class, args); - } - } -Index: matching-engine/src/main/java/org/example/matching/api/service/LiquidBotService.java -IDEA additional info: -Subsystem: com.intellij.openapi.diff.impl.patch.BaseRevisionTextPatchEP -<+>package org.example.matching.api.service;\n\nimport lombok.RequiredArgsConstructor;\nimport org.example.matching.api.dto.OrderRequest;\nimport org.springframework.stereotype.Service;\n\n@Service\n@RequiredArgsConstructor\npublic class LiquidBotService {\n private final OrderService orderService;\n public void seedMarket(String yesTicker, String noTicker) {\n // Providing liquidity for YES\n placeBotOrder(yesTicker, \"BUY\", 45, 1000); // Bot buys from users at 45c\n placeBotOrder(yesTicker, \"SELL\", 55, 1000); // Bot sells to users at 55c\n\n // Providing liquidity for NO\n placeBotOrder(noTicker, \"BUY\", 45, 1000); // Bot buys from users at 45c\n placeBotOrder(noTicker, \"SELL\", 55, 1000); // Bot sells to users at 55c\n }\n private void placeBotOrder(String ticker, String side, long price, long qty){\n OrderRequest req = new OrderRequest();\n req.setUserId(\"HOUSE_BOT\");\n req.setInstrument(ticker);\n req.setSide(side);\n req.setPrice(price);\n req.setQuantity(qty);\n orderService.processOrder(req);\n }\n} -=================================================================== -diff --git a/matching-engine/src/main/java/org/example/matching/api/service/LiquidBotService.java b/matching-engine/src/main/java/org/example/matching/api/service/LiquidBotService.java ---- a/matching-engine/src/main/java/org/example/matching/api/service/LiquidBotService.java -+++ b/matching-engine/src/main/java/org/example/matching/api/service/LiquidBotService.java -@@ -1,29 +1,84 @@ - package org.example.matching.api.service; - - import lombok.RequiredArgsConstructor; -+import org.example.matching.Wallets.WalletService; -+import org.example.matching.api.dto.MarketEvent; - import org.example.matching.api.dto.OrderRequest; -+import org.example.matching.api.service.OrderService; -+import org.example.matching.matching.MatchingEngine; - import org.springframework.stereotype.Service; - -+import java.util.concurrent.atomic.AtomicLong; -+ - @Service - @RequiredArgsConstructor - public class LiquidBotService { - private final OrderService orderService; -- public void seedMarket(String yesTicker, String noTicker) { -- // Providing liquidity for YES -- placeBotOrder(yesTicker, "BUY", 45, 1000); // Bot buys from users at 45c -- placeBotOrder(yesTicker, "SELL", 55, 1000); // Bot sells to users at 55c -+ private final WalletService walletService; -+ private final MatchingEngine matchingEngine; -+ private final MarketManagmentService marketManagmentService; -+ -+ private static final String BOT_ID = "HOUSE_BOT"; -+ private static final long INITIAL_INVENTORY = 10000; -+ private static final int SPREAD = 4; -+ -+ /** -+ * Entry point from OrderService. -+ */ -+ public void updateMarketTrigger(String currentTicker) { -+ // 1. Correctly fetch the EVENT object using the ticker -+ MarketEvent event = marketManagmentService.getEventByTicker(currentTicker); -+ if (event == null) return; -+ -+ // 2. Correctly fetch the PARTNER ticker name (String) -+ String partnerTicker = marketManagmentService.getPartnerTicker(currentTicker); -+ if (partnerTicker == null) return; - -- // Providing liquidity for NO -- placeBotOrder(noTicker, "BUY", 45, 1000); // Bot buys from users at 45c -- placeBotOrder(noTicker, "SELL", 55, 1000); // Bot sells to users at 55c -+ // 3. Identify roles and pull liquidity 'L' -+ String yesTicker = event.getYesTicker(); -+ String noTicker = event.getNoTicker(); -+ long L = event.getLiquidity(); -+ -+ recalculateAndPlaceOrders(yesTicker, noTicker, L); - } -- private void placeBotOrder(String ticker, String side, long price, long qty){ -+ -+ private void recalculateAndPlaceOrders(String yesTicker, String noTicker, long L) { -+ // Get YES Inventory -+ long yesInventory = walletService.getWallet(BOT_ID) -+ .getAvailableShares() -+ .getOrDefault(yesTicker, new AtomicLong(0)) -+ .get(); -+ -+ // KALSHI MATH: Sigmoid Curve -+ long netSold = INITIAL_INVENTORY - yesInventory; -+ -+ // Price = 100 / (1 + e^(-netSold / L)) -+ double exponent = (double) netSold / L; -+ long fairPriceYes = (long) (100.0 / (1.0 + Math.exp(-exponent))); -+ -+ fairPriceYes = Math.max(1, Math.min(99, fairPriceYes)); -+ long fairPriceNo = 100 - fairPriceYes; -+ -+ // Cleanup and Quote -+ matchingEngine.cancelAllOrdersForUser(BOT_ID, yesTicker); -+ matchingEngine.cancelAllOrdersForUser(BOT_ID, noTicker); -+ -+ placeBotOrder(yesTicker, "BUY", fairPriceYes - (SPREAD / 2), 500); -+ placeBotOrder(yesTicker, "SELL", fairPriceYes + (SPREAD / 2), 500); -+ -+ placeBotOrder(noTicker, "BUY", fairPriceNo - (SPREAD / 2), 500); -+ placeBotOrder(noTicker, "SELL", fairPriceNo + (SPREAD / 2), 500); -+ } -+ -+ private void placeBotOrder(String ticker, String side, long price, long qty) { -+ long safePrice = Math.max(1, Math.min(99, price)); - OrderRequest req = new OrderRequest(); -- req.setUserId("HOUSE_BOT"); -+ req.setUserId(BOT_ID); - req.setInstrument(ticker); - req.setSide(side); -- req.setPrice(price); -+ req.setPrice(safePrice); - req.setQuantity(qty); -+ req.setIdempotencyKey("BOT-" + ticker + "-" + side + "-" + System.nanoTime()); - orderService.processOrder(req); - } - } -\ No newline at end of file -Index: matching-engine/src/main/java/org/example/matching/api/controller/MarketController.java -IDEA additional info: -Subsystem: com.intellij.openapi.diff.impl.patch.BaseRevisionTextPatchEP -<+>package org.example.matching.api.controller;\n\nimport lombok.RequiredArgsConstructor;\nimport org.example.matching.api.dto.OrderBookResponse;\nimport org.example.matching.api.service.MarketDataService;\nimport org.example.matching.matching.MatchingEngine;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.PathVariable;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport java.util.Map;\n\n@RequestMapping(\"/api/market\")\n@RestController\n@RequiredArgsConstructor\npublic class MarketController {\n private final MatchingEngine matchingEngine;\n private final MarketDataService marketDataService;\n\n// public MarketController(MatchingEngine matchingEngine) {\n// this.matchingEngine = matchingEngine;\n// }\n\n @GetMapping(\"/orderbook/{instrument}\")\n public ResponseEntity getOrderBook(@PathVariable String instrument) {\n OrderBookResponse snapshot = matchingEngine.getSnapshot(instrument);\n return ResponseEntity.ok(snapshot);\n }\n\n @GetMapping(\"/ticker/{instrument}\")\n public ResponseEntity> getTicker(@PathVariable String instrument){\n return ResponseEntity.ok(marketDataService.getSnapshots(instrument.toUpperCase()));\n }\n}\n -=================================================================== -diff --git a/matching-engine/src/main/java/org/example/matching/api/controller/MarketController.java b/matching-engine/src/main/java/org/example/matching/api/controller/MarketController.java ---- a/matching-engine/src/main/java/org/example/matching/api/controller/MarketController.java -+++ b/matching-engine/src/main/java/org/example/matching/api/controller/MarketController.java -@@ -1,15 +1,15 @@ - package org.example.matching.api.controller; - - import lombok.RequiredArgsConstructor; -+import org.example.matching.api.dto.MarketEvent; - import org.example.matching.api.dto.OrderBookResponse; - import org.example.matching.api.service.MarketDataService; -+import org.example.matching.api.service.MarketManagmentService; - import org.example.matching.matching.MatchingEngine; - import org.springframework.http.ResponseEntity; --import org.springframework.web.bind.annotation.GetMapping; --import org.springframework.web.bind.annotation.PathVariable; --import org.springframework.web.bind.annotation.RequestMapping; --import org.springframework.web.bind.annotation.RestController; -+import org.springframework.web.bind.annotation.*; - -+import java.util.List; - import java.util.Map; - - @RequestMapping("/api/market") -@@ -19,10 +19,12 @@ - private final MatchingEngine matchingEngine; - private final MarketDataService marketDataService; - -+ private final MarketManagmentService marketService; - // public MarketController(MatchingEngine matchingEngine) { - // this.matchingEngine = matchingEngine; - // } - -+ - @GetMapping("/orderbook/{instrument}") - public ResponseEntity getOrderBook(@PathVariable String instrument) { - OrderBookResponse snapshot = matchingEngine.getSnapshot(instrument); -@@ -33,4 +35,19 @@ - public ResponseEntity> getTicker(@PathVariable String instrument){ - return ResponseEntity.ok(marketDataService.getSnapshots(instrument.toUpperCase())); - } -+ @GetMapping("/active") -+ public List getActiveMarkets() { -+ // This pulls from your MarketManagementService -+ return (List) marketService.getAllOpenEvents(); -+ } -+ @PostMapping("/events/create") -+ public ResponseEntity createEvent( -+ @RequestParam String id, -+ @RequestParam String question, -+ @RequestParam String yesTicker, -+ @RequestParam String noTicker, -+ @RequestParam int minutes) { -+ return ResponseEntity.ok(marketService.createEvent(id, question, yesTicker, noTicker, minutes)); -+ } -+ - } -Index: matching-engine/src/main/java/org/example/matching/matching/MatchingEngine.java -IDEA additional info: -Subsystem: com.intellij.openapi.diff.impl.patch.BaseRevisionTextPatchEP -<+>//package org.example.matching.matching;\n//\n//import org.example.matching.journal.EventJournal;\n//import org.example.matching.model.Order;\n//import org.example.matching.model.OrderBook;\n//import org.example.matching.model.Trade;\n//\n//import java.util.List;\n//\n//public class MatchingEngine {\n//\n// private final OrderBook orderBook;\n// private final EventJournal journal;\n//\n// public MatchingEngine() {\n// this.orderBook = new OrderBook();\n// this.journal = new EventJournal();\n//\n// }\n//\n// public List placeOrder(Order order) {\n//\n// journal.append(\"ORDER \" +\n// order.getId() + \" \" +\n// order.getUserId() + \" \" +\n//\n// order.getPrice() + \" \" +\n// order.getQuantity()\n// +\" \"+ order.getTimestamp() + \" \"+ order.getSide());\n//\n// List trades = orderBook.placeOrder(order);\n//\n// for (Trade trade : trades) {\n// journal.append(\"TRADE \" +\n// trade.getBuyOrderId() + \" \" +\n// trade.getSellOrderId() + \" \" +\n// trade.getPrice() + \" \" +\n// trade.getQuantity()\n// +trade.getTimestamp());\n// }\n//\n// return trades;\n// }\n//\n// public String dumpBook() {\n// return orderBook.dumpBook();\n// }\n//}\n\n\npackage org.example.matching.matching;\n\nimport jakarta.annotation.PostConstruct;\nimport org.example.matching.api.dto.OrderBookResponse;\nimport org.example.matching.api.dto.PriceLevel;\nimport org.example.matching.journal.EventJournal;\nimport org.example.matching.model.Order;\nimport org.example.matching.model.OrderBook;\nimport org.example.matching.model.Trade;\nimport org.springframework.stereotype.Service;\n\nimport java.util.Deque;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.TreeMap;\nimport java.util.concurrent.ConcurrentHashMap;\n\n\n@Service\npublic class MatchingEngine {\n\n private final Map orderBooks = new ConcurrentHashMap<>();\n private final EventJournal journal;\n\n public MatchingEngine() {\n this.journal = new EventJournal();\n }\n\n @PostConstruct\n public void init() {\n // Pre-create books for stocks you want to test\n orderBooks.put(\"AAPL\", new OrderBook());\n orderBooks.put(\"TSLA\", new OrderBook());\n orderBooks.put(\"BTC\", new OrderBook());\n }\n\n // Helper method to get the right order book\n private OrderBook getOrderBook(String instrument) {\n return orderBooks.computeIfAbsent(instrument, k -> new OrderBook());\n }\n // Add this inside your MatchingEngine class\n public OrderBook getOrderBookForMarketData(String instrument) {\n return orderBooks.getOrDefault(instrument, new OrderBook());\n }\n\n // live mode records to journal; record=false used during replay\n public List placeOrder(Order order, boolean record) {\n if (record) {\n journal.appendOrder(order.getId(), order.getUserId(), order.getSide().name(), order.getPrice(), order.getQuantity(), order.getTimestamp());\n }\n\n OrderBook book = getOrderBook(order.getInstrument() != null ? order.getInstrument() : \"DEFAULT\");\n List trades = book.placeOrder(order);\n\n if (record) {\n for (Trade t : trades) {\n journal.appendTrade(t.getBuyOrderId(), t.getSellOrderId(), t.getPrice(), (int) t.getQuantity(), t.getTimestamp());\n }\n }\n return trades;\n }\n\n // convenience for normal usage\n public List placeOrder(Order order) {\n return placeOrder(order, true);\n }\n\n // used by replay to rebuild book without re-journaling\n public void replayOrder(Order order) {\n placeOrder(order, false);\n }\n\n // replay all lines from journal (optional helper)\n public void replayJournal() {\n List lines = journal.readAllLines();\n for (String raw : lines) {\n if (raw == null || raw.isBlank()) continue;\n String[] parts = raw.split(\"\\\\s+\");\n if (parts.length < 2) continue;\n if (\"ORDER\".equals(parts[0]) && parts.length >= 7) {\n // ORDER id user side price qty ts\n String id = parts[1];\n String user = parts[2];\n String side = parts[3];\n long price = Long.parseLong(parts[4]);\n int qty = Integer.parseInt(parts[5]);\n long ts = Long.parseLong(parts[6]);\n // create order via your Order constructor (check arg ordering)\n Order o = new Order(id, user, price, qty, ts, org.example.matching.model.OrderSide.valueOf(side), \"DEFAULT\");\n replayOrder(o);\n }\n // ignore TRADE lines during replay\n }\n }\n /**\n * Returns a list of price levels for a specific side (bids or asks).\n * It sums up the quantities of all orders at each price point.\n */\n private List getPriceLevels(TreeMap> side) {\n return side.entrySet().stream()\n .map(entry -> {\n long price = entry.getKey();\n // Sum the quantity of every Order sitting in the Deque for this price\n long totalQty = entry.getValue().stream()\n .mapToLong(Order::getQuantity)\n .sum();\n return new PriceLevel(price, totalQty);\n })\n .toList();\n }\n\n\n /**\n * Creates a full snapshot of the book.\n */\n public OrderBookResponse getSnapshot(String instrument) {\n OrderBook book = getOrderBook(instrument);\n return OrderBookResponse.builder()\n .instrument(instrument)\n .bids(getPriceLevels(book.getBids()))\n .asks(getPriceLevels(book.getAsks()))\n .build();\n }\n\n public String dumpBook() {\n StringBuilder sb = new StringBuilder();\n for (Map.Entry entry : orderBooks.entrySet()) {\n sb.append(\"=== ORDER BOOK: \").append(entry.getKey()).append(\" ===\\n\");\n sb.append(entry.getValue().dumpBook());\n sb.append(\"\\n\");\n }\n return sb.toString();\n }\n}\n -=================================================================== -diff --git a/matching-engine/src/main/java/org/example/matching/matching/MatchingEngine.java b/matching-engine/src/main/java/org/example/matching/matching/MatchingEngine.java ---- a/matching-engine/src/main/java/org/example/matching/matching/MatchingEngine.java -+++ b/matching-engine/src/main/java/org/example/matching/matching/MatchingEngine.java -@@ -51,6 +51,10 @@ - package org.example.matching.matching; - - import jakarta.annotation.PostConstruct; -+import lombok.AllArgsConstructor; -+import lombok.NoArgsConstructor; -+import lombok.RequiredArgsConstructor; -+import org.example.matching.Wallets.WalletService; - import org.example.matching.api.dto.OrderBookResponse; - import org.example.matching.api.dto.PriceLevel; - import org.example.matching.journal.EventJournal; -@@ -59,29 +63,47 @@ - import org.example.matching.model.Trade; - import org.springframework.stereotype.Service; - --import java.util.Deque; --import java.util.List; --import java.util.Map; --import java.util.TreeMap; -+import java.util.*; - import java.util.concurrent.ConcurrentHashMap; - - - @Service - public class MatchingEngine { -- -+private final WalletService walletService; - private final Map orderBooks = new ConcurrentHashMap<>(); - private final EventJournal journal; - - public MatchingEngine() { -+ this.walletService = null; - this.journal = new EventJournal(); - } - -+ public MatchingEngine(WalletService walletService, EventJournal eventJournal) { -+ this.walletService = walletService; -+ this.journal = eventJournal; -+ } -+// public MatchingEngine() { -+// this.journal = new EventJournal(); -+// } -+ - @PostConstruct - public void init() { - // Pre-create books for stocks you want to test - orderBooks.put("AAPL", new OrderBook()); - orderBooks.put("TSLA", new OrderBook()); - orderBooks.put("BTC", new OrderBook()); -+ -+ } -+ @PostConstruct -+ public void initBot() { -+ // Only initialize bot if walletService is available (not in test mode) -+ if (walletService != null) { -+ // Give the bot enough money to buy shares from users -+ walletService.creditUserCash("HOUSE_BOT", 1000000); // $10,000.00 -+ // Give the bot enough shares to sell to users -+ walletService.creditUserShares("HOUSE_BOT", "FED_Y", 5000); -+ walletService.creditUserShares("HOUSE_BOT", "FED_N", 5000); -+ } - } - - // Helper method to get the right order book -@@ -159,7 +181,21 @@ - .toList(); - } - -+ public void cancelAllOrdersForUser(String userId, String instrument) { -+ OrderBook book = orderBooks.get(instrument); -+ if(book==null){ -+ return; -+ } -+ book.getBids().values().forEach(list-> -+ list.removeIf(order -> order.getUserId().equals(userId))); -+ book.getBids().entrySet().removeIf(entry -> entry.getValue().isEmpty()); - -+ // Remove from Asks (Sell orders) -+ book.getAsks().values().forEach(list -> -+ list.removeIf(order -> order.getUserId().equals(userId)) -+ ); -+ book.getAsks().entrySet().removeIf(entry -> entry.getValue().isEmpty()); -+ } - /** - * Creates a full snapshot of the book. - */ -@@ -172,6 +208,18 @@ - .build(); - } - -+ public List clearBook(String instrument){ -+ OrderBook book = orderBooks.get(instrument); -+ List unfulfilled = new ArrayList<>(); -+ if(book!=null){ -+ book.getBids().values().forEach(list -> unfulfilled.addAll(list)); -+ book.getAsks().values().forEach(list -> unfulfilled.addAll(list)); -+ orderBooks.remove(instrument); -+ -+ }return unfulfilled; -+ -+ } -+ - public String dumpBook() { - StringBuilder sb = new StringBuilder(); - for (Map.Entry entry : orderBooks.entrySet()) { -Index: matching-engine/src/main/java/org/example/matching/api/service/OrderService.java -IDEA additional info: -Subsystem: com.intellij.openapi.diff.impl.patch.BaseRevisionTextPatchEP -<+>package org.example.matching.api.service;\n\nimport lombok.RequiredArgsConstructor;\nimport org.example.matching.Wallets.RiskManager;\nimport org.example.matching.Wallets.WalletService;\nimport org.example.matching.api.dto.OrderMapper;\nimport org.example.matching.api.dto.OrderRequest;\nimport org.example.matching.api.dto.OrderResponse;\nimport org.example.matching.journal.EventJournal;\nimport org.example.matching.matching.MatchingEngine;\nimport org.example.matching.model.Order;\nimport org.example.matching.model.Trade;\nimport org.example.matching.orderbook.OrderRepository;\nimport org.springframework.stereotype.Service;\n\nimport java.util.List;\nimport java.util.Map;\nimport java.util.concurrent.ConcurrentHashMap;\n\n@Service\n@RequiredArgsConstructor\npublic class OrderService {\n\n private final MarketDataService marketDataService;\n private final RiskManager riskManager;\n private final MatchingEngine matchingEngine;\n private final WalletService walletService;\n private final EventJournal eventJournal;\n private final OrderRepository orderRepository;\n\n // In-memory idempotency store: Key -> Previous Response\n private final Map idempotencyStore = new ConcurrentHashMap<>();\n\n public OrderResponse processOrder(OrderRequest request) {\n if (idempotencyStore.containsKey(request.getIdempotencyKey())) {\n return idempotencyStore.get(request.getIdempotencyKey());\n }\n \n Order order = OrderMapper.toDomain(request);\n \n if (!riskManager.checkAndReserve(order)) {\n return buildResponse(order, \"REJECTED\", \"Insufficient funds or shares\");\n }\n\n orderRepository.save(order);\n eventJournal.appendRaw(\"ORDER_PLACED: \" + order.getId());\n\n // Matching Engine execution\n List trades = matchingEngine.placeOrder(order);\n\n for (Trade trade : trades) {\n // so once trade is done manage the cash and shares of the users using their ids and stuff in walletService below\n walletService.settleTrade(trade);\n marketDataService.UpdateTrade(order.getInstrument(),trade.getPrice(),trade.getQuantity());\n eventJournal.appendRaw(\"TRADE_SETTLED: \" + trade.getBuyOrderId() + \" <-> \" + trade.getSellOrderId());\n }\n var book = matchingEngine.getOrderBookForMarketData(order.getInstrument());\n marketDataService.updateBookTops(\n order.getInstrument(),\n book.getBestBid(),\n book.getBestAsk()\n );\n\n OrderResponse response = buildResponse(order, \"ACCEPTED\", \"Success\");\n idempotencyStore.put(request.getIdempotencyKey(), response);\n return response;\n }\n \n private OrderResponse buildResponse(Order order, String status, String msg) {\n return OrderResponse.builder()\n .orderId(order.getId())\n .status(status)\n .message(msg)\n .timestamp(System.currentTimeMillis())\n .build();\n }\n}\n\n -=================================================================== -diff --git a/matching-engine/src/main/java/org/example/matching/api/service/OrderService.java b/matching-engine/src/main/java/org/example/matching/api/service/OrderService.java ---- a/matching-engine/src/main/java/org/example/matching/api/service/OrderService.java -+++ b/matching-engine/src/main/java/org/example/matching/api/service/OrderService.java -@@ -11,6 +11,7 @@ - import org.example.matching.model.Order; - import org.example.matching.model.Trade; - import org.example.matching.orderbook.OrderRepository; -+import org.springframework.context.annotation.Lazy; - import org.springframework.stereotype.Service; - - import java.util.List; -@@ -18,7 +19,6 @@ - import java.util.concurrent.ConcurrentHashMap; - - @Service --@RequiredArgsConstructor - public class OrderService { - - private final MarketDataService marketDataService; -@@ -27,6 +27,23 @@ - private final WalletService walletService; - private final EventJournal eventJournal; - private final OrderRepository orderRepository; -+ private final LiquidBotService liquidBotService; -+ -+ public OrderService(MarketDataService marketDataService, -+ RiskManager riskManager, -+ MatchingEngine matchingEngine, -+ WalletService walletService, -+ EventJournal eventJournal, -+ OrderRepository orderRepository, -+ @Lazy LiquidBotService liquidBotService) { -+ this.marketDataService = marketDataService; -+ this.riskManager = riskManager; -+ this.matchingEngine = matchingEngine; -+ this.walletService = walletService; -+ this.eventJournal = eventJournal; -+ this.orderRepository = orderRepository; -+ this.liquidBotService = liquidBotService; -+ } - - // In-memory idempotency store: Key -> Previous Response - private final Map idempotencyStore = new ConcurrentHashMap<>(); -@@ -54,12 +71,9 @@ - marketDataService.UpdateTrade(order.getInstrument(),trade.getPrice(),trade.getQuantity()); - eventJournal.appendRaw("TRADE_SETTLED: " + trade.getBuyOrderId() + " <-> " + trade.getSellOrderId()); - } -- var book = matchingEngine.getOrderBookForMarketData(order.getInstrument()); -- marketDataService.updateBookTops( -- order.getInstrument(), -- book.getBestBid(), -- book.getBestAsk() -- ); -+ if(!order.getUserId().equals("HOUSE_BOT")){ -+ liquidBotService.updateMarketTrigger(order.getInstrument()); -+ } - - OrderResponse response = buildResponse(order, "ACCEPTED", "Success"); - idempotencyStore.put(request.getIdempotencyKey(), response); -Index: matching-engine/src/main/java/org/example/matching/model/Reservation.java -IDEA additional info: -Subsystem: com.intellij.openapi.diff.impl.patch.BaseRevisionTextPatchEP -<+>package org.example.matching.model;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Getter;\nimport lombok.Setter;\n\n@Getter @Setter @AllArgsConstructor\npublic class Reservation {\n private final String OrderId;\n private final String userId;\n private final long priceatReserve;\n private int remainingQty;\n private String instrument; // Add instrument field\n\n private long reservedCash;\n private long reservedShares;\n private final Boolean isBuy;\n\n public Reservation(String orderId, String userId, long priceatReserve, int remainingQty, Boolean isBuy) {\n OrderId = orderId;\n this.userId = userId;\n this.priceatReserve = priceatReserve;\n this.remainingQty = remainingQty;\n this.isBuy = isBuy;\n this.instrument = \"MARKET\"; // Default instrument\n }\n\n public Reservation(String orderId, String userId, long priceatReserve, int remainingQty, Boolean isBuy, String instrument) {\n OrderId = orderId;\n this.userId = userId;\n this.priceatReserve = priceatReserve;\n this.remainingQty = remainingQty;\n this.isBuy = isBuy;\n this.instrument = instrument != null ? instrument : \"MARKET\";\n }\n\n public long reduceBy(int qty) {\n if (qty <= 0 || remainingQty <= 0) {\n return 0;\n }\n\n // Don't consume more than what is left in this specific reservation\n int consumed = Math.min(qty, remainingQty);\n long cashUsed =0;\n if (isBuy) {\n // Calculate how much cash was 'used' for this portion of the trade\n cashUsed = (long) consumed * priceatReserve;\n\n // Subtract the used cash from the total reserved cash\n this.reservedCash -= cashUsed;\n\n if (this.reservedCash < 0) this.reservedCash = 0;\n } else {\n // For a sell order, we just reduce the count of shares held\n this.reservedShares -= consumed;\n\n if (this.reservedShares < 0) this.reservedShares = 0;\n }\n\n // Finally, reduce the quantity so we know how much of the order is left to fill\n this.remainingQty -= consumed;\n return cashUsed;\n }\n\n // Additional getters needed by the codebase\n public String getOrderId() {\n return OrderId;\n }\n\n public String getUserId() {\n return userId;\n }\n\n public Boolean getIsBuy() {\n return isBuy;\n }\n\n public long getReservedCash() {\n return reservedCash;\n }\n\n public long getReservedShares() {\n return reservedShares;\n }\n\n public int getRemainingQty() {\n return remainingQty;\n }\n\n public void setReservedCash(long reservedCash) {\n this.reservedCash = reservedCash;\n }\n\n public void setReservedShares(long reservedShares) {\n this.reservedShares = reservedShares;\n }\n} -=================================================================== -diff --git a/matching-engine/src/main/java/org/example/matching/model/Reservation.java b/matching-engine/src/main/java/org/example/matching/model/Reservation.java ---- a/matching-engine/src/main/java/org/example/matching/model/Reservation.java -+++ b/matching-engine/src/main/java/org/example/matching/model/Reservation.java -@@ -59,7 +59,9 @@ - - // Finally, reduce the quantity so we know how much of the order is left to fill - this.remainingQty -= consumed; -- return cashUsed; -+ -+ // Return the actual quantity consumed for settlement calculations -+ return consumed; - } - - // Additional getters needed by the codebase -Index: matching-engine/src/main/java/org/example/matching/Wallets/WalletService.java -IDEA additional info: -Subsystem: com.intellij.openapi.diff.impl.patch.BaseRevisionTextPatchEP -<+>package org.example.matching.Wallets;\n\nimport org.example.matching.model.Order;\nimport org.example.matching.model.Trade;\nimport org.example.matching.model.Wallet;\n\npublic interface WalletService {\n boolean reserveForOrder(Order order);\n void releaseReservation(String orderId);\n void settleTrade(Trade trade);\n \n // Additional methods needed for testing and API\n void creditUserShares(String userId, long shares);\n void creditUserShares(String userId, String instrument, long shares);\n void creditUserCash(String userId, long cash);\n Wallet getWallet(String userId);\n}\n -=================================================================== -diff --git a/matching-engine/src/main/java/org/example/matching/Wallets/WalletService.java b/matching-engine/src/main/java/org/example/matching/Wallets/WalletService.java ---- a/matching-engine/src/main/java/org/example/matching/Wallets/WalletService.java -+++ b/matching-engine/src/main/java/org/example/matching/Wallets/WalletService.java -@@ -1,14 +1,17 @@ - package org.example.matching.Wallets; - -+import lombok.RequiredArgsConstructor; - import org.example.matching.model.Order; - import org.example.matching.model.Trade; - import org.example.matching.model.Wallet; - -+ - public interface WalletService { - boolean reserveForOrder(Order order); - void releaseReservation(String orderId); - void settleTrade(Trade trade); -- -+ -+ java.util.Collection getAllWallets(); - // Additional methods needed for testing and API - void creditUserShares(String userId, long shares); - void creditUserShares(String userId, String instrument, long shares); -Index: matching-engine/journals/engine.log -IDEA additional info: -Subsystem: com.intellij.openapi.diff.impl.patch.BaseRevisionTextPatchEP -<+>ORDER c78afcd8-aa27-4770-866b-840efa1dcad2 seller1 SELL 100 10 1772752218574\nORDER 8a44bcdf-4b7a-4bfb-b94c-792f629cd9f1 buyer1 BUY 105 4 1772752218582\nTRADE 8a44bcdf-4b7a-4bfb-b94c-792f629cd9f1 c78afcd8-aa27-4770-866b-840efa1dcad2 100 4 1772752218582\nORDER 2c267f3a-4da6-4060-bb5b-de3fa97f6029 buyer2 BUY 100 6 1772752218583\nTRADE 2c267f3a-4da6-4060-bb5b-de3fa97f6029 c78afcd8-aa27-4770-866b-840efa1dcad2 100 6 1772752218583\nORDER a692a971-2eae-4de6-b469-2bff7c12c7ec seller1 SELL 100 10\nORDER a692a971-2eae-4de6-b469-2bff7c12c7ec seller1 SELL 100 10 1772752218586\nORDER 9a4428f5-1e36-4bf6-a7e7-2b0900bb62e8 buyer1 BUY 105 4\nORDER 9a4428f5-1e36-4bf6-a7e7-2b0900bb62e8 buyer1 BUY 105 4 1772752218586\nTRADE 9a4428f5-1e36-4bf6-a7e7-2b0900bb62e8 a692a971-2eae-4de6-b469-2bff7c12c7ec 100 4 1772752218586\nTRADE 9a4428f5-1e36-4bf6-a7e7-2b0900bb62e8 a692a971-2eae-4de6-b469-2bff7c12c7ec 100 4\nORDER a8eaddb2-4f1f-4df0-a28b-c365b37c6911 buyer1 BUY 100 6\nORDER a8eaddb2-4f1f-4df0-a28b-c365b37c6911 buyer1 BUY 100 6 1772752218586\nTRADE a8eaddb2-4f1f-4df0-a28b-c365b37c6911 a692a971-2eae-4de6-b469-2bff7c12c7ec 100 6 1772752218587\nTRADE a8eaddb2-4f1f-4df0-a28b-c365b37c6911 a692a971-2eae-4de6-b469-2bff7c12c7ec 100 6\nORDER 5362fffb-146f-40b0-a9e1-fb84dd970ac7 seller1 SELL 100 10 1772760358808\nORDER 0211741a-8fa1-4a25-8b1d-1237a52f9211 buyer1 BUY 105 4 1772760358814\nTRADE 0211741a-8fa1-4a25-8b1d-1237a52f9211 5362fffb-146f-40b0-a9e1-fb84dd970ac7 100 4 1772760358815\nORDER 898a8498-ad4e-434b-8abe-5f5d20ae3173 buyer2 BUY 100 6 1772760358816\nTRADE 898a8498-ad4e-434b-8abe-5f5d20ae3173 5362fffb-146f-40b0-a9e1-fb84dd970ac7 100 6 1772760358816\nREJECT 6b224bfc-c1e8-46d7-b0a3-ac0de2b49358 INSUFFICIENT_FUNDS\nORDER f9712aa9-acba-43aa-adda-cb5a7adf145d buyer1 BUY 105 4\nORDER f9712aa9-acba-43aa-adda-cb5a7adf145d buyer1 BUY 105 4 1772760358817\nORDER c2cd976b-335c-4592-a644-d0d07db87af1 buyer1 BUY 100 6\nORDER c2cd976b-335c-4592-a644-d0d07db87af1 buyer1 BUY 100 6 1772760358817\nORDER 37c7fb05-1c35-4f6c-9407-3e01713a1ea9 seller1 SELL 100 10 1772760473119\nORDER 05f435ca-b3b9-4288-a979-062eef0f5e06 buyer1 BUY 105 4 1772760473125\nTRADE 05f435ca-b3b9-4288-a979-062eef0f5e06 37c7fb05-1c35-4f6c-9407-3e01713a1ea9 100 4 1772760473125\nORDER ce8d19be-00e6-4e0b-8056-2f468e5d540a buyer2 BUY 100 6 1772760473126\nTRADE ce8d19be-00e6-4e0b-8056-2f468e5d540a 37c7fb05-1c35-4f6c-9407-3e01713a1ea9 100 6 1772760473126\nREJECT debaf786-7218-4204-9bed-55e5d79c5e16 INSUFFICIENT_FUNDS\nORDER d5f67c56-67c3-4dac-967d-8b54cc41d1b6 buyer1 BUY 105 4\nORDER d5f67c56-67c3-4dac-967d-8b54cc41d1b6 buyer1 BUY 105 4 1772760473129\nORDER a204eca1-a5db-4d75-855f-64ca63a755db buyer1 BUY 100 6\nORDER a204eca1-a5db-4d75-855f-64ca63a755db buyer1 BUY 100 6 1772760473129\nORDER_PLACED: e72d00ac-eb7b-42ab-bf3b-f9e568c32ea4\nORDER e72d00ac-eb7b-42ab-bf3b-f9e568c32ea4 user-seller SELL 100 10 1772760703367\nORDER_PLACED: cbeb1b27-a8fa-45b2-9bd0-459cc73c3466\nORDER cbeb1b27-a8fa-45b2-9bd0-459cc73c3466 user1 BUY 100 10 1772760707390\nTRADE cbeb1b27-a8fa-45b2-9bd0-459cc73c3466 e72d00ac-eb7b-42ab-bf3b-f9e568c32ea4 100 10 1772760707390\nTRADE_SETTLED: cbeb1b27-a8fa-45b2-9bd0-459cc73c3466 <-> e72d00ac-eb7b-42ab-bf3b-f9e568c32ea4\nORDER_PLACED: e5bb5cfc-bb06-4a16-9af5-5e91f72c7a0c\nORDER e5bb5cfc-bb06-4a16-9af5-5e91f72c7a0c user-seller SELL 150 10 1772761274302\nORDER_PLACED: aa3558d9-7e18-41d7-b6e5-00e3e0c69788\nORDER aa3558d9-7e18-41d7-b6e5-00e3e0c69788 user1 BUY 151 10 1772761274334\nTRADE aa3558d9-7e18-41d7-b6e5-00e3e0c69788 e5bb5cfc-bb06-4a16-9af5-5e91f72c7a0c 150 10 1772761274335\nTRADE_SETTLED: aa3558d9-7e18-41d7-b6e5-00e3e0c69788 <-> e5bb5cfc-bb06-4a16-9af5-5e91f72c7a0c\nORDER_PLACED: 89a0af09-0b11-467d-ba14-c015ea52007c\nORDER 89a0af09-0b11-467d-ba14-c015ea52007c user-seller SELL 150 10 1772837899360\nORDER_PLACED: 14e62193-7644-460c-bc0e-e6f9f9eb8ff9\nORDER 14e62193-7644-460c-bc0e-e6f9f9eb8ff9 user1 BUY 151 10 1772837899385\nTRADE 14e62193-7644-460c-bc0e-e6f9f9eb8ff9 89a0af09-0b11-467d-ba14-c015ea52007c 150 10 1772837899386\nTRADE_SETTLED: 14e62193-7644-460c-bc0e-e6f9f9eb8ff9 <-> 89a0af09-0b11-467d-ba14-c015ea52007c\n -=================================================================== -diff --git a/matching-engine/journals/engine.log b/matching-engine/journals/engine.log ---- a/matching-engine/journals/engine.log -+++ b/matching-engine/journals/engine.log -@@ -51,3 +51,157 @@ - ORDER 14e62193-7644-460c-bc0e-e6f9f9eb8ff9 user1 BUY 151 10 1772837899385 - TRADE 14e62193-7644-460c-bc0e-e6f9f9eb8ff9 89a0af09-0b11-467d-ba14-c015ea52007c 150 10 1772837899386 - TRADE_SETTLED: 14e62193-7644-460c-bc0e-e6f9f9eb8ff9 <-> 89a0af09-0b11-467d-ba14-c015ea52007c -+ORDER_PLACED: 202f458a-7394-4199-85bd-918530c96e13 -+ORDER 202f458a-7394-4199-85bd-918530c96e13 HOUSE_BOT BUY 26 500 1773086278334 -+ORDER_PLACED: 84e69fc8-4bd9-4e3f-a0d1-6a76fb82dfed -+ORDER 84e69fc8-4bd9-4e3f-a0d1-6a76fb82dfed HOUSE_BOT SELL 30 500 1773086278337 -+ORDER_PLACED: 2981da91-ad7c-46e6-8ae3-cd233950442b -+ORDER 2981da91-ad7c-46e6-8ae3-cd233950442b HOUSE_BOT BUY 70 500 1773086278337 -+ORDER_PLACED: eb55fe77-896d-4022-9fa4-9a789c2ec530 -+ORDER eb55fe77-896d-4022-9fa4-9a789c2ec530 HOUSE_BOT SELL 74 500 1773086278337 -+ORDER_PLACED: c2463dd5-c0f6-4e0e-aff6-c9b9ddcd090c -+ORDER c2463dd5-c0f6-4e0e-aff6-c9b9ddcd090c trader1 SELL 150 10 1773095406065 -+ORDER_PLACED: ae60b85e-47c3-4ae0-a796-3274fea0381c -+ORDER ae60b85e-47c3-4ae0-a796-3274fea0381c trader2 BUY 155 5 1773095428409 -+TRADE ae60b85e-47c3-4ae0-a796-3274fea0381c c2463dd5-c0f6-4e0e-aff6-c9b9ddcd090c 150 5 1773095428410 -+TRADE_SETTLED: ae60b85e-47c3-4ae0-a796-3274fea0381c <-> c2463dd5-c0f6-4e0e-aff6-c9b9ddcd090c -+ORDER_PLACED: 30021f61-8157-4daf-96d2-6cbac68bdb73 -+ORDER 30021f61-8157-4daf-96d2-6cbac68bdb73 HOUSE_BOT BUY 26 500 1773095456405 -+ORDER_PLACED: 9bea18c3-c632-4f63-a4a6-adcc5af0e4a2 -+ORDER 9bea18c3-c632-4f63-a4a6-adcc5af0e4a2 HOUSE_BOT SELL 30 500 1773095456406 -+ORDER_PLACED: 5379120e-0bca-4afd-9eae-c15eb3194b8f -+ORDER 5379120e-0bca-4afd-9eae-c15eb3194b8f HOUSE_BOT BUY 70 500 1773095456406 -+ORDER_PLACED: 8502d3a8-b4ec-495e-a2a4-ce52a0be6a05 -+ORDER 8502d3a8-b4ec-495e-a2a4-ce52a0be6a05 HOUSE_BOT SELL 74 500 1773095456406 -+ORDER_PLACED: 6c986989-e62e-4f5c-a4de-12fe7639f1ec -+ORDER 6c986989-e62e-4f5c-a4de-12fe7639f1ec HOUSE_BOT BUY 26 500 1773095462080 -+ORDER_PLACED: 36489e0f-8ff0-4826-9ece-09a6d05ed3c6 -+ORDER 36489e0f-8ff0-4826-9ece-09a6d05ed3c6 HOUSE_BOT SELL 30 500 1773095462080 -+ORDER_PLACED: 521b3e8b-0b5d-4f33-b5fd-ae50f94675d2 -+ORDER 521b3e8b-0b5d-4f33-b5fd-ae50f94675d2 HOUSE_BOT BUY 70 500 1773095462080 -+ORDER_PLACED: 8ba2d046-b754-46a6-91cc-be1b27995022 -+ORDER 8ba2d046-b754-46a6-91cc-be1b27995022 HOUSE_BOT SELL 74 500 1773095462081 -+ORDER_PLACED: 99b639c1-2333-4f80-ac17-c0b030ffe0e3 -+ORDER 99b639c1-2333-4f80-ac17-c0b030ffe0e3 seller SELL 200 20 1773095477932 -+ORDER_PLACED: cba1d599-a0fa-4c60-88dc-8ae55f6018fc -+ORDER cba1d599-a0fa-4c60-88dc-8ae55f6018fc buyer BUY 210 15 1773095640840 -+TRADE cba1d599-a0fa-4c60-88dc-8ae55f6018fc c2463dd5-c0f6-4e0e-aff6-c9b9ddcd090c 150 5 1773095640842 -+TRADE cba1d599-a0fa-4c60-88dc-8ae55f6018fc 99b639c1-2333-4f80-ac17-c0b030ffe0e3 200 10 1773095640842 -+TRADE_SETTLED: cba1d599-a0fa-4c60-88dc-8ae55f6018fc <-> c2463dd5-c0f6-4e0e-aff6-c9b9ddcd090c -+TRADE_SETTLED: cba1d599-a0fa-4c60-88dc-8ae55f6018fc <-> 99b639c1-2333-4f80-ac17-c0b030ffe0e3 -+ORDER_PLACED: b9f4d514-da1a-47ad-9719-91010ca37d5e -+ORDER b9f4d514-da1a-47ad-9719-91010ca37d5e test2 SELL 100 10 1773096383964 -+ORDER_PLACED: e9fc81d7-43cd-41c8-86b7-48fcac278549 -+ORDER e9fc81d7-43cd-41c8-86b7-48fcac278549 test1 BUY 105 5 1773096394339 -+TRADE e9fc81d7-43cd-41c8-86b7-48fcac278549 b9f4d514-da1a-47ad-9719-91010ca37d5e 100 5 1773096394340 -+TRADE_SETTLED: e9fc81d7-43cd-41c8-86b7-48fcac278549 <-> b9f4d514-da1a-47ad-9719-91010ca37d5e -+ORDER_PLACED: 9ae777b5-b560-48c1-a5df-35fdc56f82f4 -+ORDER 9ae777b5-b560-48c1-a5df-35fdc56f82f4 test4 SELL 150 20 1773096518712 -+ORDER_PLACED: b0a48945-670c-49f2-9c42-0c6bcc619785 -+ORDER b0a48945-670c-49f2-9c42-0c6bcc619785 test3 BUY 155 8 1773096581201 -+TRADE b0a48945-670c-49f2-9c42-0c6bcc619785 9ae777b5-b560-48c1-a5df-35fdc56f82f4 150 8 1773096581207 -+TRADE_SETTLED: b0a48945-670c-49f2-9c42-0c6bcc619785 <-> 9ae777b5-b560-48c1-a5df-35fdc56f82f4 -+ORDER_PLACED: 1e9ffb95-29cd-4ff8-9d81-97bf85706bd7 -+ORDER 1e9ffb95-29cd-4ff8-9d81-97bf85706bd7 HOUSE_BOT BUY 26 500 1773096596080 -+ORDER_PLACED: 586a9c62-b96a-41f6-af52-50a3b1809126 -+ORDER 586a9c62-b96a-41f6-af52-50a3b1809126 HOUSE_BOT SELL 30 500 1773096596081 -+ORDER_PLACED: e21f48cd-4dc2-45ec-bece-87c59edbfd8a -+ORDER e21f48cd-4dc2-45ec-bece-87c59edbfd8a HOUSE_BOT BUY 70 500 1773096596081 -+ORDER_PLACED: 91744cbe-26bf-431b-91e3-524dd13100ab -+ORDER 91744cbe-26bf-431b-91e3-524dd13100ab HOUSE_BOT SELL 74 500 1773096596081 -+ORDER_PLACED: 686cca41-810a-46bd-8412-47daef7082bd -+ORDER 686cca41-810a-46bd-8412-47daef7082bd HOUSE_BOT BUY 26 500 1773097147018 -+ORDER_PLACED: 6d8d4c5e-daac-4a9e-8d23-d89aeed16515 -+ORDER 6d8d4c5e-daac-4a9e-8d23-d89aeed16515 HOUSE_BOT SELL 30 500 1773097147019 -+ORDER_PLACED: 9d2d7b00-90ae-4d16-93a5-20b18999ebd4 -+ORDER 9d2d7b00-90ae-4d16-93a5-20b18999ebd4 HOUSE_BOT BUY 70 500 1773097147019 -+ORDER_PLACED: a58f1770-da0b-4d0b-a50e-4641ef6162db -+ORDER a58f1770-da0b-4d0b-a50e-4641ef6162db HOUSE_BOT SELL 74 500 1773097147020 -+ORDER_PLACED: dae39d25-7eb0-48c6-bc74-3d4fc5be6d43 -+ORDER dae39d25-7eb0-48c6-bc74-3d4fc5be6d43 trader-yes BUY 30 10 1773097198644 -+TRADE dae39d25-7eb0-48c6-bc74-3d4fc5be6d43 6d8d4c5e-daac-4a9e-8d23-d89aeed16515 30 10 1773097198645 -+TRADE_SETTLED: dae39d25-7eb0-48c6-bc74-3d4fc5be6d43 <-> 6d8d4c5e-daac-4a9e-8d23-d89aeed16515 -+ORDER_PLACED: b11f6bdf-085b-4b0a-ab66-2c5208dcbf33 -+ORDER b11f6bdf-085b-4b0a-ab66-2c5208dcbf33 HOUSE_BOT BUY 27 500 1773097198654 -+ORDER_PLACED: 8ca7e156-e844-4ac0-81d4-3b99fd79f864 -+ORDER 8ca7e156-e844-4ac0-81d4-3b99fd79f864 HOUSE_BOT SELL 31 500 1773097198654 -+ORDER_PLACED: fb139d62-e3df-4afe-ba08-f865e4b14706 -+ORDER fb139d62-e3df-4afe-ba08-f865e4b14706 HOUSE_BOT BUY 69 500 1773097198654 -+ORDER_PLACED: e0fd4ab5-d494-4e3b-9981-b544fe726068 -+ORDER e0fd4ab5-d494-4e3b-9981-b544fe726068 HOUSE_BOT SELL 73 500 1773097198655 -+ORDER_PLACED: 3cf79e7e-b1d5-4266-ad0d-fed5d66ab360 -+ORDER 3cf79e7e-b1d5-4266-ad0d-fed5d66ab360 trader-no BUY 74 10 1773097220661 -+TRADE 3cf79e7e-b1d5-4266-ad0d-fed5d66ab360 e0fd4ab5-d494-4e3b-9981-b544fe726068 73 10 1773097220662 -+TRADE_SETTLED: 3cf79e7e-b1d5-4266-ad0d-fed5d66ab360 <-> e0fd4ab5-d494-4e3b-9981-b544fe726068 -+ORDER_PLACED: 45aa1507-2c22-49f9-95ab-c34e0d7ed192 -+ORDER 45aa1507-2c22-49f9-95ab-c34e0d7ed192 HOUSE_BOT BUY 27 500 1773097220663 -+ORDER_PLACED: 5b2d1890-68f3-4d0f-8808-4097057cd90d -+ORDER 5b2d1890-68f3-4d0f-8808-4097057cd90d HOUSE_BOT SELL 31 500 1773097220663 -+ORDER_PLACED: d200a652-4674-4057-9174-16604e0d3d54 -+ORDER d200a652-4674-4057-9174-16604e0d3d54 HOUSE_BOT BUY 69 500 1773097220663 -+ORDER_PLACED: 74aca358-0ff0-4df1-bdb7-9c29d350a0ab -+ORDER 74aca358-0ff0-4df1-bdb7-9c29d350a0ab HOUSE_BOT SELL 73 500 1773097220664 -+ORDER_PLACED: 1896ba12-86ac-4c65-9a35-91312a00d4f2 -+ORDER 1896ba12-86ac-4c65-9a35-91312a00d4f2 trader-yes SELL 27 5 1773097238574 -+TRADE 45aa1507-2c22-49f9-95ab-c34e0d7ed192 1896ba12-86ac-4c65-9a35-91312a00d4f2 27 5 1773097238575 -+TRADE_SETTLED: 45aa1507-2c22-49f9-95ab-c34e0d7ed192 <-> 1896ba12-86ac-4c65-9a35-91312a00d4f2 -+ORDER_PLACED: b4cf102d-c66b-4f31-bb9f-1c5281fb3f48 -+ORDER b4cf102d-c66b-4f31-bb9f-1c5281fb3f48 HOUSE_BOT BUY 27 500 1773097238576 -+ORDER_PLACED: f2aea2bf-178d-4b70-85ec-fe77c9e7c803 -+ORDER f2aea2bf-178d-4b70-85ec-fe77c9e7c803 HOUSE_BOT SELL 31 500 1773097238576 -+ORDER_PLACED: 74c779f6-6698-421a-bbad-b297a7631434 -+ORDER 74c779f6-6698-421a-bbad-b297a7631434 HOUSE_BOT BUY 69 500 1773097238577 -+ORDER_PLACED: 9a5a6c33-1739-492d-a015-10dcab579f98 -+ORDER 9a5a6c33-1739-492d-a015-10dcab579f98 HOUSE_BOT SELL 73 500 1773097238577 -+ORDER_PLACED: d93482b3-d7e2-4ef9-80ab-2e4c864d7bc7 -+ORDER d93482b3-d7e2-4ef9-80ab-2e4c864d7bc7 trader3 BUY 31 5 1773097257718 -+TRADE d93482b3-d7e2-4ef9-80ab-2e4c864d7bc7 f2aea2bf-178d-4b70-85ec-fe77c9e7c803 31 5 1773097257719 -+TRADE_SETTLED: d93482b3-d7e2-4ef9-80ab-2e4c864d7bc7 <-> f2aea2bf-178d-4b70-85ec-fe77c9e7c803 -+ORDER_PLACED: 89daff4d-0302-4121-90ca-af6451639436 -+ORDER 89daff4d-0302-4121-90ca-af6451639436 HOUSE_BOT BUY 27 500 1773097257720 -+ORDER_PLACED: a35298b1-c5f1-49f0-aca3-5c0f929a3741 -+ORDER a35298b1-c5f1-49f0-aca3-5c0f929a3741 HOUSE_BOT SELL 31 500 1773097257720 -+ORDER_PLACED: 5a792477-a3c9-4271-883a-dd34999b15d3 -+ORDER 5a792477-a3c9-4271-883a-dd34999b15d3 HOUSE_BOT BUY 69 500 1773097257721 -+ORDER_PLACED: 15fb0266-4e4c-441e-a52b-9a875cb2e5df -+ORDER 15fb0266-4e4c-441e-a52b-9a875cb2e5df HOUSE_BOT SELL 73 500 1773097257721 -+ORDER_PLACED: 98914de0-d7cb-4282-ba23-8fc6ecb363e6 -+ORDER 98914de0-d7cb-4282-ba23-8fc6ecb363e6 HOUSE_BOT BUY 26 500 1773097277308 -+ORDER_PLACED: a89eaea0-5d24-4fd3-8fb0-5481b196e692 -+ORDER a89eaea0-5d24-4fd3-8fb0-5481b196e692 HOUSE_BOT SELL 30 500 1773097277309 -+ORDER_PLACED: d0931ea4-cdb0-4fea-98e1-dad289b43e3d -+ORDER d0931ea4-cdb0-4fea-98e1-dad289b43e3d HOUSE_BOT BUY 70 500 1773097277309 -+ORDER_PLACED: 80ee5962-8239-48ee-8b62-3a44daadbc65 -+ORDER 80ee5962-8239-48ee-8b62-3a44daadbc65 HOUSE_BOT SELL 74 500 1773097277309 -+ORDER_PLACED: b75546e7-a3cd-4f02-a9e8-bdb713f9d3f4 -+ORDER b75546e7-a3cd-4f02-a9e8-bdb713f9d3f4 fresh-trader BUY 30 10 1773097300339 -+TRADE b75546e7-a3cd-4f02-a9e8-bdb713f9d3f4 a89eaea0-5d24-4fd3-8fb0-5481b196e692 30 10 1773097300340 -+TRADE_SETTLED: b75546e7-a3cd-4f02-a9e8-bdb713f9d3f4 <-> a89eaea0-5d24-4fd3-8fb0-5481b196e692 -+ORDER_PLACED: 9972ac7c-6a34-4bb0-92c2-614c0d39b9b1 -+ORDER 9972ac7c-6a34-4bb0-92c2-614c0d39b9b1 HOUSE_BOT BUY 27 500 1773097300342 -+ORDER_PLACED: 976557fc-f09a-4b6f-aec8-8c916a54ffe7 -+ORDER 976557fc-f09a-4b6f-aec8-8c916a54ffe7 HOUSE_BOT SELL 31 500 1773097300342 -+ORDER_PLACED: ea73dbbf-a9a3-45d7-8a69-165e7d97b0a2 -+ORDER ea73dbbf-a9a3-45d7-8a69-165e7d97b0a2 HOUSE_BOT BUY 69 500 1773097300343 -+ORDER_PLACED: 9f33a6c3-863d-4486-97a5-bf3e7e391ffe -+ORDER 9f33a6c3-863d-4486-97a5-bf3e7e391ffe HOUSE_BOT SELL 73 500 1773097300343 -+ORDER_PLACED: 3059b475-e0a5-471e-bcfc-a6962d673eb3 -+ORDER 3059b475-e0a5-471e-bcfc-a6962d673eb3 HOUSE_BOT BUY 26 500 1773097341383 -+ORDER_PLACED: 30269f8e-f66b-47d3-a8a6-036c04d6f975 -+ORDER 30269f8e-f66b-47d3-a8a6-036c04d6f975 HOUSE_BOT SELL 30 500 1773097341384 -+ORDER_PLACED: 6d2a3d9d-0d7d-4604-8337-09d6f475cd76 -+ORDER 6d2a3d9d-0d7d-4604-8337-09d6f475cd76 HOUSE_BOT BUY 70 500 1773097341384 -+ORDER_PLACED: 63fb6a37-e2bd-4ae6-bc8e-5497acd347f6 -+ORDER 63fb6a37-e2bd-4ae6-bc8e-5497acd347f6 HOUSE_BOT SELL 74 500 1773097341385 -+ORDER_PLACED: 105c8737-bdfb-4cea-9118-11f1258df96e -+ORDER 105c8737-bdfb-4cea-9118-11f1258df96e final-trader BUY 30 5 1773097348388 -+TRADE 105c8737-bdfb-4cea-9118-11f1258df96e 30269f8e-f66b-47d3-a8a6-036c04d6f975 30 5 1773097348389 -+TRADE_SETTLED: 105c8737-bdfb-4cea-9118-11f1258df96e <-> 30269f8e-f66b-47d3-a8a6-036c04d6f975 -+ORDER_PLACED: 773eb336-5d94-4a05-9669-3ffe58262feb -+ORDER 773eb336-5d94-4a05-9669-3ffe58262feb HOUSE_BOT BUY 27 500 1773097348392 -+ORDER_PLACED: 283b2488-c7b9-4700-ab24-5ea9c5d2f2d6 -+ORDER 283b2488-c7b9-4700-ab24-5ea9c5d2f2d6 HOUSE_BOT SELL 31 500 1773097348393 -+ORDER_PLACED: 54bfc35d-578c-4110-bfe2-5624cd00b09f -+ORDER 54bfc35d-578c-4110-bfe2-5624cd00b09f HOUSE_BOT BUY 69 500 1773097348393 -+ORDER_PLACED: b12ad53a-4864-452b-91d5-192272814f26 -+ORDER b12ad53a-4864-452b-91d5-192272814f26 HOUSE_BOT SELL 73 500 1773097348393 -Index: matching-engine/OrderFlow -IDEA additional info: -Subsystem: com.intellij.openapi.diff.impl.patch.BaseRevisionTextPatchEP -<+>The \"Order of Operations\" [Step by Step flow]\nFor a trade to settle successfully, the order must be \"registered\" in the repository before the matching happens. Here is the correct sequence:\n\nThe Request: Postman sends a \"BUY AAPL\" request.\n\nThe Check: RiskManager checks the Wallet to make sure the user has enough cash.\n\nThe Registration (CRITICAL): You call orderRepository.save(order). Now the system \"knows\" this order ID belongs to \"User1\".\n\nThe Matching Engine: The order goes into the OrderBook algorithm.\n\nThe Match: The algorithm finds a \"SELL AAPL\" order that was already in the repo. It generates a Trade.\n\nThe Settlement: The settleTrade method takes that Trade and asks the Repo: \"Who owns the orders in this trade?\"\n\nThe Hand-off: Because you did Step 3, the Repo says: \"Order A belongs to User1, and Order B belongs to User2.\"\n\nThe Bank: The WalletService finally moves the money and shares.\n\n\n\n---- Trade in it -----\n[OrderBook receives the whole Order object, but inside the Matching Algorithm, it ignores the userId entirely. It only looks at:\n\n Price: To see if the buyer and seller can agree.\n\n Quantity: To see how much can be traded.\n\n Timestamp: To decide who was first in line (Price-Time Priority).]\n\n\n\n When the Matching Engine finishes, it creates a Trade object. That trade object looks like this:\n\n buyOrderId: \"abc-123\"\n\n sellOrderId: \"xyz-789\"\n\n price: 150\n\n quantity: 10\n\n When this trade is sent to Settlement, the first thing the code does is:\n orderRepository.findById(\"abc-123\")\n\n\n\n\n -=================================================================== -diff --git a/matching-engine/OrderFlow b/matching-engine/OrderFlow ---- a/matching-engine/OrderFlow -+++ b/matching-engine/OrderFlow -@@ -46,3 +46,11 @@ - - - -+----- -+Pice ed -+ -+1. What you have vs. What Kalshi -+hasFeature Your Current MarketDataService Kalshi / Prediction Market Logic -+Price OriginUser-to-User trades only. Automated Liquidity (The Bot). -+Logic Calculates VWAP and Spread. Ensures Price(YES) + Price(NO) ≈ 100¢. -+RoleReporting (Show what happened). Price Discovery (Setting the "Fair" price). -\ No newline at end of file -Index: matching-engine/src/main/java/org/example/matching/config/MatchingEngineConfig.java -IDEA additional info: -Subsystem: com.intellij.openapi.diff.impl.patch.BaseRevisionTextPatchEP -<+>package org.example.matching.config;\n\nimport org.example.matching.Wallets.InMemoryWalletService;\nimport org.example.matching.Wallets.RiskManager;\nimport org.example.matching.Wallets.WalletService;\nimport org.example.matching.journal.EventJournal;\nimport org.example.matching.matching.MatchingEngine;\nimport org.example.matching.orderbook.InMemoryOrderRepository;\nimport org.example.matching.orderbook.OrderRepository;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\n\n@Configuration\npublic class MatchingEngineConfig {\n\n @Bean\n public EventJournal eventJournal() {\n return new EventJournal();\n }\n\n @Bean\n public OrderRepository orderRepository() {\n return new InMemoryOrderRepository();\n }\n\n @Bean\n public WalletService walletService(OrderRepository orderRepository) {\n return new InMemoryWalletService(orderRepository);\n }\n\n @Bean\n public RiskManager riskManager(WalletService walletService, OrderRepository orderRepository) {\n return new RiskManager(walletService, orderRepository);\n }\n\n @Bean\n public MatchingEngine matchingEngine(EventJournal eventJournal) {\n return new MatchingEngine();\n }\n}\n -=================================================================== -diff --git a/matching-engine/src/main/java/org/example/matching/config/MatchingEngineConfig.java b/matching-engine/src/main/java/org/example/matching/config/MatchingEngineConfig.java ---- a/matching-engine/src/main/java/org/example/matching/config/MatchingEngineConfig.java -+++ b/matching-engine/src/main/java/org/example/matching/config/MatchingEngineConfig.java -@@ -34,7 +34,7 @@ - } - - @Bean -- public MatchingEngine matchingEngine(EventJournal eventJournal) { -- return new MatchingEngine(); -+ public MatchingEngine matchingEngine(WalletService walletService, EventJournal eventJournal) { -+ return new MatchingEngine(walletService, eventJournal); - } - } -Index: matching-engine/src/main/java/org/example/matching/Wallets/InMemoryWalletService.java -IDEA additional info: -Subsystem: com.intellij.openapi.diff.impl.patch.BaseRevisionTextPatchEP -<+>package org.example.matching.Wallets;\n\nimport lombok.RequiredArgsConstructor;\nimport org.example.matching.model.Order;\nimport org.example.matching.model.Reservation;\nimport org.example.matching.model.Trade;\nimport org.example.matching.model.Wallet;\nimport org.example.matching.orderbook.OrderRepository;\nimport org.springframework.stereotype.Service; // Add this import\n\nimport java.util.Map;\nimport java.util.concurrent.ConcurrentHashMap;\n\n@Service // Tells Spring this is a managed bean\npublic class InMemoryWalletService implements WalletService {\n\n private final Map wallets = new ConcurrentHashMap<>();\n private final Map reservations = new ConcurrentHashMap<>();\n private final OrderRepository orderRepository;\n private final String INSTRUMENT = \"MARKET\";\n\n // No-arg constructor for Main.java usage\n public InMemoryWalletService() {\n this.orderRepository = null;\n }\n\n // Constructor for dependency injection\n public InMemoryWalletService(OrderRepository orderRepository) {\n this.orderRepository = orderRepository;\n }\n\n private Wallet ensureWallet(String userId) {\n return wallets.computeIfAbsent(userId, k -> new Wallet(userId));\n }\n\n @Override\n public boolean reserveForOrder(Order order) {\n String userId = order.getUserId();\n String instrument = order.getInstrument();\n Wallet w = ensureWallet(userId);\n\n if (order.getSide().name().equals(\"BUY\")) {\n long required = order.getPrice() * (long) order.getQuantity();\n if (!w.tryReserveCash(required)) return false;\n\n Reservation r = new Reservation(order.getId(), userId, order.getPrice(), order.getQuantity(), true, instrument);\n r.setReservedCash(required);\n reservations.put(order.getId(), r);\n } else {\n if (!w.tryReserveShares(instrument, order.getQuantity())) return false;\n\n Reservation r = new Reservation(order.getId(), userId, order.getPrice(), order.getQuantity(), false, instrument);\n r.setReservedShares(order.getQuantity());\n reservations.put(order.getId(), r);\n }\n return true;\n }\n\n\n@Override\npublic void releaseReservation(String orderId){\n Reservation r = reservations.remove(orderId);\n if(r==null)return;\n Wallet w = ensureWallet(r.getUserId());\n if(r.getIsBuy()){\n w.releaseReserveCash(r.getReservedCash());\n\n }else{\n w.releaseReservedShares(r.getInstrument(),r.getReservedShares());\n\n }\n }\n\n @Override\n public void creditUserShares(String userId, long shares) {\n Wallet w = ensureWallet(userId);\n w.addAvailableShares(INSTRUMENT, shares);\n }\n\n @Override\n public void creditUserShares(String userId, String instrument, long shares) {\n Wallet w = ensureWallet(userId);\n w.addAvailableShares(instrument, shares);\n }\n\n @Override\n public void creditUserCash(String userId, long cash) {\n Wallet w = ensureWallet(userId);\n w.addAvailableCash(cash);\n }\n\n @Override\n public Wallet getWallet(String userId) {\n return wallets.get(userId);\n }\n\n @Override\n public void settleTrade(Trade trade) {\n Order buy = orderRepository.findById(trade.getBuyOrderId()).orElse(null);\n Order sell = orderRepository.findById(trade.getSellOrderId()).orElse(null);\n\n if (buy == null || sell == null) return;\n\n Wallet buyerWallet = ensureWallet(buy.getUserId());\n Wallet sellerWallet = ensureWallet(sell.getUserId());\n Reservation buyRes = reservations.get(buy.getId());\n Reservation sellRes = reservations.get(sell.getId());\n\n int qty = (int) trade.getQuantity();\n long tradeValue = trade.getPrice() * (long) qty;\n String instrument = buy.getInstrument();\n // Process Buy Side\n if (buyRes != null) {\n long cashtoDebitFromReserved = buyRes.reduceBy(qty);\n buyerWallet.debitReservedCash(cashtoDebitFromReserved);\n\n long refund = cashtoDebitFromReserved - tradeValue;\n if (refund > 0) buyerWallet.addAvailableCash(refund);\n\n buyerWallet.addAvailableShares(instrument, qty);\n }\n\n // Process Sell Side\n if (sellRes != null) {\n sellRes.reduceBy(qty);\n sellerWallet.debitReservedShares(instrument, (long) qty);\n sellerWallet.addAvailableCash(tradeValue);\n }\n\n // Cleanup completed reservations\n if (buyRes != null && buyRes.getRemainingQty() == 0) {\n reservations.remove(buy.getId());\n }\n if (sellRes != null && sellRes.getRemainingQty() == 0) {\n reservations.remove(sell.getId());\n }\n }\n} -=================================================================== -diff --git a/matching-engine/src/main/java/org/example/matching/Wallets/InMemoryWalletService.java b/matching-engine/src/main/java/org/example/matching/Wallets/InMemoryWalletService.java ---- a/matching-engine/src/main/java/org/example/matching/Wallets/InMemoryWalletService.java -+++ b/matching-engine/src/main/java/org/example/matching/Wallets/InMemoryWalletService.java -@@ -8,6 +8,7 @@ - import org.example.matching.orderbook.OrderRepository; - import org.springframework.stereotype.Service; // Add this import - -+import java.util.Collection; - import java.util.Map; - import java.util.concurrent.ConcurrentHashMap; - -@@ -93,6 +94,10 @@ - public Wallet getWallet(String userId) { - return wallets.get(userId); - } -+ @Override -+ public Collection getAllWallets() { -+ return wallets.values(); -+ } - - @Override - public void settleTrade(Trade trade) { -Index: matching-engine/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst -IDEA additional info: -Subsystem: com.intellij.openapi.diff.impl.patch.BaseRevisionTextPatchEP -<+>/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/app/MatchingEngineApplication.java\n/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/journal/EventJournal.java\n/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/model/Trade.java\n/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/orderbook/InMemoryOrderRepository.java\n/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/MatchingEngineApplication.java\n/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/api/dto/WalletResponse.java\n/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/Wallets/RiskManager.java\n/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/orderbook/OrderOrchestrator.java\n/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/model/OrderBook.java\n/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/api/controller/WalletController.java\n/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/model/Wallet.java\n/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/Wallets/InMemoryWalletService.java\n/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/api/dto/PriceLevel.java\n/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/api/controller/OrderController.java\n/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/api/dto/OrderResponse.java\n/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/api/advice/ApiExceptionHandler.java\n/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/api/controller/MarketController.java\n/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/api/service/OrderService.java\n/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/validation/OrderValidator.java\n/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/orderbook/OrderRepository.java\n/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/Main.java\n/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/model/Order.java\n/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/model/Reservation.java\n/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/Wallets/WalletService.java\n/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/api/dto/OrderBookResponse.java\n/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/api/dto/DepositRequest.java\n/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/api/service/MarketDataService.java\n/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/api/dto/OrderRequest.java\n/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/matching/MatchingEngine.java\n/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/Replay.java\n/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/util/IdGenerator.java\n/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/model/OrderSide.java\n/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/api/dto/OrderMapper.java\n/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/config/MatchingEngineConfig.java\n -=================================================================== -diff --git a/matching-engine/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/matching-engine/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst ---- a/matching-engine/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst -+++ b/matching-engine/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst -@@ -3,17 +3,22 @@ - /Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/model/Trade.java - /Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/orderbook/InMemoryOrderRepository.java - /Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/MatchingEngineApplication.java -+/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/api/dto/MarketEvent.java - /Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/api/dto/WalletResponse.java -+/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/api/service/LiquidBotService.java - /Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/Wallets/RiskManager.java - /Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/orderbook/OrderOrchestrator.java - /Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/model/OrderBook.java - /Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/api/controller/WalletController.java -+/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/api/controller/EventController.java - /Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/model/Wallet.java - /Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/Wallets/InMemoryWalletService.java - /Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/api/dto/PriceLevel.java - /Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/api/controller/OrderController.java - /Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/api/dto/OrderResponse.java - /Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/api/advice/ApiExceptionHandler.java -+/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/api/dto/EventStatus.java -+/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/api/service/SettlementService.java - /Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/api/controller/MarketController.java - /Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/api/service/OrderService.java - /Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/validation/OrderValidator.java -@@ -27,6 +32,8 @@ - /Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/api/service/MarketDataService.java - /Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/api/dto/OrderRequest.java - /Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/matching/MatchingEngine.java -+/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/api/dto/EventRequest.java -+/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/api/service/MarketManagmentService.java - /Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/Replay.java - /Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/util/IdGenerator.java - /Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/model/OrderSide.java -Index: journals/engine.log -IDEA additional info: -Subsystem: com.intellij.openapi.diff.impl.patch.BaseRevisionTextPatchEP -<+>ORDER 555a6afb-fb3e-41c5-9544-cdbc96ed4fa2 seller1 SELL 100 10 1771557534336\nORDER c5077dcb-c587-4543-9c0b-3da1589504a8 buyer1 BUY 105 4 1771557534365\nTRADE c5077dcb-c587-4543-9c0b-3da1589504a8 555a6afb-fb3e-41c5-9544-cdbc96ed4fa2 100 4 1771557534365\nORDER f4b788e6-632c-48c1-9eff-30880619b16d buyer2 BUY 100 6 1771557534365\nTRADE f4b788e6-632c-48c1-9eff-30880619b16d 555a6afb-fb3e-41c5-9544-cdbc96ed4fa2 100 6 1771557534366\nORDER 729e42d0-bf4a-4dbd-a666-3adb0fd9c136 seller1 SELL 100 10 1772083565558\nORDER c64a2e5d-1e54-4568-bee3-990fe3cde36b buyer1 BUY 105 4 1772083565592\nTRADE c64a2e5d-1e54-4568-bee3-990fe3cde36b 729e42d0-bf4a-4dbd-a666-3adb0fd9c136 100 4 1772083565592\nORDER 92220288-5c9e-4a1a-9a10-88d14f297953 buyer2 BUY 100 6 1772083565593\nTRADE 92220288-5c9e-4a1a-9a10-88d14f297953 729e42d0-bf4a-4dbd-a666-3adb0fd9c136 100 6 1772083565593\nORDER 9e2a8036-019a-48e2-a22a-f3e2bf1dd1cc seller1 SELL 100 10\nORDER 9e2a8036-019a-48e2-a22a-f3e2bf1dd1cc seller1 SELL 100 10 1772083565594\nORDER 278fdfd7-6893-4d50-923a-0a694dca0884 buyer1 BUY 105 4\nORDER 278fdfd7-6893-4d50-923a-0a694dca0884 buyer1 BUY 105 4 1772083565594\nTRADE 278fdfd7-6893-4d50-923a-0a694dca0884 9e2a8036-019a-48e2-a22a-f3e2bf1dd1cc 100 4 1772083565594\nTRADE 278fdfd7-6893-4d50-923a-0a694dca0884 9e2a8036-019a-48e2-a22a-f3e2bf1dd1cc 100 4\nORDER 02956e10-2d87-4a95-93e1-5c9de14c0d0b buyer1 BUY 100 6\nORDER 02956e10-2d87-4a95-93e1-5c9de14c0d0b buyer1 BUY 100 6 1772083565594\nTRADE 02956e10-2d87-4a95-93e1-5c9de14c0d0b 9e2a8036-019a-48e2-a22a-f3e2bf1dd1cc 100 6 1772083565595\nTRADE 02956e10-2d87-4a95-93e1-5c9de14c0d0b 9e2a8036-019a-48e2-a22a-f3e2bf1dd1cc 100 6\nORDER 64cbfaf9-f583-44fc-a836-1187c5003ebe seller1 SELL 100 10 1772670798630\nORDER d69ce365-223d-4776-a5dd-d30cc7a8a912 buyer1 BUY 105 4 1772670798732\nTRADE d69ce365-223d-4776-a5dd-d30cc7a8a912 64cbfaf9-f583-44fc-a836-1187c5003ebe 100 4 1772670798733\nORDER 8891349c-44e5-408c-8ce0-989ec39e24ca buyer2 BUY 100 6 1772670798734\nTRADE 8891349c-44e5-408c-8ce0-989ec39e24ca 64cbfaf9-f583-44fc-a836-1187c5003ebe 100 6 1772670798734\nORDER 0b7b68d9-c8d6-4cda-a3c5-f6aa4e9d1330 seller1 SELL 100 10\nORDER 0b7b68d9-c8d6-4cda-a3c5-f6aa4e9d1330 seller1 SELL 100 10 1772670871847\nORDER 0b5e5139-84c9-4698-a906-e868092f3308 buyer1 BUY 105 4\nORDER 0b5e5139-84c9-4698-a906-e868092f3308 buyer1 BUY 105 4 1772670872856\nTRADE 0b5e5139-84c9-4698-a906-e868092f3308 0b7b68d9-c8d6-4cda-a3c5-f6aa4e9d1330 100 4 1772671176205\nTRADE 0b5e5139-84c9-4698-a906-e868092f3308 0b7b68d9-c8d6-4cda-a3c5-f6aa4e9d1330 100 4\nORDER b2557f88-8c0f-446d-8e70-010b17b2c2c8 buyer1 BUY 100 6\nORDER b2557f88-8c0f-446d-8e70-010b17b2c2c8 buyer1 BUY 100 6 1772670876431\nTRADE b2557f88-8c0f-446d-8e70-010b17b2c2c8 0b7b68d9-c8d6-4cda-a3c5-f6aa4e9d1330 100 6 1772671176208\nTRADE b2557f88-8c0f-446d-8e70-010b17b2c2c8 0b7b68d9-c8d6-4cda-a3c5-f6aa4e9d1330 100 6\nORDER 9ebc90e5-eac2-4ed2-bd23-87dc5f9fad78 seller1 SELL 100 10 1772671494015\nORDER e6791c03-baf8-4f62-8742-ca2046593854 buyer1 BUY 105 4 1772671494047\nTRADE e6791c03-baf8-4f62-8742-ca2046593854 9ebc90e5-eac2-4ed2-bd23-87dc5f9fad78 100 4 1772671494047\nORDER d6177034-7805-4d88-a13c-ccff65a03a40 buyer2 BUY 100 6 1772671494049\nTRADE d6177034-7805-4d88-a13c-ccff65a03a40 9ebc90e5-eac2-4ed2-bd23-87dc5f9fad78 100 6 1772671494049\nORDER 759faf99-a021-4608-bdc7-656bfa915a95 seller1 SELL 100 10\nORDER 759faf99-a021-4608-bdc7-656bfa915a95 seller1 SELL 100 10 1772671494058\nORDER f3bd642f-8fa9-4d48-94e7-04bcbb39e49a buyer1 BUY 105 4\nORDER f3bd642f-8fa9-4d48-94e7-04bcbb39e49a buyer1 BUY 105 4 1772671494058\nTRADE f3bd642f-8fa9-4d48-94e7-04bcbb39e49a 759faf99-a021-4608-bdc7-656bfa915a95 100 4 1772671494060\nTRADE f3bd642f-8fa9-4d48-94e7-04bcbb39e49a 759faf99-a021-4608-bdc7-656bfa915a95 100 4\nORDER 9a5d71f3-1351-403f-a9f6-019f3a5657af buyer1 BUY 100 6\nORDER 9a5d71f3-1351-403f-a9f6-019f3a5657af buyer1 BUY 100 6 1772671494058\nTRADE 9a5d71f3-1351-403f-a9f6-019f3a5657af 759faf99-a021-4608-bdc7-656bfa915a95 100 6 1772671494061\nTRADE 9a5d71f3-1351-403f-a9f6-019f3a5657af 759faf99-a021-4608-bdc7-656bfa915a95 100 6\nORDER cd18202b-085c-44d6-a5b6-3598fe8494e6 seller1 SELL 100 10 1772752285238\nORDER cfe88003-6f8f-4a3a-8236-27b7c139f04d buyer1 BUY 105 4 1772752285262\nTRADE cfe88003-6f8f-4a3a-8236-27b7c139f04d cd18202b-085c-44d6-a5b6-3598fe8494e6 100 4 1772752285262\nORDER 6b68b475-9229-4bc2-aa10-66298c6e9928 buyer2 BUY 100 6 1772752285264\nTRADE 6b68b475-9229-4bc2-aa10-66298c6e9928 cd18202b-085c-44d6-a5b6-3598fe8494e6 100 6 1772752285264\nORDER 28e6dec6-2781-4ad0-8230-7cc1de99f41e seller1 SELL 100 10\nORDER 28e6dec6-2781-4ad0-8230-7cc1de99f41e seller1 SELL 100 10 1772752285268\nORDER 4e0a0c16-518b-42c4-b40b-4504645951d4 buyer1 BUY 105 4\nORDER 4e0a0c16-518b-42c4-b40b-4504645951d4 buyer1 BUY 105 4 1772752285268\nTRADE 4e0a0c16-518b-42c4-b40b-4504645951d4 28e6dec6-2781-4ad0-8230-7cc1de99f41e 100 4 1772752285270\nTRADE 4e0a0c16-518b-42c4-b40b-4504645951d4 28e6dec6-2781-4ad0-8230-7cc1de99f41e 100 4\nORDER ee65a46b-8063-4a87-b6bc-ee9301e48e35 buyer1 BUY 100 6\nORDER ee65a46b-8063-4a87-b6bc-ee9301e48e35 buyer1 BUY 100 6 1772752285268\nTRADE ee65a46b-8063-4a87-b6bc-ee9301e48e35 28e6dec6-2781-4ad0-8230-7cc1de99f41e 100 6 1772752285270\nTRADE ee65a46b-8063-4a87-b6bc-ee9301e48e35 28e6dec6-2781-4ad0-8230-7cc1de99f41e 100 6\nORDER_PLACED: c61d527c-d5a2-46cd-b7bd-1e2e7dd1813b\nORDER c61d527c-d5a2-46cd-b7bd-1e2e7dd1813b user123 BUY 150 10 1772754586115\nORDER_PLACED: 9f12d7ee-5ad2-4702-83fb-4fd4faa682fe\nORDER 9f12d7ee-5ad2-4702-83fb-4fd4faa682fe user123 BUY 150 10 1772755348807\nORDER_PLACED: 4cef0377-341d-4b13-8856-f44b1ad24656\nORDER 4cef0377-341d-4b13-8856-f44b1ad24656 user-seller SELL 150 10 1772756125478\nORDER_PLACED: 44655cad-3469-4cfb-899c-c1dacd78ccda\nORDER 44655cad-3469-4cfb-899c-c1dacd78ccda user1 BUY 100 10 1772756456024\nORDER_PLACED: a16f2f1b-2e4b-48f0-8a6f-7ce51f4bc94b\nORDER a16f2f1b-2e4b-48f0-8a6f-7ce51f4bc94b user-seller SELL 150 10 1772759912084\nORDER_PLACED: a1d913c4-317e-4f88-9c2e-05c2d422d7bb\nORDER a1d913c4-317e-4f88-9c2e-05c2d422d7bb user1 BUY 100 10 1772759987885\nORDER_PLACED: 3db5fb8c-f24b-4674-8a4b-cbadc7fede32\nORDER 3db5fb8c-f24b-4674-8a4b-cbadc7fede32 user-seller SELL 150 10 1772760831791\nORDER_PLACED: 562de0cc-8ba3-4264-8158-98904cbce14d\nORDER 562de0cc-8ba3-4264-8158-98904cbce14d user1 BUY 100 10 1772760849537\nORDER_PLACED: 9320ee7a-9fef-4449-bf80-f2c2ef83cc88\nORDER 9320ee7a-9fef-4449-bf80-f2c2ef83cc88 user-seller SELL 150 10 1772761342572\nORDER_PLACED: b7a13e53-93ee-46b0-8ddb-8fa9e26ebe5f\nORDER b7a13e53-93ee-46b0-8ddb-8fa9e26ebe5f user1 BUY 151 10 1772761362103\nTRADE b7a13e53-93ee-46b0-8ddb-8fa9e26ebe5f 9320ee7a-9fef-4449-bf80-f2c2ef83cc88 150 10 1772761362107\nTRADE_SETTLED: b7a13e53-93ee-46b0-8ddb-8fa9e26ebe5f <-> 9320ee7a-9fef-4449-bf80-f2c2ef83cc88\n -=================================================================== -diff --git a/journals/engine.log b/journals/engine.log ---- a/journals/engine.log -+++ b/journals/engine.log -@@ -85,3 +85,45 @@ - ORDER b7a13e53-93ee-46b0-8ddb-8fa9e26ebe5f user1 BUY 151 10 1772761362103 - TRADE b7a13e53-93ee-46b0-8ddb-8fa9e26ebe5f 9320ee7a-9fef-4449-bf80-f2c2ef83cc88 150 10 1772761362107 - TRADE_SETTLED: b7a13e53-93ee-46b0-8ddb-8fa9e26ebe5f <-> 9320ee7a-9fef-4449-bf80-f2c2ef83cc88 -+ORDER_PLACED: a739b58c-1b61-481a-bbda-d32961c6bee7 -+ORDER a739b58c-1b61-481a-bbda-d32961c6bee7 user_1 BUY 70 10 1772929548693 -+ORDER_PLACED: 5bc417f4-bafc-4515-87d8-6ff10f310edb -+ORDER 5bc417f4-bafc-4515-87d8-6ff10f310edb user_1 BUY 70 10 1772930035271 -+ORDER_PLACED: 00740b55-39bc-47c7-b210-049ff138ff88 -+ORDER 00740b55-39bc-47c7-b210-049ff138ff88 USER_A BUY 60 10 1773016937098 -+ORDER_PLACED: 7e7fcd36-dfd2-46d2-84f3-0759ec1722c2 -+ORDER 7e7fcd36-dfd2-46d2-84f3-0759ec1722c2 HOUSE_BOT BUY 26 500 1773098676011 -+ORDER_PLACED: 49bd0b23-73e6-4bb2-a04c-788b0d27a61b -+ORDER 49bd0b23-73e6-4bb2-a04c-788b0d27a61b HOUSE_BOT SELL 30 500 1773098676033 -+ORDER_PLACED: 0b21f612-5b80-468c-a261-5f92cc509c7f -+ORDER 0b21f612-5b80-468c-a261-5f92cc509c7f HOUSE_BOT BUY 70 500 1773098676038 -+ORDER_PLACED: bebf1c67-fd3c-4d66-9ef0-275cdd5b2391 -+ORDER bebf1c67-fd3c-4d66-9ef0-275cdd5b2391 HOUSE_BOT SELL 74 500 1773098676038 -+ORDER_PLACED: 2e1f64a8-c0cd-4999-8a7b-99dbe3485bec -+ORDER 2e1f64a8-c0cd-4999-8a7b-99dbe3485bec HOUSE_BOT BUY 26 500 1773098788582 -+ORDER_PLACED: 337504bc-fae7-422a-8718-9f12a60b9c86 -+ORDER 337504bc-fae7-422a-8718-9f12a60b9c86 HOUSE_BOT SELL 30 500 1773098788584 -+ORDER_PLACED: 2ceb4d50-197f-4740-9ca2-6993a13f601c -+ORDER 2ceb4d50-197f-4740-9ca2-6993a13f601c HOUSE_BOT BUY 70 500 1773098788584 -+ORDER_PLACED: d456036f-200d-422c-9d23-adfb020b6bf3 -+ORDER d456036f-200d-422c-9d23-adfb020b6bf3 HOUSE_BOT SELL 74 500 1773098788584 -+ORDER_PLACED: f88fb1b7-a716-411c-9ac8-9cda420c12dd -+ORDER f88fb1b7-a716-411c-9ac8-9cda420c12dd HOUSE_BOT BUY 26 500 1773099262674 -+ORDER_PLACED: 6a9e9b62-c69b-441d-b48d-d679023a5a05 -+ORDER 6a9e9b62-c69b-441d-b48d-d679023a5a05 HOUSE_BOT SELL 30 500 1773099262677 -+ORDER_PLACED: 6cc5ecdc-6538-433f-8bd8-fb8e69f5f3ba -+ORDER 6cc5ecdc-6538-433f-8bd8-fb8e69f5f3ba HOUSE_BOT BUY 70 500 1773099262677 -+ORDER_PLACED: 09a40c7c-7730-4a7d-af85-1be051cc62ad -+ORDER 09a40c7c-7730-4a7d-af85-1be051cc62ad HOUSE_BOT SELL 74 500 1773099262677 -+ORDER_PLACED: a13e5263-410d-4fdf-bfcc-be134a8e502a -+ORDER a13e5263-410d-4fdf-bfcc-be134a8e502a trader1 BUY 30 10 1773099371840 -+TRADE a13e5263-410d-4fdf-bfcc-be134a8e502a 6a9e9b62-c69b-441d-b48d-d679023a5a05 30 10 1773099371841 -+TRADE_SETTLED: a13e5263-410d-4fdf-bfcc-be134a8e502a <-> 6a9e9b62-c69b-441d-b48d-d679023a5a05 -+ORDER_PLACED: db7dd415-686b-4ede-acc6-6a11e42d22f0 -+ORDER db7dd415-686b-4ede-acc6-6a11e42d22f0 HOUSE_BOT BUY 27 500 1773099371844 -+ORDER_PLACED: 585695d4-f70c-4e10-a01b-0f915f3931a2 -+ORDER 585695d4-f70c-4e10-a01b-0f915f3931a2 HOUSE_BOT SELL 31 500 1773099371844 -+ORDER_PLACED: 2dbeef1a-6788-42a0-ac73-08daa5029908 -+ORDER 2dbeef1a-6788-42a0-ac73-08daa5029908 HOUSE_BOT BUY 69 500 1773099371844 -+ORDER_PLACED: cd48551d-9285-4e3a-8691-17d6dcebb4f0 -+ORDER cd48551d-9285-4e3a-8691-17d6dcebb4f0 HOUSE_BOT SELL 73 500 1773099371844 -Index: matching-engine/src/main/java/org/example/matching/api/controller/WalletController.java -IDEA additional info: -Subsystem: com.intellij.openapi.diff.impl.patch.BaseRevisionTextPatchEP -<+>package org.example.matching.api.controller;\n\nimport lombok.RequiredArgsConstructor;\nimport org.example.matching.Wallets.WalletService;\nimport org.example.matching.api.dto.DepositRequest;\nimport org.example.matching.api.dto.WalletResponse;\nimport org.example.matching.model.Wallet;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.web.bind.annotation.*;\n\nimport java.util.Map;\nimport java.util.stream.Collectors;\n\n@RestController\n@RequestMapping(\"/api/wallets\")\n@RequiredArgsConstructor\npublic class WalletController {\n\n private final WalletService walletService;\n\n @GetMapping(\"/{userId}\")\n public ResponseEntity getWallet(@PathVariable String userId){\n Wallet wallet = walletService.getWallet(userId);\n\n // Convert AtomicLong maps to Long maps for JSON response\n Map availableShares = wallet.getAvailableShares().entrySet().stream()\n .collect(Collectors.toMap(\n Map.Entry::getKey,\n entry -> entry.getValue().get()\n ));\n\n Map reservedShares = wallet.getReservedShares().entrySet().stream()\n .collect(Collectors.toMap(\n Map.Entry::getKey,\n entry -> entry.getValue().get()\n ));\n\n WalletResponse response = WalletResponse.builder()\n .userId(userId)\n .availableCash(wallet.getAvailableCash())\n .reservedCash(wallet.getReservedCash())\n .availableShares(availableShares)\n .reservedShares(reservedShares)\n .build();\n return ResponseEntity.ok(response);\n }\n @PostMapping(\"/depositCash\")\n public ResponseEntity depositCash(@RequestBody DepositRequest request) {\n walletService.creditUserCash(request.getUserId(), request.getAmount());\n return ResponseEntity.ok(\"Deposit Successful\");\n }\n \n @PostMapping(\"/depositShares\")\n public ResponseEntity depositShares(@RequestBody DepositRequest request) {\n // Credit shares for the specific instrument\n walletService.creditUserShares(request.getUserId(), request.getInstrument(), request.getAmount());\n return ResponseEntity.ok(\"Shares Deposited Successfully\");\n }\n} -=================================================================== -diff --git a/matching-engine/src/main/java/org/example/matching/api/controller/WalletController.java b/matching-engine/src/main/java/org/example/matching/api/controller/WalletController.java ---- a/matching-engine/src/main/java/org/example/matching/api/controller/WalletController.java -+++ b/matching-engine/src/main/java/org/example/matching/api/controller/WalletController.java -@@ -21,6 +21,18 @@ - @GetMapping("/{userId}") - public ResponseEntity getWallet(@PathVariable String userId){ - Wallet wallet = walletService.getWallet(userId); -+ -+ // Handle non-existent wallet -+ if (wallet == null) { -+ WalletResponse response = WalletResponse.builder() -+ .userId(userId) -+ .availableCash(0L) -+ .reservedCash(0L) -+ .availableShares(Map.of()) -+ .reservedShares(Map.of()) -+ .build(); -+ return ResponseEntity.ok(response); -+ } - - // Convert AtomicLong maps to Long maps for JSON response - Map availableShares = wallet.getAvailableShares().entrySet().stream() -Index: matching-engine/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst -IDEA additional info: -Subsystem: com.intellij.openapi.diff.impl.patch.BaseRevisionTextPatchEP -<+>org/example/matching/api/controller/MarketController.class\norg/example/Main.class\norg/example/matching/app/MatchingEngineApplication.class\norg/example/matching/model/Trade.class\norg/example/matching/model/OrderSide.class\norg/example/matching/api/dto/OrderResponse.class\norg/example/matching/journal/EventJournal.class\norg/example/matching/Wallets/WalletService.class\norg/example/matching/Wallets/InMemoryWalletService.class\norg/example/matching/model/Reservation.class\norg/example/matching/validation/OrderValidator.class\norg/example/matching/api/controller/OrderController.class\norg/example/matching/api/dto/OrderBookResponse$OrderBookResponseBuilder.class\norg/example/matching/api/advice/ApiExceptionHandler.class\norg/example/matching/model/OrderBook.class\norg/example/matching/api/dto/WalletResponse$WalletResponseBuilder.class\norg/example/matching/orderbook/OrderOrchestrator.class\norg/example/matching/api/dto/OrderResponse$OrderResponseBuilder.class\norg/example/matching/orderbook/InMemoryOrderRepository.class\norg/example/matching/matching/MatchingEngine.class\norg/example/matching/model/Order.class\norg/example/matching/api/dto/DepositRequest.class\norg/example/matching/api/dto/PriceLevel.class\norg/example/matching/api/dto/WalletResponse.class\norg/example/matching/Replay.class\norg/example/matching/util/IdGenerator.class\norg/example/matching/api/controller/WalletController.class\norg/example/matching/Wallets/RiskManager.class\norg/example/matching/api/dto/OrderMapper.class\norg/example/matching/api/dto/OrderBookResponse.class\norg/example/matching/api/dto/OrderRequest.class\norg/example/matching/config/MatchingEngineConfig.class\norg/example/matching/api/service/MarketDataService.class\norg/example/matching/orderbook/OrderRepository.class\norg/example/matching/MatchingEngineApplication.class\norg/example/matching/model/Wallet.class\norg/example/matching/api/service/OrderService.class\n -=================================================================== -diff --git a/matching-engine/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/matching-engine/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst ---- a/matching-engine/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst -+++ b/matching-engine/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst -@@ -1,5 +1,6 @@ - org/example/matching/api/controller/MarketController.class - org/example/Main.class -+org/example/matching/api/service/MarketManagmentService.class - org/example/matching/app/MatchingEngineApplication.class - org/example/matching/model/Trade.class - org/example/matching/model/OrderSide.class -@@ -10,6 +11,7 @@ - org/example/matching/model/Reservation.class - org/example/matching/validation/OrderValidator.class - org/example/matching/api/controller/OrderController.class -+org/example/matching/api/controller/EventController.class - org/example/matching/api/dto/OrderBookResponse$OrderBookResponseBuilder.class - org/example/matching/api/advice/ApiExceptionHandler.class - org/example/matching/model/OrderBook.class -@@ -18,6 +20,7 @@ - org/example/matching/api/dto/OrderResponse$OrderResponseBuilder.class - org/example/matching/orderbook/InMemoryOrderRepository.class - org/example/matching/matching/MatchingEngine.class -+org/example/matching/api/dto/EventRequest.class - org/example/matching/model/Order.class - org/example/matching/api/dto/DepositRequest.class - org/example/matching/api/dto/PriceLevel.class -@@ -27,11 +30,16 @@ - org/example/matching/api/controller/WalletController.class - org/example/matching/Wallets/RiskManager.class - org/example/matching/api/dto/OrderMapper.class -+org/example/matching/api/service/LiquidBotService.class - org/example/matching/api/dto/OrderBookResponse.class -+org/example/matching/api/dto/MarketEvent.class - org/example/matching/api/dto/OrderRequest.class - org/example/matching/config/MatchingEngineConfig.class -+org/example/matching/api/dto/MarketEvent$MarketEventBuilder.class - org/example/matching/api/service/MarketDataService.class - org/example/matching/orderbook/OrderRepository.class -+org/example/matching/api/service/SettlementService.class -+org/example/matching/api/dto/EventStatus.class - org/example/matching/MatchingEngineApplication.class - org/example/matching/model/Wallet.class - org/example/matching/api/service/OrderService.class diff --git "a/.idea/shelf/Uncommitted_changes_before_Update_at_09_03_26,_7_40\342\200\257pm_[Changes]1/InMemoryWalletService.class" "b/.idea/shelf/Uncommitted_changes_before_Update_at_09_03_26,_7_40\342\200\257pm_[Changes]1/InMemoryWalletService.class" deleted file mode 100644 index 9dbce519e410222620ce906a03a078d01491e5dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6359 zcmbtY33yc189g_%yv*b=69S126$C{{LU0gKlmJR1NPq-nAPBbV%ghT5%o5(b3F6Xf z)w)(~YpdAST5W4Hj|ZIDkc>A&ffsH28G{5EN+KY786kjFHQ%WDNqe+U^EwjKK zhMmsm3iX&sctt+nP*zL2(wN?^{an()=SfqZ^jeD%m3olPWpijHG3RUlvt4P_|gq}I`D+dOs+ z7IR5yLwuRr=xo4oI9|ha9VcLhz_<|{5N9%<9V*&p&)|}Q0zDzn?N#CUv2#ofu6~c- zJ2kWlOsi>cHlH#xuG7M3$1DvUI%eZUfvIC`P~-@NHkdRb)1IN8D~_M zNT(Qat;F?4mdKUd-id`87U@_l;ZA=un*{thBWu>*UeNw4%o| zRu$n7$GW`Y|5B5v%~wG7O{izn4yF z{1rOhDa~lIO!~fHy7Q8431g1@xLU`%beS%7 zCU)m}nyC`b;N68gG<;CUhu)|$ zDINDo+ad&>Ff$n!xt!W93lB@sE-aV6yaqqeEV<3+*gK`<&&k^H*kPr!Y(MWapBHGa zNo)C1a@b`glt^#R8Fta4vzB@I<8@@AC&|jysix==C(zn>!bu#+p1t_01GW~{?mVI~7Z*NJ{@AGOOfMr%{Ue&1k zU{kY4k%K1RjT_3kraGv0W;e7L9`!$ws9Xqdl9ZS8{3;E z>_v0C*o)YMO2(J@If)WLxe`Yd6WDLYRK)mPorHs&kyX!BkJWX8z!H%Sf??@NMau>$L_B{yCn)N6q1N$+} zM?Pmhpw>z=B~9S{PnzT?m{?IT5zi=MT?Nl@iNLe?nxjBmju7fOwr5reZN2=6_qBJF zFn58U?Nduw&~!!#OLk!myJz!n<<;r=ftbG~P{Qgv5b*6jfW$_QukR=?@IQicXYa%L z3$&Ofml=fKC|AU^{V;vla4(j}{Iiv;64JGW_{u^8v4FcWTagoRPc~$-k>gxJIUeL(vqP0-V8gJd=sAghAKE;OizS%dm(~ zbQwGCj>d|Si}9k0oe1fZ6x4CoamqBGGA#<W;T>PQ#KkeDN?j_k*KWHgPcAQvc=P6ZjQazq9B32t-wokvBo{Dh_G{kT=|F(r$b%uA;* zC6!pG)`ne6o=|IE=FXquXO5)0mGo32aW_y>jFEEtetekcND22mf%aZ^@RQ!bzK(;? zW|vcX3Ixh z&*3+!0G`dm^tWsUi18u(jx{7mq<7)>sxuei{E0e3M0cIaum)9OPJ{Lu z=Bm2cj@N0IU}q&>VJYINcdS-{j8X;A~bo@q;e^Gh1DV~uY`mu&-F!wCleub z05do8Y(H>#uzF9?kV-bLCa%A#O6bSm*sH_eX|)sH|K#_-_$R~rzZCu|%ld0Vrg@l` L&!DI$tFiw9nB01+ diff --git "a/.idea/shelf/Uncommitted_changes_before_Update_at_09_03_26,_7_40\342\200\257pm_[Changes]1/MarketController.class" "b/.idea/shelf/Uncommitted_changes_before_Update_at_09_03_26,_7_40\342\200\257pm_[Changes]1/MarketController.class" deleted file mode 100644 index 01508e26473cb07d89a90dfcae0e639800afd102..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3590 zcmbtWYjYGu6g`~>o5zsHvf<$i1e9bG7(kwGh(ZX6CL|^hMexzP+a^PHXV#hCAZ7Vi zEPsMlNwoZ6`Pm<3dAetJv)N2wQhu22p5EK{o_p?N?mz$j`4@m2Q2ppacLqHUdT~JD zQV_1W>U&wORg_zmy0q^3Yp$$$ZYl6}7*r}MbQff}q4aF)KwzjTI_Ix>z7jY$pQxxQ zMisH@SiUfTKJ;fW;9wArz|?*&3ks@I+vD?3<)(BilE_zdNCyfN$#9Hc zWgWPSVOfQ@f?#7=MYX_>6afukID-)fqsR)JF@U0)(e-U8tLj-0Zn*1O*WBifIbVDF zxj0YLjyBn|KFpf3DQPe83mKeawQRdL??u`GIq%>CE;0zE zP)V(<9)WrSIlH5h=H%WhDj+UtYnH@Z!sQIEIJk;yJ5nW1Wq||Jp6}@yf$s5%)i|WB z66(nQR!CD;P(h$)HYhU#hv(Tz?$@hD6+V!~3Qw~0K}l9tW$2mr#$k_M_sIB_z4PED zor~56JU`N5-DHNb&{-Fh=!;st<^0}OlKTkhTTpsEC@)FVH?#_gwSUE1^QEqb^eIRP zaU81@tzvq=aAxSvvE@2@RaLEekw+SD`hK9LNlqe*TT7?qXR7EHJ-_VAmaKbMX_jWq zG*^M%O2IpI!pL!UM{h6 zXIyE`Bookvx>1m6P8v<4Gaw1yJp$MAn1#F#u+Q8Olee$d=zs-9ohiadyW z0zW4ND-E*UGU>7Ili16)#yUAjDv6~aYO9GMSJ{t&8+Y_(hf1SpSy>uwk&xM+#*@o@ zuVE@#`lX-cLfSi>U%!Is{{t&QJuIm^o@vr!ab|8$hv!U530zCfW5fOJ_A+P((5jt; z_NORnn^FrLTDtgY1G@%XNrC zAMv^O7$U;Q_=IN}RtV;~5m;y;GCGXSVIn$2L`Syp<_<^)C=Q&qa1O_!EjYssIJ-dH zPXMvl31SJK(mg}VW!f-S1_|QS7S8;Qv)i1+046K|Cl+e}h#g)|u(d+D3wY3A-DhNM zY>fKJsk6s=#(KBlCb)UgTA67?vdMZD4=w8^x~tq7zOwj?I}^(+KIg8-?jGR_+B9^G z_3{!Z4hn)Iz#~2}IDwv&%VH^UwIzqRLtL~^(-IDw*r_W+W7yR&0FJH&Wy$M%y@CIn*t;JYlMd*RQQcm QD=q#k--|8$C6s~x00;B^!vFvP diff --git "a/.idea/shelf/Uncommitted_changes_before_Update_at_09_03_26,_7_40\342\200\257pm_[Changes]1/MatchingEngine.class" "b/.idea/shelf/Uncommitted_changes_before_Update_at_09_03_26,_7_40\342\200\257pm_[Changes]1/MatchingEngine.class" deleted file mode 100644 index e303a3f78b7f5577210b2194d6b0406efc3a2e0a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11725 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 X*>~u#6U?M4*e&E+yd&+}z6YKF5$4Q5 diff --git "a/.idea/shelf/Uncommitted_changes_before_Update_at_09_03_26,_7_40\342\200\257pm_[Changes]1/MatchingEngineConfig.class" "b/.idea/shelf/Uncommitted_changes_before_Update_at_09_03_26,_7_40\342\200\257pm_[Changes]1/MatchingEngineConfig.class" deleted file mode 100644 index 8566c3b725ab24dd84c6de5011cab09109e84a90..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2224 zcmb_d-A)rh7(G)8g{Ayh6+}@%6kA$Y1m&h;q6DLciUEVc3(d3)WuV<9+b!S|=;P>B z6G?mkAIkX6bX!W96*cst^ONs8=X`&&KYxAy0bmge79!|~AsR;~x)=s``2n{}+$q|t z`CU=)8M+=zNBU0~I+Cf47`ho!u2;0h5ijqTgk9!-VMmhvu3PmSUb2@DgyX-eA1uTa zdN0F*(Z}_+gqL^SJ^Q7T6J^)?w5o2_#J*dRJ{>Js3ZS21&Is_1mrBB~G~Mgxb>SVz zg0RqsK^52~hWX@*5#U5Y8*^3#dzm3=bZhXg$;w`iJG>}73kh6RY(oqmL)aQ_r(|aT zN7*%oj8R#$9=V_}%T7@`l#5|pSL$vsyuSc-rfTby-DH?G3M;tIwk+DGWi9DThUk*J zB^U-)Nb2iqIWN4oJYS-l#EM(sr48;$bq+40{*J6rOPCY)2cj%PT(tBj!*nubMllA+ zFtS#4d|4J7vLZ>)Q^#?A?n~DpJ<}SgvhUG2YWvkaa znH`2NA)?J1{#C#^0k%vrl_g_FH!ET2Z%kZ$&=@{nKq$uU3yGq^-!@tlN!lEV5uCwV zr$@UWo=Y`%Bc?f>QC|mo%Qfs@^m%={tDYW^EXFZPUmNx70#n}``oBddn^s0^=Tr^s z8*L)E9T)-q7^8i>Za@%s=)^FAyJV%D=V(>V-N%S+*3k2n_O1Sj7XR+R{~p;W@=015 z?jv~?%Ob3JJJ#^ISSd`QL+e_kRR!B~jK0lu4Fm09qZ(|eZWIV3bCQ!LQ5kaWRN8>k zYNs(1FuXvNc7Sz^#AZ5E!W5rzVSNvYrTC!$3HT2WJU~HQ`7* d;pDl56S`n3x`1$^Ey4)q=_Z1Q&A1-{zX8@7Uhn__ diff --git "a/.idea/shelf/Uncommitted_changes_before_Update_at_09_03_26,_7_40\342\200\257pm_[Changes]1/OrderService.class" "b/.idea/shelf/Uncommitted_changes_before_Update_at_09_03_26,_7_40\342\200\257pm_[Changes]1/OrderService.class" deleted file mode 100644 index db2376610e328844b4cbf882ee07e55ed0b665c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5980 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 diff --git "a/.idea/shelf/Uncommitted_changes_before_Update_at_09_03_26,_7_40\342\200\257pm_[Changes]1/Reservation.class" "b/.idea/shelf/Uncommitted_changes_before_Update_at_09_03_26,_7_40\342\200\257pm_[Changes]1/Reservation.class" deleted file mode 100644 index 79bf7e04598d78d0dd4852573bc88bad1a652f7b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3101 zcmbVOU2_v<6n-{MvPqgk`e|cBKlljgLP?A$N&%%mwGhTSD_?$P%c1ag>oMiHzec$u-JmRiw;lv&)4B7&%nSRBKMYe+Zk-K_Pc zS$|NovUSrbRjRbCH_KKnd(&!J_CwRDHX9oB>vq|)3uO&sYkMI!9h>^g;`Bfq2gPH! zO{+p#wnpO^!?=b65A15mGM%nNOM_OFxCZPiVt*x0?{e8t0p946y<6Ehk@ z)z(UzyW^gyE6rxjG8@Yg9Adoni#M;X-V&R+IOZjVShdk|>~`I1I58Z?5gkY4IEFMc z*-L%hbSk8zUM09trchWc#E`+F4kL~eIH_TDPq!D4sqS<`Z=1C?agfkE68KacSpiBU zLYY;*WVR}D@Kzjo#X$dHvtm-za4zG)(_?Y}PO;$G>!V)W))2hJ3TZgFR&7|<+VvgF zzGd#zxHGoaESa@!)2_;MZ!_prs*IUg`)|cwX0@CBYA4n$r_wBMn6_EB9LuJkYyUrY z51bxoK{K-Hn5Fyc<^z?l4z{YNjk}5(BDPg-m#h^wLoicVERy~&q+cSXW~0Sovo#|n z^1js)F}7aRaZwS7rL!B`I2^@cCt;CUJI)NtNJsIQO|zAzFl2! zTeDXR^wAph5zG{YgHg{x--$Th7`QqklBe6=eTUvaLXMD1hhD`=pQ?%8hR^-M zUg?TOk6xc9aT(iew(XL2xhfr*=u)P}$SJu}Sm4D7aCk*H9XNz2jmhXxE9V8*fD8t; z@;drv?_p*F`VC?NQB2|hqmMIw64RLD?=ePuml_uk=5HEj@E%u@-e-22 zk|ck@l$MFdJVX)(p(bC{Tqy={u?4m{Ru)Y zpdk;S6agI~pjiT%V^Z^kvOwuDXVnn}=!&8%=K{*PfO4uJ0x0JK%DI4Yihdy@Cj*yW z&QWImFJM5|5z%p;-=L-=!xda3FNo3SDA3hb+$6)k+|1Lrh7a&zkDotCs?d6W<}qT% zb4+}PQ1sc1NIzrYd~}7<^p80H4brJcloQnzM@7%RAz0yop;qp3ZU=M#9Dnug)HzZd>ZF03)N)1v91Q`WCkLx#Udu%b> zobSCVKIyr9%38{cCI9*vJ8MkoGBl>tKu8Yr<>8O$GtOChbE}?LFE+WId3TcL-AS5v zCuv^IPno27)hF`$%JVbc^CvHkVbwbe5ef-9OVCY%4iYp?&?rIm1P8Lb3qPfK0Jr}E D%fj-V diff --git "a/.idea/shelf/Uncommitted_changes_before_Update_at_09_03_26,_7_40\342\200\257pm_[Changes]1/WalletController.class" "b/.idea/shelf/Uncommitted_changes_before_Update_at_09_03_26,_7_40\342\200\257pm_[Changes]1/WalletController.class" deleted file mode 100644 index 5d8e922f4afa01901a42e59aa332c5781064d723..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5531 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 I#-+Ud1*quQOaK4? diff --git "a/.idea/shelf/Uncommitted_changes_before_Update_at_09_03_26,_7_40\342\200\257pm_[Changes]1/shelved.patch" "b/.idea/shelf/Uncommitted_changes_before_Update_at_09_03_26,_7_40\342\200\257pm_[Changes]1/shelved.patch" deleted file mode 100644 index 60eb661..0000000 --- "a/.idea/shelf/Uncommitted_changes_before_Update_at_09_03_26,_7_40\342\200\257pm_[Changes]1/shelved.patch" +++ /dev/null @@ -1,196 +0,0 @@ -Index: matching-engine/src/main/java/org/example/matching/api/service/SettlementService.java -IDEA additional info: -Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP -<+>UTF-8 -=================================================================== -diff --git a/matching-engine/src/main/java/org/example/matching/api/service/SettlementService.java b/matching-engine/src/main/java/org/example/matching/api/service/SettlementService.java -new file mode 100644 ---- /dev/null -+++ b/matching-engine/src/main/java/org/example/matching/api/service/SettlementService.java -@@ -0,0 +1,65 @@ -+package org.example.matching.api.service; -+ -+import lombok.RequiredArgsConstructor; -+import org.example.matching.Wallets.RiskManager; -+import org.example.matching.Wallets.WalletService; -+import org.example.matching.api.dto.EventStatus; -+import org.example.matching.api.dto.MarketEvent; -+import org.example.matching.matching.MatchingEngine; -+import org.example.matching.model.Order; -+import org.example.matching.model.Wallet; -+import org.springframework.stereotype.Service; -+ -+import java.util.Collection; -+import java.util.List; -+ -+@Service -+@RequiredArgsConstructor -+public class SettlementService { -+ private final WalletService walletService; -+ private final MarketManagmentService marketService; -+ private final RiskManager riskManager; -+ private final MatchingEngine matchingEngine; -+ -+ -+ public void settleEvent(String eventId, String winningOutcome){ -+ MarketEvent event = marketService.getEvent(eventId); -+ if(event==null|| event.getStatus()== EventStatus.SETTLED) return;; -+ -+ // winningTicker will get assigned the outcome , if it is yes , the winningTicker is yes and no so winningTicker is No -+ String winningTicker = winningOutcome.equalsIgnoreCase("YES")? event.getYesTicker():event.getNoTicker(); -+ -+ //losingTicker will get assigned the outcome , if it is yes , the losingTicker is yes and no so losingTicker is NOx -+ String losingTicker = winningOutcome.equalsIgnoreCase("YES")?event.getNoTicker():event.getYesTicker(); -+ -+ Collection allWallets = walletService.getAllWallets(); -+ -+ for (Wallet wallet : allWallets) { -+ // 2. Pay out the Winners ($1.00 per share) -+ -+ //checking how many shares of yes one has -+ long winningShares = wallet.getAvailableShares().containsKey(winningTicker) -+ ? wallet.getAvailableShares().get(winningTicker).get() -+ : 0L; if (winningShares > 0) { -+ long payout = winningShares * 100; // 100 cents = $1.00 -+ wallet.addAvailableCash(payout); -+ wallet.getAvailableShares().remove(winningTicker); -+ } -+ -+ // 3. Remove the Losing Shares (Worth $0) -+ wallet.getAvailableShares().remove(losingTicker); -+ } -+ -+ event.setStatus(EventStatus.SETTLED); -+ event.setOutcome(winningOutcome); -+ } -+ -+ -+ //check if walletService or RiskManager -+ private void refundTicker(String ticker){ -+ List orders = matchingEngine.clearBook(ticker); -+ for (Order o:orders){ -+ walletService.releaseReservation(o.getId()); -+ } -+ } -+} -\ No newline at end of file -Index: matching-engine/src/main/java/org/example/matching/api/service/MarketManagmentService.java -IDEA additional info: -Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP -<+>UTF-8 -=================================================================== -diff --git a/matching-engine/src/main/java/org/example/matching/api/service/MarketManagmentService.java b/matching-engine/src/main/java/org/example/matching/api/service/MarketManagmentService.java -new file mode 100644 ---- /dev/null -+++ b/matching-engine/src/main/java/org/example/matching/api/service/MarketManagmentService.java -@@ -0,0 +1,79 @@ -+package org.example.matching.api.service; -+ -+import org.example.matching.Wallets.WalletService; -+import org.example.matching.api.dto.EventStatus; -+import org.example.matching.api.dto.MarketEvent; -+import org.example.matching.api.service.LiquidBotService; -+import org.springframework.context.annotation.Lazy; -+import org.springframework.stereotype.Service; -+ -+import java.util.Map; -+import java.util.concurrent.ConcurrentHashMap; -+ -+@Service -+public class MarketManagmentService { -+ private final WalletService walletService; -+ private final LiquidBotService liquidBotService; -+ -+ // Stores Event by ID -+ private final Map events = new ConcurrentHashMap<>(); -+ // Stores Ticker Pairs (YES <-> NO) -+ private final Map tickerPairs = new ConcurrentHashMap<>(); -+ // NEW: Maps Tickers to the Event they belong to -+ private final Map tickerToEvent = new ConcurrentHashMap<>(); -+ -+ // Use constructor injection to avoid circular dependency issues -+ public MarketManagmentService(WalletService walletService, @Lazy LiquidBotService liquidBotService) { -+ this.walletService = walletService; -+ this.liquidBotService = liquidBotService; -+ } -+ -+ public void registerEvent(MarketEvent event) { -+ tickerPairs.put(event.getYesTicker(), event.getNoTicker()); -+ tickerPairs.put(event.getNoTicker(), event.getYesTicker()); -+ -+ // Map both tickers to this event object -+ tickerToEvent.put(event.getYesTicker(), event); -+ tickerToEvent.put(event.getNoTicker(), event); -+ } -+ -+ public String getPartnerTicker(String ticker) { -+ return tickerPairs.get(ticker); -+ } -+ -+ public MarketEvent getEvent(String eventId) { -+ return events.get(eventId); -+ } -+ -+ public MarketEvent getEventByTicker(String ticker) { -+ return tickerToEvent.get(ticker); -+ } -+ -+ public MarketEvent createEvent(String id, String question, String yesTicker, String noTicker, int minutesFromNow) { -+ MarketEvent event = MarketEvent.builder() -+ .evendID(id) -+ .questions(question) -+ .yesTicker(yesTicker) -+ .noTicker(noTicker) -+ .expiry(java.time.LocalDateTime.now().plusMinutes(minutesFromNow)) -+ .status(EventStatus.OPEN) -+ .Liquidity(100000) // Default liquidity -+ .build(); -+ -+ events.put(id, event); -+ registerEvent(event); // Populate the lookup maps -+ -+ walletService.creditUserShares("HOUSE_BOT", yesTicker, 100000); -+ walletService.creditUserShares("HOUSE_BOT", noTicker, 100000); -+ -+ // Start the bot for this specific event -+ liquidBotService.updateMarketTrigger(yesTicker); -+ return event; -+ } -+ -+ public java.util.Collection getAllOpenEvents() { -+ return events.values().stream() -+ .filter(event -> event.getStatus() == EventStatus.OPEN) -+ .collect(java.util.stream.Collectors.toList()); -+ } -+} -\ No newline at end of file -Index: matching-engine/src/main/java/org/example/matching/api/dto/MarketEvent.java -IDEA additional info: -Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP -<+>UTF-8 -=================================================================== -diff --git a/matching-engine/src/main/java/org/example/matching/api/dto/MarketEvent.java b/matching-engine/src/main/java/org/example/matching/api/dto/MarketEvent.java -new file mode 100644 ---- /dev/null -+++ b/matching-engine/src/main/java/org/example/matching/api/dto/MarketEvent.java -@@ -0,0 +1,20 @@ -+package org.example.matching.api.dto; -+ -+import lombok.Builder; -+import lombok.Data; -+ -+import java.time.LocalDateTime; -+ -+@Data -+@Builder -+public class MarketEvent { -+ private String evendID; -+ private String questions; -+ private String yesTicker; -+ private String noTicker; -+ private long Liquidity; -+ private LocalDateTime expiry; //event will expire on this date , either by or oracle -+ private EventStatus status; -+ private String outcome; -+ -+} diff --git a/.idea/shelf/Uncommitted_changes_before_Update_at_09_03_26__7_40pm__Changes_.xml b/.idea/shelf/Uncommitted_changes_before_Update_at_09_03_26__7_40pm__Changes_.xml deleted file mode 100644 index 612f621..0000000 --- a/.idea/shelf/Uncommitted_changes_before_Update_at_09_03_26__7_40pm__Changes_.xml +++ /dev/null @@ -1,4 +0,0 @@ - - \ No newline at end of file diff --git a/.idea/shelf/Uncommitted_changes_before_Update_at_09_03_26__7_40pm__Changes_1.xml b/.idea/shelf/Uncommitted_changes_before_Update_at_09_03_26__7_40pm__Changes_1.xml deleted file mode 100644 index cab4021..0000000 --- a/.idea/shelf/Uncommitted_changes_before_Update_at_09_03_26__7_40pm__Changes_1.xml +++ /dev/null @@ -1,49 +0,0 @@ - - \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml deleted file mode 100644 index 62f171b..0000000 --- a/.idea/workspace.xml +++ /dev/null @@ -1,337 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1771215102171 - - - 1771648338680 - - - 1771648512676 - - - 1771716905485 - - - 1771716936127 - - - 1771716951142 - - - 1771716972703 - - - 1771716983118 - - - 1771717007244 - - - 1771820464482 - - - 1771820479411 - - - 1771820497836 - - - 1772671560856 - - - 1772671600544 - - - 1772671662807 - - - 1772671697081 - - - 1772671751384 - - - 1772680635917 - - - 1772684678651 - - - 1772684723158 - - - 1772684747085 - - - 1772684770758 - - - 1772684815676 - - - 1772752466221 - - - 1772752500293 - - - 1772752539039 - - - 1772752591131 - - - 1772752604653 - - - 1772752666287 - - - 1772753404093 - - - 1772765628233 - - - 1772837990490 - - - 1772949584599 - - - 1773099625894 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Strongx.iml b/Strongx.iml deleted file mode 100644 index 1f9993e..0000000 --- a/Strongx.iml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/backend/.gitignore b/backend/.gitignore deleted file mode 100644 index 723ef36..0000000 --- a/backend/.gitignore +++ /dev/null @@ -1 +0,0 @@ -.idea \ No newline at end of file diff --git a/backend/README.md b/backend/README.md deleted file mode 100644 index 749a73a..0000000 --- a/backend/README.md +++ /dev/null @@ -1,249 +0,0 @@ -# Max Backend - Stock Exchange Matching Engine - -The backend service for Max stock exchange platform, built with Spring Boot. This service handles order matching, trade execution, and provides RESTful APIs for the frontend. - -## 🏗️ Architecture - -``` -backend/ -├── matching-engine/ # Main matching engine service -│ ├── src/ -│ │ ├── main/ -│ │ │ ├── java/org/example/ -│ │ │ └── resources/ -│ │ │ └── application.properties -│ │ └── test/ -│ ├── journals/ # Engine logs -│ └── pom.xml -├── common/ # Shared utilities and models -│ ├── src/main/java/org/example/ -│ └── pom.xml -└── src/ # Additional source files -``` - -## 🛠️ Technology Stack - -- **Framework**: Spring Boot 3.2.2 -- **Language**: Java 17+ -- **Build Tool**: Maven -- **Parent**: Spring Boot Starter Parent 3.2.2 - -### Key Dependencies - -- **Spring Boot Starter Web**: RESTful API development -- **Spring Boot Starter Validation**: Input validation -- **Lombok**: Reduce boilerplate code -- **JUnit Jupiter 5.10.0**: Unit testing - -## 📋 Prerequisites - -- Java Development Kit (JDK) 17 or higher -- Maven 3.6 or higher -- IDE (IntelliJ IDEA, Eclipse, or VS Code recommended) - -## 🚀 Getting Started - -### 1. Install Dependencies - -Navigate to the matching-engine directory: -```bash -cd backend/matching-engine -``` - -Install all dependencies: -```bash -mvn clean install -``` - -### 2. Configure Application - -Edit `src/main/resources/application.properties`: -```properties -# Server Configuration -server.port=8080 - -# Application Name -spring.application.name=matching-engine - -# Logging Configuration -logging.level.org.example=DEBUG -logging.file.name=journals/engine.log -``` - -### 3. Run the Application - -**Using Maven:** -```bash -mvn spring-boot:run -``` - -**Using Java:** -```bash -mvn clean package -java -jar target/matching-engine-1.0-SNAPSHOT.jar -``` - -The application will start on `http://localhost:8080` - -## 🧪 Testing - -### Run All Tests -```bash -mvn test -``` - -### Run Specific Test -```bash -mvn test -Dtest=YourTestClassName -``` - -### Generate Test Coverage Report -```bash -mvn clean test jacoco:report -``` - -## 📁 Project Modules - -### Matching Engine -The core service that handles: -- Order matching logic -- Trade execution -- Market data management -- RESTful API endpoints - -### Common Module -Shared utilities and models used across services: -- Data models -- Utility classes -- Common configurations -- Shared constants - -## 🔧 Development - -### Build the Project -```bash -mvn clean install -``` - -### Run in Development Mode -```bash -mvn spring-boot:run -Dspring-boot.run.profiles=dev -``` - -### Package for Production -```bash -mvn clean package -DskipTests -``` - -## 📊 API Endpoints - -### Health Check -``` -GET /actuator/health -``` - -### Order Management -``` -POST /api/orders # Create new order -GET /api/orders/{id} # Get order by ID -GET /api/orders # List all orders -DELETE /api/orders/{id} # Cancel order -``` - -### Market Data -``` -GET /api/markets # List all markets -GET /api/markets/{id} # Get market details -``` - -## 🐛 Debugging - -### Enable Debug Logging -Add to `application.properties`: -```properties -logging.level.org.example=DEBUG -logging.level.org.springframework.web=DEBUG -``` - -### View Logs -```bash -tail -f journals/engine.log -``` - -## 🔒 Security Considerations - -- Input validation using Spring Validation -- CORS configuration for frontend integration -- Request/Response logging for audit trails - -## 📈 Performance - -- Optimized order matching algorithm -- Efficient data structures for order books -- Asynchronous processing where applicable - -## 🚀 Deployment - -### Build Docker Image (Future) -```bash -docker build -t max-backend:latest . -docker run -p 8080:8080 max-backend:latest -``` - -### Environment Variables -```bash -SPRING_PROFILES_ACTIVE=prod -SERVER_PORT=8080 -``` - -## 📝 Code Style - -- Follow Java naming conventions -- Use Lombok annotations to reduce boilerplate -- Write unit tests for all business logic -- Document complex algorithms - -## 🔄 CI/CD - -### Maven Lifecycle -1. `mvn clean` - Clean build artifacts -2. `mvn compile` - Compile source code -3. `mvn test` - Run tests -4. `mvn package` - Create JAR file -5. `mvn install` - Install to local repository - -## 🐞 Troubleshooting - -### Port Already in Use -```bash -# Change port in application.properties -server.port=8081 -``` - -### Maven Build Fails -```bash -# Clean and rebuild -mvn clean install -U -``` - -### Lombok Not Working -- Install Lombok plugin in your IDE -- Enable annotation processing - -## 📚 Additional Resources - -- [Spring Boot Documentation](https://spring.io/projects/spring-boot) -- [Maven Documentation](https://maven.apache.org/guides/) -- [Lombok Documentation](https://projectlombok.org/) - -## 🤝 Contributing - -1. Create a feature branch -2. Write tests for new features -3. Ensure all tests pass -4. Follow code style guidelines -5. Submit a pull request - -## 📄 License - -This project is private and proprietary. diff --git a/backend/common/pom.xml b/backend/common/pom.xml deleted file mode 100644 index 4b082cf..0000000 --- a/backend/common/pom.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - 4.0.0 - - - - org.example - Strongx - 1.0-SNAPSHOT - - - common - - diff --git a/backend/common/src/main/java/org/example/Main.java b/backend/common/src/main/java/org/example/Main.java deleted file mode 100644 index 407f157..0000000 --- a/backend/common/src/main/java/org/example/Main.java +++ /dev/null @@ -1,7 +0,0 @@ -package org.example; - -public class Main { - public static void main(String[] args) { - System.out.println("Hello world!"); - } -} \ No newline at end of file diff --git a/backend/common/target/classes/org/example/Main.class b/backend/common/target/classes/org/example/Main.class deleted file mode 100644 index c37bb3df14c0c383d1a1fd2c3321348b255d63b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 540 zcmZvZ%T59@6o&tD8)h5@LGZ5N3S2l#7Z_cb7#Da+Fl<~EY_Oy=C1vpPSh~=}g%99E z8BYfjFQJRmoc}-P>uLM(`SuRr2s<89NIS^*$Rfv39P&FJC>{-hi{4Q5V}{&;jAVSs zkZv@)F7j|4cs}Of|0(Z0j$;v0m7Y*jrJaDJ4la$1;!bP?4_kRGF!-lJDP6nQM%~ms z6tU=_T)A({w-$WTRBd=f1nnT!UR}tT+ce6d~OERTb^MvcpW`4 zeQ_e~(XJhB&t4OCROs>TN`cwur?^a6Ks%#7yZZ|El-Mg2tqr8HO3|MdU=8b(x!Axa lDYkh(fsytMr!@b9!VkcHHBspYbH5-iwy;e)Lyckz^)H#vaC-m% diff --git a/backend/common/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/backend/common/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst deleted file mode 100644 index 492813d..0000000 --- a/backend/common/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +++ /dev/null @@ -1 +0,0 @@ -org/example/Main.class diff --git a/backend/common/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/backend/common/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst deleted file mode 100644 index e5787ba..0000000 --- a/backend/common/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +++ /dev/null @@ -1 +0,0 @@ -/Users/aumpatel/Desktop/Spring/Strongx/common/src/main/java/org/example/Main.java diff --git a/backend/journals/engine.log b/backend/journals/engine.log deleted file mode 100644 index a19b55f..0000000 --- a/backend/journals/engine.log +++ /dev/null @@ -1,87 +0,0 @@ -ORDER 555a6afb-fb3e-41c5-9544-cdbc96ed4fa2 seller1 SELL 100 10 1771557534336 -ORDER c5077dcb-c587-4543-9c0b-3da1589504a8 buyer1 BUY 105 4 1771557534365 -TRADE c5077dcb-c587-4543-9c0b-3da1589504a8 555a6afb-fb3e-41c5-9544-cdbc96ed4fa2 100 4 1771557534365 -ORDER f4b788e6-632c-48c1-9eff-30880619b16d buyer2 BUY 100 6 1771557534365 -TRADE f4b788e6-632c-48c1-9eff-30880619b16d 555a6afb-fb3e-41c5-9544-cdbc96ed4fa2 100 6 1771557534366 -ORDER 729e42d0-bf4a-4dbd-a666-3adb0fd9c136 seller1 SELL 100 10 1772083565558 -ORDER c64a2e5d-1e54-4568-bee3-990fe3cde36b buyer1 BUY 105 4 1772083565592 -TRADE c64a2e5d-1e54-4568-bee3-990fe3cde36b 729e42d0-bf4a-4dbd-a666-3adb0fd9c136 100 4 1772083565592 -ORDER 92220288-5c9e-4a1a-9a10-88d14f297953 buyer2 BUY 100 6 1772083565593 -TRADE 92220288-5c9e-4a1a-9a10-88d14f297953 729e42d0-bf4a-4dbd-a666-3adb0fd9c136 100 6 1772083565593 -ORDER 9e2a8036-019a-48e2-a22a-f3e2bf1dd1cc seller1 SELL 100 10 -ORDER 9e2a8036-019a-48e2-a22a-f3e2bf1dd1cc seller1 SELL 100 10 1772083565594 -ORDER 278fdfd7-6893-4d50-923a-0a694dca0884 buyer1 BUY 105 4 -ORDER 278fdfd7-6893-4d50-923a-0a694dca0884 buyer1 BUY 105 4 1772083565594 -TRADE 278fdfd7-6893-4d50-923a-0a694dca0884 9e2a8036-019a-48e2-a22a-f3e2bf1dd1cc 100 4 1772083565594 -TRADE 278fdfd7-6893-4d50-923a-0a694dca0884 9e2a8036-019a-48e2-a22a-f3e2bf1dd1cc 100 4 -ORDER 02956e10-2d87-4a95-93e1-5c9de14c0d0b buyer1 BUY 100 6 -ORDER 02956e10-2d87-4a95-93e1-5c9de14c0d0b buyer1 BUY 100 6 1772083565594 -TRADE 02956e10-2d87-4a95-93e1-5c9de14c0d0b 9e2a8036-019a-48e2-a22a-f3e2bf1dd1cc 100 6 1772083565595 -TRADE 02956e10-2d87-4a95-93e1-5c9de14c0d0b 9e2a8036-019a-48e2-a22a-f3e2bf1dd1cc 100 6 -ORDER 64cbfaf9-f583-44fc-a836-1187c5003ebe seller1 SELL 100 10 1772670798630 -ORDER d69ce365-223d-4776-a5dd-d30cc7a8a912 buyer1 BUY 105 4 1772670798732 -TRADE d69ce365-223d-4776-a5dd-d30cc7a8a912 64cbfaf9-f583-44fc-a836-1187c5003ebe 100 4 1772670798733 -ORDER 8891349c-44e5-408c-8ce0-989ec39e24ca buyer2 BUY 100 6 1772670798734 -TRADE 8891349c-44e5-408c-8ce0-989ec39e24ca 64cbfaf9-f583-44fc-a836-1187c5003ebe 100 6 1772670798734 -ORDER 0b7b68d9-c8d6-4cda-a3c5-f6aa4e9d1330 seller1 SELL 100 10 -ORDER 0b7b68d9-c8d6-4cda-a3c5-f6aa4e9d1330 seller1 SELL 100 10 1772670871847 -ORDER 0b5e5139-84c9-4698-a906-e868092f3308 buyer1 BUY 105 4 -ORDER 0b5e5139-84c9-4698-a906-e868092f3308 buyer1 BUY 105 4 1772670872856 -TRADE 0b5e5139-84c9-4698-a906-e868092f3308 0b7b68d9-c8d6-4cda-a3c5-f6aa4e9d1330 100 4 1772671176205 -TRADE 0b5e5139-84c9-4698-a906-e868092f3308 0b7b68d9-c8d6-4cda-a3c5-f6aa4e9d1330 100 4 -ORDER b2557f88-8c0f-446d-8e70-010b17b2c2c8 buyer1 BUY 100 6 -ORDER b2557f88-8c0f-446d-8e70-010b17b2c2c8 buyer1 BUY 100 6 1772670876431 -TRADE b2557f88-8c0f-446d-8e70-010b17b2c2c8 0b7b68d9-c8d6-4cda-a3c5-f6aa4e9d1330 100 6 1772671176208 -TRADE b2557f88-8c0f-446d-8e70-010b17b2c2c8 0b7b68d9-c8d6-4cda-a3c5-f6aa4e9d1330 100 6 -ORDER 9ebc90e5-eac2-4ed2-bd23-87dc5f9fad78 seller1 SELL 100 10 1772671494015 -ORDER e6791c03-baf8-4f62-8742-ca2046593854 buyer1 BUY 105 4 1772671494047 -TRADE e6791c03-baf8-4f62-8742-ca2046593854 9ebc90e5-eac2-4ed2-bd23-87dc5f9fad78 100 4 1772671494047 -ORDER d6177034-7805-4d88-a13c-ccff65a03a40 buyer2 BUY 100 6 1772671494049 -TRADE d6177034-7805-4d88-a13c-ccff65a03a40 9ebc90e5-eac2-4ed2-bd23-87dc5f9fad78 100 6 1772671494049 -ORDER 759faf99-a021-4608-bdc7-656bfa915a95 seller1 SELL 100 10 -ORDER 759faf99-a021-4608-bdc7-656bfa915a95 seller1 SELL 100 10 1772671494058 -ORDER f3bd642f-8fa9-4d48-94e7-04bcbb39e49a buyer1 BUY 105 4 -ORDER f3bd642f-8fa9-4d48-94e7-04bcbb39e49a buyer1 BUY 105 4 1772671494058 -TRADE f3bd642f-8fa9-4d48-94e7-04bcbb39e49a 759faf99-a021-4608-bdc7-656bfa915a95 100 4 1772671494060 -TRADE f3bd642f-8fa9-4d48-94e7-04bcbb39e49a 759faf99-a021-4608-bdc7-656bfa915a95 100 4 -ORDER 9a5d71f3-1351-403f-a9f6-019f3a5657af buyer1 BUY 100 6 -ORDER 9a5d71f3-1351-403f-a9f6-019f3a5657af buyer1 BUY 100 6 1772671494058 -TRADE 9a5d71f3-1351-403f-a9f6-019f3a5657af 759faf99-a021-4608-bdc7-656bfa915a95 100 6 1772671494061 -TRADE 9a5d71f3-1351-403f-a9f6-019f3a5657af 759faf99-a021-4608-bdc7-656bfa915a95 100 6 -ORDER cd18202b-085c-44d6-a5b6-3598fe8494e6 seller1 SELL 100 10 1772752285238 -ORDER cfe88003-6f8f-4a3a-8236-27b7c139f04d buyer1 BUY 105 4 1772752285262 -TRADE cfe88003-6f8f-4a3a-8236-27b7c139f04d cd18202b-085c-44d6-a5b6-3598fe8494e6 100 4 1772752285262 -ORDER 6b68b475-9229-4bc2-aa10-66298c6e9928 buyer2 BUY 100 6 1772752285264 -TRADE 6b68b475-9229-4bc2-aa10-66298c6e9928 cd18202b-085c-44d6-a5b6-3598fe8494e6 100 6 1772752285264 -ORDER 28e6dec6-2781-4ad0-8230-7cc1de99f41e seller1 SELL 100 10 -ORDER 28e6dec6-2781-4ad0-8230-7cc1de99f41e seller1 SELL 100 10 1772752285268 -ORDER 4e0a0c16-518b-42c4-b40b-4504645951d4 buyer1 BUY 105 4 -ORDER 4e0a0c16-518b-42c4-b40b-4504645951d4 buyer1 BUY 105 4 1772752285268 -TRADE 4e0a0c16-518b-42c4-b40b-4504645951d4 28e6dec6-2781-4ad0-8230-7cc1de99f41e 100 4 1772752285270 -TRADE 4e0a0c16-518b-42c4-b40b-4504645951d4 28e6dec6-2781-4ad0-8230-7cc1de99f41e 100 4 -ORDER ee65a46b-8063-4a87-b6bc-ee9301e48e35 buyer1 BUY 100 6 -ORDER ee65a46b-8063-4a87-b6bc-ee9301e48e35 buyer1 BUY 100 6 1772752285268 -TRADE ee65a46b-8063-4a87-b6bc-ee9301e48e35 28e6dec6-2781-4ad0-8230-7cc1de99f41e 100 6 1772752285270 -TRADE ee65a46b-8063-4a87-b6bc-ee9301e48e35 28e6dec6-2781-4ad0-8230-7cc1de99f41e 100 6 -ORDER_PLACED: c61d527c-d5a2-46cd-b7bd-1e2e7dd1813b -ORDER c61d527c-d5a2-46cd-b7bd-1e2e7dd1813b user123 BUY 150 10 1772754586115 -ORDER_PLACED: 9f12d7ee-5ad2-4702-83fb-4fd4faa682fe -ORDER 9f12d7ee-5ad2-4702-83fb-4fd4faa682fe user123 BUY 150 10 1772755348807 -ORDER_PLACED: 4cef0377-341d-4b13-8856-f44b1ad24656 -ORDER 4cef0377-341d-4b13-8856-f44b1ad24656 user-seller SELL 150 10 1772756125478 -ORDER_PLACED: 44655cad-3469-4cfb-899c-c1dacd78ccda -ORDER 44655cad-3469-4cfb-899c-c1dacd78ccda user1 BUY 100 10 1772756456024 -ORDER_PLACED: a16f2f1b-2e4b-48f0-8a6f-7ce51f4bc94b -ORDER a16f2f1b-2e4b-48f0-8a6f-7ce51f4bc94b user-seller SELL 150 10 1772759912084 -ORDER_PLACED: a1d913c4-317e-4f88-9c2e-05c2d422d7bb -ORDER a1d913c4-317e-4f88-9c2e-05c2d422d7bb user1 BUY 100 10 1772759987885 -ORDER_PLACED: 3db5fb8c-f24b-4674-8a4b-cbadc7fede32 -ORDER 3db5fb8c-f24b-4674-8a4b-cbadc7fede32 user-seller SELL 150 10 1772760831791 -ORDER_PLACED: 562de0cc-8ba3-4264-8158-98904cbce14d -ORDER 562de0cc-8ba3-4264-8158-98904cbce14d user1 BUY 100 10 1772760849537 -ORDER_PLACED: 9320ee7a-9fef-4449-bf80-f2c2ef83cc88 -ORDER 9320ee7a-9fef-4449-bf80-f2c2ef83cc88 user-seller SELL 150 10 1772761342572 -ORDER_PLACED: b7a13e53-93ee-46b0-8ddb-8fa9e26ebe5f -ORDER b7a13e53-93ee-46b0-8ddb-8fa9e26ebe5f user1 BUY 151 10 1772761362103 -TRADE b7a13e53-93ee-46b0-8ddb-8fa9e26ebe5f 9320ee7a-9fef-4449-bf80-f2c2ef83cc88 150 10 1772761362107 -TRADE_SETTLED: b7a13e53-93ee-46b0-8ddb-8fa9e26ebe5f <-> 9320ee7a-9fef-4449-bf80-f2c2ef83cc88 diff --git a/backend/matching-engine/README.md b/backend/matching-engine/README.md deleted file mode 100644 index 12dbdd6..0000000 --- a/backend/matching-engine/README.md +++ /dev/null @@ -1 +0,0 @@ -Max is Stock Exchange being written in Spring Boot diff --git a/backend/matching-engine/journals/engine.log b/backend/matching-engine/journals/engine.log deleted file mode 100644 index 87647fd..0000000 --- a/backend/matching-engine/journals/engine.log +++ /dev/null @@ -1,53 +0,0 @@ -ORDER c78afcd8-aa27-4770-866b-840efa1dcad2 seller1 SELL 100 10 1772752218574 -ORDER 8a44bcdf-4b7a-4bfb-b94c-792f629cd9f1 buyer1 BUY 105 4 1772752218582 -TRADE 8a44bcdf-4b7a-4bfb-b94c-792f629cd9f1 c78afcd8-aa27-4770-866b-840efa1dcad2 100 4 1772752218582 -ORDER 2c267f3a-4da6-4060-bb5b-de3fa97f6029 buyer2 BUY 100 6 1772752218583 -TRADE 2c267f3a-4da6-4060-bb5b-de3fa97f6029 c78afcd8-aa27-4770-866b-840efa1dcad2 100 6 1772752218583 -ORDER a692a971-2eae-4de6-b469-2bff7c12c7ec seller1 SELL 100 10 -ORDER a692a971-2eae-4de6-b469-2bff7c12c7ec seller1 SELL 100 10 1772752218586 -ORDER 9a4428f5-1e36-4bf6-a7e7-2b0900bb62e8 buyer1 BUY 105 4 -ORDER 9a4428f5-1e36-4bf6-a7e7-2b0900bb62e8 buyer1 BUY 105 4 1772752218586 -TRADE 9a4428f5-1e36-4bf6-a7e7-2b0900bb62e8 a692a971-2eae-4de6-b469-2bff7c12c7ec 100 4 1772752218586 -TRADE 9a4428f5-1e36-4bf6-a7e7-2b0900bb62e8 a692a971-2eae-4de6-b469-2bff7c12c7ec 100 4 -ORDER a8eaddb2-4f1f-4df0-a28b-c365b37c6911 buyer1 BUY 100 6 -ORDER a8eaddb2-4f1f-4df0-a28b-c365b37c6911 buyer1 BUY 100 6 1772752218586 -TRADE a8eaddb2-4f1f-4df0-a28b-c365b37c6911 a692a971-2eae-4de6-b469-2bff7c12c7ec 100 6 1772752218587 -TRADE a8eaddb2-4f1f-4df0-a28b-c365b37c6911 a692a971-2eae-4de6-b469-2bff7c12c7ec 100 6 -ORDER 5362fffb-146f-40b0-a9e1-fb84dd970ac7 seller1 SELL 100 10 1772760358808 -ORDER 0211741a-8fa1-4a25-8b1d-1237a52f9211 buyer1 BUY 105 4 1772760358814 -TRADE 0211741a-8fa1-4a25-8b1d-1237a52f9211 5362fffb-146f-40b0-a9e1-fb84dd970ac7 100 4 1772760358815 -ORDER 898a8498-ad4e-434b-8abe-5f5d20ae3173 buyer2 BUY 100 6 1772760358816 -TRADE 898a8498-ad4e-434b-8abe-5f5d20ae3173 5362fffb-146f-40b0-a9e1-fb84dd970ac7 100 6 1772760358816 -REJECT 6b224bfc-c1e8-46d7-b0a3-ac0de2b49358 INSUFFICIENT_FUNDS -ORDER f9712aa9-acba-43aa-adda-cb5a7adf145d buyer1 BUY 105 4 -ORDER f9712aa9-acba-43aa-adda-cb5a7adf145d buyer1 BUY 105 4 1772760358817 -ORDER c2cd976b-335c-4592-a644-d0d07db87af1 buyer1 BUY 100 6 -ORDER c2cd976b-335c-4592-a644-d0d07db87af1 buyer1 BUY 100 6 1772760358817 -ORDER 37c7fb05-1c35-4f6c-9407-3e01713a1ea9 seller1 SELL 100 10 1772760473119 -ORDER 05f435ca-b3b9-4288-a979-062eef0f5e06 buyer1 BUY 105 4 1772760473125 -TRADE 05f435ca-b3b9-4288-a979-062eef0f5e06 37c7fb05-1c35-4f6c-9407-3e01713a1ea9 100 4 1772760473125 -ORDER ce8d19be-00e6-4e0b-8056-2f468e5d540a buyer2 BUY 100 6 1772760473126 -TRADE ce8d19be-00e6-4e0b-8056-2f468e5d540a 37c7fb05-1c35-4f6c-9407-3e01713a1ea9 100 6 1772760473126 -REJECT debaf786-7218-4204-9bed-55e5d79c5e16 INSUFFICIENT_FUNDS -ORDER d5f67c56-67c3-4dac-967d-8b54cc41d1b6 buyer1 BUY 105 4 -ORDER d5f67c56-67c3-4dac-967d-8b54cc41d1b6 buyer1 BUY 105 4 1772760473129 -ORDER a204eca1-a5db-4d75-855f-64ca63a755db buyer1 BUY 100 6 -ORDER a204eca1-a5db-4d75-855f-64ca63a755db buyer1 BUY 100 6 1772760473129 -ORDER_PLACED: e72d00ac-eb7b-42ab-bf3b-f9e568c32ea4 -ORDER e72d00ac-eb7b-42ab-bf3b-f9e568c32ea4 user-seller SELL 100 10 1772760703367 -ORDER_PLACED: cbeb1b27-a8fa-45b2-9bd0-459cc73c3466 -ORDER cbeb1b27-a8fa-45b2-9bd0-459cc73c3466 user1 BUY 100 10 1772760707390 -TRADE cbeb1b27-a8fa-45b2-9bd0-459cc73c3466 e72d00ac-eb7b-42ab-bf3b-f9e568c32ea4 100 10 1772760707390 -TRADE_SETTLED: cbeb1b27-a8fa-45b2-9bd0-459cc73c3466 <-> e72d00ac-eb7b-42ab-bf3b-f9e568c32ea4 -ORDER_PLACED: e5bb5cfc-bb06-4a16-9af5-5e91f72c7a0c -ORDER e5bb5cfc-bb06-4a16-9af5-5e91f72c7a0c user-seller SELL 150 10 1772761274302 -ORDER_PLACED: aa3558d9-7e18-41d7-b6e5-00e3e0c69788 -ORDER aa3558d9-7e18-41d7-b6e5-00e3e0c69788 user1 BUY 151 10 1772761274334 -TRADE aa3558d9-7e18-41d7-b6e5-00e3e0c69788 e5bb5cfc-bb06-4a16-9af5-5e91f72c7a0c 150 10 1772761274335 -TRADE_SETTLED: aa3558d9-7e18-41d7-b6e5-00e3e0c69788 <-> e5bb5cfc-bb06-4a16-9af5-5e91f72c7a0c -ORDER_PLACED: 89a0af09-0b11-467d-ba14-c015ea52007c -ORDER 89a0af09-0b11-467d-ba14-c015ea52007c user-seller SELL 150 10 1772837899360 -ORDER_PLACED: 14e62193-7644-460c-bc0e-e6f9f9eb8ff9 -ORDER 14e62193-7644-460c-bc0e-e6f9f9eb8ff9 user1 BUY 151 10 1772837899385 -TRADE 14e62193-7644-460c-bc0e-e6f9f9eb8ff9 89a0af09-0b11-467d-ba14-c015ea52007c 150 10 1772837899386 -TRADE_SETTLED: 14e62193-7644-460c-bc0e-e6f9f9eb8ff9 <-> 89a0af09-0b11-467d-ba14-c015ea52007c diff --git a/backend/matching-engine/pom.xml b/backend/matching-engine/pom.xml deleted file mode 100644 index 8e0bcd4..0000000 --- a/backend/matching-engine/pom.xml +++ /dev/null @@ -1,50 +0,0 @@ - - - 4.0.0 - - - org.springframework.boot - spring-boot-starter-parent - 3.2.2 - - - - org.example - matching-engine - 1.0-SNAPSHOT - - - - - org.example - common - 1.0-SNAPSHOT - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-validation - - - org.projectlombok - lombok - true - - - org.springframework.boot - spring-boot-starter - - - - org.junit.jupiter - junit-jupiter - 5.10.0 - test - - - \ No newline at end of file diff --git a/backend/matching-engine/src/main/java/org/example/Main.java b/backend/matching-engine/src/main/java/org/example/Main.java deleted file mode 100644 index be87cb5..0000000 --- a/backend/matching-engine/src/main/java/org/example/Main.java +++ /dev/null @@ -1,109 +0,0 @@ -package org.example; - -import org.example.matching.Replay; -import org.example.matching.Wallets.InMemoryWalletService; -import org.example.matching.Wallets.RiskManager; -import org.example.matching.journal.EventJournal; -import org.example.matching.matching.MatchingEngine; -import org.example.matching.model.Order; -import org.example.matching.model.OrderBook; -import org.example.matching.model.OrderSide; -import org.example.matching.model.Trade; -import org.example.matching.orderbook.InMemoryOrderRepository; -import org.example.matching.orderbook.OrderOrchestrator; -import org.example.matching.orderbook.OrderRepository; -import org.example.matching.validation.OrderValidator; -import org.example.matching.util.IdGenerator; - -import java.util.List; -import java.util.UUID; - -public class Main { - public static void main(String[] args) { - System.out.println("=== PART A: Engine-only smoke test ==="); - engineSmokeTest(); - - System.out.println("\n\n=== PART B: Full orchestrator E2E test ==="); - orchestratorE2ETest(); - - System.out.println("\n\n=== PART C: Replay test ==="); - replayTest(); - } - - private static void engineSmokeTest(){ - System.out.println("Testing MatchingEngine directly..."); - MatchingEngine engine = new MatchingEngine(); - - Order s1 = new Order(IdGenerator.newId(),"seller1",100L,10,System.currentTimeMillis(),OrderSide.SELL, "AAPL"); - engine.placeOrder(s1); - System.out.println("After SELL (10 @100):"); - System.out.println(engine.dumpBook()); - - Order b1 = new Order(IdGenerator.newId(), "buyer1", 105L, 4, System.currentTimeMillis(), OrderSide.BUY, "AAPL"); - List t1 = engine.placeOrder(b1); - System.out.println("Trade executed: " + t1.size() + " trade(s)"); - System.out.println(engine.dumpBook()); - - Order b2 = new Order(IdGenerator.newId(), "buyer2", 100L, 6, System.currentTimeMillis(), OrderSide.BUY, "AAPL"); - List t2 = engine.placeOrder(b2); - System.out.println("Trade executed: " + t2.size() + " trade(s)"); - System.out.println("Final order book:\n" + engine.dumpBook()); - } - - - private static void orchestratorE2ETest(){ - System.out.println("Testing full orchestrator with wallet integration..."); - OrderRepository orderRepo = new InMemoryOrderRepository(); - InMemoryWalletService walletService = new InMemoryWalletService(orderRepo); - RiskManager riskManager = new RiskManager(walletService, orderRepo); - EventJournal journal = new EventJournal(); - MatchingEngine engine = new MatchingEngine(); - - // Create orchestrator with full constructor - OrderOrchestrator orchestrator = new OrderOrchestrator(engine, journal, riskManager, orderRepo, walletService); - - // Top up wallets - walletService.creditUserShares("seller1", 10); - walletService.creditUserCash("buyer1", 10000); - - System.out.println("Initial state - Buyer cash: " + walletService.getWallet("buyer1").getAvailableCash() + - ", Seller shares: " + walletService.getWallet("seller1").getAvailableShares("MARKET")); - - // create orders - Order sell = new Order(UUID.randomUUID().toString(), "seller1", 100L, 10, System.currentTimeMillis(), OrderSide.SELL, "TSLA"); - Order buy1 = new Order(UUID.randomUUID().toString(), "buyer1", 105L, 4, System.currentTimeMillis(), OrderSide.BUY, "TSLA"); - Order buy2 = new Order(UUID.randomUUID().toString(), "buyer1", 100L, 6, System.currentTimeMillis(), OrderSide.BUY, "TSLA"); - - System.out.println("\nSubmitting orders..."); - orchestrator.submitOrder(sell); - orchestrator.submitOrder(buy1); - orchestrator.submitOrder(buy2); - - // final state - System.out.println("\nFinal order book:"); - System.out.println(engine.dumpBook()); - - System.out.println("\nFinal wallet balances:"); - System.out.println("Buyer - Cash: " + walletService.getWallet("buyer1").getAvailableCash() + - ", Shares: " + walletService.getWallet("buyer1").getAvailableShares("MARKET")); - System.out.println("Seller - Cash: " + walletService.getWallet("seller1").getAvailableCash() + - ", Shares: " + walletService.getWallet("seller1").getAvailableShares("MARKET")); - - // Show only recent journal entries (last 10) - System.out.println("\nRecent journal entries:"); - List lines = journal.readAllLines(); - int start = Math.max(0, lines.size() - 10); - for (int i = start; i < lines.size(); i++) { - System.out.println(lines.get(i)); - } - } - - private static void replayTest(){ - System.out.println("Testing journal replay functionality..."); - MatchingEngine engine2 = new MatchingEngine(); - Replay r = new Replay(engine2); - r.replayJournal(); - System.out.println("Reconstructed order book:"); - System.out.println(engine2.dumpBook()); - } -} \ No newline at end of file diff --git a/backend/matching-engine/src/main/java/org/example/matching/MatchingEngineApplication.java b/backend/matching-engine/src/main/java/org/example/matching/MatchingEngineApplication.java deleted file mode 100644 index 5f1340d..0000000 --- a/backend/matching-engine/src/main/java/org/example/matching/MatchingEngineApplication.java +++ /dev/null @@ -1,11 +0,0 @@ -package org.example.matching; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@SpringBootApplication -public class MatchingEngineApplication { - public static void main(String[] args) { - SpringApplication.run(MatchingEngineApplication.class, args); - } -} diff --git a/backend/matching-engine/src/main/java/org/example/matching/Replay.java b/backend/matching-engine/src/main/java/org/example/matching/Replay.java deleted file mode 100644 index 41b53bd..0000000 --- a/backend/matching-engine/src/main/java/org/example/matching/Replay.java +++ /dev/null @@ -1,98 +0,0 @@ -//package org.example.matching; -// -//import org.example.matching.matching.MatchingEngine; -//import org.example.matching.model.Order; -//import org.example.matching.model.OrderBook; -//import org.example.matching.model.OrderSide; -// -//import java.io.BufferedReader; -//import java.io.File; -//import java.io.FileReader; -//import java.io.IOException; -//import java.util.Scanner; -// -//public class Replay { -// // MatchingEngine matchingEngine = new MatchingEngine(); -// -// public void replayJournal(String filePath, OrderBook book) { -// try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) { -// String line; -// while ((line = reader.readLine()) != null) { -// String[] tokens = line.trim().split("\\s+"); -// -// if (tokens.length >= 7 && tokens[0].equals("ORDER")) { -// try { -// String id = tokens[1]; -// String userId = tokens[2]; -// -// // FIXED INDICES BASED ON YOUR LOG: -// long price = Long.parseLong(tokens[3]); // Was [4] -// int quantity = Integer.parseInt(tokens[4]); // Was [5] -// long timestamp = Long.parseLong(tokens[5]); -// OrderSide side = OrderSide.valueOf(tokens[6].toUpperCase()); -// -// Order reOrder = new Order(id, userId, price, quantity, timestamp, side); -// -// // Let's add a print here so you can SEE it working -// System.out.println("Replaying: " + side + " " + quantity + " @ " + price); -// -// book.placeOrder(reOrder); -// -// } catch (Exception e) { -// System.err.println("Error parsing line: " + line + " | " + e.getMessage()); -// } -// } -// } -// } catch (IOException e) { -// System.err.println("File not found: " + e.getMessage()); -// } -// }} - - - - -package org.example.matching; - -import org.example.matching.matching.MatchingEngine; -import org.example.matching.model.Order; -import org.example.matching.model.OrderSide; -import org.example.matching.journal.EventJournal; - -import java.util.List; - -public class Replay { - private final MatchingEngine engine; - private final EventJournal journal; - - public Replay(MatchingEngine engine) { - this.engine = engine; - this.journal = new EventJournal(); - } - - public void replayJournal() { - List lines = journal.readAllLines(); - for (String raw : lines) { - if (raw == null || raw.isBlank()) continue; - String[] first = raw.split("\\s+"); - if (first.length < 2) continue; - - if ("ORDER".equals(first[0]) && first.length >= 7) { - try { - String id = first[1]; - String user = first[2]; - String sideToken = first[3]; - long price = Long.parseLong(first[4]); - int qty = Integer.parseInt(first[5]); - long ts = Long.parseLong(first[6]); - OrderSide side = OrderSide.valueOf(sideToken); - Order o = new Order(id, user, price, qty, ts, side, "DEFAULT"); // Use DEFAULT instrument for replay - System.out.println("Replaying: " + side + " " + qty + " @ " + price); - engine.replayOrder(o); // replay mode (no journaling) - } catch (Exception e) { - System.err.println("Skipping malformed ORDER line: " + raw + " -> " + e.getMessage()); - } - } - // ignore TRADE lines - } - } -} diff --git a/backend/matching-engine/src/main/java/org/example/matching/Wallets/InMemoryWalletService.java b/backend/matching-engine/src/main/java/org/example/matching/Wallets/InMemoryWalletService.java deleted file mode 100644 index 88335c0..0000000 --- a/backend/matching-engine/src/main/java/org/example/matching/Wallets/InMemoryWalletService.java +++ /dev/null @@ -1,138 +0,0 @@ -package org.example.matching.Wallets; - -import lombok.RequiredArgsConstructor; -import org.example.matching.model.Order; -import org.example.matching.model.Reservation; -import org.example.matching.model.Trade; -import org.example.matching.model.Wallet; -import org.example.matching.orderbook.OrderRepository; -import org.springframework.stereotype.Service; // Add this import - -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -@Service // Tells Spring this is a managed bean -public class InMemoryWalletService implements WalletService { - - private final Map wallets = new ConcurrentHashMap<>(); - private final Map reservations = new ConcurrentHashMap<>(); - private final OrderRepository orderRepository; - private final String INSTRUMENT = "MARKET"; - - // No-arg constructor for Main.java usage - public InMemoryWalletService() { - this.orderRepository = null; - } - - // Constructor for dependency injection - public InMemoryWalletService(OrderRepository orderRepository) { - this.orderRepository = orderRepository; - } - - private Wallet ensureWallet(String userId) { - return wallets.computeIfAbsent(userId, k -> new Wallet(userId)); - } - - @Override - public boolean reserveForOrder(Order order) { - String userId = order.getUserId(); - String instrument = order.getInstrument(); - Wallet w = ensureWallet(userId); - - if (order.getSide().name().equals("BUY")) { - long required = order.getPrice() * (long) order.getQuantity(); - if (!w.tryReserveCash(required)) return false; - - Reservation r = new Reservation(order.getId(), userId, order.getPrice(), order.getQuantity(), true, instrument); - r.setReservedCash(required); - reservations.put(order.getId(), r); - } else { - if (!w.tryReserveShares(instrument, order.getQuantity())) return false; - - Reservation r = new Reservation(order.getId(), userId, order.getPrice(), order.getQuantity(), false, instrument); - r.setReservedShares(order.getQuantity()); - reservations.put(order.getId(), r); - } - return true; - } - - -@Override -public void releaseReservation(String orderId){ - Reservation r = reservations.remove(orderId); - if(r==null)return; - Wallet w = ensureWallet(r.getUserId()); - if(r.getIsBuy()){ - w.releaseReserveCash(r.getReservedCash()); - - }else{ - w.releaseReservedShares(r.getInstrument(),r.getReservedShares()); - - } - } - - @Override - public void creditUserShares(String userId, long shares) { - Wallet w = ensureWallet(userId); - w.addAvailableShares(INSTRUMENT, shares); - } - - @Override - public void creditUserShares(String userId, String instrument, long shares) { - Wallet w = ensureWallet(userId); - w.addAvailableShares(instrument, shares); - } - - @Override - public void creditUserCash(String userId, long cash) { - Wallet w = ensureWallet(userId); - w.addAvailableCash(cash); - } - - @Override - public Wallet getWallet(String userId) { - return wallets.get(userId); - } - - @Override - public void settleTrade(Trade trade) { - Order buy = orderRepository.findById(trade.getBuyOrderId()).orElse(null); - Order sell = orderRepository.findById(trade.getSellOrderId()).orElse(null); - - if (buy == null || sell == null) return; - - Wallet buyerWallet = ensureWallet(buy.getUserId()); - Wallet sellerWallet = ensureWallet(sell.getUserId()); - Reservation buyRes = reservations.get(buy.getId()); - Reservation sellRes = reservations.get(sell.getId()); - - int qty = (int) trade.getQuantity(); - long tradeValue = trade.getPrice() * (long) qty; - String instrument = buy.getInstrument(); - // Process Buy Side - if (buyRes != null) { - long cashtoDebitFromReserved = buyRes.reduceBy(qty); - buyerWallet.debitReservedCash(cashtoDebitFromReserved); - - long refund = cashtoDebitFromReserved - tradeValue; - if (refund > 0) buyerWallet.addAvailableCash(refund); - - buyerWallet.addAvailableShares(instrument, qty); - } - - // Process Sell Side - if (sellRes != null) { - sellRes.reduceBy(qty); - sellerWallet.debitReservedShares(instrument, (long) qty); - sellerWallet.addAvailableCash(tradeValue); - } - - // Cleanup completed reservations - if (buyRes != null && buyRes.getRemainingQty() == 0) { - reservations.remove(buy.getId()); - } - if (sellRes != null && sellRes.getRemainingQty() == 0) { - reservations.remove(sell.getId()); - } - } -} \ No newline at end of file diff --git a/backend/matching-engine/src/main/java/org/example/matching/Wallets/RiskManager.java b/backend/matching-engine/src/main/java/org/example/matching/Wallets/RiskManager.java deleted file mode 100644 index a452b8a..0000000 --- a/backend/matching-engine/src/main/java/org/example/matching/Wallets/RiskManager.java +++ /dev/null @@ -1,34 +0,0 @@ -package org.example.matching.Wallets; - -import lombok.AllArgsConstructor; -import org.example.matching.model.Order; -import org.example.matching.orderbook.OrderRepository; -import org.springframework.stereotype.Service; - -@Service -public class RiskManager { - - private final WalletService walletService; - private final OrderRepository orderRepository; // 1. Add the field - - // No-arg constructor for Main.java usage - public RiskManager() { - this.walletService = null; - this.orderRepository = null; - } - - // Constructor for dependency injection - public RiskManager(WalletService walletService, OrderRepository orderRepository) { - this.walletService = walletService; - this.orderRepository = orderRepository; - } - - - public boolean checkAndReserve(Order order) { - // currently just delegates to walletService which performs the reserve attempt - //orderRepository.save(order); - - // 2. NOW ATTEMPT TO RESERVE - return walletService.reserveForOrder(order); - } -} \ No newline at end of file diff --git a/backend/matching-engine/src/main/java/org/example/matching/Wallets/WalletService.java b/backend/matching-engine/src/main/java/org/example/matching/Wallets/WalletService.java deleted file mode 100644 index 73c862e..0000000 --- a/backend/matching-engine/src/main/java/org/example/matching/Wallets/WalletService.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.example.matching.Wallets; - -import org.example.matching.model.Order; -import org.example.matching.model.Trade; -import org.example.matching.model.Wallet; - -public interface WalletService { - boolean reserveForOrder(Order order); - void releaseReservation(String orderId); - void settleTrade(Trade trade); - - // Additional methods needed for testing and API - void creditUserShares(String userId, long shares); - void creditUserShares(String userId, String instrument, long shares); - void creditUserCash(String userId, long cash); - Wallet getWallet(String userId); -} diff --git a/backend/matching-engine/src/main/java/org/example/matching/api/advice/ApiExceptionHandler.java b/backend/matching-engine/src/main/java/org/example/matching/api/advice/ApiExceptionHandler.java deleted file mode 100644 index 8c5f10f..0000000 --- a/backend/matching-engine/src/main/java/org/example/matching/api/advice/ApiExceptionHandler.java +++ /dev/null @@ -1,29 +0,0 @@ -package org.example.matching.api.advice; - -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.MethodArgumentNotValidException; -import org.springframework.web.bind.annotation.ExceptionHandler; -import org.springframework.web.bind.annotation.RestControllerAdvice; - -import java.util.HashMap; -import java.util.Map; - -@RestControllerAdvice -public class ApiExceptionHandler { - - // Catch Validation Errors (@Valid) - @ExceptionHandler(MethodArgumentNotValidException.class) - public ResponseEntity> handleValidation(MethodArgumentNotValidException ex) { - Map errors = new HashMap<>(); - ex.getBindingResult().getFieldErrors().forEach(error -> - errors.put(error.getField(), error.getDefaultMessage())); - return ResponseEntity.badRequest().body(errors); - } - - // Catch Custom Logic Errors - @ExceptionHandler(IllegalStateException.class) - public ResponseEntity handleBusinessError(IllegalStateException ex) { - return ResponseEntity.status(HttpStatus.CONFLICT).body(ex.getMessage()); - } -} \ No newline at end of file diff --git a/backend/matching-engine/src/main/java/org/example/matching/api/controller/EventController.java b/backend/matching-engine/src/main/java/org/example/matching/api/controller/EventController.java deleted file mode 100644 index b018cee..0000000 --- a/backend/matching-engine/src/main/java/org/example/matching/api/controller/EventController.java +++ /dev/null @@ -1,38 +0,0 @@ -package org.example.matching.api.controller; - -import jdk.jfr.Event; -import lombok.RequiredArgsConstructor; -import org.example.matching.api.dto.EventRequest; -import org.example.matching.api.dto.MarketEvent; -import org.example.matching.api.service.MarketManagmentService; -import org.example.matching.api.service.SettlementService; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -@RestController -@RequestMapping("/api/events") -@RequiredArgsConstructor -public class EventController { - private final MarketManagmentService managementService; - private final SettlementService settlementService; - - @PostMapping("/create") - public ResponseEntity create(@RequestBody EventRequest req) { - MarketEvent event = managementService.createEvent( - req.getId(), - req.getQuestions(), - req.getYesTicker(), - req.getNoTicker(), - req.getExpiry() - ); - return ResponseEntity.ok(event); - - } - - @PostMapping("/{id}/settle/{outcome}") - public ResponseEntity settle(@PathVariable String id, @PathVariable String outcome) { - settlementService.settleEvent(id, outcome); - return ResponseEntity.ok("Event " + id + " settled with outcome: " + outcome); - - } -} \ No newline at end of file diff --git a/backend/matching-engine/src/main/java/org/example/matching/api/controller/MarketController.java b/backend/matching-engine/src/main/java/org/example/matching/api/controller/MarketController.java deleted file mode 100644 index d955ddd..0000000 --- a/backend/matching-engine/src/main/java/org/example/matching/api/controller/MarketController.java +++ /dev/null @@ -1,36 +0,0 @@ -package org.example.matching.api.controller; - -import lombok.RequiredArgsConstructor; -import org.example.matching.api.dto.OrderBookResponse; -import org.example.matching.api.service.MarketDataService; -import org.example.matching.matching.MatchingEngine; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.util.Map; - -@RequestMapping("/api/market") -@RestController -@RequiredArgsConstructor -public class MarketController { - private final MatchingEngine matchingEngine; - private final MarketDataService marketDataService; - -// public MarketController(MatchingEngine matchingEngine) { -// this.matchingEngine = matchingEngine; -// } - - @GetMapping("/orderbook/{instrument}") - public ResponseEntity getOrderBook(@PathVariable String instrument) { - OrderBookResponse snapshot = matchingEngine.getSnapshot(instrument); - return ResponseEntity.ok(snapshot); - } - - @GetMapping("/ticker/{instrument}") - public ResponseEntity> getTicker(@PathVariable String instrument){ - return ResponseEntity.ok(marketDataService.getSnapshots(instrument.toUpperCase())); - } -} diff --git a/backend/matching-engine/src/main/java/org/example/matching/api/controller/OrderController.java b/backend/matching-engine/src/main/java/org/example/matching/api/controller/OrderController.java deleted file mode 100644 index 7e6dacd..0000000 --- a/backend/matching-engine/src/main/java/org/example/matching/api/controller/OrderController.java +++ /dev/null @@ -1,39 +0,0 @@ -package org.example.matching.api.controller; - -import jakarta.validation.Valid; -import lombok.RequiredArgsConstructor; -import org.example.matching.api.dto.OrderRequest; -import org.example.matching.api.dto.OrderResponse; -import org.example.matching.api.service.OrderService; -import org.example.matching.model.Order; -import org.example.matching.orderbook.OrderRepository; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -import javax.swing.text.html.parser.Entity; -import java.util.Optional; - -@RestController -@RequestMapping("/api/orders") -@RequiredArgsConstructor -public class OrderController { -private final OrderService orderService; -private final OrderRepository orderRepository; - - @PostMapping - public ResponseEntity placeOrder(@Valid @RequestBody OrderRequest request) { - OrderResponse response = orderService.processOrder(request); - - if (response.getStatus().equals("REJECTED")) { - return ResponseEntity.badRequest().body(response); - } - return ResponseEntity.ok(response); - } - - @GetMapping("/{id}") - public ResponseEntity getOrder(@PathVariable String id){ - return orderRepository.findById(id) - .map(ResponseEntity::ok) - .orElse(ResponseEntity.notFound().build()); - -}} diff --git a/backend/matching-engine/src/main/java/org/example/matching/api/controller/WalletController.java b/backend/matching-engine/src/main/java/org/example/matching/api/controller/WalletController.java deleted file mode 100644 index 2b0b3ba..0000000 --- a/backend/matching-engine/src/main/java/org/example/matching/api/controller/WalletController.java +++ /dev/null @@ -1,59 +0,0 @@ -package org.example.matching.api.controller; - -import lombok.RequiredArgsConstructor; -import org.example.matching.Wallets.WalletService; -import org.example.matching.api.dto.DepositRequest; -import org.example.matching.api.dto.WalletResponse; -import org.example.matching.model.Wallet; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -import java.util.Map; -import java.util.stream.Collectors; - -@RestController -@RequestMapping("/api/wallets") -@RequiredArgsConstructor -public class WalletController { - - private final WalletService walletService; - - @GetMapping("/{userId}") - public ResponseEntity getWallet(@PathVariable String userId){ - Wallet wallet = walletService.getWallet(userId); - - // Convert AtomicLong maps to Long maps for JSON response - Map availableShares = wallet.getAvailableShares().entrySet().stream() - .collect(Collectors.toMap( - Map.Entry::getKey, - entry -> entry.getValue().get() - )); - - Map reservedShares = wallet.getReservedShares().entrySet().stream() - .collect(Collectors.toMap( - Map.Entry::getKey, - entry -> entry.getValue().get() - )); - - WalletResponse response = WalletResponse.builder() - .userId(userId) - .availableCash(wallet.getAvailableCash()) - .reservedCash(wallet.getReservedCash()) - .availableShares(availableShares) - .reservedShares(reservedShares) - .build(); - return ResponseEntity.ok(response); - } - @PostMapping("/depositCash") - public ResponseEntity depositCash(@RequestBody DepositRequest request) { - walletService.creditUserCash(request.getUserId(), request.getAmount()); - return ResponseEntity.ok("Deposit Successful"); - } - - @PostMapping("/depositShares") - public ResponseEntity depositShares(@RequestBody DepositRequest request) { - // Credit shares for the specific instrument - walletService.creditUserShares(request.getUserId(), request.getInstrument(), request.getAmount()); - return ResponseEntity.ok("Shares Deposited Successfully"); - } -} \ No newline at end of file diff --git a/backend/matching-engine/src/main/java/org/example/matching/api/dto/DepositRequest.java b/backend/matching-engine/src/main/java/org/example/matching/api/dto/DepositRequest.java deleted file mode 100644 index 875f533..0000000 --- a/backend/matching-engine/src/main/java/org/example/matching/api/dto/DepositRequest.java +++ /dev/null @@ -1,26 +0,0 @@ -package org.example.matching.api.dto; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@NoArgsConstructor -@AllArgsConstructor -public class DepositRequest { - private String userId; - private long amount; - private String instrument; // Optional: used if depositing shares instead of cash - - public String getUserId() { - return userId; - } - - public long getAmount() { - return amount; - } - - public String getInstrument() { - return instrument; - } -} diff --git a/backend/matching-engine/src/main/java/org/example/matching/api/dto/EventRequest.java b/backend/matching-engine/src/main/java/org/example/matching/api/dto/EventRequest.java deleted file mode 100644 index 4a6b6f6..0000000 --- a/backend/matching-engine/src/main/java/org/example/matching/api/dto/EventRequest.java +++ /dev/null @@ -1,12 +0,0 @@ -package org.example.matching.api.dto; - -import lombok.Data; - -@Data -public class EventRequest { - private String id; - private String questions; // Matches your JSON "questions" - private String yesTicker; - private String noTicker; - private int expiry; -} \ No newline at end of file diff --git a/backend/matching-engine/src/main/java/org/example/matching/api/dto/EventStatus.java b/backend/matching-engine/src/main/java/org/example/matching/api/dto/EventStatus.java deleted file mode 100644 index 73d49ad..0000000 --- a/backend/matching-engine/src/main/java/org/example/matching/api/dto/EventStatus.java +++ /dev/null @@ -1,6 +0,0 @@ -package org.example.matching.api.dto; -public enum EventStatus{ - OPEN, - CLOSED, - SETTLED -} diff --git a/backend/matching-engine/src/main/java/org/example/matching/api/dto/OrderBookResponse.java b/backend/matching-engine/src/main/java/org/example/matching/api/dto/OrderBookResponse.java deleted file mode 100644 index ce2e349..0000000 --- a/backend/matching-engine/src/main/java/org/example/matching/api/dto/OrderBookResponse.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.example.matching.api.dto; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.util.List; - -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class OrderBookResponse { - private String instrument; - private List bids; - private List asks; -} diff --git a/backend/matching-engine/src/main/java/org/example/matching/api/dto/OrderMapper.java b/backend/matching-engine/src/main/java/org/example/matching/api/dto/OrderMapper.java deleted file mode 100644 index 9d8577f..0000000 --- a/backend/matching-engine/src/main/java/org/example/matching/api/dto/OrderMapper.java +++ /dev/null @@ -1,21 +0,0 @@ -package org.example.matching.api.dto; - -import org.example.matching.model.Order; -import org.example.matching.model.OrderSide; - -import java.util.UUID; - -public class OrderMapper { - public static Order toDomain(OrderRequest request) { - Order order = new Order( - UUID.randomUUID().toString(), - request.getUserId(), - request.getPrice(), - (int) request.getQuantity(), - System.currentTimeMillis(), - OrderSide.valueOf(request.getSide().toUpperCase()) - ); - order.setInstrument(request.getInstrument()); - return order; - } -} \ No newline at end of file diff --git a/backend/matching-engine/src/main/java/org/example/matching/api/dto/OrderRequest.java b/backend/matching-engine/src/main/java/org/example/matching/api/dto/OrderRequest.java deleted file mode 100644 index eba85b9..0000000 --- a/backend/matching-engine/src/main/java/org/example/matching/api/dto/OrderRequest.java +++ /dev/null @@ -1,57 +0,0 @@ -package org.example.matching.api.dto; - -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.Pattern; -import jakarta.validation.constraints.Positive; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.Getter; - -@AllArgsConstructor -@NoArgsConstructor -@Data -@Getter -public class OrderRequest { - @NotBlank(message = "User ID is required") - private String userId; - - @NotBlank(message = "Instrument is required") - private String instrument; - - @Pattern(regexp = "BUY|SELL", message = "Side must be BUY or SELL") - private String side; - - @Positive(message = "Price must be greater than zero") - private long price; - - @Positive(message = "Quantity must be greater than zero") - private long quantity; - - @NotBlank(message = "Idempotency key is required") - private String idempotencyKey; // Unique string from the frontend - - public String getUserId() { - return userId; - } - - public String getInstrument() { - return instrument; - } - - public String getSide() { - return side; - } - - public long getPrice() { - return price; - } - - public long getQuantity() { - return quantity; - } - - public String getIdempotencyKey() { - return idempotencyKey; - } -} \ No newline at end of file diff --git a/backend/matching-engine/src/main/java/org/example/matching/api/dto/OrderResponse.java b/backend/matching-engine/src/main/java/org/example/matching/api/dto/OrderResponse.java deleted file mode 100644 index f9013fe..0000000 --- a/backend/matching-engine/src/main/java/org/example/matching/api/dto/OrderResponse.java +++ /dev/null @@ -1,21 +0,0 @@ -package org.example.matching.api.dto; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class OrderResponse { - private String orderId; - private String status; // "ACCEPTED", "REJECTED" - private String message; // "Insufficient funds" or "Success" - private long timestamp; - - public String getStatus() { - return status; - } -} \ No newline at end of file diff --git a/backend/matching-engine/src/main/java/org/example/matching/api/dto/PriceLevel.java b/backend/matching-engine/src/main/java/org/example/matching/api/dto/PriceLevel.java deleted file mode 100644 index 42a886a..0000000 --- a/backend/matching-engine/src/main/java/org/example/matching/api/dto/PriceLevel.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.example.matching.api.dto; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@NoArgsConstructor -@AllArgsConstructor -public class PriceLevel { - private Long price; - private Long quantity; -} diff --git a/backend/matching-engine/src/main/java/org/example/matching/api/dto/WalletResponse.java b/backend/matching-engine/src/main/java/org/example/matching/api/dto/WalletResponse.java deleted file mode 100644 index ef95c21..0000000 --- a/backend/matching-engine/src/main/java/org/example/matching/api/dto/WalletResponse.java +++ /dev/null @@ -1,20 +0,0 @@ -package org.example.matching.api.dto; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.util.Map; - -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class WalletResponse { - private String userId; - private long availableCash; - private long reservedCash; - private Map availableShares; - private Map reservedShares; -} \ No newline at end of file diff --git a/backend/matching-engine/src/main/java/org/example/matching/api/service/LiquidBotService.java b/backend/matching-engine/src/main/java/org/example/matching/api/service/LiquidBotService.java deleted file mode 100644 index 93bf0e8..0000000 --- a/backend/matching-engine/src/main/java/org/example/matching/api/service/LiquidBotService.java +++ /dev/null @@ -1,29 +0,0 @@ -package org.example.matching.api.service; - -import lombok.RequiredArgsConstructor; -import org.example.matching.api.dto.OrderRequest; -import org.springframework.stereotype.Service; - -@Service -@RequiredArgsConstructor -public class LiquidBotService { - private final OrderService orderService; - public void seedMarket(String yesTicker, String noTicker) { - // Providing liquidity for YES - placeBotOrder(yesTicker, "BUY", 45, 1000); // Bot buys from users at 45c - placeBotOrder(yesTicker, "SELL", 55, 1000); // Bot sells to users at 55c - - // Providing liquidity for NO - placeBotOrder(noTicker, "BUY", 45, 1000); // Bot buys from users at 45c - placeBotOrder(noTicker, "SELL", 55, 1000); // Bot sells to users at 55c - } - private void placeBotOrder(String ticker, String side, long price, long qty){ - OrderRequest req = new OrderRequest(); - req.setUserId("HOUSE_BOT"); - req.setInstrument(ticker); - req.setSide(side); - req.setPrice(price); - req.setQuantity(qty); - orderService.processOrder(req); - } -} \ No newline at end of file diff --git a/backend/matching-engine/src/main/java/org/example/matching/api/service/MarketDataService.java b/backend/matching-engine/src/main/java/org/example/matching/api/service/MarketDataService.java deleted file mode 100644 index 2df098b..0000000 --- a/backend/matching-engine/src/main/java/org/example/matching/api/service/MarketDataService.java +++ /dev/null @@ -1,67 +0,0 @@ -package org.example.matching.api.service; - -import org.springframework.stereotype.Service; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.CopyOnWriteArrayList; - -@Service -public class MarketDataService { - //stores last price each stock is traded at - private final Map lastPrices = new ConcurrentHashMap<>(); - - // Average V(volume)WAP = sum(price*quantity)/sum(quantity) - private final Map sumPV = new ConcurrentHashMap<>(); - private final Map sumV = new ConcurrentHashMap<>(); - // To track the "Top of Book" (Best Bid/Ask) - private final Map bestBids = new ConcurrentHashMap<>(); - private final Map bestAsks = new ConcurrentHashMap<>(); - - public void UpdateTrade(String instrument, long price , long quantity){ - lastPrices.put(instrument,(double)price); - sumPV.merge(instrument,(double)(price*quantity),Double::sum); - sumV.merge(instrument,quantity,Long::sum); - } - - public void updateBookTops(String instrument, Double bestBid, Double bestAsk) { - if (bestBid != null) bestBids.put(instrument, bestBid); - if (bestAsk != null) bestAsks.put(instrument, bestAsk); - } - - - public Map getSnapshots(String instrument){ - double ltp = lastPrices.getOrDefault(instrument,0.0); - double vwap = sumV.getOrDefault(instrument,0L)==0?0: sumPV.get(instrument)/ sumV.get(instrument); - double bid = bestBids.getOrDefault(instrument, 0.0); - double ask = bestAsks.getOrDefault(instrument, 0.0); - double mid = (bid > 0 && ask > 0) ? (bid + ask) / 2.0 : ltp; - - return Map.of( - "instrument", instrument, - "lastPrice", ltp, - "vwap", vwap, - "bid", bid, - "ask", ask, - "mid", mid, - "spread", (ask - bid) - ); - } - - // A list of the last 10 prices - private final Map> priceHistory = new ConcurrentHashMap<>(); - - public void updateTrade(String instrument, long price, long quantity) { - lastPrices.put(instrument, (double) price); - - // Track History - priceHistory.computeIfAbsent(instrument, k -> new CopyOnWriteArrayList<>()) - .add(0, (double) price); // Add to the front - - // Keep only the last 10 - List history = priceHistory.get(instrument); - if (history.size() > 10) history.remove(history.size() - 1); - - // ... (rest of your VWAP logic) - } -} \ No newline at end of file diff --git a/backend/matching-engine/src/main/java/org/example/matching/api/service/OrderService.java b/backend/matching-engine/src/main/java/org/example/matching/api/service/OrderService.java deleted file mode 100644 index 2e749f5..0000000 --- a/backend/matching-engine/src/main/java/org/example/matching/api/service/OrderService.java +++ /dev/null @@ -1,78 +0,0 @@ -package org.example.matching.api.service; - -import lombok.RequiredArgsConstructor; -import org.example.matching.Wallets.RiskManager; -import org.example.matching.Wallets.WalletService; -import org.example.matching.api.dto.OrderMapper; -import org.example.matching.api.dto.OrderRequest; -import org.example.matching.api.dto.OrderResponse; -import org.example.matching.journal.EventJournal; -import org.example.matching.matching.MatchingEngine; -import org.example.matching.model.Order; -import org.example.matching.model.Trade; -import org.example.matching.orderbook.OrderRepository; -import org.springframework.stereotype.Service; - -import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -@Service -@RequiredArgsConstructor -public class OrderService { - - private final MarketDataService marketDataService; - private final RiskManager riskManager; - private final MatchingEngine matchingEngine; - private final WalletService walletService; - private final EventJournal eventJournal; - private final OrderRepository orderRepository; - - // In-memory idempotency store: Key -> Previous Response - private final Map idempotencyStore = new ConcurrentHashMap<>(); - - public OrderResponse processOrder(OrderRequest request) { - if (idempotencyStore.containsKey(request.getIdempotencyKey())) { - return idempotencyStore.get(request.getIdempotencyKey()); - } - - Order order = OrderMapper.toDomain(request); - - if (!riskManager.checkAndReserve(order)) { - return buildResponse(order, "REJECTED", "Insufficient funds or shares"); - } - - orderRepository.save(order); - eventJournal.appendRaw("ORDER_PLACED: " + order.getId()); - - // Matching Engine execution - List trades = matchingEngine.placeOrder(order); - - for (Trade trade : trades) { - // so once trade is done manage the cash and shares of the users using their ids and stuff in walletService below - walletService.settleTrade(trade); - marketDataService.UpdateTrade(order.getInstrument(),trade.getPrice(),trade.getQuantity()); - eventJournal.appendRaw("TRADE_SETTLED: " + trade.getBuyOrderId() + " <-> " + trade.getSellOrderId()); - } - var book = matchingEngine.getOrderBookForMarketData(order.getInstrument()); - marketDataService.updateBookTops( - order.getInstrument(), - book.getBestBid(), - book.getBestAsk() - ); - - OrderResponse response = buildResponse(order, "ACCEPTED", "Success"); - idempotencyStore.put(request.getIdempotencyKey(), response); - return response; - } - - private OrderResponse buildResponse(Order order, String status, String msg) { - return OrderResponse.builder() - .orderId(order.getId()) - .status(status) - .message(msg) - .timestamp(System.currentTimeMillis()) - .build(); - } -} - diff --git a/backend/matching-engine/src/main/java/org/example/matching/app/MatchingEngineApplication.java b/backend/matching-engine/src/main/java/org/example/matching/app/MatchingEngineApplication.java deleted file mode 100644 index 4f808ee..0000000 --- a/backend/matching-engine/src/main/java/org/example/matching/app/MatchingEngineApplication.java +++ /dev/null @@ -1,4 +0,0 @@ -package org.example.matching.app; - -public class MatchingEngineApplication { -} diff --git a/backend/matching-engine/src/main/java/org/example/matching/config/MatchingEngineConfig.java b/backend/matching-engine/src/main/java/org/example/matching/config/MatchingEngineConfig.java deleted file mode 100644 index 918e00c..0000000 --- a/backend/matching-engine/src/main/java/org/example/matching/config/MatchingEngineConfig.java +++ /dev/null @@ -1,40 +0,0 @@ -package org.example.matching.config; - -import org.example.matching.Wallets.InMemoryWalletService; -import org.example.matching.Wallets.RiskManager; -import org.example.matching.Wallets.WalletService; -import org.example.matching.journal.EventJournal; -import org.example.matching.matching.MatchingEngine; -import org.example.matching.orderbook.InMemoryOrderRepository; -import org.example.matching.orderbook.OrderRepository; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -@Configuration -public class MatchingEngineConfig { - - @Bean - public EventJournal eventJournal() { - return new EventJournal(); - } - - @Bean - public OrderRepository orderRepository() { - return new InMemoryOrderRepository(); - } - - @Bean - public WalletService walletService(OrderRepository orderRepository) { - return new InMemoryWalletService(orderRepository); - } - - @Bean - public RiskManager riskManager(WalletService walletService, OrderRepository orderRepository) { - return new RiskManager(walletService, orderRepository); - } - - @Bean - public MatchingEngine matchingEngine(EventJournal eventJournal) { - return new MatchingEngine(); - } -} diff --git a/backend/matching-engine/src/main/java/org/example/matching/journal/EventJournal.java b/backend/matching-engine/src/main/java/org/example/matching/journal/EventJournal.java deleted file mode 100644 index 48d66f5..0000000 --- a/backend/matching-engine/src/main/java/org/example/matching/journal/EventJournal.java +++ /dev/null @@ -1,100 +0,0 @@ -//import lombok.AllArgsConstructor; -// -//import java.io.FileWriter; -//import java.io.IOException; -//import java.nio.file.FileAlreadyExistsException; -//import java.nio.file.Files; -//import java.nio.file.Path; -// -//@AllArgsConstructor -//public class EventJournal { -// private final Path journalDir; -// private final Path journalFile; -// -// public EventJournal() { -// try { -// journalDir = Path.of("journals"); -// Files.createDirectories(journalDir); -// -// journalFile = Path.of("engine.log"); -// try { -// Files.createFile(journalFile); -// } catch (FileAlreadyExistsException e) { -// // File already exists, that's fine -// } -// } catch (IOException e) { -//throw new RuntimeException("failed to journal"); -// } -// -// } -// public synchronized void append(String event){ -// try(FileWriter writer = new FileWriter(journalFile.toFile(),true)){ -// writer.write(event); -// writer.write(System.lineSeparator()); -// writer.flush(); -// } catch (IOException e) { -// throw new RuntimeException("Failed to write to journal", e); -// } -// } -// } -// - -package org.example.matching.journal; - -import java.io.FileWriter; -import java.io.IOException; -import java.nio.file.*; -import java.util.List; - -public class EventJournal { - - private final Path journalDir; - private final Path journalFile; - - public EventJournal() { - try { - journalDir = Path.of("journals"); - Files.createDirectories(journalDir); - journalFile = journalDir.resolve("engine.log"); - if (!Files.exists(journalFile)) { - Files.createFile(journalFile); - } - } catch (IOException e) { - throw new RuntimeException("Failed to initialize EventJournal", e); - } - } - - public synchronized void appendRaw(String eventBody) { - try (FileWriter writer = new FileWriter(journalFile.toFile(), true)) { - writer.write(eventBody); - writer.write(System.lineSeparator()); - writer.flush(); - // for production consider FileDescriptor.sync to fsync() - } catch (IOException e) { - throw new RuntimeException("Failed to write to journal", e); - } - } - - // helpers with consistent format - public void appendOrder(String id, String user, String side, long price, int qty, long ts) { - String line = String.format("ORDER %s %s %s %d %d %d", id, user, side, price, qty, ts); - appendRaw(line); - } - - public void appendTrade(String buyId, String sellId, long price, int qty, long ts) { - String line = String.format("TRADE %s %s %d %d %d", buyId, sellId, price, qty, ts); - appendRaw(line); - } - - public List readAllLines() { - try { - return Files.readAllLines(journalFile); - } catch (IOException e) { - throw new RuntimeException("Failed to read journal", e); - } - } - - public Path getJournalFile() { - return journalFile; - } -} diff --git a/backend/matching-engine/src/main/java/org/example/matching/matching/MatchingEngine.java b/backend/matching-engine/src/main/java/org/example/matching/matching/MatchingEngine.java deleted file mode 100644 index d15634f..0000000 --- a/backend/matching-engine/src/main/java/org/example/matching/matching/MatchingEngine.java +++ /dev/null @@ -1,184 +0,0 @@ -//package org.example.matching.matching; -// -//import org.example.matching.journal.EventJournal; -//import org.example.matching.model.Order; -//import org.example.matching.model.OrderBook; -//import org.example.matching.model.Trade; -// -//import java.util.List; -// -//public class MatchingEngine { -// -// private final OrderBook orderBook; -// private final EventJournal journal; -// -// public MatchingEngine() { -// this.orderBook = new OrderBook(); -// this.journal = new EventJournal(); -// -// } -// -// public List placeOrder(Order order) { -// -// journal.append("ORDER " + -// order.getId() + " " + -// order.getUserId() + " " + -// -// order.getPrice() + " " + -// order.getQuantity() -// +" "+ order.getTimestamp() + " "+ order.getSide()); -// -// List trades = orderBook.placeOrder(order); -// -// for (Trade trade : trades) { -// journal.append("TRADE " + -// trade.getBuyOrderId() + " " + -// trade.getSellOrderId() + " " + -// trade.getPrice() + " " + -// trade.getQuantity() -// +trade.getTimestamp()); -// } -// -// return trades; -// } -// -// public String dumpBook() { -// return orderBook.dumpBook(); -// } -//} - - -package org.example.matching.matching; - -import jakarta.annotation.PostConstruct; -import org.example.matching.api.dto.OrderBookResponse; -import org.example.matching.api.dto.PriceLevel; -import org.example.matching.journal.EventJournal; -import org.example.matching.model.Order; -import org.example.matching.model.OrderBook; -import org.example.matching.model.Trade; -import org.springframework.stereotype.Service; - -import java.util.Deque; -import java.util.List; -import java.util.Map; -import java.util.TreeMap; -import java.util.concurrent.ConcurrentHashMap; - - -@Service -public class MatchingEngine { - - private final Map orderBooks = new ConcurrentHashMap<>(); - private final EventJournal journal; - - public MatchingEngine() { - this.journal = new EventJournal(); - } - - @PostConstruct - public void init() { - // Pre-create books for stocks you want to test - orderBooks.put("AAPL", new OrderBook()); - orderBooks.put("TSLA", new OrderBook()); - orderBooks.put("BTC", new OrderBook()); - } - - // Helper method to get the right order book - private OrderBook getOrderBook(String instrument) { - return orderBooks.computeIfAbsent(instrument, k -> new OrderBook()); - } - // Add this inside your MatchingEngine class - public OrderBook getOrderBookForMarketData(String instrument) { - return orderBooks.getOrDefault(instrument, new OrderBook()); - } - - // live mode records to journal; record=false used during replay - public List placeOrder(Order order, boolean record) { - if (record) { - journal.appendOrder(order.getId(), order.getUserId(), order.getSide().name(), order.getPrice(), order.getQuantity(), order.getTimestamp()); - } - - OrderBook book = getOrderBook(order.getInstrument() != null ? order.getInstrument() : "DEFAULT"); - List trades = book.placeOrder(order); - - if (record) { - for (Trade t : trades) { - journal.appendTrade(t.getBuyOrderId(), t.getSellOrderId(), t.getPrice(), (int) t.getQuantity(), t.getTimestamp()); - } - } - return trades; - } - - // convenience for normal usage - public List placeOrder(Order order) { - return placeOrder(order, true); - } - - // used by replay to rebuild book without re-journaling - public void replayOrder(Order order) { - placeOrder(order, false); - } - - // replay all lines from journal (optional helper) - public void replayJournal() { - List lines = journal.readAllLines(); - for (String raw : lines) { - if (raw == null || raw.isBlank()) continue; - String[] parts = raw.split("\\s+"); - if (parts.length < 2) continue; - if ("ORDER".equals(parts[0]) && parts.length >= 7) { - // ORDER id user side price qty ts - String id = parts[1]; - String user = parts[2]; - String side = parts[3]; - long price = Long.parseLong(parts[4]); - int qty = Integer.parseInt(parts[5]); - long ts = Long.parseLong(parts[6]); - // create order via your Order constructor (check arg ordering) - Order o = new Order(id, user, price, qty, ts, org.example.matching.model.OrderSide.valueOf(side), "DEFAULT"); - replayOrder(o); - } - // ignore TRADE lines during replay - } - } - /** - * Returns a list of price levels for a specific side (bids or asks). - * It sums up the quantities of all orders at each price point. - */ - private List getPriceLevels(TreeMap> side) { - return side.entrySet().stream() - .map(entry -> { - long price = entry.getKey(); - // Sum the quantity of every Order sitting in the Deque for this price - long totalQty = entry.getValue().stream() - .mapToLong(Order::getQuantity) - .sum(); - return new PriceLevel(price, totalQty); - }) - .toList(); - } - - - /** - * Creates a full snapshot of the book. - */ - public OrderBookResponse getSnapshot(String instrument) { - OrderBook book = getOrderBook(instrument); - return OrderBookResponse.builder() - .instrument(instrument) - .bids(getPriceLevels(book.getBids())) - .asks(getPriceLevels(book.getAsks())) - .build(); - } - - public String dumpBook() { - StringBuilder sb = new StringBuilder(); - for (Map.Entry entry : orderBooks.entrySet()) { - sb.append("=== ORDER BOOK: ").append(entry.getKey()).append(" ===\n"); - sb.append(entry.getValue().dumpBook()); - sb.append("\n"); - } - return sb.toString(); - } -} diff --git a/backend/matching-engine/src/main/java/org/example/matching/model/Order.java b/backend/matching-engine/src/main/java/org/example/matching/model/Order.java deleted file mode 100644 index 69132a3..0000000 --- a/backend/matching-engine/src/main/java/org/example/matching/model/Order.java +++ /dev/null @@ -1,93 +0,0 @@ -package org.example.matching.model; - -import lombok.RequiredArgsConstructor; - -import java.time.LocalDateTime; - -@RequiredArgsConstructor -public class Order { - String id; - String userId; - long price; - int quantity; - long timestamp; - OrderSide side; - String instrument; // Added for multi-book support - - public Order(String userId, long price, int quantity, long timestamp, OrderSide side) { - this.userId = userId; - this.price = price; - this.quantity = quantity; - this.timestamp = timestamp; - this.side = side; - this.instrument = "DEFAULT"; // Default instrument - } - - public Order(String id, String userId, long price, int quantity, long timestamp, OrderSide side) { - this.id = id; - this.userId = userId; - this.price = price; - this.quantity = quantity; - this.timestamp = timestamp; - this.side = side; - this.instrument = "DEFAULT"; // Default instrument - } - - public Order(String id, String userId, long price, int quantity, long timestamp, OrderSide side, String instrument) { - this.id = id; - this.userId = userId; - this.price = price; - this.quantity = quantity; - this.timestamp = timestamp; - this.side = side; - this.instrument = instrument != null ? instrument : "DEFAULT"; - } - - public String getId() { - return id; - } - - public String getUserId() { - return userId; - } - - public long getPrice() { - return price; - } - - public int getQuantity() { - return quantity; - } - - public long getTimestamp() { - return timestamp; - } - - public OrderSide getSide() { - return side; - } - public void reduceQuantity(long delta) { - if (delta < 0) throw new IllegalArgumentException("delta must be >= 0"); - if (delta > quantity) throw new IllegalArgumentException("reduce more than remaining"); - this.quantity -= (int) delta; - } - @Override - public String toString() { - return "Order{" + - "id='" + id + '\'' + - ", userId='" + userId + '\'' + - ", price=" + price + - ", quantity=" + quantity + - ", timestamp=" + timestamp + - ", side=" + side + - '}'; - } - - public String getInstrument() { - return instrument; - } - - public void setInstrument(String instrument) { - this.instrument = instrument; - } -} diff --git a/backend/matching-engine/src/main/java/org/example/matching/model/OrderBook.java b/backend/matching-engine/src/main/java/org/example/matching/model/OrderBook.java deleted file mode 100644 index aee9ed6..0000000 --- a/backend/matching-engine/src/main/java/org/example/matching/model/OrderBook.java +++ /dev/null @@ -1,259 +0,0 @@ -//package org.example.matching.model; -////Draft -// -// -//import com.sun.source.tree.BinaryTree; -//import com.sun.source.tree.ExpressionTree; -//import com.sun.source.tree.Tree; -//import com.sun.source.tree.TreeVisitor; -// -//import java.util.*; -// -//public class OrderBook { -// -// private OrderSide orderSide; -// private Order order; -// -// -// //Balancer that balances the percentage when it comes -// Long MoneyPool; -// TreeMap buy = new TreeMap<>(); -// TreeMap sell = new TreeMap<>(); -// //or TreeMap sell = new TreeMap<>(); -////or TreeMap> sellOrders = new TreeMap<>(); -// // sell.put -// //get list of orders from db -// // -//List trades = new ArrayList<>(); -//// assume we a.add(sell) -// //orderside che a = sell and buy -// //buy list -// //sell list -// //order1 is order1dto -// public Map Match(OrderSide a , TreeMap buy , TreeMap sell , Order order1){ -// // we get order1 from post req , order1dto ig , and take here -// if (order1.side==OrderSide.BUY){ -// long price = order1.price; -// long timestamp = order1.timestamp; -// if(price>0){ -// //we need to have a list of buy and sell guys. -// // putting in order before that we need the least of sell guys to see and sort so we need binary -// Long bestask = sell.firstKey(); // the least value in tree -// if(price>sell.firstKey()){ -// if(order1.quantity==bestask.quantity){ -// //sell all -// } -// if(//less quantity -// ){ -// //only share those -// } -// trades.add(order1); -// } -// /* if (price == //lest value of tree) -// Long bestask = sell.firstKey(); -// sell.remove(bestask) -// price -// // ) -// //remove sell.remove generate a trade impact algorithm of percentage or stock // later topic -// */ -// -// //1) Binary Search Tree -// //2) get last value -// //3) compare -// -// } -// -// } -// -// -// -// } -// -// -//} -// - -package org.example.matching.model; - -import org.example.matching.journal.EventJournal; - -import java.io.IOException; -import java.util.*; - -public class OrderBook { - - private final TreeMap> ask = new TreeMap<>(); - private final TreeMap> bids = new TreeMap<>(Comparator.reverseOrder()); - private final Map orderPriceIndex = new HashMap<>(); // orderId->price - - public OrderBook() { - } - public List placeOrder(Order incoming) { - List trades = new ArrayList<>(); - - if (incoming.getSide() == OrderSide.BUY) { - matchBuy(incoming, trades); - if (incoming.getQuantity() > 0) { - addToBook(bids, incoming); - } - } else { - matchSell(incoming, trades); - for(Trade t:trades) { - // Journal matches if needed - } - if (incoming.getQuantity() > 0) { - addToBook(ask, incoming); - } - } - return trades; - } - private void matchBuy(Order buy, List trades) { - while(buy.getQuantity()>0&& !ask.isEmpty()){ - //it is first seen if ask is not empty - Map.Entry> bestAskEntry = ask.firstEntry(); - //getting the root node of treemap i.e.top value of it . - long askPrice = bestAskEntry.getKey(); - // the long will be price do .key() is askprice of that node - - if(askPrice> buy.getPrice()){ - System.out.println("your order will fullfill once it matches the appropriate seller "); - break; - } - Deque queue = bestAskEntry.getValue(); - // it will be a single oblject and not queue, why is it in queue jere as the first node is object - //getting the first node - Order sell = queue.peekFirst(); - if(sell==null){ - ask.remove(askPrice); - continue; - } - long tradeQty = Math.min(buy.getQuantity(),sell.getQuantity()); - long tradePrice = sell.getPrice(); - long ts = System.currentTimeMillis(); - trades.add(new Trade(buy.getId(),sell.getId(),tradePrice,tradeQty,ts)); - - buy.reduceQuantity(tradeQty); - sell.reduceQuantity(tradeQty); - - if(sell.getQuantity()==0){ - queue.removeFirst(); - orderPriceIndex.remove(sell.getId()); - if(queue.isEmpty()) ask.remove(askPrice); - else{ - //paritally filled resting order remains - } - } - } - } - private void matchSell(Order sell, List trades) { - while (sell.getQuantity() > 0 && !bids.isEmpty()) { - Map.Entry> bestBidEntry = bids.firstEntry(); // because bids is reverseOrder - long bidPrice = bestBidEntry.getKey(); - // price crossing condition: best bid >= sell price - if (bidPrice < sell.getPrice()) break; - - Deque queue = bestBidEntry.getValue(); - Order buy = queue.peekFirst(); - if (buy == null) { - bids.remove(bidPrice); - continue; - } - - int tradedQty = Math.min(sell.getQuantity(), buy.getQuantity()); - long tradePrice = buy.getPrice(); // resting buy price (maker) - long ts = System.currentTimeMillis(); - trades.add(new Trade(buy.getId(), sell.getId(), tradePrice, tradedQty, ts)); - // a.createlogs(sell,new Trade(buy.getId(), sell.getId(), tradePrice, tradedQty, ts)); - sell.reduceQuantity(tradedQty); - buy.reduceQuantity(tradedQty); - - if (buy.getQuantity() == 0) { - queue.removeFirst(); - orderPriceIndex.remove(buy.getId()); - if (queue.isEmpty()) bids.remove(bidPrice); - } else { - // partial fill; buy stays - } - - // Handle sell order completion when quantity reaches 0 - if (sell.getQuantity() == 0) { - // Sell order is fully filled, remove from asks if it was added - // Note: incoming sell order isn't in the book yet, so no removal needed - } - } - } - // Inside your OrderBook.java model - public Double getBestBid() { - return bids.isEmpty() ? 0.0 : bids.lastKey().doubleValue(); - } - - public Double getBestAsk() { - return ask.isEmpty() ? 0.0 : ask.firstKey().doubleValue(); - } - private void addToBook(TreeMap> bookside, Order order){ - // treemap bookside and order order - - Deque q = bookside.computeIfAbsent(order.getPrice(),k->new ArrayDeque<>()); - q.addLast(order); - orderPriceIndex.put(order.getId(), order.getPrice());} - - public boolean cancel(String orderId) { - Long price = orderPriceIndex.get(orderId); - if (price == null) return false; - // try both sides (only one will contain it) - Deque q = ask.get(price); - if (q != null && removeFromQueue(q, orderId)) { - if (q.isEmpty()) ask.remove(price); - orderPriceIndex.remove(orderId); - return true; - } - q = bids.get(price); - if (q != null && removeFromQueue(q, orderId)) { - if (q.isEmpty()) bids.remove(price); - orderPriceIndex.remove(orderId); - return true; - } - return false; - } - - private boolean removeFromQueue(Deque q, String orderId) { - // linear scan; for higher performance maintain node references - Iterator it = q.iterator(); - while (it.hasNext()) { - Order o = it.next(); - if (o.getId().equals(orderId)) { - it.remove(); - return true; - } - } - return false; - } - public Optional bestAsk() { - return ask.isEmpty() ? Optional.empty() : Optional.of(ask.firstKey()); - } - public Optional bestBid() { - return bids.isEmpty() ? Optional.empty() : Optional.of(bids.firstKey()); - } - - // Add getters for MatchingEngine access - public TreeMap> getAsks() { - return ask; - } - - public TreeMap> getBids() { - return bids; - } - - public String dumpBook() { - StringBuilder sb = new StringBuilder(); - sb.append("ASKS:\n"); - for (Map.Entry> e : ask.entrySet()) { - sb.append(e.getKey()).append(" -> ").append(e.getValue()).append("\n"); - } - sb.append("BIDS:\n"); - for (Map.Entry> e : bids.entrySet()) { - sb.append(e.getKey()).append(" -> ").append(e.getValue()).append("\n"); - } - return sb.toString(); - } -} diff --git a/backend/matching-engine/src/main/java/org/example/matching/model/OrderSide.java b/backend/matching-engine/src/main/java/org/example/matching/model/OrderSide.java deleted file mode 100644 index 2c98b1c..0000000 --- a/backend/matching-engine/src/main/java/org/example/matching/model/OrderSide.java +++ /dev/null @@ -1,8 +0,0 @@ -package org.example.matching.model; - -public enum OrderSide { -BUY, - SELL - - -} diff --git a/backend/matching-engine/src/main/java/org/example/matching/model/Reservation.java b/backend/matching-engine/src/main/java/org/example/matching/model/Reservation.java deleted file mode 100644 index b93b588..0000000 --- a/backend/matching-engine/src/main/java/org/example/matching/model/Reservation.java +++ /dev/null @@ -1,97 +0,0 @@ -package org.example.matching.model; - -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.Setter; - -@Getter @Setter @AllArgsConstructor -public class Reservation { - private final String OrderId; - private final String userId; - private final long priceatReserve; - private int remainingQty; - private String instrument; // Add instrument field - - private long reservedCash; - private long reservedShares; - private final Boolean isBuy; - - public Reservation(String orderId, String userId, long priceatReserve, int remainingQty, Boolean isBuy) { - OrderId = orderId; - this.userId = userId; - this.priceatReserve = priceatReserve; - this.remainingQty = remainingQty; - this.isBuy = isBuy; - this.instrument = "MARKET"; // Default instrument - } - - public Reservation(String orderId, String userId, long priceatReserve, int remainingQty, Boolean isBuy, String instrument) { - OrderId = orderId; - this.userId = userId; - this.priceatReserve = priceatReserve; - this.remainingQty = remainingQty; - this.isBuy = isBuy; - this.instrument = instrument != null ? instrument : "MARKET"; - } - - public long reduceBy(int qty) { - if (qty <= 0 || remainingQty <= 0) { - return 0; - } - - // Don't consume more than what is left in this specific reservation - int consumed = Math.min(qty, remainingQty); - long cashUsed =0; - if (isBuy) { - // Calculate how much cash was 'used' for this portion of the trade - cashUsed = (long) consumed * priceatReserve; - - // Subtract the used cash from the total reserved cash - this.reservedCash -= cashUsed; - - if (this.reservedCash < 0) this.reservedCash = 0; - } else { - // For a sell order, we just reduce the count of shares held - this.reservedShares -= consumed; - - if (this.reservedShares < 0) this.reservedShares = 0; - } - - // Finally, reduce the quantity so we know how much of the order is left to fill - this.remainingQty -= consumed; - return cashUsed; - } - - // Additional getters needed by the codebase - public String getOrderId() { - return OrderId; - } - - public String getUserId() { - return userId; - } - - public Boolean getIsBuy() { - return isBuy; - } - - public long getReservedCash() { - return reservedCash; - } - - public long getReservedShares() { - return reservedShares; - } - - public int getRemainingQty() { - return remainingQty; - } - - public void setReservedCash(long reservedCash) { - this.reservedCash = reservedCash; - } - - public void setReservedShares(long reservedShares) { - this.reservedShares = reservedShares; - } -} \ No newline at end of file diff --git a/backend/matching-engine/src/main/java/org/example/matching/model/Trade.java b/backend/matching-engine/src/main/java/org/example/matching/model/Trade.java deleted file mode 100644 index fde50a9..0000000 --- a/backend/matching-engine/src/main/java/org/example/matching/model/Trade.java +++ /dev/null @@ -1,40 +0,0 @@ -package org.example.matching.model; - -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -import lombok.ToString; - -@Getter -@Setter -@AllArgsConstructor -@NoArgsConstructor -@ToString -public class Trade { - private String buyOrderId; - private String sellOrderId; - private long price; - private long quantity; - private long timestamp; - - public String getBuyOrderId() { - return buyOrderId; - } - - public String getSellOrderId() { - return sellOrderId; - } - - public long getPrice() { - return price; - } - - public long getQuantity() { - return quantity; - } - - public long getTimestamp() { - return timestamp; - } -} \ No newline at end of file diff --git a/backend/matching-engine/src/main/java/org/example/matching/model/Wallet.java b/backend/matching-engine/src/main/java/org/example/matching/model/Wallet.java deleted file mode 100644 index 48c7dba..0000000 --- a/backend/matching-engine/src/main/java/org/example/matching/model/Wallet.java +++ /dev/null @@ -1,134 +0,0 @@ -package org.example.matching.model; - -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.atomic.AtomicLong; - -public class Wallet { - private final String UserID; - private final AtomicLong availablecash = new AtomicLong(0); - private final AtomicLong reservedcash = new AtomicLong(0); - - // Fixed: Standardized on AtomicLong for all maps - private final ConcurrentHashMap availableShares = new ConcurrentHashMap<>(); - private final ConcurrentHashMap reservedShares = new ConcurrentHashMap<>(); - - public Wallet(String userID) { - this.UserID = userID; - } - - public String getUserId() { - return UserID; - } - - public long getAvailableCash() { - return availablecash.get(); - } - - public long getReservedCash() { - return reservedcash.get(); - } - - public void addAvailableCash(long amount) { - availablecash.addAndGet(amount); - } - - public boolean tryReserveCash(long amount) { - while (true) { - long avail = availablecash.get(); - //if avail less than the amount needed - if (avail < amount) return false; - if (availablecash.compareAndSet(avail, avail - amount)) { - reservedcash.addAndGet(amount); - return true; - //else avail = avail - amount and reserve cash .add amount - } - } - } - - public void releaseReserveCash(long amount) { - //in release reserve cash we just subtract the amount from the reservedcash and add it back to the available cash. - reservedcash.addAndGet(-amount); - availablecash.addAndGet(amount); - } - -//remove the money from the reserves - public void debitReservedCash(long amount) { - reservedcash.addAndGet(-amount); - - } - - // Fixed: Returns along to match AtomicLong, and handles the Map lookup safely - public long getAvailableShares(String instrument) { - AtomicLong val = availableShares.get(instrument); - return (val == null) ? 0L : val.get(); - } - - public long getReservedShares(String instrument) { - AtomicLong val = reservedShares.get(instrument); - return (val == null) ? 0L : val.get(); - } - - // Methods to get all shares for API responses - public ConcurrentHashMap getAvailableShares() { - return availableShares; - } - - public ConcurrentHashMap getReservedShares() { - return reservedShares; - } - - // get the quantity of the shares the available - //get the qty of reserved of shares - //pass the shares and the qty to reserve it - public boolean tryReserveShares(String instrument, long qty) { - // Fixed: Use AtomicLong and handle initialization correctly - // atomiclong does not hold it instead it points to a memory address - AtomicLong avail = availableShares.computeIfAbsent(instrument, k -> new AtomicLong(0)); - AtomicLong reserved = reservedShares.computeIfAbsent(instrument, k -> new AtomicLong(0)); -// - // currently is the - while (true) { - long currentAvail = avail.get(); - if (currentAvail < qty) return false; -//if avail >qty - // avail and subtract from avail - if (avail.compareAndSet(currentAvail, currentAvail - qty)) { - reserved.addAndGet(qty); - return true; - } - } - } - // see if the instrument exists - //if not create it - // -//atomiclong avail = availableshares.computeifabsent(instrument , - //atomiclong resrved = resrvedshares.computeIfabsent(instrument,k-> new AtomicLong(0); - public void releaseReservedShares(String instrument, long qty) { - // Fixed: Use AtomicLong here to match the class fields - AtomicLong reserved = reservedShares.get(instrument); - AtomicLong avail = availableShares.get(instrument); - - if (reserved != null) { - reserved.addAndGet(-qty); - } - - if (avail != null) { - avail.addAndGet(qty); - } - } - - public void debitReservedShares(String instrument, long qty) { - // Fixed: Changed from AtomicInteger to AtomicLong - AtomicLong reserved = reservedShares.get(instrument); - if (reserved != null) { - reserved.addAndGet(-qty); - } - } - - //add so available shares . add the shares and in if not create and add - public void addAvailableShares(String instrument, long qty) { - // Fixed: Used AtomicLong in the lambda - availableShares.computeIfAbsent(instrument, k -> new AtomicLong(0)) - .addAndGet(qty); - } -} \ No newline at end of file diff --git a/backend/matching-engine/src/main/java/org/example/matching/orderbook/InMemoryOrderRepository.java b/backend/matching-engine/src/main/java/org/example/matching/orderbook/InMemoryOrderRepository.java deleted file mode 100644 index 6ddee65..0000000 --- a/backend/matching-engine/src/main/java/org/example/matching/orderbook/InMemoryOrderRepository.java +++ /dev/null @@ -1,24 +0,0 @@ -package org.example.matching.orderbook; - -import org.example.matching.model.Order; -import org.springframework.stereotype.Repository; - -import java.util.HashMap; -import java.util.Map; -import java.util.Optional; -import java.util.concurrent.ConcurrentHashMap; - -@Repository -public class InMemoryOrderRepository implements OrderRepository { - private final Map map = new ConcurrentHashMap<>(); - - @Override - public void save(Order order){ - map.put(order.getId(),order); - } - @Override - public Optional findById(String OrderId){ - return Optional.ofNullable(map.get(OrderId)); - } - -} diff --git a/backend/matching-engine/src/main/java/org/example/matching/orderbook/OrderOrchestrator.java b/backend/matching-engine/src/main/java/org/example/matching/orderbook/OrderOrchestrator.java deleted file mode 100644 index ced672e..0000000 --- a/backend/matching-engine/src/main/java/org/example/matching/orderbook/OrderOrchestrator.java +++ /dev/null @@ -1,114 +0,0 @@ -package org.example.matching.orderbook;//package org.example.matching.orderbook; -// -//import org.example.matching.journal.EventJournal; -//import org.example.matching.matching.MatchingEngine; -//import org.example.matching.model.Order; -//import org.example.matching.model.Trade; -// - -import org.example.matching.Wallets.InMemoryWalletService; -import org.example.matching.Wallets.RiskManager; -import org.example.matching.Wallets.WalletService; -import org.example.matching.journal.EventJournal; -import org.example.matching.matching.MatchingEngine; -import org.example.matching.model.Order; -import org.example.matching.model.Trade; -import org.example.matching.model.Wallet; -import org.example.matching.orderbook.OrderRepository; -import org.example.matching.validation.OrderValidator; - -import java.util.List; - -public class OrderOrchestrator { - - private final MatchingEngine matchingEngine; - private final EventJournal eventJournal; - private final OrderValidator orderValidator; - private final RiskManager riskManager; - private final OrderRepository orderRepository; - private final WalletService walletService; - - // Constructor for basic functionality - public OrderOrchestrator(MatchingEngine matchingEngine, - EventJournal eventJournal, OrderValidator orderValidator) { - this.matchingEngine = matchingEngine; - this.eventJournal = eventJournal; - this.orderValidator = orderValidator; - this.riskManager = null; - this.orderRepository = null; - this.walletService = null; - } - - // Full constructor with wallet and risk management - public OrderOrchestrator(MatchingEngine matchingEngine, - EventJournal eventJournal, - RiskManager riskManager, - OrderRepository orderRepository, - WalletService walletService) { - this.matchingEngine = matchingEngine; - this.eventJournal = eventJournal; - this.riskManager = riskManager; - this.orderRepository = orderRepository; - this.walletService = walletService; - this.orderValidator = new OrderValidator(); // Default validator - } - - public void submitOrder(Order order) { - if (!orderValidator.validate(order)) { - eventJournal.appendRaw("REJECT " + order.getId() + " INVALID_ORDER"); - return; - } - - // Use risk manager and wallet service if available - if (riskManager != null && walletService != null) { - // Check and reserve funds/shares - if (!riskManager.checkAndReserve(order)) { - eventJournal.appendRaw("REJECT " + order.getId() + " INSUFFICIENT_FUNDS"); - return; - } - - // Save order to repository - orderRepository.save(order); - } - - // 1️⃣ Journal the incoming order - eventJournal.appendRaw(formatOrder(order)); - - // 2️⃣ Send to matching engine - List trades = matchingEngine.placeOrder(order); - - // 3️⃣ Settle trades and journal results - if (walletService != null) { - for (Trade trade : trades) { - walletService.settleTrade(trade); - eventJournal.appendRaw(formatTrade(trade)); - } - } else { - // Just journal trades if no wallet service - for (Trade trade : trades) { - eventJournal.appendRaw(formatTrade(trade)); - } - } - } - - private String formatOrder(Order order) { - return String.format( - "ORDER %s %s %s %d %d", - order.getId(), - order.getUserId(), - order.getSide(), - order.getPrice(), - order.getQuantity() - ); - } - - private String formatTrade(Trade trade) { - return String.format( - "TRADE %s %s %d %d", - trade.getBuyOrderId(), - trade.getSellOrderId(), - trade.getPrice(), - trade.getQuantity() - ); - } -} \ No newline at end of file diff --git a/backend/matching-engine/src/main/java/org/example/matching/orderbook/OrderRepository.java b/backend/matching-engine/src/main/java/org/example/matching/orderbook/OrderRepository.java deleted file mode 100644 index 94c86f2..0000000 --- a/backend/matching-engine/src/main/java/org/example/matching/orderbook/OrderRepository.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.example.matching.orderbook; - - -import lombok.AllArgsConstructor; -import org.example.matching.model.Order; -import org.springframework.stereotype.Repository; - -import java.util.Optional; - -//@Repository -public interface OrderRepository { - void save(Order order); - Optional findById(String orderId); -} diff --git a/backend/matching-engine/src/main/java/org/example/matching/util/IdGenerator.java b/backend/matching-engine/src/main/java/org/example/matching/util/IdGenerator.java deleted file mode 100644 index 5363524..0000000 --- a/backend/matching-engine/src/main/java/org/example/matching/util/IdGenerator.java +++ /dev/null @@ -1,10 +0,0 @@ -package org.example.matching.util; - -import java.util.UUID; - -public class IdGenerator { - - public static String newId() { - return UUID.randomUUID().toString(); - } -} diff --git a/backend/matching-engine/src/main/java/org/example/matching/validation/OrderValidator.java b/backend/matching-engine/src/main/java/org/example/matching/validation/OrderValidator.java deleted file mode 100644 index 4780b53..0000000 --- a/backend/matching-engine/src/main/java/org/example/matching/validation/OrderValidator.java +++ /dev/null @@ -1,34 +0,0 @@ -package org.example.matching.validation; - -import org.example.matching.model.Order; - -public class OrderValidator { - public boolean validate(Order order) { - - if (order == null) { - return false; - } - - if (order.getId() == null || order.getId().isBlank()) { - return false; - } - - if (order.getUserId() == null || order.getUserId().isBlank()) { - return false; - } - - if (order.getSide() == null) { - return false; - } - - if (order.getPrice() <= 0) { - return false; - } - - if (order.getQuantity() <= 0) { - return false; - } - - return true; - } -} \ No newline at end of file diff --git a/backend/matching-engine/src/main/resources/application.properties b/backend/matching-engine/src/main/resources/application.properties deleted file mode 100644 index b2860ce..0000000 --- a/backend/matching-engine/src/main/resources/application.properties +++ /dev/null @@ -1,12 +0,0 @@ -# Server Configuration -server.port=8080 - -# Application Configuration -spring.application.name=matching-engine - -# Logging Configuration -logging.level.org.example.matching=DEBUG -logging.level.org.springframework.web=INFO - -# Jackson Configuration (for JSON serialization) -spring.jackson.serialization.indent-output=true diff --git a/backend/matching-engine/target/classes/application.properties b/backend/matching-engine/target/classes/application.properties deleted file mode 100644 index b2860ce..0000000 --- a/backend/matching-engine/target/classes/application.properties +++ /dev/null @@ -1,12 +0,0 @@ -# Server Configuration -server.port=8080 - -# Application Configuration -spring.application.name=matching-engine - -# Logging Configuration -logging.level.org.example.matching=DEBUG -logging.level.org.springframework.web=INFO - -# Jackson Configuration (for JSON serialization) -spring.jackson.serialization.indent-output=true diff --git a/backend/matching-engine/target/classes/org/example/Main.class b/backend/matching-engine/target/classes/org/example/Main.class deleted file mode 100644 index 0f8def70b0d7394e73e6dfd9009250fcd08b77f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5934 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 diff --git a/backend/matching-engine/target/classes/org/example/matching/Replay.class b/backend/matching-engine/target/classes/org/example/matching/Replay.class deleted file mode 100644 index ca9e67da7b03825bb797a80ddf17e0d00eab4692..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3251 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 diff --git a/backend/matching-engine/target/classes/org/example/matching/Wallets/RiskManager.class b/backend/matching-engine/target/classes/org/example/matching/Wallets/RiskManager.class deleted file mode 100644 index 54bd4dd3b450fb358a529b2fe733e07a8d1ef778..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1091 zcma)4+iuf95IyVMNa8kWpf|2rG4li5Dag zf(Jf;k3!7aDQYDb@iOC?opa92cz*r<@e{xkY**kQS3=%J0Y!%TF+bs6z@w3OI5-x* zVJJS9ku*;ka?Mu1jB6;DP;pU(%g|JMa|HP&o^XiV3U35`HouQ`mQ0ShRs#qGO&lnzMQzdl+r6%6tWkjcn z2CkQI!^JXI7~22e3CU{_(+px?>4cVHyP2&Ys-Xx{?M~|*L;g7>h@dMY@p2XpgnrEj z0c9Fp<@2D=wY2d(nKxq@Q*YVa87uBEyuYH8^Xkh>&1SxOYpp)r$AK_oHGIW24}}q$ zI;{C);ZOFWVJ}?_Lm}Z{*veM8xEF@Xk(y~=>`S|e`h}BuXit%0y*G=D3`JkYlD4xK zMapm^RYcP1xbale)qSuXohm)?V(LpMb2b&;`Tby%4#=U4cj(X4<H+!ThJxJ8kryiEv8`Idan zViL+7OSzjtxlEKRM7c_oYYF8>3Y$|}QQLXaUDCUQJ49P{C~Y6D>RqBpRiBZ!16SK$ tP}=#9B?q4vl`8Jh3rn~Qi~wdSL-8aOluE_;0B>tDG%1@zcDKdf=D{D}j}kYV zU_gUjcG+*g$L!30e7?N{z&RW_P(wIL#lodm7Qb+EW2XEtN*3-T^XjaC1O6XE2;|B!Ch%N(!wj`xE-3b=Ze{~p=(OW9#_k2M? zr0(@|ypZWTaxR=8w7hgBe40jFH>97##XwK9X4(h{b^Rj%96etPY<+h0$wJtGY~)R7 zl~CJ2o6sqtEdzC-S3u1gY-@eLfOiVGQ#bJL_toI1VrUe5uwQy-MhFLbt-;|JP#>>l diff --git a/backend/matching-engine/target/classes/org/example/matching/api/advice/ApiExceptionHandler.class b/backend/matching-engine/target/classes/org/example/matching/api/advice/ApiExceptionHandler.class deleted file mode 100644 index a5456f42c3afbe5ba92cff984f4991967815a0f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3503 zcmcgu>vq#d5dPM=C~-t$!lh6s1PBlVMYNPcaY&muNfYV>nxv+bURc{3TSS(Gv!AL+`k0n{tAoYb;;Z(8sVp6bhti8FSokEO0jq4P99bK-aKO z#~_9n#vQM2_^xN#^;M5I#S_O{GoFZwQ8DeBu^?o_sZDzIpeby*=*Tj+%-YP;s&J+0 z*yKrF$SIN}^(Em47I|`IEMH19x~^2YQZw2#3Io`WVGRd#9K<1pOM6jf7$gs7O<~n$ zJkRlbhGD{QgHdn-fbvf&f*kKYdE806lWRErv==Q(lv-um+-}mEls(> zkgf3Al6V{lpZvf63Z7FmN2i?H##CThwJ?zL7}Jo~aRC<@u6Br?w879_A&U&R;!qQ% zNHlh6vCxmVaan_*;|ktkIP*%qIU-|Oav4y1`-*oKXG`JJ(%Za{T+BPHiiC$(2WE8=KI6*PPjmz#LXo315{CYRL)g=TQqG@ ztO{e&HMd!r<95vw9+jKQ1jA6tw8di3tO##~S1j5YE;&_hmAPlCb-dXv8zxoCwJ^nd z#3EjDjSw~*b>X~XFw@JW(>d9B4H0}sJY|?jEzgeesM19|4u^J3IfldSoNc&Uyj^P- z9ZzI6F2UV96N<3tn7GT;0V0JO!u`u;-KK{1C`Uj4U*yFOhesY2Y={1<2#ziVG-8{g zZ2BhE(WGrV)Sh%yQ7AWGp9;P$YwWCBGTcKA84w2tqMDite5zpI56>!wQnHm&=fa*U z=Tss+>DCx%@Uu>0N>aS@KO@N3>&ExA z@U)377rA9En^I5;^m*GBUeV&dFQ|J55?3D$-_xaG7ei^mYIw$Q;`O35WFuzif^nNJ z=<3rAs!{aPcZpU8y&1iGE<6YOm40NfK;P_FgTaN^A2X|@3@F|wah*Ey0?)>yV z_Xo85&(Xhd@poi5k)s>(OB@C^@n!}uFmh=V=Q8+(B)dZEgQ3AW=%y@*ch9+EW(9ST)ou|Zq O+uM)t@B@Ct(SHF}s2ocG diff --git a/backend/matching-engine/target/classes/org/example/matching/api/controller/MarketController.class b/backend/matching-engine/target/classes/org/example/matching/api/controller/MarketController.class deleted file mode 100644 index ee75bf80830f923d71fcc63cb0e90d28813ce9ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2248 zcmbtV+j0{}5IrMbgyfB73j={b00Xfs8!sUaxyU$xYghgxPWQ|||NiwifctoyK?+l8OgostEW@VK z4OjfaJAPZZ9d2q(=`~#LOSh&xqgA^tw7buBOPF$OV3_Z_?s^UB35Jcmk%9Vd6e0>8 z`IoXdgG?G(2Xk;3)=zVoVXh%e#p8a^REA-vu=j!=bGOY2dBtcdptL#~j;*V1l>1EA zg?^+|>re!~@&ZAC=8;Qd!NDT(3@a8;;M-U~Yu*vBly13AV|=%NV%Ia${K}A0Er$C^ z2+yi7M9uUdOc0}FC0TNC4(AybJ0aIQ-0+If$FfG;ZjLV|hskxI0oNOX^r03{FClxb#+ZVmUd3g4Zj#0wkn2i!|0RndnjIZMUYTv-KDBfLsMc$iaond4KzNTLa_wY^VNac{@cRzsz z_#P#)r5PEv=!5RE7*Uyy*qk{+be0fZc#kUskY>ppSPtQwk6dFoxgMMoAht(<_+c2t z3La2AOUpj3mX=)c58NoOy#p(*zr)!#WQur+KrALW$t6Ho#x2NP$a%y`CPfr2kYRyB VJPZRp3PI&*Uncj6nH}r`{{b;Hf&~Bo diff --git a/backend/matching-engine/target/classes/org/example/matching/api/controller/OrderController.class b/backend/matching-engine/target/classes/org/example/matching/api/controller/OrderController.class deleted file mode 100644 index 49b34838ff8e3235935bbb9c3b025fb2d929c4c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3858 zcmcInS##4?6#lMBqAUWtF3^T81Oj9O(Xti;EeQ!*OwuGx3v|1-l|)3Agd_)2petSf zLH`AvDJk&K>2s$)snhAFC0@YJIGyQ(e07iSIp;g;J^J&X=f49uho3r-z$OJPDq7Jd zaLjfWH2t0|I;O4_rJr9ktOZRvhL*Q2-?dFsceP2kpu3~xy?|;5lo{P!HuAcFHqlUu z7oCYj#0;5Ew4*~or;0A90*5!mP3?|r=XK8uVF}#mZ>+xH+mY&N{Z2{u{LDa8XFbQZ zJe@eVAgLgw;uWL?1{>n6QWLQXbS&upj4%C?C$P1DVB)r1mYON)+!^1ck2CGqD$qVX zc6DrYcI;v&w&OJgudC?B4uRB*#|7GGfix*?TYr_X$=q!{PqS`zVi$HR*rTEcdj$>! zSUo4uH1Eoye%E%Fv_;={v}rwpIA-~Vzar3?lZDtj0;hpaw9osW} z+oh_b^|K*7m$U7qwcJ_bpq(0yDtJT1n>Z$Lq;5tuWM{nR4XZG+a-|^9Uu|Zb6LFf9 ze8bcx9pA7mX=c(a+!HEJ;*>zEbR3hwd)6{4JUU;p^1)$kJbs}U-ohCL85L)7P9Pno zQ;k@GO-1Q2R56SOg6bj)eEhbGcW{9gS++lJmn>RzW&_D{S(nTkuaZBbxTs)E#W*er zoNP7+YsJt%xga40hMI>G`s#{`tGLD@v)wV%V@o?&9i6ozd%5m9k;QcdlPae0ZcW)n zJd}9Wunhk^-Q7Ph$7*v-nb+gaHMjB3)kINcSV^OHfkq@J3`@UWD&}-|R_07n(i3)G znsd@Mf_+SE@fQvDl@s-gVg0*+$`m*1t@L_h2~{03YQ)SOH||6N!%Z>9U0Gl=8*6?k zE1lSYR95#F?ZT7{I-Sq7V*8yj7A$sOmqtJOU)+3lBbd+APueclDf>W5dv7`K&f&dp<39f-6K|cdg9X6{lA24yNpqbbYBUOVcQX>a@Aw zmCXBUnal3`kI3RnB)AqRyq))7oaQwRz1-=VEOClT7_8`YRq@3#1Y~uUZd7uE02Wy~ z?7qQ(lL^9hJdATQp}C}2MW&SwFEROAwfjclAzND0Vy2|OxK^RmpIaw;>rPko^RnTk zlnL9?j9qf``nVA^iLIgWm3i+-aC-=xZrTEl7=DGFHf)47Y!8(T?+S;}5IyT8HDcSo z=eyF0O5RK1TCxp?Qus_D+rU%R5p8XUbH3JH4slAOAd?#?=C70E+UcnCnd)7b7t2A;I zdO6c&ITR(34nAV|mJS9yuA3k*jTzErxqA?N>TvBF{1swo6-st^6`Rwqu43EI*!&bb zho7N0fycv7ap-Z#{T_eQXyI=+I7hw=i5S+0SvlY_ruVsPjQ#NhA~ z4E{n=1SqgOaBjtw$ufv!7{=iLWEjXq2&W@Ka*Bi$BXTDcQ~{ue{ijcxz{ diff --git a/backend/matching-engine/target/classes/org/example/matching/api/controller/WalletController.class b/backend/matching-engine/target/classes/org/example/matching/api/controller/WalletController.class deleted file mode 100644 index 92d4fffb7bca474094b9e146a05797c05e73ad04..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5380 zcmcIo`Fj)B6+O?}V0ml{6QIT=F~I>ZI71Rb2*$L=fdDb!BFE6CZ9105_TbTsGBYw! zQ@W@7zHjNirEAh8icQ-z-P<(X_x6A3*YjpZ(#R4Ze@%ao^ybaG_ny0*_nw~n&*f(T zjN{+!XhO4s78R{%6WHgt3!3qup3PZ?meu|AqG>N^dd}3+j_tdSWf`t^PUnw5S)LH+ zyckTS40qW~8v=W#>govvy+}c{daMH*(5@h%q64bHaO0u^?F)t)Lp|P@WG)F zK;Abk8LxESbq(9s7^!G@T=y1F={cIb4x1HhQLz;-64({szNVPK2C8!lDZ>}oSY?e< zjN>-+DR{Ap?YN#fsVEHu+C1Mi^sGQ%m1H<8P!EP0U7^01e@yNiWtev#)xQtY*?=T7i=c9}Tp4TdlMYHy0 zJl1PXFcc%$qhM6U&Cmq4)}RU96;RS4EP=goEHw%vYe8w9nY%zo#uVIA6=ZrOE9o{B z`(znyWQm+LJa&YU2`i+Bt;RUrfddNeRB;ev0wZ;cP4-*HccKENmYidIY%66hZ(13{ z6*$VAtV47l?2(eDBcU3W;W!Q}c!`RaVnSfzf7U3_mZ!@nG6Lrs@5cJ>UJ-K_CRN;p zqXNlz8&0yf1eynjPD;1#R&g9Bm>@Dj*rwt8V}mDOn8}4g~2(FdsWOzlU*e&p+yPvyo#6O6>P|$umrUA zl@$xX4 zZ~JnqT2f(wG}@JRjf@#+2}^5B+#M2(+<#6E&2E6h4I={3pUS7xhUd-aEotEa6|Mx| zNed@zvQ9orhL=`+6?rVP#4A=xg)&&jPVLSYSbk7odnnc)0WdN#2v#A1*Ww`suTyae zucx(uC}S+ghCXE4rhho-tl18{5pPoPW)*M2TLm^%c$Eb^z~s8j?FKqCt6O;zR&{90 z#QC->ZF#!yWX-fT5&TR!_Cf*=;~gsADbvtQy$QS6}$vvY1?$|CWS%vu_4@4WvXnhs+37Mi>s=X}a zN}k?UZRJoc@Ysw@)!1RGOP(_PMJF?@OS13{c{FHGnG3e==Uv9ss#E9OXXB)U6lmf$R1W@Dzbh67uJON7AY>Yfehn}}=G?-fX-oV=Sh zj+v6|Hiu>_H^7^v5rG2@hnnYs*aebC*CQJ2;gu#+gZpX7ifq;75y$blmFl^WUA!co z;eHe6lJZ%j5}RnMyB*KUP434kej<0cHpciKqmabU1ct61;fSQW+whA7Py4@AQN$BT zJi&?QtTp_Z)%|sJqtoygwD7utl~lodh93w zO+f%;Ljkw&Uz=M4rz9X5kdjkd@hHAQ)e)da`7#9b%`%{Gl>vRb0_ZzjDDd4fpcH{g z&3!RIxe%1sik^#gKpntl+!+JaR|eI$9#D_11$7CJ6ABBF8EgtbC5E3yVR+;zh{rh_ z21b@Fkc`<+lyjr4`9!LUIzPq}qd25eN^j;thhu`*0C&U%|U%*~OLb43w*p zp(pVa?Ik4Hty9nTT0Knv(}A^>AWiaLlT|)nrslAAzK6gkMPrI^mF_w i8vUB1KXcVKt{CTEE`LEgS$!}5+SZQ0;UD-HdjAWT`8(wR diff --git a/backend/matching-engine/target/classes/org/example/matching/api/dto/DepositRequest.class b/backend/matching-engine/target/classes/org/example/matching/api/dto/DepositRequest.class deleted file mode 100644 index 050c9684b9645709bef8b3258bec89bfa9c73e03..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2719 zcmb7G+j84f6kW%bEXR=>*KN|8UXnlxj-Axy-o{CwO;hUNq^0Qv+F=IO(bR5i%a!B| zec*`~K7a?{1L#Ycff*WR`oO?Tnc*UdjC2Xmy%qsb#pedZT@>WON#(4c97NG&`2laIcvUx~Ag_B)X1i zS2hH))%(VlQED1gUUzNUl%?aOjv=I|XSA$tn+9Sk@raHL z4hke|Mtk`|*Juii<|B@;+`Vts-178oseDMsVT=k4-80?uf%kZRdPSZc(Qybu_$WrIjkdYgZQV8P>&D$Cab>Gk&1l{~go;~l5Xo%ye-yt=dL7g4 z(YvcqK^D^ll36v~y0vlDu#J}Knl{5ovtGrN{EE~{Q`D!FZDQ?isi5)#s^!*ATVPls zp6YdM}!DNTzK%-6q>ro9Z>L7J46^ zin>XvY>km8T0QEZ&{oWmqhyoW&Mzguza7{LzUTL>Yd#PzS zj_GJ1p{MrcGzhAOj|EQtw<@de=f%q&<9Gn#Tsa%Li^*x`tsGxmbqG0V_mmKsyN)d+wjVQN@h3}y%kBh$}_8rvtu=>D-^SMXIyR@w{(<3~@(c$bL7&Yj+jyy`KR%~YWqdA?Q>9Mg z8M2R%&Z)UXPf2;q$ni*xeWEY>h(e;baE=AycMt~3Y?>IKi)U%bB^37d;)G5Rd^*=B`FeW zv>l^8(d%W|)nx__J(fMT`B|h$w%HC9B->Xq<#}a6a(dx-rd*%QOnfo<En)8{{M8CqJOIKXiUUVehp_4!rs^xJ&|MO+ID%D%a5hjlJt% znBaviYkaD>&Nq4cZ{QX_LGB+9g8H-o diff --git a/backend/matching-engine/target/classes/org/example/matching/api/dto/OrderBookResponse$OrderBookResponseBuilder.class b/backend/matching-engine/target/classes/org/example/matching/api/dto/OrderBookResponse$OrderBookResponseBuilder.class deleted file mode 100644 index b7f8866d3f61442959e88bb44dde8b3d800629b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2330 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 diff --git a/backend/matching-engine/target/classes/org/example/matching/api/dto/OrderMapper.class b/backend/matching-engine/target/classes/org/example/matching/api/dto/OrderMapper.class deleted file mode 100644 index 1b97ccc3372c4e194222971bef5d3dc3803215e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1364 zcmb7E>rN9v6#k~PEVK(P<>Cb|fQY>)t9a+;1w>nmMN3KiIkY1z*-M?BCGrBs$I(B9 zXyOC-P{uPYBqcTxce67&x9^)W6VZbyofI)`A z7HFt!$EsEfs|<0;y}IwVg>)ucI_kOgz*S3=lH~FHkaci9Mb6v59#skR|A} zFpPF7L(k|EL#As_r{-XtYgQSeD>S(b$&&4fH=(;N0jd8CAP> zz>w?SS(gM?{eE?C}++Pcs!vC|Nb)sZpf2)&i@BAL(JDlm0_xTRL2lelGM6T zyMBFxOYRCKBry=L_@S(cHCt1aYMuKwqqF)nV-kyWwdf}TN`_uqmr1f{XSBz1hhX1Y z<|njjGth^pw3=-PJi~L6`musl0@1;r>0;2Jb3b6bKSF;K$y^h|^qr^g(w8G#rG2`I z8%MZ#h`Cap#QRM=%73M(2y~_yLImMNk)YQ^k}j!X4AS+H#5huP9Mg2ThFg`4wX@*` Z)+i=JQ7`d|sw0D zx+-tAr0ocbw`^%GRRoQ$+|+mUVoe8h-LW7s$7&NAC0S?6XxNU`s>_DM>>-UbX2)!! zBAIbOqhZPjQks@gmV(4Gb4N8g$lS!Omfmm-XP23WHOjK=0f^R{rXw5W-B;yqijGoF zrSE8TjE)P+bj-Q3c~h3z*7HWga9$J?ot)Z8LDNZ%PEj7}%X(uGOVk7%o(%cn3C>Nu z$>66ndYZ-o-jdFmXC(A2^VDgLp5dt>Ougn?%KRyf3N$S!3I26IPKPF^LM!-@V%yJX z^eh__M`-n$&GO&X=zA=mhWt_xKc0C`qwn*KikWr9fq6gB=p6G#7~L0|7c?r-9L%rk zc6Gt5AjU9%X_PBKqZjFif{xVnZMk4J%DVHq;Q)js5q4Y9jc`<2Fxp7Hl2CY-8Q^a z>(aLMEjV|O1D;=cC2!by3n4Wui7GwOz0S4WX7^gzPMEs|IRH;IVoi4(X*FO&+>%@J zb`znVzy8Jt>x(NZf{t>M^7WSOR2@I zRP{#weQBA3o@&?MlR(Ep<&oc(yWOtFyy_TUF&gr6tG+3%YdUhmTih(`wGG`ecd(6U0Pj)150l4+N~Nl%W=OG zC&$r`+~$h_1?CQohwW0vJu`;KVOppsBan{i1sn#in=Pv>FB)7+BjID@S?<+vc-}M} z-qlSnopyqLDrh~7ob;l1LCoYk>+^`$=dWut6K$hiXqQnJ#ME${a9+GmKU3)gZhm(J zjd#uqqp@Rd%c5tu*AFl1WyiF31$_~&Tp#FJdr5CpYSJEGG0p8(bFRPfg*aV;+=K?e z-wNT|2T_RSt60!$wROYc=AbP#8q!**>9#Fxm3|>;qR*#6rmFO@pp#FAq8>cIXbdOK zQ5+g^d~sXA`z4HqNYKl8=51P_SHMVT2 z@Kp+bBJq0=5xRnR++{vZYoIj`K(EnNj0B(dc=rmcy~5876vl;MfN-i;czU2Pt~P;i z1e9lX`b!XDvx@_Tarqe_Jkl%t+(2R6Spwlszz+4AeQu!eF8T>nZM1TrCN@209mqcm{$Qh-BRIWLOrD;5%xc*D$=-E^VOK*J;D|x`b~8 zYsFoUd!^H^bk;)zUa?v172BxbbaL%^eXvS(zbbiq2P)ZRK|da>GPPfo9OpnKM^Mlk z^k(3A)J;OXa0;p2uS!l>pwb(>HCW}yepPZx1C`$3?ZJ-s72UU`hf63>>6Ht98F-G1 zd#Jb}WbW(f!tY3lJ(&JGMedOjeK7quimc8Q9?}VS2x4po&#!;WlNe24G!cv@FJm}a zikLSd zJWnHP;@@;YrARvc4P{k2ivNW8#{Gg!ehb;&QSYE6V*Ja}uhkb|GH+6abH$#9J8HNH zl)zI3{;{Y29(~s>GW>o63(Zda3(j#7+{?_Jk6qwY&mYgsRmU>8WH^rG2@#7STO`C|q$AA1)MFHp+5vTNJxm{(=z@08{d`{_ z*(=bI88`(o#K8*A!b|Xx51x}q@F&cqZ_ieMIMpdJjpjn7muX$so$MTXGJy W@MW#H@$AsgF-n2@kUl~TbN>Z=mVTlD diff --git a/backend/matching-engine/target/classes/org/example/matching/api/dto/OrderResponse$OrderResponseBuilder.class b/backend/matching-engine/target/classes/org/example/matching/api/dto/OrderResponse$OrderResponseBuilder.class deleted file mode 100644 index 9e8af789bc6ab9de48c38a44a26fd98096ec5f83..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1996 zcmb_ddruQV5dUo{Tw4!Y%i9N31#Jsb-w(<|!4SX-Mi68CYiT!daJ_BrwnV;(A43xe z2_}93Ka_E{cPZ31q#Dxf&Ft*VZ)av_roVol`~)zAxfnv|Fc3D;i7tl3F5l-ln>*XN zwXI!IR196ymSd?|hK_V*Gl~eJ24W^I!DN_|?siUm;pK`ga%HZHI~G~;ij^xVnOk#9 z!hJ8iigY|N+OV6iS~eXr7*Z=Oml%?T)4SJ|OF(&j+hr4ReN~sIxT<&e7}$z|L56JmPR1~Rt2!0e7^c$A4z(j$$!sPmw>L}-V}xO# z%=g5Cbc$SkwA2o9>FQ&cO#cfS zg&I-PuS|wsvTdqYhS<8Sx<#>Q)iU2u@{?MfFjlENm!wCXm6(@OdCKJ#KU6P*2MlYC zRt>wLZPG#0%&>`+-xit+xS%jA8WDbIaM6dm`tD<(KIq zFDmICFnm4xvVo%S=@NHJw(v#^QtnkN`Q}WVku(@?98^RL_0MPY{kfAro8ACof!p@F zr3Af%x$HQ?U9h?52`Y@O48!pGsx*T9aB-97O^8}NOkWy<#D(;X zs!uA)v||K6Mp`N2^F;Nf zMt1y&KHrFKHt+XU0&{)8_K)EXX?JS01a0E2F}vHw)Unnv<2B4=Ys^I3m^yED%w!F- z4|ge?6uF*92mN&HBS+|I8&khQ9kZ{7nMQ_08grhK!-x+4z`&>MAz>e)n^uBW&oPEt zC)j_V!TS4TF&^N(q=(jc{eNSf;5u*~T7Q5R#st}ia1WC;IzR;jDm8|OwC>|M?UHmJ Qp+Bh?R4-GQ#w>>Z0HI*i9smFU diff --git a/backend/matching-engine/target/classes/org/example/matching/api/dto/OrderResponse.class b/backend/matching-engine/target/classes/org/example/matching/api/dto/OrderResponse.class deleted file mode 100644 index 434c332504461831e6a5d06fd37d21f2247d2751..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3436 zcmbVP{cjUx9RED+UGLi6SQ%{4fox#WuHC32zR)qi%>f(hKsJZGsNC9fJ=XPRdm~~( zVq#+a1N=edcliYqO&lbc82tqk|0WSX&)u!PZq+Oj?(X}1-=6Qw=lMR}pMO936~H)F z;)o!sK{22rCXjXN%X#Zlb9Jq1kWb4+1utFGha2SJMY$MGNwTnIJ0wa={DaJ>vok}C7>Z;pbG{!J7w2w_q0GXGrTCH z-esUihO9Xt7Ya5;W_8i5+j1Q+6}MtDj*;1&gJz7~U-F?MFv()? z+_WR!=r7R-^{)*LK~07i*|VbMR-E!>vu>_hu2pB)aoYI}@_httAzmm5;YG>JNDsnk zKQ#f=1XRbZSaq7oYNP{b3v_$z*1F3Rvv=P4Gkj@t=?Q})(6nu>8E0vwXs!i?S1(_g zE>1C~X+p1VHP)*xb4Z7di{9E;OK^AFKEv*bGUy8_>Y^9~gKpe~rTa@A_2XB}r{eQj*} z2?}xA3>WUMSsm1Gg!DHjREQP0m^7=^dE2!JX=A!pv+9#ov(d0vw7qTR2_~(EWr3sH zQtgz123z3Jf2$Hme!3ir5l$vR;g{o@R7Bo1-j}1=`*J+<+XG%dIKuavT;=%{{HocX zA%67K-r_svG56pkX~S1Q0b^Xnafh7?Wkkhw=adNA1Pe)^3BTeH7DL=_QKahxof=qTaK8-Wfk`*fOE7Oc+a~tUXX^XY) zS@-)IL5XDfWDf++Qd<>VB)NFIvrDm4m$IErm#XJ-qO;57PF+f5G+p+3E+_F$Gw~>* zUgCor*t1iY5@b!6eV$9+zrIUxp7@N@<^5dtd#K98-0z5d2Q~UI_ZuR`k?bSv^OhtI zjPUvTTPfsfaE{Btf-?FCx>Cwh?0x`aG^ISki<|nHf=ZQ4A(m35PV6aqAD}y>reYzb zTtTB!uArwhsiX%=T1wwkQXVqAXb2vDgKzp_HyeB(Q#i*w`|u^s^ISx595ybHCv8iZ zCZ*s#zGwKTxIrjfBo)JFJQ1^`G<=Q&D3a1K$2~{Tt?7SZmxf69GxTdn^S>^hVZTqt z!{jEgrdVG^{B2c%7o# z$+1()xa`Zs!Q@!waB}G0;V-_rB{_oyRkCE=^MiGP^#WF78GGkO>;ayS@$ou39!58K4$0FvLl*(2d#{#Js*ZaJ7 zXkM}JA@&?Os4TV+3JVM&p0ko61_jUA-dIzmrPa<06t%EoOLrTa>I{1kn}h8v!<4hB zUsjS&hEI;qfhUX|TPL00Lw_Ro2gTrR?ak=+asC)@Y(27xj+3qnR|E7^Svz@C3}k8S zO}p&K21Isr1IcW^(qRa6c^*$N1zI&BH4scc$&*7%B62|f!9f3#k|RR#0JmH5W}_Tt ta{9<|q2PTgMQ{z*`BhjOji-lq45<(K+(enHUTU!5Y{wshbY{n2m zSc9TNMMU6+?d;~wZ;ky%&CKr`Zl!9~ck@QW%I~;#e$%lkX30D>YXWLRZUj=Lr^ca? zuNkx}+4bF`^cd99Y1>#W8|Q8b)=DNzbVc6yKRZ#FUYm(&c3xY3VXSm!Gw9jo^xo z3B1WrRijy5ws)9Rcs8>>OoFcIn8bB~@qJ^@T(;{K!~Mc?X;g2zOspxe(4B#YsTX56 z=q=YFpG66KO2;&22yoG=Tkc&i<`V(M2aqgTb#vojf7^5(8{0KP8ZOxtqxQsbEV&Pq zid(e^B2#+JvK5(SvrXv81?(9jNR>^uYVT|sjO#IEo8 zno%qZT2L3eg)i{1=3{8{P-We25%egwaGPZb@m9Q#cc=?Xub+U7I}9lcqDmGd z(*LTM+D57ppF|o|?6yZQzc{FpP4FjOs9X!F;-a$TkvNemR!Lzrl{|D1|r%x7dP`uqlkANJ;U?c?ji<3Wekd zK|&zJ8I3x7s?SKg+A?U_DCbo)W4uNFTJSTKG3B5Q$|Pk%&v6y#9U8yw{fQe4(DTy6 zOyH$6uD{@|-Ug5Mow#ZCgFkU)u3kC6Ts-qF9^ diff --git a/backend/matching-engine/target/classes/org/example/matching/api/dto/WalletResponse$WalletResponseBuilder.class b/backend/matching-engine/target/classes/org/example/matching/api/dto/WalletResponse$WalletResponseBuilder.class deleted file mode 100644 index 01386259ae73383b3e99256bbbebe67e3724309b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2661 zcmb_eZBH9V5PlW|XWUEd0C5P=gtR2JA<4B((>D{^;M4`zkg7(Ys-G5ngD;%#th+Tz z{z-pED-oqirT&2asH(HKXLGhsk&*atw>z^l&%EC3{rlg$e*iqeUIr6L8JILNg=vP| zOMc2Nhr7qt^P`udAsMDOY}b~X45>o#UMb?FmQNtwH9B8wcu74pn> z_>m*ZJZLensydxDF{e&VUl7cxXsSbXaNR^6HyE;gwR($_5OK7fuCyI%mv=%VH%%-m z>8m{$Eo@+!Vf_L@X0U`?Dwnqz9v4Ofs#b@L50S-#4DR3~10S1M#od8|=$tSZr`+j^ z=PwxU#VzQ1m5QTAXQ|Ymm?)sgaHGvnMA>s2Tprr8MY}+9S5jJPaj+==J$J)~hh`hAW!D!Bj|QXM7=?&&Y91ASv&1l2_L`)et=X>F>$Z=CzptvV8pUgH=YadR zq9f*{Y}ph=xpskSCATD*K1|3(@lud;yF#|S=Fi;cZ6SqEE>{ZG%fa4{yzY1Q<-q0# z)BU>BOZlrIdt=r0a(tRPQsaZcDqIMUN}HBm??aj=<&lxYkg0oJzac8N>b1GSsr69F z6Ud$jkc+72io(!bVJG!z#8s9U>A+j_Zd4e9x>8GeuVdnBmC+2(H35y5KB z^G>>*(rCV7oB_ps>XQWV-(vC!6Dxu!)6G%0rJ#D5JFYAIvcrQw4e#rTnKV#kxH}SS zQV0fW47c7dN|%z3mu7LAE=bTopHMd*?IzT16s~mdgezS$U|0+H>vT>RNsLYtpRQKo z+^3yID^r}cw_tyUDi7$bjzI<<(%aMmB>E{)jJTf>s8TM`s+=*_*5AeTA>d zri!hC8QKBMe`D#_wKFR18I|G;*XWt2XW=bAOfI$#YPsJl-{9K_vr2_mm@A||fcIC( zTA<|}?g8(^U5Rifsq<8;ZO{*+T9>d%Ynt$%((@gDBx;uUX*$`aSa$Fe)$8W}cuI)n diff --git a/backend/matching-engine/target/classes/org/example/matching/api/dto/WalletResponse.class b/backend/matching-engine/target/classes/org/example/matching/api/dto/WalletResponse.class deleted file mode 100644 index be44d0cfea16314acb188e37b4aa6fe7dfb47941..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4498 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 diff --git a/backend/matching-engine/target/classes/org/example/matching/app/MatchingEngineApplication.class b/backend/matching-engine/target/classes/org/example/matching/app/MatchingEngineApplication.class deleted file mode 100644 index 366dc503ca20e561d17943d127c63572d89e1202..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 350 zcmb7=O-ckY5QSg$&$PCqGk5^Oow_g}?)(7}UA4MUW}l9sCqp_3ZAQG7E5U^a@K9o9 zn5_#Fc$M!}QAz6i=kp7|1*SDJJfV72IFRCB}iG6ZqAh8x!zr>{b=M#*TrBNW&ESraA=C+?ShtA{7qT6T6D zucV#H!6aUrMVy-#!fEsWtIi1ZqhAh6-}ZF-DDCg2Fjxk b&^sF$YSxqna%{1VSLc%BHWOioHN)f=jO14l diff --git a/backend/matching-engine/target/classes/org/example/matching/config/MatchingEngineConfig.class b/backend/matching-engine/target/classes/org/example/matching/config/MatchingEngineConfig.class deleted file mode 100644 index 6dbc2de9e43932491eef0a2ab2e978a468bc2215..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2066 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 diff --git a/backend/matching-engine/target/classes/org/example/matching/model/Order.class b/backend/matching-engine/target/classes/org/example/matching/model/Order.class deleted file mode 100644 index f95401f7e92c54f1dd93a26655de14fce6f95560..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3369 zcmb_f+fy4=9R5y7vPl|fNehME2*@?W2Cb$lh1$|mLPMd2QfupFNsh237u;+*t&We* z_y_dC2S*=$(HV7Q>eLy1^T9vL`kk|331qc6JBB#FSj^nsuk2+Ra)*M<^)ZREw;G{sXW)-PpIR7HQmdQ66!D#{G z%GKFRxAQAXOI1uJG%YK~nm%Zj7O197~h$N{TpU`SwK7f7yDlIv#alD)3EuRbcs zEyt=>A{ZfJhQTqD<$BFYuF2%|RB|GQL5!(brv$o2TO%^I8bMm%ge{Bpf=rgHwoE!3 zW+iFMvdKJD)?+w}jDd+bUcsw-66OY#h#s1yx?KE-acH*S=5una)o6mH@LC+NBP(#c zY;MY#YNcR0cPwXvHwL-l)C3lql{FIBs%t(s-%9kcDKPD$Pe~srbz`ec_6+Mx;Belm z$Q$+YnzUEUwGt_be6?VfR!!Sd?+s$m*|3OW;D!1p8Po;oY*dR&rfrs`BW=np`FPt3 z^gsE(_W!DE^+pA$ec3S!n+xWa4ugTq0)q#MFdK4RI;wAvjryi9%CB!XT06q~lH0x< z67vFwNVw^BE@?S|IB6?8P0K3ftLj35Q5raiOH53M+ZVg4gQN2bWk`1#$Awef>4J9Z z&v|XkK-BiW$Cj&gyC7#RRWUI=tj?;wX7(>vs}B3$+;YpH7Qr2X8O`#kRh$|TBk80& z)!e(DTvH;Q+!qUTpunj^m7geIHwFg9LD^FT0#2c{?I2k zhCaC<^vRW=PtJ6n9blc{Jhi;Rw{Or!jlf9iDMV^~8%8R*jrLSma2uVe?$9>6QoY7D zdQyo~+c@(hSp#^Jp95N~6G0>p<&x^4(PQZ1{^{oOIF4cT;4Sh^BdpY85*K)?n{rp^ zn{rrz8Bt4)n$%4>9nv@Dw!z&DbcHAc?njUjWC6`UCTef&vch;bh$WCdtW$3E==O6xo*Kxqw40ZOY~ zPLI@0K~sRz8k!15S}kdYPeJPqQ(UFcAKpb5o`_Oej6B(c!Rw9wfkFF|C2#(izTrK(ijutOqpf0nK_qvmVfF11SAw5aYD? zHZe>g@Ej9}80z;de}f`u;1Vwoq&;U|{k{vh{5ooR|!z%1M68vjO|WBzj5W;ZQRuUCx|SR{|o6%|C_ z$WdJwAwjY#fF&=7*ICA@0Qyw{@G7qi!J8PT{X89ps<>`O=DI49|GLt#JJxCJM6&@>qZhgV3TB4<6M>V-fHJK l-yPO&wHrP@wPBem0$9Oqo+?uB@L9$Ce2ek+0ZbIo`!~G!im(6x diff --git a/backend/matching-engine/target/classes/org/example/matching/model/OrderBook.class b/backend/matching-engine/target/classes/org/example/matching/model/OrderBook.class deleted file mode 100644 index bf855d24074c2b132d884541fb203120b15fb5ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8420 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 diff --git a/backend/matching-engine/target/classes/org/example/matching/model/OrderSide.class b/backend/matching-engine/target/classes/org/example/matching/model/OrderSide.class deleted file mode 100644 index a9a98a8498a57cb00a60e7a7d60c9d7881a215e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1163 zcma)4?@!ZE6g{s$=vK=%<^-Ae1DLXcGEhj2LjsbSm{ey{Swj5u*q&QS*P7B1Kl&#r zBtkSAKKn-*@9U<{pvjuFxA(ns&b{xv`~An~ZvY-+-GIVS3Zr&KyyM-szNmD0-0XNk zyV4C?!mre$mWW)hCDLHfEa(_xP@nAXG2C%R;Z-FuWg#tznp<-mxp2vXg>eR>)Yx`* zYc9jW>(S&)WRWv4Zeap>2EFNrfnX?_xk>UXvS3&1za&OX<-Ui88UwW zwV>Cf>POt~iTWFc_3{vV$LEKK)u9D9j>wVfa0Mxl=oc+q!wkdNh8KA8Cd1^g)PVWS zZls`_bns#dX&GlN%wb*{ko0iKV3+L?Eudn*NZJnF5<}MU0`a2P-51d-zVFk@qknW^ zkLEB#-U*xBZ}7;IVgp4j;9U~VU-X3`_guuCu=SEhgo#B&$I;@BN5L!!a;ntlj`x!= zYIyFHF zD!E^v=~uU=HWn#cqF1LOcrT$eP*4-GRf;NY8H-CZr?kx#b3CaE7Skg_mCVW4!TN@p(^@ZAce%oMdv&o^#%h=Xsy=Zhrs!mtO&#$K42g z7|`L5B7mTV*sk@!N|&wbPI_&7*Umc{g6B%rl5;`BKx%#~j1a;)B2f$?sv%jc@1*Uo ztjhheovv6;zF4AVrB<-Z=?%MK*B@9;saDmXuhk27JzLN)va%Oq)2Z|PqBuPe#X<2H zY|<)Qkfq@$Mlh=3!2NnDZ(B~=p{+s7$@X{@6L>>Iv~E`{rdZv%;e5@_tZc@kcoS0^ z0;R@MldGdWQI~49vTaotLpa2Es~0z}UAieYvr)`R3XxK^;nbTIyXr)67)Nv*jp7)R z%w#Y1Rm&-ol1ho-0;z0vJ{v&_^E!+uPT-`5;k~n+fJ}9}9eT?uH;IFU-j%?oqDTu+ zA`!~$!m`yU%Ent!WE2D4jm@IPsfKf@9y}cu_pju#J!@Um^IIDH%dC)wgDa(~eZ5)P zw(B>o?J`$JR%&^xyk*r(^4wYUJH--XrdIx2u@_nGTDRJ=*n~J6k=CI`_6v?a zX$)%QeO4o{ml}DSIF3kf;1~n%F5c$((|me_0q7i)#!t|U6D{b*$rgr;L<=!vJkY|J z5f8R7X^c#_F!KXX`tS~a4>J?cuODLwV;lz(_LoID%v71u=ST`P!!yH}Rk+H*@r@;RAfw;pY#MDzxrS zJwn8IjY+0RIv4=-^x`6G^hi{$h}&SRw|A#CUBA>Sx}rBZ1t!4xkNtK ziR4ovFH$rj9fP%C#xB#lxJYqmw7-cZ&V2N;fn_Bf;W7gMp!OHeX#Pn>O+cf8(C`u6 zYf9~Dj-tH))7GDH(iU@2EiS95ZE*%VQ8irlG#=_VzT#|jjwqcoBhU{p2jO!btCT)Huj`1@@-G!>safE?g9lMw>oIdQa5|OL;igM zpHPtZl!poR9CQmEls^VcK<++^nC8Hi>+RO;cl#OLe*Ox#(gaPGJozev}q1yT_Z0&Q&mfq90U++@- zlIwD=^QO4naruO`l=n*J^(}VBn9!wXOsIYkALP5k8__+sS$cD;o>A{Lxt$rek!IXR znsFOxMzv3Aq#30Xd3$B}8SVI!_r{>oP9nrfjLu?o6QhF|O=C2Q@pz2=SYCx6)7*zU F{{V7>@&Nz< diff --git a/backend/matching-engine/target/classes/org/example/matching/model/Trade.class b/backend/matching-engine/target/classes/org/example/matching/model/Trade.class deleted file mode 100644 index ce71b937b3d4a8fec14459fb4374c35c23afed3b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2300 zcma)7-E!Mh5dMxGTec!QY1+6=fYb?TvDHxX|K}z^971EPcu9P$EH z&p&I(AFcktk&V8ky63ig*64dZ=`@agt0x8Y)8XZz-;@49PhhF@+;>sdgvAzE!Kw2F?z5 z4OH2oOb$m^vGc1918-uJqNG>PqVVaMHov-W;4OYNPp`g>b6|blfXRA;^vB~gmWcQ* z18?J@!0oZ(AXS(^=TR?}{`QxXxFYf;4n7CN>opAP${(m%FN z9nvgyysqV(Sia5sSUIQ8Z8~zJ^MA!}5|hEJOfILySwErbJdx_$>pio4t1p%G3BOFP z6Pyy0q==cEtF_sS`XwQdXro<1n}C^eR5~SuR8U^jkJPY7-q7#LeVYl;!!CZvy+c9n zdY%fDZw;bog93I1_Ck}|Rhw^%t?EQ0^ET{XUW{9o*GZ>ti~2$ydpf?tzJ{;4*pCG^ zuNu~NUw9WXzA;h#_pPq-{7ZqKC)11#qwpSEZqJdyX2P(LUJ1?kT*lfJ9rc) z{u8BLq{OS{pSTs4$lMx1GuMd*vyvO3Y*w@pW)7PV3%5g@l5bMDYFs$hG2dMHDu0zj za;tQ9i7Z&hL1|%umvdo(xgty<|HeVCVBGrSOGiOYr){J*;C6E9_D~=gVAcF1eAY;= t({qoW+DkkDrf*_t0&z9YEsGt($l!B)L6Q+$^n8f}+Uc}vql2ed`4@HonS=lU diff --git a/backend/matching-engine/target/classes/org/example/matching/model/Wallet.class b/backend/matching-engine/target/classes/org/example/matching/model/Wallet.class deleted file mode 100644 index 41fecd14a5302a94ae950bbcd688b97cd4d6fac1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4473 zcmb_f-)|dL7XHSu<6qOnbyIKLgeEDW%`Y%C*==b`AayBCNYZZIrnGdIo!FCP8rx&W z<3RbjOUo-yydd%37mz@rsZ=DiPppJ^N4)Tdpt8H)z4OE4*zHDI)YfzFoqNvt&Ue0Z z@AQX%Kll#73%H#?2whQxRYcIOAazsQ)^cU7x{n^zwm7~T$3FB#(W@eb{R&1* zYa^$>tyOAeJy+4};-YED2mi88VR>V4>qE7@; zExoQ=+j>d(h$8c-4Dx<5=ecoNt0iy{UBXjV#UTtR==I?gHZ^*EB%n4|63`PW4huIu z9w5hyh%l^T1V_mB6+&G&t03)UDoatYEmAWp2pv`N6ppeO8-gB|WKpb+sTjwEg1A;H z%~wmWh+@@MN=HGy zL*PKA+ue0UrC>TuIZu;^g0WH6?1rT)C8qw3aa_N8e219l?T&<**b$in+ zUDPbCqT9Mf4{_>4N~xrv&#O&POzd@TnfKZ&FWak^OPAbcaaK}7QLUT0wTjsgRZ|uz zW!t*tS~vzmcGrb2gb_tou(jeAd&$e%(#yJ5*IR7%m-IDbSKxFIo!4z0NhXSfQLWon zqawxBwXHGm{y-|8`GiNr?z5{+3}knG&zt{G<)oSvdO$NB#3X4|-P2Zx?!l`m`cx?YdsLj_N@andQhDE^_~@Z-1gSaZ1GeYlUOIrssQ7Iz~@Y4PD8 zpS;)QleaRcJ&r^Cnn{c6H84NGaRhUG_ab-P;aK=PIdLD##J7lEi{D559@M}%&GEr& z_wk2&=x+`OCnoP<=xZ6}CH@}fl?(JDj2IEcF$fjMi1s*VCx~pGZ!=CToI##5M#Wj? zpx|YWBMK+r)!Z@>;fT(1g3mgQ!cEFTut!ZL-dA! zMSm;IKl=<^Hk!~chdKr?Bu(E%P!Yje2OHp^xZ$XgWNw6U7q?EqVc|9We~<1w)<~&i)=43V6-sA=r!kyL)j# z#%k?F=lr=Q6Y1n+aJQ4?$2z%=*IgvPQ2jA7v?43=fQ^nF{E1~b73Rv|o;vyow;O3@!b)1yi+Rwvrl%4ihjv})7X>|RDQ5K(noo>oV z5yV4u0U8S-yurZEner7Oicm8$QAdn2YfqV{nDF;VX2Zj>-LjGIk#Lg~9pNPCoYZBi zu)_brnHWNi2SA;TZnFosWpXp}fSK`An(*rDS_D znxD-3gd)h9&AwGy97#fBRoWlsi zoEOwg@t!-rElh{YO5GwUFQ|&3?0I|Un!7F>FF4p#Gh4#<8kVFXi96h97%8@;Nui)4 zg|vqA21YT)Fx8XpcvWGW5s{&D2dc+H9oI3f;f8^mm|;k_)7tc<<+sEuT=*@1Yeo8wjy$0VWy_rmJ zL}z;0617dlWSBlXoDR{tkae&6iU-^gQUsLgz>eisUmU2;>oTWRqn7F2<}hec>D8k2 z$+|KWJ8k|CY2oaol?D2?7X}sa(o!unc}nSKRr4`SY=y4098t0w7TNOLbv?;dFVbG~ zkzB)9M`}lv;GGxjnGGt0@Z^Cn%=Wo1P-hR(4MazQp0v6n=$oOdDTXZK^iQ`Ey>m3P z6pevo?hq{Z9opMN41R|GF^bO9Tis=VfdqzeC;DUbPU0?R>C0f^9z`hDDzQ{-GWQ93 z{tJ@%BaFxK=3iEd@<~Um@n(FBrKtDufS3=7(#L3^1RmirftA1tg)4znByfbu7=9x4 q6;mH*G6t2c+7~d^K~EjiQ<%e(Hhqo)n?;$Y#ZM!|GZb2o1>g_)7>3gT diff --git a/backend/matching-engine/target/classes/org/example/matching/orderbook/OrderOrchestrator.class b/backend/matching-engine/target/classes/org/example/matching/orderbook/OrderOrchestrator.class deleted file mode 100644 index 31340e1d36aa8080e8c8ef5c79d393bc9dd4846f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4555 zcmcgvYf~H78Ga5(tPl&fiNPg~9b$|lB#ekn+}d)SVlIsc7aIXCPHT6O*03P7s6_;w(h-g8*JmW9e>J)&UB`k>G#g`XLNdd&e@faV6pwFGt!>3=e*}V z&w1X3-fXFim{x}n(<}BNiSGjX%{kPVa~Rf;uEqrQAjVCMW zzp@f4xAmkG8V=A(zDC-XkuV-Zt$cLqIE2RqLY^o$?~M5GzHDdAtjlbo>wFkph-!%G z=*D4zcHjLgmIwsrO(&TV*d6H_-EiZSQ=m^Kn(6Lw9ldx$V9&C#WDeN5wBekyoCWrZ zj*)YU0*4}7SNbRm<0$$xJgMUt-YL-Ki_OpN1nP}^-ppktjmrWpe!ID`KXe+#S$e6T+RY*@Z8k$7-hij^ZVml9PGev@J8tVm0)e8j`k+Q5_7H}2 z4C6hFgG+XSK|CQ-fWWZ_G5S{W!$@L8!?QX@F-E`jC1aaZArQ`IjkM_@=zDMkD~^?o zk6J}1(SQk@(QsDBBvQ;2%CE}PbZg5oy~Ng9ayvDh^v0=S8Z#Qs>3A<@1)4WBltcuy z1*14_USYCjjy*3|Jg4J*ct6?Cso`pub~7{M^5VVYVya+d%mx^k(~#DY0qq#|Ww7K< zRe?_v7EQ;=no7_8;#LVIx|9pd>sWwQb^&kwyKXjg^!lV4&FlCe=ye)LQ&xuOj?g;3N3TdBQZgZxIyzRcO6zj@nS#og zG|WgCS8!Fshje@xA1OJ5x+_QR+&p(MCiCBrBDAN_3;LG zBT?YEPr`Ywf^pBWDtGbHX9!;+sHw^R!J%pkT)A34bd=@E_{#E} zS(q~BvK(n1wbMp+#wb|w-5U%z3l?vVBmO(t+m}KK+G@;n7VOL!qhKtXOc>PjkN-Cp zrO>aqNw#5a(^)D?4ga&3G*=}R#c)G$Wp3FjT@67;<|%;#{%YI+b<+bcd4=LW!phOe zZ=KRiR(HBiUQXPcYppis)qKgIeVb%Y-XGQ}>T66nMw)eB-t&uaie+co9JZwAv?@fE zg>a7yZ~{AR+m5V_^R6otL-;ktCx=Fc2Bz9YdvbiHe>6FGQKi2Sek-uIVlFj3Je(Xz z4vkM;9G)H@Ozo({jWB+P-)ne7);enf2R9Olm0Pu!%(xrTZuv88q}}TBrOM3U3A%`$ zF>;x#Sv)w(dVVFJsK^#xYN!~gS~x{YeZ=pRZ#)$PtXEUKTS=^*%;n6&K-MT0&7y|e zyok1($q%ZAI|BRfElL-0&&5hL#4jPB4$bn@hP`I_jiFk8B&e3Dgbk2d+(cY|Uz_zs^3xH$+Rz+OE% z(1e5hGU?=Yhp-Qib2NgNDG_y52`V(ex7U6U2Lj8yrO&`uM%^Byk>7 zcu%=ol<~&Ocw>rOi8m&{ng~YrB(ajbnEYxXsqzdh!SWgQ@O3Z$kMb|@0}Qxl5wCE0 zkYjI0-@vZeO&oj~yV-4IH*yC(z)c*v!GV^y(934uTj-K+oPJl81nduPp(g6h(xgB#u+@zqH!E1&LYct z^%_!m5mO{;8b4w6c^9+z3(n)Ol#<@mN7Am5`&aQp?s6B6UXMhUE%r8kgx5&6NsT|I zmKyw&EA{fob&mXuBYP2gq^thlIG|xd!}LGVQ}Zv>sa}UNV^C0&^mmEW4VCBV9nu4i zHZO+$h??12X|L35fK4_v8)RdrX6x7#Z{u=mRZoX;Bk0>5P2#NO*9{8#Gv Q8#*%(=KC$I<4v^v4{}`LhX4Qo diff --git a/backend/matching-engine/target/classes/org/example/matching/orderbook/OrderRepository.class b/backend/matching-engine/target/classes/org/example/matching/orderbook/OrderRepository.class deleted file mode 100644 index 8a4a058f5b317bd5088f096e739820f72c58d9a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 417 zcma)&O-{ow5QU#Z)6nwQ1y?{yH_ZV8ELb2Rr7CJ9_HHtyE=e3YPDQWAf&*|U#5ff~ zLX}`QGoJb0^ZWRGdk1iXNdQk^rcDvitE`%mqDtCqt?DAuCMUDf`XySpYDtZ5mDOe! zU?4Er$gPY@$%~8ChB7NKXyuj!uEOLXuhKb{dsaMsV#1v4TIY|_$cikPR>1Ey1&*Ip zo!{*qa)B^Rew0#c*jYT?k2VobldyUtN3wW2|)~ diff --git a/backend/matching-engine/target/classes/org/example/matching/util/IdGenerator.class b/backend/matching-engine/target/classes/org/example/matching/util/IdGenerator.class deleted file mode 100644 index 884a082681359e7e84fbfe1c3dddf52f103652fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 471 zcma)2%TB{E5FGcFHiR~m@;)FAh?WEXfC3i~s8R%n(%#*~YF#A`GA{60Z~?@D58$H^ zo3u!9!-rYV?9Q&epI`4E08X&uqJW}etnNVJ+thN8^1xMLOv4<7fXLbr86DowO z#5hGpv3&Rn_ME3%gjt$ItPy&P`#Ls=)vyVll+3)FX8`97&I^{GNTQ7q&h1rVTf_?3 F{sx^CWzzrv diff --git a/backend/matching-engine/target/classes/org/example/matching/validation/OrderValidator.class b/backend/matching-engine/target/classes/org/example/matching/validation/OrderValidator.class deleted file mode 100644 index 3f28dceb2057d2d36b2c86794f481b838fdab100..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 947 zcmah{O>fgc5PjQx*l``|Hld|Jp)C}W2I3+Fmq3L;0)?iuD3C*M8+(;(>%^6_so;Nb z;lMxWg-ek*zzrmR6k^skP^6&xFzb2q@!sstkDs5v0Cr zYWf;ouyFy4luu||`huZCglEaqnIyu*B^#Hq#9&hSZX`Xbr*WU_&{Z4DSYeo^(91C& zDyiPa(WZfG4E2c|M?8=|S27$X_s~iFkS-+qgsz8SrX`2s#dy#a(JS5!2$^ez9uGP^ zlG;zftm?}V!^Y%M{!7!KQPLoFUaL$lKlMK?sSn7rBQ+35_$w&LEwHa|?2I@?0^ zLw}b?d?1vFNVU}t$B`$VNTe3fk38AydcmpQJT!1#uuK2A`4pF*VsDxHGnf2Ut8 zy!()*U5S6P$J90hE#W?jWKE(dkQ^He$$M8Fy(r@6j%968eai>KT^Mqz%%N l=Mz~-Bm-NhQ4PawiqWd&9p*68GEpZ#$0(@ha>-6%;}_!+*Czk~ diff --git a/backend/matching-engine/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/backend/matching-engine/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst deleted file mode 100644 index 200dd91..0000000 --- a/backend/matching-engine/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +++ /dev/null @@ -1,37 +0,0 @@ -org/example/matching/api/controller/MarketController.class -org/example/Main.class -org/example/matching/app/MatchingEngineApplication.class -org/example/matching/model/Trade.class -org/example/matching/model/OrderSide.class -org/example/matching/api/dto/OrderResponse.class -org/example/matching/journal/EventJournal.class -org/example/matching/Wallets/WalletService.class -org/example/matching/Wallets/InMemoryWalletService.class -org/example/matching/model/Reservation.class -org/example/matching/validation/OrderValidator.class -org/example/matching/api/controller/OrderController.class -org/example/matching/api/dto/OrderBookResponse$OrderBookResponseBuilder.class -org/example/matching/api/advice/ApiExceptionHandler.class -org/example/matching/model/OrderBook.class -org/example/matching/api/dto/WalletResponse$WalletResponseBuilder.class -org/example/matching/orderbook/OrderOrchestrator.class -org/example/matching/api/dto/OrderResponse$OrderResponseBuilder.class -org/example/matching/orderbook/InMemoryOrderRepository.class -org/example/matching/matching/MatchingEngine.class -org/example/matching/model/Order.class -org/example/matching/api/dto/DepositRequest.class -org/example/matching/api/dto/PriceLevel.class -org/example/matching/api/dto/WalletResponse.class -org/example/matching/Replay.class -org/example/matching/util/IdGenerator.class -org/example/matching/api/controller/WalletController.class -org/example/matching/Wallets/RiskManager.class -org/example/matching/api/dto/OrderMapper.class -org/example/matching/api/dto/OrderBookResponse.class -org/example/matching/api/dto/OrderRequest.class -org/example/matching/config/MatchingEngineConfig.class -org/example/matching/api/service/MarketDataService.class -org/example/matching/orderbook/OrderRepository.class -org/example/matching/MatchingEngineApplication.class -org/example/matching/model/Wallet.class -org/example/matching/api/service/OrderService.class diff --git a/backend/matching-engine/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/backend/matching-engine/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst deleted file mode 100644 index d31a6fd..0000000 --- a/backend/matching-engine/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +++ /dev/null @@ -1,34 +0,0 @@ -/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/app/MatchingEngineApplication.java -/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/journal/EventJournal.java -/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/model/Trade.java -/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/orderbook/InMemoryOrderRepository.java -/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/MatchingEngineApplication.java -/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/api/dto/WalletResponse.java -/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/Wallets/RiskManager.java -/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/orderbook/OrderOrchestrator.java -/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/model/OrderBook.java -/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/api/controller/WalletController.java -/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/model/Wallet.java -/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/Wallets/InMemoryWalletService.java -/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/api/dto/PriceLevel.java -/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/api/controller/OrderController.java -/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/api/dto/OrderResponse.java -/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/api/advice/ApiExceptionHandler.java -/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/api/controller/MarketController.java -/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/api/service/OrderService.java -/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/validation/OrderValidator.java -/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/orderbook/OrderRepository.java -/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/Main.java -/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/model/Order.java -/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/model/Reservation.java -/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/Wallets/WalletService.java -/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/api/dto/OrderBookResponse.java -/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/api/dto/DepositRequest.java -/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/api/service/MarketDataService.java -/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/api/dto/OrderRequest.java -/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/matching/MatchingEngine.java -/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/Replay.java -/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/util/IdGenerator.java -/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/model/OrderSide.java -/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/api/dto/OrderMapper.java -/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/config/MatchingEngineConfig.java diff --git a/backend/matching-engine/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst b/backend/matching-engine/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst deleted file mode 100644 index e69de29..0000000 diff --git a/backend/src/main/java/org/example/Main.java b/backend/src/main/java/org/example/Main.java deleted file mode 100644 index 407f157..0000000 --- a/backend/src/main/java/org/example/Main.java +++ /dev/null @@ -1,7 +0,0 @@ -package org.example; - -public class Main { - public static void main(String[] args) { - System.out.println("Hello world!"); - } -} \ No newline at end of file diff --git a/backend/src/pom.xml b/backend/src/pom.xml deleted file mode 100644 index 39b72ca..0000000 --- a/backend/src/pom.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - 4.0.0 - - org.example - Strongx - 1.0-SNAPSHOT - pom - - common - matching-engine - - - - org.projectlombok - lombok - 1.18.42 - provided - - - - - 19 - 19 - UTF-8 - - - \ No newline at end of file diff --git a/common.iml b/common.iml deleted file mode 100644 index 99f38c6..0000000 --- a/common.iml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/journals/engine.log b/journals/engine.log deleted file mode 100644 index 8f3b0ad..0000000 --- a/journals/engine.log +++ /dev/null @@ -1,38 +0,0 @@ -ORDER_PLACED: HOUSE_BOT-LAKERS_Y-BUY-1773184182557 -ORDER HOUSE_BOT-LAKERS_Y-BUY-1773184182557 HOUSE_BOT BUY 48 500 1773184182557 -ORDER_PLACED: HOUSE_BOT-LAKERS_Y-SELL-1773184182561 -ORDER HOUSE_BOT-LAKERS_Y-SELL-1773184182561 HOUSE_BOT SELL 52 500 1773184182561 -ORDER_PLACED: HOUSE_BOT-LAKERS_N-BUY-1773184182562 -ORDER HOUSE_BOT-LAKERS_N-BUY-1773184182562 HOUSE_BOT BUY 48 500 1773184182562 -ORDER_PLACED: HOUSE_BOT-LAKERS_N-SELL-1773184182562 -ORDER HOUSE_BOT-LAKERS_N-SELL-1773184182562 HOUSE_BOT SELL 52 500 1773184182562 -ORDER_PLACED: HOUSE_BOT-POSTMAN_Y-BUY-1773186601361 -ORDER HOUSE_BOT-POSTMAN_Y-BUY-1773186601361 HOUSE_BOT BUY 48 500 1773186601361 -ORDER_PLACED: HOUSE_BOT-POSTMAN_Y-SELL-1773186601365 -ORDER HOUSE_BOT-POSTMAN_Y-SELL-1773186601365 HOUSE_BOT SELL 52 500 1773186601365 -ORDER_PLACED: HOUSE_BOT-POSTMAN_N-BUY-1773186601365 -ORDER HOUSE_BOT-POSTMAN_N-BUY-1773186601365 HOUSE_BOT BUY 48 500 1773186601365 -ORDER_PLACED: HOUSE_BOT-POSTMAN_N-SELL-1773186601365 -ORDER HOUSE_BOT-POSTMAN_N-SELL-1773186601365 HOUSE_BOT SELL 52 500 1773186601365 -ORDER_PLACED: 5b2de25a-ae2f-4870-a818-b8f03dd8bc1f -ORDER 5b2de25a-ae2f-4870-a818-b8f03dd8bc1f TRADER_ALICE BUY 52 200 1773186725079 -TRADE 5b2de25a-ae2f-4870-a818-b8f03dd8bc1f HOUSE_BOT-POSTMAN_Y-SELL-1773186601365 52 200 1773186725080 -TRADE_SETTLED: 5b2de25a-ae2f-4870-a818-b8f03dd8bc1f <-> HOUSE_BOT-POSTMAN_Y-SELL-1773186601365 -ORDER_PLACED: HOUSE_BOT-POSTMAN_Y-BUY-1773186725084 -ORDER HOUSE_BOT-POSTMAN_Y-BUY-1773186725084 HOUSE_BOT BUY 48 500 1773186725084 -ORDER_PLACED: HOUSE_BOT-POSTMAN_Y-SELL-1773186725084 -ORDER HOUSE_BOT-POSTMAN_Y-SELL-1773186725084 HOUSE_BOT SELL 52 500 1773186725084 -ORDER_PLACED: HOUSE_BOT-POSTMAN_N-BUY-1773186725084 -ORDER HOUSE_BOT-POSTMAN_N-BUY-1773186725084 HOUSE_BOT BUY 48 500 1773186725084 -ORDER_PLACED: HOUSE_BOT-POSTMAN_N-SELL-1773186725084 -ORDER HOUSE_BOT-POSTMAN_N-SELL-1773186725084 HOUSE_BOT SELL 52 500 1773186725084 -ORDER_PLACED: 5da566f9-37f3-4900-a119-8fdb4eb4125b -ORDER 5da566f9-37f3-4900-a119-8fdb4eb4125b TRADER_BOB BUY 48 150 1773186910682 -ORDER_PLACED: HOUSE_BOT-POSTMAN_Y-BUY-1773187204510 -ORDER HOUSE_BOT-POSTMAN_Y-BUY-1773187204510 HOUSE_BOT BUY 48 500 1773187204510 -ORDER_PLACED: HOUSE_BOT-POSTMAN_Y-SELL-1773187204512 -ORDER HOUSE_BOT-POSTMAN_Y-SELL-1773187204512 HOUSE_BOT SELL 52 500 1773187204512 -ORDER_PLACED: HOUSE_BOT-POSTMAN_N-BUY-1773187204513 -ORDER HOUSE_BOT-POSTMAN_N-BUY-1773187204513 HOUSE_BOT BUY 48 500 1773187204513 -ORDER_PLACED: HOUSE_BOT-POSTMAN_N-SELL-1773187204513 -ORDER HOUSE_BOT-POSTMAN_N-SELL-1773187204513 HOUSE_BOT SELL 52 500 1773187204513 diff --git a/matching-engine/journals/engine.log b/matching-engine/journals/engine.log deleted file mode 100644 index f9417cf..0000000 --- a/matching-engine/journals/engine.log +++ /dev/null @@ -1,463 +0,0 @@ -ORDER_PLACED: 9fcbe96b-69c9-4ec2-93b1-9d3b308e1125 -ORDER 9fcbe96b-69c9-4ec2-93b1-9d3b308e1125 HOUSE_BOT SELL 39 500 1773111257466 -ORDER_PLACED: 334193e5-4548-4665-8c2b-0707bad3b561 -ORDER 334193e5-4548-4665-8c2b-0707bad3b561 HOUSE_BOT SELL 65 500 1773111257469 -ORDER_PLACED: f857168d-a67f-42c3-914f-ec95793dc06b -ORDER f857168d-a67f-42c3-914f-ec95793dc06b USER123 SELL 45 100 1773111323887 -ORDER_PLACED: e40b87e3-1222-4495-aa7b-766b5f20818c -ORDER e40b87e3-1222-4495-aa7b-766b5f20818c HOUSE_BOT SELL 39 500 1773111478206 -ORDER_PLACED: a5ae4f1c-744a-4a40-8aea-eff9553702bb -ORDER a5ae4f1c-744a-4a40-8aea-eff9553702bb HOUSE_BOT SELL 65 500 1773111478209 -ORDER_PLACED: 330319eb-0019-4a8b-bfc5-69a088962e9c -ORDER 330319eb-0019-4a8b-bfc5-69a088962e9c HOUSE_BOT BUY 35 500 1773111529515 -ORDER_PLACED: 3c08e5d7-4dd8-443e-82de-48b4697ae940 -ORDER 3c08e5d7-4dd8-443e-82de-48b4697ae940 HOUSE_BOT SELL 39 500 1773111529517 -ORDER_PLACED: 96335740-3c15-42cf-b14b-3eb7ccc1aa61 -ORDER 96335740-3c15-42cf-b14b-3eb7ccc1aa61 HOUSE_BOT BUY 61 500 1773111529517 -ORDER_PLACED: 9f035132-ca79-4084-b9c8-bf0e7e9ee066 -ORDER 9f035132-ca79-4084-b9c8-bf0e7e9ee066 HOUSE_BOT SELL 65 500 1773111529518 -ORDER_PLACED: fe49922a-2f1d-4191-99a7-935923ca05ff -ORDER fe49922a-2f1d-4191-99a7-935923ca05ff HOUSE_BOT BUY 35 500 1773111619461 -ORDER_PLACED: 37d97bf0-c039-48df-b5b6-0a33862fb02d -ORDER 37d97bf0-c039-48df-b5b6-0a33862fb02d HOUSE_BOT SELL 39 500 1773111619462 -ORDER_PLACED: 7b25c777-68c7-4981-926a-f87994af2220 -ORDER 7b25c777-68c7-4981-926a-f87994af2220 HOUSE_BOT BUY 61 500 1773111619462 -ORDER_PLACED: dda4ba2d-034c-45b1-9e5b-bd21e0c17254 -ORDER dda4ba2d-034c-45b1-9e5b-bd21e0c17254 HOUSE_BOT SELL 65 500 1773111619462 -ORDER_PLACED: f83ceb7a-6484-4c14-a811-41dccc23c45a -ORDER f83ceb7a-6484-4c14-a811-41dccc23c45a HOUSE_BOT SELL 52 500 1773115355538 -ORDER_PLACED: beed7c8f-5422-4fa5-a2c0-379edc41924d -ORDER beed7c8f-5422-4fa5-a2c0-379edc41924d HOUSE_BOT SELL 52 500 1773115355540 -ORDER_PLACED: 4088cdcc-5d72-4a05-bd7b-aef37940f405 -ORDER 4088cdcc-5d72-4a05-bd7b-aef37940f405 HOUSE_BOT SELL 52 500 1773115422800 -ORDER_PLACED: 052f3f2f-1a59-4bd8-998e-815b1c457976 -ORDER 052f3f2f-1a59-4bd8-998e-815b1c457976 HOUSE_BOT SELL 52 500 1773115422803 -ORDER_PLACED: 19e3ed26-b804-42a3-bcbc-b7d9c1d84912 -ORDER 19e3ed26-b804-42a3-bcbc-b7d9c1d84912 HOUSE_BOT SELL 52 500 1773115432535 -ORDER_PLACED: a1fa2e30-dba1-4ddf-8d8d-28bb3c8785af -ORDER a1fa2e30-dba1-4ddf-8d8d-28bb3c8785af HOUSE_BOT SELL 52 500 1773115432536 -ORDER_PLACED: b7ded81f-58ed-4723-a693-9fb313fb7224 -ORDER b7ded81f-58ed-4723-a693-9fb313fb7224 HOUSE_BOT SELL 52 500 1773115517554 -ORDER_PLACED: 070db175-751a-4a57-953e-862ea50f16d7 -ORDER 070db175-751a-4a57-953e-862ea50f16d7 HOUSE_BOT SELL 52 500 1773115517557 -ORDER_PLACED: f5a62e4e-9b94-4ce5-bc2d-2df3fee64a5d -ORDER f5a62e4e-9b94-4ce5-bc2d-2df3fee64a5d TEST_USER SELL 48 100 1773115543826 -ORDER_PLACED: 50babf85-2f52-44d7-b02b-78653bcfa0c0 -ORDER 50babf85-2f52-44d7-b02b-78653bcfa0c0 HOUSE_BOT SELL 52 500 1773180225213 -ORDER_PLACED: 1c800282-d925-4b30-ab5b-6456dd49f780 -ORDER 1c800282-d925-4b30-ab5b-6456dd49f780 HOUSE_BOT SELL 52 500 1773180225216 -ORDER_PLACED: b49d3f7e-e844-494b-8859-d9217aaf69da -ORDER b49d3f7e-e844-494b-8859-d9217aaf69da TRADER1 SELL 52 100 1773180255539 -ORDER_PLACED: a94818b6-1ad8-4976-b862-664729216038 -ORDER a94818b6-1ad8-4976-b862-664729216038 TRADER1 SELL 48 50 1773180283856 -ORDER_PLACED: 13876ec9-beed-4de5-b979-f7d5f0c2a03b -ORDER 13876ec9-beed-4de5-b979-f7d5f0c2a03b TRADER2 BUY 52 100 1773180298567 -TRADE 13876ec9-beed-4de5-b979-f7d5f0c2a03b a94818b6-1ad8-4976-b862-664729216038 48 50 1773180298567 -TRADE 13876ec9-beed-4de5-b979-f7d5f0c2a03b 50babf85-2f52-44d7-b02b-78653bcfa0c0 52 50 1773180298567 -TRADE_SETTLED: 13876ec9-beed-4de5-b979-f7d5f0c2a03b <-> a94818b6-1ad8-4976-b862-664729216038 -TRADE_SETTLED: 13876ec9-beed-4de5-b979-f7d5f0c2a03b <-> 50babf85-2f52-44d7-b02b-78653bcfa0c0 -ORDER_PLACED: 5e3586db-0b48-4c10-bdcd-daca7d0ce198 -ORDER 5e3586db-0b48-4c10-bdcd-daca7d0ce198 TRADER2 BUY 52 50 1773180328151 -TRADE 5e3586db-0b48-4c10-bdcd-daca7d0ce198 50babf85-2f52-44d7-b02b-78653bcfa0c0 52 50 1773180328152 -TRADE_SETTLED: 5e3586db-0b48-4c10-bdcd-daca7d0ce198 <-> 50babf85-2f52-44d7-b02b-78653bcfa0c0 -ORDER_PLACED: 857255b7-251a-41c4-8c1c-813aa64cce41 -ORDER 857255b7-251a-41c4-8c1c-813aa64cce41 HOUSE_BOT SELL 52 500 1773180526243 -ORDER_PLACED: 93c5368c-c8cb-4b48-9376-c7025e61548e -ORDER 93c5368c-c8cb-4b48-9376-c7025e61548e HOUSE_BOT SELL 52 500 1773180526351 -ORDER_PLACED: 27baed26-7b91-4e97-9a81-cfa552da5385 -ORDER 27baed26-7b91-4e97-9a81-cfa552da5385 TRADER BUY 52 100 1773180554676 -TRADE 27baed26-7b91-4e97-9a81-cfa552da5385 857255b7-251a-41c4-8c1c-813aa64cce41 52 100 1773180554677 -TRADE_SETTLED: 27baed26-7b91-4e97-9a81-cfa552da5385 <-> 857255b7-251a-41c4-8c1c-813aa64cce41 -ORDER_PLACED: HOUSE_BOT-FINAL_Y-SELL-1773180610141 -ORDER HOUSE_BOT-FINAL_Y-SELL-1773180610141 HOUSE_BOT SELL 52 500 1773180610141 -ORDER_PLACED: HOUSE_BOT-FINAL_N-SELL-1773180610249 -ORDER HOUSE_BOT-FINAL_N-SELL-1773180610249 HOUSE_BOT SELL 52 500 1773180610249 -ORDER_PLACED: ffec44af-35e2-42dc-8c26-1b907a3c7c08 -ORDER ffec44af-35e2-42dc-8c26-1b907a3c7c08 TEST_USER BUY 52 50 1773180612508 -TRADE ffec44af-35e2-42dc-8c26-1b907a3c7c08 HOUSE_BOT-FINAL_Y-SELL-1773180610141 52 50 1773180612510 -TRADE_SETTLED: ffec44af-35e2-42dc-8c26-1b907a3c7c08 <-> HOUSE_BOT-FINAL_Y-SELL-1773180610141 -ORDER_PLACED: HOUSE_BOT-FINAL_Y-SELL-1773180612515 -ORDER HOUSE_BOT-FINAL_Y-SELL-1773180612515 HOUSE_BOT SELL 52 500 1773180612515 -ORDER_PLACED: HOUSE_BOT-FINAL_N-SELL-1773180612616 -ORDER HOUSE_BOT-FINAL_N-SELL-1773180612616 HOUSE_BOT SELL 52 500 1773180612616 -ORDER_PLACED: 61b5c74b-0a60-417b-ac6e-949bda9047b6 -ORDER 61b5c74b-0a60-417b-ac6e-949bda9047b6 TEST_USER2 BUY 52 50 1773180644089 -TRADE 61b5c74b-0a60-417b-ac6e-949bda9047b6 HOUSE_BOT-FINAL_Y-SELL-1773180612515 52 50 1773180644091 -TRADE_SETTLED: 61b5c74b-0a60-417b-ac6e-949bda9047b6 <-> HOUSE_BOT-FINAL_Y-SELL-1773180612515 -ORDER_PLACED: HOUSE_BOT-FINAL_Y-SELL-1773180644093 -ORDER HOUSE_BOT-FINAL_Y-SELL-1773180644093 HOUSE_BOT SELL 52 500 1773180644093 -ORDER_PLACED: HOUSE_BOT-FINAL_N-SELL-1773180644199 -ORDER HOUSE_BOT-FINAL_N-SELL-1773180644199 HOUSE_BOT SELL 52 500 1773180644199 -ORDER_PLACED: HOUSE_BOT-LAKERS_Y-SELL-1773180714856 -ORDER HOUSE_BOT-LAKERS_Y-SELL-1773180714856 HOUSE_BOT SELL 52 500 1773180714856 -ORDER_PLACED: HOUSE_BOT-LAKERS_N-SELL-1773180714963 -ORDER HOUSE_BOT-LAKERS_N-SELL-1773180714963 HOUSE_BOT SELL 52 500 1773180714963 -ORDER_PLACED: df2f3319-dd7e-4494-9060-6dd02491f654 -ORDER df2f3319-dd7e-4494-9060-6dd02491f654 TRADER1 BUY 52 100 1773182089056 -ORDER_PLACED: HOUSE_BOT-FIX_Y-SELL-1773182231959 -ORDER HOUSE_BOT-FIX_Y-SELL-1773182231959 HOUSE_BOT SELL 52 500 1773182231959 -ORDER_PLACED: HOUSE_BOT-FIX_N-SELL-1773182232068 -ORDER HOUSE_BOT-FIX_N-SELL-1773182232068 HOUSE_BOT SELL 52 500 1773182232068 -ORDER_PLACED: HOUSE_BOT-SETTLE_Y-SELL-1773182489558 -ORDER HOUSE_BOT-SETTLE_Y-SELL-1773182489558 HOUSE_BOT SELL 52 500 1773182489558 -ORDER_PLACED: HOUSE_BOT-SETTLE_N-SELL-1773182489666 -ORDER HOUSE_BOT-SETTLE_N-SELL-1773182489666 HOUSE_BOT SELL 52 500 1773182489666 -ORDER_PLACED: ae9ef9c4-1eed-4a3a-a0b2-9423d5f349d2 -ORDER ae9ef9c4-1eed-4a3a-a0b2-9423d5f349d2 BLOCK_TEST BUY 52 100 1773182491902 -ORDER_PLACED: HOUSE_BOT-FRESH_Y-SELL-1773182557013 -ORDER HOUSE_BOT-FRESH_Y-SELL-1773182557013 HOUSE_BOT SELL 52 500 1773182557013 -ORDER_PLACED: HOUSE_BOT-FRESH_N-SELL-1773182557125 -ORDER HOUSE_BOT-FRESH_N-SELL-1773182557125 HOUSE_BOT SELL 52 500 1773182557125 -ORDER_PLACED: d0c1f18e-4498-4330-b0c6-07ea30fa05a6 -ORDER d0c1f18e-4498-4330-b0c6-07ea30fa05a6 FRESH_USER BUY 52 100 1773182567228 -ORDER_PLACED: HOUSE_BOT-FINAL_Y-SELL-1773182608916 -ORDER HOUSE_BOT-FINAL_Y-SELL-1773182608916 HOUSE_BOT SELL 52 500 1773182608916 -ORDER_PLACED: HOUSE_BOT-FINAL_N-SELL-1773182609027 -ORDER HOUSE_BOT-FINAL_N-SELL-1773182609027 HOUSE_BOT SELL 52 500 1773182609027 -ORDER_PLACED: 07818452-8d0f-42c5-8c96-bde654e88df9 -ORDER 07818452-8d0f-42c5-8c96-bde654e88df9 BLOCK_USER BUY 52 100 1773182611196 -ORDER_PLACED: HOUSE_BOT-ENUM_Y-SELL-1773182929676 -ORDER HOUSE_BOT-ENUM_Y-SELL-1773182929676 HOUSE_BOT SELL 52 500 1773182929676 -ORDER_PLACED: HOUSE_BOT-ENUM_N-SELL-1773182929781 -ORDER HOUSE_BOT-ENUM_N-SELL-1773182929781 HOUSE_BOT SELL 52 500 1773182929781 -ORDER_PLACED: HOUSE_BOT-E2E_Y-SELL-1773183005330 -ORDER HOUSE_BOT-E2E_Y-SELL-1773183005330 HOUSE_BOT SELL 52 500 1773183005330 -ORDER_PLACED: HOUSE_BOT-E2E_N-SELL-1773183005332 -ORDER HOUSE_BOT-E2E_N-SELL-1773183005332 HOUSE_BOT SELL 52 500 1773183005332 -ORDER_PLACED: HOUSE_BOT-E2E_Y-SELL-1773183131060 -ORDER HOUSE_BOT-E2E_Y-SELL-1773183131060 HOUSE_BOT SELL 52 500 1773183131060 -ORDER_PLACED: HOUSE_BOT-E2E_N-SELL-1773183131061 -ORDER HOUSE_BOT-E2E_N-SELL-1773183131061 HOUSE_BOT SELL 52 500 1773183131061 -ORDER_PLACED: 15edb532-ebe5-4587-82b1-22a2927369f2 -ORDER 15edb532-ebe5-4587-82b1-22a2927369f2 E2E_TRADER BUY 52 100 1773183166506 -TRADE 15edb532-ebe5-4587-82b1-22a2927369f2 HOUSE_BOT-E2E_Y-SELL-1773183131060 52 100 1773183166507 -TRADE_SETTLED: 15edb532-ebe5-4587-82b1-22a2927369f2 <-> HOUSE_BOT-E2E_Y-SELL-1773183131060 -ORDER_PLACED: HOUSE_BOT-E2E_Y-SELL-1773183166514 -ORDER HOUSE_BOT-E2E_Y-SELL-1773183166514 HOUSE_BOT SELL 52 500 1773183166514 -ORDER_PLACED: HOUSE_BOT-E2E_N-SELL-1773183166514 -ORDER HOUSE_BOT-E2E_N-SELL-1773183166514 HOUSE_BOT SELL 52 500 1773183166514 -ORDER_PLACED: HOUSE_BOT-DEBUG_Y-SELL-1773183287280 -ORDER HOUSE_BOT-DEBUG_Y-SELL-1773183287280 HOUSE_BOT SELL 52 500 1773183287280 -ORDER_PLACED: HOUSE_BOT-DEBUG_N-SELL-1773183287284 -ORDER HOUSE_BOT-DEBUG_N-SELL-1773183287284 HOUSE_BOT SELL 52 500 1773183287284 -ORDER_PLACED: HOUSE_BOT-TRACE_Y-SELL-1773183356717 -ORDER HOUSE_BOT-TRACE_Y-SELL-1773183356717 HOUSE_BOT SELL 52 500 1773183356717 -ORDER_PLACED: HOUSE_BOT-TRACE_N-SELL-1773183356722 -ORDER HOUSE_BOT-TRACE_N-SELL-1773183356722 HOUSE_BOT SELL 52 500 1773183356722 -ORDER_PLACED: HOUSE_BOT-CASH_Y-BUY-1773183416028 -ORDER HOUSE_BOT-CASH_Y-BUY-1773183416028 HOUSE_BOT BUY 48 500 1773183416028 -ORDER_PLACED: HOUSE_BOT-CASH_Y-SELL-1773183416033 -ORDER HOUSE_BOT-CASH_Y-SELL-1773183416033 HOUSE_BOT SELL 52 500 1773183416033 -ORDER_PLACED: HOUSE_BOT-CASH_N-BUY-1773183416034 -ORDER HOUSE_BOT-CASH_N-BUY-1773183416034 HOUSE_BOT BUY 48 500 1773183416034 -ORDER_PLACED: HOUSE_BOT-CASH_N-SELL-1773183416034 -ORDER HOUSE_BOT-CASH_N-SELL-1773183416034 HOUSE_BOT SELL 52 500 1773183416034 -ORDER_PLACED: HOUSE_BOT-CASH_Y-BUY-1773183490652 -ORDER HOUSE_BOT-CASH_Y-BUY-1773183490652 HOUSE_BOT BUY 48 500 1773183490652 -ORDER_PLACED: HOUSE_BOT-CASH_Y-SELL-1773183490653 -ORDER HOUSE_BOT-CASH_Y-SELL-1773183490653 HOUSE_BOT SELL 52 500 1773183490653 -ORDER_PLACED: HOUSE_BOT-CASH_N-BUY-1773183490653 -ORDER HOUSE_BOT-CASH_N-BUY-1773183490653 HOUSE_BOT BUY 48 500 1773183490653 -ORDER_PLACED: HOUSE_BOT-CASH_N-SELL-1773183490653 -ORDER HOUSE_BOT-CASH_N-SELL-1773183490653 HOUSE_BOT SELL 52 500 1773183490653 -ORDER_PLACED: a08fd557-f51b-47c3-9dce-72cd6878db5d -ORDER a08fd557-f51b-47c3-9dce-72cd6878db5d TRADER_TEST BUY 52 100 1773183525895 -TRADE a08fd557-f51b-47c3-9dce-72cd6878db5d HOUSE_BOT-CASH_Y-SELL-1773183490653 52 100 1773183525897 -TRADE_SETTLED: a08fd557-f51b-47c3-9dce-72cd6878db5d <-> HOUSE_BOT-CASH_Y-SELL-1773183490653 -ORDER_PLACED: HOUSE_BOT-CASH_Y-BUY-1773183525900 -ORDER HOUSE_BOT-CASH_Y-BUY-1773183525900 HOUSE_BOT BUY 48 500 1773183525900 -ORDER_PLACED: HOUSE_BOT-CASH_Y-SELL-1773183525901 -ORDER HOUSE_BOT-CASH_Y-SELL-1773183525901 HOUSE_BOT SELL 52 500 1773183525901 -ORDER_PLACED: HOUSE_BOT-CASH_N-BUY-1773183525901 -ORDER HOUSE_BOT-CASH_N-BUY-1773183525901 HOUSE_BOT BUY 48 500 1773183525901 -ORDER_PLACED: HOUSE_BOT-CASH_N-SELL-1773183525902 -ORDER HOUSE_BOT-CASH_N-SELL-1773183525902 HOUSE_BOT SELL 52 500 1773183525902 -ORDER_PLACED: HOUSE_BOT-PROD_Y-BUY-1773183593439 -ORDER HOUSE_BOT-PROD_Y-BUY-1773183593439 HOUSE_BOT BUY 48 500 1773183593440 -ORDER_PLACED: HOUSE_BOT-PROD_Y-SELL-1773183593442 -ORDER HOUSE_BOT-PROD_Y-SELL-1773183593442 HOUSE_BOT SELL 52 500 1773183593442 -ORDER_PLACED: HOUSE_BOT-PROD_N-BUY-1773183593443 -ORDER HOUSE_BOT-PROD_N-BUY-1773183593443 HOUSE_BOT BUY 48 500 1773183593443 -ORDER_PLACED: HOUSE_BOT-PROD_N-SELL-1773183593443 -ORDER HOUSE_BOT-PROD_N-SELL-1773183593443 HOUSE_BOT SELL 52 500 1773183593443 -ORDER_PLACED: 6d3c662b-89c8-484d-98be-bd5d5e39b76a -ORDER 6d3c662b-89c8-484d-98be-bd5d5e39b76a PROD_TRADER BUY 52 50 1773183601183 -TRADE 6d3c662b-89c8-484d-98be-bd5d5e39b76a HOUSE_BOT-PROD_Y-SELL-1773183593442 52 50 1773183601184 -TRADE_SETTLED: 6d3c662b-89c8-484d-98be-bd5d5e39b76a <-> HOUSE_BOT-PROD_Y-SELL-1773183593442 -ORDER_PLACED: HOUSE_BOT-PROD_Y-BUY-1773183601186 -ORDER HOUSE_BOT-PROD_Y-BUY-1773183601186 HOUSE_BOT BUY 48 500 1773183601186 -ORDER_PLACED: HOUSE_BOT-PROD_Y-SELL-1773183601186 -ORDER HOUSE_BOT-PROD_Y-SELL-1773183601186 HOUSE_BOT SELL 52 500 1773183601186 -ORDER_PLACED: HOUSE_BOT-PROD_N-BUY-1773183601186 -ORDER HOUSE_BOT-PROD_N-BUY-1773183601186 HOUSE_BOT BUY 48 500 1773183601186 -ORDER_PLACED: HOUSE_BOT-PROD_N-SELL-1773183601186 -ORDER HOUSE_BOT-PROD_N-SELL-1773183601186 HOUSE_BOT SELL 52 500 1773183601186 -ORDER_PLACED: HOUSE_BOT-KALSHI_Y-BUY-1773186148086 -ORDER HOUSE_BOT-KALSHI_Y-BUY-1773186148086 HOUSE_BOT BUY 48 500 1773186148086 -ORDER_PLACED: HOUSE_BOT-KALSHI_Y-SELL-1773186148094 -ORDER HOUSE_BOT-KALSHI_Y-SELL-1773186148094 HOUSE_BOT SELL 52 500 1773186148094 -ORDER_PLACED: HOUSE_BOT-KALSHI_N-BUY-1773186148095 -ORDER HOUSE_BOT-KALSHI_N-BUY-1773186148095 HOUSE_BOT BUY 48 500 1773186148095 -ORDER_PLACED: HOUSE_BOT-KALSHI_N-SELL-1773186148095 -ORDER HOUSE_BOT-KALSHI_N-SELL-1773186148095 HOUSE_BOT SELL 52 500 1773186148095 -ORDER_PLACED: 244dc1b4-7f6c-4c2f-b0d7-34e313624c6e -ORDER 244dc1b4-7f6c-4c2f-b0d7-34e313624c6e KALSHI_TRADER BUY 52 100 1773186172195 -TRADE 244dc1b4-7f6c-4c2f-b0d7-34e313624c6e HOUSE_BOT-KALSHI_Y-SELL-1773186148094 52 100 1773186172195 -TRADE_SETTLED: 244dc1b4-7f6c-4c2f-b0d7-34e313624c6e <-> HOUSE_BOT-KALSHI_Y-SELL-1773186148094 -ORDER_PLACED: HOUSE_BOT-KALSHI_Y-BUY-1773186172198 -ORDER HOUSE_BOT-KALSHI_Y-BUY-1773186172198 HOUSE_BOT BUY 48 500 1773186172198 -ORDER_PLACED: HOUSE_BOT-KALSHI_Y-SELL-1773186172198 -ORDER HOUSE_BOT-KALSHI_Y-SELL-1773186172198 HOUSE_BOT SELL 52 500 1773186172198 -ORDER_PLACED: HOUSE_BOT-KALSHI_N-BUY-1773186172198 -ORDER HOUSE_BOT-KALSHI_N-BUY-1773186172198 HOUSE_BOT BUY 48 500 1773186172198 -ORDER_PLACED: HOUSE_BOT-KALSHI_N-SELL-1773186172198 -ORDER HOUSE_BOT-KALSHI_N-SELL-1773186172198 HOUSE_BOT SELL 52 500 1773186172198 -ORDER_PLACED: HOUSE_BOT-SETTLE_Y-BUY-1773186369960 -ORDER HOUSE_BOT-SETTLE_Y-BUY-1773186369960 HOUSE_BOT BUY 48 500 1773186369960 -ORDER_PLACED: HOUSE_BOT-SETTLE_Y-SELL-1773186369964 -ORDER HOUSE_BOT-SETTLE_Y-SELL-1773186369964 HOUSE_BOT SELL 52 500 1773186369964 -ORDER_PLACED: HOUSE_BOT-SETTLE_N-BUY-1773186369964 -ORDER HOUSE_BOT-SETTLE_N-BUY-1773186369964 HOUSE_BOT BUY 48 500 1773186369964 -ORDER_PLACED: HOUSE_BOT-SETTLE_N-SELL-1773186369964 -ORDER HOUSE_BOT-SETTLE_N-SELL-1773186369964 HOUSE_BOT SELL 52 500 1773186369964 -ORDER_PLACED: HOUSE_BOT-KALSHI_YES-BUY-1773186383923 -ORDER HOUSE_BOT-KALSHI_YES-BUY-1773186383923 HOUSE_BOT BUY 48 500 1773186383923 -ORDER_PLACED: HOUSE_BOT-KALSHI_YES-SELL-1773186383924 -ORDER HOUSE_BOT-KALSHI_YES-SELL-1773186383924 HOUSE_BOT SELL 52 500 1773186383924 -ORDER_PLACED: HOUSE_BOT-KALSHI_NO-BUY-1773186383925 -ORDER HOUSE_BOT-KALSHI_NO-BUY-1773186383925 HOUSE_BOT BUY 48 500 1773186383925 -ORDER_PLACED: HOUSE_BOT-KALSHI_NO-SELL-1773186383925 -ORDER HOUSE_BOT-KALSHI_NO-SELL-1773186383925 HOUSE_BOT SELL 52 500 1773186383925 -ORDER_PLACED: 68649056-e19a-40dc-b643-e339a6bd60ec -ORDER 68649056-e19a-40dc-b643-e339a6bd60ec KALSHI_USER BUY 52 100 1773186389481 -TRADE 68649056-e19a-40dc-b643-e339a6bd60ec HOUSE_BOT-KALSHI_YES-SELL-1773186383924 52 100 1773186389482 -TRADE_SETTLED: 68649056-e19a-40dc-b643-e339a6bd60ec <-> HOUSE_BOT-KALSHI_YES-SELL-1773186383924 -ORDER_PLACED: HOUSE_BOT-KALSHI_YES-BUY-1773186389484 -ORDER HOUSE_BOT-KALSHI_YES-BUY-1773186389484 HOUSE_BOT BUY 48 500 1773186389484 -ORDER_PLACED: HOUSE_BOT-KALSHI_YES-SELL-1773186389484 -ORDER HOUSE_BOT-KALSHI_YES-SELL-1773186389484 HOUSE_BOT SELL 52 500 1773186389484 -ORDER_PLACED: HOUSE_BOT-KALSHI_NO-BUY-1773186389484 -ORDER HOUSE_BOT-KALSHI_NO-BUY-1773186389484 HOUSE_BOT BUY 48 500 1773186389484 -ORDER_PLACED: HOUSE_BOT-KALSHI_NO-SELL-1773186389484 -ORDER HOUSE_BOT-KALSHI_NO-SELL-1773186389484 HOUSE_BOT SELL 52 500 1773186389484 -ORDER_PLACED: HOUSE_BOT-DEBUG_Y-BUY-1773196703281 -ORDER HOUSE_BOT-DEBUG_Y-BUY-1773196703281 HOUSE_BOT BUY 48 500 1773196703281 -ORDER_PLACED: HOUSE_BOT-DEBUG_Y-SELL-1773196703287 -ORDER HOUSE_BOT-DEBUG_Y-SELL-1773196703287 HOUSE_BOT SELL 52 500 1773196703287 -ORDER_PLACED: HOUSE_BOT-DEBUG_N-BUY-1773196703287 -ORDER HOUSE_BOT-DEBUG_N-BUY-1773196703287 HOUSE_BOT BUY 48 500 1773196703287 -ORDER_PLACED: HOUSE_BOT-DEBUG_N-SELL-1773196703288 -ORDER HOUSE_BOT-DEBUG_N-SELL-1773196703288 HOUSE_BOT SELL 52 500 1773196703288 -ORDER_PLACED: 0797e709-d3d0-4b79-ac88-a5f6bfa736d9 -ORDER 0797e709-d3d0-4b79-ac88-a5f6bfa736d9 DEBUG_USER BUY 52 100 1773196727276 -TRADE 0797e709-d3d0-4b79-ac88-a5f6bfa736d9 HOUSE_BOT-DEBUG_Y-SELL-1773196703287 52 100 1773196727277 -TRADE_SETTLED: 0797e709-d3d0-4b79-ac88-a5f6bfa736d9 <-> HOUSE_BOT-DEBUG_Y-SELL-1773196703287 -ORDER_PLACED: HOUSE_BOT-DEBUG_Y-BUY-1773196727280 -ORDER HOUSE_BOT-DEBUG_Y-BUY-1773196727280 HOUSE_BOT BUY 48 500 1773196727280 -ORDER_PLACED: HOUSE_BOT-DEBUG_Y-SELL-1773196727280 -ORDER HOUSE_BOT-DEBUG_Y-SELL-1773196727280 HOUSE_BOT SELL 52 500 1773196727280 -ORDER_PLACED: HOUSE_BOT-DEBUG_N-BUY-1773196727281 -ORDER HOUSE_BOT-DEBUG_N-BUY-1773196727281 HOUSE_BOT BUY 48 500 1773196727281 -ORDER_PLACED: HOUSE_BOT-DEBUG_N-SELL-1773196727281 -ORDER HOUSE_BOT-DEBUG_N-SELL-1773196727281 HOUSE_BOT SELL 52 500 1773196727281 -ORDER_PLACED: HOUSE_BOT-FINAL_Y-BUY-1773196818389 -ORDER HOUSE_BOT-FINAL_Y-BUY-1773196818389 HOUSE_BOT BUY 48 500 1773196818389 -ORDER_PLACED: HOUSE_BOT-FINAL_Y-SELL-1773196818396 -ORDER HOUSE_BOT-FINAL_Y-SELL-1773196818396 HOUSE_BOT SELL 52 500 1773196818396 -ORDER_PLACED: HOUSE_BOT-FINAL_N-BUY-1773196818396 -ORDER HOUSE_BOT-FINAL_N-BUY-1773196818396 HOUSE_BOT BUY 48 500 1773196818396 -ORDER_PLACED: HOUSE_BOT-FINAL_N-SELL-1773196818396 -ORDER HOUSE_BOT-FINAL_N-SELL-1773196818396 HOUSE_BOT SELL 52 500 1773196818396 -ORDER_PLACED: cb03ae4c-a815-4ee1-8f03-058686afc966 -ORDER cb03ae4c-a815-4ee1-8f03-058686afc966 FINAL_USER BUY 52 100 1773196824595 -TRADE cb03ae4c-a815-4ee1-8f03-058686afc966 HOUSE_BOT-FINAL_Y-SELL-1773196818396 52 100 1773196824596 -TRADE_SETTLED: cb03ae4c-a815-4ee1-8f03-058686afc966 <-> HOUSE_BOT-FINAL_Y-SELL-1773196818396 -ORDER_PLACED: HOUSE_BOT-FINAL_Y-BUY-1773196824598 -ORDER HOUSE_BOT-FINAL_Y-BUY-1773196824598 HOUSE_BOT BUY 48 500 1773196824598 -ORDER_PLACED: HOUSE_BOT-FINAL_Y-SELL-1773196824600 -ORDER HOUSE_BOT-FINAL_Y-SELL-1773196824600 HOUSE_BOT SELL 52 500 1773196824600 -ORDER_PLACED: HOUSE_BOT-FINAL_N-BUY-1773196824600 -ORDER HOUSE_BOT-FINAL_N-BUY-1773196824600 HOUSE_BOT BUY 48 500 1773196824600 -ORDER_PLACED: HOUSE_BOT-FINAL_N-SELL-1773196824600 -ORDER HOUSE_BOT-FINAL_N-SELL-1773196824600 HOUSE_BOT SELL 52 500 1773196824600 -ORDER_PLACED: HOUSE_BOT-SEQ_Y-BUY-1773197042881 -ORDER HOUSE_BOT-SEQ_Y-BUY-1773197042881 HOUSE_BOT BUY 48 500 1773197042881 -ORDER_PLACED: HOUSE_BOT-SEQ_Y-SELL-1773197042883 -ORDER HOUSE_BOT-SEQ_Y-SELL-1773197042883 HOUSE_BOT SELL 52 500 1773197042883 -ORDER_PLACED: HOUSE_BOT-SEQ_N-BUY-1773197042883 -ORDER HOUSE_BOT-SEQ_N-BUY-1773197042883 HOUSE_BOT BUY 48 500 1773197042883 -ORDER_PLACED: HOUSE_BOT-SEQ_N-SELL-1773197042883 -ORDER HOUSE_BOT-SEQ_N-SELL-1773197042883 HOUSE_BOT SELL 52 500 1773197042883 -ORDER_PLACED: f6bf9d4a-34ea-4ffe-94a7-0fc764f4772e -ORDER f6bf9d4a-34ea-4ffe-94a7-0fc764f4772e TRADER_1 BUY 52 200 1773197152241 -TRADE f6bf9d4a-34ea-4ffe-94a7-0fc764f4772e HOUSE_BOT-SEQ_Y-SELL-1773197042883 52 200 1773197152246 -TRADE_SETTLED: f6bf9d4a-34ea-4ffe-94a7-0fc764f4772e <-> HOUSE_BOT-SEQ_Y-SELL-1773197042883 -ORDER_PLACED: HOUSE_BOT-SEQ_Y-BUY-1773197152250 -ORDER HOUSE_BOT-SEQ_Y-BUY-1773197152250 HOUSE_BOT BUY 48 500 1773197152250 -ORDER_PLACED: HOUSE_BOT-SEQ_Y-SELL-1773197152250 -ORDER HOUSE_BOT-SEQ_Y-SELL-1773197152250 HOUSE_BOT SELL 52 500 1773197152250 -ORDER_PLACED: HOUSE_BOT-SEQ_N-BUY-1773197152250 -ORDER HOUSE_BOT-SEQ_N-BUY-1773197152250 HOUSE_BOT BUY 48 500 1773197152250 -ORDER_PLACED: HOUSE_BOT-SEQ_N-SELL-1773197152251 -ORDER HOUSE_BOT-SEQ_N-SELL-1773197152251 HOUSE_BOT SELL 52 500 1773197152251 -ORDER_PLACED: dc79abc1-6558-4ab2-9203-a639256b8b6f -ORDER dc79abc1-6558-4ab2-9203-a639256b8b6f TRADER_2 BUY 48 150 1773197259219 -ORDER_PLACED: e30e3d7f-3670-4045-8eb2-52e90780735b -ORDER e30e3d7f-3670-4045-8eb2-52e90780735b TRADER_1 BUY 52 100 1773197377539 -TRADE e30e3d7f-3670-4045-8eb2-52e90780735b HOUSE_BOT-SEQ_Y-SELL-1773197152250 52 100 1773197377540 -TRADE_SETTLED: e30e3d7f-3670-4045-8eb2-52e90780735b <-> HOUSE_BOT-SEQ_Y-SELL-1773197152250 -ORDER_PLACED: HOUSE_BOT-ANA_Y-BUY-1773197833978 -ORDER HOUSE_BOT-ANA_Y-BUY-1773197833978 HOUSE_BOT BUY 48 500 1773197833978 -ORDER_PLACED: HOUSE_BOT-ANA_Y-SELL-1773197833981 -ORDER HOUSE_BOT-ANA_Y-SELL-1773197833981 HOUSE_BOT SELL 52 500 1773197833981 -ORDER_PLACED: HOUSE_BOT-ANA_N-BUY-1773197833981 -ORDER HOUSE_BOT-ANA_N-BUY-1773197833981 HOUSE_BOT BUY 48 500 1773197833981 -ORDER_PLACED: HOUSE_BOT-ANA_N-SELL-1773197833981 -ORDER HOUSE_BOT-ANA_N-SELL-1773197833981 HOUSE_BOT SELL 52 500 1773197833981 -ORDER_PLACED: f29e1458-f71b-4f0e-b6bc-9759e1e1e8c9 -ORDER f29e1458-f71b-4f0e-b6bc-9759e1e1e8c9 TRADER_ANALYSIS_1 BUY 52 200 1773197852165 -TRADE f29e1458-f71b-4f0e-b6bc-9759e1e1e8c9 HOUSE_BOT-ANA_Y-SELL-1773197833981 52 200 1773197852167 -TRADE_SETTLED: f29e1458-f71b-4f0e-b6bc-9759e1e1e8c9 <-> HOUSE_BOT-ANA_Y-SELL-1773197833981 -ORDER_PLACED: HOUSE_BOT-ANA_Y-BUY-1773197852169 -ORDER HOUSE_BOT-ANA_Y-BUY-1773197852169 HOUSE_BOT BUY 48 500 1773197852169 -ORDER_PLACED: HOUSE_BOT-ANA_Y-SELL-1773197852169 -ORDER HOUSE_BOT-ANA_Y-SELL-1773197852169 HOUSE_BOT SELL 52 500 1773197852169 -ORDER_PLACED: HOUSE_BOT-ANA_N-BUY-1773197852169 -ORDER HOUSE_BOT-ANA_N-BUY-1773197852169 HOUSE_BOT BUY 48 500 1773197852169 -ORDER_PLACED: HOUSE_BOT-ANA_N-SELL-1773197852169 -ORDER HOUSE_BOT-ANA_N-SELL-1773197852169 HOUSE_BOT SELL 52 500 1773197852169 -ORDER_PLACED: 4fbee2ad-8f7b-4ca9-8ce5-ab1da70386c7 -ORDER 4fbee2ad-8f7b-4ca9-8ce5-ab1da70386c7 TRADER_ANALYSIS_2 BUY 48 150 1773197867077 -ORDER_PLACED: f3026e2a-e187-4167-983c-ae86fd5d08b8 -ORDER f3026e2a-e187-4167-983c-ae86fd5d08b8 TRADER_ANALYSIS_2 BUY 52 150 1773197914709 -TRADE f3026e2a-e187-4167-983c-ae86fd5d08b8 HOUSE_BOT-ANA_N-SELL-1773197852169 52 150 1773197914711 -TRADE_SETTLED: f3026e2a-e187-4167-983c-ae86fd5d08b8 <-> HOUSE_BOT-ANA_N-SELL-1773197852169 -ORDER_PLACED: HOUSE_BOT-FIX_Y-BUY-1773198020183 -ORDER HOUSE_BOT-FIX_Y-BUY-1773198020183 HOUSE_BOT BUY 48 500 1773198020183 -ORDER_PLACED: HOUSE_BOT-FIX_Y-SELL-1773198020186 -ORDER HOUSE_BOT-FIX_Y-SELL-1773198020186 HOUSE_BOT SELL 52 500 1773198020186 -ORDER_PLACED: HOUSE_BOT-FIX_N-BUY-1773198020186 -ORDER HOUSE_BOT-FIX_N-BUY-1773198020186 HOUSE_BOT BUY 48 500 1773198020186 -ORDER_PLACED: HOUSE_BOT-FIX_N-SELL-1773198020186 -ORDER HOUSE_BOT-FIX_N-SELL-1773198020186 HOUSE_BOT SELL 52 500 1773198020186 -ORDER_PLACED: f8677342-1636-4461-adb3-dc706eeec950 -ORDER f8677342-1636-4461-adb3-dc706eeec950 TRADER_FIX_1 BUY 52 200 1773198028364 -TRADE f8677342-1636-4461-adb3-dc706eeec950 HOUSE_BOT-FIX_Y-SELL-1773198020186 52 200 1773198028365 -TRADE_SETTLED: f8677342-1636-4461-adb3-dc706eeec950 <-> HOUSE_BOT-FIX_Y-SELL-1773198020186 -ORDER_PLACED: HOUSE_BOT-FIX_Y-BUY-1773198028367 -ORDER HOUSE_BOT-FIX_Y-BUY-1773198028367 HOUSE_BOT BUY 48 500 1773198028367 -ORDER_PLACED: HOUSE_BOT-FIX_Y-SELL-1773198028367 -ORDER HOUSE_BOT-FIX_Y-SELL-1773198028367 HOUSE_BOT SELL 52 500 1773198028367 -ORDER_PLACED: HOUSE_BOT-FIX_N-BUY-1773198028367 -ORDER HOUSE_BOT-FIX_N-BUY-1773198028367 HOUSE_BOT BUY 48 500 1773198028367 -ORDER_PLACED: HOUSE_BOT-FIX_N-SELL-1773198028367 -ORDER HOUSE_BOT-FIX_N-SELL-1773198028367 HOUSE_BOT SELL 52 500 1773198028367 -ORDER_PLACED: 707308a4-f067-4714-9362-c8d710a9bdd0 -ORDER 707308a4-f067-4714-9362-c8d710a9bdd0 TRADER_FIX_2 BUY 52 150 1773198028381 -TRADE 707308a4-f067-4714-9362-c8d710a9bdd0 HOUSE_BOT-FIX_N-SELL-1773198028367 52 150 1773198028382 -TRADE_SETTLED: 707308a4-f067-4714-9362-c8d710a9bdd0 <-> HOUSE_BOT-FIX_N-SELL-1773198028367 -ORDER_PLACED: HOUSE_BOT-FIX_Y-BUY-1773198028382 -ORDER HOUSE_BOT-FIX_Y-BUY-1773198028382 HOUSE_BOT BUY 48 500 1773198028382 -ORDER_PLACED: HOUSE_BOT-FIX_Y-SELL-1773198028383 -ORDER HOUSE_BOT-FIX_Y-SELL-1773198028383 HOUSE_BOT SELL 52 500 1773198028383 -ORDER_PLACED: HOUSE_BOT-FIX_N-BUY-1773198028383 -ORDER HOUSE_BOT-FIX_N-BUY-1773198028383 HOUSE_BOT BUY 48 500 1773198028383 -ORDER_PLACED: HOUSE_BOT-FIX_N-SELL-1773198028383 -ORDER HOUSE_BOT-FIX_N-SELL-1773198028383 HOUSE_BOT SELL 52 500 1773198028383 -ORDER_PLACED: HOUSE_BOT-PROD_Y-BUY-1773198230862 -ORDER HOUSE_BOT-PROD_Y-BUY-1773198230862 HOUSE_BOT BUY 48 500 1773198230862 -ORDER_PLACED: HOUSE_BOT-PROD_Y-SELL-1773198230867 -ORDER HOUSE_BOT-PROD_Y-SELL-1773198230867 HOUSE_BOT SELL 52 500 1773198230867 -ORDER_PLACED: HOUSE_BOT-PROD_N-BUY-1773198230867 -ORDER HOUSE_BOT-PROD_N-BUY-1773198230867 HOUSE_BOT BUY 48 500 1773198230867 -ORDER_PLACED: HOUSE_BOT-PROD_N-SELL-1773198230868 -ORDER HOUSE_BOT-PROD_N-SELL-1773198230868 HOUSE_BOT SELL 52 500 1773198230868 -ORDER_PLACED: e64d3874-e13d-4baa-863d-a6a0a16d24c1 -ORDER e64d3874-e13d-4baa-863d-a6a0a16d24c1 PROD_TRADER_1 BUY 52 300 1773198322127 -TRADE e64d3874-e13d-4baa-863d-a6a0a16d24c1 HOUSE_BOT-PROD_Y-SELL-1773198230867 52 300 1773198322128 -TRADE_SETTLED: e64d3874-e13d-4baa-863d-a6a0a16d24c1 <-> HOUSE_BOT-PROD_Y-SELL-1773198230867 -ORDER_PLACED: HOUSE_BOT-PROD_Y-BUY-1773198322130 -ORDER HOUSE_BOT-PROD_Y-BUY-1773198322130 HOUSE_BOT BUY 48 500 1773198322130 -ORDER_PLACED: HOUSE_BOT-PROD_Y-SELL-1773198322130 -ORDER HOUSE_BOT-PROD_Y-SELL-1773198322130 HOUSE_BOT SELL 52 500 1773198322130 -ORDER_PLACED: HOUSE_BOT-PROD_N-BUY-1773198322130 -ORDER HOUSE_BOT-PROD_N-BUY-1773198322130 HOUSE_BOT BUY 48 500 1773198322130 -ORDER_PLACED: HOUSE_BOT-PROD_N-SELL-1773198322130 -ORDER HOUSE_BOT-PROD_N-SELL-1773198322130 HOUSE_BOT SELL 52 500 1773198322130 -ORDER_PLACED: 18f747fb-7173-4f44-956b-92a9140b7581 -ORDER 18f747fb-7173-4f44-956b-92a9140b7581 PROD_TRADER_2 BUY 52 200 1773198417372 -TRADE 18f747fb-7173-4f44-956b-92a9140b7581 HOUSE_BOT-PROD_N-SELL-1773198322130 52 200 1773198417373 -TRADE_SETTLED: 18f747fb-7173-4f44-956b-92a9140b7581 <-> HOUSE_BOT-PROD_N-SELL-1773198322130 -ORDER_PLACED: HOUSE_BOT-PROD_Y-BUY-1773198417376 -ORDER HOUSE_BOT-PROD_Y-BUY-1773198417376 HOUSE_BOT BUY 48 500 1773198417376 -ORDER_PLACED: HOUSE_BOT-PROD_Y-SELL-1773198417376 -ORDER HOUSE_BOT-PROD_Y-SELL-1773198417376 HOUSE_BOT SELL 52 500 1773198417376 -ORDER_PLACED: HOUSE_BOT-PROD_N-BUY-1773198417376 -ORDER HOUSE_BOT-PROD_N-BUY-1773198417376 HOUSE_BOT BUY 48 500 1773198417376 -ORDER_PLACED: HOUSE_BOT-PROD_N-SELL-1773198417376 -ORDER HOUSE_BOT-PROD_N-SELL-1773198417376 HOUSE_BOT SELL 52 500 1773198417376 -ORDER_PLACED: 51ab4eef-3879-4bad-a89d-49b32f218615 -ORDER 51ab4eef-3879-4bad-a89d-49b32f218615 PROD_TRADER_1 BUY 52 150 1773198496269 -TRADE 51ab4eef-3879-4bad-a89d-49b32f218615 HOUSE_BOT-PROD_Y-SELL-1773198417376 52 150 1773198496271 -TRADE_SETTLED: 51ab4eef-3879-4bad-a89d-49b32f218615 <-> HOUSE_BOT-PROD_Y-SELL-1773198417376 -ORDER_PLACED: HOUSE_BOT-PROD_Y-BUY-1773198496275 -ORDER HOUSE_BOT-PROD_Y-BUY-1773198496275 HOUSE_BOT BUY 48 500 1773198496275 -ORDER_PLACED: HOUSE_BOT-PROD_Y-SELL-1773198496275 -ORDER HOUSE_BOT-PROD_Y-SELL-1773198496275 HOUSE_BOT SELL 52 500 1773198496275 -ORDER_PLACED: HOUSE_BOT-PROD_N-BUY-1773198496275 -ORDER HOUSE_BOT-PROD_N-BUY-1773198496275 HOUSE_BOT BUY 48 500 1773198496275 -ORDER_PLACED: HOUSE_BOT-PROD_N-SELL-1773198496275 -ORDER HOUSE_BOT-PROD_N-SELL-1773198496275 HOUSE_BOT SELL 52 500 1773198496275 -ORDER_PLACED: HOUSE_BOT-HIGH_Y-BUY-1773271518730 -ORDER HOUSE_BOT-HIGH_Y-BUY-1773271518730 HOUSE_BOT BUY 49 500 1773271518730 -ORDER_PLACED: HOUSE_BOT-HIGH_Y-SELL-1773271518733 -ORDER HOUSE_BOT-HIGH_Y-SELL-1773271518733 HOUSE_BOT SELL 51 500 1773271518733 -ORDER_PLACED: HOUSE_BOT-HIGH_N-BUY-1773271518734 -ORDER HOUSE_BOT-HIGH_N-BUY-1773271518734 HOUSE_BOT BUY 49 500 1773271518734 -ORDER_PLACED: HOUSE_BOT-HIGH_N-SELL-1773271518734 -ORDER HOUSE_BOT-HIGH_N-SELL-1773271518734 HOUSE_BOT SELL 51 500 1773271518734 -ORDER_PLACED: HOUSE_BOT-LOW_Y-BUY-1773271518765 -ORDER HOUSE_BOT-LOW_Y-BUY-1773271518765 HOUSE_BOT BUY 49 500 1773271518765 -ORDER_PLACED: HOUSE_BOT-LOW_Y-SELL-1773271518766 -ORDER HOUSE_BOT-LOW_Y-SELL-1773271518766 HOUSE_BOT SELL 51 500 1773271518766 -ORDER_PLACED: HOUSE_BOT-LOW_N-BUY-1773271518766 -ORDER HOUSE_BOT-LOW_N-BUY-1773271518766 HOUSE_BOT BUY 49 500 1773271518766 -ORDER_PLACED: HOUSE_BOT-LOW_N-SELL-1773271518766 -ORDER HOUSE_BOT-LOW_N-SELL-1773271518766 HOUSE_BOT SELL 51 500 1773271518766 -ORDER_PLACED: 679b5ac5-a1f1-4a2a-8a7f-4678f47ca89d -ORDER 679b5ac5-a1f1-4a2a-8a7f-4678f47ca89d LIQUIDITY_TRADER BUY 52 100 1773271525752 -TRADE 679b5ac5-a1f1-4a2a-8a7f-4678f47ca89d HOUSE_BOT-LOW_Y-SELL-1773271518766 51 100 1773271525752 -TRADE_SETTLED: 679b5ac5-a1f1-4a2a-8a7f-4678f47ca89d <-> HOUSE_BOT-LOW_Y-SELL-1773271518766 -ORDER_PLACED: HOUSE_BOT-LOW_Y-BUY-1773271525754 -ORDER HOUSE_BOT-LOW_Y-BUY-1773271525754 HOUSE_BOT BUY 51 500 1773271525754 -ORDER_PLACED: HOUSE_BOT-LOW_Y-SELL-1773271525754 -ORDER HOUSE_BOT-LOW_Y-SELL-1773271525754 HOUSE_BOT SELL 53 500 1773271525754 -ORDER_PLACED: HOUSE_BOT-LOW_N-BUY-1773271525754 -ORDER HOUSE_BOT-LOW_N-BUY-1773271525754 HOUSE_BOT BUY 47 500 1773271525754 -ORDER_PLACED: HOUSE_BOT-LOW_N-SELL-1773271525754 -ORDER HOUSE_BOT-LOW_N-SELL-1773271525754 HOUSE_BOT SELL 49 500 1773271525754 -<<<<<<< HEAD -ORDER_PLACED: HOUSE_BOT-EVENT_Y-BUY-1773272988202 -ORDER HOUSE_BOT-EVENT_Y-BUY-1773272988202 HOUSE_BOT BUY 49 500 1773272988202 -ORDER_PLACED: HOUSE_BOT-EVENT_Y-SELL-1773272988206 -ORDER HOUSE_BOT-EVENT_Y-SELL-1773272988206 HOUSE_BOT SELL 51 500 1773272988206 -ORDER_PLACED: HOUSE_BOT-EVENT_N-BUY-1773272988206 -ORDER HOUSE_BOT-EVENT_N-BUY-1773272988206 HOUSE_BOT BUY 49 500 1773272988206 -ORDER_PLACED: HOUSE_BOT-EVENT_N-SELL-1773272988206 -ORDER HOUSE_BOT-EVENT_N-SELL-1773272988206 HOUSE_BOT SELL 51 500 1773272988206 -ORDER_PLACED: cfcf2488-6beb-4bee-a72b-dd76e143af4d -ORDER cfcf2488-6beb-4bee-a72b-dd76e143af4d STOCK_TRADER BUY 52 100 1773272994015 -TRADE cfcf2488-6beb-4bee-a72b-dd76e143af4d HOUSE_BOT-EVENT_Y-SELL-1773272988206 51 100 1773272994015 -TRADE_SETTLED: cfcf2488-6beb-4bee-a72b-dd76e143af4d <-> HOUSE_BOT-EVENT_Y-SELL-1773272988206 -ORDER_PLACED: HOUSE_BOT-EVENT_Y-BUY-1773272994020 -ORDER HOUSE_BOT-EVENT_Y-BUY-1773272994020 HOUSE_BOT BUY 49 500 1773272994020 -ORDER_PLACED: HOUSE_BOT-EVENT_Y-SELL-1773272994021 -ORDER HOUSE_BOT-EVENT_Y-SELL-1773272994021 HOUSE_BOT SELL 51 500 1773272994021 -ORDER_PLACED: HOUSE_BOT-EVENT_N-BUY-1773272994021 -ORDER HOUSE_BOT-EVENT_N-BUY-1773272994021 HOUSE_BOT BUY 49 500 1773272994021 -ORDER_PLACED: HOUSE_BOT-EVENT_N-SELL-1773272994021 -ORDER HOUSE_BOT-EVENT_N-SELL-1773272994021 HOUSE_BOT SELL 51 500 1773272994021 -ORDER_PLACED: 528ff941-d66a-495e-9f51-687ce8ec7d84 -ORDER 528ff941-d66a-495e-9f51-687ce8ec7d84 STOCK_TRADER BUY 150 10 1773272994036 -======= ->>>>>>> cb3b478 ( liquidity feature parameter/arg added! and latest final ready max1) diff --git a/matching-engine/matching-engine.iml b/matching-engine/matching-engine.iml deleted file mode 100644 index 867655b..0000000 --- a/matching-engine/matching-engine.iml +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/matching-engine/pom.xml b/matching-engine/pom.xml deleted file mode 100644 index 8e0bcd4..0000000 --- a/matching-engine/pom.xml +++ /dev/null @@ -1,50 +0,0 @@ - - - 4.0.0 - - - org.springframework.boot - spring-boot-starter-parent - 3.2.2 - - - - org.example - matching-engine - 1.0-SNAPSHOT - - - - - org.example - common - 1.0-SNAPSHOT - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-validation - - - org.projectlombok - lombok - true - - - org.springframework.boot - spring-boot-starter - - - - org.junit.jupiter - junit-jupiter - 5.10.0 - test - - - \ No newline at end of file diff --git a/matching-engine/src/main/java/org/example/matching/Wallets/InMemoryWalletService.java b/matching-engine/src/main/java/org/example/matching/Wallets/InMemoryWalletService.java deleted file mode 100644 index 3c692ba..0000000 --- a/matching-engine/src/main/java/org/example/matching/Wallets/InMemoryWalletService.java +++ /dev/null @@ -1,147 +0,0 @@ -package org.example.matching.Wallets; - -import lombok.RequiredArgsConstructor; -import org.example.matching.model.Order; -import org.example.matching.model.Reservation; -import org.example.matching.model.Trade; -import org.example.matching.model.Wallet; -import org.example.matching.orderbook.OrderRepository; -import org.springframework.stereotype.Service; // Add this import - -import java.util.Collection; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -@Service // Tells Spring this is a managed bean -@RequiredArgsConstructor -public class InMemoryWalletService implements WalletService { - - private final Map wallets = new ConcurrentHashMap<>(); - private final Map reservations = new ConcurrentHashMap<>(); - private final OrderRepository orderRepository; - private final String INSTRUMENT = "MARKET"; - - private Wallet ensureWallet(String userId) { - return wallets.computeIfAbsent(userId, k -> new Wallet(userId)); - } - - @Override - public boolean reserveForOrder(Order order) { - String userId = order.getUserId(); - String instrument = order.getInstrument(); - Wallet w = ensureWallet(userId); - - if (order.getSide().name().equals("BUY")) { - long required = order.getPrice() * (long) order.getQuantity(); - if (!w.tryReserveCash(required)) return false; - - Reservation r = new Reservation(order.getId(), userId, order.getPrice(), order.getQuantity(), true, instrument); - r.setReservedCash(required); - reservations.put(order.getId(), r); - } else { - if (!w.tryReserveShares(instrument, order.getQuantity())) return false; - - Reservation r = new Reservation(order.getId(), userId, order.getPrice(), order.getQuantity(), false, instrument); - r.setReservedShares(order.getQuantity()); - reservations.put(order.getId(), r); - } - return true; - } - - -@Override -public void releaseReservation(String orderId){ - Reservation r = reservations.remove(orderId); - if(r==null)return; - Wallet w = ensureWallet(r.getUserId()); - if(r.getIsBuy()){ - w.releaseReserveCash(r.getReservedCash()); - - }else{ - w.releaseReservedShares(r.getInstrument(),r.getReservedShares()); - - } - } - - @Override - public void creditUserShares(String userId, long shares) { - Wallet w = ensureWallet(userId); - w.addAvailableShares(INSTRUMENT, shares); - } - - @Override - public void creditUserShares(String userId, String instrument, long shares) { - Wallet w = ensureWallet(userId); - w.addAvailableShares(instrument, shares); - } - - @Override - public void creditUserCash(String userId, long cash) { - Wallet w = ensureWallet(userId); - w.addAvailableCash(cash); - } - - @Override - public Wallet getWallet(String userId) { - return wallets.get(userId); - } - - @Override - public void settleTrade(Trade trade) { - Order buy = orderRepository.findById(trade.getBuyOrderId()).orElse(null); - Order sell = orderRepository.findById(trade.getSellOrderId()).orElse(null); - - if (buy == null || sell == null) return; - - Wallet buyerWallet = ensureWallet(buy.getUserId()); - Wallet sellerWallet = ensureWallet(sell.getUserId()); - Reservation buyRes = reservations.get(buy.getId()); - Reservation sellRes = reservations.get(sell.getId()); - - int qty = (int) trade.getQuantity(); - long tradeValue = trade.getPrice() * (long) qty; - String instrument = buy.getInstrument(); - // Process Buy Side - if (buyRes != null) { - long cashtoDebitFromReserved = buyRes.reduceBy(qty); - buyerWallet.debitReservedCash(cashtoDebitFromReserved); - - long refund = cashtoDebitFromReserved - tradeValue; - if (refund > 0) { - buyerWallet.addAvailableCash(refund); - } - // Add back the remaining available cash that was tied up in reservation - // Available cash before reservation = current available + reserved - long totalCost = tradeValue; - long availableBeforeReservation = buyerWallet.getAvailableCash() + cashtoDebitFromReserved; - long shouldHaveAvailable = availableBeforeReservation - totalCost + refund; - long currentAvailable = buyerWallet.getAvailableCash(); - long cashToAdd = shouldHaveAvailable - currentAvailable; - if (cashToAdd > 0) { - buyerWallet.addAvailableCash(cashToAdd); - } - - buyerWallet.addAvailableShares(instrument, qty); - } - - // Process Sell Side - if (sellRes != null) { - sellRes.reduceBy(qty); - sellerWallet.debitReservedShares(instrument, (long) qty); - sellerWallet.addAvailableCash(tradeValue); - } - - // Cleanup completed reservations - if (buyRes != null && buyRes.getRemainingQty() == 0) { - reservations.remove(buy.getId()); - } - if (sellRes != null && sellRes.getRemainingQty() == 0) { - reservations.remove(sell.getId()); - } - } - - @Override - public Collection getAllWallets() { - return wallets.values(); - } -} \ No newline at end of file diff --git a/matching-engine/src/main/java/org/example/matching/Wallets/RiskManager.java b/matching-engine/src/main/java/org/example/matching/Wallets/RiskManager.java deleted file mode 100644 index a452b8a..0000000 --- a/matching-engine/src/main/java/org/example/matching/Wallets/RiskManager.java +++ /dev/null @@ -1,34 +0,0 @@ -package org.example.matching.Wallets; - -import lombok.AllArgsConstructor; -import org.example.matching.model.Order; -import org.example.matching.orderbook.OrderRepository; -import org.springframework.stereotype.Service; - -@Service -public class RiskManager { - - private final WalletService walletService; - private final OrderRepository orderRepository; // 1. Add the field - - // No-arg constructor for Main.java usage - public RiskManager() { - this.walletService = null; - this.orderRepository = null; - } - - // Constructor for dependency injection - public RiskManager(WalletService walletService, OrderRepository orderRepository) { - this.walletService = walletService; - this.orderRepository = orderRepository; - } - - - public boolean checkAndReserve(Order order) { - // currently just delegates to walletService which performs the reserve attempt - //orderRepository.save(order); - - // 2. NOW ATTEMPT TO RESERVE - return walletService.reserveForOrder(order); - } -} \ No newline at end of file diff --git a/matching-engine/src/main/java/org/example/matching/Wallets/WalletService.java b/matching-engine/src/main/java/org/example/matching/Wallets/WalletService.java deleted file mode 100644 index c6f6f87..0000000 --- a/matching-engine/src/main/java/org/example/matching/Wallets/WalletService.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.example.matching.Wallets; - -import org.example.matching.model.Order; -import org.example.matching.model.Trade; -import org.example.matching.model.Wallet; - -public interface WalletService { - boolean reserveForOrder(Order order); - void releaseReservation(String orderId); - void settleTrade(Trade trade); - - // Additional methods needed for testing and API - void creditUserShares(String userId, long shares); - void creditUserShares(String userId, String instrument, long shares); - void creditUserCash(String userId, long cash); - Wallet getWallet(String userId); - java.util.Collection getAllWallets(); -} diff --git a/matching-engine/src/main/java/org/example/matching/api/controller/EventController.java b/matching-engine/src/main/java/org/example/matching/api/controller/EventController.java deleted file mode 100644 index 4bea993..0000000 --- a/matching-engine/src/main/java/org/example/matching/api/controller/EventController.java +++ /dev/null @@ -1,47 +0,0 @@ -package org.example.matching.api.controller; - -import jdk.jfr.Event; -import lombok.RequiredArgsConstructor; -import org.example.matching.api.dto.EventRequest; -import org.example.matching.api.dto.MarketEvent; -import org.example.matching.api.service.MarketManagmentService; -import org.example.matching.api.service.SettlementService; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -@RestController -@RequestMapping("/api/events") -@RequiredArgsConstructor -public class EventController { - private final MarketManagmentService managementService; - private final SettlementService settlementService; - - @PostMapping("/create") - public ResponseEntity create(@RequestBody EventRequest req) { - MarketEvent event = managementService.createEvent( - req.getId(), - req.getQuestions(), - req.getYesTicker(), - req.getNoTicker(), - req.getExpiry(), - req.getLiquidity() - ); - return ResponseEntity.ok(event); - } - - @GetMapping("/{id}") - public ResponseEntity getEvent(@PathVariable String id) { - MarketEvent event = managementService.getEvent(id); - if (event == null) { - return ResponseEntity.notFound().build(); - } - return ResponseEntity.ok(event); - } - - @PostMapping("/{id}/settle/{outcome}") - public ResponseEntity settle(@PathVariable String id, @PathVariable String outcome) { - settlementService.settleEvent(id, outcome); - return ResponseEntity.ok("Event " + id + " settled with outcome: " + outcome); - - } -} \ No newline at end of file diff --git a/matching-engine/src/main/java/org/example/matching/api/controller/MarketController.java b/matching-engine/src/main/java/org/example/matching/api/controller/MarketController.java deleted file mode 100644 index 3efdcc3..0000000 --- a/matching-engine/src/main/java/org/example/matching/api/controller/MarketController.java +++ /dev/null @@ -1,46 +0,0 @@ -package org.example.matching.api.controller; - -import lombok.RequiredArgsConstructor; -import org.example.matching.api.dto.MarketEvent; -import org.example.matching.api.dto.OrderBookResponse; -import org.example.matching.api.service.MarketDataService; -import org.example.matching.api.service.MarketManagmentService; -import org.example.matching.matching.MatchingEngine; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.util.List; -import java.util.Map; - -@RequestMapping("/api/market") -@RestController -@RequiredArgsConstructor -public class MarketController { - private final MatchingEngine matchingEngine; - private final MarketDataService marketDataService; - private final MarketManagmentService marketManagmentService; - -// public MarketController(MatchingEngine matchingEngine) { -// this.matchingEngine = matchingEngine; -// } - - @GetMapping("/orderbook/{instrument}") - public ResponseEntity getOrderBook(@PathVariable String instrument) { - OrderBookResponse snapshot = matchingEngine.getSnapshot(instrument); - return ResponseEntity.ok(snapshot); - } - - @GetMapping("/ticker/{instrument}") - public ResponseEntity> getTicker(@PathVariable String instrument){ - return ResponseEntity.ok(marketDataService.getSnapshots(instrument.toUpperCase())); - } - - @GetMapping("/active") - public ResponseEntity> getActiveEvents() { - List activeEvents = marketManagmentService.getAllOpenEvents().stream().toList(); - return ResponseEntity.ok(activeEvents); - } -} diff --git a/matching-engine/src/main/java/org/example/matching/api/controller/OrderController.java b/matching-engine/src/main/java/org/example/matching/api/controller/OrderController.java deleted file mode 100644 index 7e6dacd..0000000 --- a/matching-engine/src/main/java/org/example/matching/api/controller/OrderController.java +++ /dev/null @@ -1,39 +0,0 @@ -package org.example.matching.api.controller; - -import jakarta.validation.Valid; -import lombok.RequiredArgsConstructor; -import org.example.matching.api.dto.OrderRequest; -import org.example.matching.api.dto.OrderResponse; -import org.example.matching.api.service.OrderService; -import org.example.matching.model.Order; -import org.example.matching.orderbook.OrderRepository; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -import javax.swing.text.html.parser.Entity; -import java.util.Optional; - -@RestController -@RequestMapping("/api/orders") -@RequiredArgsConstructor -public class OrderController { -private final OrderService orderService; -private final OrderRepository orderRepository; - - @PostMapping - public ResponseEntity placeOrder(@Valid @RequestBody OrderRequest request) { - OrderResponse response = orderService.processOrder(request); - - if (response.getStatus().equals("REJECTED")) { - return ResponseEntity.badRequest().body(response); - } - return ResponseEntity.ok(response); - } - - @GetMapping("/{id}") - public ResponseEntity getOrder(@PathVariable String id){ - return orderRepository.findById(id) - .map(ResponseEntity::ok) - .orElse(ResponseEntity.notFound().build()); - -}} diff --git a/matching-engine/src/main/java/org/example/matching/api/controller/WalletController.java b/matching-engine/src/main/java/org/example/matching/api/controller/WalletController.java deleted file mode 100644 index 2b0b3ba..0000000 --- a/matching-engine/src/main/java/org/example/matching/api/controller/WalletController.java +++ /dev/null @@ -1,59 +0,0 @@ -package org.example.matching.api.controller; - -import lombok.RequiredArgsConstructor; -import org.example.matching.Wallets.WalletService; -import org.example.matching.api.dto.DepositRequest; -import org.example.matching.api.dto.WalletResponse; -import org.example.matching.model.Wallet; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -import java.util.Map; -import java.util.stream.Collectors; - -@RestController -@RequestMapping("/api/wallets") -@RequiredArgsConstructor -public class WalletController { - - private final WalletService walletService; - - @GetMapping("/{userId}") - public ResponseEntity getWallet(@PathVariable String userId){ - Wallet wallet = walletService.getWallet(userId); - - // Convert AtomicLong maps to Long maps for JSON response - Map availableShares = wallet.getAvailableShares().entrySet().stream() - .collect(Collectors.toMap( - Map.Entry::getKey, - entry -> entry.getValue().get() - )); - - Map reservedShares = wallet.getReservedShares().entrySet().stream() - .collect(Collectors.toMap( - Map.Entry::getKey, - entry -> entry.getValue().get() - )); - - WalletResponse response = WalletResponse.builder() - .userId(userId) - .availableCash(wallet.getAvailableCash()) - .reservedCash(wallet.getReservedCash()) - .availableShares(availableShares) - .reservedShares(reservedShares) - .build(); - return ResponseEntity.ok(response); - } - @PostMapping("/depositCash") - public ResponseEntity depositCash(@RequestBody DepositRequest request) { - walletService.creditUserCash(request.getUserId(), request.getAmount()); - return ResponseEntity.ok("Deposit Successful"); - } - - @PostMapping("/depositShares") - public ResponseEntity depositShares(@RequestBody DepositRequest request) { - // Credit shares for the specific instrument - walletService.creditUserShares(request.getUserId(), request.getInstrument(), request.getAmount()); - return ResponseEntity.ok("Shares Deposited Successfully"); - } -} \ No newline at end of file diff --git a/matching-engine/src/main/java/org/example/matching/api/dto/DepositRequest.java b/matching-engine/src/main/java/org/example/matching/api/dto/DepositRequest.java deleted file mode 100644 index 875f533..0000000 --- a/matching-engine/src/main/java/org/example/matching/api/dto/DepositRequest.java +++ /dev/null @@ -1,26 +0,0 @@ -package org.example.matching.api.dto; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@NoArgsConstructor -@AllArgsConstructor -public class DepositRequest { - private String userId; - private long amount; - private String instrument; // Optional: used if depositing shares instead of cash - - public String getUserId() { - return userId; - } - - public long getAmount() { - return amount; - } - - public String getInstrument() { - return instrument; - } -} diff --git a/matching-engine/src/main/java/org/example/matching/api/dto/EventRequest.java b/matching-engine/src/main/java/org/example/matching/api/dto/EventRequest.java deleted file mode 100644 index 0f4d8dc..0000000 --- a/matching-engine/src/main/java/org/example/matching/api/dto/EventRequest.java +++ /dev/null @@ -1,19 +0,0 @@ -package org.example.matching.api.dto; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class EventRequest { - private String id; - private String questions; - private String yesTicker; - private String noTicker; - private int expiry; // minutes from now - private Long liquidity; // Optional - defaults to 10000 if not provided -} \ No newline at end of file diff --git a/matching-engine/src/main/java/org/example/matching/api/dto/MarketEvent.java b/matching-engine/src/main/java/org/example/matching/api/dto/MarketEvent.java deleted file mode 100644 index 0cc6eb7..0000000 --- a/matching-engine/src/main/java/org/example/matching/api/dto/MarketEvent.java +++ /dev/null @@ -1,42 +0,0 @@ -package org.example.matching.api.dto; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; -import org.example.matching.api.dto.enums.EventStatus; - -import java.time.LocalDateTime; -import java.util.concurrent.atomic.AtomicLong; - -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class MarketEvent { - private String eventID; - private String questions; - private String yesTicker; - private String noTicker; - private LocalDateTime expiry; - private EventStatus status; - private String outcome; - private long liquidity; - - // This is the ONLY thing that drives price. Starts at 0. - private final AtomicLong virtualNetSold = new AtomicLong(0); - - // Getter for the virtual counter - public AtomicLong getVirtualNetSold() { - return virtualNetSold; - } - - // Fix the field name typo - public String getEventID() { - return eventID; - } - - public void setEventID(String eventID) { - this.eventID = eventID; - } -} \ No newline at end of file diff --git a/matching-engine/src/main/java/org/example/matching/api/dto/OrderBookResponse.java b/matching-engine/src/main/java/org/example/matching/api/dto/OrderBookResponse.java deleted file mode 100644 index ce2e349..0000000 --- a/matching-engine/src/main/java/org/example/matching/api/dto/OrderBookResponse.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.example.matching.api.dto; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.util.List; - -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class OrderBookResponse { - private String instrument; - private List bids; - private List asks; -} diff --git a/matching-engine/src/main/java/org/example/matching/api/dto/OrderMapper.java b/matching-engine/src/main/java/org/example/matching/api/dto/OrderMapper.java deleted file mode 100644 index 5368db0..0000000 --- a/matching-engine/src/main/java/org/example/matching/api/dto/OrderMapper.java +++ /dev/null @@ -1,28 +0,0 @@ -package org.example.matching.api.dto; - -import org.example.matching.model.Order; -import org.example.matching.model.OrderSide; - -import java.util.UUID; - -public class OrderMapper { - public static Order toDomain(OrderRequest request) { - String orderId; - if ("HOUSE_BOT".equals(request.getUserId())) { - orderId = "HOUSE_BOT-" + request.getInstrument() + "-" + request.getSide() + "-" + System.currentTimeMillis(); - } else { - orderId = UUID.randomUUID().toString(); - } - - Order order = new Order( - orderId, - request.getUserId(), - request.getPrice(), - (int) request.getQuantity(), - System.currentTimeMillis(), - OrderSide.valueOf(request.getSide().toUpperCase()) - ); - order.setInstrument(request.getInstrument()); - return order; - } -} \ No newline at end of file diff --git a/matching-engine/src/main/java/org/example/matching/api/dto/OrderRequest.java b/matching-engine/src/main/java/org/example/matching/api/dto/OrderRequest.java deleted file mode 100644 index eba85b9..0000000 --- a/matching-engine/src/main/java/org/example/matching/api/dto/OrderRequest.java +++ /dev/null @@ -1,57 +0,0 @@ -package org.example.matching.api.dto; - -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.Pattern; -import jakarta.validation.constraints.Positive; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.Getter; - -@AllArgsConstructor -@NoArgsConstructor -@Data -@Getter -public class OrderRequest { - @NotBlank(message = "User ID is required") - private String userId; - - @NotBlank(message = "Instrument is required") - private String instrument; - - @Pattern(regexp = "BUY|SELL", message = "Side must be BUY or SELL") - private String side; - - @Positive(message = "Price must be greater than zero") - private long price; - - @Positive(message = "Quantity must be greater than zero") - private long quantity; - - @NotBlank(message = "Idempotency key is required") - private String idempotencyKey; // Unique string from the frontend - - public String getUserId() { - return userId; - } - - public String getInstrument() { - return instrument; - } - - public String getSide() { - return side; - } - - public long getPrice() { - return price; - } - - public long getQuantity() { - return quantity; - } - - public String getIdempotencyKey() { - return idempotencyKey; - } -} \ No newline at end of file diff --git a/matching-engine/src/main/java/org/example/matching/api/dto/OrderResponse.java b/matching-engine/src/main/java/org/example/matching/api/dto/OrderResponse.java deleted file mode 100644 index f9013fe..0000000 --- a/matching-engine/src/main/java/org/example/matching/api/dto/OrderResponse.java +++ /dev/null @@ -1,21 +0,0 @@ -package org.example.matching.api.dto; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class OrderResponse { - private String orderId; - private String status; // "ACCEPTED", "REJECTED" - private String message; // "Insufficient funds" or "Success" - private long timestamp; - - public String getStatus() { - return status; - } -} \ No newline at end of file diff --git a/matching-engine/src/main/java/org/example/matching/api/dto/PriceLevel.java b/matching-engine/src/main/java/org/example/matching/api/dto/PriceLevel.java deleted file mode 100644 index 42a886a..0000000 --- a/matching-engine/src/main/java/org/example/matching/api/dto/PriceLevel.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.example.matching.api.dto; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@NoArgsConstructor -@AllArgsConstructor -public class PriceLevel { - private Long price; - private Long quantity; -} diff --git a/matching-engine/src/main/java/org/example/matching/api/dto/WalletResponse.java b/matching-engine/src/main/java/org/example/matching/api/dto/WalletResponse.java deleted file mode 100644 index ef95c21..0000000 --- a/matching-engine/src/main/java/org/example/matching/api/dto/WalletResponse.java +++ /dev/null @@ -1,20 +0,0 @@ -package org.example.matching.api.dto; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.util.Map; - -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class WalletResponse { - private String userId; - private long availableCash; - private long reservedCash; - private Map availableShares; - private Map reservedShares; -} \ No newline at end of file diff --git a/matching-engine/src/main/java/org/example/matching/api/dto/enums/EventStatus.java b/matching-engine/src/main/java/org/example/matching/api/dto/enums/EventStatus.java deleted file mode 100644 index 6680a51..0000000 --- a/matching-engine/src/main/java/org/example/matching/api/dto/enums/EventStatus.java +++ /dev/null @@ -1,7 +0,0 @@ -package org.example.matching.api.dto.enums; - -public enum EventStatus { - OPEN, - SETTLED, - CANCELLED -} diff --git a/matching-engine/src/main/java/org/example/matching/api/service/LiquidBotService.java b/matching-engine/src/main/java/org/example/matching/api/service/LiquidBotService.java deleted file mode 100644 index 0821485..0000000 --- a/matching-engine/src/main/java/org/example/matching/api/service/LiquidBotService.java +++ /dev/null @@ -1,154 +0,0 @@ -package org.example.matching.api.service; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.example.matching.api.dto.OrderRequest; -import org.example.matching.api.dto.OrderResponse; -import org.example.matching.api.dto.MarketEvent; -import org.example.matching.matching.MatchingEngine; -import org.example.matching.model.OrderSide; -import org.springframework.stereotype.Service; - -import java.util.concurrent.atomic.AtomicLong; - -@Slf4j -@Service -@RequiredArgsConstructor -public class LiquidBotService { - - private final OrderService orderService; - private final MarketManagmentService marketManagmentService; - private final MatchingEngine matchingEngine; - - private static final String BOT_ID = "HOUSE_BOT"; - private static final int SPREAD = 4; - - public void updateMarketTrigger(String ticker) { - // 🎯 KEY CHECK: Only provide liquidity for prediction markets (events), not regular stocks - if (!marketManagmentService.isEventTicker(ticker)) { - log.info("Ticker {} is not an event ticker - bot will not provide liquidity", ticker); - return; - } - - MarketEvent event = marketManagmentService.getEventByTicker(ticker); - if (event == null || event.getStatus() != org.example.matching.api.dto.enums.EventStatus.OPEN) { - // Don't provide liquidity for settled events - return; - } - - // 1. Get the displacement (starts at 0) - long netSold = event.getVirtualNetSold().get(); - long L = event.getLiquidity(); - - // 2. SIGMOID MATH (Guaranteed 50¢ if netSold is 0) - double exponent = (double) netSold / L; - long fairPriceYes = (long) (100.0 / (1.0 + Math.exp(-exponent))); - fairPriceYes = Math.max(1, Math.min(99, fairPriceYes)); - long fairPriceNo = 100 - fairPriceYes; - - // 3. SMART BOT LOGIC - Only provide liquidity if there's insufficient natural liquidity - boolean needsLiquidity = shouldProvideLiquidity(ticker, fairPriceYes, fairPriceNo); - - if (needsLiquidity) { - refreshBotOrders(event.getYesTicker(), fairPriceYes, true); - refreshBotOrders(event.getNoTicker(), fairPriceNo, false); - log.info("Bot providing liquidity for {}: YES {}¢, NO {}¢ (virtualNetSold: {})", - ticker, fairPriceYes, fairPriceNo, netSold); - } else { - // Step back - cancel bot orders when there's natural liquidity - matchingEngine.cancelAllOrdersForUser(BOT_ID, event.getYesTicker()); - matchingEngine.cancelAllOrdersForUser(BOT_ID, event.getNoTicker()); - log.info("Bot stepping back for {} - natural liquidity available", ticker); - } - } - - private boolean shouldProvideLiquidity(String ticker, long fairPriceYes, long fairPriceNo) { - // Get both order books for the event - String yesTicker = ticker.contains("_Y") ? ticker : ticker.replace("_N", "_Y"); - String noTicker = ticker.contains("_N") ? ticker : ticker.replace("_Y", "_N"); - - var yesBook = matchingEngine.getOrderBookForMarketData(yesTicker); - var noBook = matchingEngine.getOrderBookForMarketData(noTicker); - - boolean yesHasNaturalOrders = hasNaturalOrders(yesBook); - boolean noHasNaturalOrders = hasNaturalOrders(noBook); - - log.info("Liquidity check for {} - YES has natural: {}, NO has natural: {}", - ticker, yesHasNaturalOrders, noHasNaturalOrders); - - // Only provide liquidity if there's insufficient natural liquidity on either side - // But also consider if there are ANY natural orders at all - boolean hasAnyNaturalOrders = yesHasNaturalOrders || noHasNaturalOrders; - - // Step back if there are natural orders, provide liquidity if market is empty - return !hasAnyNaturalOrders; - } - - private boolean hasNaturalOrders(org.example.matching.model.OrderBook book) { - if (book.getBids().isEmpty() && book.getAsks().isEmpty()) { - return false; // Empty book - need liquidity - } - - // Check if there are orders from users other than bot - boolean naturalBids = book.getBids().values().stream().anyMatch(orders -> - orders.stream().anyMatch(order -> !order.getUserId().equals(BOT_ID))); - boolean naturalAsks = book.getAsks().values().stream().anyMatch(orders -> - orders.stream().anyMatch(order -> !order.getUserId().equals(BOT_ID))); - - log.info("Order book check - Natural bids: {}, Natural asks: {}, Total bid levels: {}, Total ask levels: {}", - naturalBids, naturalAsks, book.getBids().size(), book.getAsks().size()); - - return naturalBids || naturalAsks; - } - - // This is called by your OrderService AFTER a trade happens - public void recordTrade(String ticker, long quantity, String side) { - MarketEvent event = marketManagmentService.getEventByTicker(ticker); - if (event == null) return; - - // If a human BUYS from the bot, displacement goes UP - // If a human SELLS to the bot, displacement goes DOWN - if (side.equalsIgnoreCase("BUY")) { - event.getVirtualNetSold().addAndGet(quantity); - } else { - event.getVirtualNetSold().addAndGet(-quantity); - } - - log.info("Recorded trade: {} {} {} shares (virtualNetSold: {})", - ticker, side, quantity, event.getVirtualNetSold().get()); - - // Immediately trigger price update based on new displacement - updateMarketTrigger(ticker); - } - - private void refreshBotOrders(String ticker, long fairPrice, boolean isYesTicker) { - // Cancel all existing bot orders for this ticker - matchingEngine.cancelAllOrdersForUser(BOT_ID, ticker); - - // Place new orders with 1-cent spread around fair price for better visibility - long bidPrice = Math.max(1, fairPrice - 1); - long askPrice = Math.min(99, fairPrice + 1); - - // Place bid order (buy from users) - placeBotOrder(ticker, OrderSide.BUY, bidPrice, 500); - - // Place ask order (sell to users) - placeBotOrder(ticker, OrderSide.SELL, askPrice, 500); - } - - private void placeBotOrder(String ticker, OrderSide side, long price, long quantity) { - OrderRequest req = new OrderRequest(); - req.setUserId(BOT_ID); - req.setInstrument(ticker); - req.setSide(side.name()); - req.setPrice(price); - req.setQuantity(quantity); - req.setIdempotencyKey(BOT_ID + "-" + ticker + "-" + side + "-" + System.currentTimeMillis()); - - try { - orderService.processOrder(req); - } catch (Exception e) { - log.error("Failed to place bot order: {}", req, e); - } - } -} \ No newline at end of file diff --git a/matching-engine/src/main/java/org/example/matching/api/service/MarketDataService.java b/matching-engine/src/main/java/org/example/matching/api/service/MarketDataService.java deleted file mode 100644 index f9ec75e..0000000 --- a/matching-engine/src/main/java/org/example/matching/api/service/MarketDataService.java +++ /dev/null @@ -1,67 +0,0 @@ -package org.example.matching.api.service; - -import org.springframework.stereotype.Service; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.CopyOnWriteArrayList; - -@Service -public class MarketDataService { - //stores last price each stock is traded at - private final Map lastPrices = new ConcurrentHashMap<>(); - - // Average V(volume)WAP = sum(price*quantity)/sum(quantity) - private final Map sumPV = new ConcurrentHashMap<>(); - private final Map sumV = new ConcurrentHashMap<>(); - // To track the "Top of Book" (Best Bid/Ask) - private final Map bestBids = new ConcurrentHashMap<>(); - private final Map bestAsks = new ConcurrentHashMap<>(); - - public void UpdateTrade(String instrument, long price , long quantity){ - lastPrices.put(instrument,(double)price); - sumPV.merge(instrument,(double)(price*quantity),Double::sum); - sumV.merge(instrument,quantity,Long::sum); - } - - public void updateBookTops(String instrument, Double bestBid, Double bestAsk) { - if (bestBid != null) bestBids.put(instrument, bestBid); - if (bestAsk != null) bestAsks.put(instrument, bestAsk); - } - - - public Map getSnapshots(String instrument){ - double ltp = lastPrices.getOrDefault(instrument,0.0); - double vwap = sumV.getOrDefault(instrument,0L)==0?0: sumPV.get(instrument)/ sumV.get(instrument); - double bid = bestBids.getOrDefault(instrument, 0.0); - double ask = bestAsks.getOrDefault(instrument, 0.0); - double mid = (bid > 0 && ask > 0) ? (bid + ask) / 2.0 : ltp; - - return Map.of( - "instrument", instrument, - "lastPrice", ltp, - "vwap", vwap, - "bid", bid, - "ask", ask, - "mid", mid, - "spread", (ask - bid) - ); - } - - // A list of the last 10 prices - private final Map> priceHistory = new ConcurrentHashMap<>(); - - public void updateTrade(String instrument, long price, long quantity) { - lastPrices.put(instrument, (double) price); - - // Track History - priceHistory.computeIfAbsent(instrument, k -> new CopyOnWriteArrayList<>()) - .add(0, (double) price); // Add to the front - - // Keep only the last 10 - List history = priceHistory.get(instrument); - if (history.size() > 10) history.remove(history.size() - 1); - - // ... (rest of VWAP logic) - } -} \ No newline at end of file diff --git a/matching-engine/src/main/java/org/example/matching/api/service/MarketManagmentService.java b/matching-engine/src/main/java/org/example/matching/api/service/MarketManagmentService.java deleted file mode 100644 index e95945b..0000000 --- a/matching-engine/src/main/java/org/example/matching/api/service/MarketManagmentService.java +++ /dev/null @@ -1,99 +0,0 @@ -package org.example.matching.api.service; - -import org.example.matching.Wallets.WalletService; -import org.example.matching.api.dto.MarketEvent; -import org.example.matching.api.dto.enums.EventStatus; -import org.example.matching.api.service.LiquidBotService; -import org.springframework.context.annotation.Lazy; -import org.springframework.stereotype.Service; - -import java.time.LocalDateTime; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.atomic.AtomicLong; - -@Service -public class MarketManagmentService { - private final WalletService walletService; - private final LiquidBotService liquidBotService; - - // Stores Event by ID - private final Map events = new ConcurrentHashMap<>(); - // Stores Ticker Pairs (YES <-> NO) - private final Map tickerPairs = new ConcurrentHashMap<>(); - // NEW: Maps Tickers to the Event they belong to - private final Map tickerToEvent = new ConcurrentHashMap<>(); - - // Use constructor injection to avoid circular dependency issues - public MarketManagmentService(WalletService walletService, @Lazy LiquidBotService liquidBotService) { - this.walletService = walletService; - this.liquidBotService = liquidBotService; - } - - public void registerEvent(MarketEvent event) { - tickerPairs.put(event.getYesTicker(), event.getNoTicker()); - tickerPairs.put(event.getNoTicker(), event.getYesTicker()); - - // Map both tickers to this event object - tickerToEvent.put(event.getYesTicker(), event); - tickerToEvent.put(event.getNoTicker(), event); - } - - public String getPartnerTicker(String ticker) { - return tickerPairs.get(ticker); - } - - public MarketEvent getEvent(String id) { - return events.get(id); - } - - public MarketEvent getEventByTicker(String ticker) { - return tickerToEvent.get(ticker); - } - - // Check if ticker belongs to an event (prediction market) vs regular stock - public boolean isEventTicker(String ticker) { - return tickerToEvent.containsKey(ticker); - } - - // Check if ticker belongs to an event (prediction market) vs regular stock - public boolean isEventTicker(String ticker) { - return tickerToEvent.containsKey(ticker); - } - - public MarketEvent createEvent(String id, String question, String yesTicker, String noTicker, int minutesFromNow, Long liquidity) { - // Use provided liquidity or default to 10000 - long eventLiquidity = (liquidity != null) ? liquidity : 10000L; - - MarketEvent event = MarketEvent.builder() - .eventID(id) - .questions(question) - .yesTicker(yesTicker) - .noTicker(noTicker) - .expiry(LocalDateTime.now().plusMinutes(minutesFromNow)) - .status(EventStatus.OPEN) - .liquidity(eventLiquidity) // Use configurable liquidity - .build(); - - events.put(id, event); - registerEvent(event); // Populate the lookup maps - - // Admin can make a "mistake" here (e.g. 100,000) - // and it won't break the 50-50 start! - walletService.creditUserShares("HOUSE_BOT", yesTicker, 100000); - walletService.creditUserShares("HOUSE_BOT", noTicker, 100000); - - // Give bot cash to place BUY orders (for market making) - walletService.creditUserCash("HOUSE_BOT", 10000000); // 100,000 dollars = 10,000,000 cents - - // Force the first quote at 50/50 - liquidBotService.updateMarketTrigger(yesTicker); - return event; - } - - public java.util.Collection getAllOpenEvents() { - return events.values().stream() - .filter(event -> event.getStatus() == EventStatus.OPEN) - .collect(java.util.stream.Collectors.toList()); - } -} \ No newline at end of file diff --git a/matching-engine/src/main/java/org/example/matching/api/service/OrderService.java b/matching-engine/src/main/java/org/example/matching/api/service/OrderService.java deleted file mode 100644 index c242208..0000000 --- a/matching-engine/src/main/java/org/example/matching/api/service/OrderService.java +++ /dev/null @@ -1,120 +0,0 @@ -package org.example.matching.api.service; - -import lombok.RequiredArgsConstructor; -import org.example.matching.Wallets.RiskManager; -import org.example.matching.Wallets.WalletService; -import org.example.matching.api.dto.MarketEvent; -import org.example.matching.api.dto.OrderMapper; -import org.example.matching.api.dto.OrderRequest; -import org.example.matching.api.dto.OrderResponse; -import org.example.matching.api.dto.enums.EventStatus; -import org.example.matching.journal.EventJournal; -import org.example.matching.matching.MatchingEngine; -import org.example.matching.model.Order; -import org.example.matching.model.Trade; -import org.example.matching.orderbook.OrderRepository; -import org.springframework.beans.BeansException; -import org.springframework.context.ApplicationContext; -import org.springframework.context.ApplicationContextAware; -import org.springframework.stereotype.Service; - -import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -@Service -@RequiredArgsConstructor -public class OrderService implements ApplicationContextAware { - - private final MarketDataService marketDataService; - private final RiskManager riskManager; - private final MatchingEngine matchingEngine; - private final WalletService walletService; - private final EventJournal eventJournal; - private final OrderRepository orderRepository; - private final MarketManagmentService marketManagmentService; - - private ApplicationContext applicationContext; - private LiquidBotService liquidBotService; - - // In-memory idempotency store: Key -> Previous Response - private final Map idempotencyStore = new ConcurrentHashMap<>(); - - @Override - public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { - this.applicationContext = applicationContext; - } - - private LiquidBotService getLiquidBotService() { - if (liquidBotService == null) { - liquidBotService = applicationContext.getBean(LiquidBotService.class); - } - return liquidBotService; - } - - public OrderResponse processOrder(OrderRequest request) { - if (idempotencyStore.containsKey(request.getIdempotencyKey())) { - return idempotencyStore.get(request.getIdempotencyKey()); - } - - Order order = OrderMapper.toDomain(request); - - // Check if event is settled FIRST (before any other validation) - MarketEvent event = marketManagmentService.getEventByTicker(order.getInstrument()); - if (event != null && EventStatus.SETTLED.equals(event.getStatus())) { - return buildResponse(order, "REJECTED", "Event is settled - no more orders allowed"); - } - - if (!riskManager.checkAndReserve(order)) { - return buildResponse(order, "REJECTED", "Insufficient funds or shares"); - } - - orderRepository.save(order); - eventJournal.appendRaw("ORDER_PLACED: " + order.getId()); - - // Matching Engine execution - List trades = matchingEngine.placeOrder(order); - - for (Trade trade : trades) { - // so once trade is done manage the cash and shares of the users using their ids and stuff in walletService below - walletService.settleTrade(trade); - marketDataService.UpdateTrade(order.getInstrument(),trade.getPrice(),trade.getQuantity()); - eventJournal.appendRaw("TRADE_SETTLED: " + trade.getBuyOrderId() + " <-> " + trade.getSellOrderId()); - - // Debug: Log trade details - System.out.println("DEBUG: Trade occurred - BuyID: " + trade.getBuyOrderId() + - ", SellID: " + trade.getSellOrderId() + - ", UserID: " + order.getUserId() + - ", Side: " + order.getSide()); - - // If trade involves HOUSE_BOT, record it for virtual counter - if (order.getUserId().equals("HOUSE_BOT") || - (trade.getBuyOrderId().startsWith("HOUSE_BOT") || trade.getSellOrderId().startsWith("HOUSE_BOT"))) { - System.out.println("DEBUG: Recording trade for virtual counter"); - getLiquidBotService().recordTrade(order.getInstrument(), trade.getQuantity(), order.getSide().name()); - } else { - System.out.println("DEBUG: Trade does not involve HOUSE_BOT - skipping virtual counter"); - } - } - var book = matchingEngine.getOrderBookForMarketData(order.getInstrument()); - marketDataService.updateBookTops( - order.getInstrument(), - book.getBestBid(), - book.getBestAsk() - ); - - OrderResponse response = buildResponse(order, "ACCEPTED", "Success"); - idempotencyStore.put(request.getIdempotencyKey(), response); - return response; - } - - private OrderResponse buildResponse(Order order, String status, String msg) { - return OrderResponse.builder() - .orderId(order.getId()) - .status(status) - .message(msg) - .timestamp(System.currentTimeMillis()) - .build(); - } -} - diff --git a/matching-engine/src/main/java/org/example/matching/api/service/SettlementService.java b/matching-engine/src/main/java/org/example/matching/api/service/SettlementService.java deleted file mode 100644 index cda3ba5..0000000 --- a/matching-engine/src/main/java/org/example/matching/api/service/SettlementService.java +++ /dev/null @@ -1,69 +0,0 @@ -package org.example.matching.api.service; - -import lombok.RequiredArgsConstructor; -import org.example.matching.Wallets.RiskManager; -import org.example.matching.Wallets.WalletService; -import org.example.matching.api.dto.MarketEvent; -import org.example.matching.api.dto.enums.EventStatus; -import org.example.matching.matching.MatchingEngine; -import org.example.matching.model.Order; -import org.example.matching.model.Wallet; -import org.springframework.stereotype.Service; - -import java.util.Collection; -import java.util.List; - -@Service -@RequiredArgsConstructor -public class SettlementService { - private final WalletService walletService; - private final MarketManagmentService marketService; - private final RiskManager riskManager; - private final MatchingEngine matchingEngine; - - - public void settleEvent(String eventId, String winningOutcome){ - MarketEvent event = marketService.getEvent(eventId); - if(event==null|| event.getStatus()== EventStatus.SETTLED) return;; - - // winningTicker will get assigned the outcome , if it is yes , the winningTicker is yes and no so winningTicker is No - String winningTicker = winningOutcome.equalsIgnoreCase("YES")? event.getYesTicker():event.getNoTicker(); - - //losingTicker will get assigned the outcome , if it is yes , the losingTicker is yes and no so losingTicker is NOx - String losingTicker = winningOutcome.equalsIgnoreCase("YES")?event.getNoTicker():event.getYesTicker(); - - Collection allWallets = walletService.getAllWallets(); - - for (Wallet wallet : allWallets) { - // 2. Pay out the Winners ($1.00 per share) - - //checking how many shares of yes one has - long winningShares = wallet.getAvailableShares().containsKey(winningTicker) - ? wallet.getAvailableShares().get(winningTicker).get() - : 0L; if (winningShares > 0) { - long payout = winningShares * 100; // 100 cents = $1.00 - wallet.addAvailableCash(payout); - wallet.getAvailableShares().remove(winningTicker); - } - - // 3. Remove the Losing Shares (Worth $0) - wallet.getAvailableShares().remove(losingTicker); - } - - event.setStatus(EventStatus.SETTLED); - event.setOutcome(winningOutcome); - - // Clear order books for both tickers after settlement - refundTicker(event.getYesTicker()); - refundTicker(event.getNoTicker()); - } - - - //check if walletService or RiskManager - private void refundTicker(String ticker){ - List orders = matchingEngine.clearBook(ticker); - for (Order o:orders){ - walletService.releaseReservation(o.getId()); - } - } -} \ No newline at end of file diff --git a/matching-engine/src/main/java/org/example/matching/app/MatchingEngineApplication.java b/matching-engine/src/main/java/org/example/matching/app/MatchingEngineApplication.java deleted file mode 100644 index 3482542..0000000 --- a/matching-engine/src/main/java/org/example/matching/app/MatchingEngineApplication.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.example.matching.app; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.ComponentScan; - -@SpringBootApplication -@ComponentScan(basePackages = "org.example.matching") -public class MatchingEngineApplication { - public static void main(String[] args) { - SpringApplication.run(MatchingEngineApplication.class, args); - } -} diff --git a/matching-engine/src/main/java/org/example/matching/config/MatchingEngineConfig.java b/matching-engine/src/main/java/org/example/matching/config/MatchingEngineConfig.java deleted file mode 100644 index cb616ec..0000000 --- a/matching-engine/src/main/java/org/example/matching/config/MatchingEngineConfig.java +++ /dev/null @@ -1,37 +0,0 @@ -package org.example.matching.config; - -import org.example.matching.Wallets.InMemoryWalletService; -import org.example.matching.Wallets.RiskManager; -import org.example.matching.Wallets.WalletService; -import org.example.matching.journal.EventJournal; -import org.example.matching.matching.MatchingEngine; -import org.example.matching.orderbook.InMemoryOrderRepository; -import org.example.matching.orderbook.OrderRepository; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -@Configuration -public class MatchingEngineConfig { - - @Bean - public EventJournal eventJournal() { - return new EventJournal(); - } - - @Bean - public OrderRepository orderRepository() { - return new InMemoryOrderRepository(); - } - - @Bean - public RiskManager riskManager(WalletService walletService, OrderRepository orderRepository) { - return new RiskManager(walletService, orderRepository); - } - - @Bean - public MatchingEngine matchingEngine(OrderRepository orderRepository, - WalletService walletService, - EventJournal eventJournal) { - return new MatchingEngine(orderRepository, walletService, eventJournal); - } -} diff --git a/matching-engine/src/main/java/org/example/matching/journal/EventJournal.java b/matching-engine/src/main/java/org/example/matching/journal/EventJournal.java deleted file mode 100644 index 48d66f5..0000000 --- a/matching-engine/src/main/java/org/example/matching/journal/EventJournal.java +++ /dev/null @@ -1,100 +0,0 @@ -//import lombok.AllArgsConstructor; -// -//import java.io.FileWriter; -//import java.io.IOException; -//import java.nio.file.FileAlreadyExistsException; -//import java.nio.file.Files; -//import java.nio.file.Path; -// -//@AllArgsConstructor -//public class EventJournal { -// private final Path journalDir; -// private final Path journalFile; -// -// public EventJournal() { -// try { -// journalDir = Path.of("journals"); -// Files.createDirectories(journalDir); -// -// journalFile = Path.of("engine.log"); -// try { -// Files.createFile(journalFile); -// } catch (FileAlreadyExistsException e) { -// // File already exists, that's fine -// } -// } catch (IOException e) { -//throw new RuntimeException("failed to journal"); -// } -// -// } -// public synchronized void append(String event){ -// try(FileWriter writer = new FileWriter(journalFile.toFile(),true)){ -// writer.write(event); -// writer.write(System.lineSeparator()); -// writer.flush(); -// } catch (IOException e) { -// throw new RuntimeException("Failed to write to journal", e); -// } -// } -// } -// - -package org.example.matching.journal; - -import java.io.FileWriter; -import java.io.IOException; -import java.nio.file.*; -import java.util.List; - -public class EventJournal { - - private final Path journalDir; - private final Path journalFile; - - public EventJournal() { - try { - journalDir = Path.of("journals"); - Files.createDirectories(journalDir); - journalFile = journalDir.resolve("engine.log"); - if (!Files.exists(journalFile)) { - Files.createFile(journalFile); - } - } catch (IOException e) { - throw new RuntimeException("Failed to initialize EventJournal", e); - } - } - - public synchronized void appendRaw(String eventBody) { - try (FileWriter writer = new FileWriter(journalFile.toFile(), true)) { - writer.write(eventBody); - writer.write(System.lineSeparator()); - writer.flush(); - // for production consider FileDescriptor.sync to fsync() - } catch (IOException e) { - throw new RuntimeException("Failed to write to journal", e); - } - } - - // helpers with consistent format - public void appendOrder(String id, String user, String side, long price, int qty, long ts) { - String line = String.format("ORDER %s %s %s %d %d %d", id, user, side, price, qty, ts); - appendRaw(line); - } - - public void appendTrade(String buyId, String sellId, long price, int qty, long ts) { - String line = String.format("TRADE %s %s %d %d %d", buyId, sellId, price, qty, ts); - appendRaw(line); - } - - public List readAllLines() { - try { - return Files.readAllLines(journalFile); - } catch (IOException e) { - throw new RuntimeException("Failed to read journal", e); - } - } - - public Path getJournalFile() { - return journalFile; - } -} diff --git a/matching-engine/src/main/java/org/example/matching/matching/MatchingEngine.java b/matching-engine/src/main/java/org/example/matching/matching/MatchingEngine.java deleted file mode 100644 index f5a2ce3..0000000 --- a/matching-engine/src/main/java/org/example/matching/matching/MatchingEngine.java +++ /dev/null @@ -1,118 +0,0 @@ -package org.example.matching.matching; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.example.matching.Wallets.WalletService; -import org.example.matching.api.dto.OrderBookResponse; -import org.example.matching.api.dto.PriceLevel; -import org.example.matching.journal.EventJournal; -import org.example.matching.model.Order; -import org.example.matching.model.OrderBook; -import org.example.matching.model.OrderSide; -import org.example.matching.model.Trade; -import org.example.matching.orderbook.OrderRepository; -import org.springframework.stereotype.Service; - -import jakarta.annotation.PostConstruct; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * Matching engine is responsible for matching orders and maintaining order books. - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class MatchingEngine { - - private final OrderRepository orderRepository; - private final WalletService walletService; - private final EventJournal journal; - - private final Map orderBooks = new HashMap<>(); - - @PostConstruct - public void init() { - // Pre-create books for stocks you want to test - orderBooks.put("AAPL", new OrderBook()); - orderBooks.put("TSLA", new OrderBook()); - orderBooks.put("BTC", new OrderBook()); - } - - public OrderBookResponse getSnapshot(String instrument) { - OrderBook book = getOrderBook(instrument); - return OrderBookResponse.builder() - .instrument(instrument) - .bids(getPriceLevels(book.getBids())) - .asks(getPriceLevels(book.getAsks())) - .build(); - } - - public OrderBook getOrderBookForMarketData(String instrument) { - return orderBooks.getOrDefault(instrument, new OrderBook()); - } - - public List placeOrder(Order order) { - return placeOrder(order, true); - } - - public List placeOrder(Order order, boolean record) { - if (record) { - journal.appendOrder(order.getId(), order.getUserId(), order.getSide().name(), order.getPrice(), order.getQuantity(), order.getTimestamp()); - } - - OrderBook book = getOrderBook(order.getInstrument()); - List trades; - - if (order.getSide() == OrderSide.BUY) { - trades = book.matchBuy(order); - } else { - trades = book.matchSell(order); - } - - // Record trades - for (Trade trade : trades) { - if (record) { - journal.appendTrade(trade.getBuyOrderId(), trade.getSellOrderId(), trade.getPrice(), (int) trade.getQuantity(), trade.getTimestamp()); - } - } - - return trades; - } - - public List cancelAllOrdersForUser(String userId, String instrument) { - List cancelledOrders = new ArrayList<>(); - OrderBook book = orderBooks.get(instrument); - if (book != null) { - cancelledOrders = book.cancelAllOrdersForUser(userId); - } - return cancelledOrders; - } - - public List clearBook(String ticker) { - List cancelledOrders = new ArrayList<>(); - OrderBook book = orderBooks.get(ticker); - if (book != null) { - cancelledOrders = book.cancelAllOrdersForUser("*"); // Cancel all orders - } - return cancelledOrders; - } - - private OrderBook getOrderBook(String instrument) { - return orderBooks.computeIfAbsent(instrument, k -> new OrderBook()); - } - - private List getPriceLevels(Map> side) { - return side.entrySet().stream() - .map(entry -> { - long price = entry.getKey(); - long totalQty = entry.getValue().stream() - .mapToLong(Order::getQuantity) - .sum(); - return new PriceLevel(price, totalQty); - }) - .toList(); - } -} diff --git a/matching-engine/src/main/java/org/example/matching/model/Order.java b/matching-engine/src/main/java/org/example/matching/model/Order.java deleted file mode 100644 index 1862ae1..0000000 --- a/matching-engine/src/main/java/org/example/matching/model/Order.java +++ /dev/null @@ -1,98 +0,0 @@ -package org.example.matching.model; - -import lombok.RequiredArgsConstructor; - -import java.time.LocalDateTime; - -@RequiredArgsConstructor -public class Order { - String id; - String userId; - long price; - int quantity; - long timestamp; - OrderSide side; - String instrument; // Added for multi-book support - - public Order(String userId, long price, int quantity, long timestamp, OrderSide side) { - this.userId = userId; - this.price = price; - this.quantity = quantity; - this.timestamp = timestamp; - this.side = side; - this.instrument = "DEFAULT"; // Default instrument - } - - public Order(String id, String userId, long price, int quantity, long timestamp, OrderSide side) { - this.id = id; - this.userId = userId; - this.price = price; - this.quantity = quantity; - this.timestamp = timestamp; - this.side = side; - this.instrument = "DEFAULT"; // Default instrument - } - - public Order(String id, String userId, long price, int quantity, long timestamp, OrderSide side, String instrument) { - this.id = id; - this.userId = userId; - this.price = price; - this.quantity = quantity; - this.timestamp = timestamp; - this.side = side; - this.instrument = instrument != null ? instrument : "DEFAULT"; - } - - public String getId() { - return id; - } - - public String getUserId() { - return userId; - } - - public long getPrice() { - return price; - } - - public int getQuantity() { - return quantity; - } - - public long getTimestamp() { - return timestamp; - } - - public OrderSide getSide() { - return side; - } - public void reduceQuantity(long delta) { - if (delta < 0) throw new IllegalArgumentException("delta must be >= 0"); - if (delta > quantity) throw new IllegalArgumentException("reduce more than remaining"); - this.quantity -= (int) delta; - } - - public boolean isFilled() { - return quantity <= 0; - } - - @Override - public String toString() { - return "Order{" + - "id='" + id + '\'' + - ", userId='" + userId + '\'' + - ", price=" + price + - ", quantity=" + quantity + - ", timestamp=" + timestamp + - ", side=" + side + - '}'; - } - - public String getInstrument() { - return instrument; - } - - public void setInstrument(String instrument) { - this.instrument = instrument; - } -} diff --git a/matching-engine/src/main/java/org/example/matching/model/OrderBook.java b/matching-engine/src/main/java/org/example/matching/model/OrderBook.java deleted file mode 100644 index a354f6e..0000000 --- a/matching-engine/src/main/java/org/example/matching/model/OrderBook.java +++ /dev/null @@ -1,175 +0,0 @@ -package org.example.matching.model; - -import lombok.Data; -import lombok.extern.slf4j.Slf4j; - -import java.util.*; - -@Data -@Slf4j -public class OrderBook { - private final String instrument; - private final TreeMap> bids; // Price -> Orders (descending for bids) - private final TreeMap> asks; // Price -> Orders (ascending for asks) - - public OrderBook() { - this.instrument = ""; - this.bids = new TreeMap<>((a, b) -> Long.compare(b, a)); // Descending - this.asks = new TreeMap<>(); // Ascending - } - - public OrderBook(String instrument) { - this.instrument = instrument; - this.bids = new TreeMap<>((a, b) -> Long.compare(b, a)); // Descending - this.asks = new TreeMap<>(); // Ascending - } - - public void addOrder(Order order) { - if (order.getSide() == OrderSide.BUY) { - bids.computeIfAbsent(order.getPrice(), k -> new ArrayList<>()).add(order); - } else { - asks.computeIfAbsent(order.getPrice(), k -> new ArrayList<>()).add(order); - } - } - - public List matchBuy(Order buyOrder) { - List trades = new ArrayList<>(); - - while (buyOrder.getQuantity() > 0 && !asks.isEmpty()) { - Long bestAskPrice = asks.firstKey(); - if (bestAskPrice > buyOrder.getPrice()) { - break; // No match available - } - - List askOrders = asks.get(bestAskPrice); - if (askOrders.isEmpty()) { - asks.remove(bestAskPrice); - continue; - } - - Order askOrder = askOrders.get(0); - int tradeQuantity = Math.min(buyOrder.getQuantity(), askOrder.getQuantity()); - - // Create trade - Trade trade = new Trade(buyOrder.getId(), askOrder.getId(), bestAskPrice, tradeQuantity, buyOrder.getInstrument()); - trades.add(trade); - - // Update quantities - buyOrder.reduceQuantity(tradeQuantity); - askOrder.reduceQuantity(tradeQuantity); - - // Remove filled orders - if (askOrder.isFilled()) { - askOrders.remove(0); - if (askOrders.isEmpty()) { - asks.remove(bestAskPrice); - } - } - } - - // Add remaining buy order if not filled - if (buyOrder.getQuantity() > 0) { - addOrder(buyOrder); - } - - return trades; - } - - public List matchSell(Order sellOrder) { - List trades = new ArrayList<>(); - - while (sellOrder.getQuantity() > 0 && !bids.isEmpty()) { - Long bestBidPrice = bids.firstKey(); - if (bestBidPrice < sellOrder.getPrice()) { - break; // No match available - } - - List bidOrders = bids.get(bestBidPrice); - if (bidOrders.isEmpty()) { - bids.remove(bestBidPrice); - continue; - } - - Order bidOrder = bidOrders.get(0); - int tradeQuantity = Math.min(sellOrder.getQuantity(), bidOrder.getQuantity()); - - // Create trade - Trade trade = new Trade(bidOrder.getId(), sellOrder.getId(), bestBidPrice, tradeQuantity, sellOrder.getInstrument()); - trades.add(trade); - - // Update quantities - sellOrder.reduceQuantity(tradeQuantity); - bidOrder.reduceQuantity(tradeQuantity); - - // Remove filled orders - if (bidOrder.isFilled()) { - bidOrders.remove(0); - if (bidOrders.isEmpty()) { - bids.remove(bestBidPrice); - } - } - } - - // Add remaining sell order if not filled - if (sellOrder.getQuantity() > 0) { - addOrder(sellOrder); - } - - return trades; - } - - public List cancelAllOrdersForUser(String userId) { - List cancelledOrders = new ArrayList<>(); - - // Cancel bids - bids.values().forEach(orderList -> { - orderList.removeIf(order -> { - if (order.getUserId().equals(userId) || userId.equals("*")) { - cancelledOrders.add(order); - return true; - } - return false; - }); - }); - - // Remove empty price levels - bids.entrySet().removeIf(entry -> entry.getValue().isEmpty()); - - // Cancel asks - asks.values().forEach(orderList -> { - orderList.removeIf(order -> { - if (order.getUserId().equals(userId) || userId.equals("*")) { - cancelledOrders.add(order); - return true; - } - return false; - }); - }); - - // Remove empty price levels - asks.entrySet().removeIf(entry -> entry.getValue().isEmpty()); - - return cancelledOrders; - } - - public Double getBestBid() { - return bids.isEmpty() ? 0.0 : bids.firstKey().doubleValue(); - } - - public Double getBestAsk() { - return asks.isEmpty() ? 0.0 : asks.firstKey().doubleValue(); - } - - public String dumpBook() { - StringBuilder sb = new StringBuilder(); - sb.append("BIDS:\n"); - for (Map.Entry> entry : bids.entrySet()) { - sb.append(" ").append(entry.getKey()).append(": ").append(entry.getValue().size()).append(" orders\n"); - } - sb.append("ASKS:\n"); - for (Map.Entry> entry : asks.entrySet()) { - sb.append(" ").append(entry.getKey()).append(": ").append(entry.getValue().size()).append(" orders\n"); - } - return sb.toString(); - } -} diff --git a/matching-engine/src/main/java/org/example/matching/model/OrderSide.java b/matching-engine/src/main/java/org/example/matching/model/OrderSide.java deleted file mode 100644 index 2c98b1c..0000000 --- a/matching-engine/src/main/java/org/example/matching/model/OrderSide.java +++ /dev/null @@ -1,8 +0,0 @@ -package org.example.matching.model; - -public enum OrderSide { -BUY, - SELL - - -} diff --git a/matching-engine/src/main/java/org/example/matching/model/Reservation.java b/matching-engine/src/main/java/org/example/matching/model/Reservation.java deleted file mode 100644 index f27f346..0000000 --- a/matching-engine/src/main/java/org/example/matching/model/Reservation.java +++ /dev/null @@ -1,101 +0,0 @@ -package org.example.matching.model; - -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.Setter; - -@Getter @Setter @AllArgsConstructor -public class Reservation { - private final String OrderId; - private final String userId; - private final long priceatReserve; - private int remainingQty; - private String instrument; // Add instrument field - - private long reservedCash; - private long reservedShares; - private final Boolean isBuy; - - public Reservation(String orderId, String userId, long priceatReserve, int remainingQty, Boolean isBuy) { - OrderId = orderId; - this.userId = userId; - this.priceatReserve = priceatReserve; - this.remainingQty = remainingQty; - this.isBuy = isBuy; - this.instrument = "MARKET"; // Default instrument - } - - public Reservation(String orderId, String userId, long priceatReserve, int remainingQty, Boolean isBuy, String instrument) { - OrderId = orderId; - this.userId = userId; - this.priceatReserve = priceatReserve; - this.remainingQty = remainingQty; - this.isBuy = isBuy; - this.instrument = instrument != null ? instrument : "MARKET"; - } - - public long reduceBy(int qty) { - if (qty <= 0 || remainingQty <= 0) { - return 0; - } - - // Don't consume more than what is left in this specific reservation - int consumed = Math.min(qty, remainingQty); - long cashUsed =0; - if (isBuy) { - // Calculate how much cash was 'used' for this portion of the trade - cashUsed = (long) consumed * priceatReserve; - - // Subtract the used cash from the total reserved cash - this.reservedCash -= cashUsed; - - if (this.reservedCash < 0) this.reservedCash = 0; - } else { - // For a sell order, we just reduce the count of shares held - this.reservedShares -= consumed; - - if (this.reservedShares < 0) this.reservedShares = 0; - } - - // Finally, reduce the quantity so we know how much of the order is left to fill - this.remainingQty -= consumed; - return cashUsed; - } - - // Additional getters needed by the codebase - public String getOrderId() { - return OrderId; - } - - public String getUserId() { - return userId; - } - - public Boolean getIsBuy() { - return isBuy; - } - - public long getReservedCash() { - return reservedCash; - } - - public long getReservedShares() { - return reservedShares; - } - - public int getRemainingQty() { - return remainingQty; - } - - public void setReservedCash(long reservedCash) { - this.reservedCash = reservedCash; - } - - public void setReservedShares(long reservedShares) { - this.reservedShares = reservedShares; - } - - public String getInstrument() { - return instrument; - } -} \ No newline at end of file diff --git a/matching-engine/src/main/java/org/example/matching/model/Trade.java b/matching-engine/src/main/java/org/example/matching/model/Trade.java deleted file mode 100644 index c5a7f00..0000000 --- a/matching-engine/src/main/java/org/example/matching/model/Trade.java +++ /dev/null @@ -1,50 +0,0 @@ -package org.example.matching.model; - -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -import lombok.ToString; - -@Getter -@Setter -@AllArgsConstructor -@NoArgsConstructor -@ToString -public class Trade { - private String buyOrderId; - private String sellOrderId; - private long price; - private long quantity; - private long timestamp; - private String instrument; - - public Trade(String buyOrderId, String sellOrderId, long price, long quantity, String instrument) { - this.buyOrderId = buyOrderId; - this.sellOrderId = sellOrderId; - this.price = price; - this.quantity = quantity; - this.timestamp = System.currentTimeMillis(); - this.instrument = instrument; - } - - public String getBuyOrderId() { - return buyOrderId; - } - - public String getSellOrderId() { - return sellOrderId; - } - - public long getPrice() { - return price; - } - - public long getQuantity() { - return quantity; - } - - public long getTimestamp() { - return timestamp; - } -} \ No newline at end of file diff --git a/matching-engine/src/main/java/org/example/matching/model/Wallet.java b/matching-engine/src/main/java/org/example/matching/model/Wallet.java deleted file mode 100644 index 48c7dba..0000000 --- a/matching-engine/src/main/java/org/example/matching/model/Wallet.java +++ /dev/null @@ -1,134 +0,0 @@ -package org.example.matching.model; - -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.atomic.AtomicLong; - -public class Wallet { - private final String UserID; - private final AtomicLong availablecash = new AtomicLong(0); - private final AtomicLong reservedcash = new AtomicLong(0); - - // Fixed: Standardized on AtomicLong for all maps - private final ConcurrentHashMap availableShares = new ConcurrentHashMap<>(); - private final ConcurrentHashMap reservedShares = new ConcurrentHashMap<>(); - - public Wallet(String userID) { - this.UserID = userID; - } - - public String getUserId() { - return UserID; - } - - public long getAvailableCash() { - return availablecash.get(); - } - - public long getReservedCash() { - return reservedcash.get(); - } - - public void addAvailableCash(long amount) { - availablecash.addAndGet(amount); - } - - public boolean tryReserveCash(long amount) { - while (true) { - long avail = availablecash.get(); - //if avail less than the amount needed - if (avail < amount) return false; - if (availablecash.compareAndSet(avail, avail - amount)) { - reservedcash.addAndGet(amount); - return true; - //else avail = avail - amount and reserve cash .add amount - } - } - } - - public void releaseReserveCash(long amount) { - //in release reserve cash we just subtract the amount from the reservedcash and add it back to the available cash. - reservedcash.addAndGet(-amount); - availablecash.addAndGet(amount); - } - -//remove the money from the reserves - public void debitReservedCash(long amount) { - reservedcash.addAndGet(-amount); - - } - - // Fixed: Returns along to match AtomicLong, and handles the Map lookup safely - public long getAvailableShares(String instrument) { - AtomicLong val = availableShares.get(instrument); - return (val == null) ? 0L : val.get(); - } - - public long getReservedShares(String instrument) { - AtomicLong val = reservedShares.get(instrument); - return (val == null) ? 0L : val.get(); - } - - // Methods to get all shares for API responses - public ConcurrentHashMap getAvailableShares() { - return availableShares; - } - - public ConcurrentHashMap getReservedShares() { - return reservedShares; - } - - // get the quantity of the shares the available - //get the qty of reserved of shares - //pass the shares and the qty to reserve it - public boolean tryReserveShares(String instrument, long qty) { - // Fixed: Use AtomicLong and handle initialization correctly - // atomiclong does not hold it instead it points to a memory address - AtomicLong avail = availableShares.computeIfAbsent(instrument, k -> new AtomicLong(0)); - AtomicLong reserved = reservedShares.computeIfAbsent(instrument, k -> new AtomicLong(0)); -// - // currently is the - while (true) { - long currentAvail = avail.get(); - if (currentAvail < qty) return false; -//if avail >qty - // avail and subtract from avail - if (avail.compareAndSet(currentAvail, currentAvail - qty)) { - reserved.addAndGet(qty); - return true; - } - } - } - // see if the instrument exists - //if not create it - // -//atomiclong avail = availableshares.computeifabsent(instrument , - //atomiclong resrved = resrvedshares.computeIfabsent(instrument,k-> new AtomicLong(0); - public void releaseReservedShares(String instrument, long qty) { - // Fixed: Use AtomicLong here to match the class fields - AtomicLong reserved = reservedShares.get(instrument); - AtomicLong avail = availableShares.get(instrument); - - if (reserved != null) { - reserved.addAndGet(-qty); - } - - if (avail != null) { - avail.addAndGet(qty); - } - } - - public void debitReservedShares(String instrument, long qty) { - // Fixed: Changed from AtomicInteger to AtomicLong - AtomicLong reserved = reservedShares.get(instrument); - if (reserved != null) { - reserved.addAndGet(-qty); - } - } - - //add so available shares . add the shares and in if not create and add - public void addAvailableShares(String instrument, long qty) { - // Fixed: Used AtomicLong in the lambda - availableShares.computeIfAbsent(instrument, k -> new AtomicLong(0)) - .addAndGet(qty); - } -} \ No newline at end of file diff --git a/matching-engine/src/main/java/org/example/matching/orderbook/InMemoryOrderRepository.java b/matching-engine/src/main/java/org/example/matching/orderbook/InMemoryOrderRepository.java deleted file mode 100644 index 88df633..0000000 --- a/matching-engine/src/main/java/org/example/matching/orderbook/InMemoryOrderRepository.java +++ /dev/null @@ -1,37 +0,0 @@ -package org.example.matching.orderbook; - -import org.example.matching.model.Order; - -import java.util.Map; -import java.util.Optional; -import java.util.concurrent.ConcurrentHashMap; -import lombok.RequiredArgsConstructor; - -public class InMemoryOrderRepository implements OrderRepository { - - private final Map orders = new ConcurrentHashMap<>(); - - public InMemoryOrderRepository() { - // Constructor - } - - @Override - public void save(Order order) { - orders.put(order.getId(), order); - } - - @Override - public Optional findById(String id) { - return Optional.ofNullable(orders.get(id)); - } - - @Override - public void deleteById(String id) { - orders.remove(id); - } - - @Override - public void delete(Order order) { - orders.remove(order.getId()); - } -} diff --git a/matching-engine/src/main/java/org/example/matching/orderbook/OrderRepository.java b/matching-engine/src/main/java/org/example/matching/orderbook/OrderRepository.java deleted file mode 100644 index 30d6015..0000000 --- a/matching-engine/src/main/java/org/example/matching/orderbook/OrderRepository.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.example.matching.orderbook; - - -import lombok.AllArgsConstructor; -import org.example.matching.model.Order; -import org.springframework.stereotype.Repository; - -import java.util.Optional; - -@Repository -public interface OrderRepository { - void save(Order order); - Optional findById(String orderId); - void deleteById(String id); - void delete(Order order); -} diff --git a/matching-engine/src/main/resources/application.properties b/matching-engine/src/main/resources/application.properties deleted file mode 100644 index b2860ce..0000000 --- a/matching-engine/src/main/resources/application.properties +++ /dev/null @@ -1,12 +0,0 @@ -# Server Configuration -server.port=8080 - -# Application Configuration -spring.application.name=matching-engine - -# Logging Configuration -logging.level.org.example.matching=DEBUG -logging.level.org.springframework.web=INFO - -# Jackson Configuration (for JSON serialization) -spring.jackson.serialization.indent-output=true diff --git a/matching-engine/target/classes/application.properties b/matching-engine/target/classes/application.properties deleted file mode 100644 index b2860ce..0000000 --- a/matching-engine/target/classes/application.properties +++ /dev/null @@ -1,12 +0,0 @@ -# Server Configuration -server.port=8080 - -# Application Configuration -spring.application.name=matching-engine - -# Logging Configuration -logging.level.org.example.matching=DEBUG -logging.level.org.springframework.web=INFO - -# Jackson Configuration (for JSON serialization) -spring.jackson.serialization.indent-output=true diff --git a/matching-engine/target/classes/org/example/matching/api/controller/EventController.class b/matching-engine/target/classes/org/example/matching/api/controller/EventController.class deleted file mode 100644 index 0ec0ec73df0fea577cebad67ce40aaa42943b6d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4074 zcmcInYgZFj6y2BC5Eukg#3EIrqVlTK`c{xuC@3~45{k92kvZhL|SoX4E<}4%W*vfS>8R;5RYtmMerLn-?tZAFeGD~qnx@%Ta z3S5fUH06bJj9Jr7OEv53mZ^@mp%oDgZ93Ya3k=q@lTuEIWnQl4rKbd%m!+CX33Lw( z#vhn#rjaoTKcQTD5!l_MqtiF4bK-4Z$8v1XUvRIEXz{~c=`C2vv~>Ls-8%O9AKIyL z)7g~o*YPHL1tOGBJvXRFx-?VL^(OLGhR@M4;!UU5!1XGCF$tp1`%gSOD7o)6blR7@Yl)(P1nU*Y3NmJdi)C%7`W!lOU zxLBXH$_3hR4c9fy=(vFo1-drtOPHJjEn}8#sqvr=EOHobNrA0( z#ZucDw`_ScpIwsfg1MBTBpP>;W@gcJEq`1PHmMbh1e~i4rgn{IhBUfzmHAa$yTTP_ zr3|;-(9T-rMT5-FO10vo=1jjxDDD*&*@U%hn=0?px5xhrn`8AO948sQ^Lf^)tX#A_ ziws}2Sq#kJFewtey-2OgC1c65Q-)cZYs@(wkH1{bKb=U{nwiPdLCq*8&e5%_lo)x< zT@MpM7RV!4S{?h}EIgff$9Iu<0J2KqEmvkYuIGz6?F z8?^57y2~(z6>ht~)k1a6Z&XT=G9Fo}Z&0hGC7moePyV;I$0~98JE14w!U!EQ9u-z6Ik_G7Y4P}|(E--pi$%qXLt}K16}K(n zjH-Zz%daExlF~@d2+=HgkFw`&K7L6;VV4S@U?%;k>mc&L&&n%oU|>-#t6|shMBvcQQ@Qa%M{$I$&o%Z74ea{){wwT7FC_zu3G{La z^vWh^ixUMNAYA~xNXS0uZi2ozJn{l#!y~US0c;_{p%z_rG z`eE9Pa%TxxC*2IccLs@90@jQ!3c47DTwrK5fEJ}mmt(I)okE^t@{NbQ*6=My{;V@h Ppzm5D_#Th(BYOV<(ps(L diff --git a/matching-engine/target/classes/org/example/matching/api/dto/EventRequest.class b/matching-engine/target/classes/org/example/matching/api/dto/EventRequest.class deleted file mode 100644 index ce8b4d59df714600471f88a3aa84880a67c31fbb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4403 zcmb7H-)|gO75?seW@mOijyLN#$u=QP%huStb{85*@j5PTj6)2zlg4R6+5#Q#4)Mh6 z9cOnoB>bw7ctU+ZNJxkWctPYPm5RWrR3rpKDuM_2Bj_`K0i}FrW_EVG9)W9lcFsNL zJLleee(wJ5Kkxkkz#`r>kWpClI=5@ieS2rO<@EZ`bTyx7PH%+VVZ8?O${5 z_MEO?PA)F?+*Z@+ z-0J&N1a%7wA{eE{dgRhPs#vt}g51*Fvb$SLUehTuypPB?adZB#Z|9iw{F-SSJn|z^S4~yyL$L-xrN>hEs%bnBBsoR^kzzMPnUJAgT-|hTC`)icNL=bMB*7UAO!w=aRzo8L#@L2$ zH@4U8-6%Ht)oUwj%dDi1)9tlSzMMEjzMR-DR~}e4eJ>1;!s|)beT;lg zq;sToFvA&x{D#--G@MJWWZcnYbADD@1Vg>fvR-o}FPRpFi=O9q{f@mGrcBqwU4<)2 zy=k|(sAkW`*OWzkODRkICg^HuRsAk5qU>EVxGjLB@z_%32gNEg{?|Iu!)X>AO zaLI1?o;2d0CA}2^!;@aN+s&5KEw6gsc5ip#pnDRWeTvr~>^dp%*An=CzfQ0s6H9ih zwc+{>i_ltWx1G*X%kFj^dU7J^vuF?+_>RIe2X2~n0R!JtIP<@u%*61vc#563%7&Un zMn);AjEunG&7l{(Ip%^lCtL95DC2tqIeZbzoY0rJI!itIGk*_t>s^ezLt5cW{LJzV zVwFq|ehRwAw{Z2!?_dZtlYoxlGC5WVzzV+1m6B<~&tc`UVdW#K%A7bU%7tO&@l<6_ zr4;3fVdX-qG6!^u^6^JQcRre`%n6>N{KW9i#Z=|5V3lqaht>I(=wvI^Js7_k+S&}X zkB5lJ-4Zp)28A`Eb=EoxT&$;?96PK@Nvzo9cwq8My2-*}O-hc&CX0c|tLY{u4r@}< zJvKQRn0y)64*2ra9*!T@q*P99@?>Cg1J@6jWO$x9tVt=t*yQQJB)`9fCe`2h9%JM_ zs8)UrU3*mh6U?7OA9+;$Bh0ng%43`fmL#5@d)l^-Z`wK=(+WR>A5Y}8t zdyGmSUaRYb)au!iE|~25C_cnkNiSs+pmTMDpmTMzWC+NNKt{<-fX>%*1f8$vOF04M zBT%lCPk`p@qXf;@tRftze88Fr)J z;;ZD1;CZ}_Tck9G4L zSu!)sLiHhxxyQH=@N0EV1SKt!n36A{=v-Y7L`;=H$t>x8(fN8d5M^T#6DZW0uN#4g zxf5v_f#`I4q_2esj&3-DpP&&`o6cA^No8;hKVak}(sS6tH%V#id26^$N+t4%=3Ag&(wSP0x&#$!ZeePNzEt-{GJ}z z+CQz|#nNzd%co8*ofQ{OuDAF$Xn3kZ8XDG*%X5B>sw q-AiS*2+m*!ZN4>nM8P9v^4;OHi~C#^iQrEXwv`;djqft)O8*5IL`R1J diff --git a/matching-engine/target/classes/org/example/matching/api/dto/MarketEvent$MarketEventBuilder.class b/matching-engine/target/classes/org/example/matching/api/dto/MarketEvent$MarketEventBuilder.class deleted file mode 100644 index c8c5f528678ccc400d6bf2e1ef33f43fbe8b170a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3054 zcmcImTT|Oc6#mv+Y#dR$P9Ts{0tHf=xKVn)IHV~i6sUouc4<3(TI_95kR?Z2GhzBO z`qF>U*LEhEbkdprfc~gX&#r_}MjDShOdnR~=;-Wsu6tI0|MT)M0BiUrj|@h#7&S14 zafae!e!@+gJCDr$!^fg68OHBejwSChjFc+}6UbpAi@bqLFc@mC_sA4adADZ^v&&`s z$fBLRXPF)8n!DUP7V`dyaO84~U+-IXM|ccbp+0SIFq9hScAL^8keagent_5cGx4M^ zd}+CkucWUVC~4`b@LN{Tr-Hu==G%QE#^}C0{Yw<&yBqiO92i&vNdng>0M;3*$HnHHL>Nsi<5Kv$!kdk=uE|J>C^kc;x1Hp_!Ccx~Mg`JlNgjIlQRFdu1x%um>|e z?PG^(&M{QW!y{3(a?(9J8dqp%VlFb|n{MB0i%m;4PBB*gTS}P__GnmcxjxPA;=1cf zUwXV3)XUG|ONO7~dt!Vzn9Jch`>v4gL&XsAQH%dmVNqvf2q$HEK}5S;5x-j=Q!-M_@!I8+Rx+Tu>f7XEU>b&vbK zS~6!b$txRMr#+FP{zFVZWe$Z9b#B{DOA4x)vF$j*tJ~c71)YRaGN)NQWLQZAn&y8N zO@{fws&qvK!D5jvmkdor^`tAAxQx0pHKkipQ@R&5rK?a=y5lsZTS`;9nTTGZMgIU` z_<%T*C{vQv7ht~=lfj4dRG)!Kd_+$pP{7Cdgx(kdd`ensbB(BSD!Y2~IX!+OHo1K| zPzkq_vi6_hGtwSYXhp&-q+?DFjj3`GVHPxIDIK#oG^WaHgjv#i>KABE&zyg#K2g{R!+pu&Uq#qAk3{ZD5d%YG`8=>tr#5IyN+2!F{4R avb9BP6MOVlqVGBSQ`{#X9#Et$%>E175X|2I diff --git a/matching-engine/target/classes/org/example/matching/api/dto/MarketEvent.class b/matching-engine/target/classes/org/example/matching/api/dto/MarketEvent.class deleted file mode 100644 index 960ceccaab15e8e28348c216f54229626238ba5b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6367 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 JPF!!I<9{G9fl&Ye diff --git a/matching-engine/target/classes/org/example/matching/api/service/MarketManagmentService.class b/matching-engine/target/classes/org/example/matching/api/service/MarketManagmentService.class deleted file mode 100644 index 5358723c4fcfc7c6632dff2a5c45c7fa5170c2a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5797 zcmbtYiFXsn9sX867DO<-84PY^iHqPJ4b`SNgLXX0ZKuEc^?<;AO0&UoE4;k43 z=>Y|cnp-?a$;0e-9XeW~uhej}fR1wgUfWw9MKfAdv}#z5HFQduhk5du9Eq^0xdhN- zN1}43RI0y7ps&*q$9h6hDj5_26|hmot!0$-tPpUo)^Hncrx7HetD9E#PUEzK#X+!# zBiMw^Dz<1yV5@?ZbgI~`;STIkkhlsgswJbMt3$zErMCOWef5fVYq(Qr89tFS zvaV@cS)qQfhP`t3bb)VTcAtj3#OyrFXH^9K7*KIQ!ypbSSRx(onqx-1$4=_$4&5~d zIHK1r`=o+p1;$n`q0{i z4q0-y@2P zVvz2MBCEkgj+xCdhRv*NIDXPxdl@g4=$2?1oCnf0yr=I#f9E}IeFI*iP|iLU#q03~ z6>rq=CcIfeYoNJ-C4}iM=@==~J;3_cKcYK=(#-*(T#{)0;O=f2^b~mXk^6)KZ_)5p zoMC<|0=BadD`*IS_|qD<_uoF#?E_lc88(jbceFg~K&Z-;NO?a*PhuH8fa zDp+1-!t|BWfO8r?i_ft}Bt5?}vy>`Xu_vGaiwgJ!4PV5U$a_}qLZ-U)a`9K0qzKS& z4qME04s&C#$7ksdHgQ`k={@J1k=UM4aNFhaie;a~5Y3R-H#9^12L@|mW}OP%YehfT zGDz07+bP<-pvSa~y}7X=!x_+r(wvFOIyk61rWpH^)$WMNliqxJVP4!#ZfWljCG%d%`%3{lw?td%me8R4E|V(&@Y85KRgYn*c9 z`qa{RkAClI%Bhjv2NT}Rx=w3Tg>vK(#k&^W;Pi}`7IdYXWt52^Im*EGIV;X|S32F7 zF)V2@xztgXpo&?0>)g2_0<9=!E(%5Z^*jpAHJ?li8 zpxE+oDT@*>WlWC}(Nq|=dpcvp3!jJdXPa%iOtgB&i^yy}ZeLJ~--wpvw;FzeSL*Q! zC;kw@AMqy@f7b99{FTvKOjf2fZjZ8KmTn-5eoRlgw&-J{jP2s+?X=bSsrM zvQ0gGHY%=!u+tZ)t%0$nE^f?l)O~`8C^RF+sGa^=wu& z3bB$#%>R&5@lORSD;yPMvxe2a-seEH-h1{8dm z?;$+FdEPoqji2O*w+&O{ClKa)4W2?3p5~6Td{*(fzV!l>*5{xex`6O`M2fHV#n*+c ztIwmMbHOYAI(4mQuTw)U1`i#96AJ;jb$^890wTN0cUQP~@Ai zB7_Tk4~IA{pn!|s5Y%;&uZn1txk_mK0I`H8+FPGN{pviH^RHrf_ulf45 z@hSAHliEyTZ3th-El+YL1mUk*t_H6(iqLga&~f*t?Z`V^axkbjlmiAaA^g z?|8V%ex6x`KogC%FCyAlo5#j;s9l6@8`X>0!BcNvlSkLuJbD_d^XR*X{fleP5$>DB{ng^v zr4)3wF)R+FN}ls>T*LQmq|^>lXeZ-h7bBvL1ZyY3I(Svoi7nX86?bs93w`Lu0bXIG z_~v3i?&s)1UQ!629A(tf&?(PMz&lJa_gx;VaPI{7UXpP(!7GnTj7Kr|J-j5TJ;9IQ z?~{8mew4k8A24Ryc!?s29L5j1vIe2~ZPk*~jkQDvaX~~73q%3;3o`x)4|(qAwMR%Y zxk)&067Lj|`fd>pkAQC<3NeNso5bUS{SOx@8k2e*#zGunupgy24oeF)56idE%Vj_2 zWf!Xve-Uxt>C3Bc&ExYtz{jChpF?$(;F9NYFS3r5;MGeDQLwOXC;MLflp8|$8Gg>E n*zyZLf5|_g!tV+7EBqS2!{0a)ZSA2j|S+0$V3 diff --git a/matching-engine/target/classes/org/example/matching/api/service/SettlementService.class b/matching-engine/target/classes/org/example/matching/api/service/SettlementService.class deleted file mode 100644 index 927109670c7c3252836c6f7a3ce6d03d0685de68..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3900 zcmbVPYjYdb8Geo}Yb|*l6ca>j!X+UATd^&gYh#5pj$?|0FVu3KNhobM(uuwCYS-+p zoTT&y^j@H)r7ZzUfws68Xa|Onfimz(b4<9 z=Xsy^cJ$W|-un}P`|-O3+R&~crlSLKfqjmE=(y}G9CBrW)n)X80ST?hsbXUxR z%;u%LjaEpetj$5%^V0hDuZ%`M|^5b)JljA1^?%Ukk8+3D> z=o4r^GoDXk2X5DJhmJdOmq2Pgkvx)*l?}_ASg;*ejv1a5xFw44vx>)EI_}190iDd8 zk=~qHSdy;5Hj=a6a=`mNI__2SU6h}8LUEO_13EI;%f!2ASXNWw4Msb9I*{_R;aW}G zTo;BgtRbu8K733d6UlF+DlaCWQOl}+E3m!hLD@I0?3hDT1>baRUa}ttG#u1%2#4uu z;O06ZW~=E-*YF*3k#4axQ9Y-fBN)+;({U8{3-mPX)I=EYMZ=qxmzeVH{R3x}#wT%r6?QWQJ#2 zfEOIQPL60`WUx@11!`cwydsroA_ zmd@&U1fOAL7{y|pC052FM<=xE z$Ew}jSh>pl7DyfEu^^D7t(mf4a7r7MCB@rd>bRi9byuD*+r>tmSvpFv1-8^C!MMF( z+O#zsjjJZc1{zL|P@Vx_#$y^>9Ud5w!RTzOO`BF_GE%Ul;hu1uC4t?|!K^p)MgmQm zp3h=gQAKx=z+1o3z`VID`t~5#XWXK6lemP(b$n5Eo(`taL{YVhFYEYN z)|$|4LpDcM2A7k#I_2(-Af_qFYg92|V`Fqx;HF7Na=KhPC*3(!$MkH{DHztg;hO4m z^)S9{Tz1L~nmDEUt!dkwpS7BgUko~{z}?Znn;Qrb$NWW;o#H^W@TQLpYHL!>^NFGY z8iciZpfl7}Z1sHa2;?^;wN^vTv%cYBZ8YhY3g@*Ax>hZX!?iYsqtP}e!v=4~XvNwk&9xFOxlywkV2vd6 zPT4KU2TWBL=^LKB!-^My-r2J4n>^l|3R@*@d~bL*P63F6EyF#J{M~&C`Em z-i6p(fi^w#XLJu$(ESc>egm<$2YY%exa|s(JlnYnjmw^qSo7(g@O0-$2W|APVNhTs z-Wy-TK5n#LZ4Dn6xB^4%*u1Xc#7JjvX9XvFV--Aj1?l>S>1&v+U~Uz$#Nk9bk$CcWBtJ;mCCy)NtZ>>^gSE{>^y5PQ^qUk$@OL44m9yLf~Dl>LqfB z!CYcOI8%dbC<{yvRpWRkH$fOLjl@*IRTRIlhA*{Y^}~NQm`(>)j?=qQ?B;`JAI8Yv z$$+s8J={&iKgTb)<6U)j4&j#pI|*|C2H9_`dmWzqiYLnJEol2MQW{q1+<$0GIn*Jj z%#`N*{B_kCtLjW&<`4L4X75$>X9llAWQMNd8=2nNRV*pMZ9!_pgP?2;03Hay_tjzb y1vRCD*2iz+)KEKBSM9-0RaPtju{B1~6opd!I>m=iio(AMF8M9q Date: Thu, 12 Mar 2026 21:19:01 -0400 Subject: [PATCH 08/13] Refactor backend and frontend components: remove unused classes, add new InfoCard, MarketCard, and TopicCard components, and update Home page layout with new market and info sections. --- backend/.gitignore | 1 - backend/README.md | 249 --------------- backend/common/pom.xml | 18 -- .../src/main/java/org/example/Main.java | 7 - .../target/classes/org/example/Main.class | Bin 540 -> 0 bytes .../compile/default-compile/createdFiles.lst | 1 - .../compile/default-compile/inputFiles.lst | 1 - backend/journals/engine.log | 87 ----- backend/matching-engine/README.md | 1 - backend/matching-engine/journals/engine.log | 53 --- backend/matching-engine/pom.xml | 50 --- .../src/main/java/org/example/Main.java | 109 ------- .../matching/MatchingEngineApplication.java | 11 - .../java/org/example/matching/Replay.java | 98 ------ .../Wallets/InMemoryWalletService.java | 138 -------- .../example/matching/Wallets/RiskManager.java | 34 -- .../matching/Wallets/WalletService.java | 17 - .../api/advice/ApiExceptionHandler.java | 29 -- .../api/controller/MarketController.java | 36 --- .../api/controller/OrderController.java | 39 --- .../api/controller/WalletController.java | 59 ---- .../matching/api/dto/DepositRequest.java | 26 -- .../matching/api/dto/OrderBookResponse.java | 18 -- .../example/matching/api/dto/OrderMapper.java | 21 -- .../matching/api/dto/OrderRequest.java | 57 ---- .../matching/api/dto/OrderResponse.java | 21 -- .../example/matching/api/dto/PriceLevel.java | 13 - .../matching/api/dto/WalletResponse.java | 20 -- .../api/service/LiquidBotService.java | 29 -- .../api/service/MarketDataService.java | 67 ---- .../matching/api/service/OrderService.java | 78 ----- .../app/MatchingEngineApplication.java | 4 - .../matching/config/MatchingEngineConfig.java | 40 --- .../matching/journal/EventJournal.java | 100 ------ .../matching/matching/MatchingEngine.java | 184 ----------- .../org/example/matching/model/Order.java | 93 ------ .../org/example/matching/model/OrderBook.java | 259 --------------- .../org/example/matching/model/OrderSide.java | 8 - .../example/matching/model/Reservation.java | 97 ------ .../org/example/matching/model/Trade.java | 40 --- .../org/example/matching/model/Wallet.java | 134 -------- .../orderbook/InMemoryOrderRepository.java | 24 -- .../matching/orderbook/OrderOrchestrator.java | 114 ------- .../matching/orderbook/OrderRepository.java | 14 - .../example/matching/util/IdGenerator.java | 10 - .../matching/validation/OrderValidator.java | 34 -- .../src/main/resources/application.properties | 12 - .../target/classes/application.properties | 12 - .../target/classes/org/example/Main.class | Bin 5934 -> 0 bytes .../matching/MatchingEngineApplication.class | Bin 771 -> 0 bytes .../classes/org/example/matching/Replay.class | Bin 3251 -> 0 bytes .../Wallets/InMemoryWalletService.class | Bin 6159 -> 0 bytes .../matching/Wallets/RiskManager.class | Bin 1091 -> 0 bytes .../matching/Wallets/WalletService.class | Bin 699 -> 0 bytes .../api/advice/ApiExceptionHandler.class | Bin 3503 -> 0 bytes .../api/controller/MarketController.class | Bin 2248 -> 0 bytes .../api/controller/OrderController.class | Bin 3858 -> 0 bytes .../api/controller/WalletController.class | Bin 5380 -> 0 bytes .../matching/api/dto/DepositRequest.class | Bin 2719 -> 0 bytes ...ookResponse$OrderBookResponseBuilder.class | Bin 2330 -> 0 bytes .../matching/api/dto/OrderBookResponse.class | Bin 3760 -> 0 bytes .../matching/api/dto/OrderMapper.class | Bin 1364 -> 0 bytes .../matching/api/dto/OrderRequest.class | Bin 4622 -> 0 bytes .../OrderResponse$OrderResponseBuilder.class | Bin 1996 -> 0 bytes .../matching/api/dto/OrderResponse.class | Bin 3436 -> 0 bytes .../example/matching/api/dto/PriceLevel.class | Bin 2373 -> 0 bytes ...WalletResponse$WalletResponseBuilder.class | Bin 2661 -> 0 bytes .../matching/api/dto/WalletResponse.class | Bin 4498 -> 0 bytes .../matching/api/service/OrderService.class | Bin 5896 -> 0 bytes .../app/MatchingEngineApplication.class | Bin 350 -> 0 bytes .../config/MatchingEngineConfig.class | Bin 2066 -> 0 bytes .../matching/journal/EventJournal.class | Bin 3303 -> 0 bytes .../matching/matching/MatchingEngine.class | Bin 8341 -> 0 bytes .../org/example/matching/model/Order.class | Bin 3369 -> 0 bytes .../example/matching/model/OrderBook.class | Bin 8420 -> 0 bytes .../example/matching/model/OrderSide.class | Bin 1163 -> 0 bytes .../example/matching/model/Reservation.class | Bin 3100 -> 0 bytes .../org/example/matching/model/Trade.class | Bin 2300 -> 0 bytes .../org/example/matching/model/Wallet.class | Bin 4473 -> 0 bytes .../orderbook/InMemoryOrderRepository.class | Bin 1488 -> 0 bytes .../orderbook/OrderOrchestrator.class | Bin 4555 -> 0 bytes .../matching/orderbook/OrderRepository.class | Bin 417 -> 0 bytes .../example/matching/util/IdGenerator.class | Bin 471 -> 0 bytes .../matching/validation/OrderValidator.class | Bin 947 -> 0 bytes .../compile/default-compile/createdFiles.lst | 37 --- .../compile/default-compile/inputFiles.lst | 34 -- .../default-testCompile/inputFiles.lst | 0 backend/src/main/java/org/example/Main.java | 7 - backend/src/pom.xml | 30 -- .../src/components/Category/CategoryBar.tsx | 2 +- frontend/src/components/InfoCard/InfoCard.tsx | 29 ++ .../src/components/MarketCard/MarketCard.tsx | 171 ++++++++++ .../src/components/TopicCard/TopicCard.tsx | 80 +++++ frontend/src/pages/Home.tsx | 301 +++++++++++++++++- 94 files changed, 576 insertions(+), 2682 deletions(-) delete mode 100644 backend/.gitignore delete mode 100644 backend/README.md delete mode 100644 backend/common/pom.xml delete mode 100644 backend/common/src/main/java/org/example/Main.java delete mode 100644 backend/common/target/classes/org/example/Main.class delete mode 100644 backend/common/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst delete mode 100644 backend/common/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst delete mode 100644 backend/journals/engine.log delete mode 100644 backend/matching-engine/README.md delete mode 100644 backend/matching-engine/journals/engine.log delete mode 100644 backend/matching-engine/pom.xml delete mode 100644 backend/matching-engine/src/main/java/org/example/Main.java delete mode 100644 backend/matching-engine/src/main/java/org/example/matching/MatchingEngineApplication.java delete mode 100644 backend/matching-engine/src/main/java/org/example/matching/Replay.java delete mode 100644 backend/matching-engine/src/main/java/org/example/matching/Wallets/InMemoryWalletService.java delete mode 100644 backend/matching-engine/src/main/java/org/example/matching/Wallets/RiskManager.java delete mode 100644 backend/matching-engine/src/main/java/org/example/matching/Wallets/WalletService.java delete mode 100644 backend/matching-engine/src/main/java/org/example/matching/api/advice/ApiExceptionHandler.java delete mode 100644 backend/matching-engine/src/main/java/org/example/matching/api/controller/MarketController.java delete mode 100644 backend/matching-engine/src/main/java/org/example/matching/api/controller/OrderController.java delete mode 100644 backend/matching-engine/src/main/java/org/example/matching/api/controller/WalletController.java delete mode 100644 backend/matching-engine/src/main/java/org/example/matching/api/dto/DepositRequest.java delete mode 100644 backend/matching-engine/src/main/java/org/example/matching/api/dto/OrderBookResponse.java delete mode 100644 backend/matching-engine/src/main/java/org/example/matching/api/dto/OrderMapper.java delete mode 100644 backend/matching-engine/src/main/java/org/example/matching/api/dto/OrderRequest.java delete mode 100644 backend/matching-engine/src/main/java/org/example/matching/api/dto/OrderResponse.java delete mode 100644 backend/matching-engine/src/main/java/org/example/matching/api/dto/PriceLevel.java delete mode 100644 backend/matching-engine/src/main/java/org/example/matching/api/dto/WalletResponse.java delete mode 100644 backend/matching-engine/src/main/java/org/example/matching/api/service/LiquidBotService.java delete mode 100644 backend/matching-engine/src/main/java/org/example/matching/api/service/MarketDataService.java delete mode 100644 backend/matching-engine/src/main/java/org/example/matching/api/service/OrderService.java delete mode 100644 backend/matching-engine/src/main/java/org/example/matching/app/MatchingEngineApplication.java delete mode 100644 backend/matching-engine/src/main/java/org/example/matching/config/MatchingEngineConfig.java delete mode 100644 backend/matching-engine/src/main/java/org/example/matching/journal/EventJournal.java delete mode 100644 backend/matching-engine/src/main/java/org/example/matching/matching/MatchingEngine.java delete mode 100644 backend/matching-engine/src/main/java/org/example/matching/model/Order.java delete mode 100644 backend/matching-engine/src/main/java/org/example/matching/model/OrderBook.java delete mode 100644 backend/matching-engine/src/main/java/org/example/matching/model/OrderSide.java delete mode 100644 backend/matching-engine/src/main/java/org/example/matching/model/Reservation.java delete mode 100644 backend/matching-engine/src/main/java/org/example/matching/model/Trade.java delete mode 100644 backend/matching-engine/src/main/java/org/example/matching/model/Wallet.java delete mode 100644 backend/matching-engine/src/main/java/org/example/matching/orderbook/InMemoryOrderRepository.java delete mode 100644 backend/matching-engine/src/main/java/org/example/matching/orderbook/OrderOrchestrator.java delete mode 100644 backend/matching-engine/src/main/java/org/example/matching/orderbook/OrderRepository.java delete mode 100644 backend/matching-engine/src/main/java/org/example/matching/util/IdGenerator.java delete mode 100644 backend/matching-engine/src/main/java/org/example/matching/validation/OrderValidator.java delete mode 100644 backend/matching-engine/src/main/resources/application.properties delete mode 100644 backend/matching-engine/target/classes/application.properties delete mode 100644 backend/matching-engine/target/classes/org/example/Main.class delete mode 100644 backend/matching-engine/target/classes/org/example/matching/MatchingEngineApplication.class delete mode 100644 backend/matching-engine/target/classes/org/example/matching/Replay.class delete mode 100644 backend/matching-engine/target/classes/org/example/matching/Wallets/InMemoryWalletService.class delete mode 100644 backend/matching-engine/target/classes/org/example/matching/Wallets/RiskManager.class delete mode 100644 backend/matching-engine/target/classes/org/example/matching/Wallets/WalletService.class delete mode 100644 backend/matching-engine/target/classes/org/example/matching/api/advice/ApiExceptionHandler.class delete mode 100644 backend/matching-engine/target/classes/org/example/matching/api/controller/MarketController.class delete mode 100644 backend/matching-engine/target/classes/org/example/matching/api/controller/OrderController.class delete mode 100644 backend/matching-engine/target/classes/org/example/matching/api/controller/WalletController.class delete mode 100644 backend/matching-engine/target/classes/org/example/matching/api/dto/DepositRequest.class delete mode 100644 backend/matching-engine/target/classes/org/example/matching/api/dto/OrderBookResponse$OrderBookResponseBuilder.class delete mode 100644 backend/matching-engine/target/classes/org/example/matching/api/dto/OrderBookResponse.class delete mode 100644 backend/matching-engine/target/classes/org/example/matching/api/dto/OrderMapper.class delete mode 100644 backend/matching-engine/target/classes/org/example/matching/api/dto/OrderRequest.class delete mode 100644 backend/matching-engine/target/classes/org/example/matching/api/dto/OrderResponse$OrderResponseBuilder.class delete mode 100644 backend/matching-engine/target/classes/org/example/matching/api/dto/OrderResponse.class delete mode 100644 backend/matching-engine/target/classes/org/example/matching/api/dto/PriceLevel.class delete mode 100644 backend/matching-engine/target/classes/org/example/matching/api/dto/WalletResponse$WalletResponseBuilder.class delete mode 100644 backend/matching-engine/target/classes/org/example/matching/api/dto/WalletResponse.class delete mode 100644 backend/matching-engine/target/classes/org/example/matching/api/service/OrderService.class delete mode 100644 backend/matching-engine/target/classes/org/example/matching/app/MatchingEngineApplication.class delete mode 100644 backend/matching-engine/target/classes/org/example/matching/config/MatchingEngineConfig.class delete mode 100644 backend/matching-engine/target/classes/org/example/matching/journal/EventJournal.class delete mode 100644 backend/matching-engine/target/classes/org/example/matching/matching/MatchingEngine.class delete mode 100644 backend/matching-engine/target/classes/org/example/matching/model/Order.class delete mode 100644 backend/matching-engine/target/classes/org/example/matching/model/OrderBook.class delete mode 100644 backend/matching-engine/target/classes/org/example/matching/model/OrderSide.class delete mode 100644 backend/matching-engine/target/classes/org/example/matching/model/Reservation.class delete mode 100644 backend/matching-engine/target/classes/org/example/matching/model/Trade.class delete mode 100644 backend/matching-engine/target/classes/org/example/matching/model/Wallet.class delete mode 100644 backend/matching-engine/target/classes/org/example/matching/orderbook/InMemoryOrderRepository.class delete mode 100644 backend/matching-engine/target/classes/org/example/matching/orderbook/OrderOrchestrator.class delete mode 100644 backend/matching-engine/target/classes/org/example/matching/orderbook/OrderRepository.class delete mode 100644 backend/matching-engine/target/classes/org/example/matching/util/IdGenerator.class delete mode 100644 backend/matching-engine/target/classes/org/example/matching/validation/OrderValidator.class delete mode 100644 backend/matching-engine/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst delete mode 100644 backend/matching-engine/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst delete mode 100644 backend/matching-engine/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst delete mode 100644 backend/src/main/java/org/example/Main.java delete mode 100644 backend/src/pom.xml create mode 100644 frontend/src/components/InfoCard/InfoCard.tsx create mode 100644 frontend/src/components/MarketCard/MarketCard.tsx create mode 100644 frontend/src/components/TopicCard/TopicCard.tsx diff --git a/backend/.gitignore b/backend/.gitignore deleted file mode 100644 index 723ef36..0000000 --- a/backend/.gitignore +++ /dev/null @@ -1 +0,0 @@ -.idea \ No newline at end of file diff --git a/backend/README.md b/backend/README.md deleted file mode 100644 index 749a73a..0000000 --- a/backend/README.md +++ /dev/null @@ -1,249 +0,0 @@ -# Max Backend - Stock Exchange Matching Engine - -The backend service for Max stock exchange platform, built with Spring Boot. This service handles order matching, trade execution, and provides RESTful APIs for the frontend. - -## 🏗️ Architecture - -``` -backend/ -├── matching-engine/ # Main matching engine service -│ ├── src/ -│ │ ├── main/ -│ │ │ ├── java/org/example/ -│ │ │ └── resources/ -│ │ │ └── application.properties -│ │ └── test/ -│ ├── journals/ # Engine logs -│ └── pom.xml -├── common/ # Shared utilities and models -│ ├── src/main/java/org/example/ -│ └── pom.xml -└── src/ # Additional source files -``` - -## 🛠️ Technology Stack - -- **Framework**: Spring Boot 3.2.2 -- **Language**: Java 17+ -- **Build Tool**: Maven -- **Parent**: Spring Boot Starter Parent 3.2.2 - -### Key Dependencies - -- **Spring Boot Starter Web**: RESTful API development -- **Spring Boot Starter Validation**: Input validation -- **Lombok**: Reduce boilerplate code -- **JUnit Jupiter 5.10.0**: Unit testing - -## 📋 Prerequisites - -- Java Development Kit (JDK) 17 or higher -- Maven 3.6 or higher -- IDE (IntelliJ IDEA, Eclipse, or VS Code recommended) - -## 🚀 Getting Started - -### 1. Install Dependencies - -Navigate to the matching-engine directory: -```bash -cd backend/matching-engine -``` - -Install all dependencies: -```bash -mvn clean install -``` - -### 2. Configure Application - -Edit `src/main/resources/application.properties`: -```properties -# Server Configuration -server.port=8080 - -# Application Name -spring.application.name=matching-engine - -# Logging Configuration -logging.level.org.example=DEBUG -logging.file.name=journals/engine.log -``` - -### 3. Run the Application - -**Using Maven:** -```bash -mvn spring-boot:run -``` - -**Using Java:** -```bash -mvn clean package -java -jar target/matching-engine-1.0-SNAPSHOT.jar -``` - -The application will start on `http://localhost:8080` - -## 🧪 Testing - -### Run All Tests -```bash -mvn test -``` - -### Run Specific Test -```bash -mvn test -Dtest=YourTestClassName -``` - -### Generate Test Coverage Report -```bash -mvn clean test jacoco:report -``` - -## 📁 Project Modules - -### Matching Engine -The core service that handles: -- Order matching logic -- Trade execution -- Market data management -- RESTful API endpoints - -### Common Module -Shared utilities and models used across services: -- Data models -- Utility classes -- Common configurations -- Shared constants - -## 🔧 Development - -### Build the Project -```bash -mvn clean install -``` - -### Run in Development Mode -```bash -mvn spring-boot:run -Dspring-boot.run.profiles=dev -``` - -### Package for Production -```bash -mvn clean package -DskipTests -``` - -## 📊 API Endpoints - -### Health Check -``` -GET /actuator/health -``` - -### Order Management -``` -POST /api/orders # Create new order -GET /api/orders/{id} # Get order by ID -GET /api/orders # List all orders -DELETE /api/orders/{id} # Cancel order -``` - -### Market Data -``` -GET /api/markets # List all markets -GET /api/markets/{id} # Get market details -``` - -## 🐛 Debugging - -### Enable Debug Logging -Add to `application.properties`: -```properties -logging.level.org.example=DEBUG -logging.level.org.springframework.web=DEBUG -``` - -### View Logs -```bash -tail -f journals/engine.log -``` - -## 🔒 Security Considerations - -- Input validation using Spring Validation -- CORS configuration for frontend integration -- Request/Response logging for audit trails - -## 📈 Performance - -- Optimized order matching algorithm -- Efficient data structures for order books -- Asynchronous processing where applicable - -## 🚀 Deployment - -### Build Docker Image (Future) -```bash -docker build -t max-backend:latest . -docker run -p 8080:8080 max-backend:latest -``` - -### Environment Variables -```bash -SPRING_PROFILES_ACTIVE=prod -SERVER_PORT=8080 -``` - -## 📝 Code Style - -- Follow Java naming conventions -- Use Lombok annotations to reduce boilerplate -- Write unit tests for all business logic -- Document complex algorithms - -## 🔄 CI/CD - -### Maven Lifecycle -1. `mvn clean` - Clean build artifacts -2. `mvn compile` - Compile source code -3. `mvn test` - Run tests -4. `mvn package` - Create JAR file -5. `mvn install` - Install to local repository - -## 🐞 Troubleshooting - -### Port Already in Use -```bash -# Change port in application.properties -server.port=8081 -``` - -### Maven Build Fails -```bash -# Clean and rebuild -mvn clean install -U -``` - -### Lombok Not Working -- Install Lombok plugin in your IDE -- Enable annotation processing - -## 📚 Additional Resources - -- [Spring Boot Documentation](https://spring.io/projects/spring-boot) -- [Maven Documentation](https://maven.apache.org/guides/) -- [Lombok Documentation](https://projectlombok.org/) - -## 🤝 Contributing - -1. Create a feature branch -2. Write tests for new features -3. Ensure all tests pass -4. Follow code style guidelines -5. Submit a pull request - -## 📄 License - -This project is private and proprietary. diff --git a/backend/common/pom.xml b/backend/common/pom.xml deleted file mode 100644 index 4b082cf..0000000 --- a/backend/common/pom.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - 4.0.0 - - - - org.example - Strongx - 1.0-SNAPSHOT - - - common - - diff --git a/backend/common/src/main/java/org/example/Main.java b/backend/common/src/main/java/org/example/Main.java deleted file mode 100644 index 407f157..0000000 --- a/backend/common/src/main/java/org/example/Main.java +++ /dev/null @@ -1,7 +0,0 @@ -package org.example; - -public class Main { - public static void main(String[] args) { - System.out.println("Hello world!"); - } -} \ No newline at end of file diff --git a/backend/common/target/classes/org/example/Main.class b/backend/common/target/classes/org/example/Main.class deleted file mode 100644 index c37bb3df14c0c383d1a1fd2c3321348b255d63b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 540 zcmZvZ%T59@6o&tD8)h5@LGZ5N3S2l#7Z_cb7#Da+Fl<~EY_Oy=C1vpPSh~=}g%99E z8BYfjFQJRmoc}-P>uLM(`SuRr2s<89NIS^*$Rfv39P&FJC>{-hi{4Q5V}{&;jAVSs zkZv@)F7j|4cs}Of|0(Z0j$;v0m7Y*jrJaDJ4la$1;!bP?4_kRGF!-lJDP6nQM%~ms z6tU=_T)A({w-$WTRBd=f1nnT!UR}tT+ce6d~OERTb^MvcpW`4 zeQ_e~(XJhB&t4OCROs>TN`cwur?^a6Ks%#7yZZ|El-Mg2tqr8HO3|MdU=8b(x!Axa lDYkh(fsytMr!@b9!VkcHHBspYbH5-iwy;e)Lyckz^)H#vaC-m% diff --git a/backend/common/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/backend/common/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst deleted file mode 100644 index 492813d..0000000 --- a/backend/common/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +++ /dev/null @@ -1 +0,0 @@ -org/example/Main.class diff --git a/backend/common/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/backend/common/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst deleted file mode 100644 index e5787ba..0000000 --- a/backend/common/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +++ /dev/null @@ -1 +0,0 @@ -/Users/aumpatel/Desktop/Spring/Strongx/common/src/main/java/org/example/Main.java diff --git a/backend/journals/engine.log b/backend/journals/engine.log deleted file mode 100644 index a19b55f..0000000 --- a/backend/journals/engine.log +++ /dev/null @@ -1,87 +0,0 @@ -ORDER 555a6afb-fb3e-41c5-9544-cdbc96ed4fa2 seller1 SELL 100 10 1771557534336 -ORDER c5077dcb-c587-4543-9c0b-3da1589504a8 buyer1 BUY 105 4 1771557534365 -TRADE c5077dcb-c587-4543-9c0b-3da1589504a8 555a6afb-fb3e-41c5-9544-cdbc96ed4fa2 100 4 1771557534365 -ORDER f4b788e6-632c-48c1-9eff-30880619b16d buyer2 BUY 100 6 1771557534365 -TRADE f4b788e6-632c-48c1-9eff-30880619b16d 555a6afb-fb3e-41c5-9544-cdbc96ed4fa2 100 6 1771557534366 -ORDER 729e42d0-bf4a-4dbd-a666-3adb0fd9c136 seller1 SELL 100 10 1772083565558 -ORDER c64a2e5d-1e54-4568-bee3-990fe3cde36b buyer1 BUY 105 4 1772083565592 -TRADE c64a2e5d-1e54-4568-bee3-990fe3cde36b 729e42d0-bf4a-4dbd-a666-3adb0fd9c136 100 4 1772083565592 -ORDER 92220288-5c9e-4a1a-9a10-88d14f297953 buyer2 BUY 100 6 1772083565593 -TRADE 92220288-5c9e-4a1a-9a10-88d14f297953 729e42d0-bf4a-4dbd-a666-3adb0fd9c136 100 6 1772083565593 -ORDER 9e2a8036-019a-48e2-a22a-f3e2bf1dd1cc seller1 SELL 100 10 -ORDER 9e2a8036-019a-48e2-a22a-f3e2bf1dd1cc seller1 SELL 100 10 1772083565594 -ORDER 278fdfd7-6893-4d50-923a-0a694dca0884 buyer1 BUY 105 4 -ORDER 278fdfd7-6893-4d50-923a-0a694dca0884 buyer1 BUY 105 4 1772083565594 -TRADE 278fdfd7-6893-4d50-923a-0a694dca0884 9e2a8036-019a-48e2-a22a-f3e2bf1dd1cc 100 4 1772083565594 -TRADE 278fdfd7-6893-4d50-923a-0a694dca0884 9e2a8036-019a-48e2-a22a-f3e2bf1dd1cc 100 4 -ORDER 02956e10-2d87-4a95-93e1-5c9de14c0d0b buyer1 BUY 100 6 -ORDER 02956e10-2d87-4a95-93e1-5c9de14c0d0b buyer1 BUY 100 6 1772083565594 -TRADE 02956e10-2d87-4a95-93e1-5c9de14c0d0b 9e2a8036-019a-48e2-a22a-f3e2bf1dd1cc 100 6 1772083565595 -TRADE 02956e10-2d87-4a95-93e1-5c9de14c0d0b 9e2a8036-019a-48e2-a22a-f3e2bf1dd1cc 100 6 -ORDER 64cbfaf9-f583-44fc-a836-1187c5003ebe seller1 SELL 100 10 1772670798630 -ORDER d69ce365-223d-4776-a5dd-d30cc7a8a912 buyer1 BUY 105 4 1772670798732 -TRADE d69ce365-223d-4776-a5dd-d30cc7a8a912 64cbfaf9-f583-44fc-a836-1187c5003ebe 100 4 1772670798733 -ORDER 8891349c-44e5-408c-8ce0-989ec39e24ca buyer2 BUY 100 6 1772670798734 -TRADE 8891349c-44e5-408c-8ce0-989ec39e24ca 64cbfaf9-f583-44fc-a836-1187c5003ebe 100 6 1772670798734 -ORDER 0b7b68d9-c8d6-4cda-a3c5-f6aa4e9d1330 seller1 SELL 100 10 -ORDER 0b7b68d9-c8d6-4cda-a3c5-f6aa4e9d1330 seller1 SELL 100 10 1772670871847 -ORDER 0b5e5139-84c9-4698-a906-e868092f3308 buyer1 BUY 105 4 -ORDER 0b5e5139-84c9-4698-a906-e868092f3308 buyer1 BUY 105 4 1772670872856 -TRADE 0b5e5139-84c9-4698-a906-e868092f3308 0b7b68d9-c8d6-4cda-a3c5-f6aa4e9d1330 100 4 1772671176205 -TRADE 0b5e5139-84c9-4698-a906-e868092f3308 0b7b68d9-c8d6-4cda-a3c5-f6aa4e9d1330 100 4 -ORDER b2557f88-8c0f-446d-8e70-010b17b2c2c8 buyer1 BUY 100 6 -ORDER b2557f88-8c0f-446d-8e70-010b17b2c2c8 buyer1 BUY 100 6 1772670876431 -TRADE b2557f88-8c0f-446d-8e70-010b17b2c2c8 0b7b68d9-c8d6-4cda-a3c5-f6aa4e9d1330 100 6 1772671176208 -TRADE b2557f88-8c0f-446d-8e70-010b17b2c2c8 0b7b68d9-c8d6-4cda-a3c5-f6aa4e9d1330 100 6 -ORDER 9ebc90e5-eac2-4ed2-bd23-87dc5f9fad78 seller1 SELL 100 10 1772671494015 -ORDER e6791c03-baf8-4f62-8742-ca2046593854 buyer1 BUY 105 4 1772671494047 -TRADE e6791c03-baf8-4f62-8742-ca2046593854 9ebc90e5-eac2-4ed2-bd23-87dc5f9fad78 100 4 1772671494047 -ORDER d6177034-7805-4d88-a13c-ccff65a03a40 buyer2 BUY 100 6 1772671494049 -TRADE d6177034-7805-4d88-a13c-ccff65a03a40 9ebc90e5-eac2-4ed2-bd23-87dc5f9fad78 100 6 1772671494049 -ORDER 759faf99-a021-4608-bdc7-656bfa915a95 seller1 SELL 100 10 -ORDER 759faf99-a021-4608-bdc7-656bfa915a95 seller1 SELL 100 10 1772671494058 -ORDER f3bd642f-8fa9-4d48-94e7-04bcbb39e49a buyer1 BUY 105 4 -ORDER f3bd642f-8fa9-4d48-94e7-04bcbb39e49a buyer1 BUY 105 4 1772671494058 -TRADE f3bd642f-8fa9-4d48-94e7-04bcbb39e49a 759faf99-a021-4608-bdc7-656bfa915a95 100 4 1772671494060 -TRADE f3bd642f-8fa9-4d48-94e7-04bcbb39e49a 759faf99-a021-4608-bdc7-656bfa915a95 100 4 -ORDER 9a5d71f3-1351-403f-a9f6-019f3a5657af buyer1 BUY 100 6 -ORDER 9a5d71f3-1351-403f-a9f6-019f3a5657af buyer1 BUY 100 6 1772671494058 -TRADE 9a5d71f3-1351-403f-a9f6-019f3a5657af 759faf99-a021-4608-bdc7-656bfa915a95 100 6 1772671494061 -TRADE 9a5d71f3-1351-403f-a9f6-019f3a5657af 759faf99-a021-4608-bdc7-656bfa915a95 100 6 -ORDER cd18202b-085c-44d6-a5b6-3598fe8494e6 seller1 SELL 100 10 1772752285238 -ORDER cfe88003-6f8f-4a3a-8236-27b7c139f04d buyer1 BUY 105 4 1772752285262 -TRADE cfe88003-6f8f-4a3a-8236-27b7c139f04d cd18202b-085c-44d6-a5b6-3598fe8494e6 100 4 1772752285262 -ORDER 6b68b475-9229-4bc2-aa10-66298c6e9928 buyer2 BUY 100 6 1772752285264 -TRADE 6b68b475-9229-4bc2-aa10-66298c6e9928 cd18202b-085c-44d6-a5b6-3598fe8494e6 100 6 1772752285264 -ORDER 28e6dec6-2781-4ad0-8230-7cc1de99f41e seller1 SELL 100 10 -ORDER 28e6dec6-2781-4ad0-8230-7cc1de99f41e seller1 SELL 100 10 1772752285268 -ORDER 4e0a0c16-518b-42c4-b40b-4504645951d4 buyer1 BUY 105 4 -ORDER 4e0a0c16-518b-42c4-b40b-4504645951d4 buyer1 BUY 105 4 1772752285268 -TRADE 4e0a0c16-518b-42c4-b40b-4504645951d4 28e6dec6-2781-4ad0-8230-7cc1de99f41e 100 4 1772752285270 -TRADE 4e0a0c16-518b-42c4-b40b-4504645951d4 28e6dec6-2781-4ad0-8230-7cc1de99f41e 100 4 -ORDER ee65a46b-8063-4a87-b6bc-ee9301e48e35 buyer1 BUY 100 6 -ORDER ee65a46b-8063-4a87-b6bc-ee9301e48e35 buyer1 BUY 100 6 1772752285268 -TRADE ee65a46b-8063-4a87-b6bc-ee9301e48e35 28e6dec6-2781-4ad0-8230-7cc1de99f41e 100 6 1772752285270 -TRADE ee65a46b-8063-4a87-b6bc-ee9301e48e35 28e6dec6-2781-4ad0-8230-7cc1de99f41e 100 6 -ORDER_PLACED: c61d527c-d5a2-46cd-b7bd-1e2e7dd1813b -ORDER c61d527c-d5a2-46cd-b7bd-1e2e7dd1813b user123 BUY 150 10 1772754586115 -ORDER_PLACED: 9f12d7ee-5ad2-4702-83fb-4fd4faa682fe -ORDER 9f12d7ee-5ad2-4702-83fb-4fd4faa682fe user123 BUY 150 10 1772755348807 -ORDER_PLACED: 4cef0377-341d-4b13-8856-f44b1ad24656 -ORDER 4cef0377-341d-4b13-8856-f44b1ad24656 user-seller SELL 150 10 1772756125478 -ORDER_PLACED: 44655cad-3469-4cfb-899c-c1dacd78ccda -ORDER 44655cad-3469-4cfb-899c-c1dacd78ccda user1 BUY 100 10 1772756456024 -ORDER_PLACED: a16f2f1b-2e4b-48f0-8a6f-7ce51f4bc94b -ORDER a16f2f1b-2e4b-48f0-8a6f-7ce51f4bc94b user-seller SELL 150 10 1772759912084 -ORDER_PLACED: a1d913c4-317e-4f88-9c2e-05c2d422d7bb -ORDER a1d913c4-317e-4f88-9c2e-05c2d422d7bb user1 BUY 100 10 1772759987885 -ORDER_PLACED: 3db5fb8c-f24b-4674-8a4b-cbadc7fede32 -ORDER 3db5fb8c-f24b-4674-8a4b-cbadc7fede32 user-seller SELL 150 10 1772760831791 -ORDER_PLACED: 562de0cc-8ba3-4264-8158-98904cbce14d -ORDER 562de0cc-8ba3-4264-8158-98904cbce14d user1 BUY 100 10 1772760849537 -ORDER_PLACED: 9320ee7a-9fef-4449-bf80-f2c2ef83cc88 -ORDER 9320ee7a-9fef-4449-bf80-f2c2ef83cc88 user-seller SELL 150 10 1772761342572 -ORDER_PLACED: b7a13e53-93ee-46b0-8ddb-8fa9e26ebe5f -ORDER b7a13e53-93ee-46b0-8ddb-8fa9e26ebe5f user1 BUY 151 10 1772761362103 -TRADE b7a13e53-93ee-46b0-8ddb-8fa9e26ebe5f 9320ee7a-9fef-4449-bf80-f2c2ef83cc88 150 10 1772761362107 -TRADE_SETTLED: b7a13e53-93ee-46b0-8ddb-8fa9e26ebe5f <-> 9320ee7a-9fef-4449-bf80-f2c2ef83cc88 diff --git a/backend/matching-engine/README.md b/backend/matching-engine/README.md deleted file mode 100644 index 12dbdd6..0000000 --- a/backend/matching-engine/README.md +++ /dev/null @@ -1 +0,0 @@ -Max is Stock Exchange being written in Spring Boot diff --git a/backend/matching-engine/journals/engine.log b/backend/matching-engine/journals/engine.log deleted file mode 100644 index 87647fd..0000000 --- a/backend/matching-engine/journals/engine.log +++ /dev/null @@ -1,53 +0,0 @@ -ORDER c78afcd8-aa27-4770-866b-840efa1dcad2 seller1 SELL 100 10 1772752218574 -ORDER 8a44bcdf-4b7a-4bfb-b94c-792f629cd9f1 buyer1 BUY 105 4 1772752218582 -TRADE 8a44bcdf-4b7a-4bfb-b94c-792f629cd9f1 c78afcd8-aa27-4770-866b-840efa1dcad2 100 4 1772752218582 -ORDER 2c267f3a-4da6-4060-bb5b-de3fa97f6029 buyer2 BUY 100 6 1772752218583 -TRADE 2c267f3a-4da6-4060-bb5b-de3fa97f6029 c78afcd8-aa27-4770-866b-840efa1dcad2 100 6 1772752218583 -ORDER a692a971-2eae-4de6-b469-2bff7c12c7ec seller1 SELL 100 10 -ORDER a692a971-2eae-4de6-b469-2bff7c12c7ec seller1 SELL 100 10 1772752218586 -ORDER 9a4428f5-1e36-4bf6-a7e7-2b0900bb62e8 buyer1 BUY 105 4 -ORDER 9a4428f5-1e36-4bf6-a7e7-2b0900bb62e8 buyer1 BUY 105 4 1772752218586 -TRADE 9a4428f5-1e36-4bf6-a7e7-2b0900bb62e8 a692a971-2eae-4de6-b469-2bff7c12c7ec 100 4 1772752218586 -TRADE 9a4428f5-1e36-4bf6-a7e7-2b0900bb62e8 a692a971-2eae-4de6-b469-2bff7c12c7ec 100 4 -ORDER a8eaddb2-4f1f-4df0-a28b-c365b37c6911 buyer1 BUY 100 6 -ORDER a8eaddb2-4f1f-4df0-a28b-c365b37c6911 buyer1 BUY 100 6 1772752218586 -TRADE a8eaddb2-4f1f-4df0-a28b-c365b37c6911 a692a971-2eae-4de6-b469-2bff7c12c7ec 100 6 1772752218587 -TRADE a8eaddb2-4f1f-4df0-a28b-c365b37c6911 a692a971-2eae-4de6-b469-2bff7c12c7ec 100 6 -ORDER 5362fffb-146f-40b0-a9e1-fb84dd970ac7 seller1 SELL 100 10 1772760358808 -ORDER 0211741a-8fa1-4a25-8b1d-1237a52f9211 buyer1 BUY 105 4 1772760358814 -TRADE 0211741a-8fa1-4a25-8b1d-1237a52f9211 5362fffb-146f-40b0-a9e1-fb84dd970ac7 100 4 1772760358815 -ORDER 898a8498-ad4e-434b-8abe-5f5d20ae3173 buyer2 BUY 100 6 1772760358816 -TRADE 898a8498-ad4e-434b-8abe-5f5d20ae3173 5362fffb-146f-40b0-a9e1-fb84dd970ac7 100 6 1772760358816 -REJECT 6b224bfc-c1e8-46d7-b0a3-ac0de2b49358 INSUFFICIENT_FUNDS -ORDER f9712aa9-acba-43aa-adda-cb5a7adf145d buyer1 BUY 105 4 -ORDER f9712aa9-acba-43aa-adda-cb5a7adf145d buyer1 BUY 105 4 1772760358817 -ORDER c2cd976b-335c-4592-a644-d0d07db87af1 buyer1 BUY 100 6 -ORDER c2cd976b-335c-4592-a644-d0d07db87af1 buyer1 BUY 100 6 1772760358817 -ORDER 37c7fb05-1c35-4f6c-9407-3e01713a1ea9 seller1 SELL 100 10 1772760473119 -ORDER 05f435ca-b3b9-4288-a979-062eef0f5e06 buyer1 BUY 105 4 1772760473125 -TRADE 05f435ca-b3b9-4288-a979-062eef0f5e06 37c7fb05-1c35-4f6c-9407-3e01713a1ea9 100 4 1772760473125 -ORDER ce8d19be-00e6-4e0b-8056-2f468e5d540a buyer2 BUY 100 6 1772760473126 -TRADE ce8d19be-00e6-4e0b-8056-2f468e5d540a 37c7fb05-1c35-4f6c-9407-3e01713a1ea9 100 6 1772760473126 -REJECT debaf786-7218-4204-9bed-55e5d79c5e16 INSUFFICIENT_FUNDS -ORDER d5f67c56-67c3-4dac-967d-8b54cc41d1b6 buyer1 BUY 105 4 -ORDER d5f67c56-67c3-4dac-967d-8b54cc41d1b6 buyer1 BUY 105 4 1772760473129 -ORDER a204eca1-a5db-4d75-855f-64ca63a755db buyer1 BUY 100 6 -ORDER a204eca1-a5db-4d75-855f-64ca63a755db buyer1 BUY 100 6 1772760473129 -ORDER_PLACED: e72d00ac-eb7b-42ab-bf3b-f9e568c32ea4 -ORDER e72d00ac-eb7b-42ab-bf3b-f9e568c32ea4 user-seller SELL 100 10 1772760703367 -ORDER_PLACED: cbeb1b27-a8fa-45b2-9bd0-459cc73c3466 -ORDER cbeb1b27-a8fa-45b2-9bd0-459cc73c3466 user1 BUY 100 10 1772760707390 -TRADE cbeb1b27-a8fa-45b2-9bd0-459cc73c3466 e72d00ac-eb7b-42ab-bf3b-f9e568c32ea4 100 10 1772760707390 -TRADE_SETTLED: cbeb1b27-a8fa-45b2-9bd0-459cc73c3466 <-> e72d00ac-eb7b-42ab-bf3b-f9e568c32ea4 -ORDER_PLACED: e5bb5cfc-bb06-4a16-9af5-5e91f72c7a0c -ORDER e5bb5cfc-bb06-4a16-9af5-5e91f72c7a0c user-seller SELL 150 10 1772761274302 -ORDER_PLACED: aa3558d9-7e18-41d7-b6e5-00e3e0c69788 -ORDER aa3558d9-7e18-41d7-b6e5-00e3e0c69788 user1 BUY 151 10 1772761274334 -TRADE aa3558d9-7e18-41d7-b6e5-00e3e0c69788 e5bb5cfc-bb06-4a16-9af5-5e91f72c7a0c 150 10 1772761274335 -TRADE_SETTLED: aa3558d9-7e18-41d7-b6e5-00e3e0c69788 <-> e5bb5cfc-bb06-4a16-9af5-5e91f72c7a0c -ORDER_PLACED: 89a0af09-0b11-467d-ba14-c015ea52007c -ORDER 89a0af09-0b11-467d-ba14-c015ea52007c user-seller SELL 150 10 1772837899360 -ORDER_PLACED: 14e62193-7644-460c-bc0e-e6f9f9eb8ff9 -ORDER 14e62193-7644-460c-bc0e-e6f9f9eb8ff9 user1 BUY 151 10 1772837899385 -TRADE 14e62193-7644-460c-bc0e-e6f9f9eb8ff9 89a0af09-0b11-467d-ba14-c015ea52007c 150 10 1772837899386 -TRADE_SETTLED: 14e62193-7644-460c-bc0e-e6f9f9eb8ff9 <-> 89a0af09-0b11-467d-ba14-c015ea52007c diff --git a/backend/matching-engine/pom.xml b/backend/matching-engine/pom.xml deleted file mode 100644 index 8e0bcd4..0000000 --- a/backend/matching-engine/pom.xml +++ /dev/null @@ -1,50 +0,0 @@ - - - 4.0.0 - - - org.springframework.boot - spring-boot-starter-parent - 3.2.2 - - - - org.example - matching-engine - 1.0-SNAPSHOT - - - - - org.example - common - 1.0-SNAPSHOT - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-validation - - - org.projectlombok - lombok - true - - - org.springframework.boot - spring-boot-starter - - - - org.junit.jupiter - junit-jupiter - 5.10.0 - test - - - \ No newline at end of file diff --git a/backend/matching-engine/src/main/java/org/example/Main.java b/backend/matching-engine/src/main/java/org/example/Main.java deleted file mode 100644 index be87cb5..0000000 --- a/backend/matching-engine/src/main/java/org/example/Main.java +++ /dev/null @@ -1,109 +0,0 @@ -package org.example; - -import org.example.matching.Replay; -import org.example.matching.Wallets.InMemoryWalletService; -import org.example.matching.Wallets.RiskManager; -import org.example.matching.journal.EventJournal; -import org.example.matching.matching.MatchingEngine; -import org.example.matching.model.Order; -import org.example.matching.model.OrderBook; -import org.example.matching.model.OrderSide; -import org.example.matching.model.Trade; -import org.example.matching.orderbook.InMemoryOrderRepository; -import org.example.matching.orderbook.OrderOrchestrator; -import org.example.matching.orderbook.OrderRepository; -import org.example.matching.validation.OrderValidator; -import org.example.matching.util.IdGenerator; - -import java.util.List; -import java.util.UUID; - -public class Main { - public static void main(String[] args) { - System.out.println("=== PART A: Engine-only smoke test ==="); - engineSmokeTest(); - - System.out.println("\n\n=== PART B: Full orchestrator E2E test ==="); - orchestratorE2ETest(); - - System.out.println("\n\n=== PART C: Replay test ==="); - replayTest(); - } - - private static void engineSmokeTest(){ - System.out.println("Testing MatchingEngine directly..."); - MatchingEngine engine = new MatchingEngine(); - - Order s1 = new Order(IdGenerator.newId(),"seller1",100L,10,System.currentTimeMillis(),OrderSide.SELL, "AAPL"); - engine.placeOrder(s1); - System.out.println("After SELL (10 @100):"); - System.out.println(engine.dumpBook()); - - Order b1 = new Order(IdGenerator.newId(), "buyer1", 105L, 4, System.currentTimeMillis(), OrderSide.BUY, "AAPL"); - List t1 = engine.placeOrder(b1); - System.out.println("Trade executed: " + t1.size() + " trade(s)"); - System.out.println(engine.dumpBook()); - - Order b2 = new Order(IdGenerator.newId(), "buyer2", 100L, 6, System.currentTimeMillis(), OrderSide.BUY, "AAPL"); - List t2 = engine.placeOrder(b2); - System.out.println("Trade executed: " + t2.size() + " trade(s)"); - System.out.println("Final order book:\n" + engine.dumpBook()); - } - - - private static void orchestratorE2ETest(){ - System.out.println("Testing full orchestrator with wallet integration..."); - OrderRepository orderRepo = new InMemoryOrderRepository(); - InMemoryWalletService walletService = new InMemoryWalletService(orderRepo); - RiskManager riskManager = new RiskManager(walletService, orderRepo); - EventJournal journal = new EventJournal(); - MatchingEngine engine = new MatchingEngine(); - - // Create orchestrator with full constructor - OrderOrchestrator orchestrator = new OrderOrchestrator(engine, journal, riskManager, orderRepo, walletService); - - // Top up wallets - walletService.creditUserShares("seller1", 10); - walletService.creditUserCash("buyer1", 10000); - - System.out.println("Initial state - Buyer cash: " + walletService.getWallet("buyer1").getAvailableCash() + - ", Seller shares: " + walletService.getWallet("seller1").getAvailableShares("MARKET")); - - // create orders - Order sell = new Order(UUID.randomUUID().toString(), "seller1", 100L, 10, System.currentTimeMillis(), OrderSide.SELL, "TSLA"); - Order buy1 = new Order(UUID.randomUUID().toString(), "buyer1", 105L, 4, System.currentTimeMillis(), OrderSide.BUY, "TSLA"); - Order buy2 = new Order(UUID.randomUUID().toString(), "buyer1", 100L, 6, System.currentTimeMillis(), OrderSide.BUY, "TSLA"); - - System.out.println("\nSubmitting orders..."); - orchestrator.submitOrder(sell); - orchestrator.submitOrder(buy1); - orchestrator.submitOrder(buy2); - - // final state - System.out.println("\nFinal order book:"); - System.out.println(engine.dumpBook()); - - System.out.println("\nFinal wallet balances:"); - System.out.println("Buyer - Cash: " + walletService.getWallet("buyer1").getAvailableCash() + - ", Shares: " + walletService.getWallet("buyer1").getAvailableShares("MARKET")); - System.out.println("Seller - Cash: " + walletService.getWallet("seller1").getAvailableCash() + - ", Shares: " + walletService.getWallet("seller1").getAvailableShares("MARKET")); - - // Show only recent journal entries (last 10) - System.out.println("\nRecent journal entries:"); - List lines = journal.readAllLines(); - int start = Math.max(0, lines.size() - 10); - for (int i = start; i < lines.size(); i++) { - System.out.println(lines.get(i)); - } - } - - private static void replayTest(){ - System.out.println("Testing journal replay functionality..."); - MatchingEngine engine2 = new MatchingEngine(); - Replay r = new Replay(engine2); - r.replayJournal(); - System.out.println("Reconstructed order book:"); - System.out.println(engine2.dumpBook()); - } -} \ No newline at end of file diff --git a/backend/matching-engine/src/main/java/org/example/matching/MatchingEngineApplication.java b/backend/matching-engine/src/main/java/org/example/matching/MatchingEngineApplication.java deleted file mode 100644 index 5f1340d..0000000 --- a/backend/matching-engine/src/main/java/org/example/matching/MatchingEngineApplication.java +++ /dev/null @@ -1,11 +0,0 @@ -package org.example.matching; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@SpringBootApplication -public class MatchingEngineApplication { - public static void main(String[] args) { - SpringApplication.run(MatchingEngineApplication.class, args); - } -} diff --git a/backend/matching-engine/src/main/java/org/example/matching/Replay.java b/backend/matching-engine/src/main/java/org/example/matching/Replay.java deleted file mode 100644 index 41b53bd..0000000 --- a/backend/matching-engine/src/main/java/org/example/matching/Replay.java +++ /dev/null @@ -1,98 +0,0 @@ -//package org.example.matching; -// -//import org.example.matching.matching.MatchingEngine; -//import org.example.matching.model.Order; -//import org.example.matching.model.OrderBook; -//import org.example.matching.model.OrderSide; -// -//import java.io.BufferedReader; -//import java.io.File; -//import java.io.FileReader; -//import java.io.IOException; -//import java.util.Scanner; -// -//public class Replay { -// // MatchingEngine matchingEngine = new MatchingEngine(); -// -// public void replayJournal(String filePath, OrderBook book) { -// try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) { -// String line; -// while ((line = reader.readLine()) != null) { -// String[] tokens = line.trim().split("\\s+"); -// -// if (tokens.length >= 7 && tokens[0].equals("ORDER")) { -// try { -// String id = tokens[1]; -// String userId = tokens[2]; -// -// // FIXED INDICES BASED ON YOUR LOG: -// long price = Long.parseLong(tokens[3]); // Was [4] -// int quantity = Integer.parseInt(tokens[4]); // Was [5] -// long timestamp = Long.parseLong(tokens[5]); -// OrderSide side = OrderSide.valueOf(tokens[6].toUpperCase()); -// -// Order reOrder = new Order(id, userId, price, quantity, timestamp, side); -// -// // Let's add a print here so you can SEE it working -// System.out.println("Replaying: " + side + " " + quantity + " @ " + price); -// -// book.placeOrder(reOrder); -// -// } catch (Exception e) { -// System.err.println("Error parsing line: " + line + " | " + e.getMessage()); -// } -// } -// } -// } catch (IOException e) { -// System.err.println("File not found: " + e.getMessage()); -// } -// }} - - - - -package org.example.matching; - -import org.example.matching.matching.MatchingEngine; -import org.example.matching.model.Order; -import org.example.matching.model.OrderSide; -import org.example.matching.journal.EventJournal; - -import java.util.List; - -public class Replay { - private final MatchingEngine engine; - private final EventJournal journal; - - public Replay(MatchingEngine engine) { - this.engine = engine; - this.journal = new EventJournal(); - } - - public void replayJournal() { - List lines = journal.readAllLines(); - for (String raw : lines) { - if (raw == null || raw.isBlank()) continue; - String[] first = raw.split("\\s+"); - if (first.length < 2) continue; - - if ("ORDER".equals(first[0]) && first.length >= 7) { - try { - String id = first[1]; - String user = first[2]; - String sideToken = first[3]; - long price = Long.parseLong(first[4]); - int qty = Integer.parseInt(first[5]); - long ts = Long.parseLong(first[6]); - OrderSide side = OrderSide.valueOf(sideToken); - Order o = new Order(id, user, price, qty, ts, side, "DEFAULT"); // Use DEFAULT instrument for replay - System.out.println("Replaying: " + side + " " + qty + " @ " + price); - engine.replayOrder(o); // replay mode (no journaling) - } catch (Exception e) { - System.err.println("Skipping malformed ORDER line: " + raw + " -> " + e.getMessage()); - } - } - // ignore TRADE lines - } - } -} diff --git a/backend/matching-engine/src/main/java/org/example/matching/Wallets/InMemoryWalletService.java b/backend/matching-engine/src/main/java/org/example/matching/Wallets/InMemoryWalletService.java deleted file mode 100644 index 88335c0..0000000 --- a/backend/matching-engine/src/main/java/org/example/matching/Wallets/InMemoryWalletService.java +++ /dev/null @@ -1,138 +0,0 @@ -package org.example.matching.Wallets; - -import lombok.RequiredArgsConstructor; -import org.example.matching.model.Order; -import org.example.matching.model.Reservation; -import org.example.matching.model.Trade; -import org.example.matching.model.Wallet; -import org.example.matching.orderbook.OrderRepository; -import org.springframework.stereotype.Service; // Add this import - -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -@Service // Tells Spring this is a managed bean -public class InMemoryWalletService implements WalletService { - - private final Map wallets = new ConcurrentHashMap<>(); - private final Map reservations = new ConcurrentHashMap<>(); - private final OrderRepository orderRepository; - private final String INSTRUMENT = "MARKET"; - - // No-arg constructor for Main.java usage - public InMemoryWalletService() { - this.orderRepository = null; - } - - // Constructor for dependency injection - public InMemoryWalletService(OrderRepository orderRepository) { - this.orderRepository = orderRepository; - } - - private Wallet ensureWallet(String userId) { - return wallets.computeIfAbsent(userId, k -> new Wallet(userId)); - } - - @Override - public boolean reserveForOrder(Order order) { - String userId = order.getUserId(); - String instrument = order.getInstrument(); - Wallet w = ensureWallet(userId); - - if (order.getSide().name().equals("BUY")) { - long required = order.getPrice() * (long) order.getQuantity(); - if (!w.tryReserveCash(required)) return false; - - Reservation r = new Reservation(order.getId(), userId, order.getPrice(), order.getQuantity(), true, instrument); - r.setReservedCash(required); - reservations.put(order.getId(), r); - } else { - if (!w.tryReserveShares(instrument, order.getQuantity())) return false; - - Reservation r = new Reservation(order.getId(), userId, order.getPrice(), order.getQuantity(), false, instrument); - r.setReservedShares(order.getQuantity()); - reservations.put(order.getId(), r); - } - return true; - } - - -@Override -public void releaseReservation(String orderId){ - Reservation r = reservations.remove(orderId); - if(r==null)return; - Wallet w = ensureWallet(r.getUserId()); - if(r.getIsBuy()){ - w.releaseReserveCash(r.getReservedCash()); - - }else{ - w.releaseReservedShares(r.getInstrument(),r.getReservedShares()); - - } - } - - @Override - public void creditUserShares(String userId, long shares) { - Wallet w = ensureWallet(userId); - w.addAvailableShares(INSTRUMENT, shares); - } - - @Override - public void creditUserShares(String userId, String instrument, long shares) { - Wallet w = ensureWallet(userId); - w.addAvailableShares(instrument, shares); - } - - @Override - public void creditUserCash(String userId, long cash) { - Wallet w = ensureWallet(userId); - w.addAvailableCash(cash); - } - - @Override - public Wallet getWallet(String userId) { - return wallets.get(userId); - } - - @Override - public void settleTrade(Trade trade) { - Order buy = orderRepository.findById(trade.getBuyOrderId()).orElse(null); - Order sell = orderRepository.findById(trade.getSellOrderId()).orElse(null); - - if (buy == null || sell == null) return; - - Wallet buyerWallet = ensureWallet(buy.getUserId()); - Wallet sellerWallet = ensureWallet(sell.getUserId()); - Reservation buyRes = reservations.get(buy.getId()); - Reservation sellRes = reservations.get(sell.getId()); - - int qty = (int) trade.getQuantity(); - long tradeValue = trade.getPrice() * (long) qty; - String instrument = buy.getInstrument(); - // Process Buy Side - if (buyRes != null) { - long cashtoDebitFromReserved = buyRes.reduceBy(qty); - buyerWallet.debitReservedCash(cashtoDebitFromReserved); - - long refund = cashtoDebitFromReserved - tradeValue; - if (refund > 0) buyerWallet.addAvailableCash(refund); - - buyerWallet.addAvailableShares(instrument, qty); - } - - // Process Sell Side - if (sellRes != null) { - sellRes.reduceBy(qty); - sellerWallet.debitReservedShares(instrument, (long) qty); - sellerWallet.addAvailableCash(tradeValue); - } - - // Cleanup completed reservations - if (buyRes != null && buyRes.getRemainingQty() == 0) { - reservations.remove(buy.getId()); - } - if (sellRes != null && sellRes.getRemainingQty() == 0) { - reservations.remove(sell.getId()); - } - } -} \ No newline at end of file diff --git a/backend/matching-engine/src/main/java/org/example/matching/Wallets/RiskManager.java b/backend/matching-engine/src/main/java/org/example/matching/Wallets/RiskManager.java deleted file mode 100644 index a452b8a..0000000 --- a/backend/matching-engine/src/main/java/org/example/matching/Wallets/RiskManager.java +++ /dev/null @@ -1,34 +0,0 @@ -package org.example.matching.Wallets; - -import lombok.AllArgsConstructor; -import org.example.matching.model.Order; -import org.example.matching.orderbook.OrderRepository; -import org.springframework.stereotype.Service; - -@Service -public class RiskManager { - - private final WalletService walletService; - private final OrderRepository orderRepository; // 1. Add the field - - // No-arg constructor for Main.java usage - public RiskManager() { - this.walletService = null; - this.orderRepository = null; - } - - // Constructor for dependency injection - public RiskManager(WalletService walletService, OrderRepository orderRepository) { - this.walletService = walletService; - this.orderRepository = orderRepository; - } - - - public boolean checkAndReserve(Order order) { - // currently just delegates to walletService which performs the reserve attempt - //orderRepository.save(order); - - // 2. NOW ATTEMPT TO RESERVE - return walletService.reserveForOrder(order); - } -} \ No newline at end of file diff --git a/backend/matching-engine/src/main/java/org/example/matching/Wallets/WalletService.java b/backend/matching-engine/src/main/java/org/example/matching/Wallets/WalletService.java deleted file mode 100644 index 73c862e..0000000 --- a/backend/matching-engine/src/main/java/org/example/matching/Wallets/WalletService.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.example.matching.Wallets; - -import org.example.matching.model.Order; -import org.example.matching.model.Trade; -import org.example.matching.model.Wallet; - -public interface WalletService { - boolean reserveForOrder(Order order); - void releaseReservation(String orderId); - void settleTrade(Trade trade); - - // Additional methods needed for testing and API - void creditUserShares(String userId, long shares); - void creditUserShares(String userId, String instrument, long shares); - void creditUserCash(String userId, long cash); - Wallet getWallet(String userId); -} diff --git a/backend/matching-engine/src/main/java/org/example/matching/api/advice/ApiExceptionHandler.java b/backend/matching-engine/src/main/java/org/example/matching/api/advice/ApiExceptionHandler.java deleted file mode 100644 index 8c5f10f..0000000 --- a/backend/matching-engine/src/main/java/org/example/matching/api/advice/ApiExceptionHandler.java +++ /dev/null @@ -1,29 +0,0 @@ -package org.example.matching.api.advice; - -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.MethodArgumentNotValidException; -import org.springframework.web.bind.annotation.ExceptionHandler; -import org.springframework.web.bind.annotation.RestControllerAdvice; - -import java.util.HashMap; -import java.util.Map; - -@RestControllerAdvice -public class ApiExceptionHandler { - - // Catch Validation Errors (@Valid) - @ExceptionHandler(MethodArgumentNotValidException.class) - public ResponseEntity> handleValidation(MethodArgumentNotValidException ex) { - Map errors = new HashMap<>(); - ex.getBindingResult().getFieldErrors().forEach(error -> - errors.put(error.getField(), error.getDefaultMessage())); - return ResponseEntity.badRequest().body(errors); - } - - // Catch Custom Logic Errors - @ExceptionHandler(IllegalStateException.class) - public ResponseEntity handleBusinessError(IllegalStateException ex) { - return ResponseEntity.status(HttpStatus.CONFLICT).body(ex.getMessage()); - } -} \ No newline at end of file diff --git a/backend/matching-engine/src/main/java/org/example/matching/api/controller/MarketController.java b/backend/matching-engine/src/main/java/org/example/matching/api/controller/MarketController.java deleted file mode 100644 index d955ddd..0000000 --- a/backend/matching-engine/src/main/java/org/example/matching/api/controller/MarketController.java +++ /dev/null @@ -1,36 +0,0 @@ -package org.example.matching.api.controller; - -import lombok.RequiredArgsConstructor; -import org.example.matching.api.dto.OrderBookResponse; -import org.example.matching.api.service.MarketDataService; -import org.example.matching.matching.MatchingEngine; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.util.Map; - -@RequestMapping("/api/market") -@RestController -@RequiredArgsConstructor -public class MarketController { - private final MatchingEngine matchingEngine; - private final MarketDataService marketDataService; - -// public MarketController(MatchingEngine matchingEngine) { -// this.matchingEngine = matchingEngine; -// } - - @GetMapping("/orderbook/{instrument}") - public ResponseEntity getOrderBook(@PathVariable String instrument) { - OrderBookResponse snapshot = matchingEngine.getSnapshot(instrument); - return ResponseEntity.ok(snapshot); - } - - @GetMapping("/ticker/{instrument}") - public ResponseEntity> getTicker(@PathVariable String instrument){ - return ResponseEntity.ok(marketDataService.getSnapshots(instrument.toUpperCase())); - } -} diff --git a/backend/matching-engine/src/main/java/org/example/matching/api/controller/OrderController.java b/backend/matching-engine/src/main/java/org/example/matching/api/controller/OrderController.java deleted file mode 100644 index 7e6dacd..0000000 --- a/backend/matching-engine/src/main/java/org/example/matching/api/controller/OrderController.java +++ /dev/null @@ -1,39 +0,0 @@ -package org.example.matching.api.controller; - -import jakarta.validation.Valid; -import lombok.RequiredArgsConstructor; -import org.example.matching.api.dto.OrderRequest; -import org.example.matching.api.dto.OrderResponse; -import org.example.matching.api.service.OrderService; -import org.example.matching.model.Order; -import org.example.matching.orderbook.OrderRepository; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -import javax.swing.text.html.parser.Entity; -import java.util.Optional; - -@RestController -@RequestMapping("/api/orders") -@RequiredArgsConstructor -public class OrderController { -private final OrderService orderService; -private final OrderRepository orderRepository; - - @PostMapping - public ResponseEntity placeOrder(@Valid @RequestBody OrderRequest request) { - OrderResponse response = orderService.processOrder(request); - - if (response.getStatus().equals("REJECTED")) { - return ResponseEntity.badRequest().body(response); - } - return ResponseEntity.ok(response); - } - - @GetMapping("/{id}") - public ResponseEntity getOrder(@PathVariable String id){ - return orderRepository.findById(id) - .map(ResponseEntity::ok) - .orElse(ResponseEntity.notFound().build()); - -}} diff --git a/backend/matching-engine/src/main/java/org/example/matching/api/controller/WalletController.java b/backend/matching-engine/src/main/java/org/example/matching/api/controller/WalletController.java deleted file mode 100644 index 2b0b3ba..0000000 --- a/backend/matching-engine/src/main/java/org/example/matching/api/controller/WalletController.java +++ /dev/null @@ -1,59 +0,0 @@ -package org.example.matching.api.controller; - -import lombok.RequiredArgsConstructor; -import org.example.matching.Wallets.WalletService; -import org.example.matching.api.dto.DepositRequest; -import org.example.matching.api.dto.WalletResponse; -import org.example.matching.model.Wallet; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -import java.util.Map; -import java.util.stream.Collectors; - -@RestController -@RequestMapping("/api/wallets") -@RequiredArgsConstructor -public class WalletController { - - private final WalletService walletService; - - @GetMapping("/{userId}") - public ResponseEntity getWallet(@PathVariable String userId){ - Wallet wallet = walletService.getWallet(userId); - - // Convert AtomicLong maps to Long maps for JSON response - Map availableShares = wallet.getAvailableShares().entrySet().stream() - .collect(Collectors.toMap( - Map.Entry::getKey, - entry -> entry.getValue().get() - )); - - Map reservedShares = wallet.getReservedShares().entrySet().stream() - .collect(Collectors.toMap( - Map.Entry::getKey, - entry -> entry.getValue().get() - )); - - WalletResponse response = WalletResponse.builder() - .userId(userId) - .availableCash(wallet.getAvailableCash()) - .reservedCash(wallet.getReservedCash()) - .availableShares(availableShares) - .reservedShares(reservedShares) - .build(); - return ResponseEntity.ok(response); - } - @PostMapping("/depositCash") - public ResponseEntity depositCash(@RequestBody DepositRequest request) { - walletService.creditUserCash(request.getUserId(), request.getAmount()); - return ResponseEntity.ok("Deposit Successful"); - } - - @PostMapping("/depositShares") - public ResponseEntity depositShares(@RequestBody DepositRequest request) { - // Credit shares for the specific instrument - walletService.creditUserShares(request.getUserId(), request.getInstrument(), request.getAmount()); - return ResponseEntity.ok("Shares Deposited Successfully"); - } -} \ No newline at end of file diff --git a/backend/matching-engine/src/main/java/org/example/matching/api/dto/DepositRequest.java b/backend/matching-engine/src/main/java/org/example/matching/api/dto/DepositRequest.java deleted file mode 100644 index 875f533..0000000 --- a/backend/matching-engine/src/main/java/org/example/matching/api/dto/DepositRequest.java +++ /dev/null @@ -1,26 +0,0 @@ -package org.example.matching.api.dto; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@NoArgsConstructor -@AllArgsConstructor -public class DepositRequest { - private String userId; - private long amount; - private String instrument; // Optional: used if depositing shares instead of cash - - public String getUserId() { - return userId; - } - - public long getAmount() { - return amount; - } - - public String getInstrument() { - return instrument; - } -} diff --git a/backend/matching-engine/src/main/java/org/example/matching/api/dto/OrderBookResponse.java b/backend/matching-engine/src/main/java/org/example/matching/api/dto/OrderBookResponse.java deleted file mode 100644 index ce2e349..0000000 --- a/backend/matching-engine/src/main/java/org/example/matching/api/dto/OrderBookResponse.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.example.matching.api.dto; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.util.List; - -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class OrderBookResponse { - private String instrument; - private List bids; - private List asks; -} diff --git a/backend/matching-engine/src/main/java/org/example/matching/api/dto/OrderMapper.java b/backend/matching-engine/src/main/java/org/example/matching/api/dto/OrderMapper.java deleted file mode 100644 index 9d8577f..0000000 --- a/backend/matching-engine/src/main/java/org/example/matching/api/dto/OrderMapper.java +++ /dev/null @@ -1,21 +0,0 @@ -package org.example.matching.api.dto; - -import org.example.matching.model.Order; -import org.example.matching.model.OrderSide; - -import java.util.UUID; - -public class OrderMapper { - public static Order toDomain(OrderRequest request) { - Order order = new Order( - UUID.randomUUID().toString(), - request.getUserId(), - request.getPrice(), - (int) request.getQuantity(), - System.currentTimeMillis(), - OrderSide.valueOf(request.getSide().toUpperCase()) - ); - order.setInstrument(request.getInstrument()); - return order; - } -} \ No newline at end of file diff --git a/backend/matching-engine/src/main/java/org/example/matching/api/dto/OrderRequest.java b/backend/matching-engine/src/main/java/org/example/matching/api/dto/OrderRequest.java deleted file mode 100644 index eba85b9..0000000 --- a/backend/matching-engine/src/main/java/org/example/matching/api/dto/OrderRequest.java +++ /dev/null @@ -1,57 +0,0 @@ -package org.example.matching.api.dto; - -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.Pattern; -import jakarta.validation.constraints.Positive; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.Getter; - -@AllArgsConstructor -@NoArgsConstructor -@Data -@Getter -public class OrderRequest { - @NotBlank(message = "User ID is required") - private String userId; - - @NotBlank(message = "Instrument is required") - private String instrument; - - @Pattern(regexp = "BUY|SELL", message = "Side must be BUY or SELL") - private String side; - - @Positive(message = "Price must be greater than zero") - private long price; - - @Positive(message = "Quantity must be greater than zero") - private long quantity; - - @NotBlank(message = "Idempotency key is required") - private String idempotencyKey; // Unique string from the frontend - - public String getUserId() { - return userId; - } - - public String getInstrument() { - return instrument; - } - - public String getSide() { - return side; - } - - public long getPrice() { - return price; - } - - public long getQuantity() { - return quantity; - } - - public String getIdempotencyKey() { - return idempotencyKey; - } -} \ No newline at end of file diff --git a/backend/matching-engine/src/main/java/org/example/matching/api/dto/OrderResponse.java b/backend/matching-engine/src/main/java/org/example/matching/api/dto/OrderResponse.java deleted file mode 100644 index f9013fe..0000000 --- a/backend/matching-engine/src/main/java/org/example/matching/api/dto/OrderResponse.java +++ /dev/null @@ -1,21 +0,0 @@ -package org.example.matching.api.dto; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class OrderResponse { - private String orderId; - private String status; // "ACCEPTED", "REJECTED" - private String message; // "Insufficient funds" or "Success" - private long timestamp; - - public String getStatus() { - return status; - } -} \ No newline at end of file diff --git a/backend/matching-engine/src/main/java/org/example/matching/api/dto/PriceLevel.java b/backend/matching-engine/src/main/java/org/example/matching/api/dto/PriceLevel.java deleted file mode 100644 index 42a886a..0000000 --- a/backend/matching-engine/src/main/java/org/example/matching/api/dto/PriceLevel.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.example.matching.api.dto; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@NoArgsConstructor -@AllArgsConstructor -public class PriceLevel { - private Long price; - private Long quantity; -} diff --git a/backend/matching-engine/src/main/java/org/example/matching/api/dto/WalletResponse.java b/backend/matching-engine/src/main/java/org/example/matching/api/dto/WalletResponse.java deleted file mode 100644 index ef95c21..0000000 --- a/backend/matching-engine/src/main/java/org/example/matching/api/dto/WalletResponse.java +++ /dev/null @@ -1,20 +0,0 @@ -package org.example.matching.api.dto; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.util.Map; - -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class WalletResponse { - private String userId; - private long availableCash; - private long reservedCash; - private Map availableShares; - private Map reservedShares; -} \ No newline at end of file diff --git a/backend/matching-engine/src/main/java/org/example/matching/api/service/LiquidBotService.java b/backend/matching-engine/src/main/java/org/example/matching/api/service/LiquidBotService.java deleted file mode 100644 index 93bf0e8..0000000 --- a/backend/matching-engine/src/main/java/org/example/matching/api/service/LiquidBotService.java +++ /dev/null @@ -1,29 +0,0 @@ -package org.example.matching.api.service; - -import lombok.RequiredArgsConstructor; -import org.example.matching.api.dto.OrderRequest; -import org.springframework.stereotype.Service; - -@Service -@RequiredArgsConstructor -public class LiquidBotService { - private final OrderService orderService; - public void seedMarket(String yesTicker, String noTicker) { - // Providing liquidity for YES - placeBotOrder(yesTicker, "BUY", 45, 1000); // Bot buys from users at 45c - placeBotOrder(yesTicker, "SELL", 55, 1000); // Bot sells to users at 55c - - // Providing liquidity for NO - placeBotOrder(noTicker, "BUY", 45, 1000); // Bot buys from users at 45c - placeBotOrder(noTicker, "SELL", 55, 1000); // Bot sells to users at 55c - } - private void placeBotOrder(String ticker, String side, long price, long qty){ - OrderRequest req = new OrderRequest(); - req.setUserId("HOUSE_BOT"); - req.setInstrument(ticker); - req.setSide(side); - req.setPrice(price); - req.setQuantity(qty); - orderService.processOrder(req); - } -} \ No newline at end of file diff --git a/backend/matching-engine/src/main/java/org/example/matching/api/service/MarketDataService.java b/backend/matching-engine/src/main/java/org/example/matching/api/service/MarketDataService.java deleted file mode 100644 index 2df098b..0000000 --- a/backend/matching-engine/src/main/java/org/example/matching/api/service/MarketDataService.java +++ /dev/null @@ -1,67 +0,0 @@ -package org.example.matching.api.service; - -import org.springframework.stereotype.Service; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.CopyOnWriteArrayList; - -@Service -public class MarketDataService { - //stores last price each stock is traded at - private final Map lastPrices = new ConcurrentHashMap<>(); - - // Average V(volume)WAP = sum(price*quantity)/sum(quantity) - private final Map sumPV = new ConcurrentHashMap<>(); - private final Map sumV = new ConcurrentHashMap<>(); - // To track the "Top of Book" (Best Bid/Ask) - private final Map bestBids = new ConcurrentHashMap<>(); - private final Map bestAsks = new ConcurrentHashMap<>(); - - public void UpdateTrade(String instrument, long price , long quantity){ - lastPrices.put(instrument,(double)price); - sumPV.merge(instrument,(double)(price*quantity),Double::sum); - sumV.merge(instrument,quantity,Long::sum); - } - - public void updateBookTops(String instrument, Double bestBid, Double bestAsk) { - if (bestBid != null) bestBids.put(instrument, bestBid); - if (bestAsk != null) bestAsks.put(instrument, bestAsk); - } - - - public Map getSnapshots(String instrument){ - double ltp = lastPrices.getOrDefault(instrument,0.0); - double vwap = sumV.getOrDefault(instrument,0L)==0?0: sumPV.get(instrument)/ sumV.get(instrument); - double bid = bestBids.getOrDefault(instrument, 0.0); - double ask = bestAsks.getOrDefault(instrument, 0.0); - double mid = (bid > 0 && ask > 0) ? (bid + ask) / 2.0 : ltp; - - return Map.of( - "instrument", instrument, - "lastPrice", ltp, - "vwap", vwap, - "bid", bid, - "ask", ask, - "mid", mid, - "spread", (ask - bid) - ); - } - - // A list of the last 10 prices - private final Map> priceHistory = new ConcurrentHashMap<>(); - - public void updateTrade(String instrument, long price, long quantity) { - lastPrices.put(instrument, (double) price); - - // Track History - priceHistory.computeIfAbsent(instrument, k -> new CopyOnWriteArrayList<>()) - .add(0, (double) price); // Add to the front - - // Keep only the last 10 - List history = priceHistory.get(instrument); - if (history.size() > 10) history.remove(history.size() - 1); - - // ... (rest of your VWAP logic) - } -} \ No newline at end of file diff --git a/backend/matching-engine/src/main/java/org/example/matching/api/service/OrderService.java b/backend/matching-engine/src/main/java/org/example/matching/api/service/OrderService.java deleted file mode 100644 index 2e749f5..0000000 --- a/backend/matching-engine/src/main/java/org/example/matching/api/service/OrderService.java +++ /dev/null @@ -1,78 +0,0 @@ -package org.example.matching.api.service; - -import lombok.RequiredArgsConstructor; -import org.example.matching.Wallets.RiskManager; -import org.example.matching.Wallets.WalletService; -import org.example.matching.api.dto.OrderMapper; -import org.example.matching.api.dto.OrderRequest; -import org.example.matching.api.dto.OrderResponse; -import org.example.matching.journal.EventJournal; -import org.example.matching.matching.MatchingEngine; -import org.example.matching.model.Order; -import org.example.matching.model.Trade; -import org.example.matching.orderbook.OrderRepository; -import org.springframework.stereotype.Service; - -import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -@Service -@RequiredArgsConstructor -public class OrderService { - - private final MarketDataService marketDataService; - private final RiskManager riskManager; - private final MatchingEngine matchingEngine; - private final WalletService walletService; - private final EventJournal eventJournal; - private final OrderRepository orderRepository; - - // In-memory idempotency store: Key -> Previous Response - private final Map idempotencyStore = new ConcurrentHashMap<>(); - - public OrderResponse processOrder(OrderRequest request) { - if (idempotencyStore.containsKey(request.getIdempotencyKey())) { - return idempotencyStore.get(request.getIdempotencyKey()); - } - - Order order = OrderMapper.toDomain(request); - - if (!riskManager.checkAndReserve(order)) { - return buildResponse(order, "REJECTED", "Insufficient funds or shares"); - } - - orderRepository.save(order); - eventJournal.appendRaw("ORDER_PLACED: " + order.getId()); - - // Matching Engine execution - List trades = matchingEngine.placeOrder(order); - - for (Trade trade : trades) { - // so once trade is done manage the cash and shares of the users using their ids and stuff in walletService below - walletService.settleTrade(trade); - marketDataService.UpdateTrade(order.getInstrument(),trade.getPrice(),trade.getQuantity()); - eventJournal.appendRaw("TRADE_SETTLED: " + trade.getBuyOrderId() + " <-> " + trade.getSellOrderId()); - } - var book = matchingEngine.getOrderBookForMarketData(order.getInstrument()); - marketDataService.updateBookTops( - order.getInstrument(), - book.getBestBid(), - book.getBestAsk() - ); - - OrderResponse response = buildResponse(order, "ACCEPTED", "Success"); - idempotencyStore.put(request.getIdempotencyKey(), response); - return response; - } - - private OrderResponse buildResponse(Order order, String status, String msg) { - return OrderResponse.builder() - .orderId(order.getId()) - .status(status) - .message(msg) - .timestamp(System.currentTimeMillis()) - .build(); - } -} - diff --git a/backend/matching-engine/src/main/java/org/example/matching/app/MatchingEngineApplication.java b/backend/matching-engine/src/main/java/org/example/matching/app/MatchingEngineApplication.java deleted file mode 100644 index 4f808ee..0000000 --- a/backend/matching-engine/src/main/java/org/example/matching/app/MatchingEngineApplication.java +++ /dev/null @@ -1,4 +0,0 @@ -package org.example.matching.app; - -public class MatchingEngineApplication { -} diff --git a/backend/matching-engine/src/main/java/org/example/matching/config/MatchingEngineConfig.java b/backend/matching-engine/src/main/java/org/example/matching/config/MatchingEngineConfig.java deleted file mode 100644 index 918e00c..0000000 --- a/backend/matching-engine/src/main/java/org/example/matching/config/MatchingEngineConfig.java +++ /dev/null @@ -1,40 +0,0 @@ -package org.example.matching.config; - -import org.example.matching.Wallets.InMemoryWalletService; -import org.example.matching.Wallets.RiskManager; -import org.example.matching.Wallets.WalletService; -import org.example.matching.journal.EventJournal; -import org.example.matching.matching.MatchingEngine; -import org.example.matching.orderbook.InMemoryOrderRepository; -import org.example.matching.orderbook.OrderRepository; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -@Configuration -public class MatchingEngineConfig { - - @Bean - public EventJournal eventJournal() { - return new EventJournal(); - } - - @Bean - public OrderRepository orderRepository() { - return new InMemoryOrderRepository(); - } - - @Bean - public WalletService walletService(OrderRepository orderRepository) { - return new InMemoryWalletService(orderRepository); - } - - @Bean - public RiskManager riskManager(WalletService walletService, OrderRepository orderRepository) { - return new RiskManager(walletService, orderRepository); - } - - @Bean - public MatchingEngine matchingEngine(EventJournal eventJournal) { - return new MatchingEngine(); - } -} diff --git a/backend/matching-engine/src/main/java/org/example/matching/journal/EventJournal.java b/backend/matching-engine/src/main/java/org/example/matching/journal/EventJournal.java deleted file mode 100644 index 48d66f5..0000000 --- a/backend/matching-engine/src/main/java/org/example/matching/journal/EventJournal.java +++ /dev/null @@ -1,100 +0,0 @@ -//import lombok.AllArgsConstructor; -// -//import java.io.FileWriter; -//import java.io.IOException; -//import java.nio.file.FileAlreadyExistsException; -//import java.nio.file.Files; -//import java.nio.file.Path; -// -//@AllArgsConstructor -//public class EventJournal { -// private final Path journalDir; -// private final Path journalFile; -// -// public EventJournal() { -// try { -// journalDir = Path.of("journals"); -// Files.createDirectories(journalDir); -// -// journalFile = Path.of("engine.log"); -// try { -// Files.createFile(journalFile); -// } catch (FileAlreadyExistsException e) { -// // File already exists, that's fine -// } -// } catch (IOException e) { -//throw new RuntimeException("failed to journal"); -// } -// -// } -// public synchronized void append(String event){ -// try(FileWriter writer = new FileWriter(journalFile.toFile(),true)){ -// writer.write(event); -// writer.write(System.lineSeparator()); -// writer.flush(); -// } catch (IOException e) { -// throw new RuntimeException("Failed to write to journal", e); -// } -// } -// } -// - -package org.example.matching.journal; - -import java.io.FileWriter; -import java.io.IOException; -import java.nio.file.*; -import java.util.List; - -public class EventJournal { - - private final Path journalDir; - private final Path journalFile; - - public EventJournal() { - try { - journalDir = Path.of("journals"); - Files.createDirectories(journalDir); - journalFile = journalDir.resolve("engine.log"); - if (!Files.exists(journalFile)) { - Files.createFile(journalFile); - } - } catch (IOException e) { - throw new RuntimeException("Failed to initialize EventJournal", e); - } - } - - public synchronized void appendRaw(String eventBody) { - try (FileWriter writer = new FileWriter(journalFile.toFile(), true)) { - writer.write(eventBody); - writer.write(System.lineSeparator()); - writer.flush(); - // for production consider FileDescriptor.sync to fsync() - } catch (IOException e) { - throw new RuntimeException("Failed to write to journal", e); - } - } - - // helpers with consistent format - public void appendOrder(String id, String user, String side, long price, int qty, long ts) { - String line = String.format("ORDER %s %s %s %d %d %d", id, user, side, price, qty, ts); - appendRaw(line); - } - - public void appendTrade(String buyId, String sellId, long price, int qty, long ts) { - String line = String.format("TRADE %s %s %d %d %d", buyId, sellId, price, qty, ts); - appendRaw(line); - } - - public List readAllLines() { - try { - return Files.readAllLines(journalFile); - } catch (IOException e) { - throw new RuntimeException("Failed to read journal", e); - } - } - - public Path getJournalFile() { - return journalFile; - } -} diff --git a/backend/matching-engine/src/main/java/org/example/matching/matching/MatchingEngine.java b/backend/matching-engine/src/main/java/org/example/matching/matching/MatchingEngine.java deleted file mode 100644 index d15634f..0000000 --- a/backend/matching-engine/src/main/java/org/example/matching/matching/MatchingEngine.java +++ /dev/null @@ -1,184 +0,0 @@ -//package org.example.matching.matching; -// -//import org.example.matching.journal.EventJournal; -//import org.example.matching.model.Order; -//import org.example.matching.model.OrderBook; -//import org.example.matching.model.Trade; -// -//import java.util.List; -// -//public class MatchingEngine { -// -// private final OrderBook orderBook; -// private final EventJournal journal; -// -// public MatchingEngine() { -// this.orderBook = new OrderBook(); -// this.journal = new EventJournal(); -// -// } -// -// public List placeOrder(Order order) { -// -// journal.append("ORDER " + -// order.getId() + " " + -// order.getUserId() + " " + -// -// order.getPrice() + " " + -// order.getQuantity() -// +" "+ order.getTimestamp() + " "+ order.getSide()); -// -// List trades = orderBook.placeOrder(order); -// -// for (Trade trade : trades) { -// journal.append("TRADE " + -// trade.getBuyOrderId() + " " + -// trade.getSellOrderId() + " " + -// trade.getPrice() + " " + -// trade.getQuantity() -// +trade.getTimestamp()); -// } -// -// return trades; -// } -// -// public String dumpBook() { -// return orderBook.dumpBook(); -// } -//} - - -package org.example.matching.matching; - -import jakarta.annotation.PostConstruct; -import org.example.matching.api.dto.OrderBookResponse; -import org.example.matching.api.dto.PriceLevel; -import org.example.matching.journal.EventJournal; -import org.example.matching.model.Order; -import org.example.matching.model.OrderBook; -import org.example.matching.model.Trade; -import org.springframework.stereotype.Service; - -import java.util.Deque; -import java.util.List; -import java.util.Map; -import java.util.TreeMap; -import java.util.concurrent.ConcurrentHashMap; - - -@Service -public class MatchingEngine { - - private final Map orderBooks = new ConcurrentHashMap<>(); - private final EventJournal journal; - - public MatchingEngine() { - this.journal = new EventJournal(); - } - - @PostConstruct - public void init() { - // Pre-create books for stocks you want to test - orderBooks.put("AAPL", new OrderBook()); - orderBooks.put("TSLA", new OrderBook()); - orderBooks.put("BTC", new OrderBook()); - } - - // Helper method to get the right order book - private OrderBook getOrderBook(String instrument) { - return orderBooks.computeIfAbsent(instrument, k -> new OrderBook()); - } - // Add this inside your MatchingEngine class - public OrderBook getOrderBookForMarketData(String instrument) { - return orderBooks.getOrDefault(instrument, new OrderBook()); - } - - // live mode records to journal; record=false used during replay - public List placeOrder(Order order, boolean record) { - if (record) { - journal.appendOrder(order.getId(), order.getUserId(), order.getSide().name(), order.getPrice(), order.getQuantity(), order.getTimestamp()); - } - - OrderBook book = getOrderBook(order.getInstrument() != null ? order.getInstrument() : "DEFAULT"); - List trades = book.placeOrder(order); - - if (record) { - for (Trade t : trades) { - journal.appendTrade(t.getBuyOrderId(), t.getSellOrderId(), t.getPrice(), (int) t.getQuantity(), t.getTimestamp()); - } - } - return trades; - } - - // convenience for normal usage - public List placeOrder(Order order) { - return placeOrder(order, true); - } - - // used by replay to rebuild book without re-journaling - public void replayOrder(Order order) { - placeOrder(order, false); - } - - // replay all lines from journal (optional helper) - public void replayJournal() { - List lines = journal.readAllLines(); - for (String raw : lines) { - if (raw == null || raw.isBlank()) continue; - String[] parts = raw.split("\\s+"); - if (parts.length < 2) continue; - if ("ORDER".equals(parts[0]) && parts.length >= 7) { - // ORDER id user side price qty ts - String id = parts[1]; - String user = parts[2]; - String side = parts[3]; - long price = Long.parseLong(parts[4]); - int qty = Integer.parseInt(parts[5]); - long ts = Long.parseLong(parts[6]); - // create order via your Order constructor (check arg ordering) - Order o = new Order(id, user, price, qty, ts, org.example.matching.model.OrderSide.valueOf(side), "DEFAULT"); - replayOrder(o); - } - // ignore TRADE lines during replay - } - } - /** - * Returns a list of price levels for a specific side (bids or asks). - * It sums up the quantities of all orders at each price point. - */ - private List getPriceLevels(TreeMap> side) { - return side.entrySet().stream() - .map(entry -> { - long price = entry.getKey(); - // Sum the quantity of every Order sitting in the Deque for this price - long totalQty = entry.getValue().stream() - .mapToLong(Order::getQuantity) - .sum(); - return new PriceLevel(price, totalQty); - }) - .toList(); - } - - - /** - * Creates a full snapshot of the book. - */ - public OrderBookResponse getSnapshot(String instrument) { - OrderBook book = getOrderBook(instrument); - return OrderBookResponse.builder() - .instrument(instrument) - .bids(getPriceLevels(book.getBids())) - .asks(getPriceLevels(book.getAsks())) - .build(); - } - - public String dumpBook() { - StringBuilder sb = new StringBuilder(); - for (Map.Entry entry : orderBooks.entrySet()) { - sb.append("=== ORDER BOOK: ").append(entry.getKey()).append(" ===\n"); - sb.append(entry.getValue().dumpBook()); - sb.append("\n"); - } - return sb.toString(); - } -} diff --git a/backend/matching-engine/src/main/java/org/example/matching/model/Order.java b/backend/matching-engine/src/main/java/org/example/matching/model/Order.java deleted file mode 100644 index 69132a3..0000000 --- a/backend/matching-engine/src/main/java/org/example/matching/model/Order.java +++ /dev/null @@ -1,93 +0,0 @@ -package org.example.matching.model; - -import lombok.RequiredArgsConstructor; - -import java.time.LocalDateTime; - -@RequiredArgsConstructor -public class Order { - String id; - String userId; - long price; - int quantity; - long timestamp; - OrderSide side; - String instrument; // Added for multi-book support - - public Order(String userId, long price, int quantity, long timestamp, OrderSide side) { - this.userId = userId; - this.price = price; - this.quantity = quantity; - this.timestamp = timestamp; - this.side = side; - this.instrument = "DEFAULT"; // Default instrument - } - - public Order(String id, String userId, long price, int quantity, long timestamp, OrderSide side) { - this.id = id; - this.userId = userId; - this.price = price; - this.quantity = quantity; - this.timestamp = timestamp; - this.side = side; - this.instrument = "DEFAULT"; // Default instrument - } - - public Order(String id, String userId, long price, int quantity, long timestamp, OrderSide side, String instrument) { - this.id = id; - this.userId = userId; - this.price = price; - this.quantity = quantity; - this.timestamp = timestamp; - this.side = side; - this.instrument = instrument != null ? instrument : "DEFAULT"; - } - - public String getId() { - return id; - } - - public String getUserId() { - return userId; - } - - public long getPrice() { - return price; - } - - public int getQuantity() { - return quantity; - } - - public long getTimestamp() { - return timestamp; - } - - public OrderSide getSide() { - return side; - } - public void reduceQuantity(long delta) { - if (delta < 0) throw new IllegalArgumentException("delta must be >= 0"); - if (delta > quantity) throw new IllegalArgumentException("reduce more than remaining"); - this.quantity -= (int) delta; - } - @Override - public String toString() { - return "Order{" + - "id='" + id + '\'' + - ", userId='" + userId + '\'' + - ", price=" + price + - ", quantity=" + quantity + - ", timestamp=" + timestamp + - ", side=" + side + - '}'; - } - - public String getInstrument() { - return instrument; - } - - public void setInstrument(String instrument) { - this.instrument = instrument; - } -} diff --git a/backend/matching-engine/src/main/java/org/example/matching/model/OrderBook.java b/backend/matching-engine/src/main/java/org/example/matching/model/OrderBook.java deleted file mode 100644 index aee9ed6..0000000 --- a/backend/matching-engine/src/main/java/org/example/matching/model/OrderBook.java +++ /dev/null @@ -1,259 +0,0 @@ -//package org.example.matching.model; -////Draft -// -// -//import com.sun.source.tree.BinaryTree; -//import com.sun.source.tree.ExpressionTree; -//import com.sun.source.tree.Tree; -//import com.sun.source.tree.TreeVisitor; -// -//import java.util.*; -// -//public class OrderBook { -// -// private OrderSide orderSide; -// private Order order; -// -// -// //Balancer that balances the percentage when it comes -// Long MoneyPool; -// TreeMap buy = new TreeMap<>(); -// TreeMap sell = new TreeMap<>(); -// //or TreeMap sell = new TreeMap<>(); -////or TreeMap> sellOrders = new TreeMap<>(); -// // sell.put -// //get list of orders from db -// // -//List trades = new ArrayList<>(); -//// assume we a.add(sell) -// //orderside che a = sell and buy -// //buy list -// //sell list -// //order1 is order1dto -// public Map Match(OrderSide a , TreeMap buy , TreeMap sell , Order order1){ -// // we get order1 from post req , order1dto ig , and take here -// if (order1.side==OrderSide.BUY){ -// long price = order1.price; -// long timestamp = order1.timestamp; -// if(price>0){ -// //we need to have a list of buy and sell guys. -// // putting in order before that we need the least of sell guys to see and sort so we need binary -// Long bestask = sell.firstKey(); // the least value in tree -// if(price>sell.firstKey()){ -// if(order1.quantity==bestask.quantity){ -// //sell all -// } -// if(//less quantity -// ){ -// //only share those -// } -// trades.add(order1); -// } -// /* if (price == //lest value of tree) -// Long bestask = sell.firstKey(); -// sell.remove(bestask) -// price -// // ) -// //remove sell.remove generate a trade impact algorithm of percentage or stock // later topic -// */ -// -// //1) Binary Search Tree -// //2) get last value -// //3) compare -// -// } -// -// } -// -// -// -// } -// -// -//} -// - -package org.example.matching.model; - -import org.example.matching.journal.EventJournal; - -import java.io.IOException; -import java.util.*; - -public class OrderBook { - - private final TreeMap> ask = new TreeMap<>(); - private final TreeMap> bids = new TreeMap<>(Comparator.reverseOrder()); - private final Map orderPriceIndex = new HashMap<>(); // orderId->price - - public OrderBook() { - } - public List placeOrder(Order incoming) { - List trades = new ArrayList<>(); - - if (incoming.getSide() == OrderSide.BUY) { - matchBuy(incoming, trades); - if (incoming.getQuantity() > 0) { - addToBook(bids, incoming); - } - } else { - matchSell(incoming, trades); - for(Trade t:trades) { - // Journal matches if needed - } - if (incoming.getQuantity() > 0) { - addToBook(ask, incoming); - } - } - return trades; - } - private void matchBuy(Order buy, List trades) { - while(buy.getQuantity()>0&& !ask.isEmpty()){ - //it is first seen if ask is not empty - Map.Entry> bestAskEntry = ask.firstEntry(); - //getting the root node of treemap i.e.top value of it . - long askPrice = bestAskEntry.getKey(); - // the long will be price do .key() is askprice of that node - - if(askPrice> buy.getPrice()){ - System.out.println("your order will fullfill once it matches the appropriate seller "); - break; - } - Deque queue = bestAskEntry.getValue(); - // it will be a single oblject and not queue, why is it in queue jere as the first node is object - //getting the first node - Order sell = queue.peekFirst(); - if(sell==null){ - ask.remove(askPrice); - continue; - } - long tradeQty = Math.min(buy.getQuantity(),sell.getQuantity()); - long tradePrice = sell.getPrice(); - long ts = System.currentTimeMillis(); - trades.add(new Trade(buy.getId(),sell.getId(),tradePrice,tradeQty,ts)); - - buy.reduceQuantity(tradeQty); - sell.reduceQuantity(tradeQty); - - if(sell.getQuantity()==0){ - queue.removeFirst(); - orderPriceIndex.remove(sell.getId()); - if(queue.isEmpty()) ask.remove(askPrice); - else{ - //paritally filled resting order remains - } - } - } - } - private void matchSell(Order sell, List trades) { - while (sell.getQuantity() > 0 && !bids.isEmpty()) { - Map.Entry> bestBidEntry = bids.firstEntry(); // because bids is reverseOrder - long bidPrice = bestBidEntry.getKey(); - // price crossing condition: best bid >= sell price - if (bidPrice < sell.getPrice()) break; - - Deque queue = bestBidEntry.getValue(); - Order buy = queue.peekFirst(); - if (buy == null) { - bids.remove(bidPrice); - continue; - } - - int tradedQty = Math.min(sell.getQuantity(), buy.getQuantity()); - long tradePrice = buy.getPrice(); // resting buy price (maker) - long ts = System.currentTimeMillis(); - trades.add(new Trade(buy.getId(), sell.getId(), tradePrice, tradedQty, ts)); - // a.createlogs(sell,new Trade(buy.getId(), sell.getId(), tradePrice, tradedQty, ts)); - sell.reduceQuantity(tradedQty); - buy.reduceQuantity(tradedQty); - - if (buy.getQuantity() == 0) { - queue.removeFirst(); - orderPriceIndex.remove(buy.getId()); - if (queue.isEmpty()) bids.remove(bidPrice); - } else { - // partial fill; buy stays - } - - // Handle sell order completion when quantity reaches 0 - if (sell.getQuantity() == 0) { - // Sell order is fully filled, remove from asks if it was added - // Note: incoming sell order isn't in the book yet, so no removal needed - } - } - } - // Inside your OrderBook.java model - public Double getBestBid() { - return bids.isEmpty() ? 0.0 : bids.lastKey().doubleValue(); - } - - public Double getBestAsk() { - return ask.isEmpty() ? 0.0 : ask.firstKey().doubleValue(); - } - private void addToBook(TreeMap> bookside, Order order){ - // treemap bookside and order order - - Deque q = bookside.computeIfAbsent(order.getPrice(),k->new ArrayDeque<>()); - q.addLast(order); - orderPriceIndex.put(order.getId(), order.getPrice());} - - public boolean cancel(String orderId) { - Long price = orderPriceIndex.get(orderId); - if (price == null) return false; - // try both sides (only one will contain it) - Deque q = ask.get(price); - if (q != null && removeFromQueue(q, orderId)) { - if (q.isEmpty()) ask.remove(price); - orderPriceIndex.remove(orderId); - return true; - } - q = bids.get(price); - if (q != null && removeFromQueue(q, orderId)) { - if (q.isEmpty()) bids.remove(price); - orderPriceIndex.remove(orderId); - return true; - } - return false; - } - - private boolean removeFromQueue(Deque q, String orderId) { - // linear scan; for higher performance maintain node references - Iterator it = q.iterator(); - while (it.hasNext()) { - Order o = it.next(); - if (o.getId().equals(orderId)) { - it.remove(); - return true; - } - } - return false; - } - public Optional bestAsk() { - return ask.isEmpty() ? Optional.empty() : Optional.of(ask.firstKey()); - } - public Optional bestBid() { - return bids.isEmpty() ? Optional.empty() : Optional.of(bids.firstKey()); - } - - // Add getters for MatchingEngine access - public TreeMap> getAsks() { - return ask; - } - - public TreeMap> getBids() { - return bids; - } - - public String dumpBook() { - StringBuilder sb = new StringBuilder(); - sb.append("ASKS:\n"); - for (Map.Entry> e : ask.entrySet()) { - sb.append(e.getKey()).append(" -> ").append(e.getValue()).append("\n"); - } - sb.append("BIDS:\n"); - for (Map.Entry> e : bids.entrySet()) { - sb.append(e.getKey()).append(" -> ").append(e.getValue()).append("\n"); - } - return sb.toString(); - } -} diff --git a/backend/matching-engine/src/main/java/org/example/matching/model/OrderSide.java b/backend/matching-engine/src/main/java/org/example/matching/model/OrderSide.java deleted file mode 100644 index 2c98b1c..0000000 --- a/backend/matching-engine/src/main/java/org/example/matching/model/OrderSide.java +++ /dev/null @@ -1,8 +0,0 @@ -package org.example.matching.model; - -public enum OrderSide { -BUY, - SELL - - -} diff --git a/backend/matching-engine/src/main/java/org/example/matching/model/Reservation.java b/backend/matching-engine/src/main/java/org/example/matching/model/Reservation.java deleted file mode 100644 index b93b588..0000000 --- a/backend/matching-engine/src/main/java/org/example/matching/model/Reservation.java +++ /dev/null @@ -1,97 +0,0 @@ -package org.example.matching.model; - -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.Setter; - -@Getter @Setter @AllArgsConstructor -public class Reservation { - private final String OrderId; - private final String userId; - private final long priceatReserve; - private int remainingQty; - private String instrument; // Add instrument field - - private long reservedCash; - private long reservedShares; - private final Boolean isBuy; - - public Reservation(String orderId, String userId, long priceatReserve, int remainingQty, Boolean isBuy) { - OrderId = orderId; - this.userId = userId; - this.priceatReserve = priceatReserve; - this.remainingQty = remainingQty; - this.isBuy = isBuy; - this.instrument = "MARKET"; // Default instrument - } - - public Reservation(String orderId, String userId, long priceatReserve, int remainingQty, Boolean isBuy, String instrument) { - OrderId = orderId; - this.userId = userId; - this.priceatReserve = priceatReserve; - this.remainingQty = remainingQty; - this.isBuy = isBuy; - this.instrument = instrument != null ? instrument : "MARKET"; - } - - public long reduceBy(int qty) { - if (qty <= 0 || remainingQty <= 0) { - return 0; - } - - // Don't consume more than what is left in this specific reservation - int consumed = Math.min(qty, remainingQty); - long cashUsed =0; - if (isBuy) { - // Calculate how much cash was 'used' for this portion of the trade - cashUsed = (long) consumed * priceatReserve; - - // Subtract the used cash from the total reserved cash - this.reservedCash -= cashUsed; - - if (this.reservedCash < 0) this.reservedCash = 0; - } else { - // For a sell order, we just reduce the count of shares held - this.reservedShares -= consumed; - - if (this.reservedShares < 0) this.reservedShares = 0; - } - - // Finally, reduce the quantity so we know how much of the order is left to fill - this.remainingQty -= consumed; - return cashUsed; - } - - // Additional getters needed by the codebase - public String getOrderId() { - return OrderId; - } - - public String getUserId() { - return userId; - } - - public Boolean getIsBuy() { - return isBuy; - } - - public long getReservedCash() { - return reservedCash; - } - - public long getReservedShares() { - return reservedShares; - } - - public int getRemainingQty() { - return remainingQty; - } - - public void setReservedCash(long reservedCash) { - this.reservedCash = reservedCash; - } - - public void setReservedShares(long reservedShares) { - this.reservedShares = reservedShares; - } -} \ No newline at end of file diff --git a/backend/matching-engine/src/main/java/org/example/matching/model/Trade.java b/backend/matching-engine/src/main/java/org/example/matching/model/Trade.java deleted file mode 100644 index fde50a9..0000000 --- a/backend/matching-engine/src/main/java/org/example/matching/model/Trade.java +++ /dev/null @@ -1,40 +0,0 @@ -package org.example.matching.model; - -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -import lombok.ToString; - -@Getter -@Setter -@AllArgsConstructor -@NoArgsConstructor -@ToString -public class Trade { - private String buyOrderId; - private String sellOrderId; - private long price; - private long quantity; - private long timestamp; - - public String getBuyOrderId() { - return buyOrderId; - } - - public String getSellOrderId() { - return sellOrderId; - } - - public long getPrice() { - return price; - } - - public long getQuantity() { - return quantity; - } - - public long getTimestamp() { - return timestamp; - } -} \ No newline at end of file diff --git a/backend/matching-engine/src/main/java/org/example/matching/model/Wallet.java b/backend/matching-engine/src/main/java/org/example/matching/model/Wallet.java deleted file mode 100644 index 48c7dba..0000000 --- a/backend/matching-engine/src/main/java/org/example/matching/model/Wallet.java +++ /dev/null @@ -1,134 +0,0 @@ -package org.example.matching.model; - -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.atomic.AtomicLong; - -public class Wallet { - private final String UserID; - private final AtomicLong availablecash = new AtomicLong(0); - private final AtomicLong reservedcash = new AtomicLong(0); - - // Fixed: Standardized on AtomicLong for all maps - private final ConcurrentHashMap availableShares = new ConcurrentHashMap<>(); - private final ConcurrentHashMap reservedShares = new ConcurrentHashMap<>(); - - public Wallet(String userID) { - this.UserID = userID; - } - - public String getUserId() { - return UserID; - } - - public long getAvailableCash() { - return availablecash.get(); - } - - public long getReservedCash() { - return reservedcash.get(); - } - - public void addAvailableCash(long amount) { - availablecash.addAndGet(amount); - } - - public boolean tryReserveCash(long amount) { - while (true) { - long avail = availablecash.get(); - //if avail less than the amount needed - if (avail < amount) return false; - if (availablecash.compareAndSet(avail, avail - amount)) { - reservedcash.addAndGet(amount); - return true; - //else avail = avail - amount and reserve cash .add amount - } - } - } - - public void releaseReserveCash(long amount) { - //in release reserve cash we just subtract the amount from the reservedcash and add it back to the available cash. - reservedcash.addAndGet(-amount); - availablecash.addAndGet(amount); - } - -//remove the money from the reserves - public void debitReservedCash(long amount) { - reservedcash.addAndGet(-amount); - - } - - // Fixed: Returns along to match AtomicLong, and handles the Map lookup safely - public long getAvailableShares(String instrument) { - AtomicLong val = availableShares.get(instrument); - return (val == null) ? 0L : val.get(); - } - - public long getReservedShares(String instrument) { - AtomicLong val = reservedShares.get(instrument); - return (val == null) ? 0L : val.get(); - } - - // Methods to get all shares for API responses - public ConcurrentHashMap getAvailableShares() { - return availableShares; - } - - public ConcurrentHashMap getReservedShares() { - return reservedShares; - } - - // get the quantity of the shares the available - //get the qty of reserved of shares - //pass the shares and the qty to reserve it - public boolean tryReserveShares(String instrument, long qty) { - // Fixed: Use AtomicLong and handle initialization correctly - // atomiclong does not hold it instead it points to a memory address - AtomicLong avail = availableShares.computeIfAbsent(instrument, k -> new AtomicLong(0)); - AtomicLong reserved = reservedShares.computeIfAbsent(instrument, k -> new AtomicLong(0)); -// - // currently is the - while (true) { - long currentAvail = avail.get(); - if (currentAvail < qty) return false; -//if avail >qty - // avail and subtract from avail - if (avail.compareAndSet(currentAvail, currentAvail - qty)) { - reserved.addAndGet(qty); - return true; - } - } - } - // see if the instrument exists - //if not create it - // -//atomiclong avail = availableshares.computeifabsent(instrument , - //atomiclong resrved = resrvedshares.computeIfabsent(instrument,k-> new AtomicLong(0); - public void releaseReservedShares(String instrument, long qty) { - // Fixed: Use AtomicLong here to match the class fields - AtomicLong reserved = reservedShares.get(instrument); - AtomicLong avail = availableShares.get(instrument); - - if (reserved != null) { - reserved.addAndGet(-qty); - } - - if (avail != null) { - avail.addAndGet(qty); - } - } - - public void debitReservedShares(String instrument, long qty) { - // Fixed: Changed from AtomicInteger to AtomicLong - AtomicLong reserved = reservedShares.get(instrument); - if (reserved != null) { - reserved.addAndGet(-qty); - } - } - - //add so available shares . add the shares and in if not create and add - public void addAvailableShares(String instrument, long qty) { - // Fixed: Used AtomicLong in the lambda - availableShares.computeIfAbsent(instrument, k -> new AtomicLong(0)) - .addAndGet(qty); - } -} \ No newline at end of file diff --git a/backend/matching-engine/src/main/java/org/example/matching/orderbook/InMemoryOrderRepository.java b/backend/matching-engine/src/main/java/org/example/matching/orderbook/InMemoryOrderRepository.java deleted file mode 100644 index 6ddee65..0000000 --- a/backend/matching-engine/src/main/java/org/example/matching/orderbook/InMemoryOrderRepository.java +++ /dev/null @@ -1,24 +0,0 @@ -package org.example.matching.orderbook; - -import org.example.matching.model.Order; -import org.springframework.stereotype.Repository; - -import java.util.HashMap; -import java.util.Map; -import java.util.Optional; -import java.util.concurrent.ConcurrentHashMap; - -@Repository -public class InMemoryOrderRepository implements OrderRepository { - private final Map map = new ConcurrentHashMap<>(); - - @Override - public void save(Order order){ - map.put(order.getId(),order); - } - @Override - public Optional findById(String OrderId){ - return Optional.ofNullable(map.get(OrderId)); - } - -} diff --git a/backend/matching-engine/src/main/java/org/example/matching/orderbook/OrderOrchestrator.java b/backend/matching-engine/src/main/java/org/example/matching/orderbook/OrderOrchestrator.java deleted file mode 100644 index ced672e..0000000 --- a/backend/matching-engine/src/main/java/org/example/matching/orderbook/OrderOrchestrator.java +++ /dev/null @@ -1,114 +0,0 @@ -package org.example.matching.orderbook;//package org.example.matching.orderbook; -// -//import org.example.matching.journal.EventJournal; -//import org.example.matching.matching.MatchingEngine; -//import org.example.matching.model.Order; -//import org.example.matching.model.Trade; -// - -import org.example.matching.Wallets.InMemoryWalletService; -import org.example.matching.Wallets.RiskManager; -import org.example.matching.Wallets.WalletService; -import org.example.matching.journal.EventJournal; -import org.example.matching.matching.MatchingEngine; -import org.example.matching.model.Order; -import org.example.matching.model.Trade; -import org.example.matching.model.Wallet; -import org.example.matching.orderbook.OrderRepository; -import org.example.matching.validation.OrderValidator; - -import java.util.List; - -public class OrderOrchestrator { - - private final MatchingEngine matchingEngine; - private final EventJournal eventJournal; - private final OrderValidator orderValidator; - private final RiskManager riskManager; - private final OrderRepository orderRepository; - private final WalletService walletService; - - // Constructor for basic functionality - public OrderOrchestrator(MatchingEngine matchingEngine, - EventJournal eventJournal, OrderValidator orderValidator) { - this.matchingEngine = matchingEngine; - this.eventJournal = eventJournal; - this.orderValidator = orderValidator; - this.riskManager = null; - this.orderRepository = null; - this.walletService = null; - } - - // Full constructor with wallet and risk management - public OrderOrchestrator(MatchingEngine matchingEngine, - EventJournal eventJournal, - RiskManager riskManager, - OrderRepository orderRepository, - WalletService walletService) { - this.matchingEngine = matchingEngine; - this.eventJournal = eventJournal; - this.riskManager = riskManager; - this.orderRepository = orderRepository; - this.walletService = walletService; - this.orderValidator = new OrderValidator(); // Default validator - } - - public void submitOrder(Order order) { - if (!orderValidator.validate(order)) { - eventJournal.appendRaw("REJECT " + order.getId() + " INVALID_ORDER"); - return; - } - - // Use risk manager and wallet service if available - if (riskManager != null && walletService != null) { - // Check and reserve funds/shares - if (!riskManager.checkAndReserve(order)) { - eventJournal.appendRaw("REJECT " + order.getId() + " INSUFFICIENT_FUNDS"); - return; - } - - // Save order to repository - orderRepository.save(order); - } - - // 1️⃣ Journal the incoming order - eventJournal.appendRaw(formatOrder(order)); - - // 2️⃣ Send to matching engine - List trades = matchingEngine.placeOrder(order); - - // 3️⃣ Settle trades and journal results - if (walletService != null) { - for (Trade trade : trades) { - walletService.settleTrade(trade); - eventJournal.appendRaw(formatTrade(trade)); - } - } else { - // Just journal trades if no wallet service - for (Trade trade : trades) { - eventJournal.appendRaw(formatTrade(trade)); - } - } - } - - private String formatOrder(Order order) { - return String.format( - "ORDER %s %s %s %d %d", - order.getId(), - order.getUserId(), - order.getSide(), - order.getPrice(), - order.getQuantity() - ); - } - - private String formatTrade(Trade trade) { - return String.format( - "TRADE %s %s %d %d", - trade.getBuyOrderId(), - trade.getSellOrderId(), - trade.getPrice(), - trade.getQuantity() - ); - } -} \ No newline at end of file diff --git a/backend/matching-engine/src/main/java/org/example/matching/orderbook/OrderRepository.java b/backend/matching-engine/src/main/java/org/example/matching/orderbook/OrderRepository.java deleted file mode 100644 index 94c86f2..0000000 --- a/backend/matching-engine/src/main/java/org/example/matching/orderbook/OrderRepository.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.example.matching.orderbook; - - -import lombok.AllArgsConstructor; -import org.example.matching.model.Order; -import org.springframework.stereotype.Repository; - -import java.util.Optional; - -//@Repository -public interface OrderRepository { - void save(Order order); - Optional findById(String orderId); -} diff --git a/backend/matching-engine/src/main/java/org/example/matching/util/IdGenerator.java b/backend/matching-engine/src/main/java/org/example/matching/util/IdGenerator.java deleted file mode 100644 index 5363524..0000000 --- a/backend/matching-engine/src/main/java/org/example/matching/util/IdGenerator.java +++ /dev/null @@ -1,10 +0,0 @@ -package org.example.matching.util; - -import java.util.UUID; - -public class IdGenerator { - - public static String newId() { - return UUID.randomUUID().toString(); - } -} diff --git a/backend/matching-engine/src/main/java/org/example/matching/validation/OrderValidator.java b/backend/matching-engine/src/main/java/org/example/matching/validation/OrderValidator.java deleted file mode 100644 index 4780b53..0000000 --- a/backend/matching-engine/src/main/java/org/example/matching/validation/OrderValidator.java +++ /dev/null @@ -1,34 +0,0 @@ -package org.example.matching.validation; - -import org.example.matching.model.Order; - -public class OrderValidator { - public boolean validate(Order order) { - - if (order == null) { - return false; - } - - if (order.getId() == null || order.getId().isBlank()) { - return false; - } - - if (order.getUserId() == null || order.getUserId().isBlank()) { - return false; - } - - if (order.getSide() == null) { - return false; - } - - if (order.getPrice() <= 0) { - return false; - } - - if (order.getQuantity() <= 0) { - return false; - } - - return true; - } -} \ No newline at end of file diff --git a/backend/matching-engine/src/main/resources/application.properties b/backend/matching-engine/src/main/resources/application.properties deleted file mode 100644 index b2860ce..0000000 --- a/backend/matching-engine/src/main/resources/application.properties +++ /dev/null @@ -1,12 +0,0 @@ -# Server Configuration -server.port=8080 - -# Application Configuration -spring.application.name=matching-engine - -# Logging Configuration -logging.level.org.example.matching=DEBUG -logging.level.org.springframework.web=INFO - -# Jackson Configuration (for JSON serialization) -spring.jackson.serialization.indent-output=true diff --git a/backend/matching-engine/target/classes/application.properties b/backend/matching-engine/target/classes/application.properties deleted file mode 100644 index b2860ce..0000000 --- a/backend/matching-engine/target/classes/application.properties +++ /dev/null @@ -1,12 +0,0 @@ -# Server Configuration -server.port=8080 - -# Application Configuration -spring.application.name=matching-engine - -# Logging Configuration -logging.level.org.example.matching=DEBUG -logging.level.org.springframework.web=INFO - -# Jackson Configuration (for JSON serialization) -spring.jackson.serialization.indent-output=true diff --git a/backend/matching-engine/target/classes/org/example/Main.class b/backend/matching-engine/target/classes/org/example/Main.class deleted file mode 100644 index 0f8def70b0d7394e73e6dfd9009250fcd08b77f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5934 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 diff --git a/backend/matching-engine/target/classes/org/example/matching/Replay.class b/backend/matching-engine/target/classes/org/example/matching/Replay.class deleted file mode 100644 index ca9e67da7b03825bb797a80ddf17e0d00eab4692..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3251 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 diff --git a/backend/matching-engine/target/classes/org/example/matching/Wallets/RiskManager.class b/backend/matching-engine/target/classes/org/example/matching/Wallets/RiskManager.class deleted file mode 100644 index 54bd4dd3b450fb358a529b2fe733e07a8d1ef778..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1091 zcma)4+iuf95IyVMNa8kWpf|2rG4li5Dag zf(Jf;k3!7aDQYDb@iOC?opa92cz*r<@e{xkY**kQS3=%J0Y!%TF+bs6z@w3OI5-x* zVJJS9ku*;ka?Mu1jB6;DP;pU(%g|JMa|HP&o^XiV3U35`HouQ`mQ0ShRs#qGO&lnzMQzdl+r6%6tWkjcn z2CkQI!^JXI7~22e3CU{_(+px?>4cVHyP2&Ys-Xx{?M~|*L;g7>h@dMY@p2XpgnrEj z0c9Fp<@2D=wY2d(nKxq@Q*YVa87uBEyuYH8^Xkh>&1SxOYpp)r$AK_oHGIW24}}q$ zI;{C);ZOFWVJ}?_Lm}Z{*veM8xEF@Xk(y~=>`S|e`h}BuXit%0y*G=D3`JkYlD4xK zMapm^RYcP1xbale)qSuXohm)?V(LpMb2b&;`Tby%4#=U4cj(X4<H+!ThJxJ8kryiEv8`Idan zViL+7OSzjtxlEKRM7c_oYYF8>3Y$|}QQLXaUDCUQJ49P{C~Y6D>RqBpRiBZ!16SK$ tP}=#9B?q4vl`8Jh3rn~Qi~wdSL-8aOluE_;0B>tDG%1@zcDKdf=D{D}j}kYV zU_gUjcG+*g$L!30e7?N{z&RW_P(wIL#lodm7Qb+EW2XEtN*3-T^XjaC1O6XE2;|B!Ch%N(!wj`xE-3b=Ze{~p=(OW9#_k2M? zr0(@|ypZWTaxR=8w7hgBe40jFH>97##XwK9X4(h{b^Rj%96etPY<+h0$wJtGY~)R7 zl~CJ2o6sqtEdzC-S3u1gY-@eLfOiVGQ#bJL_toI1VrUe5uwQy-MhFLbt-;|JP#>>l diff --git a/backend/matching-engine/target/classes/org/example/matching/api/advice/ApiExceptionHandler.class b/backend/matching-engine/target/classes/org/example/matching/api/advice/ApiExceptionHandler.class deleted file mode 100644 index a5456f42c3afbe5ba92cff984f4991967815a0f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3503 zcmcgu>vq#d5dPM=C~-t$!lh6s1PBlVMYNPcaY&muNfYV>nxv+bURc{3TSS(Gv!AL+`k0n{tAoYb;;Z(8sVp6bhti8FSokEO0jq4P99bK-aKO z#~_9n#vQM2_^xN#^;M5I#S_O{GoFZwQ8DeBu^?o_sZDzIpeby*=*Tj+%-YP;s&J+0 z*yKrF$SIN}^(Em47I|`IEMH19x~^2YQZw2#3Io`WVGRd#9K<1pOM6jf7$gs7O<~n$ zJkRlbhGD{QgHdn-fbvf&f*kKYdE806lWRErv==Q(lv-um+-}mEls(> zkgf3Al6V{lpZvf63Z7FmN2i?H##CThwJ?zL7}Jo~aRC<@u6Br?w879_A&U&R;!qQ% zNHlh6vCxmVaan_*;|ktkIP*%qIU-|Oav4y1`-*oKXG`JJ(%Za{T+BPHiiC$(2WE8=KI6*PPjmz#LXo315{CYRL)g=TQqG@ ztO{e&HMd!r<95vw9+jKQ1jA6tw8di3tO##~S1j5YE;&_hmAPlCb-dXv8zxoCwJ^nd z#3EjDjSw~*b>X~XFw@JW(>d9B4H0}sJY|?jEzgeesM19|4u^J3IfldSoNc&Uyj^P- z9ZzI6F2UV96N<3tn7GT;0V0JO!u`u;-KK{1C`Uj4U*yFOhesY2Y={1<2#ziVG-8{g zZ2BhE(WGrV)Sh%yQ7AWGp9;P$YwWCBGTcKA84w2tqMDite5zpI56>!wQnHm&=fa*U z=Tss+>DCx%@Uu>0N>aS@KO@N3>&ExA z@U)377rA9En^I5;^m*GBUeV&dFQ|J55?3D$-_xaG7ei^mYIw$Q;`O35WFuzif^nNJ z=<3rAs!{aPcZpU8y&1iGE<6YOm40NfK;P_FgTaN^A2X|@3@F|wah*Ey0?)>yV z_Xo85&(Xhd@poi5k)s>(OB@C^@n!}uFmh=V=Q8+(B)dZEgQ3AW=%y@*ch9+EW(9ST)ou|Zq O+uM)t@B@Ct(SHF}s2ocG diff --git a/backend/matching-engine/target/classes/org/example/matching/api/controller/MarketController.class b/backend/matching-engine/target/classes/org/example/matching/api/controller/MarketController.class deleted file mode 100644 index ee75bf80830f923d71fcc63cb0e90d28813ce9ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2248 zcmbtV+j0{}5IrMbgyfB73j={b00Xfs8!sUaxyU$xYghgxPWQ|||NiwifctoyK?+l8OgostEW@VK z4OjfaJAPZZ9d2q(=`~#LOSh&xqgA^tw7buBOPF$OV3_Z_?s^UB35Jcmk%9Vd6e0>8 z`IoXdgG?G(2Xk;3)=zVoVXh%e#p8a^REA-vu=j!=bGOY2dBtcdptL#~j;*V1l>1EA zg?^+|>re!~@&ZAC=8;Qd!NDT(3@a8;;M-U~Yu*vBly13AV|=%NV%Ia${K}A0Er$C^ z2+yi7M9uUdOc0}FC0TNC4(AybJ0aIQ-0+If$FfG;ZjLV|hskxI0oNOX^r03{FClxb#+ZVmUd3g4Zj#0wkn2i!|0RndnjIZMUYTv-KDBfLsMc$iaond4KzNTLa_wY^VNac{@cRzsz z_#P#)r5PEv=!5RE7*Uyy*qk{+be0fZc#kUskY>ppSPtQwk6dFoxgMMoAht(<_+c2t z3La2AOUpj3mX=)c58NoOy#p(*zr)!#WQur+KrALW$t6Ho#x2NP$a%y`CPfr2kYRyB VJPZRp3PI&*Uncj6nH}r`{{b;Hf&~Bo diff --git a/backend/matching-engine/target/classes/org/example/matching/api/controller/OrderController.class b/backend/matching-engine/target/classes/org/example/matching/api/controller/OrderController.class deleted file mode 100644 index 49b34838ff8e3235935bbb9c3b025fb2d929c4c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3858 zcmcInS##4?6#lMBqAUWtF3^T81Oj9O(Xti;EeQ!*OwuGx3v|1-l|)3Agd_)2petSf zLH`AvDJk&K>2s$)snhAFC0@YJIGyQ(e07iSIp;g;J^J&X=f49uho3r-z$OJPDq7Jd zaLjfWH2t0|I;O4_rJr9ktOZRvhL*Q2-?dFsceP2kpu3~xy?|;5lo{P!HuAcFHqlUu z7oCYj#0;5Ew4*~or;0A90*5!mP3?|r=XK8uVF}#mZ>+xH+mY&N{Z2{u{LDa8XFbQZ zJe@eVAgLgw;uWL?1{>n6QWLQXbS&upj4%C?C$P1DVB)r1mYON)+!^1ck2CGqD$qVX zc6DrYcI;v&w&OJgudC?B4uRB*#|7GGfix*?TYr_X$=q!{PqS`zVi$HR*rTEcdj$>! zSUo4uH1Eoye%E%Fv_;={v}rwpIA-~Vzar3?lZDtj0;hpaw9osW} z+oh_b^|K*7m$U7qwcJ_bpq(0yDtJT1n>Z$Lq;5tuWM{nR4XZG+a-|^9Uu|Zb6LFf9 ze8bcx9pA7mX=c(a+!HEJ;*>zEbR3hwd)6{4JUU;p^1)$kJbs}U-ohCL85L)7P9Pno zQ;k@GO-1Q2R56SOg6bj)eEhbGcW{9gS++lJmn>RzW&_D{S(nTkuaZBbxTs)E#W*er zoNP7+YsJt%xga40hMI>G`s#{`tGLD@v)wV%V@o?&9i6ozd%5m9k;QcdlPae0ZcW)n zJd}9Wunhk^-Q7Ph$7*v-nb+gaHMjB3)kINcSV^OHfkq@J3`@UWD&}-|R_07n(i3)G znsd@Mf_+SE@fQvDl@s-gVg0*+$`m*1t@L_h2~{03YQ)SOH||6N!%Z>9U0Gl=8*6?k zE1lSYR95#F?ZT7{I-Sq7V*8yj7A$sOmqtJOU)+3lBbd+APueclDf>W5dv7`K&f&dp<39f-6K|cdg9X6{lA24yNpqbbYBUOVcQX>a@Aw zmCXBUnal3`kI3RnB)AqRyq))7oaQwRz1-=VEOClT7_8`YRq@3#1Y~uUZd7uE02Wy~ z?7qQ(lL^9hJdATQp}C}2MW&SwFEROAwfjclAzND0Vy2|OxK^RmpIaw;>rPko^RnTk zlnL9?j9qf``nVA^iLIgWm3i+-aC-=xZrTEl7=DGFHf)47Y!8(T?+S;}5IyT8HDcSo z=eyF0O5RK1TCxp?Qus_D+rU%R5p8XUbH3JH4slAOAd?#?=C70E+UcnCnd)7b7t2A;I zdO6c&ITR(34nAV|mJS9yuA3k*jTzErxqA?N>TvBF{1swo6-st^6`Rwqu43EI*!&bb zho7N0fycv7ap-Z#{T_eQXyI=+I7hw=i5S+0SvlY_ruVsPjQ#NhA~ z4E{n=1SqgOaBjtw$ufv!7{=iLWEjXq2&W@Ka*Bi$BXTDcQ~{ue{ijcxz{ diff --git a/backend/matching-engine/target/classes/org/example/matching/api/controller/WalletController.class b/backend/matching-engine/target/classes/org/example/matching/api/controller/WalletController.class deleted file mode 100644 index 92d4fffb7bca474094b9e146a05797c05e73ad04..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5380 zcmcIo`Fj)B6+O?}V0ml{6QIT=F~I>ZI71Rb2*$L=fdDb!BFE6CZ9105_TbTsGBYw! zQ@W@7zHjNirEAh8icQ-z-P<(X_x6A3*YjpZ(#R4Ze@%ao^ybaG_ny0*_nw~n&*f(T zjN{+!XhO4s78R{%6WHgt3!3qup3PZ?meu|AqG>N^dd}3+j_tdSWf`t^PUnw5S)LH+ zyckTS40qW~8v=W#>govvy+}c{daMH*(5@h%q64bHaO0u^?F)t)Lp|P@WG)F zK;Abk8LxESbq(9s7^!G@T=y1F={cIb4x1HhQLz;-64({szNVPK2C8!lDZ>}oSY?e< zjN>-+DR{Ap?YN#fsVEHu+C1Mi^sGQ%m1H<8P!EP0U7^01e@yNiWtev#)xQtY*?=T7i=c9}Tp4TdlMYHy0 zJl1PXFcc%$qhM6U&Cmq4)}RU96;RS4EP=goEHw%vYe8w9nY%zo#uVIA6=ZrOE9o{B z`(znyWQm+LJa&YU2`i+Bt;RUrfddNeRB;ev0wZ;cP4-*HccKENmYidIY%66hZ(13{ z6*$VAtV47l?2(eDBcU3W;W!Q}c!`RaVnSfzf7U3_mZ!@nG6Lrs@5cJ>UJ-K_CRN;p zqXNlz8&0yf1eynjPD;1#R&g9Bm>@Dj*rwt8V}mDOn8}4g~2(FdsWOzlU*e&p+yPvyo#6O6>P|$umrUA zl@$xX4 zZ~JnqT2f(wG}@JRjf@#+2}^5B+#M2(+<#6E&2E6h4I={3pUS7xhUd-aEotEa6|Mx| zNed@zvQ9orhL=`+6?rVP#4A=xg)&&jPVLSYSbk7odnnc)0WdN#2v#A1*Ww`suTyae zucx(uC}S+ghCXE4rhho-tl18{5pPoPW)*M2TLm^%c$Eb^z~s8j?FKqCt6O;zR&{90 z#QC->ZF#!yWX-fT5&TR!_Cf*=;~gsADbvtQy$QS6}$vvY1?$|CWS%vu_4@4WvXnhs+37Mi>s=X}a zN}k?UZRJoc@Ysw@)!1RGOP(_PMJF?@OS13{c{FHGnG3e==Uv9ss#E9OXXB)U6lmf$R1W@Dzbh67uJON7AY>Yfehn}}=G?-fX-oV=Sh zj+v6|Hiu>_H^7^v5rG2@hnnYs*aebC*CQJ2;gu#+gZpX7ifq;75y$blmFl^WUA!co z;eHe6lJZ%j5}RnMyB*KUP434kej<0cHpciKqmabU1ct61;fSQW+whA7Py4@AQN$BT zJi&?QtTp_Z)%|sJqtoygwD7utl~lodh93w zO+f%;Ljkw&Uz=M4rz9X5kdjkd@hHAQ)e)da`7#9b%`%{Gl>vRb0_ZzjDDd4fpcH{g z&3!RIxe%1sik^#gKpntl+!+JaR|eI$9#D_11$7CJ6ABBF8EgtbC5E3yVR+;zh{rh_ z21b@Fkc`<+lyjr4`9!LUIzPq}qd25eN^j;thhu`*0C&U%|U%*~OLb43w*p zp(pVa?Ik4Hty9nTT0Knv(}A^>AWiaLlT|)nrslAAzK6gkMPrI^mF_w i8vUB1KXcVKt{CTEE`LEgS$!}5+SZQ0;UD-HdjAWT`8(wR diff --git a/backend/matching-engine/target/classes/org/example/matching/api/dto/DepositRequest.class b/backend/matching-engine/target/classes/org/example/matching/api/dto/DepositRequest.class deleted file mode 100644 index 050c9684b9645709bef8b3258bec89bfa9c73e03..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2719 zcmb7G+j84f6kW%bEXR=>*KN|8UXnlxj-Axy-o{CwO;hUNq^0Qv+F=IO(bR5i%a!B| zec*`~K7a?{1L#Ycff*WR`oO?Tnc*UdjC2Xmy%qsb#pedZT@>WON#(4c97NG&`2laIcvUx~Ag_B)X1i zS2hH))%(VlQED1gUUzNUl%?aOjv=I|XSA$tn+9Sk@raHL z4hke|Mtk`|*Juii<|B@;+`Vts-178oseDMsVT=k4-80?uf%kZRdPSZc(Qybu_$WrIjkdYgZQV8P>&D$Cab>Gk&1l{~go;~l5Xo%ye-yt=dL7g4 z(YvcqK^D^ll36v~y0vlDu#J}Knl{5ovtGrN{EE~{Q`D!FZDQ?isi5)#s^!*ATVPls zp6YdM}!DNTzK%-6q>ro9Z>L7J46^ zin>XvY>km8T0QEZ&{oWmqhyoW&Mzguza7{LzUTL>Yd#PzS zj_GJ1p{MrcGzhAOj|EQtw<@de=f%q&<9Gn#Tsa%Li^*x`tsGxmbqG0V_mmKsyN)d+wjVQN@h3}y%kBh$}_8rvtu=>D-^SMXIyR@w{(<3~@(c$bL7&Yj+jyy`KR%~YWqdA?Q>9Mg z8M2R%&Z)UXPf2;q$ni*xeWEY>h(e;baE=AycMt~3Y?>IKi)U%bB^37d;)G5Rd^*=B`FeW zv>l^8(d%W|)nx__J(fMT`B|h$w%HC9B->Xq<#}a6a(dx-rd*%QOnfo<En)8{{M8CqJOIKXiUUVehp_4!rs^xJ&|MO+ID%D%a5hjlJt% znBaviYkaD>&Nq4cZ{QX_LGB+9g8H-o diff --git a/backend/matching-engine/target/classes/org/example/matching/api/dto/OrderBookResponse$OrderBookResponseBuilder.class b/backend/matching-engine/target/classes/org/example/matching/api/dto/OrderBookResponse$OrderBookResponseBuilder.class deleted file mode 100644 index b7f8866d3f61442959e88bb44dde8b3d800629b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2330 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 diff --git a/backend/matching-engine/target/classes/org/example/matching/api/dto/OrderMapper.class b/backend/matching-engine/target/classes/org/example/matching/api/dto/OrderMapper.class deleted file mode 100644 index 1b97ccc3372c4e194222971bef5d3dc3803215e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1364 zcmb7E>rN9v6#k~PEVK(P<>Cb|fQY>)t9a+;1w>nmMN3KiIkY1z*-M?BCGrBs$I(B9 zXyOC-P{uPYBqcTxce67&x9^)W6VZbyofI)`A z7HFt!$EsEfs|<0;y}IwVg>)ucI_kOgz*S3=lH~FHkaci9Mb6v59#skR|A} zFpPF7L(k|EL#As_r{-XtYgQSeD>S(b$&&4fH=(;N0jd8CAP> zz>w?SS(gM?{eE?C}++Pcs!vC|Nb)sZpf2)&i@BAL(JDlm0_xTRL2lelGM6T zyMBFxOYRCKBry=L_@S(cHCt1aYMuKwqqF)nV-kyWwdf}TN`_uqmr1f{XSBz1hhX1Y z<|njjGth^pw3=-PJi~L6`musl0@1;r>0;2Jb3b6bKSF;K$y^h|^qr^g(w8G#rG2`I z8%MZ#h`Cap#QRM=%73M(2y~_yLImMNk)YQ^k}j!X4AS+H#5huP9Mg2ThFg`4wX@*` Z)+i=JQ7`d|sw0D zx+-tAr0ocbw`^%GRRoQ$+|+mUVoe8h-LW7s$7&NAC0S?6XxNU`s>_DM>>-UbX2)!! zBAIbOqhZPjQks@gmV(4Gb4N8g$lS!Omfmm-XP23WHOjK=0f^R{rXw5W-B;yqijGoF zrSE8TjE)P+bj-Q3c~h3z*7HWga9$J?ot)Z8LDNZ%PEj7}%X(uGOVk7%o(%cn3C>Nu z$>66ndYZ-o-jdFmXC(A2^VDgLp5dt>Ougn?%KRyf3N$S!3I26IPKPF^LM!-@V%yJX z^eh__M`-n$&GO&X=zA=mhWt_xKc0C`qwn*KikWr9fq6gB=p6G#7~L0|7c?r-9L%rk zc6Gt5AjU9%X_PBKqZjFif{xVnZMk4J%DVHq;Q)js5q4Y9jc`<2Fxp7Hl2CY-8Q^a z>(aLMEjV|O1D;=cC2!by3n4Wui7GwOz0S4WX7^gzPMEs|IRH;IVoi4(X*FO&+>%@J zb`znVzy8Jt>x(NZf{t>M^7WSOR2@I zRP{#weQBA3o@&?MlR(Ep<&oc(yWOtFyy_TUF&gr6tG+3%YdUhmTih(`wGG`ecd(6U0Pj)150l4+N~Nl%W=OG zC&$r`+~$h_1?CQohwW0vJu`;KVOppsBan{i1sn#in=Pv>FB)7+BjID@S?<+vc-}M} z-qlSnopyqLDrh~7ob;l1LCoYk>+^`$=dWut6K$hiXqQnJ#ME${a9+GmKU3)gZhm(J zjd#uqqp@Rd%c5tu*AFl1WyiF31$_~&Tp#FJdr5CpYSJEGG0p8(bFRPfg*aV;+=K?e z-wNT|2T_RSt60!$wROYc=AbP#8q!**>9#Fxm3|>;qR*#6rmFO@pp#FAq8>cIXbdOK zQ5+g^d~sXA`z4HqNYKl8=51P_SHMVT2 z@Kp+bBJq0=5xRnR++{vZYoIj`K(EnNj0B(dc=rmcy~5876vl;MfN-i;czU2Pt~P;i z1e9lX`b!XDvx@_Tarqe_Jkl%t+(2R6Spwlszz+4AeQu!eF8T>nZM1TrCN@209mqcm{$Qh-BRIWLOrD;5%xc*D$=-E^VOK*J;D|x`b~8 zYsFoUd!^H^bk;)zUa?v172BxbbaL%^eXvS(zbbiq2P)ZRK|da>GPPfo9OpnKM^Mlk z^k(3A)J;OXa0;p2uS!l>pwb(>HCW}yepPZx1C`$3?ZJ-s72UU`hf63>>6Ht98F-G1 zd#Jb}WbW(f!tY3lJ(&JGMedOjeK7quimc8Q9?}VS2x4po&#!;WlNe24G!cv@FJm}a zikLSd zJWnHP;@@;YrARvc4P{k2ivNW8#{Gg!ehb;&QSYE6V*Ja}uhkb|GH+6abH$#9J8HNH zl)zI3{;{Y29(~s>GW>o63(Zda3(j#7+{?_Jk6qwY&mYgsRmU>8WH^rG2@#7STO`C|q$AA1)MFHp+5vTNJxm{(=z@08{d`{_ z*(=bI88`(o#K8*A!b|Xx51x}q@F&cqZ_ieMIMpdJjpjn7muX$so$MTXGJy W@MW#H@$AsgF-n2@kUl~TbN>Z=mVTlD diff --git a/backend/matching-engine/target/classes/org/example/matching/api/dto/OrderResponse$OrderResponseBuilder.class b/backend/matching-engine/target/classes/org/example/matching/api/dto/OrderResponse$OrderResponseBuilder.class deleted file mode 100644 index 9e8af789bc6ab9de48c38a44a26fd98096ec5f83..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1996 zcmb_ddruQV5dUo{Tw4!Y%i9N31#Jsb-w(<|!4SX-Mi68CYiT!daJ_BrwnV;(A43xe z2_}93Ka_E{cPZ31q#Dxf&Ft*VZ)av_roVol`~)zAxfnv|Fc3D;i7tl3F5l-ln>*XN zwXI!IR196ymSd?|hK_V*Gl~eJ24W^I!DN_|?siUm;pK`ga%HZHI~G~;ij^xVnOk#9 z!hJ8iigY|N+OV6iS~eXr7*Z=Oml%?T)4SJ|OF(&j+hr4ReN~sIxT<&e7}$z|L56JmPR1~Rt2!0e7^c$A4z(j$$!sPmw>L}-V}xO# z%=g5Cbc$SkwA2o9>FQ&cO#cfS zg&I-PuS|wsvTdqYhS<8Sx<#>Q)iU2u@{?MfFjlENm!wCXm6(@OdCKJ#KU6P*2MlYC zRt>wLZPG#0%&>`+-xit+xS%jA8WDbIaM6dm`tD<(KIq zFDmICFnm4xvVo%S=@NHJw(v#^QtnkN`Q}WVku(@?98^RL_0MPY{kfAro8ACof!p@F zr3Af%x$HQ?U9h?52`Y@O48!pGsx*T9aB-97O^8}NOkWy<#D(;X zs!uA)v||K6Mp`N2^F;Nf zMt1y&KHrFKHt+XU0&{)8_K)EXX?JS01a0E2F}vHw)Unnv<2B4=Ys^I3m^yED%w!F- z4|ge?6uF*92mN&HBS+|I8&khQ9kZ{7nMQ_08grhK!-x+4z`&>MAz>e)n^uBW&oPEt zC)j_V!TS4TF&^N(q=(jc{eNSf;5u*~T7Q5R#st}ia1WC;IzR;jDm8|OwC>|M?UHmJ Qp+Bh?R4-GQ#w>>Z0HI*i9smFU diff --git a/backend/matching-engine/target/classes/org/example/matching/api/dto/OrderResponse.class b/backend/matching-engine/target/classes/org/example/matching/api/dto/OrderResponse.class deleted file mode 100644 index 434c332504461831e6a5d06fd37d21f2247d2751..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3436 zcmbVP{cjUx9RED+UGLi6SQ%{4fox#WuHC32zR)qi%>f(hKsJZGsNC9fJ=XPRdm~~( zVq#+a1N=edcliYqO&lbc82tqk|0WSX&)u!PZq+Oj?(X}1-=6Qw=lMR}pMO936~H)F z;)o!sK{22rCXjXN%X#Zlb9Jq1kWb4+1utFGha2SJMY$MGNwTnIJ0wa={DaJ>vok}C7>Z;pbG{!J7w2w_q0GXGrTCH z-esUihO9Xt7Ya5;W_8i5+j1Q+6}MtDj*;1&gJz7~U-F?MFv()? z+_WR!=r7R-^{)*LK~07i*|VbMR-E!>vu>_hu2pB)aoYI}@_httAzmm5;YG>JNDsnk zKQ#f=1XRbZSaq7oYNP{b3v_$z*1F3Rvv=P4Gkj@t=?Q})(6nu>8E0vwXs!i?S1(_g zE>1C~X+p1VHP)*xb4Z7di{9E;OK^AFKEv*bGUy8_>Y^9~gKpe~rTa@A_2XB}r{eQj*} z2?}xA3>WUMSsm1Gg!DHjREQP0m^7=^dE2!JX=A!pv+9#ov(d0vw7qTR2_~(EWr3sH zQtgz123z3Jf2$Hme!3ir5l$vR;g{o@R7Bo1-j}1=`*J+<+XG%dIKuavT;=%{{HocX zA%67K-r_svG56pkX~S1Q0b^Xnafh7?Wkkhw=adNA1Pe)^3BTeH7DL=_QKahxof=qTaK8-Wfk`*fOE7Oc+a~tUXX^XY) zS@-)IL5XDfWDf++Qd<>VB)NFIvrDm4m$IErm#XJ-qO;57PF+f5G+p+3E+_F$Gw~>* zUgCor*t1iY5@b!6eV$9+zrIUxp7@N@<^5dtd#K98-0z5d2Q~UI_ZuR`k?bSv^OhtI zjPUvTTPfsfaE{Btf-?FCx>Cwh?0x`aG^ISki<|nHf=ZQ4A(m35PV6aqAD}y>reYzb zTtTB!uArwhsiX%=T1wwkQXVqAXb2vDgKzp_HyeB(Q#i*w`|u^s^ISx595ybHCv8iZ zCZ*s#zGwKTxIrjfBo)JFJQ1^`G<=Q&D3a1K$2~{Tt?7SZmxf69GxTdn^S>^hVZTqt z!{jEgrdVG^{B2c%7o# z$+1()xa`Zs!Q@!waB}G0;V-_rB{_oyRkCE=^MiGP^#WF78GGkO>;ayS@$ou39!58K4$0FvLl*(2d#{#Js*ZaJ7 zXkM}JA@&?Os4TV+3JVM&p0ko61_jUA-dIzmrPa<06t%EoOLrTa>I{1kn}h8v!<4hB zUsjS&hEI;qfhUX|TPL00Lw_Ro2gTrR?ak=+asC)@Y(27xj+3qnR|E7^Svz@C3}k8S zO}p&K21Isr1IcW^(qRa6c^*$N1zI&BH4scc$&*7%B62|f!9f3#k|RR#0JmH5W}_Tt ta{9<|q2PTgMQ{z*`BhjOji-lq45<(K+(enHUTU!5Y{wshbY{n2m zSc9TNMMU6+?d;~wZ;ky%&CKr`Zl!9~ck@QW%I~;#e$%lkX30D>YXWLRZUj=Lr^ca? zuNkx}+4bF`^cd99Y1>#W8|Q8b)=DNzbVc6yKRZ#FUYm(&c3xY3VXSm!Gw9jo^xo z3B1WrRijy5ws)9Rcs8>>OoFcIn8bB~@qJ^@T(;{K!~Mc?X;g2zOspxe(4B#YsTX56 z=q=YFpG66KO2;&22yoG=Tkc&i<`V(M2aqgTb#vojf7^5(8{0KP8ZOxtqxQsbEV&Pq zid(e^B2#+JvK5(SvrXv81?(9jNR>^uYVT|sjO#IEo8 zno%qZT2L3eg)i{1=3{8{P-We25%egwaGPZb@m9Q#cc=?Xub+U7I}9lcqDmGd z(*LTM+D57ppF|o|?6yZQzc{FpP4FjOs9X!F;-a$TkvNemR!Lzrl{|D1|r%x7dP`uqlkANJ;U?c?ji<3Wekd zK|&zJ8I3x7s?SKg+A?U_DCbo)W4uNFTJSTKG3B5Q$|Pk%&v6y#9U8yw{fQe4(DTy6 zOyH$6uD{@|-Ug5Mow#ZCgFkU)u3kC6Ts-qF9^ diff --git a/backend/matching-engine/target/classes/org/example/matching/api/dto/WalletResponse$WalletResponseBuilder.class b/backend/matching-engine/target/classes/org/example/matching/api/dto/WalletResponse$WalletResponseBuilder.class deleted file mode 100644 index 01386259ae73383b3e99256bbbebe67e3724309b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2661 zcmb_eZBH9V5PlW|XWUEd0C5P=gtR2JA<4B((>D{^;M4`zkg7(Ys-G5ngD;%#th+Tz z{z-pED-oqirT&2asH(HKXLGhsk&*atw>z^l&%EC3{rlg$e*iqeUIr6L8JILNg=vP| zOMc2Nhr7qt^P`udAsMDOY}b~X45>o#UMb?FmQNtwH9B8wcu74pn> z_>m*ZJZLensydxDF{e&VUl7cxXsSbXaNR^6HyE;gwR($_5OK7fuCyI%mv=%VH%%-m z>8m{$Eo@+!Vf_L@X0U`?Dwnqz9v4Ofs#b@L50S-#4DR3~10S1M#od8|=$tSZr`+j^ z=PwxU#VzQ1m5QTAXQ|Ymm?)sgaHGvnMA>s2Tprr8MY}+9S5jJPaj+==J$J)~hh`hAW!D!Bj|QXM7=?&&Y91ASv&1l2_L`)et=X>F>$Z=CzptvV8pUgH=YadR zq9f*{Y}ph=xpskSCATD*K1|3(@lud;yF#|S=Fi;cZ6SqEE>{ZG%fa4{yzY1Q<-q0# z)BU>BOZlrIdt=r0a(tRPQsaZcDqIMUN}HBm??aj=<&lxYkg0oJzac8N>b1GSsr69F z6Ud$jkc+72io(!bVJG!z#8s9U>A+j_Zd4e9x>8GeuVdnBmC+2(H35y5KB z^G>>*(rCV7oB_ps>XQWV-(vC!6Dxu!)6G%0rJ#D5JFYAIvcrQw4e#rTnKV#kxH}SS zQV0fW47c7dN|%z3mu7LAE=bTopHMd*?IzT16s~mdgezS$U|0+H>vT>RNsLYtpRQKo z+^3yID^r}cw_tyUDi7$bjzI<<(%aMmB>E{)jJTf>s8TM`s+=*_*5AeTA>d zri!hC8QKBMe`D#_wKFR18I|G;*XWt2XW=bAOfI$#YPsJl-{9K_vr2_mm@A||fcIC( zTA<|}?g8(^U5Rifsq<8;ZO{*+T9>d%Ynt$%((@gDBx;uUX*$`aSa$Fe)$8W}cuI)n diff --git a/backend/matching-engine/target/classes/org/example/matching/api/dto/WalletResponse.class b/backend/matching-engine/target/classes/org/example/matching/api/dto/WalletResponse.class deleted file mode 100644 index be44d0cfea16314acb188e37b4aa6fe7dfb47941..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4498 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 diff --git a/backend/matching-engine/target/classes/org/example/matching/app/MatchingEngineApplication.class b/backend/matching-engine/target/classes/org/example/matching/app/MatchingEngineApplication.class deleted file mode 100644 index 366dc503ca20e561d17943d127c63572d89e1202..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 350 zcmb7=O-ckY5QSg$&$PCqGk5^Oow_g}?)(7}UA4MUW}l9sCqp_3ZAQG7E5U^a@K9o9 zn5_#Fc$M!}QAz6i=kp7|1*SDJJfV72IFRCB}iG6ZqAh8x!zr>{b=M#*TrBNW&ESraA=C+?ShtA{7qT6T6D zucV#H!6aUrMVy-#!fEsWtIi1ZqhAh6-}ZF-DDCg2Fjxk b&^sF$YSxqna%{1VSLc%BHWOioHN)f=jO14l diff --git a/backend/matching-engine/target/classes/org/example/matching/config/MatchingEngineConfig.class b/backend/matching-engine/target/classes/org/example/matching/config/MatchingEngineConfig.class deleted file mode 100644 index 6dbc2de9e43932491eef0a2ab2e978a468bc2215..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2066 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 diff --git a/backend/matching-engine/target/classes/org/example/matching/model/Order.class b/backend/matching-engine/target/classes/org/example/matching/model/Order.class deleted file mode 100644 index f95401f7e92c54f1dd93a26655de14fce6f95560..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3369 zcmb_f+fy4=9R5y7vPl|fNehME2*@?W2Cb$lh1$|mLPMd2QfupFNsh237u;+*t&We* z_y_dC2S*=$(HV7Q>eLy1^T9vL`kk|331qc6JBB#FSj^nsuk2+Ra)*M<^)ZREw;G{sXW)-PpIR7HQmdQ66!D#{G z%GKFRxAQAXOI1uJG%YK~nm%Zj7O197~h$N{TpU`SwK7f7yDlIv#alD)3EuRbcs zEyt=>A{ZfJhQTqD<$BFYuF2%|RB|GQL5!(brv$o2TO%^I8bMm%ge{Bpf=rgHwoE!3 zW+iFMvdKJD)?+w}jDd+bUcsw-66OY#h#s1yx?KE-acH*S=5una)o6mH@LC+NBP(#c zY;MY#YNcR0cPwXvHwL-l)C3lql{FIBs%t(s-%9kcDKPD$Pe~srbz`ec_6+Mx;Belm z$Q$+YnzUEUwGt_be6?VfR!!Sd?+s$m*|3OW;D!1p8Po;oY*dR&rfrs`BW=np`FPt3 z^gsE(_W!DE^+pA$ec3S!n+xWa4ugTq0)q#MFdK4RI;wAvjryi9%CB!XT06q~lH0x< z67vFwNVw^BE@?S|IB6?8P0K3ftLj35Q5raiOH53M+ZVg4gQN2bWk`1#$Awef>4J9Z z&v|XkK-BiW$Cj&gyC7#RRWUI=tj?;wX7(>vs}B3$+;YpH7Qr2X8O`#kRh$|TBk80& z)!e(DTvH;Q+!qUTpunj^m7geIHwFg9LD^FT0#2c{?I2k zhCaC<^vRW=PtJ6n9blc{Jhi;Rw{Or!jlf9iDMV^~8%8R*jrLSma2uVe?$9>6QoY7D zdQyo~+c@(hSp#^Jp95N~6G0>p<&x^4(PQZ1{^{oOIF4cT;4Sh^BdpY85*K)?n{rp^ zn{rrz8Bt4)n$%4>9nv@Dw!z&DbcHAc?njUjWC6`UCTef&vch;bh$WCdtW$3E==O6xo*Kxqw40ZOY~ zPLI@0K~sRz8k!15S}kdYPeJPqQ(UFcAKpb5o`_Oej6B(c!Rw9wfkFF|C2#(izTrK(ijutOqpf0nK_qvmVfF11SAw5aYD? zHZe>g@Ej9}80z;de}f`u;1Vwoq&;U|{k{vh{5ooR|!z%1M68vjO|WBzj5W;ZQRuUCx|SR{|o6%|C_ z$WdJwAwjY#fF&=7*ICA@0Qyw{@G7qi!J8PT{X89ps<>`O=DI49|GLt#JJxCJM6&@>qZhgV3TB4<6M>V-fHJK l-yPO&wHrP@wPBem0$9Oqo+?uB@L9$Ce2ek+0ZbIo`!~G!im(6x diff --git a/backend/matching-engine/target/classes/org/example/matching/model/OrderBook.class b/backend/matching-engine/target/classes/org/example/matching/model/OrderBook.class deleted file mode 100644 index bf855d24074c2b132d884541fb203120b15fb5ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8420 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 diff --git a/backend/matching-engine/target/classes/org/example/matching/model/OrderSide.class b/backend/matching-engine/target/classes/org/example/matching/model/OrderSide.class deleted file mode 100644 index a9a98a8498a57cb00a60e7a7d60c9d7881a215e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1163 zcma)4?@!ZE6g{s$=vK=%<^-Ae1DLXcGEhj2LjsbSm{ey{Swj5u*q&QS*P7B1Kl&#r zBtkSAKKn-*@9U<{pvjuFxA(ns&b{xv`~An~ZvY-+-GIVS3Zr&KyyM-szNmD0-0XNk zyV4C?!mre$mWW)hCDLHfEa(_xP@nAXG2C%R;Z-FuWg#tznp<-mxp2vXg>eR>)Yx`* zYc9jW>(S&)WRWv4Zeap>2EFNrfnX?_xk>UXvS3&1za&OX<-Ui88UwW zwV>Cf>POt~iTWFc_3{vV$LEKK)u9D9j>wVfa0Mxl=oc+q!wkdNh8KA8Cd1^g)PVWS zZls`_bns#dX&GlN%wb*{ko0iKV3+L?Eudn*NZJnF5<}MU0`a2P-51d-zVFk@qknW^ zkLEB#-U*xBZ}7;IVgp4j;9U~VU-X3`_guuCu=SEhgo#B&$I;@BN5L!!a;ntlj`x!= zYIyFHF zD!E^v=~uU=HWn#cqF1LOcrT$eP*4-GRf;NY8H-CZr?kx#b3CaE7Skg_mCVW4!TN@p(^@ZAce%oMdv&o^#%h=Xsy=Zhrs!mtO&#$K42g z7|`L5B7mTV*sk@!N|&wbPI_&7*Umc{g6B%rl5;`BKx%#~j1a;)B2f$?sv%jc@1*Uo ztjhheovv6;zF4AVrB<-Z=?%MK*B@9;saDmXuhk27JzLN)va%Oq)2Z|PqBuPe#X<2H zY|<)Qkfq@$Mlh=3!2NnDZ(B~=p{+s7$@X{@6L>>Iv~E`{rdZv%;e5@_tZc@kcoS0^ z0;R@MldGdWQI~49vTaotLpa2Es~0z}UAieYvr)`R3XxK^;nbTIyXr)67)Nv*jp7)R z%w#Y1Rm&-ol1ho-0;z0vJ{v&_^E!+uPT-`5;k~n+fJ}9}9eT?uH;IFU-j%?oqDTu+ zA`!~$!m`yU%Ent!WE2D4jm@IPsfKf@9y}cu_pju#J!@Um^IIDH%dC)wgDa(~eZ5)P zw(B>o?J`$JR%&^xyk*r(^4wYUJH--XrdIx2u@_nGTDRJ=*n~J6k=CI`_6v?a zX$)%QeO4o{ml}DSIF3kf;1~n%F5c$((|me_0q7i)#!t|U6D{b*$rgr;L<=!vJkY|J z5f8R7X^c#_F!KXX`tS~a4>J?cuODLwV;lz(_LoID%v71u=ST`P!!yH}Rk+H*@r@;RAfw;pY#MDzxrS zJwn8IjY+0RIv4=-^x`6G^hi{$h}&SRw|A#CUBA>Sx}rBZ1t!4xkNtK ziR4ovFH$rj9fP%C#xB#lxJYqmw7-cZ&V2N;fn_Bf;W7gMp!OHeX#Pn>O+cf8(C`u6 zYf9~Dj-tH))7GDH(iU@2EiS95ZE*%VQ8irlG#=_VzT#|jjwqcoBhU{p2jO!btCT)Huj`1@@-G!>safE?g9lMw>oIdQa5|OL;igM zpHPtZl!poR9CQmEls^VcK<++^nC8Hi>+RO;cl#OLe*Ox#(gaPGJozev}q1yT_Z0&Q&mfq90U++@- zlIwD=^QO4naruO`l=n*J^(}VBn9!wXOsIYkALP5k8__+sS$cD;o>A{Lxt$rek!IXR znsFOxMzv3Aq#30Xd3$B}8SVI!_r{>oP9nrfjLu?o6QhF|O=C2Q@pz2=SYCx6)7*zU F{{V7>@&Nz< diff --git a/backend/matching-engine/target/classes/org/example/matching/model/Trade.class b/backend/matching-engine/target/classes/org/example/matching/model/Trade.class deleted file mode 100644 index ce71b937b3d4a8fec14459fb4374c35c23afed3b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2300 zcma)7-E!Mh5dMxGTec!QY1+6=fYb?TvDHxX|K}z^971EPcu9P$EH z&p&I(AFcktk&V8ky63ig*64dZ=`@agt0x8Y)8XZz-;@49PhhF@+;>sdgvAzE!Kw2F?z5 z4OH2oOb$m^vGc1918-uJqNG>PqVVaMHov-W;4OYNPp`g>b6|blfXRA;^vB~gmWcQ* z18?J@!0oZ(AXS(^=TR?}{`QxXxFYf;4n7CN>opAP${(m%FN z9nvgyysqV(Sia5sSUIQ8Z8~zJ^MA!}5|hEJOfILySwErbJdx_$>pio4t1p%G3BOFP z6Pyy0q==cEtF_sS`XwQdXro<1n}C^eR5~SuR8U^jkJPY7-q7#LeVYl;!!CZvy+c9n zdY%fDZw;bog93I1_Ck}|Rhw^%t?EQ0^ET{XUW{9o*GZ>ti~2$ydpf?tzJ{;4*pCG^ zuNu~NUw9WXzA;h#_pPq-{7ZqKC)11#qwpSEZqJdyX2P(LUJ1?kT*lfJ9rc) z{u8BLq{OS{pSTs4$lMx1GuMd*vyvO3Y*w@pW)7PV3%5g@l5bMDYFs$hG2dMHDu0zj za;tQ9i7Z&hL1|%umvdo(xgty<|HeVCVBGrSOGiOYr){J*;C6E9_D~=gVAcF1eAY;= t({qoW+DkkDrf*_t0&z9YEsGt($l!B)L6Q+$^n8f}+Uc}vql2ed`4@HonS=lU diff --git a/backend/matching-engine/target/classes/org/example/matching/model/Wallet.class b/backend/matching-engine/target/classes/org/example/matching/model/Wallet.class deleted file mode 100644 index 41fecd14a5302a94ae950bbcd688b97cd4d6fac1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4473 zcmb_f-)|dL7XHSu<6qOnbyIKLgeEDW%`Y%C*==b`AayBCNYZZIrnGdIo!FCP8rx&W z<3RbjOUo-yydd%37mz@rsZ=DiPppJ^N4)Tdpt8H)z4OE4*zHDI)YfzFoqNvt&Ue0Z z@AQX%Kll#73%H#?2whQxRYcIOAazsQ)^cU7x{n^zwm7~T$3FB#(W@eb{R&1* zYa^$>tyOAeJy+4};-YED2mi88VR>V4>qE7@; zExoQ=+j>d(h$8c-4Dx<5=ecoNt0iy{UBXjV#UTtR==I?gHZ^*EB%n4|63`PW4huIu z9w5hyh%l^T1V_mB6+&G&t03)UDoatYEmAWp2pv`N6ppeO8-gB|WKpb+sTjwEg1A;H z%~wmWh+@@MN=HGy zL*PKA+ue0UrC>TuIZu;^g0WH6?1rT)C8qw3aa_N8e219l?T&<**b$in+ zUDPbCqT9Mf4{_>4N~xrv&#O&POzd@TnfKZ&FWak^OPAbcaaK}7QLUT0wTjsgRZ|uz zW!t*tS~vzmcGrb2gb_tou(jeAd&$e%(#yJ5*IR7%m-IDbSKxFIo!4z0NhXSfQLWon zqawxBwXHGm{y-|8`GiNr?z5{+3}knG&zt{G<)oSvdO$NB#3X4|-P2Zx?!l`m`cx?YdsLj_N@andQhDE^_~@Z-1gSaZ1GeYlUOIrssQ7Iz~@Y4PD8 zpS;)QleaRcJ&r^Cnn{c6H84NGaRhUG_ab-P;aK=PIdLD##J7lEi{D559@M}%&GEr& z_wk2&=x+`OCnoP<=xZ6}CH@}fl?(JDj2IEcF$fjMi1s*VCx~pGZ!=CToI##5M#Wj? zpx|YWBMK+r)!Z@>;fT(1g3mgQ!cEFTut!ZL-dA! zMSm;IKl=<^Hk!~chdKr?Bu(E%P!Yje2OHp^xZ$XgWNw6U7q?EqVc|9We~<1w)<~&i)=43V6-sA=r!kyL)j# z#%k?F=lr=Q6Y1n+aJQ4?$2z%=*IgvPQ2jA7v?43=fQ^nF{E1~b73Rv|o;vyow;O3@!b)1yi+Rwvrl%4ihjv})7X>|RDQ5K(noo>oV z5yV4u0U8S-yurZEner7Oicm8$QAdn2YfqV{nDF;VX2Zj>-LjGIk#Lg~9pNPCoYZBi zu)_brnHWNi2SA;TZnFosWpXp}fSK`An(*rDS_D znxD-3gd)h9&AwGy97#fBRoWlsi zoEOwg@t!-rElh{YO5GwUFQ|&3?0I|Un!7F>FF4p#Gh4#<8kVFXi96h97%8@;Nui)4 zg|vqA21YT)Fx8XpcvWGW5s{&D2dc+H9oI3f;f8^mm|;k_)7tc<<+sEuT=*@1Yeo8wjy$0VWy_rmJ zL}z;0617dlWSBlXoDR{tkae&6iU-^gQUsLgz>eisUmU2;>oTWRqn7F2<}hec>D8k2 z$+|KWJ8k|CY2oaol?D2?7X}sa(o!unc}nSKRr4`SY=y4098t0w7TNOLbv?;dFVbG~ zkzB)9M`}lv;GGxjnGGt0@Z^Cn%=Wo1P-hR(4MazQp0v6n=$oOdDTXZK^iQ`Ey>m3P z6pevo?hq{Z9opMN41R|GF^bO9Tis=VfdqzeC;DUbPU0?R>C0f^9z`hDDzQ{-GWQ93 z{tJ@%BaFxK=3iEd@<~Um@n(FBrKtDufS3=7(#L3^1RmirftA1tg)4znByfbu7=9x4 q6;mH*G6t2c+7~d^K~EjiQ<%e(Hhqo)n?;$Y#ZM!|GZb2o1>g_)7>3gT diff --git a/backend/matching-engine/target/classes/org/example/matching/orderbook/OrderOrchestrator.class b/backend/matching-engine/target/classes/org/example/matching/orderbook/OrderOrchestrator.class deleted file mode 100644 index 31340e1d36aa8080e8c8ef5c79d393bc9dd4846f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4555 zcmcgvYf~H78Ga5(tPl&fiNPg~9b$|lB#ekn+}d)SVlIsc7aIXCPHT6O*03P7s6_;w(h-g8*JmW9e>J)&UB`k>G#g`XLNdd&e@faV6pwFGt!>3=e*}V z&w1X3-fXFim{x}n(<}BNiSGjX%{kPVa~Rf;uEqrQAjVCMW zzp@f4xAmkG8V=A(zDC-XkuV-Zt$cLqIE2RqLY^o$?~M5GzHDdAtjlbo>wFkph-!%G z=*D4zcHjLgmIwsrO(&TV*d6H_-EiZSQ=m^Kn(6Lw9ldx$V9&C#WDeN5wBekyoCWrZ zj*)YU0*4}7SNbRm<0$$xJgMUt-YL-Ki_OpN1nP}^-ppktjmrWpe!ID`KXe+#S$e6T+RY*@Z8k$7-hij^ZVml9PGev@J8tVm0)e8j`k+Q5_7H}2 z4C6hFgG+XSK|CQ-fWWZ_G5S{W!$@L8!?QX@F-E`jC1aaZArQ`IjkM_@=zDMkD~^?o zk6J}1(SQk@(QsDBBvQ;2%CE}PbZg5oy~Ng9ayvDh^v0=S8Z#Qs>3A<@1)4WBltcuy z1*14_USYCjjy*3|Jg4J*ct6?Cso`pub~7{M^5VVYVya+d%mx^k(~#DY0qq#|Ww7K< zRe?_v7EQ;=no7_8;#LVIx|9pd>sWwQb^&kwyKXjg^!lV4&FlCe=ye)LQ&xuOj?g;3N3TdBQZgZxIyzRcO6zj@nS#og zG|WgCS8!Fshje@xA1OJ5x+_QR+&p(MCiCBrBDAN_3;LG zBT?YEPr`Ywf^pBWDtGbHX9!;+sHw^R!J%pkT)A34bd=@E_{#E} zS(q~BvK(n1wbMp+#wb|w-5U%z3l?vVBmO(t+m}KK+G@;n7VOL!qhKtXOc>PjkN-Cp zrO>aqNw#5a(^)D?4ga&3G*=}R#c)G$Wp3FjT@67;<|%;#{%YI+b<+bcd4=LW!phOe zZ=KRiR(HBiUQXPcYppis)qKgIeVb%Y-XGQ}>T66nMw)eB-t&uaie+co9JZwAv?@fE zg>a7yZ~{AR+m5V_^R6otL-;ktCx=Fc2Bz9YdvbiHe>6FGQKi2Sek-uIVlFj3Je(Xz z4vkM;9G)H@Ozo({jWB+P-)ne7);enf2R9Olm0Pu!%(xrTZuv88q}}TBrOM3U3A%`$ zF>;x#Sv)w(dVVFJsK^#xYN!~gS~x{YeZ=pRZ#)$PtXEUKTS=^*%;n6&K-MT0&7y|e zyok1($q%ZAI|BRfElL-0&&5hL#4jPB4$bn@hP`I_jiFk8B&e3Dgbk2d+(cY|Uz_zs^3xH$+Rz+OE% z(1e5hGU?=Yhp-Qib2NgNDG_y52`V(ex7U6U2Lj8yrO&`uM%^Byk>7 zcu%=ol<~&Ocw>rOi8m&{ng~YrB(ajbnEYxXsqzdh!SWgQ@O3Z$kMb|@0}Qxl5wCE0 zkYjI0-@vZeO&oj~yV-4IH*yC(z)c*v!GV^y(934uTj-K+oPJl81nduPp(g6h(xgB#u+@zqH!E1&LYct z^%_!m5mO{;8b4w6c^9+z3(n)Ol#<@mN7Am5`&aQp?s6B6UXMhUE%r8kgx5&6NsT|I zmKyw&EA{fob&mXuBYP2gq^thlIG|xd!}LGVQ}Zv>sa}UNV^C0&^mmEW4VCBV9nu4i zHZO+$h??12X|L35fK4_v8)RdrX6x7#Z{u=mRZoX;Bk0>5P2#NO*9{8#Gv Q8#*%(=KC$I<4v^v4{}`LhX4Qo diff --git a/backend/matching-engine/target/classes/org/example/matching/orderbook/OrderRepository.class b/backend/matching-engine/target/classes/org/example/matching/orderbook/OrderRepository.class deleted file mode 100644 index 8a4a058f5b317bd5088f096e739820f72c58d9a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 417 zcma)&O-{ow5QU#Z)6nwQ1y?{yH_ZV8ELb2Rr7CJ9_HHtyE=e3YPDQWAf&*|U#5ff~ zLX}`QGoJb0^ZWRGdk1iXNdQk^rcDvitE`%mqDtCqt?DAuCMUDf`XySpYDtZ5mDOe! zU?4Er$gPY@$%~8ChB7NKXyuj!uEOLXuhKb{dsaMsV#1v4TIY|_$cikPR>1Ey1&*Ip zo!{*qa)B^Rew0#c*jYT?k2VobldyUtN3wW2|)~ diff --git a/backend/matching-engine/target/classes/org/example/matching/util/IdGenerator.class b/backend/matching-engine/target/classes/org/example/matching/util/IdGenerator.class deleted file mode 100644 index 884a082681359e7e84fbfe1c3dddf52f103652fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 471 zcma)2%TB{E5FGcFHiR~m@;)FAh?WEXfC3i~s8R%n(%#*~YF#A`GA{60Z~?@D58$H^ zo3u!9!-rYV?9Q&epI`4E08X&uqJW}etnNVJ+thN8^1xMLOv4<7fXLbr86DowO z#5hGpv3&Rn_ME3%gjt$ItPy&P`#Ls=)vyVll+3)FX8`97&I^{GNTQ7q&h1rVTf_?3 F{sx^CWzzrv diff --git a/backend/matching-engine/target/classes/org/example/matching/validation/OrderValidator.class b/backend/matching-engine/target/classes/org/example/matching/validation/OrderValidator.class deleted file mode 100644 index 3f28dceb2057d2d36b2c86794f481b838fdab100..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 947 zcmah{O>fgc5PjQx*l``|Hld|Jp)C}W2I3+Fmq3L;0)?iuD3C*M8+(;(>%^6_so;Nb z;lMxWg-ek*zzrmR6k^skP^6&xFzb2q@!sstkDs5v0Cr zYWf;ouyFy4luu||`huZCglEaqnIyu*B^#Hq#9&hSZX`Xbr*WU_&{Z4DSYeo^(91C& zDyiPa(WZfG4E2c|M?8=|S27$X_s~iFkS-+qgsz8SrX`2s#dy#a(JS5!2$^ez9uGP^ zlG;zftm?}V!^Y%M{!7!KQPLoFUaL$lKlMK?sSn7rBQ+35_$w&LEwHa|?2I@?0^ zLw}b?d?1vFNVU}t$B`$VNTe3fk38AydcmpQJT!1#uuK2A`4pF*VsDxHGnf2Ut8 zy!()*U5S6P$J90hE#W?jWKE(dkQ^He$$M8Fy(r@6j%968eai>KT^Mqz%%N l=Mz~-Bm-NhQ4PawiqWd&9p*68GEpZ#$0(@ha>-6%;}_!+*Czk~ diff --git a/backend/matching-engine/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/backend/matching-engine/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst deleted file mode 100644 index 200dd91..0000000 --- a/backend/matching-engine/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +++ /dev/null @@ -1,37 +0,0 @@ -org/example/matching/api/controller/MarketController.class -org/example/Main.class -org/example/matching/app/MatchingEngineApplication.class -org/example/matching/model/Trade.class -org/example/matching/model/OrderSide.class -org/example/matching/api/dto/OrderResponse.class -org/example/matching/journal/EventJournal.class -org/example/matching/Wallets/WalletService.class -org/example/matching/Wallets/InMemoryWalletService.class -org/example/matching/model/Reservation.class -org/example/matching/validation/OrderValidator.class -org/example/matching/api/controller/OrderController.class -org/example/matching/api/dto/OrderBookResponse$OrderBookResponseBuilder.class -org/example/matching/api/advice/ApiExceptionHandler.class -org/example/matching/model/OrderBook.class -org/example/matching/api/dto/WalletResponse$WalletResponseBuilder.class -org/example/matching/orderbook/OrderOrchestrator.class -org/example/matching/api/dto/OrderResponse$OrderResponseBuilder.class -org/example/matching/orderbook/InMemoryOrderRepository.class -org/example/matching/matching/MatchingEngine.class -org/example/matching/model/Order.class -org/example/matching/api/dto/DepositRequest.class -org/example/matching/api/dto/PriceLevel.class -org/example/matching/api/dto/WalletResponse.class -org/example/matching/Replay.class -org/example/matching/util/IdGenerator.class -org/example/matching/api/controller/WalletController.class -org/example/matching/Wallets/RiskManager.class -org/example/matching/api/dto/OrderMapper.class -org/example/matching/api/dto/OrderBookResponse.class -org/example/matching/api/dto/OrderRequest.class -org/example/matching/config/MatchingEngineConfig.class -org/example/matching/api/service/MarketDataService.class -org/example/matching/orderbook/OrderRepository.class -org/example/matching/MatchingEngineApplication.class -org/example/matching/model/Wallet.class -org/example/matching/api/service/OrderService.class diff --git a/backend/matching-engine/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/backend/matching-engine/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst deleted file mode 100644 index d31a6fd..0000000 --- a/backend/matching-engine/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +++ /dev/null @@ -1,34 +0,0 @@ -/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/app/MatchingEngineApplication.java -/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/journal/EventJournal.java -/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/model/Trade.java -/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/orderbook/InMemoryOrderRepository.java -/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/MatchingEngineApplication.java -/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/api/dto/WalletResponse.java -/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/Wallets/RiskManager.java -/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/orderbook/OrderOrchestrator.java -/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/model/OrderBook.java -/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/api/controller/WalletController.java -/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/model/Wallet.java -/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/Wallets/InMemoryWalletService.java -/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/api/dto/PriceLevel.java -/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/api/controller/OrderController.java -/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/api/dto/OrderResponse.java -/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/api/advice/ApiExceptionHandler.java -/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/api/controller/MarketController.java -/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/api/service/OrderService.java -/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/validation/OrderValidator.java -/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/orderbook/OrderRepository.java -/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/Main.java -/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/model/Order.java -/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/model/Reservation.java -/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/Wallets/WalletService.java -/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/api/dto/OrderBookResponse.java -/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/api/dto/DepositRequest.java -/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/api/service/MarketDataService.java -/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/api/dto/OrderRequest.java -/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/matching/MatchingEngine.java -/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/Replay.java -/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/util/IdGenerator.java -/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/model/OrderSide.java -/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/api/dto/OrderMapper.java -/Users/aumpatel/Desktop/Spring/Strongx/matching-engine/src/main/java/org/example/matching/config/MatchingEngineConfig.java diff --git a/backend/matching-engine/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst b/backend/matching-engine/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst deleted file mode 100644 index e69de29..0000000 diff --git a/backend/src/main/java/org/example/Main.java b/backend/src/main/java/org/example/Main.java deleted file mode 100644 index 407f157..0000000 --- a/backend/src/main/java/org/example/Main.java +++ /dev/null @@ -1,7 +0,0 @@ -package org.example; - -public class Main { - public static void main(String[] args) { - System.out.println("Hello world!"); - } -} \ No newline at end of file diff --git a/backend/src/pom.xml b/backend/src/pom.xml deleted file mode 100644 index 39b72ca..0000000 --- a/backend/src/pom.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - 4.0.0 - - org.example - Strongx - 1.0-SNAPSHOT - pom - - common - matching-engine - - - - org.projectlombok - lombok - 1.18.42 - provided - - - - - 19 - 19 - UTF-8 - - - \ No newline at end of file diff --git a/frontend/src/components/Category/CategoryBar.tsx b/frontend/src/components/Category/CategoryBar.tsx index 444ee99..af7c548 100644 --- a/frontend/src/components/Category/CategoryBar.tsx +++ b/frontend/src/components/Category/CategoryBar.tsx @@ -28,7 +28,7 @@ export default function CategoryBar() { + ); +} diff --git a/frontend/src/components/MarketCard/MarketCard.tsx b/frontend/src/components/MarketCard/MarketCard.tsx new file mode 100644 index 0000000..7b9e472 --- /dev/null +++ b/frontend/src/components/MarketCard/MarketCard.tsx @@ -0,0 +1,171 @@ +interface Candidate { + name: string; + image: string; + payout: string; + odds: string; + color: string; +} + +interface MarketCardProps { + title: string; + candidates: Candidate[]; + volume: string; + marketCount: string; + newsText: string; + currentIndex?: number; + totalCards?: number; +} + +export default function MarketCard({ + title, + candidates, + volume, + marketCount, + newsText, + currentIndex = 1, + totalCards = 7, +}: MarketCardProps) { + return ( +
+ {/* Header with navigation */} +
+

{title}

+
+ + + {currentIndex} of {totalCards} + + +
+
+ +
+ {/* Left side - Market info */} +
+
+ Market + Pays out + Odds +
+ + {/* Candidates */} + {candidates.map((candidate, index) => ( +
+
+ {candidate.name} +
+

{candidate.name}

+
+
+
+ {candidate.payout} + + {candidate.odds} + +
+ ))} + + {/* Volume and markets */} +
+ {volume} vol + {marketCount} markets +
+ + {/* News section */} +
+

+ News {newsText} +

+
+
+ + {/* Right side - Chart and legend */} +
+ {/* Legend */} +
+
+ {candidates.map((candidate, index) => ( +
+
+ {candidate.name} + {candidate.odds} +
+ ))} +
+ Kalshi +
+ + {/* Chart placeholder */} +
+ + {/* Grid lines */} + {[0, 20, 40, 60, 80, 100].map((y) => ( + + ))} + + {/* Sample chart lines */} + + + {candidates[2] && ( + + )} + + + {/* Y-axis labels */} +
+ 40% + 30% + 20% + 10% + 0% +
+ + {/* X-axis labels */} +
+ May + Jul + Oct + Dec + Mar +
+
+
+
+
+ ); +} diff --git a/frontend/src/components/TopicCard/TopicCard.tsx b/frontend/src/components/TopicCard/TopicCard.tsx new file mode 100644 index 0000000..710d7b7 --- /dev/null +++ b/frontend/src/components/TopicCard/TopicCard.tsx @@ -0,0 +1,80 @@ +interface Option { + label: string; + payout: string; + odds: string; + color?: string; +} + +interface TopicCardProps { + category: string; + categoryIcon: React.ReactNode; + title: string; + date: string; + options: Option[]; + volume: string; + marketCount: string; +} + +export default function TopicCard({ + category, + categoryIcon, + title, + date, + options, + volume, + marketCount, +}: TopicCardProps) { + return ( +
+ {/* Category Header */} +
+
+ {categoryIcon} +
+ + {category} + +
+ + {/* Title */} +

+ {title} +

+ + {/* Date */} +

{date}

+ + {/* Options */} +
+ {options.map((option, index) => ( +
+
+
+ {option.label} +
+
+
+
+ {option.payout} + + {option.odds} + +
+
+ ))} +
+ + {/* Footer */} +
+ {volume} vol + {marketCount} markets +
+
+ ); +} diff --git a/frontend/src/pages/Home.tsx b/frontend/src/pages/Home.tsx index eab6d71..c0cea39 100644 --- a/frontend/src/pages/Home.tsx +++ b/frontend/src/pages/Home.tsx @@ -1,9 +1,298 @@ import Header from "../components/Header/Header"; +import MarketCard from "../components/MarketCard/MarketCard"; +import InfoCard from "../components/InfoCard/InfoCard"; +import TopicCard from "../components/TopicCard/TopicCard"; + export default function Home() { - return ( - <> -
- - - ) + const candidates = [ + { + name: "Gavin Newsom", + image: "https://via.placeholder.com/40", + payout: "5.25x", + odds: "18%", + color: "#4a9eff", + }, + { + name: "J.D. Vance", + image: "https://via.placeholder.com/40", + payout: "5.25x", + odds: "17%", + color: "#00d4aa", + }, + { + name: "Marco Rubio", + image: "https://via.placeholder.com/40", + payout: "5.25x", + odds: "18%", + color: "#ffa500", + }, + ]; + + return ( +
+
+ +
+ {/* Market Card */} + + + {/* Info Cards */} +
+ + + + } + title="Markets over Monopolies" + description="How fair markets protect consumers" + /> + + + + } + title="Responsible Trading" + description="Tools and tips for trading smart" + /> + + + + } + title="Market Integrity" + description="Learn how Kalshi prevents insider trading" + /> +
+ + {/* Politics Section */} +
+
+

Politics

+ + + +
+ +
+ + + + } + title="How long will the government shutdown last?" + date="Feb 14 @ 10:00AM" + options={[ + { label: "At least 60 days", payout: "2.05x", odds: "46%", color: "#48CAE4" }, + { label: "At least 55 days", payout: "1.65x", odds: "59%", color: "#48CAE4" }, + ]} + volume="$4,199,600" + marketCount="21" + /> + + + + + } + title="Will members of Congress be banned from trading stocks?" + date="Before Jan 21, 2029" + options={[ + { label: "Before Jan 21, 2029", payout: "1.59x", odds: "56%", color: "#00d4aa" }, + { label: "Before 2027", payout: "7.14x", odds: "12%", color: "#00d4aa" }, + ]} + volume="$222,525" + marketCount="3" + /> + + + + + } + title="Will Americans receive tariff stimulus checks?" + date="Before 2027" + options={[ + { label: "Before 2027", payout: "5.25x", odds: "18%", color: "#48CAE4" }, + { label: "Before August", payout: "10.4x", odds: "9%", color: "#4a9eff" }, + ]} + volume="$1,334,816" + marketCount="9" + /> + + + + + } + title="What will the US tariff rate on China be on July 1?" + date="Between 10% and 19.99%" + options={[ + { label: "Between 10% and 19.99%", payout: "1.47x", odds: "69%", color: "#00d4aa" }, + { label: "Between 20% and 29.99%", payout: "4.35x", odds: "27%", color: "#00d4aa" }, + ]} + volume="$36,656" + marketCount="7" + /> +
+
+ + {/* Elections Section */} +
+
+

Elections

+ + + +
+ +
+ + + + } + title="Who will win the 2028 Presidential Election?" + date="Nov 5, 2028" + options={[ + { label: "Republican", payout: "1.85x", odds: "52%", color: "#ff4444" }, + { label: "Democrat", payout: "2.15x", odds: "45%", color: "#4444ff" }, + ]} + volume="$8,500,000" + marketCount="15" + /> + + + + + } + title="Will Democrats control the Senate in 2026?" + date="Jan 3, 2027" + options={[ + { label: "Yes", payout: "2.85x", odds: "35%", color: "#4444ff" }, + { label: "No", payout: "1.55x", odds: "65%", color: "#ff4444" }, + ]} + volume="$2,100,000" + marketCount="8" + /> +
+
+ + {/* Companies Section */} +
+
+

Companies

+ + + +
+ +
+ + + + } + title="Will Apple stock hit $250 by end of 2025?" + date="Dec 31, 2025" + options={[ + { label: "Yes", payout: "2.25x", odds: "44%", color: "#00d4aa" }, + { label: "No", payout: "1.75x", odds: "56%", color: "#ff6b6b" }, + ]} + volume="$3,450,000" + marketCount="12" + /> + + + + + } + title="Will Tesla deliver 2M vehicles in 2025?" + date="Dec 31, 2025" + options={[ + { label: "Yes", payout: "3.15x", odds: "32%", color: "#00d4aa" }, + { label: "No", payout: "1.45x", odds: "68%", color: "#ff6b6b" }, + ]} + volume="$1,890,000" + marketCount="6" + /> +
+
+ + {/* Economics Section */} +
+
+

Economics

+ + + +
+ +
+ + + + } + title="Will inflation rate be below 2% by end of 2025?" + date="Dec 31, 2025" + options={[ + { label: "Yes", payout: "1.95x", odds: "51%", color: "#00d4aa" }, + { label: "No", payout: "2.05x", odds: "49%", color: "#ff6b6b" }, + ]} + volume="$5,200,000" + marketCount="18" + /> + + + + + } + title="Will the Fed cut rates in Q2 2025?" + date="Jun 30, 2025" + options={[ + { label: "Yes", payout: "2.65x", odds: "38%", color: "#00d4aa" }, + { label: "No", payout: "1.62x", odds: "62%", color: "#ff6b6b" }, + ]} + volume="$6,750,000" + marketCount="22" + /> +
+
+
+
+ ); } \ No newline at end of file From 81fb8ec0fff7c3e5941992976e09e204e1fea3dd Mon Sep 17 00:00:00 2001 From: Ved Patel Date: Thu, 12 Mar 2026 23:36:48 -0400 Subject: [PATCH 09/13] feat: Update MarketCard component layout for mobile and desktop, enhance candidate display, and adjust styles --- .../src/components/MarketCard/MarketCard.tsx | 58 +++++++++++++++++-- 1 file changed, 53 insertions(+), 5 deletions(-) diff --git a/frontend/src/components/MarketCard/MarketCard.tsx b/frontend/src/components/MarketCard/MarketCard.tsx index 7b9e472..9f8be25 100644 --- a/frontend/src/components/MarketCard/MarketCard.tsx +++ b/frontend/src/components/MarketCard/MarketCard.tsx @@ -26,10 +26,10 @@ export default function MarketCard({ totalCards = 7, }: MarketCardProps) { return ( -
+
{/* Header with navigation */}
-

{title}

+

{title}

-
+ {/* Mobile/Tablet Layout (< 768px) */} +
+
+ Market +
+ Pays out + Odds +
+
+ + {/* Candidates */} + {candidates.map((candidate, index) => ( +
+
+ {candidate.name} +
+

{candidate.name}

+
+
+
+
+ {candidate.payout} + + {candidate.odds} + +
+
+ ))} + + {/* Volume and markets */} +
+ {volume} vol + {marketCount} markets +
+ + {/* News section */} +
+

+ News {newsText} +

+
+
+ + {/* Desktop Layout (>= 768px) */} +
{/* Left side - Market info */}
@@ -71,7 +119,7 @@ export default function MarketCard({
{candidate.payout} - + {candidate.odds}
@@ -104,7 +152,7 @@ export default function MarketCard({
))}
- Kalshi + Max
{/* Chart placeholder */} From 3f9f382be34eb6ddcef9659c147999b7e70f4ab8 Mon Sep 17 00:00:00 2001 From: Ved Patel Date: Sat, 14 Mar 2026 19:34:42 -0400 Subject: [PATCH 10/13] feat: Integrate Redux for state management, add Footer and CategoryBar components, and implement search functionality with shake effect --- frontend/package-lock.json | 113 +++++++++- frontend/package.json | 2 + .../src/components/Category/CategoryBar.tsx | 21 +- frontend/src/components/Footer/Footer.tsx | 41 ++++ frontend/src/components/Search/SearchBar.tsx | 16 +- frontend/src/main.tsx | 10 +- frontend/src/pages/Home.tsx | 2 + frontend/src/store/categorySlice.ts | 29 +++ frontend/src/store/footerSlice.ts | 74 ++++++ frontend/src/store/homeSlice.ts | 210 ++++++++++++++++++ frontend/src/store/searchSlice.ts | 35 +++ frontend/src/store/store.ts | 17 ++ 12 files changed, 542 insertions(+), 28 deletions(-) create mode 100644 frontend/src/components/Footer/Footer.tsx create mode 100644 frontend/src/store/categorySlice.ts create mode 100644 frontend/src/store/footerSlice.ts create mode 100644 frontend/src/store/homeSlice.ts create mode 100644 frontend/src/store/searchSlice.ts create mode 100644 frontend/src/store/store.ts diff --git a/frontend/package-lock.json b/frontend/package-lock.json index def3310..d50fda0 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -8,9 +8,11 @@ "name": "frontend", "version": "0.0.0", "dependencies": { + "@reduxjs/toolkit": "^2.11.2", "@tailwindcss/vite": "^4.2.1", "react": "^19.2.0", "react-dom": "^19.2.0", + "react-redux": "^9.2.0", "react-router-dom": "^7.13.1", "tailwindcss": "^4.2.1" }, @@ -981,6 +983,32 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@reduxjs/toolkit": { + "version": "2.11.2", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.11.2.tgz", + "integrity": "sha512-Kd6kAHTA6/nUpp8mySPqj3en3dm0tdMIgbttnQ1xFMVpufoj+ADi8pXLBsd4xzTRHQa7t/Jv8W5UnCuW4kuWMQ==", + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "@standard-schema/utils": "^0.3.0", + "immer": "^11.0.0", + "redux": "^5.0.1", + "redux-thunk": "^3.1.0", + "reselect": "^5.1.0" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18 || ^19", + "react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-redux": { + "optional": true + } + } + }, "node_modules/@rolldown/pluginutils": { "version": "1.0.0-rc.3", "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.3.tgz", @@ -1313,6 +1341,18 @@ "win32" ] }, + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "license": "MIT" + }, + "node_modules/@standard-schema/utils": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@standard-schema/utils/-/utils-0.3.0.tgz", + "integrity": "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==", + "license": "MIT" + }, "node_modules/@tailwindcss/node": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.2.1.tgz", @@ -1642,7 +1682,7 @@ "version": "19.2.14", "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "csstype": "^3.2.2" @@ -1658,6 +1698,12 @@ "@types/react": "^19.2.0" } }, + "node_modules/@types/use-sync-external-store": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz", + "integrity": "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==", + "license": "MIT" + }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "8.56.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.56.1.tgz", @@ -2216,7 +2262,7 @@ "version": "3.2.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/debug": { @@ -2703,6 +2749,16 @@ "node": ">= 4" } }, + "node_modules/immer": { + "version": "11.1.4", + "resolved": "https://registry.npmjs.org/immer/-/immer-11.1.4.tgz", + "integrity": "sha512-XREFCPo6ksxVzP4E0ekD5aMdf8WMwmdNaz6vuvxgI40UaEiu6q3p8X52aU6GdyvLY3XXX/8R7JOTXStz/nBbRw==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, "node_modules/import-fresh": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", @@ -3373,6 +3429,29 @@ "react": "^19.2.4" } }, + "node_modules/react-redux": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.2.0.tgz", + "integrity": "sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g==", + "license": "MIT", + "dependencies": { + "@types/use-sync-external-store": "^0.0.6", + "use-sync-external-store": "^1.4.0" + }, + "peerDependencies": { + "@types/react": "^18.2.25 || ^19", + "react": "^18.0 || ^19", + "redux": "^5.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "redux": { + "optional": true + } + } + }, "node_modules/react-refresh": { "version": "0.18.0", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.18.0.tgz", @@ -3421,6 +3500,27 @@ "react-dom": ">=18" } }, + "node_modules/redux": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", + "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==", + "license": "MIT" + }, + "node_modules/redux-thunk": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-3.1.0.tgz", + "integrity": "sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==", + "license": "MIT", + "peerDependencies": { + "redux": "^5.0.0" + } + }, + "node_modules/reselect": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.1.1.tgz", + "integrity": "sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==", + "license": "MIT" + }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -3702,6 +3802,15 @@ "punycode": "^2.1.0" } }, + "node_modules/use-sync-external-store": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", + "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, "node_modules/vite": { "version": "7.3.1", "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.1.tgz", diff --git a/frontend/package.json b/frontend/package.json index 776c2f8..2eaa31b 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -10,9 +10,11 @@ "preview": "vite preview" }, "dependencies": { + "@reduxjs/toolkit": "^2.11.2", "@tailwindcss/vite": "^4.2.1", "react": "^19.2.0", "react-dom": "^19.2.0", + "react-redux": "^9.2.0", "react-router-dom": "^7.13.1", "tailwindcss": "^4.2.1" }, diff --git a/frontend/src/components/Category/CategoryBar.tsx b/frontend/src/components/Category/CategoryBar.tsx index af7c548..54b38bb 100644 --- a/frontend/src/components/Category/CategoryBar.tsx +++ b/frontend/src/components/Category/CategoryBar.tsx @@ -1,20 +1,9 @@ import { useRef } from "react"; - -const categories = [ - "Trending", - "Politics", - "Sports", - "Culture", - "Crypto", - "Climate", - "Economics", - "Mentions", - "Companies", - "Financials", - "Tech & Science", -]; +import { useSelector } from "react-redux"; +import type { RootState } from "../../store/store"; export default function CategoryBar() { + const categories = useSelector((state: RootState) => state.category.categories); const scrollRef = useRef(null); const handleWheel = (e: React.WheelEvent) => { @@ -25,7 +14,7 @@ export default function CategoryBar() { }; return ( -
); -} \ No newline at end of file +} diff --git a/frontend/src/components/Footer/Footer.tsx b/frontend/src/components/Footer/Footer.tsx new file mode 100644 index 0000000..64d51cc --- /dev/null +++ b/frontend/src/components/Footer/Footer.tsx @@ -0,0 +1,41 @@ +import { useSelector } from "react-redux"; +import type { RootState } from "../../store/store"; + +export default function Footer() { + const { sections, copyright, disclaimer } = useSelector( + (state: RootState) => state.footer + ); + + return ( + + ); +} diff --git a/frontend/src/components/Search/SearchBar.tsx b/frontend/src/components/Search/SearchBar.tsx index b7112ef..2ad884a 100644 --- a/frontend/src/components/Search/SearchBar.tsx +++ b/frontend/src/components/Search/SearchBar.tsx @@ -1,17 +1,20 @@ -import { useState } from "react"; +import { useDispatch, useSelector } from "react-redux"; +import type { RootState, AppDispatch } from "../../store/store"; +import { triggerShake, resetShake } from "../../store/searchSlice"; -export default function MaxLogo() { - const [shouldShake, setShouldShake] = useState(false); +export default function SearchBar() { + const dispatch = useDispatch(); + const shouldShake = useSelector((state: RootState) => state.search.shouldShake); const handleFocus = () => { - setShouldShake(true); - setTimeout(() => setShouldShake(false), 500); + dispatch(triggerShake()); + setTimeout(() => dispatch(resetShake()), 500); }; return (
- - - , + + + + + , ) diff --git a/frontend/src/pages/Home.tsx b/frontend/src/pages/Home.tsx index c0cea39..b8c53b2 100644 --- a/frontend/src/pages/Home.tsx +++ b/frontend/src/pages/Home.tsx @@ -1,4 +1,5 @@ import Header from "../components/Header/Header"; +import Footer from "../components/Footer/Footer"; import MarketCard from "../components/MarketCard/MarketCard"; import InfoCard from "../components/InfoCard/InfoCard"; import TopicCard from "../components/TopicCard/TopicCard"; @@ -293,6 +294,7 @@ export default function Home() {
+