diff --git a/x/oracle/types/ballot.go b/x/oracle/types/ballot.go index e0f84abc7c..0dad2cf076 100644 --- a/x/oracle/types/ballot.go +++ b/x/oracle/types/ballot.go @@ -114,7 +114,13 @@ func (pb ExchangeRateBallot) Len() int { // Less reports whether the element with // index i should sort before the element with index j. func (pb ExchangeRateBallot) Less(i, j int) bool { - return pb[i].ExchangeRate.LT(pb[j].ExchangeRate) + if pb[i].ExchangeRate.LT(pb[j].ExchangeRate) { + return true + } + if pb[i].ExchangeRate.Equal(pb[j].ExchangeRate) { + return bytes.Compare(pb[i].Voter, pb[j].Voter) < 0 + } + return false } // Swap implements sort.Interface. diff --git a/x/oracle/types/ballot_test.go b/x/oracle/types/ballot_test.go index 87b0eb8255..ecec7a10eb 100644 --- a/x/oracle/types/ballot_test.go +++ b/x/oracle/types/ballot_test.go @@ -3,6 +3,7 @@ package types import ( "fmt" "math" + "sort" "strconv" "testing" @@ -10,6 +11,7 @@ import ( "github.com/stretchr/testify/require" "github.com/tendermint/tendermint/crypto/secp256k1" tmproto "github.com/tendermint/tendermint/proto/tendermint/types" + "gotest.tools/v3/assert" ) func TestToMap(t *testing.T) { @@ -376,3 +378,29 @@ func TestClaimMapToSlice(t *testing.T) { }) require.Equal(t, []Claim{claim, claim}, claimSlice) } + +func TestExchangeRateBallotSort(t *testing.T) { + v1 := VoteForTally{ExchangeRate: sdk.MustNewDecFromStr("0.2"), Voter: sdk.ValAddress{0, 1}} + v1Cpy := VoteForTally{ExchangeRate: sdk.MustNewDecFromStr("0.2"), Voter: sdk.ValAddress{0, 1}} + v2 := VoteForTally{ExchangeRate: sdk.MustNewDecFromStr("0.1"), Voter: sdk.ValAddress{0, 1, 1}} + v3 := VoteForTally{ExchangeRate: sdk.MustNewDecFromStr("0.1"), Voter: sdk.ValAddress{0, 1}} + v4 := VoteForTally{ExchangeRate: sdk.MustNewDecFromStr("0.5"), Voter: sdk.ValAddress{1}} + + tcs := []struct { + got ExchangeRateBallot + expected ExchangeRateBallot + }{ + {got: ExchangeRateBallot{v1, v2, v3, v4}, + expected: ExchangeRateBallot{v3, v2, v1, v4}}, + {got: ExchangeRateBallot{v1}, + expected: ExchangeRateBallot{v1}}, + {got: ExchangeRateBallot{v1, v1Cpy}, + expected: ExchangeRateBallot{v1, v1Cpy}}, + } + for i, tc := range tcs { + t.Run(fmt.Sprint(i), func(t *testing.T) { + sort.Sort(tc.got) + assert.DeepEqual(t, tc.expected, tc.got) + }) + } +}