diff --git a/types/coin.go b/types/coin.go index c624f4b2bd..387d730892 100644 --- a/types/coin.go +++ b/types/coin.go @@ -328,25 +328,25 @@ func (coins Coins) safeAdd(coinsB Coins) (coalesced Coins) { panic("Wrong argument: coins must be sorted") } - uniqCoins := make(map[string]Coins, len(coins)+len(coinsB)) + uniqCoins := make(map[string]Coin, len(coins)+len(coinsB)) // Traverse all the coins for each of the coins and coinsB. for _, cL := range []Coins{coins, coinsB} { for _, c := range cL { - uniqCoins[c.Denom] = append(uniqCoins[c.Denom], c) + if uc, ok := uniqCoins[c.Denom]; ok { + uniqCoins[c.Denom] = uc.Add(c) + } else { + uniqCoins[c.Denom] = c + } } } - for denom, cL := range uniqCoins { //#nosec - comboCoin := Coin{Denom: denom, Amount: NewInt(0)} - for _, c := range cL { - comboCoin = comboCoin.Add(c) + coalesced = make(Coins, 0, len(uniqCoins)) + for denom, c := range uniqCoins { //#nosec + if c.IsZero() { + continue } - if !comboCoin.IsZero() { - coalesced = append(coalesced, comboCoin) - } - } - if coalesced == nil { - return Coins{} + c.Denom = denom + coalesced = append(coalesced, c) } return coalesced.Sort() } diff --git a/types/dec_coin.go b/types/dec_coin.go index 2e56d5f5fb..2a3e930f62 100644 --- a/types/dec_coin.go +++ b/types/dec_coin.go @@ -242,7 +242,7 @@ func (coins DecCoins) Add(coinsB ...DecCoin) DecCoins { // denomination and addition only occurs when the denominations match, otherwise // the coin is simply added to the sum assuming it's not zero. func (coins DecCoins) safeAdd(coinsB DecCoins) DecCoins { - sum := ([]DecCoin)(nil) + sum := make(DecCoins, 0, len(coins)+len(coinsB)) indexA, indexB := 0, 0 lenA, lenB := len(coins), len(coinsB) diff --git a/types/dec_coin_test.go b/types/dec_coin_test.go index ddd78ed61c..c07341d72c 100644 --- a/types/dec_coin_test.go +++ b/types/dec_coin_test.go @@ -98,7 +98,7 @@ func (s *decCoinTestSuite) TestAddDecCoins() { }{ {sdk.DecCoins{{testDenom1, one}, {testDenom2, one}}, sdk.DecCoins{{testDenom1, one}, {testDenom2, one}}, sdk.DecCoins{{testDenom1, two}, {testDenom2, two}}}, {sdk.DecCoins{{testDenom1, zero}, {testDenom2, one}}, sdk.DecCoins{{testDenom1, zero}, {testDenom2, zero}}, sdk.DecCoins{{testDenom2, one}}}, - {sdk.DecCoins{{testDenom1, zero}, {testDenom2, zero}}, sdk.DecCoins{{testDenom1, zero}, {testDenom2, zero}}, sdk.DecCoins(nil)}, + {sdk.DecCoins{{testDenom1, zero}, {testDenom2, zero}}, sdk.DecCoins{{testDenom1, zero}, {testDenom2, zero}}, sdk.DecCoins{}}, } for tcIndex, tc := range cases {