forked from cerc-io/laconicd
		
	Add module invariants and input validations (#14)
Reviewed-on: deep-stack/laconic2d#14 Co-authored-by: Prathamesh Musale <prathamesh.musale0@gmail.com> Co-committed-by: Prathamesh Musale <prathamesh.musale0@gmail.com>
This commit is contained in:
		
							parent
							
								
									d346b95234
								
							
						
					
					
						commit
						ec147272e6
					
				| @ -29,6 +29,7 @@ import ( | |||||||
| 	authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper" | 	authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper" | ||||||
| 	bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" | 	bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" | ||||||
| 	consensuskeeper "github.com/cosmos/cosmos-sdk/x/consensus/keeper" | 	consensuskeeper "github.com/cosmos/cosmos-sdk/x/consensus/keeper" | ||||||
|  | 	crisiskeeper "github.com/cosmos/cosmos-sdk/x/crisis/keeper" | ||||||
| 	distrkeeper "github.com/cosmos/cosmos-sdk/x/distribution/keeper" | 	distrkeeper "github.com/cosmos/cosmos-sdk/x/distribution/keeper" | ||||||
| 	"github.com/cosmos/cosmos-sdk/x/genutil" | 	"github.com/cosmos/cosmos-sdk/x/genutil" | ||||||
| 	genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types" | 	genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types" | ||||||
| @ -42,6 +43,7 @@ import ( | |||||||
| 	_ "github.com/cosmos/cosmos-sdk/x/auth/tx/config"  // import for side-effects
 | 	_ "github.com/cosmos/cosmos-sdk/x/auth/tx/config"  // import for side-effects
 | ||||||
| 	_ "github.com/cosmos/cosmos-sdk/x/bank"            // import for side-effects
 | 	_ "github.com/cosmos/cosmos-sdk/x/bank"            // import for side-effects
 | ||||||
| 	_ "github.com/cosmos/cosmos-sdk/x/consensus"       // import for side-effects
 | 	_ "github.com/cosmos/cosmos-sdk/x/consensus"       // import for side-effects
 | ||||||
|  | 	_ "github.com/cosmos/cosmos-sdk/x/crisis"          // import for side-effects
 | ||||||
| 	_ "github.com/cosmos/cosmos-sdk/x/distribution"    // import for side-effects
 | 	_ "github.com/cosmos/cosmos-sdk/x/distribution"    // import for side-effects
 | ||||||
| 	_ "github.com/cosmos/cosmos-sdk/x/mint"            // import for side-effects
 | 	_ "github.com/cosmos/cosmos-sdk/x/mint"            // import for side-effects
 | ||||||
| 	_ "github.com/cosmos/cosmos-sdk/x/staking"         // import for side-effects
 | 	_ "github.com/cosmos/cosmos-sdk/x/staking"         // import for side-effects
 | ||||||
| @ -73,6 +75,7 @@ type LaconicApp struct { | |||||||
| 	BankKeeper            bankkeeper.Keeper | 	BankKeeper            bankkeeper.Keeper | ||||||
| 	StakingKeeper         *stakingkeeper.Keeper | 	StakingKeeper         *stakingkeeper.Keeper | ||||||
| 	DistrKeeper           distrkeeper.Keeper | 	DistrKeeper           distrkeeper.Keeper | ||||||
|  | 	CrisisKeeper          *crisiskeeper.Keeper | ||||||
| 	ConsensusParamsKeeper consensuskeeper.Keeper | 	ConsensusParamsKeeper consensuskeeper.Keeper | ||||||
| 
 | 
 | ||||||
| 	// laconic keepers
 | 	// laconic keepers
 | ||||||
| @ -137,6 +140,7 @@ func NewLaconicApp( | |||||||
| 		&app.BankKeeper, | 		&app.BankKeeper, | ||||||
| 		&app.StakingKeeper, | 		&app.StakingKeeper, | ||||||
| 		&app.DistrKeeper, | 		&app.DistrKeeper, | ||||||
|  | 		&app.CrisisKeeper, | ||||||
| 		&app.ConsensusParamsKeeper, | 		&app.ConsensusParamsKeeper, | ||||||
| 		&app.AuctionKeeper, | 		&app.AuctionKeeper, | ||||||
| 		&app.BondKeeper, | 		&app.BondKeeper, | ||||||
| @ -154,7 +158,8 @@ func NewLaconicApp( | |||||||
| 
 | 
 | ||||||
| 	/****  Module Options ****/ | 	/****  Module Options ****/ | ||||||
| 
 | 
 | ||||||
| 	// TOOD: Required?
 | 	app.ModuleManager.RegisterInvariants(app.CrisisKeeper) | ||||||
|  | 
 | ||||||
| 	// create the simulation manager and define the order of the modules for deterministic simulations
 | 	// create the simulation manager and define the order of the modules for deterministic simulations
 | ||||||
| 	// NOTE: this is not required apps that don't use the simulator for fuzz testing transactions
 | 	// NOTE: this is not required apps that don't use the simulator for fuzz testing transactions
 | ||||||
| 	app.sm = module.NewSimulationManagerFromAppModules(app.ModuleManager.Modules, make(map[string]module.AppModuleSimulation, 0)) | 	app.sm = module.NewSimulationManagerFromAppModules(app.ModuleManager.Modules, make(map[string]module.AppModuleSimulation, 0)) | ||||||
|  | |||||||
| @ -7,10 +7,10 @@ modules: | |||||||
|       # there is nothing left over in the validator fee pool, so as to keep the CanWithdrawInvariant invariant. |       # there is nothing left over in the validator fee pool, so as to keep the CanWithdrawInvariant invariant. | ||||||
|       # NOTE: staking module is required if HistoricalEntries param > 0 |       # NOTE: staking module is required if HistoricalEntries param > 0 | ||||||
|       begin_blockers: [distribution, staking] |       begin_blockers: [distribution, staking] | ||||||
|       end_blockers: [staking, auction, registry] |       end_blockers: [crisis, staking, auction, registry] | ||||||
|       # NOTE: The genutils module must occur after staking so that pools are properly initialized with tokens from genesis accounts. |       # NOTE: The genutils module must occur after staking so that pools are properly initialized with tokens from genesis accounts. | ||||||
|       # NOTE: The genutils module must also occur after auth so that it can access the params from auth. |       # NOTE: The genutils module must also occur after auth so that it can access the params from auth. | ||||||
|       init_genesis: [auth, bank, distribution, staking, genutil, auction, bond, registry] |       init_genesis: [auth, bank, distribution, staking, crisis, genutil, auction, bond, registry] | ||||||
|       override_store_keys: |       override_store_keys: | ||||||
|         - module_name: auth |         - module_name: auth | ||||||
|           kv_store_key: acc |           kv_store_key: acc | ||||||
| @ -51,6 +51,9 @@ modules: | |||||||
|   - name: tx |   - name: tx | ||||||
|     config: |     config: | ||||||
|       "@type": cosmos.tx.config.v1.Config |       "@type": cosmos.tx.config.v1.Config | ||||||
|  |   - name: crisis | ||||||
|  |     config: | ||||||
|  |       "@type": cosmos.crisis.module.v1.Module | ||||||
|   - name: bond |   - name: bond | ||||||
|     config: |     config: | ||||||
|       "@type": cerc.bond.module.v1.Module |       "@type": cerc.bond.module.v1.Module | ||||||
|  | |||||||
| @ -118,6 +118,8 @@ func (ets *E2ETestSuite) createBond() string { | |||||||
| 	sr.NoError(err) | 	sr.NoError(err) | ||||||
| 
 | 
 | ||||||
| 	// extract bond id from bonds list
 | 	// extract bond id from bonds list
 | ||||||
| 	bond := queryResponse.GetBonds()[0] | 	bonds := queryResponse.GetBonds() | ||||||
| 	return bond.GetId() | 	sr.NotEmpty(bonds) | ||||||
|  | 
 | ||||||
|  | 	return queryResponse.GetBonds()[0].GetId() | ||||||
| } | } | ||||||
|  | |||||||
							
								
								
									
										37
									
								
								x/auction/keeper/invariants.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								x/auction/keeper/invariants.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,37 @@ | |||||||
|  | package keeper | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"fmt" | ||||||
|  | 
 | ||||||
|  | 	sdk "github.com/cosmos/cosmos-sdk/types" | ||||||
|  | 
 | ||||||
|  | 	types "git.vdb.to/cerc-io/laconic2d/x/auction" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // RegisterInvariants registers all auction invariants
 | ||||||
|  | func RegisterInvariants(ir sdk.InvariantRegistry, k *Keeper) { | ||||||
|  | 	ir.RegisterRoute(types.ModuleName, "module-account", ModuleAccountInvariant(k)) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // AllInvariants runs all invariants of the auction module.
 | ||||||
|  | func AllInvariants(k *Keeper) sdk.Invariant { | ||||||
|  | 	return func(ctx sdk.Context) (string, bool) { | ||||||
|  | 		return ModuleAccountInvariant(k)(ctx) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // ModuleAccountInvariant checks that the 'auction' module account balance is non-negative.
 | ||||||
|  | func ModuleAccountInvariant(k *Keeper) sdk.Invariant { | ||||||
|  | 	return func(ctx sdk.Context) (string, bool) { | ||||||
|  | 		moduleAddress := k.accountKeeper.GetModuleAddress(types.ModuleName) | ||||||
|  | 		if k.bankKeeper.GetAllBalances(ctx, moduleAddress).IsAnyNegative() { | ||||||
|  | 			return sdk.FormatInvariant( | ||||||
|  | 				types.ModuleName, | ||||||
|  | 				"module-account", | ||||||
|  | 				fmt.Sprintf("Module account '%s' has negative balance.", types.ModuleName), | ||||||
|  | 			), true | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		return "", false | ||||||
|  | 	} | ||||||
|  | } | ||||||
| @ -285,12 +285,11 @@ func (k Keeper) QueryAuctionsByBidder(ctx sdk.Context, bidderAddress string) ([] | |||||||
| 
 | 
 | ||||||
| // CreateAuction creates a new auction.
 | // CreateAuction creates a new auction.
 | ||||||
| func (k Keeper) CreateAuction(ctx sdk.Context, msg auctiontypes.MsgCreateAuction) (*auctiontypes.Auction, error) { | func (k Keeper) CreateAuction(ctx sdk.Context, msg auctiontypes.MsgCreateAuction) (*auctiontypes.Auction, error) { | ||||||
| 	// TODO: Setup checks
 |  | ||||||
| 	// Might be called from another module directly, always validate.
 | 	// Might be called from another module directly, always validate.
 | ||||||
| 	// err := msg.ValidateBasic()
 | 	err := msg.ValidateBasic() | ||||||
| 	// if err != nil {
 | 	if err != nil { | ||||||
| 	// 	return nil, err
 | 		return nil, err | ||||||
| 	// }
 | 	} | ||||||
| 
 | 
 | ||||||
| 	signerAddress, err := sdk.AccAddressFromBech32(msg.Signer) | 	signerAddress, err := sdk.AccAddressFromBech32(msg.Signer) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
|  | |||||||
| @ -52,6 +52,10 @@ func (ms msgServer) CreateAuction(c context.Context, msg *auctiontypes.MsgCreate | |||||||
| // CommitBid is the command for committing a bid
 | // CommitBid is the command for committing a bid
 | ||||||
| // nolint: all
 | // nolint: all
 | ||||||
| func (ms msgServer) CommitBid(c context.Context, msg *auctiontypes.MsgCommitBid) (*auctiontypes.MsgCommitBidResponse, error) { | func (ms msgServer) CommitBid(c context.Context, msg *auctiontypes.MsgCommitBid) (*auctiontypes.MsgCommitBidResponse, error) { | ||||||
|  | 	if err := msg.ValidateBasic(); err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	ctx := sdk.UnwrapSDKContext(c) | 	ctx := sdk.UnwrapSDKContext(c) | ||||||
| 
 | 
 | ||||||
| 	signerAddress, err := sdk.AccAddressFromBech32(msg.Signer) | 	signerAddress, err := sdk.AccAddressFromBech32(msg.Signer) | ||||||
| @ -83,6 +87,10 @@ func (ms msgServer) CommitBid(c context.Context, msg *auctiontypes.MsgCommitBid) | |||||||
| // RevealBid is the command for revealing a bid
 | // RevealBid is the command for revealing a bid
 | ||||||
| // nolint: all
 | // nolint: all
 | ||||||
| func (ms msgServer) RevealBid(c context.Context, msg *auctiontypes.MsgRevealBid) (*auctiontypes.MsgRevealBidResponse, error) { | func (ms msgServer) RevealBid(c context.Context, msg *auctiontypes.MsgRevealBid) (*auctiontypes.MsgRevealBidResponse, error) { | ||||||
|  | 	if err := msg.ValidateBasic(); err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	ctx := sdk.UnwrapSDKContext(c) | 	ctx := sdk.UnwrapSDKContext(c) | ||||||
| 
 | 
 | ||||||
| 	signerAddress, err := sdk.AccAddressFromBech32(msg.Signer) | 	signerAddress, err := sdk.AccAddressFromBech32(msg.Signer) | ||||||
|  | |||||||
| @ -27,6 +27,7 @@ var ( | |||||||
| 	_ module.HasServices         = AppModule{} | 	_ module.HasServices         = AppModule{} | ||||||
| 	_ module.HasConsensusVersion = AppModule{} | 	_ module.HasConsensusVersion = AppModule{} | ||||||
| 	_ appmodule.HasEndBlocker    = AppModule{} | 	_ appmodule.HasEndBlocker    = AppModule{} | ||||||
|  | 	_ module.HasInvariants       = AppModule{} | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // ConsensusVersion defines the current module consensus version
 | // ConsensusVersion defines the current module consensus version
 | ||||||
| @ -126,6 +127,12 @@ func (am AppModule) EndBlock(ctx context.Context) error { | |||||||
| 	return EndBlocker(ctx, am.keeper) | 	return EndBlocker(ctx, am.keeper) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // module.HasInvariants
 | ||||||
|  | 
 | ||||||
|  | func (am AppModule) RegisterInvariants(ir sdk.InvariantRegistry) { | ||||||
|  | 	keeper.RegisterInvariants(ir, am.keeper) | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // Get the root tx command of this module
 | // Get the root tx command of this module
 | ||||||
| func (AppModule) GetTxCmd() *cobra.Command { | func (AppModule) GetTxCmd() *cobra.Command { | ||||||
| 	return cli.GetTxCmd() | 	return cli.GetTxCmd() | ||||||
|  | |||||||
							
								
								
									
										37
									
								
								x/bond/keeper/invariants.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								x/bond/keeper/invariants.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,37 @@ | |||||||
|  | package keeper | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"fmt" | ||||||
|  | 
 | ||||||
|  | 	sdk "github.com/cosmos/cosmos-sdk/types" | ||||||
|  | 
 | ||||||
|  | 	types "git.vdb.to/cerc-io/laconic2d/x/bond" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // RegisterInvariants registers all bond invariants
 | ||||||
|  | func RegisterInvariants(ir sdk.InvariantRegistry, k *Keeper) { | ||||||
|  | 	ir.RegisterRoute(types.ModuleName, "module-account", ModuleAccountInvariant(k)) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // AllInvariants runs all invariants of the bond module.
 | ||||||
|  | func AllInvariants(k *Keeper) sdk.Invariant { | ||||||
|  | 	return func(ctx sdk.Context) (string, bool) { | ||||||
|  | 		return ModuleAccountInvariant(k)(ctx) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // ModuleAccountInvariant checks that the 'bond' module account balance is non-negative.
 | ||||||
|  | func ModuleAccountInvariant(k *Keeper) sdk.Invariant { | ||||||
|  | 	return func(ctx sdk.Context) (string, bool) { | ||||||
|  | 		moduleAddress := k.accountKeeper.GetModuleAddress(types.ModuleName) | ||||||
|  | 		if k.bankKeeper.GetAllBalances(ctx, moduleAddress).IsAnyNegative() { | ||||||
|  | 			return sdk.FormatInvariant( | ||||||
|  | 				types.ModuleName, | ||||||
|  | 				"module-account", | ||||||
|  | 				fmt.Sprintf("Module account '%s' has negative balance.", types.ModuleName), | ||||||
|  | 			), true | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		return "", false | ||||||
|  | 	} | ||||||
|  | } | ||||||
| @ -20,6 +20,10 @@ func NewMsgServerImpl(keeper *Keeper) bond.MsgServer { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (ms msgServer) CreateBond(c context.Context, msg *bond.MsgCreateBond) (*bond.MsgCreateBondResponse, error) { | func (ms msgServer) CreateBond(c context.Context, msg *bond.MsgCreateBond) (*bond.MsgCreateBondResponse, error) { | ||||||
|  | 	if err := msg.ValidateBasic(); err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	ctx := sdk.UnwrapSDKContext(c) | 	ctx := sdk.UnwrapSDKContext(c) | ||||||
| 
 | 
 | ||||||
| 	signerAddress, err := sdk.AccAddressFromBech32(msg.Signer) | 	signerAddress, err := sdk.AccAddressFromBech32(msg.Signer) | ||||||
| @ -50,6 +54,10 @@ func (ms msgServer) CreateBond(c context.Context, msg *bond.MsgCreateBond) (*bon | |||||||
| 
 | 
 | ||||||
| // RefillBond implements bond.MsgServer.
 | // RefillBond implements bond.MsgServer.
 | ||||||
| func (ms msgServer) RefillBond(c context.Context, msg *bond.MsgRefillBond) (*bond.MsgRefillBondResponse, error) { | func (ms msgServer) RefillBond(c context.Context, msg *bond.MsgRefillBond) (*bond.MsgRefillBondResponse, error) { | ||||||
|  | 	if err := msg.ValidateBasic(); err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	ctx := sdk.UnwrapSDKContext(c) | 	ctx := sdk.UnwrapSDKContext(c) | ||||||
| 
 | 
 | ||||||
| 	signerAddress, err := sdk.AccAddressFromBech32(msg.Signer) | 	signerAddress, err := sdk.AccAddressFromBech32(msg.Signer) | ||||||
| @ -81,6 +89,10 @@ func (ms msgServer) RefillBond(c context.Context, msg *bond.MsgRefillBond) (*bon | |||||||
| 
 | 
 | ||||||
| // WithdrawBond implements bond.MsgServer.
 | // WithdrawBond implements bond.MsgServer.
 | ||||||
| func (ms msgServer) WithdrawBond(c context.Context, msg *bond.MsgWithdrawBond) (*bond.MsgWithdrawBondResponse, error) { | func (ms msgServer) WithdrawBond(c context.Context, msg *bond.MsgWithdrawBond) (*bond.MsgWithdrawBondResponse, error) { | ||||||
|  | 	if err := msg.ValidateBasic(); err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	ctx := sdk.UnwrapSDKContext(c) | 	ctx := sdk.UnwrapSDKContext(c) | ||||||
| 
 | 
 | ||||||
| 	signerAddress, err := sdk.AccAddressFromBech32(msg.Signer) | 	signerAddress, err := sdk.AccAddressFromBech32(msg.Signer) | ||||||
| @ -112,11 +124,17 @@ func (ms msgServer) WithdrawBond(c context.Context, msg *bond.MsgWithdrawBond) ( | |||||||
| 
 | 
 | ||||||
| // CancelBond implements bond.MsgServer.
 | // CancelBond implements bond.MsgServer.
 | ||||||
| func (ms msgServer) CancelBond(c context.Context, msg *bond.MsgCancelBond) (*bond.MsgCancelBondResponse, error) { | func (ms msgServer) CancelBond(c context.Context, msg *bond.MsgCancelBond) (*bond.MsgCancelBondResponse, error) { | ||||||
|  | 	if err := msg.ValidateBasic(); err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	ctx := sdk.UnwrapSDKContext(c) | 	ctx := sdk.UnwrapSDKContext(c) | ||||||
|  | 
 | ||||||
| 	signerAddress, err := sdk.AccAddressFromBech32(msg.Signer) | 	signerAddress, err := sdk.AccAddressFromBech32(msg.Signer) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
|  | 
 | ||||||
| 	_, err = ms.k.CancelBond(ctx, msg.Id, signerAddress) | 	_, err = ms.k.CancelBond(ctx, msg.Id, signerAddress) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
|  | |||||||
| @ -24,6 +24,7 @@ var ( | |||||||
| 	_ module.HasGenesis          = AppModule{} | 	_ module.HasGenesis          = AppModule{} | ||||||
| 	_ module.HasServices         = AppModule{} | 	_ module.HasServices         = AppModule{} | ||||||
| 	_ module.HasConsensusVersion = AppModule{} | 	_ module.HasConsensusVersion = AppModule{} | ||||||
|  | 	_ module.HasInvariants       = AppModule{} | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // ConsensusVersion defines the current module consensus version
 | // ConsensusVersion defines the current module consensus version
 | ||||||
| @ -116,3 +117,9 @@ func (am AppModule) RegisterServices(cfg module.Configurator) { | |||||||
| 	bond.RegisterMsgServer(cfg.MsgServer(), keeper.NewMsgServerImpl(am.keeper)) | 	bond.RegisterMsgServer(cfg.MsgServer(), keeper.NewMsgServerImpl(am.keeper)) | ||||||
| 	bond.RegisterQueryServer(cfg.QueryServer(), keeper.NewQueryServerImpl(am.keeper)) | 	bond.RegisterQueryServer(cfg.QueryServer(), keeper.NewQueryServerImpl(am.keeper)) | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | // module.HasInvariants
 | ||||||
|  | 
 | ||||||
|  | func (am AppModule) RegisterInvariants(ir sdk.InvariantRegistry) { | ||||||
|  | 	keeper.RegisterInvariants(ir, am.keeper) | ||||||
|  | } | ||||||
|  | |||||||
| @ -1,7 +1,9 @@ | |||||||
| package bond | package bond | ||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
|  | 	errorsmod "cosmossdk.io/errors" | ||||||
| 	sdk "github.com/cosmos/cosmos-sdk/types" | 	sdk "github.com/cosmos/cosmos-sdk/types" | ||||||
|  | 	sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| var ( | var ( | ||||||
| @ -15,3 +17,49 @@ func NewMsgCreateBond(coins sdk.Coins, signer sdk.AccAddress) MsgCreateBond { | |||||||
| 		Signer: signer.String(), | 		Signer: signer.String(), | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | func (msg MsgCreateBond) ValidateBasic() error { | ||||||
|  | 	if len(msg.Signer) == 0 { | ||||||
|  | 		return errorsmod.Wrap(sdkerrors.ErrInvalidAddress, msg.Signer) | ||||||
|  | 	} | ||||||
|  | 	if len(msg.Coins) == 0 || !msg.Coins.IsValid() { | ||||||
|  | 		return errorsmod.Wrap(sdkerrors.ErrInvalidCoins, "Invalid amount.") | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (msg MsgRefillBond) ValidateBasic() error { | ||||||
|  | 	if len(msg.Id) == 0 { | ||||||
|  | 		return errorsmod.Wrap(sdkerrors.ErrInvalidRequest, msg.Id) | ||||||
|  | 	} | ||||||
|  | 	if len(msg.Signer) == 0 { | ||||||
|  | 		return errorsmod.Wrap(sdkerrors.ErrInvalidAddress, msg.Signer) | ||||||
|  | 	} | ||||||
|  | 	if len(msg.Coins) == 0 || !msg.Coins.IsValid() { | ||||||
|  | 		return errorsmod.Wrap(sdkerrors.ErrInvalidCoins, "Invalid amount.") | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (msg MsgWithdrawBond) ValidateBasic() error { | ||||||
|  | 	if len(msg.Id) == 0 { | ||||||
|  | 		return errorsmod.Wrap(sdkerrors.ErrInvalidRequest, msg.Id) | ||||||
|  | 	} | ||||||
|  | 	if len(msg.Signer) == 0 { | ||||||
|  | 		return errorsmod.Wrap(sdkerrors.ErrInvalidAddress, msg.Signer) | ||||||
|  | 	} | ||||||
|  | 	if len(msg.Coins) == 0 || !msg.Coins.IsValid() { | ||||||
|  | 		return errorsmod.Wrap(sdkerrors.ErrInvalidCoins, "Invalid amount.") | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (msg MsgCancelBond) ValidateBasic() error { | ||||||
|  | 	if len(msg.Id) == 0 { | ||||||
|  | 		return errorsmod.Wrap(sdkerrors.ErrInvalidRequest, msg.Id) | ||||||
|  | 	} | ||||||
|  | 	if len(msg.Signer) == 0 { | ||||||
|  | 		return errorsmod.Wrap(sdkerrors.ErrInvalidAddress, msg.Signer) | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | |||||||
							
								
								
									
										75
									
								
								x/registry/keeper/invariants.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										75
									
								
								x/registry/keeper/invariants.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,75 @@ | |||||||
|  | package keeper | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"errors" | ||||||
|  | 	"fmt" | ||||||
|  | 
 | ||||||
|  | 	sdk "github.com/cosmos/cosmos-sdk/types" | ||||||
|  | 
 | ||||||
|  | 	types "git.vdb.to/cerc-io/laconic2d/x/registry" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // RegisterInvariants registers all registry invariants
 | ||||||
|  | func RegisterInvariants(ir sdk.InvariantRegistry, k Keeper) { | ||||||
|  | 	ir.RegisterRoute(types.ModuleName, "module-account", ModuleAccountInvariant(&k)) | ||||||
|  | 	ir.RegisterRoute(types.ModuleName, "record-bond", RecordBondInvariant(&k)) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // AllInvariants runs all invariants of the registry module.
 | ||||||
|  | func AllInvariants(k *Keeper) sdk.Invariant { | ||||||
|  | 	return func(ctx sdk.Context) (string, bool) { | ||||||
|  | 		res, stop := ModuleAccountInvariant(k)(ctx) | ||||||
|  | 		if stop { | ||||||
|  | 			return res, stop | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		return RecordBondInvariant(k)(ctx) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // ModuleAccountInvariant checks that the 'registry' module account balance is non-negative.
 | ||||||
|  | func ModuleAccountInvariant(k *Keeper) sdk.Invariant { | ||||||
|  | 	return func(ctx sdk.Context) (string, bool) { | ||||||
|  | 		moduleAddress := k.accountKeeper.GetModuleAddress(types.ModuleName) | ||||||
|  | 		if k.bankKeeper.GetAllBalances(ctx, moduleAddress).IsAnyNegative() { | ||||||
|  | 			return sdk.FormatInvariant( | ||||||
|  | 				types.ModuleName, | ||||||
|  | 				"module-account", | ||||||
|  | 				fmt.Sprintf("Module account '%s' has negative balance.", types.ModuleName), | ||||||
|  | 			), true | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		return "", false | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // RecordBondInvariant checks that for every record:
 | ||||||
|  | // if bondId is not null, associated bond exists
 | ||||||
|  | func RecordBondInvariant(k *Keeper) sdk.Invariant { | ||||||
|  | 	return func(ctx sdk.Context) (string, bool) { | ||||||
|  | 		err := k.Records.Walk(ctx, nil, func(key string, record types.Record) (bool, error) { | ||||||
|  | 			if record.BondId != "" { | ||||||
|  | 				bondExists, err := k.bondKeeper.HasBond(ctx, record.BondId) | ||||||
|  | 				if err != nil { | ||||||
|  | 					return true, err | ||||||
|  | 				} | ||||||
|  | 
 | ||||||
|  | 				if !bondExists { | ||||||
|  | 					return true, errors.New(record.Id) | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			return false, nil | ||||||
|  | 		}) | ||||||
|  | 
 | ||||||
|  | 		if err != nil { | ||||||
|  | 			return sdk.FormatInvariant( | ||||||
|  | 				types.ModuleName, | ||||||
|  | 				"record-bond", | ||||||
|  | 				fmt.Sprintf("Bond not found for record id: '%s'.", err.Error()), | ||||||
|  | 			), true | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		return "", false | ||||||
|  | 	} | ||||||
|  | } | ||||||
| @ -20,6 +20,10 @@ func NewMsgServerImpl(keeper Keeper) registrytypes.MsgServer { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (ms msgServer) SetRecord(c context.Context, msg *registrytypes.MsgSetRecord) (*registrytypes.MsgSetRecordResponse, error) { | func (ms msgServer) SetRecord(c context.Context, msg *registrytypes.MsgSetRecord) (*registrytypes.MsgSetRecordResponse, error) { | ||||||
|  | 	if err := msg.ValidateBasic(); err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	ctx := sdk.UnwrapSDKContext(c) | 	ctx := sdk.UnwrapSDKContext(c) | ||||||
| 
 | 
 | ||||||
| 	_, err := sdk.AccAddressFromBech32(msg.Signer) | 	_, err := sdk.AccAddressFromBech32(msg.Signer) | ||||||
| @ -51,6 +55,10 @@ func (ms msgServer) SetRecord(c context.Context, msg *registrytypes.MsgSetRecord | |||||||
| 
 | 
 | ||||||
| // nolint: all
 | // nolint: all
 | ||||||
| func (ms msgServer) SetName(c context.Context, msg *registrytypes.MsgSetName) (*registrytypes.MsgSetNameResponse, error) { | func (ms msgServer) SetName(c context.Context, msg *registrytypes.MsgSetName) (*registrytypes.MsgSetNameResponse, error) { | ||||||
|  | 	if err := msg.ValidateBasic(); err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	ctx := sdk.UnwrapSDKContext(c) | 	ctx := sdk.UnwrapSDKContext(c) | ||||||
| 
 | 
 | ||||||
| 	_, err := sdk.AccAddressFromBech32(msg.Signer) | 	_, err := sdk.AccAddressFromBech32(msg.Signer) | ||||||
| @ -80,6 +88,10 @@ func (ms msgServer) SetName(c context.Context, msg *registrytypes.MsgSetName) (* | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (ms msgServer) ReserveName(c context.Context, msg *registrytypes.MsgReserveAuthority) (*registrytypes.MsgReserveAuthorityResponse, error) { | func (ms msgServer) ReserveName(c context.Context, msg *registrytypes.MsgReserveAuthority) (*registrytypes.MsgReserveAuthorityResponse, error) { | ||||||
|  | 	if err := msg.ValidateBasic(); err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	ctx := sdk.UnwrapSDKContext(c) | 	ctx := sdk.UnwrapSDKContext(c) | ||||||
| 
 | 
 | ||||||
| 	_, err := sdk.AccAddressFromBech32(msg.Signer) | 	_, err := sdk.AccAddressFromBech32(msg.Signer) | ||||||
| @ -114,6 +126,10 @@ func (ms msgServer) ReserveName(c context.Context, msg *registrytypes.MsgReserve | |||||||
| 
 | 
 | ||||||
| // nolint: all
 | // nolint: all
 | ||||||
| func (ms msgServer) SetAuthorityBond(c context.Context, msg *registrytypes.MsgSetAuthorityBond) (*registrytypes.MsgSetAuthorityBondResponse, error) { | func (ms msgServer) SetAuthorityBond(c context.Context, msg *registrytypes.MsgSetAuthorityBond) (*registrytypes.MsgSetAuthorityBondResponse, error) { | ||||||
|  | 	if err := msg.ValidateBasic(); err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	ctx := sdk.UnwrapSDKContext(c) | 	ctx := sdk.UnwrapSDKContext(c) | ||||||
| 
 | 
 | ||||||
| 	_, err := sdk.AccAddressFromBech32(msg.Signer) | 	_, err := sdk.AccAddressFromBech32(msg.Signer) | ||||||
| @ -144,6 +160,10 @@ func (ms msgServer) SetAuthorityBond(c context.Context, msg *registrytypes.MsgSe | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (ms msgServer) DeleteName(c context.Context, msg *registrytypes.MsgDeleteNameAuthority) (*registrytypes.MsgDeleteNameAuthorityResponse, error) { | func (ms msgServer) DeleteName(c context.Context, msg *registrytypes.MsgDeleteNameAuthority) (*registrytypes.MsgDeleteNameAuthorityResponse, error) { | ||||||
|  | 	if err := msg.ValidateBasic(); err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	ctx := sdk.UnwrapSDKContext(c) | 	ctx := sdk.UnwrapSDKContext(c) | ||||||
| 
 | 
 | ||||||
| 	_, err := sdk.AccAddressFromBech32(msg.Signer) | 	_, err := sdk.AccAddressFromBech32(msg.Signer) | ||||||
| @ -172,6 +192,10 @@ func (ms msgServer) DeleteName(c context.Context, msg *registrytypes.MsgDeleteNa | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (ms msgServer) RenewRecord(c context.Context, msg *registrytypes.MsgRenewRecord) (*registrytypes.MsgRenewRecordResponse, error) { | func (ms msgServer) RenewRecord(c context.Context, msg *registrytypes.MsgRenewRecord) (*registrytypes.MsgRenewRecordResponse, error) { | ||||||
|  | 	if err := msg.ValidateBasic(); err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	ctx := sdk.UnwrapSDKContext(c) | 	ctx := sdk.UnwrapSDKContext(c) | ||||||
| 
 | 
 | ||||||
| 	_, err := sdk.AccAddressFromBech32(msg.Signer) | 	_, err := sdk.AccAddressFromBech32(msg.Signer) | ||||||
| @ -201,6 +225,10 @@ func (ms msgServer) RenewRecord(c context.Context, msg *registrytypes.MsgRenewRe | |||||||
| 
 | 
 | ||||||
| // nolint: all
 | // nolint: all
 | ||||||
| func (ms msgServer) AssociateBond(c context.Context, msg *registrytypes.MsgAssociateBond) (*registrytypes.MsgAssociateBondResponse, error) { | func (ms msgServer) AssociateBond(c context.Context, msg *registrytypes.MsgAssociateBond) (*registrytypes.MsgAssociateBondResponse, error) { | ||||||
|  | 	if err := msg.ValidateBasic(); err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	ctx := sdk.UnwrapSDKContext(c) | 	ctx := sdk.UnwrapSDKContext(c) | ||||||
| 
 | 
 | ||||||
| 	_, err := sdk.AccAddressFromBech32(msg.Signer) | 	_, err := sdk.AccAddressFromBech32(msg.Signer) | ||||||
| @ -231,6 +259,10 @@ func (ms msgServer) AssociateBond(c context.Context, msg *registrytypes.MsgAssoc | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (ms msgServer) DissociateBond(c context.Context, msg *registrytypes.MsgDissociateBond) (*registrytypes.MsgDissociateBondResponse, error) { | func (ms msgServer) DissociateBond(c context.Context, msg *registrytypes.MsgDissociateBond) (*registrytypes.MsgDissociateBondResponse, error) { | ||||||
|  | 	if err := msg.ValidateBasic(); err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	ctx := sdk.UnwrapSDKContext(c) | 	ctx := sdk.UnwrapSDKContext(c) | ||||||
| 
 | 
 | ||||||
| 	_, err := sdk.AccAddressFromBech32(msg.Signer) | 	_, err := sdk.AccAddressFromBech32(msg.Signer) | ||||||
| @ -260,6 +292,10 @@ func (ms msgServer) DissociateBond(c context.Context, msg *registrytypes.MsgDiss | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (ms msgServer) DissociateRecords(c context.Context, msg *registrytypes.MsgDissociateRecords) (*registrytypes.MsgDissociateRecordsResponse, error) { | func (ms msgServer) DissociateRecords(c context.Context, msg *registrytypes.MsgDissociateRecords) (*registrytypes.MsgDissociateRecordsResponse, error) { | ||||||
|  | 	if err := msg.ValidateBasic(); err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	ctx := sdk.UnwrapSDKContext(c) | 	ctx := sdk.UnwrapSDKContext(c) | ||||||
| 
 | 
 | ||||||
| 	_, err := sdk.AccAddressFromBech32(msg.Signer) | 	_, err := sdk.AccAddressFromBech32(msg.Signer) | ||||||
| @ -289,6 +325,10 @@ func (ms msgServer) DissociateRecords(c context.Context, msg *registrytypes.MsgD | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (ms msgServer) ReassociateRecords(c context.Context, msg *registrytypes.MsgReassociateRecords) (*registrytypes.MsgReassociateRecordsResponse, error) { //nolint: all
 | func (ms msgServer) ReassociateRecords(c context.Context, msg *registrytypes.MsgReassociateRecords) (*registrytypes.MsgReassociateRecordsResponse, error) { //nolint: all
 | ||||||
|  | 	if err := msg.ValidateBasic(); err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	ctx := sdk.UnwrapSDKContext(c) | 	ctx := sdk.UnwrapSDKContext(c) | ||||||
| 
 | 
 | ||||||
| 	_, err := sdk.AccAddressFromBech32(msg.Signer) | 	_, err := sdk.AccAddressFromBech32(msg.Signer) | ||||||
|  | |||||||
| @ -27,6 +27,7 @@ var ( | |||||||
| 	_ module.HasServices         = AppModule{} | 	_ module.HasServices         = AppModule{} | ||||||
| 	_ module.HasConsensusVersion = AppModule{} | 	_ module.HasConsensusVersion = AppModule{} | ||||||
| 	_ appmodule.HasEndBlocker    = AppModule{} | 	_ appmodule.HasEndBlocker    = AppModule{} | ||||||
|  | 	_ module.HasInvariants       = AppModule{} | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // ConsensusVersion defines the current module consensus version.
 | // ConsensusVersion defines the current module consensus version.
 | ||||||
| @ -127,6 +128,12 @@ func (am AppModule) EndBlock(ctx context.Context) error { | |||||||
| 	return EndBlocker(ctx, am.keeper) | 	return EndBlocker(ctx, am.keeper) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // module.HasInvariants
 | ||||||
|  | 
 | ||||||
|  | func (am AppModule) RegisterInvariants(ir sdk.InvariantRegistry) { | ||||||
|  | 	keeper.RegisterInvariants(ir, am.keeper) | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // Get the root tx command of this module
 | // Get the root tx command of this module
 | ||||||
| func (AppModule) GetTxCmd() *cobra.Command { | func (AppModule) GetTxCmd() *cobra.Command { | ||||||
| 	return cli.GetTxCmd() | 	return cli.GetTxCmd() | ||||||
|  | |||||||
| @ -1,6 +1,8 @@ | |||||||
| package registry | package registry | ||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
|  | 	"net/url" | ||||||
|  | 
 | ||||||
| 	errorsmod "cosmossdk.io/errors" | 	errorsmod "cosmossdk.io/errors" | ||||||
| 	sdk "github.com/cosmos/cosmos-sdk/types" | 	sdk "github.com/cosmos/cosmos-sdk/types" | ||||||
| 	sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" | 	sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" | ||||||
| @ -34,6 +36,18 @@ func (msg MsgSetRecord) ValidateBasic() error { | |||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func (msg MsgRenewRecord) ValidateBasic() error { | ||||||
|  | 	if len(msg.RecordId) == 0 { | ||||||
|  | 		return errorsmod.Wrap(sdkerrors.ErrInvalidRequest, "record id is required.") | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if len(msg.Signer) == 0 { | ||||||
|  | 		return errorsmod.Wrap(sdkerrors.ErrInvalidAddress, "invalid signer.") | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // NewMsgReserveAuthority is the constructor function for MsgReserveName.
 | // NewMsgReserveAuthority is the constructor function for MsgReserveName.
 | ||||||
| func NewMsgReserveAuthority(name string, signer sdk.AccAddress, owner sdk.AccAddress) MsgReserveAuthority { | func NewMsgReserveAuthority(name string, signer sdk.AccAddress, owner sdk.AccAddress) MsgReserveAuthority { | ||||||
| 	return MsgReserveAuthority{ | 	return MsgReserveAuthority{ | ||||||
| @ -65,6 +79,22 @@ func NewMsgSetAuthorityBond(name string, bondID string, signer sdk.AccAddress) M | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func (msg MsgSetAuthorityBond) ValidateBasic() error { | ||||||
|  | 	if len(msg.Name) == 0 { | ||||||
|  | 		return errorsmod.Wrap(sdkerrors.ErrInvalidRequest, "name is required.") | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if len(msg.Signer) == 0 { | ||||||
|  | 		return errorsmod.Wrap(sdkerrors.ErrInvalidAddress, "invalid signer.") | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if len(msg.BondId) == 0 { | ||||||
|  | 		return errorsmod.Wrap(sdkerrors.ErrInvalidAddress, "bond id is required.") | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // NewMsgSetName is the constructor function for MsgSetName.
 | // NewMsgSetName is the constructor function for MsgSetName.
 | ||||||
| func NewMsgSetName(lrn string, cid string, signer sdk.AccAddress) *MsgSetName { | func NewMsgSetName(lrn string, cid string, signer sdk.AccAddress) *MsgSetName { | ||||||
| 	return &MsgSetName{ | 	return &MsgSetName{ | ||||||
| @ -90,3 +120,70 @@ func (msg MsgSetName) ValidateBasic() error { | |||||||
| 
 | 
 | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | func (msg MsgDeleteNameAuthority) ValidateBasic() error { | ||||||
|  | 	if len(msg.Lrn) == 0 { | ||||||
|  | 		return errorsmod.Wrap(sdkerrors.ErrInvalidRequest, "lrn is required.") | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if len(msg.Signer) == 0 { | ||||||
|  | 		return errorsmod.Wrap(sdkerrors.ErrInvalidAddress, "invalid signer.") | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	_, err := url.Parse(msg.Lrn) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return errorsmod.Wrap(sdkerrors.ErrInvalidRequest, "invalid lrn.") | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (msg MsgAssociateBond) ValidateBasic() error { | ||||||
|  | 	if len(msg.RecordId) == 0 { | ||||||
|  | 		return errorsmod.Wrap(sdkerrors.ErrInvalidRequest, "record id is required.") | ||||||
|  | 	} | ||||||
|  | 	if len(msg.BondId) == 0 { | ||||||
|  | 		return errorsmod.Wrap(sdkerrors.ErrInvalidRequest, "bond id is required.") | ||||||
|  | 	} | ||||||
|  | 	if len(msg.Signer) == 0 { | ||||||
|  | 		return errorsmod.Wrap(sdkerrors.ErrInvalidAddress, "invalid signer.") | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (msg MsgDissociateBond) ValidateBasic() error { | ||||||
|  | 	if len(msg.RecordId) == 0 { | ||||||
|  | 		return errorsmod.Wrap(sdkerrors.ErrInvalidRequest, "record id is required.") | ||||||
|  | 	} | ||||||
|  | 	if len(msg.Signer) == 0 { | ||||||
|  | 		return errorsmod.Wrap(sdkerrors.ErrInvalidAddress, "invalid signer.") | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (msg MsgDissociateRecords) ValidateBasic() error { | ||||||
|  | 	if len(msg.BondId) == 0 { | ||||||
|  | 		return errorsmod.Wrap(sdkerrors.ErrInvalidRequest, "bond id is required.") | ||||||
|  | 	} | ||||||
|  | 	if len(msg.Signer) == 0 { | ||||||
|  | 		return errorsmod.Wrap(sdkerrors.ErrInvalidAddress, "invalid signer.") | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (msg MsgReassociateRecords) ValidateBasic() error { | ||||||
|  | 	if len(msg.OldBondId) == 0 { | ||||||
|  | 		return errorsmod.Wrap(sdkerrors.ErrInvalidRequest, "old-bond-id is required.") | ||||||
|  | 	} | ||||||
|  | 	if len(msg.NewBondId) == 0 { | ||||||
|  | 		return errorsmod.Wrap(sdkerrors.ErrInvalidRequest, "new-bond-id is required.") | ||||||
|  | 	} | ||||||
|  | 	if len(msg.Signer) == 0 { | ||||||
|  | 		return errorsmod.Wrap(sdkerrors.ErrInvalidAddress, "invalid signer.") | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user