github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/x/staking/types/commission_test.go (about) 1 package types 2 3 import ( 4 "math" 5 "math/big" 6 "testing" 7 "time" 8 9 "github.com/tendermint/go-amino" 10 11 "github.com/stretchr/testify/require" 12 13 sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types" 14 ) 15 16 func TestCommissionValidate(t *testing.T) { 17 testCases := []struct { 18 input Commission 19 expectErr bool 20 }{ 21 // invalid commission; max rate < 0% 22 {NewCommission(sdk.ZeroDec(), sdk.MustNewDecFromStr("-1.00"), sdk.ZeroDec()), true}, 23 // invalid commission; max rate > 100% 24 {NewCommission(sdk.ZeroDec(), sdk.MustNewDecFromStr("2.00"), sdk.ZeroDec()), true}, 25 // invalid commission; rate < 0% 26 {NewCommission(sdk.MustNewDecFromStr("-1.00"), sdk.ZeroDec(), sdk.ZeroDec()), true}, 27 // invalid commission; rate > max rate 28 {NewCommission(sdk.MustNewDecFromStr("0.75"), sdk.MustNewDecFromStr("0.50"), sdk.ZeroDec()), true}, 29 // invalid commission; max change rate < 0% 30 {NewCommission(sdk.OneDec(), sdk.OneDec(), sdk.MustNewDecFromStr("-1.00")), true}, 31 // invalid commission; max change rate > max rate 32 {NewCommission(sdk.OneDec(), sdk.MustNewDecFromStr("0.75"), sdk.MustNewDecFromStr("0.90")), true}, 33 // valid commission 34 {NewCommission(sdk.MustNewDecFromStr("0.20"), sdk.OneDec(), sdk.MustNewDecFromStr("0.10")), false}, 35 } 36 37 for i, tc := range testCases { 38 err := tc.input.Validate() 39 require.Equal(t, tc.expectErr, err != nil, "unexpected result; tc #%d, input: %v", i, tc.input) 40 } 41 } 42 43 func TestCommissionValidateNewRate(t *testing.T) { 44 now := time.Now().UTC() 45 c1 := NewCommission(sdk.MustNewDecFromStr("0.40"), sdk.MustNewDecFromStr("0.80"), sdk.MustNewDecFromStr("0.10")) 46 c1.UpdateTime = now 47 48 //maxChangeRate 0.8 49 testCases := []struct { 50 input Commission 51 newRate sdk.Dec 52 blockTime time.Time 53 expectErr bool 54 }{ 55 // invalid new commission rate; last update < 24h ago 56 {c1, sdk.MustNewDecFromStr("0.50"), now, true}, 57 // invalid new commission rate; new rate < 0% 58 {c1, sdk.MustNewDecFromStr("-1.00"), now.Add(48 * time.Hour), true}, 59 // invalid commission 60 {c1, sdk.MustNewDecFromStr("0.81"), now.Add(48 * time.Hour), true}, 61 // invalid new commission rate 62 {c1, sdk.MustNewDecFromStr("0.90"), now.Add(48 * time.Hour), true}, 63 // invalid new commission rate; 64 {c1, sdk.MustNewDecFromStr("0.60"), now.Add(48 * time.Hour), false}, 65 // valid commission 66 {c1, sdk.MustNewDecFromStr("0.50"), now.Add(48 * time.Hour), false}, 67 // valid commission 68 {c1, sdk.MustNewDecFromStr("0.10"), now.Add(48 * time.Hour), false}, 69 // valid commission, maxChangeRate 0.8 70 {c1, sdk.MustNewDecFromStr("0.80"), now.Add(48 * time.Hour), false}, 71 // valid commission, 72 {c1, sdk.MustNewDecFromStr("0.00"), now.Add(48 * time.Hour), false}, 73 // valid commission 74 {c1, sdk.MustNewDecFromStr("0.000000001"), now.Add(48 * time.Hour), false}, 75 // valid commission 76 {c1, sdk.MustNewDecFromStr("-0.000000001"), now.Add(48 * time.Hour), true}, 77 // valid commission, maxChangeRate 0.8 78 {c1, sdk.MustNewDecFromStr("0.8000000001"), now.Add(48 * time.Hour), true}, 79 } 80 81 for i, tc := range testCases { 82 err := tc.input.ValidateNewRate(tc.newRate, tc.blockTime) 83 require.Equal( 84 t, tc.expectErr, err != nil, 85 "unexpected result; tc #%d, input: %v, newRate: %s, blockTime: %s", 86 i, tc.input, tc.newRate, tc.blockTime, 87 ) 88 } 89 } 90 91 func TestCommissionAmino(t *testing.T) { 92 testCases := []Commission{ 93 {}, 94 { 95 CommissionRates{sdk.NewDec(1), sdk.NewDec(2), sdk.NewDec(3)}, time.Now(), 96 }, 97 } 98 cdc := amino.NewCodec() 99 for _, commission := range testCases { 100 bz, err := cdc.MarshalBinaryBare(commission) 101 require.NoError(t, err) 102 103 var newCommission Commission 104 err = cdc.UnmarshalBinaryBare(bz, &newCommission) 105 require.NoError(t, err) 106 107 var newCommission2 Commission 108 err = newCommission2.UnmarshalFromAmino(cdc, bz) 109 require.NoError(t, err) 110 111 require.Equal(t, newCommission, newCommission2) 112 } 113 } 114 115 func TestCommissionRatesAmino(t *testing.T) { 116 testCases := []CommissionRates{ 117 {}, 118 { 119 sdk.Dec{new(big.Int)}, 120 sdk.Dec{new(big.Int)}, 121 sdk.Dec{new(big.Int)}, 122 }, 123 { 124 sdk.Dec{big.NewInt(1)}, 125 sdk.Dec{big.NewInt(10)}, 126 sdk.Dec{big.NewInt(100)}, 127 }, 128 { 129 sdk.Dec{big.NewInt(math.MinInt64)}, 130 sdk.Dec{big.NewInt(math.MinInt64)}, 131 sdk.Dec{big.NewInt(math.MinInt64)}, 132 }, 133 { 134 sdk.Dec{big.NewInt(math.MaxInt64)}, 135 sdk.Dec{big.NewInt(math.MaxInt64)}, 136 sdk.Dec{big.NewInt(math.MaxInt64)}, 137 }, 138 { 139 sdk.Dec{big.NewInt(0).Mul(big.NewInt(math.MaxInt64), big.NewInt(math.MaxInt64))}, 140 sdk.Dec{big.NewInt(0).Add(big.NewInt(math.MaxInt64), big.NewInt(math.MaxInt64))}, 141 sdk.Dec{big.NewInt(0).Mul(big.NewInt(math.MaxInt64), big.NewInt(2))}, 142 }, 143 } 144 cdc := amino.NewCodec() 145 for _, commission := range testCases { 146 bz, err := cdc.MarshalBinaryBare(commission) 147 require.NoError(t, err) 148 149 var newCommission CommissionRates 150 err = cdc.UnmarshalBinaryBare(bz, &newCommission) 151 require.NoError(t, err) 152 153 var newCommission2 CommissionRates 154 err = newCommission2.UnmarshalFromAmino(cdc, bz) 155 require.NoError(t, err) 156 157 require.Equal(t, newCommission, newCommission2) 158 } 159 }