From 8329e9e7dfdd232430602d7f6a2b7df0e4acc1bd Mon Sep 17 00:00:00 2001
From: Dev Ojha <dojha@berkeley.edu>
Date: Mon, 3 Oct 2022 21:38:14 +0200
Subject: [PATCH] Cherry-pick code fix

---
 CHANGELOG.md                            |  2 ++
 app/modules.go                          |  5 +++++
 app/modules_test.go                     | 22 ++++++++++++++++++++++
 osmoutils/partialord/partialord.go      |  2 +-
 osmoutils/partialord/partialord_test.go |  2 +-
 5 files changed, 31 insertions(+), 2 deletions(-)
 create mode 100644 app/modules_test.go

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 0760c657a..9621d9550 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -40,6 +40,8 @@ All notable changes to this project will be documented in this file.
 The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
 and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
 
+## v13.0.0
+
 ## v12.0.0
 
 This release includes several cosmwasm-developer and appchain-ecosystem affecting upgrades:
diff --git a/app/modules.go b/app/modules.go
index 3f9fe96c0..b46c5e78f 100644
--- a/app/modules.go
+++ b/app/modules.go
@@ -167,6 +167,11 @@ func orderBeginBlockers(allModuleNames []string) []string {
 // OrderEndBlockers returns EndBlockers (crisis, govtypes, staking) with no relative order.
 func OrderEndBlockers(allModuleNames []string) []string {
 	ord := partialord.NewPartialOrdering(allModuleNames)
+
+	// Staking must be after gov.
+	ord.FirstElements(govtypes.ModuleName)
+	ord.LastElements(stakingtypes.ModuleName)
+
 	// only Osmosis modules with endblock code are: twap, crisis, govtypes, staking
 	// we don't care about the relative ordering between them.
 	return ord.TotalOrdering()
diff --git a/app/modules_test.go b/app/modules_test.go
new file mode 100644
index 000000000..3790e3aae
--- /dev/null
+++ b/app/modules_test.go
@@ -0,0 +1,22 @@
+package app
+
+import (
+	"reflect"
+	"testing"
+
+	"github.com/cosmos/cosmos-sdk/simapp"
+	"github.com/stretchr/testify/require"
+	"github.com/tendermint/tendermint/libs/log"
+	dbm "github.com/tendermint/tm-db"
+)
+
+func TestOrderEndBlockers_Determinism(t *testing.T) {
+	db := dbm.NewMemDB()
+	app := NewOsmosisApp(log.NewNopLogger(), db, nil, true, map[int64]bool{}, DefaultNodeHome, 5, simapp.EmptyAppOptions{}, GetWasmEnabledProposals(), EmptyWasmOpts)
+
+	for i := 0; i < 1000; i++ {
+		a := OrderEndBlockers(app.mm.ModuleNames())
+		b := OrderEndBlockers(app.mm.ModuleNames())
+		require.True(t, reflect.DeepEqual(a, b))
+	}
+}
diff --git a/osmoutils/partialord/partialord.go b/osmoutils/partialord/partialord.go
index 5428e70f5..517d5c383 100644
--- a/osmoutils/partialord/partialord.go
+++ b/osmoutils/partialord/partialord.go
@@ -21,7 +21,7 @@ func NewPartialOrdering(elements []string) PartialOrdering {
 	copy(elementsCopy, elements)
 	sort.Strings(elementsCopy)
 	return PartialOrdering{
-		dag:         dag.NewDAG(elements),
+		dag:         dag.NewDAG(elementsCopy),
 		firstSealed: false,
 		lastSealed:  false,
 	}
diff --git a/osmoutils/partialord/partialord_test.go b/osmoutils/partialord/partialord_test.go
index 4eed2edd0..8ce637f1a 100644
--- a/osmoutils/partialord/partialord_test.go
+++ b/osmoutils/partialord/partialord_test.go
@@ -26,7 +26,7 @@ func TestAPI(t *testing.T) {
 	totalOrd := beginBlockOrd.TotalOrdering()
 	expTotalOrd := []string{
 		"upgrades", "epochs", "capabilities",
-		"bank", "staking", "mint", "ibc", "distribution", "ibctransfers",
+		"bank", "ibc", "mint", "staking", "ibctransfers", "distribution",
 		"auth", "authz", "wasm",
 	}
 	require.Equal(t, expTotalOrd, totalOrd)
-- 
GitLab