# Order flow
* Order
* Commission
* Wallet
* OME
* Trade
* Cross Order
* Broker
* ExWallet
* Price
* Asset
### Overall View
```mermaid
flowchart TD
Start((Start)) --Order Service--> CreateOrder[Create Order]
CreateOrder --> SendToOME[Send to Internal Match Engine]
SendToOME --OME - Internal Order Book--> MatchOrder[Match Order]
MatchOrder --> Matched{Order Matched?}
Matched --Yes--> CreateTrade
Matched --No - Cross Order Service--> CreateCrossOrder[Create Cross Order]
CreateCrossOrder --Binance/... API--> CreateOrderOnLiquidity[Create Order on Liquidity]
CreateOrderOnLiquidity --Back to cross order service--> OrderDoneOnLiquidity[Order is Completed on Liquidity]
OrderDoneOnLiquidity --Trade Service--> CreateTrade[Create Trade for Matched Orders]
CreateTrade --Wallet Service--> UpdateWallet[Update User Wallet]
UpdateWallet --> End((End))
```
### Create Order [Order Service]
#### Flow Chart
```mermaid
flowchart TD
Start((Start)) --Order Service--> CreateOrder
CreateOrder --Asset Service-->GetMarket
GetMarket --> MarketExists{Market Exists?}
MarketExists --No--> Reject
Reject --> End
MarketExists --Yes - Commission Service--> GetCommission
GetCommission --Wallet Service-->FreezeCredit
FreezeCredit --> EnoughCredit{Enough Credit?}
EnoughCredit --No--> Reject
EnoughCredit --Yes - Database--> SaveOrder
SaveOrder --Kafka --> PublishOrder
PublishOrder --> End((End))
```
#### Sequence Diagram
```mermaid
sequenceDiagram
autonumber
Client ->> Order: createNewOrder
Order ->> Asset: getMarket
Asset -->> Order: Market
alt if market errors
Order -->> Client: fail order
else if buy or sell tolerance not set
Order -->> Client: error
end
Order ->> Commission: getOrderCommission
Commission -->> Order: orderCommission
alt if commission not found
Order -->> Client: fail order
end
Order ->> Wallet: freezeCredit
Wallet -->> Order: freezeStatus
alt if freeze error
Order -->> Client: error
end
Order ->> Database: beginTransaction
Order ->> Database: insertOrder
Order ->> Database: updateOrderId
Order ->> Kafka: publishOrder
Order ->> Database: commit
alt if database failed
Order ->> Database: rollback
Order ->> Wallet: unfreezeCredit
Wallet -->> Order: unfreezeResponse
alt if unfreeze error
Order ->> Order: log and return error
end
Order -->> Client: fail order
else
Order -->> Client: success
end
```
### Match Order [OME Service]
#### Flow Chart
```mermaid
flowchart TD
Start((Start)) --> AddToOB[Add to Internal Order Book]
AddToOB --> ProcessOrder[Try To Match Order]
ProcessOrder --> CanMatch{Can Match?}
CanMatch --Yes - Order Service--> NotifyOrderService[Notify Order Service]
NotifyOrderService --Trade Service--> CreateTrade[Create Trade for Matched Orders]
CreateTrade --> End((End))
CanMatch --No--> Wait[Wait - defined in config]
Wait --> NowMatched{Matched?}
NowMatched --Yes - Trade Service-->CreateTrade
NowMatched --No - Order Service--> ChangeOMEType[Change Order OME Type]
ChangeOMEType --Cross Order Service--> CreateCrossOrder[Create Cross Order]
CreateCrossOrder --> End
```
#### Sequence Diagram
```mermaid
sequenceDiagram
autonumber
Kafka ->> OME: newOrder
OME ->> MatchEngine: processOrder
alt if err
Order ->> Order: log error and exit
end
alt if can match
OME ->> Trade: createTrade
alt if err
OME ->> OME: log
else
OME ->> Kafka: commit
end
else
alt if type == 'stoplimit' and market external liq is on
OME ->> Kafka: createNewCrossOrder and exit
else
OME ->> Kafka: commit
OME ->> OME: insertOrderTimeout
end
end
OME ->> OME: start lock
alt if order timed out
OME ->> MatchEngine: cancelOrder
alt if ok
OME ->> Kafka: newCrossOrder
alt if error
OME ->> OME: log
end
OME ->> Kafka: changeOrderOMEType
alt if error
OME ->> OME: log
end
end
OME ->> OME: delete order from timeout map
end
OME ->> OME: release lock
```
### Create Cross Order [Cross Order Service]
#### Flow Chart
#### Sequence Diagram
```mermaid
sequenceDiagram
autonumber
Kafka -) CrossOrder: newOrder
CrossOrder ->> Database: insert
Database -->> CrossOrder: insertResponse
CrossOrder ->> Asset: getMarket
Note Left Of Database: change to local db
Asset -->> CrossOrder: Market
CrossOrder ->> Broker: createOrder
Broker ->> CrossOrder: Order
CrossOrder ->> Database: update
Database ->> CrossOrder: updateResponse
alt if not ok
CrossOrder ->> Retry[x]: retry
end
alt watch order job
CrossOrder ->> Database: getPendingOrders
Database -->> CrossOrder: []Order
loop orders
CrossOrder ->> Broker: getOrder
alt if order execQty changed
CrossOrder -) Kafka: requestNewFakeOrder
else if order cancelled and execQty not changed
CrossOrder -) Kafka: publishWalletCancel
end
CrossOrder ->> Database: update
end
end
Kafka -) CrossOrder: newFakeOrderCreated
CrossOrder ->> Database: getOrder
CrossOrder -) Kafka: publishTrade
alt if order is cancelled
CrossOrder -) Kafka: publishCancelReply
CrossOrder -) Kafka: publishOrderStatusUpdate
end
```
### order / createFakeOrder
```mermaid
sequenceDiagram
Kafka -) Order: createNewFakeOrder
Order ->> Database: beginTransaction
Order ->> Database: insertOrder
Order ->> Database: updateOrderId
Order -) Kafka: publishOrder
Order ->> Database: commit
alt if database failed
Order ->> Database: rollback
Order ->> Order: log
else
Order ->> Kafka: commit offset
end
```
### trade / newTrade
```mermaid
sequenceDiagram
autonumber
Kafka -) Trade: newTrade
Trade -) Wallet: updateBalance
Trade -) MDP[x]: updateMarketData
Trade -) Order: updateOrderStatus
```
### wallet / updateBalance
```mermaid
sequenceDiagram
autonumber
Kafka -) Wallet: newTrade
Wallet ->> Database: startTransaction
Wallet ->> Wallet: check orderId format correct
alt if not correct
Wallet ->> Database: rollback
Wallet ->> Wallet: log
end
Wallet ->> Wallet: parse userId
alt if cannot parse
Wallet ->> Database: rollback
Wallet ->> Wallet: log
end
Wallet ->> Wallet: parse order type
alt if cannot parse
Wallet ->> Database: rollback
Wallet ->> Wallet: log
end
Wallet ->> Wallet: parse asset
alt if cannot parse
Wallet ->> Database: rollback
Wallet ->> Wallet: log
end
Wallet ->> Database: getUserWallet
Database -->> Wallet: user wallet
alt if error
Wallet ->> Database: rollback
Wallet ->> Wallet: log
end
Wallet ->> Wallet: calc freeze amount
Wallet ->> Database: get wallet for asset
alt if error
Wallet ->> Database: rollback
Wallet ->> Wallet: log
end
alt if more than frozen amount
Wallet ->> Database: rollback
Wallet ->> Wallet: log
end
Wallet ->> Database: unfreeze
alt if error
Wallet ->> Database: rollback
Wallet ->> Wallet: log
end
Wallet ->> Wallet: calc available amount
Wallet ->> Database: get wallet for asset
alt if error
Wallet ->> Database: rollback
Wallet ->> Wallet: log
end
Wallet ->> Database: update available amount (balance)
alt if error
Wallet ->> Database: rollback
Wallet ->> Wallet: log
end
Wallet ->> Database: get user wallet
alt if error
Wallet ->> Database: rollback
Wallet ->> Wallet: log
end
Wallet ->> Wallet: create exchange income record
Wallet ->> Database: get wallet asset
alt if error
Wallet ->> Database: createWalletAsset
alt if error
Wallet ->> Database: rollback
Wallet ->> Wallet: log
end
end
Wallet ->> Database: update opposite wallet asset record
alt if error
Wallet ->> Database: rollback
Wallet ->> Wallet: log
end
Wallet ->> Database: insert income record
alt if error
Wallet ->> Database: rollback
Wallet ->> Wallet: log
else
Wallet ->> Kafka: commit
end
```
### order / cancelOrder
```mermaid
sequenceDiagram
autonumber
Client ->> Order: cancelOrder
alt if order not found
Order ->> Client: fail cancel
else if order done
Order ->> Client: fail cancel
else if order is already cancelled
Order ->> Client: fail cancel
end
Order ->> Database: startTransaction
Order ->> Database: update order stutus to cancel
alt if db error
Order ->> Database: rollback
Order ->> Client: fail cancel
end
alt if order is internal
Order ->> Kafka: publishCancelOrder
alt if error
Order ->> Database: rollback
Order ->> Client: fail cancel
end
alt if order status is processing
Order ->> Kafka: publishWalletCancel
alt if error
Order ->> Database: rollback
Order ->> Client: fail cancel
end
end
else if order is crossOrder
Order ->> Kafka: publishCancelCrossOrder
alt if error
Order ->> Database: rollback
Order ->> Client: fail cancel
end
end
Order ->> Database: commit
Order ->> Client: success
```
<!-- ### OME / cancel
```mermaid
sequenceDiagram
autonumber
``` -->
### crossOrder / cancel
```mermaid
sequenceDiagram
autonumber
CrossOrder ->> Database: getOrder
alt if error
CrossOrder ->> CrossOrder: log and exit
end
alt if order status == not executed
CrossOrder ->> Database: update status
alt if error
CrossOrder ->> CrossOrder: log and exit
end
CrossOrder ->> Kafka: publishWalletCancel
CrossOrder ->> Kafka: publishOrderStatus
alt if error
CrossOrder ->> CrossOrder: log and exit
end
else
CrossOrder ->> Broker: getOrder
alt if error
CrossOrder ->> CrossOrder: log and exit
end
CrossOrder ->> Database: update order status to pending cancel
alt if error
CrossOrder ->> CrossOrder: log and exit
end
end
CrossOrder ->> Kafka: commit
```
### order / createOrder (revised)
```mermaid
sequenceDiagram
autonumber
Client ->> Order: createNewOrder
Order ->> Database: getMarket
Database -->> Order: market
alt if error
Order -->> Client: fail order
end
Order ->> Database: getOrderCommission
Database -->> Order: commission
alt if error
Order -->> Client: fail order
end
Order ->> Database: getBalance
Database -->> Order: balance
alt not enough balance
Order ->> Client: fail order
end
Order ->> Database: createNewTransaction
Order ->> Database: insertPendingOrder
Order ->> Database: insertFreezeCreditEvent
Order ->> Database: commitTransaction
alt if commit failed
Order ->> Client: fail order
else
Order ->> Client: success order
end
```
### order / after freeze credit (revised)
```mermaid
sequenceDiagram
Wallet -) Order: asset freeze
Order ->> Database: createNewTransaction
Order ->> Database: updateOrderStatus
Order ->> Database: insertNewOrderEvent
Order ->> Database: commitTransaction
loop if commit failed
Order ->> Retry: retry
end
```
### things we need to do
- distributed transaction -> orchestration saga + outbox
- better logging and logging format
- add message id to kafka
- add request id to api gateway (idempotency)
- retry strategy (retry, fail)
- maintenance mode
- distributed tracing
### Tasks
- Wrapping Kafka package for additional features
- Developing outbox package
- Developing CDC package for outbox
- Developing Retry package
- Developing distributed tracing package (Configs: request id, trace id, ...) (open tracing protocole)
- Adding new packages to all micro services + test
- Developing health check for some of micro services
- Error tracking(sentry), Error logs(Greylog), Monitoring(promoteus)
- securing transactions with sign check(rsa 128 bit)
- Securing Balance model by reflecting coresponding transactions in wallet db (P n L data)
-
-