mirror of
https://github.com/0glabs/0g-chain.git
synced 2024-12-25 07:45:18 +00:00
add custom errors
This commit is contained in:
parent
e228aa6659
commit
074bb246a8
@ -217,7 +217,8 @@ func NewApp(logger log.Logger, db dbm.DB, traceStore io.Writer, loadLatest bool,
|
||||
app.committeeKeeper = committee.NewKeeper(
|
||||
app.cdc,
|
||||
keys[committee.StoreKey],
|
||||
committeeGovRouter) // TODO blacklist module addresses?)
|
||||
committeeGovRouter,
|
||||
committee.DefaultCodespace) // TODO blacklist module addresses?)
|
||||
govRouter := gov.NewRouter()
|
||||
govRouter.
|
||||
AddRoute(gov.RouterKey, gov.ProposalHandler).
|
||||
|
@ -16,6 +16,11 @@ const (
|
||||
AttributeValueProposalFailed = types.AttributeValueProposalFailed
|
||||
AttributeValueProposalPassed = types.AttributeValueProposalPassed
|
||||
AttributeValueProposalTimeout = types.AttributeValueProposalTimeout
|
||||
CodeInvalidCommittee = types.CodeInvalidCommittee
|
||||
CodeInvalidGenesis = types.CodeInvalidGenesis
|
||||
CodeInvalidProposal = types.CodeInvalidProposal
|
||||
CodeProposalExpired = types.CodeProposalExpired
|
||||
CodeUnknownItem = types.CodeUnknownItem
|
||||
DefaultCodespace = types.DefaultCodespace
|
||||
DefaultNextProposalID = types.DefaultNextProposalID
|
||||
DefaultParamspace = types.DefaultParamspace
|
||||
@ -45,6 +50,14 @@ var (
|
||||
NewKeeper = keeper.NewKeeper
|
||||
NewQuerier = keeper.NewQuerier
|
||||
DefaultGenesisState = types.DefaultGenesisState
|
||||
ErrInvalidCommittee = types.ErrInvalidCommittee
|
||||
ErrInvalidGenesis = types.ErrInvalidGenesis
|
||||
ErrInvalidPubProposal = types.ErrInvalidPubProposal
|
||||
ErrNoProposalHandlerExists = types.ErrNoProposalHandlerExists
|
||||
ErrProposalExpired = types.ErrProposalExpired
|
||||
ErrUnknownCommittee = types.ErrUnknownCommittee
|
||||
ErrUnknownProposal = types.ErrUnknownProposal
|
||||
ErrUnknownVote = types.ErrUnknownVote
|
||||
GetKeyFromID = types.GetKeyFromID
|
||||
GetVoteKey = types.GetVoteKey
|
||||
NewCommittee = types.NewCommittee
|
||||
|
@ -50,7 +50,7 @@ func handleMsgVote(ctx sdk.Context, k keeper.Keeper, msg types.MsgVote) sdk.Resu
|
||||
// get the proposal just to add fields to the event
|
||||
proposal, found := k.GetProposal(ctx, msg.ProposalID)
|
||||
if !found {
|
||||
return sdk.ErrInternal("proposal not found").Result()
|
||||
return ErrUnknownProposal(DefaultCodespace, msg.ProposalID).Result()
|
||||
}
|
||||
|
||||
err := k.AddVote(ctx, msg.ProposalID, msg.Voter)
|
||||
|
@ -12,22 +12,24 @@ import (
|
||||
)
|
||||
|
||||
type Keeper struct {
|
||||
cdc *codec.Codec
|
||||
storeKey sdk.StoreKey
|
||||
cdc *codec.Codec
|
||||
storeKey sdk.StoreKey
|
||||
codespace sdk.CodespaceType
|
||||
|
||||
// Proposal router
|
||||
router govtypes.Router
|
||||
}
|
||||
|
||||
func NewKeeper(cdc *codec.Codec, storeKey sdk.StoreKey, router govtypes.Router) Keeper {
|
||||
func NewKeeper(cdc *codec.Codec, storeKey sdk.StoreKey, router govtypes.Router, codespace sdk.CodespaceType) Keeper {
|
||||
// Logic in the keeper methods assume the set of gov handlers is fixed.
|
||||
// So the gov router must be sealed so no handlers can be added or removed after the keeper is created.
|
||||
router.Seal()
|
||||
|
||||
return Keeper{
|
||||
cdc: cdc,
|
||||
storeKey: storeKey,
|
||||
router: router,
|
||||
cdc: cdc,
|
||||
storeKey: storeKey,
|
||||
codespace: codespace,
|
||||
router: router,
|
||||
}
|
||||
}
|
||||
|
||||
@ -87,7 +89,7 @@ func (k Keeper) GetNextProposalID(ctx sdk.Context) (uint64, sdk.Error) {
|
||||
store := ctx.KVStore(k.storeKey)
|
||||
bz := store.Get(types.NextProposalIDKey)
|
||||
if bz == nil {
|
||||
return 0, sdk.ErrInternal("proposal ID not set at genesis")
|
||||
return 0, types.ErrInvalidGenesis(k.codespace, "next proposal ID not set at genesis")
|
||||
}
|
||||
return types.Uint64FromBytes(bz), nil
|
||||
}
|
||||
|
@ -13,15 +13,15 @@ func (k Keeper) SubmitProposal(ctx sdk.Context, proposer sdk.AccAddress, committ
|
||||
// Limit proposals to only be submitted by committee members
|
||||
com, found := k.GetCommittee(ctx, committeeID)
|
||||
if !found {
|
||||
return 0, sdk.ErrInternal("committee doesn't exist")
|
||||
return 0, types.ErrUnknownCommittee(k.codespace, committeeID)
|
||||
}
|
||||
if !com.HasMember(proposer) {
|
||||
return 0, sdk.ErrInternal("only member can propose proposals")
|
||||
return 0, sdk.ErrUnauthorized("proposer not member of committee")
|
||||
}
|
||||
|
||||
// Check committee has permissions to enact proposal.
|
||||
if !com.HasPermissionsFor(pubProposal) {
|
||||
return 0, sdk.ErrInternal("committee does not have permissions to enact proposal")
|
||||
return 0, sdk.ErrUnauthorized("committee does not have permissions to enact proposal")
|
||||
}
|
||||
|
||||
// Check proposal is valid
|
||||
@ -51,17 +51,17 @@ func (k Keeper) AddVote(ctx sdk.Context, proposalID uint64, voter sdk.AccAddress
|
||||
// Validate
|
||||
pr, found := k.GetProposal(ctx, proposalID)
|
||||
if !found {
|
||||
return sdk.ErrInternal("proposal not found")
|
||||
return types.ErrUnknownProposal(k.codespace, proposalID)
|
||||
}
|
||||
if pr.HasExpiredBy(ctx.BlockTime()) {
|
||||
return sdk.ErrInternal("proposal expired")
|
||||
return types.ErrProposalExpired(k.codespace, ctx.BlockTime(), pr.Deadline)
|
||||
}
|
||||
com, found := k.GetCommittee(ctx, pr.CommitteeID)
|
||||
if !found {
|
||||
return sdk.ErrInternal("committee disbanded")
|
||||
return types.ErrUnknownCommittee(k.codespace, pr.CommitteeID)
|
||||
}
|
||||
if !com.HasMember(voter) {
|
||||
return sdk.ErrInternal("not authorized to vote on proposal")
|
||||
return sdk.ErrUnauthorized("voter must be a member of committee")
|
||||
}
|
||||
|
||||
// Store vote, overwriting any prior vote
|
||||
@ -81,11 +81,11 @@ func (k Keeper) AddVote(ctx sdk.Context, proposalID uint64, voter sdk.AccAddress
|
||||
func (k Keeper) GetProposalResult(ctx sdk.Context, proposalID uint64) (bool, sdk.Error) {
|
||||
pr, found := k.GetProposal(ctx, proposalID)
|
||||
if !found {
|
||||
return false, sdk.ErrInternal("proposal not found")
|
||||
return false, types.ErrUnknownProposal(k.codespace, proposalID)
|
||||
}
|
||||
com, found := k.GetCommittee(ctx, pr.CommitteeID)
|
||||
if !found {
|
||||
return false, sdk.ErrInternal("committee disbanded")
|
||||
return false, types.ErrUnknownCommittee(k.codespace, pr.CommitteeID)
|
||||
}
|
||||
|
||||
numVotes := k.TallyVotes(ctx, proposalID)
|
||||
@ -111,7 +111,7 @@ func (k Keeper) TallyVotes(ctx sdk.Context, proposalID uint64) int64 {
|
||||
func (k Keeper) EnactProposal(ctx sdk.Context, proposalID uint64) sdk.Error {
|
||||
pr, found := k.GetProposal(ctx, proposalID)
|
||||
if !found {
|
||||
return sdk.ErrInternal("proposal not found")
|
||||
return types.ErrUnknownProposal(k.codespace, proposalID)
|
||||
}
|
||||
|
||||
// Run the proposal's changes through the associated handler, but using a cached version of state to ensure changes are not permanent if an error occurs.
|
||||
@ -128,14 +128,14 @@ func (k Keeper) EnactProposal(ctx sdk.Context, proposalID uint64) sdk.Error {
|
||||
// ValidatePubProposal checks if a pubproposal is valid.
|
||||
func (k Keeper) ValidatePubProposal(ctx sdk.Context, pubProposal types.PubProposal) sdk.Error {
|
||||
if pubProposal == nil {
|
||||
return sdk.ErrInternal("proposal is empty")
|
||||
return types.ErrInvalidPubProposal(k.codespace, "pub proposal cannot be nil")
|
||||
}
|
||||
if err := pubProposal.ValidateBasic(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if !k.router.HasRoute(pubProposal.ProposalRoute()) {
|
||||
return sdk.ErrInternal("no handler found for proposal")
|
||||
return types.ErrNoProposalHandlerExists(k.codespace, pubProposal)
|
||||
}
|
||||
|
||||
// Run the proposal's changes through the associated handler using a cached version of state to ensure changes are not permanent.
|
||||
|
@ -29,8 +29,6 @@ func NewQuerier(keeper Keeper) sdk.Querier {
|
||||
return queryVote(ctx, path[1:], req, keeper)
|
||||
case types.QueryTally:
|
||||
return queryTally(ctx, path[1:], req, keeper)
|
||||
// case types.QueryParams:
|
||||
// return queryParams(ctx, path[1:], req, keeper)
|
||||
|
||||
default:
|
||||
return nil, sdk.ErrUnknownRequest(fmt.Sprintf("unknown %s query endpoint", types.ModuleName))
|
||||
@ -64,7 +62,7 @@ func queryCommittee(ctx sdk.Context, path []string, req abci.RequestQuery, keepe
|
||||
|
||||
committee, found := keeper.GetCommittee(ctx, params.CommitteeID)
|
||||
if !found {
|
||||
return nil, sdk.ErrInternal("not found") ///types.ErrUnknownProposal(types.DefaultCodespace, params.ProposalID)
|
||||
return nil, types.ErrUnknownCommittee(types.DefaultCodespace, params.CommitteeID)
|
||||
}
|
||||
|
||||
bz, err := codec.MarshalJSONIndent(keeper.cdc, committee)
|
||||
@ -107,7 +105,7 @@ func queryProposal(ctx sdk.Context, path []string, req abci.RequestQuery, keeper
|
||||
|
||||
proposal, found := keeper.GetProposal(ctx, params.ProposalID)
|
||||
if !found {
|
||||
return nil, sdk.ErrInternal("not found") // TODO types.ErrUnknownProposal(types.DefaultCodespace, params.ProposalID)
|
||||
return nil, types.ErrUnknownProposal(types.DefaultCodespace, params.ProposalID)
|
||||
}
|
||||
|
||||
bz, err := codec.MarshalJSONIndent(keeper.cdc, proposal)
|
||||
@ -149,7 +147,7 @@ func queryVote(ctx sdk.Context, path []string, req abci.RequestQuery, keeper Kee
|
||||
|
||||
vote, found := keeper.GetVote(ctx, params.ProposalID, params.Voter)
|
||||
if !found {
|
||||
return nil, sdk.ErrInternal("not found")
|
||||
return nil, types.ErrUnknownVote(types.DefaultCodespace, params.ProposalID, params.Voter)
|
||||
}
|
||||
|
||||
bz, err := codec.MarshalJSONIndent(keeper.cdc, vote)
|
||||
@ -170,7 +168,7 @@ func queryTally(ctx sdk.Context, path []string, req abci.RequestQuery, keeper Ke
|
||||
|
||||
_, found := keeper.GetProposal(ctx, params.ProposalID)
|
||||
if !found {
|
||||
return nil, sdk.ErrInternal("proposal not found")
|
||||
return nil, types.ErrUnknownProposal(types.DefaultCodespace, params.ProposalID)
|
||||
}
|
||||
numVotes := keeper.TallyVotes(ctx, params.ProposalID)
|
||||
|
||||
@ -180,30 +178,3 @@ func queryTally(ctx sdk.Context, path []string, req abci.RequestQuery, keeper Ke
|
||||
}
|
||||
return bz, nil
|
||||
}
|
||||
|
||||
// ---------- Params ----------
|
||||
|
||||
// func queryParams(ctx sdk.Context, path []string, req abci.RequestQuery, keeper Keeper) ([]byte, sdk.Error) {
|
||||
// switch path[0] {
|
||||
// case types.ParamDeposit:
|
||||
// bz, err := codec.MarshalJSONIndent(keeper.cdc, keeper.GetDepositParams(ctx))
|
||||
// if err != nil {
|
||||
// return nil, sdk.ErrInternal(sdk.AppendMsgToErr("could not marshal result to JSON", err.Error()))
|
||||
// }
|
||||
// return bz, nil
|
||||
// case types.ParamVoting:
|
||||
// bz, err := codec.MarshalJSONIndent(keeper.cdc, keeper.GetVotingParams(ctx))
|
||||
// if err != nil {
|
||||
// return nil, sdk.ErrInternal(sdk.AppendMsgToErr("could not marshal result to JSON", err.Error()))
|
||||
// }
|
||||
// return bz, nil
|
||||
// case types.ParamTallying:
|
||||
// bz, err := codec.MarshalJSONIndent(keeper.cdc, keeper.GetTallyParams(ctx))
|
||||
// if err != nil {
|
||||
// return nil, sdk.ErrInternal(sdk.AppendMsgToErr("could not marshal result to JSON", err.Error()))
|
||||
// }
|
||||
// return bz, nil
|
||||
// default:
|
||||
// return nil, sdk.ErrUnknownRequest(fmt.Sprintf("%s is not a valid query request path", req.Path))
|
||||
// }
|
||||
// }
|
||||
|
@ -24,7 +24,7 @@ func NewProposalHandler(k Keeper) govtypes.Handler {
|
||||
|
||||
func handleCommitteeChangeProposal(ctx sdk.Context, k Keeper, committeeProposal CommitteeChangeProposal) sdk.Error {
|
||||
if err := committeeProposal.ValidateBasic(); err != nil {
|
||||
return sdk.ErrInternal(err.Error())
|
||||
return ErrInvalidCommittee(DefaultCodespace, err.Error())
|
||||
}
|
||||
|
||||
// Remove all committee's ongoing proposals
|
||||
@ -46,7 +46,7 @@ func handleCommitteeChangeProposal(ctx sdk.Context, k Keeper, committeeProposal
|
||||
|
||||
func handleCommitteeDeleteProposal(ctx sdk.Context, k Keeper, committeeProposal CommitteeDeleteProposal) sdk.Error {
|
||||
if err := committeeProposal.ValidateBasic(); err != nil {
|
||||
return sdk.ErrInternal(err.Error())
|
||||
return ErrInvalidPubProposal(DefaultCodespace, err.Error())
|
||||
}
|
||||
|
||||
// Remove all committee's ongoing proposals
|
||||
|
@ -1,9 +1,50 @@
|
||||
package types
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
)
|
||||
|
||||
const (
|
||||
DefaultCodespace sdk.CodespaceType = ModuleName
|
||||
|
||||
CodeProposalExpired sdk.CodeType = 1
|
||||
CodeUnknownItem sdk.CodeType = 2
|
||||
CodeInvalidGenesis sdk.CodeType = 3
|
||||
CodeInvalidProposal sdk.CodeType = 4
|
||||
CodeInvalidCommittee sdk.CodeType = 5
|
||||
)
|
||||
|
||||
func ErrUnknownCommittee(codespace sdk.CodespaceType, id uint64) sdk.Error {
|
||||
return sdk.NewError(codespace, CodeUnknownItem, fmt.Sprintf("committee with id '%d' not found", id))
|
||||
}
|
||||
|
||||
func ErrInvalidCommittee(codespace sdk.CodespaceType, msg string) sdk.Error {
|
||||
return sdk.NewError(codespace, CodeInvalidCommittee, msg)
|
||||
}
|
||||
|
||||
func ErrUnknownProposal(codespace sdk.CodespaceType, id uint64) sdk.Error {
|
||||
return sdk.NewError(codespace, CodeUnknownItem, fmt.Sprintf("proposal with id '%d' not found", id))
|
||||
}
|
||||
|
||||
func ErrProposalExpired(codespace sdk.CodespaceType, blockTime, expiry time.Time) sdk.Error {
|
||||
return sdk.NewError(codespace, CodeProposalExpired, fmt.Sprintf("proposal expired at %s, current blocktime %s", expiry, blockTime))
|
||||
}
|
||||
|
||||
func ErrInvalidPubProposal(codespace sdk.CodespaceType, msg string) sdk.Error {
|
||||
return sdk.NewError(codespace, CodeInvalidProposal, msg)
|
||||
}
|
||||
|
||||
func ErrUnknownVote(codespace sdk.CodespaceType, proposalID uint64, voter sdk.AccAddress) sdk.Error {
|
||||
return sdk.NewError(codespace, CodeUnknownItem, fmt.Sprintf("vote with for proposal '%d' and voter %s not found", proposalID, voter))
|
||||
}
|
||||
|
||||
func ErrInvalidGenesis(codespace sdk.CodespaceType, msg string) sdk.Error {
|
||||
return sdk.NewError(codespace, CodeInvalidGenesis, msg)
|
||||
}
|
||||
|
||||
func ErrNoProposalHandlerExists(codespace sdk.CodespaceType, content interface{}) sdk.Error {
|
||||
return sdk.NewError(codespace, CodeUnknownItem, fmt.Sprintf("'%T' does not have a corresponding handler", content))
|
||||
}
|
||||
|
@ -53,7 +53,7 @@ func (ccp CommitteeChangeProposal) ValidateBasic() sdk.Error {
|
||||
return err
|
||||
}
|
||||
if err := ccp.NewCommittee.Validate(); err != nil {
|
||||
return sdk.ErrInternal(err.Error())
|
||||
return ErrInvalidCommittee(DefaultCodespace, err.Error())
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
@ -36,7 +36,7 @@ func (msg MsgSubmitProposal) Type() string { return TypeMsgSubmitProposal }
|
||||
// ValidateBasic does a simple validation check that doesn't require access to any other information.
|
||||
func (msg MsgSubmitProposal) ValidateBasic() sdk.Error {
|
||||
if msg.PubProposal == nil {
|
||||
return sdk.ErrInternal("no proposal")
|
||||
return ErrInvalidPubProposal(DefaultCodespace, "pub proposal cannot be nil")
|
||||
}
|
||||
if msg.Proposer.Empty() {
|
||||
return sdk.ErrInvalidAddress(msg.Proposer.String())
|
||||
|
Loading…
Reference in New Issue
Block a user