Merge PR #2408: decimal: Add a method to multiply a decimal by an Int
This is for usage within the slash function, to minimize operations required to slash each unbonded and redelegating account.
This commit is contained in:
parent
b54801b4b3
commit
e11c52e873
|
@ -45,6 +45,7 @@ BREAKING CHANGES
|
|||
* [types] [\#1901](https://github.com/cosmos/cosmos-sdk/issues/1901) Validator interface's GetOwner() renamed to GetOperator()
|
||||
* [x/slashing] [#2122](https://github.com/cosmos/cosmos-sdk/pull/2122) - Implement slashing period
|
||||
* [types] [\#2119](https://github.com/cosmos/cosmos-sdk/issues/2119) Parsed error messages and ABCI log errors to make them more human readable.
|
||||
* [types] \#2407 MulInt method added to big decimal in order to improve efficiency of slashing
|
||||
* [simulation] Rename TestAndRunTx to Operation [#2153](https://github.com/cosmos/cosmos-sdk/pull/2153)
|
||||
* [simulation] Remove log and testing.TB from Operation and Invariants, in favor of using errors \#2282
|
||||
* [simulation] Remove usage of keys and addrs in the types, in favor of simulation.Account \#2384
|
||||
|
|
|
@ -215,6 +215,16 @@ func (d Dec) Mul(d2 Dec) Dec {
|
|||
return Dec{chopped}
|
||||
}
|
||||
|
||||
// multiplication
|
||||
func (d Dec) MulInt(i Int) Dec {
|
||||
mul := new(big.Int).Mul(d.Int, i.i)
|
||||
|
||||
if mul.BitLen() > 255+DecimalPrecisionBits {
|
||||
panic("Int overflow")
|
||||
}
|
||||
return Dec{mul}
|
||||
}
|
||||
|
||||
// quotient
|
||||
func (d Dec) Quo(d2 Dec) Dec {
|
||||
|
||||
|
|
|
@ -325,3 +325,20 @@ func TestStringOverflow(t *testing.T) {
|
|||
dec3.String(),
|
||||
)
|
||||
}
|
||||
|
||||
func TestDecMulInt(t *testing.T) {
|
||||
tests := []struct {
|
||||
sdkDec Dec
|
||||
sdkInt Int
|
||||
want Dec
|
||||
}{
|
||||
{NewDec(10), NewInt(2), NewDec(20)},
|
||||
{NewDec(1000000), NewInt(100), NewDec(100000000)},
|
||||
{NewDecWithPrec(1, 1), NewInt(10), NewDec(1)},
|
||||
{NewDecWithPrec(1, 5), NewInt(20), NewDecWithPrec(2, 4)},
|
||||
}
|
||||
for i, tc := range tests {
|
||||
got := tc.sdkDec.MulInt(tc.sdkInt)
|
||||
require.Equal(t, tc.want, got, "Incorrect result on test case %d", i)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -172,7 +172,7 @@ func (k Keeper) slashUnbondingDelegation(ctx sdk.Context, unbondingDelegation ty
|
|||
}
|
||||
|
||||
// Calculate slash amount proportional to stake contributing to infraction
|
||||
slashAmount = sdk.NewDecFromInt(unbondingDelegation.InitialBalance.Amount).Mul(slashFactor)
|
||||
slashAmount = slashFactor.MulInt(unbondingDelegation.InitialBalance.Amount)
|
||||
|
||||
// Don't slash more tokens than held
|
||||
// Possible since the unbonding delegation may already
|
||||
|
@ -218,7 +218,7 @@ func (k Keeper) slashRedelegation(ctx sdk.Context, validator types.Validator, re
|
|||
}
|
||||
|
||||
// Calculate slash amount proportional to stake contributing to infraction
|
||||
slashAmount = sdk.NewDecFromInt(redelegation.InitialBalance.Amount).Mul(slashFactor)
|
||||
slashAmount = slashFactor.MulInt(redelegation.InitialBalance.Amount)
|
||||
|
||||
// Don't slash more tokens than held
|
||||
// Possible since the redelegation may already
|
||||
|
|
Loading…
Reference in New Issue