diff --git a/types/coin_test.go b/types/coin_test.go index 36cc32c8cf..734af669e1 100644 --- a/types/coin_test.go +++ b/types/coin_test.go @@ -2,6 +2,7 @@ package types_test import ( "fmt" + "math/big" "strings" "testing" @@ -156,6 +157,9 @@ func (s *coinTestSuite) TestCoinsDenoms() { } func (s *coinTestSuite) TestAddCoin() { + // 2**256 - 1 value to check for overflows + maxUint256 := math.NewIntFromBigInt(new(big.Int).Sub(new(big.Int).Lsh(big.NewInt(1), 256), big.NewInt(1))) + cases := []struct { inputOne sdk.Coin inputTwo sdk.Coin @@ -165,6 +169,10 @@ func (s *coinTestSuite) TestAddCoin() { {sdk.NewInt64Coin(testDenom1, 1), sdk.NewInt64Coin(testDenom1, 1), sdk.NewInt64Coin(testDenom1, 2), false}, {sdk.NewInt64Coin(testDenom1, 1), sdk.NewInt64Coin(testDenom1, 0), sdk.NewInt64Coin(testDenom1, 1), false}, {sdk.NewInt64Coin(testDenom1, 1), sdk.NewInt64Coin(testDenom2, 1), sdk.NewInt64Coin(testDenom1, 1), true}, + + // addition cannot lead to a number with more than 256 bits + {sdk.NewCoin(testDenom1, maxUint256), sdk.NewCoin(testDenom1, math.NewInt(0)), sdk.NewCoin(testDenom1, maxUint256), false}, + {sdk.NewCoin(testDenom1, maxUint256), sdk.NewCoin(testDenom1, math.NewInt(1)), sdk.NewInt64Coin(testDenom1, 1), true}, } for tcIndex, tc := range cases {