diff --git a/CHANGELOG.md b/CHANGELOG.md index 27a12dfd9a..54a6b6c18a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -189,6 +189,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ * [\#10593](https://github.com/cosmos/cosmos-sdk/pull/10593) Update swagger-ui to v4.1.0 to fix xss vulnerability. * [\#10674](https://github.com/cosmos/cosmos-sdk/pull/10674) Fix issue with `Error.Wrap` and `Error.Wrapf` usage with `errors.Is`. * [\#10897](https://github.com/cosmos/cosmos-sdk/pull/10897) Fix: set a non-zero value on gas overflow. +* [#9790](https://github.com/cosmos/cosmos-sdk/pull/10687) Fix behavior of `DecCoins.MulDecTruncate`. ### State Machine Breaking diff --git a/types/dec_coin.go b/types/dec_coin.go index 74a5a1ae44..bb32ef653a 100644 --- a/types/dec_coin.go +++ b/types/dec_coin.go @@ -373,12 +373,15 @@ func (coins DecCoins) MulDec(d Dec) DecCoins { } // MulDecTruncate multiplies all the decimal coins by a decimal, truncating. It -// panics if d is zero. +// returns nil DecCoins if d is zero. // // CONTRACT: No zero coins will be returned. func (coins DecCoins) MulDecTruncate(d Dec) DecCoins { - var res DecCoins + if d.IsZero() { + return DecCoins{} + } + var res DecCoins for _, coin := range coins { product := DecCoin{ Denom: coin.Denom, diff --git a/types/dec_coin_test.go b/types/dec_coin_test.go index 2f35075d3c..52f50d24fc 100644 --- a/types/dec_coin_test.go +++ b/types/dec_coin_test.go @@ -880,12 +880,10 @@ func (s *decCoinTestSuite) TestDecCoins_MulDecTruncate() { }{ {"No Coins", sdk.DecCoins{}, sdk.NewDec(1), sdk.DecCoins(nil), false}, - // TODO - Fix test - Function comment documentation for MulDecTruncate says if multiplier d is zero, it should panic. - // However, that is not the observed behaviour. Currently nil is returned. {"Multiple coins - zero multiplier", sdk.DecCoins{ sdk.DecCoin{testDenom1, sdk.NewDecWithPrec(10, 3)}, sdk.DecCoin{testDenom1, sdk.NewDecWithPrec(30, 2)}, - }, sdk.NewDec(0), sdk.DecCoins(nil), false}, + }, sdk.NewDec(0), sdk.DecCoins{}, false}, {"Multiple coins - positive multiplier", sdk.DecCoins{ sdk.DecCoin{testDenom1, sdk.NewDecWithPrec(15, 1)},