fix: adding checks to ensure coin denoms are sorted in `Balance` during `Validate` (backport #9829) (#10849)
* adding checks to ensure denoms are sorted (cherry picked from commitce1e65083e
) * updating changelog (cherry picked from commit2cea5e5750
) # Conflicts: # CHANGELOG.md * refactoring balance.coin validation (cherry picked from commit40d22c7ab3
) * adding 0 value coin test case (cherry picked from commit2468b64cff
) * added valid sorted coin testcase (cherry picked from commit66b91ee7c7
) * updating changelog (cherry picked from commit59b788a3bb
) # Conflicts: # CHANGELOG.md * conflicts Co-authored-by: Spoorthi <9302666+spoo-bar@users.noreply.github.com> Co-authored-by: Federico Kunze Küllmer <federico.kunze94@gmail.com>
This commit is contained in:
parent
14cd943a2e
commit
19e924d288
|
@ -37,8 +37,6 @@ Ref: https://keepachangelog.com/en/1.0.0/
|
|||
|
||||
## [Unreleased]
|
||||
|
||||
## [v0.45.0](https://github.com/cosmos/cosmos-sdk/releases/tag/v0.45.0) - 2021-12-07
|
||||
|
||||
### State Machine Breaking
|
||||
|
||||
* (auth) [\#10536](https://github.com/cosmos/cosmos-sdk/pull/10536]) Enable `SetSequence` for `ModuleAccount`.
|
||||
|
@ -62,6 +60,7 @@ Ref: https://keepachangelog.com/en/1.0.0/
|
|||
|
||||
* (types) [\#9627](https://github.com/cosmos/cosmos-sdk/pull/9627) Fix nil pointer panic on `NewBigIntFromInt`.
|
||||
* [#10725](https://github.com/cosmos/cosmos-sdk/pull/10725) populate `ctx.ConsensusParams` for begin/end blockers.
|
||||
* [\#9829](https://github.com/cosmos/cosmos-sdk/pull/9829) Fixed Coin denom sorting not being checked during `Balance.Validate` check. Refactored the Validation logic to use `Coins.Validate` for `Balance.Coins`
|
||||
|
||||
## [v0.44.5](https://github.com/cosmos/cosmos-sdk/releases/tag/v0.44.5) - 2021-12-02
|
||||
|
||||
|
|
|
@ -30,33 +30,14 @@ func (b Balance) GetCoins() sdk.Coins {
|
|||
|
||||
// Validate checks for address and coins correctness.
|
||||
func (b Balance) Validate() error {
|
||||
_, err := sdk.AccAddressFromBech32(b.Address)
|
||||
if err != nil {
|
||||
if _, err := sdk.AccAddressFromBech32(b.Address); err != nil {
|
||||
return err
|
||||
}
|
||||
seenDenoms := make(map[string]bool)
|
||||
|
||||
// NOTE: we perform a custom validation since the coins.Validate function
|
||||
// errors on zero balance coins
|
||||
for _, coin := range b.Coins {
|
||||
if seenDenoms[coin.Denom] {
|
||||
return fmt.Errorf("duplicate denomination %s", coin.Denom)
|
||||
}
|
||||
|
||||
if err := sdk.ValidateDenom(coin.Denom); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if coin.IsNegative() {
|
||||
return fmt.Errorf("coin %s amount is cannot be negative", coin.Denom)
|
||||
}
|
||||
|
||||
seenDenoms[coin.Denom] = true
|
||||
if err := b.Coins.Validate(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// sort the coins post validation
|
||||
b.Coins = b.Coins.Sort()
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
|
|
|
@ -64,6 +64,41 @@ func TestBalanceValidate(t *testing.T) {
|
|||
},
|
||||
true,
|
||||
},
|
||||
{
|
||||
"0 value coin",
|
||||
bank.Balance{
|
||||
Address: "cosmos1yq8lgssgxlx9smjhes6ryjasmqmd3ts2559g0t",
|
||||
Coins: sdk.Coins{
|
||||
sdk.NewInt64Coin("atom", 0),
|
||||
sdk.NewInt64Coin("zatom", 2),
|
||||
},
|
||||
},
|
||||
true,
|
||||
},
|
||||
{
|
||||
"unsorted coins",
|
||||
bank.Balance{
|
||||
Address: "cosmos1yq8lgssgxlx9smjhes6ryjasmqmd3ts2559g0t",
|
||||
Coins: sdk.Coins{
|
||||
sdk.NewInt64Coin("atom", 2),
|
||||
sdk.NewInt64Coin("zatom", 2),
|
||||
sdk.NewInt64Coin("batom", 12),
|
||||
},
|
||||
},
|
||||
true,
|
||||
},
|
||||
{
|
||||
"valid sorted coins",
|
||||
bank.Balance{
|
||||
Address: "cosmos1yq8lgssgxlx9smjhes6ryjasmqmd3ts2559g0t",
|
||||
Coins: sdk.Coins{
|
||||
sdk.NewInt64Coin("atom", 2),
|
||||
sdk.NewInt64Coin("batom", 12),
|
||||
sdk.NewInt64Coin("zatom", 2),
|
||||
},
|
||||
},
|
||||
false,
|
||||
},
|
||||
}
|
||||
|
||||
for _, tc := range testCases {
|
||||
|
|
Loading…
Reference in New Issue