mirror of
				https://github.com/0glabs/0g-chain.git
				synced 2025-11-04 12:57:27 +00:00 
			
		
		
		
	improve permission types
This commit is contained in:
		
							parent
							
								
									c50f6bc9fa
								
							
						
					
					
						commit
						77553ed299
					
				@ -38,6 +38,7 @@ var (
 | 
				
			|||||||
	DefaultGenesisState        = types.DefaultGenesisState
 | 
						DefaultGenesisState        = types.DefaultGenesisState
 | 
				
			||||||
	GetKeyFromID               = types.GetKeyFromID
 | 
						GetKeyFromID               = types.GetKeyFromID
 | 
				
			||||||
	GetVoteKey                 = types.GetVoteKey
 | 
						GetVoteKey                 = types.GetVoteKey
 | 
				
			||||||
 | 
						NewCommittee               = types.NewCommittee
 | 
				
			||||||
	NewCommitteeChangeProposal = types.NewCommitteeChangeProposal
 | 
						NewCommitteeChangeProposal = types.NewCommitteeChangeProposal
 | 
				
			||||||
	NewCommitteeDeleteProposal = types.NewCommitteeDeleteProposal
 | 
						NewCommitteeDeleteProposal = types.NewCommitteeDeleteProposal
 | 
				
			||||||
	NewGenesisState            = types.NewGenesisState
 | 
						NewGenesisState            = types.NewGenesisState
 | 
				
			||||||
@ -46,7 +47,9 @@ var (
 | 
				
			|||||||
	NewQueryCommitteeParams    = types.NewQueryCommitteeParams
 | 
						NewQueryCommitteeParams    = types.NewQueryCommitteeParams
 | 
				
			||||||
	NewQueryProposalParams     = types.NewQueryProposalParams
 | 
						NewQueryProposalParams     = types.NewQueryProposalParams
 | 
				
			||||||
	NewQueryVoteParams         = types.NewQueryVoteParams
 | 
						NewQueryVoteParams         = types.NewQueryVoteParams
 | 
				
			||||||
	RegisterCodec              = types.RegisterCodec
 | 
						RegisterAppCodec           = types.RegisterAppCodec
 | 
				
			||||||
 | 
						RegisterModuleCodec        = types.RegisterModuleCodec
 | 
				
			||||||
 | 
						RegisterProposalTypeCodec  = types.RegisterProposalTypeCodec
 | 
				
			||||||
	Uint64FromBytes            = types.Uint64FromBytes
 | 
						Uint64FromBytes            = types.Uint64FromBytes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// variable aliases
 | 
						// variable aliases
 | 
				
			||||||
@ -62,21 +65,22 @@ var (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
type (
 | 
					type (
 | 
				
			||||||
	Keeper                  = keeper.Keeper
 | 
						Keeper                  = keeper.Keeper
 | 
				
			||||||
 | 
						AllowedParam            = types.AllowedParam
 | 
				
			||||||
 | 
						AllowedParams           = types.AllowedParams
 | 
				
			||||||
	Committee               = types.Committee
 | 
						Committee               = types.Committee
 | 
				
			||||||
	CommitteeChangeProposal = types.CommitteeChangeProposal
 | 
						CommitteeChangeProposal = types.CommitteeChangeProposal
 | 
				
			||||||
	CommitteeDeleteProposal = types.CommitteeDeleteProposal
 | 
						CommitteeDeleteProposal = types.CommitteeDeleteProposal
 | 
				
			||||||
	GeneralShutdownPermission     = types.GeneralShutdownPermission
 | 
					 | 
				
			||||||
	GenesisState            = types.GenesisState
 | 
						GenesisState            = types.GenesisState
 | 
				
			||||||
	GodPermission           = types.GodPermission
 | 
						GodPermission           = types.GodPermission
 | 
				
			||||||
	InflationRateChangePermission = types.InflationRateChangePermission
 | 
					 | 
				
			||||||
	MsgSubmitProposal       = types.MsgSubmitProposal
 | 
						MsgSubmitProposal       = types.MsgSubmitProposal
 | 
				
			||||||
	MsgVote                 = types.MsgVote
 | 
						MsgVote                 = types.MsgVote
 | 
				
			||||||
 | 
						ParamChangePermission   = types.ParamChangePermission
 | 
				
			||||||
	Permission              = types.Permission
 | 
						Permission              = types.Permission
 | 
				
			||||||
	Proposal                = types.Proposal
 | 
						Proposal                = types.Proposal
 | 
				
			||||||
	PubProposal             = types.PubProposal
 | 
						PubProposal             = types.PubProposal
 | 
				
			||||||
	QueryCommitteeParams    = types.QueryCommitteeParams
 | 
						QueryCommitteeParams    = types.QueryCommitteeParams
 | 
				
			||||||
	QueryProposalParams     = types.QueryProposalParams
 | 
						QueryProposalParams     = types.QueryProposalParams
 | 
				
			||||||
	QueryVoteParams         = types.QueryVoteParams
 | 
						QueryVoteParams         = types.QueryVoteParams
 | 
				
			||||||
	ShutdownCDPDepsitPermission   = types.ShutdownCDPDepsitPermission
 | 
						ShutdownPermission      = types.ShutdownPermission
 | 
				
			||||||
	Vote                    = types.Vote
 | 
						Vote                    = types.Vote
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
				
			|||||||
@ -32,7 +32,7 @@ func (AppModuleBasic) Name() string {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// RegisterCodec register module codec
 | 
					// RegisterCodec register module codec
 | 
				
			||||||
func (AppModuleBasic) RegisterCodec(cdc *codec.Codec) {
 | 
					func (AppModuleBasic) RegisterCodec(cdc *codec.Codec) {
 | 
				
			||||||
	RegisterCodec(cdc)
 | 
						RegisterAppCodec(cdc)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// DefaultGenesis default genesis state
 | 
					// DefaultGenesis default genesis state
 | 
				
			||||||
 | 
				
			|||||||
@ -12,32 +12,47 @@ var ModuleCdc *codec.Codec
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
func init() {
 | 
					func init() {
 | 
				
			||||||
	cdc := codec.New()
 | 
						cdc := codec.New()
 | 
				
			||||||
 | 
						RegisterModuleCodec(cdc)
 | 
				
			||||||
 | 
						ModuleCdc = cdc.Seal()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// TODO decide if not using gov's Content type would be better
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func RegisterModuleCodec(cdc *codec.Codec) {
 | 
				
			||||||
	cdc.RegisterInterface((*gov.Content)(nil), nil) // registering the Content interface on the ModuleCdc will not conflict with gov.
 | 
						cdc.RegisterInterface((*gov.Content)(nil), nil) // registering the Content interface on the ModuleCdc will not conflict with gov.
 | 
				
			||||||
	// TODO ideally dist and params would register their proposals on here at their init. However can't change them so:
 | 
						// Ideally dist and params would register their proposals on here at their init. However can't change them so:
 | 
				
			||||||
	cdc.RegisterConcrete(distribution.CommunityPoolSpendProposal{}, "cosmos-sdk/CommunityPoolSpendProposal", nil)
 | 
						cdc.RegisterConcrete(distribution.CommunityPoolSpendProposal{}, "cosmos-sdk/CommunityPoolSpendProposal", nil)
 | 
				
			||||||
	cdc.RegisterConcrete(params.ParameterChangeProposal{}, "cosmos-sdk/ParameterChangeProposal", nil)
 | 
						cdc.RegisterConcrete(params.ParameterChangeProposal{}, "cosmos-sdk/ParameterChangeProposal", nil)
 | 
				
			||||||
	cdc.RegisterConcrete(gov.TextProposal{}, "cosmos-sdk/TextProposal", nil)
 | 
						cdc.RegisterConcrete(gov.TextProposal{}, "cosmos-sdk/TextProposal", nil)
 | 
				
			||||||
	cdc.RegisterConcrete(gov.SoftwareUpgradeProposal{}, "cosmos-sdk/SoftwareUpgradeProposal", nil)
 | 
						cdc.RegisterConcrete(gov.SoftwareUpgradeProposal{}, "cosmos-sdk/SoftwareUpgradeProposal", nil)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	RegisterCodec(cdc)
 | 
						RegisterAppCodec(cdc)
 | 
				
			||||||
	ModuleCdc = cdc.Seal()
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// RegisterCodec registers the necessary types for the module
 | 
					// RegisterCodec registers the necessary types for the module
 | 
				
			||||||
func RegisterCodec(cdc *codec.Codec) {
 | 
					func RegisterAppCodec(cdc *codec.Codec) {
 | 
				
			||||||
 | 
						// Proposals
 | 
				
			||||||
	// The app codec needs the gov.Content type registered. This is done by the gov module.
 | 
						// The app codec needs the gov.Content type registered. This is done by the gov module.
 | 
				
			||||||
	// Ideally it would registered here as well in case these modules are ever used separately.
 | 
						// Ideally it would registered here as well in case these modules are ever used separately.
 | 
				
			||||||
	// However amino panics if you register the same interface a second time. So leaving it out for now.
 | 
						// However amino panics if you register the same interface a second time. So leaving it out for now.
 | 
				
			||||||
 | 
					 | 
				
			||||||
	// cdc.RegisterInterface((*gov.Content)(nil), nil)
 | 
						// cdc.RegisterInterface((*gov.Content)(nil), nil)
 | 
				
			||||||
 | 
					 | 
				
			||||||
	cdc.RegisterConcrete(CommitteeChangeProposal{}, "kava/CommitteeChangeProposal", nil)
 | 
						cdc.RegisterConcrete(CommitteeChangeProposal{}, "kava/CommitteeChangeProposal", nil)
 | 
				
			||||||
	cdc.RegisterConcrete(CommitteeDeleteProposal{}, "kava/CommitteeDeleteProposal", nil)
 | 
						cdc.RegisterConcrete(CommitteeDeleteProposal{}, "kava/CommitteeDeleteProposal", nil)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Permissions
 | 
				
			||||||
	cdc.RegisterInterface((*Permission)(nil), nil)
 | 
						cdc.RegisterInterface((*Permission)(nil), nil)
 | 
				
			||||||
	cdc.RegisterConcrete(GodPermission{}, "kava/GodPermission", nil)
 | 
						cdc.RegisterConcrete(GodPermission{}, "kava/GodPermission", nil)
 | 
				
			||||||
 | 
						cdc.RegisterConcrete(ParamChangePermission{}, "kava/ParamChangePermission", nil)
 | 
				
			||||||
 | 
						cdc.RegisterConcrete(ShutdownPermission{}, "kava/ShutdownPermission", nil)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Msgs
 | 
				
			||||||
	cdc.RegisterConcrete(MsgSubmitProposal{}, "kava/MsgSubmitProposal", nil)
 | 
						cdc.RegisterConcrete(MsgSubmitProposal{}, "kava/MsgSubmitProposal", nil)
 | 
				
			||||||
	cdc.RegisterConcrete(MsgVote{}, "kava/MsgVote", nil)
 | 
						cdc.RegisterConcrete(MsgVote{}, "kava/MsgVote", nil)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// RegisterProposalTypeCodec registers an external proposal content type defined
 | 
				
			||||||
 | 
					// in another module for the internal ModuleCdc. This allows the MsgSubmitProposal
 | 
				
			||||||
 | 
					// to be correctly Amino encoded and decoded.
 | 
				
			||||||
 | 
					func RegisterProposalTypeCodec(o interface{}, name string) {
 | 
				
			||||||
 | 
						ModuleCdc.RegisterConcrete(o, name, nil)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -25,15 +25,6 @@ func init() {
 | 
				
			|||||||
	// Gov proposals need to be registered on gov's ModuleCdc so MsgSubmitProposal can be encoded.
 | 
						// Gov proposals need to be registered on gov's ModuleCdc so MsgSubmitProposal can be encoded.
 | 
				
			||||||
	govtypes.RegisterProposalType(ProposalTypeCommitteeChange)
 | 
						govtypes.RegisterProposalType(ProposalTypeCommitteeChange)
 | 
				
			||||||
	govtypes.RegisterProposalTypeCodec(CommitteeChangeProposal{}, "kava/CommitteeChangeProposal")
 | 
						govtypes.RegisterProposalTypeCodec(CommitteeChangeProposal{}, "kava/CommitteeChangeProposal")
 | 
				
			||||||
	// Since these proposals include Permissions that needs to be registered as well (including the interface and concrete types)
 | 
					 | 
				
			||||||
	govtypes.ModuleCdc.RegisterInterface((*Permission)(nil), nil)
 | 
					 | 
				
			||||||
	govtypes.RegisterProposalTypeCodec(GodPermission{}, "kava/GodPermission")
 | 
					 | 
				
			||||||
	// TODO register other permissions here
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// TODO write these
 | 
					 | 
				
			||||||
	//RegisterProposalType(ProposalTypeCommitteeChange)
 | 
					 | 
				
			||||||
	//RegisterProposalTypeCodec(CommitteeChangeProposal{}, "kava/CommitteeChangeProposal")
 | 
					 | 
				
			||||||
	// How will we register distribution and params proposals on this codec?
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func NewCommitteeChangeProposal(title string, description string, newCommittee Committee) CommitteeChangeProposal {
 | 
					func NewCommitteeChangeProposal(title string, description string, newCommittee Committee) CommitteeChangeProposal {
 | 
				
			||||||
@ -83,12 +74,9 @@ type CommitteeDeleteProposal struct {
 | 
				
			|||||||
var _ govtypes.Content = CommitteeDeleteProposal{}
 | 
					var _ govtypes.Content = CommitteeDeleteProposal{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func init() {
 | 
					func init() {
 | 
				
			||||||
 | 
						// Gov proposals need to be registered on gov's ModuleCdc so MsgSubmitProposal can be encoded.
 | 
				
			||||||
	govtypes.RegisterProposalType(ProposalTypeCommitteeDelete)
 | 
						govtypes.RegisterProposalType(ProposalTypeCommitteeDelete)
 | 
				
			||||||
	govtypes.RegisterProposalTypeCodec(CommitteeDeleteProposal{}, "kava/CommitteeDeleteProposal")
 | 
						govtypes.RegisterProposalTypeCodec(CommitteeDeleteProposal{}, "kava/CommitteeDeleteProposal")
 | 
				
			||||||
	// TODO write these
 | 
					 | 
				
			||||||
	//RegisterProposalType(ProposalTypeCommitteeDelete)
 | 
					 | 
				
			||||||
	//RegisterProposalTypeCodec(CommitteeDeleteProposal{}, "kava/CommitteeDeleteProposal")
 | 
					 | 
				
			||||||
	// How will we register distribution and params proposals on this codec?
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func NewCommitteeDeleteProposal(title string, description string, committeeID uint64) CommitteeDeleteProposal {
 | 
					func NewCommitteeDeleteProposal(title string, description string, committeeID uint64) CommitteeDeleteProposal {
 | 
				
			||||||
 | 
				
			|||||||
@ -6,64 +6,110 @@ import (
 | 
				
			|||||||
	sdtypes "github.com/kava-labs/kava/x/shutdown/types"
 | 
						sdtypes "github.com/kava-labs/kava/x/shutdown/types"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// EXAMPLE PERMISSIONS ------------------------------
 | 
					func init() {
 | 
				
			||||||
 | 
						// Gov proposals need to be registered on gov's ModuleCdc.
 | 
				
			||||||
 | 
						// But since proposals contain Permissions, those types also need registering.
 | 
				
			||||||
 | 
						gov.ModuleCdc.RegisterInterface((*Permission)(nil), nil)
 | 
				
			||||||
 | 
						gov.RegisterProposalTypeCodec(GodPermission{}, "kava/GodPermission")
 | 
				
			||||||
 | 
						gov.RegisterProposalTypeCodec(ParamChangePermission{}, "kava/ParamChangePermission")
 | 
				
			||||||
 | 
						gov.RegisterProposalTypeCodec(ShutdownPermission{}, "kava/ShutdownPermission")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// GodPermission allows any governance proposal. It is used mainly for testing.
 | 
				
			||||||
type GodPermission struct{}
 | 
					type GodPermission struct{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var _ Permission = GodPermission{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (GodPermission) Allows(gov.Content) bool { return true }
 | 
					func (GodPermission) Allows(gov.Content) bool { return true }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Allow only changes to inflation_rate
 | 
					func (GodPermission) MarshalYAML() (interface{}, error) {
 | 
				
			||||||
type InflationRateChangePermission struct{}
 | 
						valueToMarshal := struct {
 | 
				
			||||||
 | 
							Type string `yaml:"type"`
 | 
				
			||||||
 | 
						}{
 | 
				
			||||||
 | 
							Type: "god_permission",
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return valueToMarshal, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var _ Permission = InflationRateChangePermission{}
 | 
					// ParamChangeProposal only allows changes to certain params
 | 
				
			||||||
 | 
					type ParamChangePermission struct {
 | 
				
			||||||
 | 
						AllowedParams AllowedParams `json:"allowed_params" yaml:"allowed_params"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (InflationRateChangePermission) Allows(p gov.Content) bool {
 | 
					var _ Permission = ParamChangePermission{}
 | 
				
			||||||
	pcp, ok := p.(params.ParameterChangeProposal)
 | 
					
 | 
				
			||||||
 | 
					func (perm ParamChangePermission) Allows(p gov.Content) bool {
 | 
				
			||||||
 | 
						proposal, ok := p.(params.ParameterChangeProposal)
 | 
				
			||||||
	if !ok {
 | 
						if !ok {
 | 
				
			||||||
		return false
 | 
							return false
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	for _, pc := range pcp.Changes {
 | 
						for _, change := range proposal.Changes {
 | 
				
			||||||
		if pc.Key == "inflation_rate" {
 | 
							if !perm.AllowedParams.Contains(change) {
 | 
				
			||||||
 | 
								return false
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return true
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (perm ParamChangePermission) MarshalYAML() (interface{}, error) {
 | 
				
			||||||
 | 
						valueToMarshal := struct {
 | 
				
			||||||
 | 
							Type          string        `yaml:"type"`
 | 
				
			||||||
 | 
							AllowedParams AllowedParams `yaml:"allowed_params`
 | 
				
			||||||
 | 
						}{
 | 
				
			||||||
 | 
							Type:          "param_change_permission",
 | 
				
			||||||
 | 
							AllowedParams: perm.AllowedParams,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return valueToMarshal, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type AllowedParam struct {
 | 
				
			||||||
 | 
						Subspace string `json:"subspace" yaml:"subspace"`
 | 
				
			||||||
 | 
						Key      string `json:"key" yaml:"key"`
 | 
				
			||||||
 | 
						Subkey   string `json:"subkey,omitempty" yaml:"subkey,omitempty"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					type AllowedParams []AllowedParam
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (allowed AllowedParams) Contains(paramChange params.ParamChange) bool {
 | 
				
			||||||
 | 
						for _, p := range allowed {
 | 
				
			||||||
 | 
							if paramChange.Subspace == p.Subspace && paramChange.Key == p.Key && paramChange.Subkey == p.Subkey {
 | 
				
			||||||
			return true
 | 
								return true
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return false
 | 
						return false
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Allow only shutdown of the CDP Deposit msg
 | 
					// ShutdownPermission allows certain message types to be disabled
 | 
				
			||||||
type ShutdownCDPDepsitPermission struct{}
 | 
					type ShutdownPermission struct {
 | 
				
			||||||
 | 
					 | 
				
			||||||
var _ Permission = ShutdownCDPDepsitPermission{}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (ShutdownCDPDepsitPermission) Allows(p gov.Content) bool {
 | 
					 | 
				
			||||||
	sdp, ok := p.(sdtypes.ShutdownProposal)
 | 
					 | 
				
			||||||
	if !ok {
 | 
					 | 
				
			||||||
		return false
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	for _, r := range sdp.MsgRoutes {
 | 
					 | 
				
			||||||
		if r.Route == "cdp" && r.Msg == "MsgCDPDeposit" {
 | 
					 | 
				
			||||||
			return true
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return false
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Same as above but the route isn't static
 | 
					 | 
				
			||||||
type GeneralShutdownPermission struct {
 | 
					 | 
				
			||||||
	MsgRoute sdtypes.MsgRoute `json:"msg_route" yaml:"msg_route"`
 | 
						MsgRoute sdtypes.MsgRoute `json:"msg_route" yaml:"msg_route"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var _ Permission = GeneralShutdownPermission{}
 | 
					var _ Permission = ShutdownPermission{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (perm GeneralShutdownPermission) Allows(p gov.Content) bool {
 | 
					func (perm ShutdownPermission) Allows(p gov.Content) bool {
 | 
				
			||||||
	sdp, ok := p.(sdtypes.ShutdownProposal)
 | 
						proposal, ok := p.(sdtypes.ShutdownProposal)
 | 
				
			||||||
	if !ok {
 | 
						if !ok {
 | 
				
			||||||
		return false
 | 
							return false
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	for _, r := range sdp.MsgRoutes {
 | 
						for _, r := range proposal.MsgRoutes {
 | 
				
			||||||
		if r == perm.MsgRoute {
 | 
							if r == perm.MsgRoute {
 | 
				
			||||||
			return true
 | 
								return true
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return false
 | 
						return false
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (perm ShutdownPermission) MarshalYAML() (interface{}, error) {
 | 
				
			||||||
 | 
						valueToMarshal := struct {
 | 
				
			||||||
 | 
							Type     string           `yaml:"type"`
 | 
				
			||||||
 | 
							MsgRoute sdtypes.MsgRoute `yaml:"msg_route"`
 | 
				
			||||||
 | 
						}{
 | 
				
			||||||
 | 
							Type:     "shutdown_permission",
 | 
				
			||||||
 | 
							MsgRoute: perm.MsgRoute,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return valueToMarshal, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// TODO add more permissions?
 | 
				
			||||||
 | 
					// - limit parameter changes to bew withing small ranges or fixed sets
 | 
				
			||||||
 | 
					// - allow community spend proposals
 | 
				
			||||||
 | 
					// - allow committee change proposals
 | 
				
			||||||
 | 
				
			|||||||
@ -19,9 +19,12 @@ var (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// A Committee is a collection of addresses that are allowed to vote and enact any governance proposal that passes their permissions.
 | 
					// A Committee is a collection of addresses that are allowed to vote and enact any governance proposal that passes their permissions.
 | 
				
			||||||
type Committee struct {
 | 
					type Committee struct {
 | 
				
			||||||
	ID          uint64           `json:"id" yaml:"id"` // TODO or a name?
 | 
						ID uint64 `json:"id" yaml:"id"`
 | 
				
			||||||
 | 
						//Description string           `json:"description" yaml:"description"`
 | 
				
			||||||
	Members     []sdk.AccAddress `json:"members" yaml:"members"`
 | 
						Members     []sdk.AccAddress `json:"members" yaml:"members"`
 | 
				
			||||||
	Permissions []Permission     `json:"permissions" yaml:"permissions"`
 | 
						Permissions []Permission     `json:"permissions" yaml:"permissions"`
 | 
				
			||||||
 | 
						// VoteThreshold       sdk.Dec          `json:"vote_threshold" yaml:"vote_threshold"`
 | 
				
			||||||
 | 
						// MaxProposalDuration time.Duration    `json:"max_proposal_duration" yaml:"max_proposal_duration"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func NewCommittee(id uint64, members []sdk.AccAddress, permissions []Permission) Committee {
 | 
					func NewCommittee(id uint64, members []sdk.AccAddress, permissions []Permission) Committee {
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user