cosmos-sdk/x/group/genesis.go
Amaury 875378b231
refactor: Align on gov/group Proposals and Vote syntax (#11097)
## Description

Closes: #11070

- Proto-breaking changes:
  - group Choice -> VoteOption
  - group MsgCreateProposal -> MsgSubmitProposal
  - group enums -> prepend `PROPOSAL_` (e.g. `PROPOSAL_STATUS_`, `PROPOSAL_RESULT_`)
  - group Tally -> TallyResult
- CLI-breaking changes:
  - group submit proposal: takes a single arg which is a proposal.json file



---

### Author Checklist

*All items are required. Please add a note to the item if the item is not applicable and
please add links to any relevant follow up issues.*

I have...

- [ ] included the correct [type prefix](https://github.com/commitizen/conventional-commit-types/blob/v3.0.0/index.json) in the PR title
- [ ] added `!` to the type prefix if API or client breaking change
- [ ] targeted the correct branch (see [PR Targeting](https://github.com/cosmos/cosmos-sdk/blob/master/CONTRIBUTING.md#pr-targeting))
- [ ] provided a link to the relevant issue or specification
- [ ] followed the guidelines for [building modules](https://github.com/cosmos/cosmos-sdk/blob/master/docs/building-modules)
- [ ] included the necessary unit and integration [tests](https://github.com/cosmos/cosmos-sdk/blob/master/CONTRIBUTING.md#testing)
- [ ] added a changelog entry to `CHANGELOG.md`
- [ ] included comments for [documenting Go code](https://blog.golang.org/godoc)
- [ ] updated the relevant documentation or specification
- [ ] reviewed "Files changed" and left comments if necessary
- [ ] confirmed all CI checks have passed

### Reviewers Checklist

*All items are required. Please add a note if the item is not applicable and please add
your handle next to the items reviewed if you only reviewed selected items.*

I have...

- [ ] confirmed the correct [type prefix](https://github.com/commitizen/conventional-commit-types/blob/v3.0.0/index.json) in the PR title
- [ ] confirmed `!` in the type prefix if API or client breaking change
- [ ] confirmed all author checklist items have been addressed 
- [ ] reviewed state machine logic
- [ ] reviewed API design and naming
- [ ] reviewed documentation is accurate
- [ ] reviewed tests and test coverage
- [ ] manually tested (if applicable)
2022-02-14 13:48:17 +00:00

97 lines
2.6 KiB
Go

package group
import (
"fmt"
"github.com/cosmos/cosmos-sdk/codec/types"
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
)
// NewGenesisState creates a new genesis state with default values.
func NewGenesisState() *GenesisState {
return &GenesisState{}
}
func (s GenesisState) Validate() error {
groups := make(map[uint64]GroupInfo)
groupPolicies := make(map[string]GroupPolicyInfo)
groupMembers := make(map[uint64]GroupMember)
proposals := make(map[uint64]Proposal)
for _, g := range s.Groups {
if err := g.ValidateBasic(); err != nil {
return sdkerrors.Wrap(err, "Group validation failed")
}
groups[g.Id] = *g
}
for _, g := range s.GroupPolicies {
// check that group with group policy's GroupId exists
if _, exists := groups[g.GroupId]; !exists {
return sdkerrors.Wrap(sdkerrors.ErrNotFound, fmt.Sprintf("group with GroupId %d doesn't exist", g.GroupId))
}
if err := g.ValidateBasic(); err != nil {
return sdkerrors.Wrap(err, "GroupPolicy validation failed")
}
groupPolicies[g.Address] = *g
}
for _, g := range s.GroupMembers {
// check that group with group member's GroupId exists
if _, exists := groups[g.GroupId]; !exists {
return sdkerrors.Wrap(sdkerrors.ErrNotFound, fmt.Sprintf("group member with GroupId %d doesn't exist", g.GroupId))
}
if err := g.ValidateBasic(); err != nil {
return sdkerrors.Wrap(err, "GroupMember validation failed")
}
groupMembers[g.GroupId] = *g
}
for _, p := range s.Proposals {
// check that group policy with proposal address exists
if _, exists := groupPolicies[p.Address]; !exists {
return sdkerrors.Wrap(sdkerrors.ErrNotFound, fmt.Sprintf("group policy account with address %s doesn't correspond to proposal address", p.Address))
}
if err := p.ValidateBasic(); err != nil {
return sdkerrors.Wrap(err, "Proposal validation failed")
}
proposals[p.Id] = *p
}
for _, v := range s.Votes {
if err := v.ValidateBasic(); err != nil {
return sdkerrors.Wrap(err, "Vote validation failed")
}
// check that proposal exists
if _, exists := proposals[v.ProposalId]; !exists {
return sdkerrors.Wrap(sdkerrors.ErrNotFound, fmt.Sprintf("proposal with ProposalId %d doesn't exist", v.ProposalId))
}
}
return nil
}
// UnpackInterfaces implements UnpackInterfacesMessage.UnpackInterfaces
func (s GenesisState) UnpackInterfaces(unpacker types.AnyUnpacker) error {
for _, g := range s.GroupPolicies {
err := g.UnpackInterfaces(unpacker)
if err != nil {
return err
}
}
for _, p := range s.Proposals {
err := p.UnpackInterfaces(unpacker)
if err != nil {
return err
}
}
return nil
}