mirror of
				https://github.com/0glabs/0g-chain.git
				synced 2025-11-04 04:47:27 +00:00 
			
		
		
		
	Module account permissions fix (#701)
* initial draft * fix log msg formatting * fix mod account type * sync permissions at a block time * update the update time
This commit is contained in:
		
							parent
							
								
									c02ce618da
								
							
						
					
					
						commit
						35a82acbd0
					
				@ -1,12 +1,20 @@
 | 
			
		||||
package bep3
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
 | 
			
		||||
	sdk "github.com/cosmos/cosmos-sdk/types"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// BeginBlocker on every block expires outdated atomic swaps and removes closed
 | 
			
		||||
// swap from long term storage (default storage time of 1 week)
 | 
			
		||||
func BeginBlocker(ctx sdk.Context, k Keeper) {
 | 
			
		||||
	if ctx.BlockTime().After(ModulePermissionsUpgradeTime) {
 | 
			
		||||
		err := k.EnsureModuleAccountPermissions(ctx)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			k.Logger(ctx).Error(fmt.Sprintf("couldn't update module account permissions: %v", err))
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	k.UpdateTimeBasedSupplyLimits(ctx)
 | 
			
		||||
	k.UpdateExpiredAtomicSwaps(ctx)
 | 
			
		||||
	k.DeleteClosedAtomicSwapsFromLongtermStorage(ctx)
 | 
			
		||||
 | 
			
		||||
@ -121,6 +121,7 @@ var (
 | 
			
		||||
	DefaultMinBlockLock             = types.DefaultMinBlockLock
 | 
			
		||||
	DefaultMaxBlockLock             = types.DefaultMaxBlockLock
 | 
			
		||||
	DefaultPreviousBlockTime        = types.DefaultPreviousBlockTime
 | 
			
		||||
	ModulePermissionsUpgradeTime    = types.ModulePermissionsUpgradeTime
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type (
 | 
			
		||||
 | 
			
		||||
@ -4,6 +4,8 @@ import (
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	sdk "github.com/cosmos/cosmos-sdk/types"
 | 
			
		||||
	"github.com/cosmos/cosmos-sdk/x/auth"
 | 
			
		||||
	authexported "github.com/cosmos/cosmos-sdk/x/auth/exported"
 | 
			
		||||
 | 
			
		||||
	"github.com/tendermint/tendermint/crypto"
 | 
			
		||||
	tmtime "github.com/tendermint/tendermint/types/time"
 | 
			
		||||
@ -29,6 +31,11 @@ func c(denom string, amount int64) sdk.Coin { return sdk.NewInt64Coin(denom, amo
 | 
			
		||||
func cs(coins ...sdk.Coin) sdk.Coins        { return sdk.NewCoins(coins...) }
 | 
			
		||||
func ts(minOffset int) int64                { return tmtime.Now().Add(time.Duration(minOffset) * time.Minute).Unix() }
 | 
			
		||||
 | 
			
		||||
func NewAuthGenStateFromAccs(accounts ...authexported.GenesisAccount) app.GenesisState {
 | 
			
		||||
	authGenesis := auth.NewGenesisState(auth.DefaultParams(), accounts)
 | 
			
		||||
	return app.GenesisState{auth.ModuleName: auth.ModuleCdc.MustMarshalJSON(authGenesis)}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func NewBep3GenStateMulti(deputyAddress sdk.AccAddress) app.GenesisState {
 | 
			
		||||
	bep3Genesis := types.GenesisState{
 | 
			
		||||
		Params: types.Params{
 | 
			
		||||
 | 
			
		||||
@ -8,6 +8,7 @@ import (
 | 
			
		||||
	"github.com/cosmos/cosmos-sdk/store/prefix"
 | 
			
		||||
	sdk "github.com/cosmos/cosmos-sdk/types"
 | 
			
		||||
	"github.com/cosmos/cosmos-sdk/x/params/subspace"
 | 
			
		||||
	"github.com/cosmos/cosmos-sdk/x/supply"
 | 
			
		||||
	"github.com/tendermint/tendermint/libs/log"
 | 
			
		||||
 | 
			
		||||
	"github.com/kava-labs/kava/x/bep3/types"
 | 
			
		||||
@ -46,6 +47,19 @@ func (k Keeper) Logger(ctx sdk.Context) log.Logger {
 | 
			
		||||
	return ctx.Logger().With("module", fmt.Sprintf("x/%s", types.ModuleName))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// EnsureModuleAccountPermissions syncs the bep3 module account's permissions with those in the supply keeper.
 | 
			
		||||
func (k Keeper) EnsureModuleAccountPermissions(ctx sdk.Context) error {
 | 
			
		||||
	maccI := k.supplyKeeper.GetModuleAccount(ctx, types.ModuleName)
 | 
			
		||||
	macc, ok := maccI.(*supply.ModuleAccount)
 | 
			
		||||
	if !ok {
 | 
			
		||||
		return fmt.Errorf("expected %s account to be a module account type", types.ModuleName)
 | 
			
		||||
	}
 | 
			
		||||
	_, perms := k.supplyKeeper.GetModuleAddressAndPermissions(types.ModuleName)
 | 
			
		||||
	macc.Permissions = perms
 | 
			
		||||
	k.supplyKeeper.SetModuleAccount(ctx, macc)
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ------------------------------------------
 | 
			
		||||
//				Atomic Swaps
 | 
			
		||||
// ------------------------------------------
 | 
			
		||||
 | 
			
		||||
@ -7,6 +7,7 @@ import (
 | 
			
		||||
	"github.com/stretchr/testify/suite"
 | 
			
		||||
 | 
			
		||||
	sdk "github.com/cosmos/cosmos-sdk/types"
 | 
			
		||||
	"github.com/cosmos/cosmos-sdk/x/supply"
 | 
			
		||||
 | 
			
		||||
	abci "github.com/tendermint/tendermint/abci/types"
 | 
			
		||||
	tmtime "github.com/tendermint/tendermint/types/time"
 | 
			
		||||
@ -30,7 +31,6 @@ func (suite *KeeperTestSuite) SetupTest() {
 | 
			
		||||
	config := sdk.GetConfig()
 | 
			
		||||
	app.SetBech32AddressPrefixes(config)
 | 
			
		||||
	suite.ResetChain()
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (suite *KeeperTestSuite) ResetChain() {
 | 
			
		||||
@ -43,6 +43,37 @@ func (suite *KeeperTestSuite) ResetChain() {
 | 
			
		||||
	suite.keeper = keeper
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (suite *KeeperTestSuite) TestEnsureModuleAccountPermissions() {
 | 
			
		||||
	suite.app.InitializeFromGenesisStates(
 | 
			
		||||
		NewAuthGenStateFromAccs(
 | 
			
		||||
			supply.NewEmptyModuleAccount(types.ModuleName), // no permisions
 | 
			
		||||
		),
 | 
			
		||||
	)
 | 
			
		||||
	supplyKeeper := suite.app.GetSupplyKeeper()
 | 
			
		||||
	testCoins := cs(c("busd", 1000_00_000_000))
 | 
			
		||||
 | 
			
		||||
	// Ensure there are no minting and burning permissions.
 | 
			
		||||
	// This calls mint/burn instead of checking permissions as the supply module can report permissions incorrectly.
 | 
			
		||||
	// Using a panic check because MintCoins panics when permissions are incorrect.
 | 
			
		||||
	suite.Panics(func() {
 | 
			
		||||
		err := supplyKeeper.MintCoins(suite.ctx, types.ModuleName, testCoins)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			panic(err)
 | 
			
		||||
		}
 | 
			
		||||
		err = supplyKeeper.BurnCoins(suite.ctx, types.ModuleName, testCoins)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			panic(err)
 | 
			
		||||
		}
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	err := suite.keeper.EnsureModuleAccountPermissions(suite.ctx)
 | 
			
		||||
	suite.NoError(err)
 | 
			
		||||
 | 
			
		||||
	err = supplyKeeper.MintCoins(suite.ctx, types.ModuleName, testCoins)
 | 
			
		||||
	suite.NoError(err)
 | 
			
		||||
	err = supplyKeeper.BurnCoins(suite.ctx, types.ModuleName, testCoins)
 | 
			
		||||
	suite.NoError(err)
 | 
			
		||||
}
 | 
			
		||||
func (suite *KeeperTestSuite) TestGetSetAtomicSwap() {
 | 
			
		||||
	suite.ResetChain()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -10,6 +10,8 @@ import (
 | 
			
		||||
type SupplyKeeper interface {
 | 
			
		||||
	GetModuleAddress(name string) sdk.AccAddress
 | 
			
		||||
	GetModuleAccount(ctx sdk.Context, moduleName string) supplyexported.ModuleAccountI
 | 
			
		||||
	GetModuleAddressAndPermissions(moduleName string) (sdk.AccAddress, []string)
 | 
			
		||||
	SetModuleAccount(ctx sdk.Context, macc supplyexported.ModuleAccountI)
 | 
			
		||||
 | 
			
		||||
	SendCoinsFromModuleToAccount(ctx sdk.Context, senderModule string, recipientAddr sdk.AccAddress, amt sdk.Coins) error
 | 
			
		||||
	SendCoinsFromAccountToModule(ctx sdk.Context, senderAddr sdk.AccAddress, recipientModule string, amt sdk.Coins) error
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,8 @@
 | 
			
		||||
package types
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	sdk "github.com/cosmos/cosmos-sdk/types"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
@ -26,6 +28,9 @@ const (
 | 
			
		||||
 | 
			
		||||
// Key prefixes
 | 
			
		||||
var (
 | 
			
		||||
	// ModulePermissionsUpgradeTime is the block time after which the bep3 module account's permissions are synced with the supply module.
 | 
			
		||||
	ModulePermissionsUpgradeTime time.Time = time.Date(2020, 11, 3, 10, 0, 0, 0, time.UTC)
 | 
			
		||||
 | 
			
		||||
	AtomicSwapKeyPrefix             = []byte{0x00} // prefix for keys that store AtomicSwaps
 | 
			
		||||
	AtomicSwapByBlockPrefix         = []byte{0x01} // prefix for keys of the AtomicSwapsByBlock index
 | 
			
		||||
	AtomicSwapLongtermStoragePrefix = []byte{0x02} // prefix for keys of the AtomicSwapLongtermStorage index
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user