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..b51d2bfc55 100644 --- a/x/dex/types/wasm/block_hooks.go +++ b/x/dex/types/wasm/block_hooks.go @@ -53,15 +53,26 @@ 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))