refactor(x/mint)!: avoid writing same minter and use millisecond precision for minting (#20747)

This commit is contained in:
Facundo Medica
2024-06-26 10:19:24 +00:00
committed by GitHub
parent ae9116aff1
commit 4bda5d6a4e
5 changed files with 48 additions and 6 deletions
+6
View File
@@ -20,11 +20,17 @@ func (am AppModule) BeforeEpochStart(ctx context.Context, epochIdentifier string
return err
}
oldMinter := minter
err = am.mintFn(ctx, am.keeper.Environment, &minter, epochIdentifier, epochNumber)
if err != nil {
return err
}
if minter.IsEqual(oldMinter) {
return nil
}
return am.keeper.Minter.Set(ctx, minter)
}
+6
View File
@@ -18,6 +18,8 @@ func (k Keeper) BeginBlocker(ctx context.Context, mintFn types.MintFn) error {
return err
}
oldMinter := minter
// we pass -1 as epoch number to indicate that this is not an epoch minting,
// but a regular block minting. Same with epoch id "block".
err = mintFn(ctx, k.Environment, &minter, "block", -1)
@@ -25,5 +27,9 @@ func (k Keeper) BeginBlocker(ctx context.Context, mintFn types.MintFn) error {
return err
}
if minter.IsEqual(oldMinter) {
return nil
}
return k.Minter.Set(ctx, minter)
}
+13
View File
@@ -1,11 +1,13 @@
package keeper_test
import (
"context"
"testing"
"github.com/golang/mock/gomock"
"github.com/stretchr/testify/suite"
"cosmossdk.io/core/appmodule"
"cosmossdk.io/log"
"cosmossdk.io/math"
storetypes "cosmossdk.io/store/types"
@@ -152,6 +154,17 @@ func (s *KeeperTestSuite) TestBeginBlocker() {
newMinter, err := s.mintKeeper.Minter.Get(s.ctx)
s.NoError(err)
s.NotEqual(minter, newMinter)
// now use a mintfn that doesn't do anything
err = s.mintKeeper.BeginBlocker(s.ctx, func(ctx context.Context, env appmodule.Environment, minter *types.Minter, epochId string, epochNumber int64) error {
return nil
})
s.NoError(err)
// get minter again and compare
unchangedMinter, err := s.mintKeeper.Minter.Get(s.ctx)
s.NoError(err)
s.Equal(newMinter, unchangedMinter)
}
func (s *KeeperTestSuite) TestMigrator() {
+18
View File
@@ -1,6 +1,7 @@
package types
import (
"bytes"
"fmt"
"cosmossdk.io/math"
@@ -80,3 +81,20 @@ func (m Minter) BlockProvision(params Params) sdk.Coin {
provisionAmt := m.AnnualProvisions.QuoInt(math.NewInt(int64(params.BlocksPerYear)))
return sdk.NewCoin(params.MintDenom, provisionAmt.TruncateInt())
}
// IsEqual returns true if two minters are equal, it checks all the fields
func (m Minter) IsEqual(minter Minter) bool {
if !m.Inflation.Equal(minter.Inflation) {
return false
}
if !m.AnnualProvisions.Equal(minter.AnnualProvisions) {
return false
}
if !bytes.Equal(m.Data, minter.Data) {
return false
}
return true
}