package Ġco . nil in . op ex . account ant . core . service Ċ Ċ import Ġco . nil in . op ex . account ant . core . api . Order Manager Ċ import Ġco . nil in . op ex . account ant . core . inout . Order Status Ċ import Ġco . nil in . op ex . account ant . core . inout . Rich Order Ċ import Ġco . nil in . op ex . account ant . core . model . Financial Action Ċ import Ġco . nil in . op ex . account ant . core . model . Order Ċ import Ġco . nil in . op ex . account ant . core . spi .* Ċ import Ġco . nil in . op ex . matching . engine . core . event h . events .* Ċ import Ġco . nil in . op ex . matching . engine . core . model . Order Direction Ċ import Ġorg . springframework . transaction . annotation . Transactional Ċ import Ġjava . math . BigDecimal Ċ import Ġjava . time . LocalDateTime Ċ Ċ open Ġclass ĠOrder ManagerImpl ( ĊĠĠĠ Ġval Ġpair Config Loader : ĠPair Config Loader , ĊĠĠĠ Ġval Ġfinancial Action Pers ister : ĠFin ancial Action Pers ister , ĊĠĠĠ Ġval Ġfin ance Action Loader : ĠFin ancial Action Loader , ĊĠĠĠ Ġval Ġorder Pers ister : ĠOrder Pers ister , ĊĠĠĠ Ġval Ġtemp Event Pers ister : ĠTemp Event Pers ister , ĊĠĠĠ Ġval Ġtemp Event Re publisher : ĠTemp Event Re publisher , ĊĠĠĠ Ġval Ġrich Order Publisher : ĠRich Order Publisher Ċ ) Ġ: ĠOrder Manager Ġ{ ĊĊĠĠĠ Ġ@ Transactional ĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġhandle Request Order ( submit Order Event : ĠSubmit Order Event ): ĠList < Financial Action > Ġ{ ĊĠĠĠĠĠĠĠ Ġ// pair Ġ+ Ġdir Ġ-> Ġsymbol ĊĠĠĠĠĠĠĠ Ġ// user Ġlevel ? ĊĠĠĠĠĠĠĠ Ġ// pair Ġconfig . maker Fee Ġand Ġt aker Fee ĊĠĠĠĠĠĠĠ Ġval Ġsymbol Ġ= Ġif Ġ( submit Order Event . direction Ġ== ĠOrder Direction . ASK ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsubmit Order Event . pair . left Side Name ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsubmit Order Event . pair . right Side Name ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġpair Fee Config Ġ= Ġpair Config Loader . load ( submit Order Event . pair . toString (), Ġsubmit Order Event . direction , Ġ"") ĊĠĠĠĠĠĠĠ Ġval Ġm aker Fee Ġ= Ġpair Fee Config . maker Fee Ġ* Ġ 1 Ġ// user Ġlevel Ġformula ĊĠĠĠĠĠĠĠ Ġval Ġt aker Fee Ġ= Ġpair Fee Config . t aker Fee Ġ* Ġ 1 Ġ// user Ġlevel Ġformula ĊĊĠĠĠĠĠĠĠ Ġ// create Ġfa Ġfor Ġtransfer Ġuuid Ġsymbol Ġmain Ġwallet Ġto Ġuuid Ġsymbol Ġexchange Ġwallet ĊĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠ Ġamount Ġfor Ġsell Ġ( ask ): Ġquantity ĊĠĠĠĠĠĠĠ Ġamount Ġfor Ġbuy Ġ( bid ): Ġquantity Ġ* Ġprice ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġfinancial Action Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFin ancial Action ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSubmit Order Event :: class . simple Name !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubmit Order Event . ou id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsymbol , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( submit Order Event . direction Ġ== ĠOrder Direction . ASK ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBigDecimal ( submit Order Event . quantity ). multiply ( pair Fee Config . pair Config . left Side Fraction . to BigDecimal ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBigDecimal ( submit Order Event . quantity ). multiply ( pair Fee Config . pair Config . left Side Fraction . to BigDecimal ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. multiply ( submit Order Event . price . to BigDecimal ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. multiply ( pair Fee Config . pair Config . right Side Fraction . to BigDecimal ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubmit Order Event . uuid , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" main ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubmit Order Event . uuid , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" exchange ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLocalDateTime . now () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ// store Ġorder Ġ( ou id , Ġuuid , Ġfees , Ġuser level , Ġpair , Ġdirection , Ġprice , Ġquantity , Ġfilled Q , Ġstatus , Ġtransfer ed ) ĊĠĠĠĠĠĠĠ Ġorder Pers ister . save ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOrder ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubmit Order Event . pair . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubmit Order Event . ou id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm aker Fee , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt aker Fee , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpair Fee Config . pair Config . left Side Fraction , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpair Fee Config . pair Config . right Side Fraction , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubmit Order Event . uuid , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubmit Order Event . direction , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubmit Order Event . match Constraint , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubmit Order Event . order Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubmit Order Event . price , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubmit Order Event . quantity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubmit Order Event . quantity Ġ- Ġsubmit Order Event . remain ed Quantity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubmit Order Event . price . to BigDecimal () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. multiply ( pair Fee Config . pair Config . right Side Fraction . to BigDecimal ()), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubmit Order Event . quantity . to BigDecimal () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. multiply ( pair Fee Config . pair Config . left Side Fraction . to BigDecimal ()), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBigDecimal ( submit Order Event . quantity Ġ- Ġsubmit Order Event . remain ed Quantity ). multiply ( pair Fee Config . pair Config . left Side Fraction . to BigDecimal ()), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinancial Action . amount , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinancial Action . amount , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOrder Status . REQUEST ED . code ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġreturn Ġfinancial Action Pers ister . persist ( listOf ( financial Action )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Transactional ĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġhandle New Order ( create Order Event : ĠCreate Order Event ): ĠList < Financial Action > Ġ{ ĊĠĠĠĠĠĠĠ Ġ// update Ġorder Ġadd Ġid Ġto Ġother Ġfields ĊĠĠĠĠĠĠĠ Ġval Ġorder Ġ= Ġorder Pers ister . load ( create Order Event . ou id ) ĊĠĠĠĠĠĠĠ Ġif Ġ( order Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġorder . matching Engine Id Ġ= Ġcreate Order Event . orderId ĊĠĠĠĠĠĠĠĠĠĠĠ Ġorder Pers ister . save ( order ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// new Ġorder Ġaccepted Ġby Ġengine ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpublish Rich Order ( order , Ġcreate Order Event . remain ed Quantity . to BigDecimal ()) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtemp Event Pers ister . save Temp Event ( create Order Event . ou id , Ġcreate Order Event ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġempty List () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġpublish Rich Order ( ĊĠĠĠĠĠĠĠ Ġorder : ĠOrder , Ġremain ed Quantity : ĠBigDecimal , Ġstatus : ĠOrder Status ? Ġ= Ġnull ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrich Order Publisher . publish ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRich Order ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorder . id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorder . pair , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorder . ou id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorder . uuid , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorder . user Level , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorder . maker Fee . to BigDecimal (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorder . t aker Fee . to BigDecimal (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorder . left Side Fraction . to BigDecimal (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorder . right Side Fraction . to BigDecimal (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorder . direction , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorder . match Constraint , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorder . order Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorder . orig Price , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorder . orig Quantity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorder . orig Price . multiply ( order . orig Quantity ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorder . quantity . to BigDecimal (). subtract ( remain ed Quantity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. multiply ( order . left Side Fraction . to BigDecimal ()), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorder . orig Price . multiply ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorder . quantity . to BigDecimal (). subtract ( remain ed Quantity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatus ?. code Ġ?: Ġif Ġ( remain ed Quantity . compareTo ( BigDecimal . ZERO ) Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOrder Status . FIL LED . code ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( remain ed Quantity . compareTo ( order . quantity . to BigDecimal ()) Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOrder Status . NEW . code ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOrder Status . PAR TI ALLY _ FIL LED . code ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġhandle Update Order ( updated Order Event : ĠUpdated Order Event ): ĠList < Financial Action > Ġ{ ĊĠĠĠĠĠĠĠ ĠTODO (" Not Ġyet Ġimplemented ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Transactional ĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġhandle Reject Order ( reject Order Event : ĠReject Order Event ): ĠList < Financial Action > Ġ{ ĊĠĠĠĠĠĠĠ Ġ// order Ġby Ġo uid ĊĠĠĠĠĠĠĠ Ġval Ġorder Ġ= Ġorder Pers ister . load ( reject Order Event . ou id ) ĊĠĠĠĠĠĠĠ Ġif Ġ( order Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtemp Event Pers ister . save Temp Event ( reject Order Event . ou id , Ġreject Order Event ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġempty List () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġsymbol Ġ= Ġif Ġ( reject Order Event . direction Ġ== ĠOrder Direction . ASK ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreject Order Event . pair . left Side Name ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreject Order Event . pair . right Side Name ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// check Ġuuid ĊĠĠĠĠĠĠĠ Ġ// lookup Ġfor Ġparent Ġfa ĊĠĠĠĠĠĠĠ Ġval Ġparent Financial Action Ġ= Ġfin ance Action Loader . find Last ( reject Order Event . uuid , Ġreject Order Event . ou id ) ĊĠĠĠĠĠĠĠ Ġ// create Ġfa Ġfor Ġtransfer Ġremaining Ġtransfer ed Ġuuid Ġsymbol Ġexchange Ġwallet Ġto Ġuuid Ġmain Ġexchange Ġwallet ĊĠĠĠĠĠĠĠ Ġval Ġfinancial Action Ġ= ĠFin ancial Action ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparent Financial Action , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠReject Order Event :: class . simple Name !! , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreject Order Event . ou id , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsymbol , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġorder . remain ed Transfer Amount , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreject Order Event . uuid , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" exchange ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreject Order Event . uuid , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" main ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLocalDateTime . now () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ// update Ġorder Ġstatus ĊĠĠĠĠĠĠĠ Ġorder . status Ġ= ĠOrder Status . RE JECT ED . code ĊĠĠĠĠĠĠĠ Ġorder Pers ister . save ( order ) ĊĠĠĠĠĠĠĠ Ġpublish Rich Order ( order , Ġorder . quantity . to BigDecimal (), ĠOrder Status . RE JECT ED ) ĊĠĠĠĠĠĠĠ Ġreturn Ġfinancial Action Pers ister . persist ( listOf ( financial Action )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Transactional ĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġhandle Cancel Order ( cancel Order Event : ĠCancel Order Event ): ĠList < Financial Action > Ġ{ ĊĠĠĠĠĠĠĠ Ġ// order Ġby Ġo uid ĊĠĠĠĠĠĠĠ Ġval Ġorder Ġ= Ġorder Pers ister . load ( cancel Order Event . ou id ) ĊĠĠĠĠĠĠĠ Ġif Ġ( order Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtemp Event Pers ister . save Temp Event ( cancel Order Event . ou id , Ġcancel Order Event ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġempty List () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġsymbol Ġ= Ġif Ġ( cancel Order Event . direction Ġ== ĠOrder Direction . ASK ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcancel Order Event . pair . left Side Name ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcancel Order Event . pair . right Side Name ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// check Ġuuid ĊĠĠĠĠĠĠĠ Ġ// lookup Ġfor Ġparent Ġfa ĊĠĠĠĠĠĠĠ Ġval Ġparent Financial Action Ġ= Ġfin ance Action Loader . find Last ( cancel Order Event . uuid , Ġcancel Order Event . ou id ) ĊĠĠĠĠĠĠĠ Ġ// create Ġfa Ġfor Ġtransfer Ġremaining Ġtransfer ed Ġuuid Ġsymbol Ġexchange Ġwallet Ġto Ġuuid Ġmain Ġexchange Ġwallet ĊĠĠĠĠĠĠĠ Ġval Ġfinancial Action Ġ= ĠFin ancial Action ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparent Financial Action , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠReject Order Event :: class . simple Name !! , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcancel Order Event . ou id , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsymbol , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġorder . remain ed Transfer Amount , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcancel Order Event . uuid , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" exchange ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcancel Order Event . uuid , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" main ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLocalDateTime . now () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ// update Ġorder Ġstatus ĊĠĠĠĠĠĠĠ Ġorder . status Ġ= ĠOrder Status . C ANCE LED . code ĊĠĠĠĠĠĠĠ Ġorder Pers ister . save ( order ) ĊĠĠĠĠĠĠĠ Ġpublish Rich Order ( order , Ġcancel Order Event . quantity . to BigDecimal (), ĠOrder Status . C ANCE LED ) ĊĠĠĠĠĠĠĠ Ġreturn Ġfinancial Action Pers ister . persist ( listOf ( financial Action )) ĊĠĠĠ Ġ} Ċ }