231 lines
6.7 KiB
Go
231 lines
6.7 KiB
Go
package v3
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
codectypes "github.com/cosmos/cosmos-sdk/codec/types"
|
|
"github.com/cosmos/cosmos-sdk/types"
|
|
authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
|
|
v1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1"
|
|
"github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1"
|
|
)
|
|
|
|
// ConvertToLegacyProposal takes a new proposal and attempts to convert it to the
|
|
// legacy proposal format. This conversion is best effort. New proposal types that
|
|
// don't have a legacy message will return a "nil" content.
|
|
func ConvertToLegacyProposal(proposal v1.Proposal) (v1beta1.Proposal, error) {
|
|
var err error
|
|
legacyProposal := v1beta1.Proposal{
|
|
ProposalId: proposal.Id,
|
|
Status: v1beta1.ProposalStatus(proposal.Status),
|
|
TotalDeposit: types.NewCoins(proposal.TotalDeposit...),
|
|
}
|
|
|
|
legacyProposal.FinalTallyResult, err = ConvertToLegacyTallyResult(proposal.FinalTallyResult)
|
|
if err != nil {
|
|
return v1beta1.Proposal{}, err
|
|
}
|
|
|
|
if proposal.VotingStartTime != nil {
|
|
legacyProposal.VotingStartTime = *proposal.VotingStartTime
|
|
}
|
|
|
|
if proposal.VotingEndTime != nil {
|
|
legacyProposal.VotingEndTime = *proposal.VotingEndTime
|
|
}
|
|
|
|
if proposal.SubmitTime != nil {
|
|
legacyProposal.SubmitTime = *proposal.SubmitTime
|
|
}
|
|
|
|
if proposal.DepositEndTime != nil {
|
|
legacyProposal.DepositEndTime = *proposal.DepositEndTime
|
|
}
|
|
|
|
msgs, err := proposal.GetMsgs()
|
|
if err != nil {
|
|
return v1beta1.Proposal{}, err
|
|
}
|
|
for _, msg := range msgs {
|
|
if legacyMsg, ok := msg.(*v1.MsgExecLegacyContent); ok {
|
|
// check that the content struct can be unmarshalled
|
|
_, err := v1.LegacyContentFromMessage(legacyMsg)
|
|
if err != nil {
|
|
return v1beta1.Proposal{}, err
|
|
}
|
|
legacyProposal.Content = legacyMsg.Content
|
|
}
|
|
}
|
|
return legacyProposal, nil
|
|
}
|
|
|
|
func ConvertToLegacyTallyResult(tally *v1.TallyResult) (v1beta1.TallyResult, error) {
|
|
yes, ok := types.NewIntFromString(tally.YesCount)
|
|
if !ok {
|
|
return v1beta1.TallyResult{}, fmt.Errorf("unable to convert yes tally string (%s) to int", tally.YesCount)
|
|
}
|
|
no, ok := types.NewIntFromString(tally.NoCount)
|
|
if !ok {
|
|
return v1beta1.TallyResult{}, fmt.Errorf("unable to convert no tally string (%s) to int", tally.NoCount)
|
|
}
|
|
veto, ok := types.NewIntFromString(tally.NoWithVetoCount)
|
|
if !ok {
|
|
return v1beta1.TallyResult{}, fmt.Errorf("unable to convert no with veto tally string (%s) to int", tally.NoWithVetoCount)
|
|
}
|
|
abstain, ok := types.NewIntFromString(tally.AbstainCount)
|
|
if !ok {
|
|
return v1beta1.TallyResult{}, fmt.Errorf("unable to convert abstain tally string (%s) to int", tally.AbstainCount)
|
|
}
|
|
|
|
return v1beta1.TallyResult{
|
|
Yes: yes,
|
|
No: no,
|
|
NoWithVeto: veto,
|
|
Abstain: abstain,
|
|
}, nil
|
|
}
|
|
|
|
func ConvertToLegacyVote(vote v1.Vote) (v1beta1.Vote, error) {
|
|
options, err := ConvertToLegacyVoteOptions(vote.Options)
|
|
if err != nil {
|
|
return v1beta1.Vote{}, err
|
|
}
|
|
return v1beta1.Vote{
|
|
ProposalId: vote.ProposalId,
|
|
Voter: vote.Voter,
|
|
Options: options,
|
|
}, nil
|
|
}
|
|
|
|
func ConvertToLegacyVoteOptions(voteOptions []*v1.WeightedVoteOption) ([]v1beta1.WeightedVoteOption, error) {
|
|
options := make([]v1beta1.WeightedVoteOption, len(voteOptions))
|
|
for i, option := range voteOptions {
|
|
weight, err := types.NewDecFromStr(option.Weight)
|
|
if err != nil {
|
|
return options, err
|
|
}
|
|
options[i] = v1beta1.WeightedVoteOption{
|
|
Option: v1beta1.VoteOption(option.Option),
|
|
Weight: weight,
|
|
}
|
|
}
|
|
return options, nil
|
|
}
|
|
|
|
func ConvertToLegacyDeposit(deposit *v1.Deposit) v1beta1.Deposit {
|
|
return v1beta1.Deposit{
|
|
ProposalId: deposit.ProposalId,
|
|
Depositor: deposit.Depositor,
|
|
Amount: types.NewCoins(deposit.Amount...),
|
|
}
|
|
}
|
|
|
|
func convertToNewDeposits(oldDeps v1beta1.Deposits) v1.Deposits {
|
|
newDeps := make([]*v1.Deposit, len(oldDeps))
|
|
for i, oldDep := range oldDeps {
|
|
newDeps[i] = &v1.Deposit{
|
|
ProposalId: oldDep.ProposalId,
|
|
Depositor: oldDep.Depositor,
|
|
Amount: oldDep.Amount,
|
|
}
|
|
}
|
|
|
|
return newDeps
|
|
}
|
|
|
|
func convertToNewVotes(oldVotes v1beta1.Votes) (v1.Votes, error) {
|
|
newVotes := make([]*v1.Vote, len(oldVotes))
|
|
for i, oldVote := range oldVotes {
|
|
var newWVOs []*v1.WeightedVoteOption
|
|
|
|
// We deprecated Vote.Option in v043. However, it might still be set.
|
|
// - if only Options is set, or both Option & Options are set, we read from Options,
|
|
// - if Options is not set, and Option is set, we read from Option,
|
|
// - if none are set, we throw error.
|
|
switch {
|
|
case oldVote.Options != nil:
|
|
newWVOs = make([]*v1.WeightedVoteOption, len(oldVote.Options))
|
|
for j, oldWVO := range oldVote.Options {
|
|
newWVOs[j] = v1.NewWeightedVoteOption(v1.VoteOption(oldWVO.Option), oldWVO.Weight)
|
|
}
|
|
|
|
case oldVote.Option != v1beta1.OptionEmpty:
|
|
newWVOs = v1.NewNonSplitVoteOption(v1.VoteOption(oldVote.Option))
|
|
|
|
default:
|
|
return nil, fmt.Errorf("vote does not have neither Options nor Option")
|
|
}
|
|
|
|
newVotes[i] = &v1.Vote{
|
|
ProposalId: oldVote.ProposalId,
|
|
Voter: oldVote.Voter,
|
|
Options: newWVOs,
|
|
}
|
|
}
|
|
|
|
return newVotes, nil
|
|
}
|
|
|
|
func convertToNewDepParams(oldDepParams v1beta1.DepositParams) v1.DepositParams {
|
|
return v1.DepositParams{
|
|
MinDeposit: oldDepParams.MinDeposit,
|
|
MaxDepositPeriod: &oldDepParams.MaxDepositPeriod,
|
|
}
|
|
}
|
|
|
|
func convertToNewVotingParams(oldVoteParams v1beta1.VotingParams) v1.VotingParams {
|
|
return v1.VotingParams{
|
|
VotingPeriod: &oldVoteParams.VotingPeriod,
|
|
}
|
|
}
|
|
|
|
func convertToNewTallyParams(oldTallyParams v1beta1.TallyParams) v1.TallyParams {
|
|
return v1.TallyParams{
|
|
Quorum: oldTallyParams.Quorum.String(),
|
|
Threshold: oldTallyParams.Threshold.String(),
|
|
VetoThreshold: oldTallyParams.VetoThreshold.String(),
|
|
}
|
|
}
|
|
|
|
func convertToNewProposal(oldProp v1beta1.Proposal) (v1.Proposal, error) {
|
|
msg, err := v1.NewLegacyContent(oldProp.GetContent(), authtypes.NewModuleAddress(ModuleName).String())
|
|
if err != nil {
|
|
return v1.Proposal{}, err
|
|
}
|
|
msgAny, err := codectypes.NewAnyWithValue(msg)
|
|
if err != nil {
|
|
return v1.Proposal{}, err
|
|
}
|
|
|
|
return v1.Proposal{
|
|
Id: oldProp.ProposalId,
|
|
Messages: []*codectypes.Any{msgAny},
|
|
Status: v1.ProposalStatus(oldProp.Status),
|
|
FinalTallyResult: &v1.TallyResult{
|
|
YesCount: oldProp.FinalTallyResult.Yes.String(),
|
|
NoCount: oldProp.FinalTallyResult.No.String(),
|
|
AbstainCount: oldProp.FinalTallyResult.Abstain.String(),
|
|
NoWithVetoCount: oldProp.FinalTallyResult.NoWithVeto.String(),
|
|
},
|
|
SubmitTime: &oldProp.SubmitTime,
|
|
DepositEndTime: &oldProp.DepositEndTime,
|
|
TotalDeposit: oldProp.TotalDeposit,
|
|
VotingStartTime: &oldProp.VotingStartTime,
|
|
VotingEndTime: &oldProp.VotingEndTime,
|
|
}, nil
|
|
}
|
|
|
|
func convertToNewProposals(oldProps v1beta1.Proposals) (v1.Proposals, error) {
|
|
newProps := make([]*v1.Proposal, len(oldProps))
|
|
for i, oldProp := range oldProps {
|
|
p, err := convertToNewProposal(oldProp)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
newProps[i] = &p
|
|
}
|
|
|
|
return newProps, nil
|
|
}
|