From 7d6d4acaea23d69215ed4f8365fe468b69513045 Mon Sep 17 00:00:00 2001 From: Cyson Date: Tue, 4 Oct 2022 14:02:10 -0700 Subject: [PATCH 1/2] Update market order status at the end of block execution --- x/dex/contract/execution.go | 9 +++++---- x/dex/types/wasm/block_hooks.go | 16 ++++++++++++++-- x/dex/types/wasm/block_hooks_test.go | 2 +- 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/x/dex/contract/execution.go b/x/dex/contract/execution.go index bbbebcab02..3efe119c8d 100644 --- a/x/dex/contract/execution.go +++ b/x/dex/contract/execution.go @@ -152,7 +152,7 @@ func GetOrderIDToSettledQuantities(settlements []*types.SettlementEntry) map[uin return res } -func ExecutePairsInParallel(ctx sdk.Context, contractAddr string, dexkeeper *keeper.Keeper, registeredPairs []types.Pair, orderBooks *datastructures.TypedSyncMap[dextypesutils.PairString, *types.OrderBook]) []*types.SettlementEntry { +func ExecutePairsInParallel(ctx sdk.Context, contractAddr string, dexkeeper *keeper.Keeper, registeredPairs []types.Pair, orderBooks *datastructures.TypedSyncMap[dextypesutils.PairString, *types.OrderBook]) ([]*types.SettlementEntry, []*types.Cancellation) { typedContractAddr := dextypesutils.ContractAddress(contractAddr) orderResults := []*types.Order{} cancelResults := []*types.Cancellation{} @@ -203,7 +203,7 @@ func ExecutePairsInParallel(ctx sdk.Context, contractAddr string, dexkeeper *kee } dexkeeper.SetMatchResult(ctx, contractAddr, types.NewMatchResult(orderResults, cancelResults, settlements)) - return settlements + return settlements, cancelResults } func HandleExecutionForContract( @@ -226,14 +226,15 @@ func HandleExecutionForContract( return orderResults, []*types.SettlementEntry{}, err } - settlements := ExecutePairsInParallel(sdkCtx, contractAddr, dexkeeper, registeredPairs, orderBooks) + settlements, cancellations := ExecutePairsInParallel(sdkCtx, contractAddr, dexkeeper, registeredPairs, orderBooks) defer EmitSettlementMetrics(settlements) // populate order placement results for FinalizeBlock hook dexkeeper.MemState.GetAllBlockOrders(sdkCtx, typedContractAddr).DeepApply(func(orders *dexcache.BlockOrders) { - dextypeswasm.PopulateOrderPlacementResults(contractAddr, orders.Get(), orderResults) + dextypeswasm.PopulateOrderPlacementResults(contractAddr, orders.Get(), cancellations, orderResults) }) dextypeswasm.PopulateOrderExecutionResults(contractAddr, settlements, orderResults) + return orderResults, settlements, nil } diff --git a/x/dex/types/wasm/block_hooks.go b/x/dex/types/wasm/block_hooks.go index 3e1f6558e4..7ba964fd84 100644 --- a/x/dex/types/wasm/block_hooks.go +++ b/x/dex/types/wasm/block_hooks.go @@ -53,15 +53,27 @@ func NewContractOrderResult(contractAddr string) ContractOrderResult { } } -func PopulateOrderPlacementResults(contractAddr string, orders []*types.Order, resultMap map[string]ContractOrderResult) { +func PopulateOrderPlacementResults(contractAddr string, orders []*types.Order, cancellations []*types.Cancellation, resultMap map[string]ContractOrderResult) { + // get cancelled order ids + cancels := make(map[uint64]bool) + for _, cancel := range cancellations { + cancels[cancel.Id] = true + } + + for _, order := range orders { + orderStatus := order.Status + if _, ok := cancels[order.Id]; ok { + orderStatus = types.OrderStatus_CANCELLED + } + if _, ok := resultMap[order.Account]; !ok { resultMap[order.Account] = NewContractOrderResult(contractAddr) } resultsForAccount := resultMap[order.Account] resultsForAccount.OrderPlacementResults = append(resultsForAccount.OrderPlacementResults, OrderPlacementResult{ OrderID: order.Id, - Status: order.Status, + Status: orderStatus, }, ) resultMap[order.Account] = resultsForAccount diff --git a/x/dex/types/wasm/block_hooks_test.go b/x/dex/types/wasm/block_hooks_test.go index 015789cee9..6a1105f8f6 100644 --- a/x/dex/types/wasm/block_hooks_test.go +++ b/x/dex/types/wasm/block_hooks_test.go @@ -25,7 +25,7 @@ func TestPopulateOrderPlacementResults(t *testing.T) { Data: "{\"position_effect\":\"Open\",\"leverage\":\"1\"}", } resultsMap := map[string]wasm.ContractOrderResult{} - wasm.PopulateOrderPlacementResults(contract, []*types.Order{&orderToPopulate}, resultsMap) + wasm.PopulateOrderPlacementResults(contract, []*types.Order{&orderToPopulate}, []*types.Cancellation{}, resultsMap) require.Equal(t, 1, len(resultsMap)) require.Equal(t, contract, resultsMap[account].ContractAddr) require.Equal(t, 1, len(resultsMap[account].OrderPlacementResults)) From 67735d34f1909201b46d4492358c747f0ab346de Mon Sep 17 00:00:00 2001 From: Cyson Date: Tue, 4 Oct 2022 14:06:20 -0700 Subject: [PATCH 2/2] Fix golint --- x/dex/types/wasm/block_hooks.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/x/dex/types/wasm/block_hooks.go b/x/dex/types/wasm/block_hooks.go index 7ba964fd84..b51d2bfc55 100644 --- a/x/dex/types/wasm/block_hooks.go +++ b/x/dex/types/wasm/block_hooks.go @@ -54,13 +54,12 @@ func NewContractOrderResult(contractAddr string) ContractOrderResult { } func PopulateOrderPlacementResults(contractAddr string, orders []*types.Order, cancellations []*types.Cancellation, resultMap map[string]ContractOrderResult) { - // get cancelled order ids + // get cancelled order ids cancels := make(map[uint64]bool) for _, cancel := range cancellations { cancels[cancel.Id] = true } - for _, order := range orders { orderStatus := order.Status if _, ok := cancels[order.Id]; ok {