mirror of
https://github.com/0glabs/0g-chain.git
synced 2024-11-10 10:05:18 +00:00
remove legacy committee migration (#1360)
Co-authored-by: Draco <draco@dracoli.com>
This commit is contained in:
parent
f1c37725cc
commit
52fc29952e
@ -1,481 +0,0 @@
|
||||
package v0_15
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
v036gov "github.com/cosmos/cosmos-sdk/x/gov/legacy/v036"
|
||||
)
|
||||
|
||||
const MaxCommitteeDescriptionLength int = 512
|
||||
|
||||
type TallyOption uint64
|
||||
|
||||
const (
|
||||
NullTallyOption TallyOption = iota
|
||||
FirstPastThePost TallyOption = iota // Votes are tallied each block and the proposal passes as soon as the vote threshold is reached
|
||||
Deadline TallyOption = iota // Votes are tallied exactly once, when the deadline time is reached
|
||||
)
|
||||
|
||||
const (
|
||||
BaseCommitteeType = "kava/BaseCommittee"
|
||||
MemberCommitteeType = "kava/MemberCommittee" // Committee is composed of member addresses that vote to enact proposals within their permissions
|
||||
TokenCommitteeType = "kava/TokenCommittee" // Committee is composed of token holders with voting power determined by total token balance
|
||||
BondDenom = "ukava"
|
||||
)
|
||||
|
||||
// TallyOptionFromString returns a TallyOption from a string. It returns an error
|
||||
// if the string is invalid.
|
||||
func TallyOptionFromString(str string) (TallyOption, error) {
|
||||
switch strings.ToLower(str) {
|
||||
case "firstpastthepost", "fptp":
|
||||
return FirstPastThePost, nil
|
||||
|
||||
case "deadline", "d":
|
||||
return Deadline, nil
|
||||
|
||||
default:
|
||||
return TallyOption(0xff), fmt.Errorf("'%s' is not a valid tally option", str)
|
||||
}
|
||||
}
|
||||
|
||||
// Marshal needed for protobuf compatibility.
|
||||
func (t TallyOption) Marshal() ([]byte, error) {
|
||||
return []byte{byte(t)}, nil
|
||||
}
|
||||
|
||||
// Unmarshal needed for protobuf compatibility.
|
||||
func (t *TallyOption) Unmarshal(data []byte) error {
|
||||
*t = TallyOption(data[0])
|
||||
return nil
|
||||
}
|
||||
|
||||
// Marshals to JSON using string.
|
||||
func (t TallyOption) MarshalJSON() ([]byte, error) {
|
||||
return json.Marshal(t.String())
|
||||
}
|
||||
|
||||
// UnmarshalJSON decodes from JSON assuming Bech32 encoding.
|
||||
func (t *TallyOption) UnmarshalJSON(data []byte) error {
|
||||
var s string
|
||||
err := json.Unmarshal(data, &s)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
bz2, err := TallyOptionFromString(s)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
*t = bz2
|
||||
return nil
|
||||
}
|
||||
|
||||
// String implements the Stringer interface.
|
||||
func (t TallyOption) String() string {
|
||||
switch t {
|
||||
case FirstPastThePost:
|
||||
return "FirstPastThePost"
|
||||
case Deadline:
|
||||
return "Deadline"
|
||||
default:
|
||||
return ""
|
||||
}
|
||||
}
|
||||
|
||||
// Committee is an interface for handling common actions on committees
|
||||
type Committee interface {
|
||||
GetID() uint64
|
||||
GetType() string
|
||||
GetDescription() string
|
||||
|
||||
GetMembers() []sdk.AccAddress
|
||||
SetMembers([]sdk.AccAddress) BaseCommittee
|
||||
HasMember(addr sdk.AccAddress) bool
|
||||
|
||||
GetPermissions() []Permission
|
||||
SetPermissions([]Permission) Committee
|
||||
|
||||
GetProposalDuration() time.Duration
|
||||
SetProposalDuration(time.Duration) BaseCommittee
|
||||
|
||||
GetVoteThreshold() sdk.Dec
|
||||
SetVoteThreshold(sdk.Dec) BaseCommittee
|
||||
|
||||
GetTallyOption() TallyOption
|
||||
Validate() error
|
||||
}
|
||||
|
||||
var (
|
||||
_ Committee = MemberCommittee{}
|
||||
_ Committee = TokenCommittee{}
|
||||
)
|
||||
|
||||
// Committees is a slice of committees
|
||||
type Committees []Committee
|
||||
|
||||
// BaseCommittee is a common type shared by all Committees
|
||||
type BaseCommittee struct {
|
||||
ID uint64 `json:"id" yaml:"id"`
|
||||
Description string `json:"description" yaml:"description"`
|
||||
Members []sdk.AccAddress `json:"members" yaml:"members"`
|
||||
Permissions []Permission `json:"permissions" yaml:"permissions"`
|
||||
VoteThreshold sdk.Dec `json:"vote_threshold" yaml:"vote_threshold"` // Smallest percentage that must vote for a proposal to pass
|
||||
ProposalDuration time.Duration `json:"proposal_duration" yaml:"proposal_duration"` // The length of time a proposal remains active for. Proposals will close earlier if they get enough votes.
|
||||
TallyOption TallyOption `json:"tally_option" yaml:"tally_option"`
|
||||
}
|
||||
|
||||
// GetType is a getter for committee type
|
||||
func (c BaseCommittee) GetType() string { return BaseCommitteeType }
|
||||
|
||||
// GetID is a getter for committee ID
|
||||
func (c BaseCommittee) GetID() uint64 { return c.ID }
|
||||
|
||||
// GetDescription is a getter for committee description
|
||||
func (c BaseCommittee) GetDescription() string { return c.Description }
|
||||
|
||||
// GetMembers is a getter for committee members
|
||||
func (c BaseCommittee) GetMembers() []sdk.AccAddress { return c.Members }
|
||||
|
||||
// SetMembers is a setter for committee members
|
||||
func (c BaseCommittee) SetMembers(members []sdk.AccAddress) BaseCommittee {
|
||||
c.Members = members
|
||||
return c
|
||||
}
|
||||
|
||||
// HasMember returns if a committee contains a given member address
|
||||
func (c BaseCommittee) HasMember(addr sdk.AccAddress) bool {
|
||||
for _, m := range c.Members {
|
||||
if m.Equals(addr) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// GetPermissions is a getter for committee permissions
|
||||
func (c BaseCommittee) GetPermissions() []Permission { return c.Permissions }
|
||||
|
||||
// SetPermissions is a setter for committee permissions
|
||||
func (c BaseCommittee) SetPermissions(permissions []Permission) BaseCommittee {
|
||||
c.Permissions = permissions
|
||||
return c
|
||||
}
|
||||
|
||||
// GetVoteThreshold is a getter for committee VoteThreshold
|
||||
func (c BaseCommittee) GetVoteThreshold() sdk.Dec { return c.VoteThreshold }
|
||||
|
||||
// SetVoteThreshold is a setter for committee VoteThreshold
|
||||
func (c BaseCommittee) SetVoteThreshold(voteThreshold sdk.Dec) BaseCommittee {
|
||||
c.VoteThreshold = voteThreshold
|
||||
return c
|
||||
}
|
||||
|
||||
// GetProposalDuration is a getter for committee ProposalDuration
|
||||
func (c BaseCommittee) GetProposalDuration() time.Duration { return c.ProposalDuration }
|
||||
|
||||
// SetProposalDuration is a setter for committee ProposalDuration
|
||||
func (c BaseCommittee) SetProposalDuration(proposalDuration time.Duration) BaseCommittee {
|
||||
c.ProposalDuration = proposalDuration
|
||||
return c
|
||||
}
|
||||
|
||||
// GetTallyOption is a getter for committee TallyOption
|
||||
func (c BaseCommittee) GetTallyOption() TallyOption { return c.TallyOption }
|
||||
|
||||
// Validate validates BaseCommittee fields
|
||||
func (c BaseCommittee) Validate() error {
|
||||
if len(c.Description) > MaxCommitteeDescriptionLength {
|
||||
return fmt.Errorf("description length %d longer than max allowed %d", len(c.Description), MaxCommitteeDescriptionLength)
|
||||
}
|
||||
|
||||
if len(c.Members) <= 0 {
|
||||
return fmt.Errorf("committee must have members")
|
||||
}
|
||||
|
||||
addressMap := make(map[string]bool, len(c.Members))
|
||||
for _, m := range c.Members {
|
||||
// check there are no duplicate members
|
||||
if _, ok := addressMap[m.String()]; ok {
|
||||
return fmt.Errorf("committee cannot have duplicate members, %s", m)
|
||||
}
|
||||
// check for valid addresses
|
||||
if m.Empty() {
|
||||
return fmt.Errorf("committee cannot have empty member address")
|
||||
}
|
||||
addressMap[m.String()] = true
|
||||
}
|
||||
|
||||
for _, p := range c.Permissions {
|
||||
if p == nil {
|
||||
return fmt.Errorf("committee cannot have a nil permission")
|
||||
}
|
||||
}
|
||||
|
||||
if c.ProposalDuration < 0 {
|
||||
return fmt.Errorf("invalid proposal duration: %s", c.ProposalDuration)
|
||||
}
|
||||
|
||||
// threshold must be in the range [0, 1]
|
||||
if c.VoteThreshold.IsNil() || c.VoteThreshold.LTE(sdk.ZeroDec()) || c.VoteThreshold.GT(sdk.NewDec(1)) {
|
||||
return fmt.Errorf("invalid threshold: %s", c.VoteThreshold)
|
||||
}
|
||||
|
||||
if c.TallyOption <= 0 || c.TallyOption > 2 {
|
||||
return fmt.Errorf("invalid tally option: %d", c.TallyOption)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// MemberCommittee is an alias of BaseCommittee
|
||||
type MemberCommittee struct {
|
||||
BaseCommittee `json:"base_committee" yaml:"base_committee"`
|
||||
}
|
||||
|
||||
// NewMemberCommittee instantiates a new instance of MemberCommittee
|
||||
func NewMemberCommittee(id uint64, description string, members []sdk.AccAddress, permissions []Permission,
|
||||
threshold sdk.Dec, duration time.Duration, tallyOption TallyOption,
|
||||
) MemberCommittee {
|
||||
return MemberCommittee{
|
||||
BaseCommittee: BaseCommittee{
|
||||
ID: id,
|
||||
Description: description,
|
||||
Members: members,
|
||||
Permissions: permissions,
|
||||
VoteThreshold: threshold,
|
||||
ProposalDuration: duration,
|
||||
TallyOption: tallyOption,
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
// GetType is a getter for committee type
|
||||
func (c MemberCommittee) GetType() string { return MemberCommitteeType }
|
||||
|
||||
// SetPermissions is a setter for committee permissions
|
||||
func (c MemberCommittee) SetPermissions(permissions []Permission) Committee {
|
||||
c.Permissions = permissions
|
||||
return c
|
||||
}
|
||||
|
||||
// Validate validates the committee's fields
|
||||
func (c MemberCommittee) Validate() error {
|
||||
return c.BaseCommittee.Validate()
|
||||
}
|
||||
|
||||
// TokenCommittee supports voting on proposals by token holders
|
||||
type TokenCommittee struct {
|
||||
BaseCommittee `json:"base_committee" yaml:"base_committee"`
|
||||
Quorum sdk.Dec `json:"quorum" yaml:"quorum"`
|
||||
TallyDenom string `json:"tally_denom" yaml:"tally_denom"`
|
||||
}
|
||||
|
||||
// NewTokenCommittee instantiates a new instance of TokenCommittee
|
||||
func NewTokenCommittee(id uint64, description string, members []sdk.AccAddress, permissions []Permission,
|
||||
threshold sdk.Dec, duration time.Duration, tallyOption TallyOption, quorum sdk.Dec, tallyDenom string,
|
||||
) TokenCommittee {
|
||||
return TokenCommittee{
|
||||
BaseCommittee: BaseCommittee{
|
||||
ID: id,
|
||||
Description: description,
|
||||
Members: members,
|
||||
Permissions: permissions,
|
||||
VoteThreshold: threshold,
|
||||
ProposalDuration: duration,
|
||||
TallyOption: tallyOption,
|
||||
},
|
||||
Quorum: quorum,
|
||||
TallyDenom: tallyDenom,
|
||||
}
|
||||
}
|
||||
|
||||
// GetType is a getter for committee type
|
||||
func (c TokenCommittee) GetType() string { return TokenCommitteeType }
|
||||
|
||||
// GetQuorum returns the quorum of the committee
|
||||
func (c TokenCommittee) GetQuorum() sdk.Dec { return c.Quorum }
|
||||
|
||||
// GetTallyDenom returns the tally denom of the committee
|
||||
func (c TokenCommittee) GetTallyDenom() string { return c.TallyDenom }
|
||||
|
||||
// SetPermissions is a setter for committee permissions
|
||||
func (c TokenCommittee) SetPermissions(permissions []Permission) Committee {
|
||||
c.Permissions = permissions
|
||||
return c
|
||||
}
|
||||
|
||||
// Validate validates the committee's fields
|
||||
func (c TokenCommittee) Validate() error {
|
||||
if c.TallyDenom == BondDenom {
|
||||
return fmt.Errorf("invalid tally denom: %s", c.TallyDenom)
|
||||
}
|
||||
|
||||
err := sdk.ValidateDenom(c.TallyDenom)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if c.Quorum.IsNil() || c.Quorum.IsNegative() || c.Quorum.GT(sdk.NewDec(1)) {
|
||||
return fmt.Errorf("invalid quorum: %s", c.Quorum)
|
||||
}
|
||||
|
||||
return c.BaseCommittee.Validate()
|
||||
}
|
||||
|
||||
// ------------------------------------------
|
||||
// Proposals
|
||||
// ------------------------------------------
|
||||
|
||||
// PubProposal is the interface that all proposals must fulfill to be submitted to a committee.
|
||||
// Proposal types can be created external to this module. For example a ParamChangeProposal, or CommunityPoolSpendProposal.
|
||||
// It is pinned to the equivalent type in the gov module to create compatibility between proposal types.
|
||||
type PubProposal v036gov.Content
|
||||
|
||||
// Proposal is an internal record of a governance proposal submitted to a committee.
|
||||
type Proposal struct {
|
||||
PubProposal `json:"pub_proposal" yaml:"pub_proposal"`
|
||||
ID uint64 `json:"id" yaml:"id"`
|
||||
CommitteeID uint64 `json:"committee_id" yaml:"committee_id"`
|
||||
Deadline time.Time `json:"deadline" yaml:"deadline"`
|
||||
}
|
||||
|
||||
func NewProposal(pubProposal PubProposal, id uint64, committeeID uint64, deadline time.Time) Proposal {
|
||||
return Proposal{
|
||||
PubProposal: pubProposal,
|
||||
ID: id,
|
||||
CommitteeID: committeeID,
|
||||
Deadline: deadline,
|
||||
}
|
||||
}
|
||||
|
||||
// HasExpiredBy calculates if the proposal will have expired by a certain time.
|
||||
// All votes must be cast before deadline, those cast at time == deadline are not valid
|
||||
func (p Proposal) HasExpiredBy(time time.Time) bool {
|
||||
return !time.Before(p.Deadline)
|
||||
}
|
||||
|
||||
// ------------------------------------------
|
||||
// Votes
|
||||
// ------------------------------------------
|
||||
|
||||
type Vote struct {
|
||||
ProposalID uint64 `json:"proposal_id" yaml:"proposal_id"`
|
||||
Voter sdk.AccAddress `json:"voter" yaml:"voter"`
|
||||
VoteType VoteType `json:"vote_type" yaml:"vote_type"`
|
||||
}
|
||||
|
||||
func NewVote(proposalID uint64, voter sdk.AccAddress, voteType VoteType) Vote {
|
||||
return Vote{
|
||||
ProposalID: proposalID,
|
||||
Voter: voter,
|
||||
VoteType: voteType,
|
||||
}
|
||||
}
|
||||
|
||||
func (v Vote) Validate() error {
|
||||
if v.Voter.Empty() {
|
||||
return fmt.Errorf("voter address cannot be empty")
|
||||
}
|
||||
|
||||
return v.VoteType.Validate()
|
||||
}
|
||||
|
||||
type VoteType uint64
|
||||
|
||||
const (
|
||||
NullVoteType VoteType = iota // 0
|
||||
Yes VoteType = iota // 1
|
||||
No VoteType = iota // 2
|
||||
Abstain VoteType = iota // 3
|
||||
)
|
||||
|
||||
// VoteTypeFromString returns a VoteType from a string. It returns an error
|
||||
// if the string is invalid.
|
||||
func VoteTypeFromString(str string) (VoteType, error) {
|
||||
switch strings.ToLower(str) {
|
||||
case "yes", "y":
|
||||
return Yes, nil
|
||||
|
||||
case "abstain", "a":
|
||||
return Abstain, nil
|
||||
|
||||
case "no", "n":
|
||||
return No, nil
|
||||
|
||||
default:
|
||||
return VoteType(0xff), fmt.Errorf("'%s' is not a valid vote type", str)
|
||||
}
|
||||
}
|
||||
|
||||
// Marshal needed for protobuf compatibility.
|
||||
func (vt VoteType) Marshal() ([]byte, error) {
|
||||
return []byte{byte(vt)}, nil
|
||||
}
|
||||
|
||||
// Unmarshal needed for protobuf compatibility.
|
||||
func (vt *VoteType) Unmarshal(data []byte) error {
|
||||
*vt = VoteType(data[0])
|
||||
return nil
|
||||
}
|
||||
|
||||
// Marshals to JSON using string.
|
||||
func (vt VoteType) MarshalJSON() ([]byte, error) {
|
||||
return json.Marshal(vt.String())
|
||||
}
|
||||
|
||||
// UnmarshalJSON decodes from JSON assuming Bech32 encoding.
|
||||
func (vt *VoteType) UnmarshalJSON(data []byte) error {
|
||||
var s string
|
||||
err := json.Unmarshal(data, &s)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
bz2, err := VoteTypeFromString(s)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
*vt = bz2
|
||||
return nil
|
||||
}
|
||||
|
||||
// String implements the Stringer interface.
|
||||
func (vt VoteType) String() string {
|
||||
switch vt {
|
||||
case Yes:
|
||||
return "Yes"
|
||||
case Abstain:
|
||||
return "Abstain"
|
||||
case No:
|
||||
return "No"
|
||||
default:
|
||||
return ""
|
||||
}
|
||||
}
|
||||
|
||||
func (vt VoteType) Validate() error {
|
||||
if vt <= 0 || vt > 3 {
|
||||
return fmt.Errorf("invalid vote type: %d", vt)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// CommitteeChangeProposal is a gov proposal for creating a new committee or modifying an existing one.
|
||||
type CommitteeChangeProposal struct {
|
||||
Title string `json:"title" yaml:"title"`
|
||||
Description string `json:"description" yaml:"description"`
|
||||
NewCommittee Committee `json:"new_committee" yaml:"new_committee"`
|
||||
}
|
||||
|
||||
// CommitteeDeleteProposal is a gov proposal for removing a committee.
|
||||
type CommitteeDeleteProposal struct {
|
||||
Title string `json:"title" yaml:"title"`
|
||||
Description string `json:"description" yaml:"description"`
|
||||
CommitteeID uint64 `json:"committee_id" yaml:"committee_id"`
|
||||
}
|
@ -1,6 +0,0 @@
|
||||
package v0_15
|
||||
|
||||
const (
|
||||
// ModuleName The name that will be used throughout the module
|
||||
ModuleName = "committee"
|
||||
)
|
@ -1,192 +0,0 @@
|
||||
package v0_15
|
||||
|
||||
// Permission is anything with a method that validates whether a proposal is allowed by it or not.
|
||||
type Permission interface{}
|
||||
|
||||
// ------------------------------------------
|
||||
// GodPermission
|
||||
// ------------------------------------------
|
||||
|
||||
// GodPermission allows any governance proposal. It is used mainly for testing.
|
||||
type GodPermission struct{}
|
||||
|
||||
var _ Permission = GodPermission{}
|
||||
|
||||
// ------------------------------------------
|
||||
// SimpleParamChangePermission
|
||||
// ------------------------------------------
|
||||
|
||||
// SimpleParamChangePermission only allows changes to certain params
|
||||
type SimpleParamChangePermission struct {
|
||||
AllowedParams AllowedParams `json:"allowed_params" yaml:"allowed_params"`
|
||||
}
|
||||
|
||||
var _ Permission = SimpleParamChangePermission{}
|
||||
|
||||
// AllowedParam permission type for module parameter keys
|
||||
type AllowedParam struct {
|
||||
Subspace string `json:"subspace" yaml:"subspace"`
|
||||
Key string `json:"key" yaml:"key"`
|
||||
}
|
||||
|
||||
// AllowedParams slice of AllowedParam
|
||||
type AllowedParams []AllowedParam
|
||||
|
||||
// ------------------------------------------
|
||||
// TextPermission
|
||||
// ------------------------------------------
|
||||
|
||||
// TextPermission allows any text governance proposal.
|
||||
type TextPermission struct{}
|
||||
|
||||
var _ Permission = TextPermission{}
|
||||
|
||||
// ------------------------------------------
|
||||
// SoftwareUpgradePermission
|
||||
// ------------------------------------------
|
||||
|
||||
// SoftwareUpgradePermission permission type for software upgrade proposals
|
||||
type SoftwareUpgradePermission struct{}
|
||||
|
||||
var _ Permission = SoftwareUpgradePermission{}
|
||||
|
||||
// ------------------------------------------
|
||||
// SubParamChangePermission
|
||||
// ------------------------------------------
|
||||
|
||||
// SubParamChangePermission permission type for allowing changes to specific sub-keys within module parameter keys
|
||||
type SubParamChangePermission struct {
|
||||
AllowedParams AllowedParams `json:"allowed_params" yaml:"allowed_params"`
|
||||
AllowedCollateralParams AllowedCollateralParams `json:"allowed_collateral_params" yaml:"allowed_collateral_params"`
|
||||
AllowedDebtParam AllowedDebtParam `json:"allowed_debt_param" yaml:"allowed_debt_param"`
|
||||
AllowedAssetParams AllowedAssetParams `json:"allowed_asset_params" yaml:"allowed_asset_params"`
|
||||
AllowedMarkets AllowedMarkets `json:"allowed_markets" yaml:"allowed_markets"`
|
||||
AllowedMoneyMarkets AllowedMoneyMarkets `json:"allowed_money_markets" yaml:"allowed_money_markets"`
|
||||
}
|
||||
|
||||
var _ Permission = SubParamChangePermission{}
|
||||
|
||||
// MarshalYAML implement yaml marshalling
|
||||
func (perm SubParamChangePermission) MarshalYAML() (interface{}, error) {
|
||||
valueToMarshal := struct {
|
||||
Type string `yaml:"type" json:"type"`
|
||||
AllowedParams AllowedParams `yaml:"allowed_params" json:"allowed_params"`
|
||||
AllowedCollateralParams AllowedCollateralParams `yaml:"allowed_collateral_params" json:"allowed_collateral_params"`
|
||||
AllowedDebtParam AllowedDebtParam `yaml:"allowed_debt_param" json:"allowed_debt_param"`
|
||||
AllowedAssetParams AllowedAssetParams `yaml:"allowed_asset_params" json:"allowed_asset_params"`
|
||||
AllowedMarkets AllowedMarkets `yaml:"allowed_markets" json:"allowed_markets"`
|
||||
AllowedMoneyMarkets AllowedMoneyMarkets `json:"allowed_money_markets" yaml:"allowed_money_markets"`
|
||||
}{
|
||||
Type: "param_change_permission",
|
||||
AllowedParams: perm.AllowedParams,
|
||||
AllowedCollateralParams: perm.AllowedCollateralParams,
|
||||
AllowedDebtParam: perm.AllowedDebtParam,
|
||||
AllowedAssetParams: perm.AllowedAssetParams,
|
||||
AllowedMarkets: perm.AllowedMarkets,
|
||||
AllowedMoneyMarkets: perm.AllowedMoneyMarkets,
|
||||
}
|
||||
return valueToMarshal, nil
|
||||
}
|
||||
|
||||
// AllowedCollateralParams slice of AllowedCollateralParam
|
||||
type AllowedCollateralParams []AllowedCollateralParam
|
||||
|
||||
// AllowedCollateralParam permission struct for changes to collateral parameter keys (cdp module)
|
||||
type AllowedCollateralParam struct {
|
||||
Type string `json:"type" yaml:"type"`
|
||||
Denom bool `json:"denom" yaml:"denom"`
|
||||
LiquidationRatio bool `json:"liquidation_ratio" yaml:"liquidation_ratio"`
|
||||
DebtLimit bool `json:"debt_limit" yaml:"debt_limit"`
|
||||
StabilityFee bool `json:"stability_fee" yaml:"stability_fee"`
|
||||
AuctionSize bool `json:"auction_size" yaml:"auction_size"`
|
||||
LiquidationPenalty bool `json:"liquidation_penalty" yaml:"liquidation_penalty"`
|
||||
Prefix bool `json:"prefix" yaml:"prefix"`
|
||||
SpotMarketID bool `json:"spot_market_id" yaml:"spot_market_id"`
|
||||
LiquidationMarketID bool `json:"liquidation_market_id" yaml:"liquidation_market_id"`
|
||||
ConversionFactor bool `json:"conversion_factor" yaml:"conversion_factor"`
|
||||
KeeperRewardPercentage bool `json:"keeper_reward_percentage" yaml:"keeper_reward_percentage"`
|
||||
CheckCollateralizationIndexCount bool `json:"check_collateralization_index_count" yaml:"check_collateralization_index_count"`
|
||||
}
|
||||
|
||||
// NewAllowedCollateralParam return a new AllowedCollateralParam
|
||||
func NewAllowedCollateralParam(
|
||||
ctype string, denom, liqRatio, debtLimit,
|
||||
stabilityFee, auctionSize, liquidationPenalty,
|
||||
prefix, spotMarket, liquidationMarket, conversionFactor, keeperReward, ltvIndexCount bool,
|
||||
) AllowedCollateralParam {
|
||||
return AllowedCollateralParam{
|
||||
Type: ctype,
|
||||
Denom: denom,
|
||||
LiquidationRatio: liqRatio,
|
||||
DebtLimit: debtLimit,
|
||||
StabilityFee: stabilityFee,
|
||||
AuctionSize: auctionSize,
|
||||
LiquidationPenalty: liquidationPenalty,
|
||||
Prefix: prefix,
|
||||
SpotMarketID: spotMarket,
|
||||
LiquidationMarketID: liquidationMarket,
|
||||
ConversionFactor: conversionFactor,
|
||||
KeeperRewardPercentage: keeperReward,
|
||||
CheckCollateralizationIndexCount: ltvIndexCount,
|
||||
}
|
||||
}
|
||||
|
||||
// AllowedDebtParam permission struct for changes to debt parameter keys (cdp module)
|
||||
type AllowedDebtParam struct {
|
||||
Denom bool `json:"denom" yaml:"denom"`
|
||||
ReferenceAsset bool `json:"reference_asset" yaml:"reference_asset"`
|
||||
ConversionFactor bool `json:"conversion_factor" yaml:"conversion_factor"`
|
||||
DebtFloor bool `json:"debt_floor" yaml:"debt_floor"`
|
||||
}
|
||||
|
||||
// AllowedAssetParams slice of AllowedAssetParam
|
||||
type AllowedAssetParams []AllowedAssetParam
|
||||
|
||||
// AllowedAssetParam bep3 asset parameters that can be changed by committee
|
||||
type AllowedAssetParam struct {
|
||||
Denom string `json:"denom" yaml:"denom"`
|
||||
CoinID bool `json:"coin_id" yaml:"coin_id"`
|
||||
Limit bool `json:"limit" yaml:"limit"`
|
||||
Active bool `json:"active" yaml:"active"`
|
||||
MaxSwapAmount bool `json:"max_swap_amount" yaml:"max_swap_amount"`
|
||||
MinBlockLock bool `json:"min_block_lock" yaml:"min_block_lock"`
|
||||
}
|
||||
|
||||
// AllowedMarkets slice of AllowedMarket
|
||||
type AllowedMarkets []AllowedMarket
|
||||
|
||||
// AllowedMarket permission struct for market parameters (pricefeed module)
|
||||
type AllowedMarket struct {
|
||||
MarketID string `json:"market_id" yaml:"market_id"`
|
||||
BaseAsset bool `json:"base_asset" yaml:"base_asset"`
|
||||
QuoteAsset bool `json:"quote_asset" yaml:"quote_asset"`
|
||||
Oracles bool `json:"oracles" yaml:"oracles"`
|
||||
Active bool `json:"active" yaml:"active"`
|
||||
}
|
||||
|
||||
// AllowedMoneyMarket permission struct for money market parameters (hard module)
|
||||
type AllowedMoneyMarket struct {
|
||||
Denom string `json:"denom" yaml:"denom"`
|
||||
BorrowLimit bool `json:"borrow_limit" yaml:"borrow_limit"`
|
||||
SpotMarketID bool `json:"spot_market_id" yaml:"spot_market_id"`
|
||||
ConversionFactor bool `json:"conversion_factor" yaml:"conversion_factor"`
|
||||
InterestRateModel bool `json:"interest_rate_model" yaml:"interest_rate_model"`
|
||||
ReserveFactor bool `json:"reserve_factor" yaml:"reserve_factor"`
|
||||
KeeperRewardPercentage bool `json:"keeper_reward_percentage" yaml:"keeper_reward_percentage"`
|
||||
}
|
||||
|
||||
// NewAllowedMoneyMarket returns a new AllowedMoneyMarket
|
||||
func NewAllowedMoneyMarket(denom string, bl, sm, cf, irm, rf, kr bool) AllowedMoneyMarket {
|
||||
return AllowedMoneyMarket{
|
||||
Denom: denom,
|
||||
BorrowLimit: bl,
|
||||
SpotMarketID: sm,
|
||||
ConversionFactor: cf,
|
||||
InterestRateModel: irm,
|
||||
ReserveFactor: rf,
|
||||
KeeperRewardPercentage: kr,
|
||||
}
|
||||
}
|
||||
|
||||
// AllowedMoneyMarkets slice of AllowedMoneyMarket
|
||||
type AllowedMoneyMarkets []AllowedMoneyMarket
|
@ -1,51 +0,0 @@
|
||||
package v0_15
|
||||
|
||||
import (
|
||||
"github.com/cosmos/cosmos-sdk/codec"
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
)
|
||||
|
||||
// GenesisState is state that must be provided at chain genesis.
|
||||
type GenesisState struct {
|
||||
NextProposalID uint64 `json:"next_proposal_id" yaml:"next_proposal_id"`
|
||||
Committees Committees `json:"committees" yaml:"committees"`
|
||||
Proposals []Proposal `json:"proposals" yaml:"proposals"`
|
||||
Votes []Vote `json:"votes" yaml:"votes"`
|
||||
}
|
||||
|
||||
// MsgSubmitProposal is used by committee members to create a new proposal that they can vote on.
|
||||
type MsgSubmitProposal struct {
|
||||
PubProposal PubProposal `json:"pub_proposal" yaml:"pub_proposal"`
|
||||
Proposer sdk.AccAddress `json:"proposer" yaml:"proposer"`
|
||||
CommitteeID uint64 `json:"committee_id" yaml:"committee_id"`
|
||||
}
|
||||
|
||||
// MsgVote is submitted by committee members to vote on proposals.
|
||||
type MsgVote struct {
|
||||
ProposalID uint64 `json:"proposal_id" yaml:"proposal_id"`
|
||||
Voter sdk.AccAddress `json:"voter" yaml:"voter"`
|
||||
VoteType VoteType `json:"vote_type" yaml:"vote_type"`
|
||||
}
|
||||
|
||||
func RegisterLegacyAminoCodec(cdc *codec.LegacyAmino) {
|
||||
// Proposals
|
||||
cdc.RegisterInterface((*PubProposal)(nil), nil)
|
||||
|
||||
// Committees
|
||||
cdc.RegisterInterface((*Committee)(nil), nil)
|
||||
cdc.RegisterConcrete(BaseCommittee{}, "kava/BaseCommittee", nil)
|
||||
cdc.RegisterConcrete(MemberCommittee{}, "kava/MemberCommittee", nil)
|
||||
cdc.RegisterConcrete(TokenCommittee{}, "kava/TokenCommittee", nil)
|
||||
|
||||
// Permissions
|
||||
cdc.RegisterInterface((*Permission)(nil), nil)
|
||||
cdc.RegisterConcrete(GodPermission{}, "kava/GodPermission", nil)
|
||||
cdc.RegisterConcrete(SimpleParamChangePermission{}, "kava/SimpleParamChangePermission", nil)
|
||||
cdc.RegisterConcrete(TextPermission{}, "kava/TextPermission", nil)
|
||||
cdc.RegisterConcrete(SoftwareUpgradePermission{}, "kava/SoftwareUpgradePermission", nil)
|
||||
cdc.RegisterConcrete(SubParamChangePermission{}, "kava/SubParamChangePermission", nil)
|
||||
|
||||
// Msgs
|
||||
cdc.RegisterConcrete(MsgSubmitProposal{}, "kava/MsgSubmitProposal", nil)
|
||||
cdc.RegisterConcrete(MsgVote{}, "kava/MsgVote", nil)
|
||||
}
|
@ -1,564 +0,0 @@
|
||||
package v0_16
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"reflect"
|
||||
"sort"
|
||||
|
||||
proto "github.com/gogo/protobuf/proto"
|
||||
|
||||
codectypes "github.com/cosmos/cosmos-sdk/codec/types"
|
||||
v036distr "github.com/cosmos/cosmos-sdk/x/distribution/legacy/v036"
|
||||
v040distr "github.com/cosmos/cosmos-sdk/x/distribution/types"
|
||||
v036gov "github.com/cosmos/cosmos-sdk/x/gov/legacy/v036"
|
||||
v040gov "github.com/cosmos/cosmos-sdk/x/gov/types"
|
||||
v036params "github.com/cosmos/cosmos-sdk/x/params/legacy/v036"
|
||||
v040params "github.com/cosmos/cosmos-sdk/x/params/types/proposal"
|
||||
v038upgrade "github.com/cosmos/cosmos-sdk/x/upgrade/legacy/v038"
|
||||
v040upgrade "github.com/cosmos/cosmos-sdk/x/upgrade/types"
|
||||
|
||||
v016bep3types "github.com/kava-labs/kava/x/bep3/types"
|
||||
v016cdptypes "github.com/kava-labs/kava/x/cdp/types"
|
||||
v015committee "github.com/kava-labs/kava/x/committee/legacy/v0_15"
|
||||
v016committee "github.com/kava-labs/kava/x/committee/types"
|
||||
v016hardMigration "github.com/kava-labs/kava/x/hard/legacy/v0_16"
|
||||
v016hardtypes "github.com/kava-labs/kava/x/hard/types"
|
||||
v015kavadist "github.com/kava-labs/kava/x/kavadist/legacy/v0_15"
|
||||
v016kavadist "github.com/kava-labs/kava/x/kavadist/types"
|
||||
v015pricefeed "github.com/kava-labs/kava/x/pricefeed/legacy/v0_15"
|
||||
v016pricefeedmigration "github.com/kava-labs/kava/x/pricefeed/legacy/v0_16"
|
||||
v016pricefeedtypes "github.com/kava-labs/kava/x/pricefeed/types"
|
||||
)
|
||||
|
||||
const (
|
||||
KavaStabilityCommitteeID = 1
|
||||
HardGovernanceCommitteeID = 3
|
||||
)
|
||||
|
||||
// migrateWhitelist returns an string slice of json keys that should be whitelisted on the whitelist interface
|
||||
func migrateWhitelist(whitelist interface{}, ignoredTag string) []string {
|
||||
allowed := []string{}
|
||||
v := reflect.ValueOf(whitelist)
|
||||
typeOfS := v.Type()
|
||||
for i := 0; i < v.NumField(); i++ {
|
||||
tag := typeOfS.Field(i).Tag.Get("json")
|
||||
if tag != ignoredTag && tag != "" {
|
||||
val, ok := v.Field(i).Interface().(bool)
|
||||
if ok && val {
|
||||
allowed = append(allowed, tag)
|
||||
}
|
||||
}
|
||||
}
|
||||
sort.Strings(allowed)
|
||||
return allowed
|
||||
}
|
||||
|
||||
// isSubparamAllowed returns true if the subspace and key is allowed in the v15 permissions
|
||||
func isSubparamAllowed(permission v015committee.SubParamChangePermission, subspace string, key string) bool {
|
||||
for _, allowed := range permission.AllowedParams {
|
||||
if allowed.Key == key && allowed.Subspace == subspace {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
type subspaceKeyPair struct {
|
||||
key []byte
|
||||
subspace string
|
||||
}
|
||||
|
||||
// migrateSubParamPermissions converts v15 SubParamChangePermissions to v16 ParamsChangePermission
|
||||
func migrateSubParamPermissions(
|
||||
permission v015committee.SubParamChangePermission,
|
||||
committeeID uint64,
|
||||
oldPricefeedState v015pricefeed.GenesisState,
|
||||
) *v016committee.ParamsChangePermission {
|
||||
changes := v016committee.AllowedParamsChanges{}
|
||||
|
||||
// migrate allowed params
|
||||
pairsToAvoid := []subspaceKeyPair{
|
||||
{key: v016cdptypes.KeyCollateralParams, subspace: v016cdptypes.ModuleName},
|
||||
{key: v016cdptypes.KeyDebtParam, subspace: v016cdptypes.ModuleName},
|
||||
{key: v016bep3types.KeyAssetParams, subspace: v016bep3types.ModuleName},
|
||||
{key: v016pricefeedtypes.KeyMarkets, subspace: v016pricefeedtypes.ModuleName},
|
||||
{key: v016hardtypes.KeyMoneyMarkets, subspace: v016hardtypes.ModuleName},
|
||||
}
|
||||
for _, allowed := range permission.AllowedParams {
|
||||
shouldAvoid := false
|
||||
for _, pair := range pairsToAvoid {
|
||||
if string(pair.key) == allowed.Key && pair.subspace == allowed.Subspace {
|
||||
shouldAvoid = true
|
||||
break
|
||||
}
|
||||
}
|
||||
if !shouldAvoid {
|
||||
changes = append(changes, v016committee.AllowedParamsChange{
|
||||
Subspace: allowed.Subspace,
|
||||
Key: allowed.Key,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
// migrate collateral params
|
||||
if isSubparamAllowed(permission, v016cdptypes.ModuleName, string(v016cdptypes.KeyCollateralParams)) {
|
||||
change := v016committee.AllowedParamsChange{
|
||||
Key: string(v016cdptypes.KeyCollateralParams),
|
||||
Subspace: string(v016cdptypes.ModuleName),
|
||||
}
|
||||
requirements := []v016committee.SubparamRequirement{}
|
||||
for _, param := range permission.AllowedCollateralParams {
|
||||
requirement := v016committee.SubparamRequirement{
|
||||
Key: "type",
|
||||
Val: param.Type,
|
||||
AllowedSubparamAttrChanges: []string{},
|
||||
}
|
||||
allowed := migrateWhitelist(param, "type")
|
||||
requirement.AllowedSubparamAttrChanges = allowed
|
||||
requirements = append(requirements, requirement)
|
||||
}
|
||||
|
||||
// add new requirement for stability committee
|
||||
if committeeID == KavaStabilityCommitteeID {
|
||||
requirement := v016committee.SubparamRequirement{
|
||||
Key: "type",
|
||||
Val: "swp-a",
|
||||
AllowedSubparamAttrChanges: []string{
|
||||
"auction_size", "check_collateralization_index_count", "debt_limit",
|
||||
"keeper_reward_percentage", "stability_fee",
|
||||
},
|
||||
}
|
||||
requirements = append(requirements, requirement)
|
||||
}
|
||||
|
||||
change.MultiSubparamsRequirements = requirements
|
||||
changes = append(changes, change)
|
||||
}
|
||||
|
||||
// migrate debt params
|
||||
if isSubparamAllowed(permission, string(v016cdptypes.ModuleName), string(v016cdptypes.KeyDebtParam)) {
|
||||
change := v016committee.AllowedParamsChange{
|
||||
Subspace: v016cdptypes.ModuleName,
|
||||
Key: string(v016cdptypes.KeyDebtParam),
|
||||
SingleSubparamAllowedAttrs: migrateWhitelist(permission.AllowedDebtParam, ""),
|
||||
}
|
||||
changes = append(changes, change)
|
||||
}
|
||||
|
||||
// migrate asset params
|
||||
if isSubparamAllowed(permission, string(v016bep3types.ModuleName), string(v016bep3types.KeyAssetParams)) {
|
||||
change := v016committee.AllowedParamsChange{
|
||||
Key: string(v016bep3types.KeyAssetParams),
|
||||
Subspace: string(v016bep3types.ModuleName),
|
||||
}
|
||||
requirements := []v016committee.SubparamRequirement{}
|
||||
for _, param := range permission.AllowedAssetParams {
|
||||
requirement := v016committee.SubparamRequirement{
|
||||
Key: "denom",
|
||||
Val: param.Denom,
|
||||
AllowedSubparamAttrChanges: []string{},
|
||||
}
|
||||
allowed := migrateWhitelist(param, "denom")
|
||||
requirement.AllowedSubparamAttrChanges = allowed
|
||||
requirements = append(requirements, requirement)
|
||||
}
|
||||
change.MultiSubparamsRequirements = requirements
|
||||
changes = append(changes, change)
|
||||
}
|
||||
|
||||
// migrate markets
|
||||
if isSubparamAllowed(permission, string(v016pricefeedtypes.ModuleName), string(v016pricefeedtypes.KeyMarkets)) {
|
||||
change := v016committee.AllowedParamsChange{
|
||||
Key: string(v016pricefeedtypes.KeyMarkets),
|
||||
Subspace: string(v016pricefeedtypes.ModuleName),
|
||||
}
|
||||
requirements := []v016committee.SubparamRequirement{}
|
||||
for _, param := range permission.AllowedMarkets {
|
||||
requirement := v016committee.SubparamRequirement{
|
||||
Key: "market_id",
|
||||
Val: param.MarketID,
|
||||
AllowedSubparamAttrChanges: []string{},
|
||||
}
|
||||
allowed := migrateWhitelist(param, "market_id")
|
||||
requirement.AllowedSubparamAttrChanges = allowed
|
||||
requirements = append(requirements, requirement)
|
||||
}
|
||||
|
||||
if committeeID == KavaStabilityCommitteeID {
|
||||
// Add permissions for existing pricefeed markets that are missing in allowed_markets
|
||||
outer:
|
||||
for _, oldPricefeedMarket := range oldPricefeedState.Params.Markets {
|
||||
// Skip if this oldPricefeedMarket already exists in requirements
|
||||
for _, marketRequirement := range requirements {
|
||||
if marketRequirement.Val == oldPricefeedMarket.MarketID {
|
||||
continue outer
|
||||
}
|
||||
}
|
||||
|
||||
requirement := v016committee.SubparamRequirement{
|
||||
Key: "market_id",
|
||||
Val: oldPricefeedMarket.MarketID,
|
||||
AllowedSubparamAttrChanges: []string{"active"},
|
||||
}
|
||||
|
||||
requirements = append(requirements, requirement)
|
||||
}
|
||||
|
||||
// Add new IBC denoms for stability committee
|
||||
for _, market := range v016pricefeedmigration.NewIBCMarkets {
|
||||
requirement := v016committee.SubparamRequirement{
|
||||
Key: "market_id",
|
||||
Val: market.MarketID,
|
||||
AllowedSubparamAttrChanges: []string{"active"},
|
||||
}
|
||||
|
||||
requirements = append(requirements, requirement)
|
||||
}
|
||||
}
|
||||
|
||||
change.MultiSubparamsRequirements = requirements
|
||||
changes = append(changes, change)
|
||||
}
|
||||
|
||||
// migrate money markets
|
||||
if isSubparamAllowed(permission, string(v016hardtypes.ModuleName), string(v016hardtypes.KeyMoneyMarkets)) {
|
||||
change := v016committee.AllowedParamsChange{
|
||||
Key: string(v016hardtypes.KeyMoneyMarkets),
|
||||
Subspace: string(v016hardtypes.ModuleName),
|
||||
}
|
||||
requirements := []v016committee.SubparamRequirement{}
|
||||
for _, param := range permission.AllowedMoneyMarkets {
|
||||
requirement := v016committee.SubparamRequirement{
|
||||
Key: "denom",
|
||||
Val: param.Denom,
|
||||
AllowedSubparamAttrChanges: []string{},
|
||||
}
|
||||
allowed := migrateWhitelist(param, "denom")
|
||||
requirement.AllowedSubparamAttrChanges = allowed
|
||||
requirements = append(requirements, requirement)
|
||||
}
|
||||
|
||||
// add new requirement for stability committee
|
||||
if committeeID == KavaStabilityCommitteeID {
|
||||
requirement := v016committee.SubparamRequirement{
|
||||
Key: "denom",
|
||||
Val: "swp",
|
||||
AllowedSubparamAttrChanges: []string{
|
||||
"borrow_limit", "interest_rate_model",
|
||||
"keeper_reward_percentage", "reserve_factor",
|
||||
},
|
||||
}
|
||||
requirements = append(requirements, requirement)
|
||||
|
||||
requirementAtom := v016committee.SubparamRequirement{
|
||||
Key: "denom",
|
||||
Val: v016hardMigration.UATOM_IBC_DENOM,
|
||||
AllowedSubparamAttrChanges: []string{
|
||||
"borrow_limit", "interest_rate_model",
|
||||
"keeper_reward_percentage", "reserve_factor",
|
||||
},
|
||||
}
|
||||
requirements = append(requirements, requirementAtom)
|
||||
} else if committeeID == HardGovernanceCommitteeID {
|
||||
// add new requirement for Hard Governance committee
|
||||
requirementSwp := v016committee.SubparamRequirement{
|
||||
Key: "denom",
|
||||
Val: "swp",
|
||||
AllowedSubparamAttrChanges: []string{
|
||||
"borrow_limit", "interest_rate_model", "keeper_reward_percentage",
|
||||
"reserve_factor", "spot_market_id",
|
||||
},
|
||||
}
|
||||
requirements = append(requirements, requirementSwp)
|
||||
|
||||
requirementUatom := v016committee.SubparamRequirement{
|
||||
Key: "denom",
|
||||
Val: v016hardMigration.UATOM_IBC_DENOM,
|
||||
AllowedSubparamAttrChanges: []string{
|
||||
"borrow_limit", "interest_rate_model", "keeper_reward_percentage",
|
||||
"reserve_factor", "spot_market_id",
|
||||
},
|
||||
}
|
||||
requirements = append(requirements, requirementUatom)
|
||||
}
|
||||
|
||||
change.MultiSubparamsRequirements = requirements
|
||||
changes = append(changes, change)
|
||||
}
|
||||
|
||||
return &v016committee.ParamsChangePermission{
|
||||
AllowedParamsChanges: changes,
|
||||
}
|
||||
}
|
||||
|
||||
func migratePermission(
|
||||
v015permission v015committee.Permission,
|
||||
committeeID uint64,
|
||||
oldPricefeedState v015pricefeed.GenesisState,
|
||||
) *codectypes.Any {
|
||||
var protoProposal proto.Message
|
||||
|
||||
switch v015permission := v015permission.(type) {
|
||||
case v015committee.GodPermission:
|
||||
{
|
||||
protoProposal = &v016committee.GodPermission{}
|
||||
}
|
||||
case v015committee.TextPermission:
|
||||
{
|
||||
protoProposal = &v016committee.TextPermission{}
|
||||
}
|
||||
case v015committee.SoftwareUpgradePermission:
|
||||
{
|
||||
protoProposal = &v016committee.SoftwareUpgradePermission{}
|
||||
}
|
||||
case v015committee.SimpleParamChangePermission:
|
||||
{
|
||||
changes := make(v016committee.AllowedParamsChanges, len(v015permission.AllowedParams))
|
||||
for i, param := range v015permission.AllowedParams {
|
||||
changes[i] = v016committee.AllowedParamsChange{
|
||||
Subspace: param.Subspace,
|
||||
Key: param.Key,
|
||||
}
|
||||
}
|
||||
protoProposal = &v016committee.ParamsChangePermission{
|
||||
AllowedParamsChanges: changes,
|
||||
}
|
||||
}
|
||||
case v015committee.SubParamChangePermission:
|
||||
{
|
||||
protoProposal = migrateSubParamPermissions(v015permission, committeeID, oldPricefeedState)
|
||||
}
|
||||
default:
|
||||
panic(fmt.Errorf("'%s' is not a valid permission", v015permission))
|
||||
}
|
||||
|
||||
// Convert the content into Any.
|
||||
contentAny, err := codectypes.NewAnyWithValue(protoProposal)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
return contentAny
|
||||
}
|
||||
|
||||
func migrateTallyOption(oldTallyOption v015committee.TallyOption) v016committee.TallyOption {
|
||||
switch oldTallyOption {
|
||||
case v015committee.NullTallyOption:
|
||||
return v016committee.TALLY_OPTION_UNSPECIFIED
|
||||
case v015committee.FirstPastThePost:
|
||||
return v016committee.TALLY_OPTION_FIRST_PAST_THE_POST
|
||||
case v015committee.Deadline:
|
||||
return v016committee.TALLY_OPTION_DEADLINE
|
||||
default:
|
||||
panic(fmt.Errorf("'%s' is not a valid tally option", oldTallyOption))
|
||||
}
|
||||
}
|
||||
|
||||
func migrateCommittee(committee v015committee.Committee, oldPricefeedState v015pricefeed.GenesisState) *codectypes.Any {
|
||||
var protoProposal proto.Message
|
||||
switch committee := committee.(type) {
|
||||
case v015committee.MemberCommittee:
|
||||
{
|
||||
permissions := make([]*codectypes.Any, len(committee.Permissions))
|
||||
for i, permission := range committee.Permissions {
|
||||
permissions[i] = migratePermission(permission, committee.GetID(), oldPricefeedState)
|
||||
}
|
||||
|
||||
protoProposal = &v016committee.MemberCommittee{
|
||||
BaseCommittee: &v016committee.BaseCommittee{
|
||||
ID: committee.ID,
|
||||
Description: committee.Description,
|
||||
Members: committee.Members,
|
||||
Permissions: permissions,
|
||||
VoteThreshold: committee.VoteThreshold,
|
||||
ProposalDuration: committee.ProposalDuration,
|
||||
TallyOption: migrateTallyOption(committee.TallyOption),
|
||||
},
|
||||
}
|
||||
}
|
||||
case v015committee.TokenCommittee:
|
||||
{
|
||||
permissions := make([]*codectypes.Any, len(committee.Permissions))
|
||||
for i, permission := range committee.Permissions {
|
||||
permissions[i] = migratePermission(permission, committee.GetID(), oldPricefeedState)
|
||||
}
|
||||
|
||||
protoProposal = &v016committee.TokenCommittee{
|
||||
BaseCommittee: &v016committee.BaseCommittee{
|
||||
ID: committee.ID,
|
||||
Description: committee.Description,
|
||||
Members: committee.Members,
|
||||
Permissions: permissions,
|
||||
VoteThreshold: committee.VoteThreshold,
|
||||
ProposalDuration: committee.ProposalDuration,
|
||||
TallyOption: migrateTallyOption(committee.TallyOption),
|
||||
},
|
||||
Quorum: committee.Quorum,
|
||||
TallyDenom: committee.TallyDenom,
|
||||
}
|
||||
}
|
||||
default:
|
||||
panic(fmt.Errorf("'%s' is not a valid committee", committee))
|
||||
}
|
||||
|
||||
// Convert the content into Any.
|
||||
contentAny, err := codectypes.NewAnyWithValue(protoProposal)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
return contentAny
|
||||
}
|
||||
|
||||
func migrateCommittees(v015committees v015committee.Committees, oldPricefeedState v015pricefeed.GenesisState) []*codectypes.Any {
|
||||
committees := make([]*codectypes.Any, len(v015committees))
|
||||
for i, committee := range v015committees {
|
||||
committees[i] = migrateCommittee(committee, oldPricefeedState)
|
||||
}
|
||||
return committees
|
||||
}
|
||||
|
||||
func migrateContent(oldContent v036gov.Content) *codectypes.Any {
|
||||
var protoProposal proto.Message
|
||||
|
||||
switch oldContent := oldContent.(type) {
|
||||
case v036gov.TextProposal:
|
||||
{
|
||||
protoProposal = &v040gov.TextProposal{
|
||||
Title: oldContent.Title,
|
||||
Description: oldContent.Description,
|
||||
}
|
||||
// Convert the content into Any.
|
||||
contentAny, err := codectypes.NewAnyWithValue(protoProposal)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
return contentAny
|
||||
}
|
||||
case v036distr.CommunityPoolSpendProposal:
|
||||
{
|
||||
protoProposal = &v040distr.CommunityPoolSpendProposal{
|
||||
Title: oldContent.Title,
|
||||
Description: oldContent.Description,
|
||||
Recipient: oldContent.Recipient.String(),
|
||||
Amount: oldContent.Amount,
|
||||
}
|
||||
}
|
||||
case v038upgrade.CancelSoftwareUpgradeProposal:
|
||||
{
|
||||
protoProposal = &v040upgrade.CancelSoftwareUpgradeProposal{
|
||||
Description: oldContent.Description,
|
||||
Title: oldContent.Title,
|
||||
}
|
||||
}
|
||||
case v038upgrade.SoftwareUpgradeProposal:
|
||||
{
|
||||
protoProposal = &v040upgrade.SoftwareUpgradeProposal{
|
||||
Description: oldContent.Description,
|
||||
Title: oldContent.Title,
|
||||
Plan: v040upgrade.Plan{
|
||||
Name: oldContent.Plan.Name,
|
||||
Height: oldContent.Plan.Height,
|
||||
Info: oldContent.Plan.Info,
|
||||
},
|
||||
}
|
||||
}
|
||||
case v036params.ParameterChangeProposal:
|
||||
{
|
||||
newChanges := make([]v040params.ParamChange, len(oldContent.Changes))
|
||||
for i, oldChange := range oldContent.Changes {
|
||||
newChanges[i] = v040params.ParamChange{
|
||||
Subspace: oldChange.Subspace,
|
||||
Key: oldChange.Key,
|
||||
Value: oldChange.Value,
|
||||
}
|
||||
}
|
||||
|
||||
protoProposal = &v040params.ParameterChangeProposal{
|
||||
Description: oldContent.Description,
|
||||
Title: oldContent.Title,
|
||||
Changes: newChanges,
|
||||
}
|
||||
}
|
||||
case v015kavadist.CommunityPoolMultiSpendProposal:
|
||||
{
|
||||
newRecipients := make([]v016kavadist.MultiSpendRecipient, len(oldContent.RecipientList))
|
||||
for i, recipient := range oldContent.RecipientList {
|
||||
newRecipients[i] = v016kavadist.MultiSpendRecipient{
|
||||
Address: recipient.Address.String(),
|
||||
Amount: recipient.Amount,
|
||||
}
|
||||
}
|
||||
|
||||
protoProposal = &v016kavadist.CommunityPoolMultiSpendProposal{
|
||||
Description: oldContent.Description,
|
||||
Title: oldContent.Title,
|
||||
RecipientList: newRecipients,
|
||||
}
|
||||
}
|
||||
default:
|
||||
panic(fmt.Errorf("%T is not a valid proposal content type", oldContent))
|
||||
}
|
||||
|
||||
// Convert the content into Any.
|
||||
contentAny, err := codectypes.NewAnyWithValue(protoProposal)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
return contentAny
|
||||
}
|
||||
|
||||
func migrateProposals(v015proposals []v015committee.Proposal) v016committee.Proposals {
|
||||
proposals := make(v016committee.Proposals, len(v015proposals))
|
||||
for i, v15proposal := range v015proposals {
|
||||
proposals[i] = v016committee.Proposal{
|
||||
ID: v15proposal.ID,
|
||||
Content: migrateContent(v15proposal.PubProposal),
|
||||
CommitteeID: v15proposal.CommitteeID,
|
||||
Deadline: v15proposal.Deadline,
|
||||
}
|
||||
}
|
||||
return proposals
|
||||
}
|
||||
|
||||
func migrateVoteType(oldVoteType v015committee.VoteType) v016committee.VoteType {
|
||||
switch oldVoteType {
|
||||
case v015committee.Yes:
|
||||
return v016committee.VOTE_TYPE_YES
|
||||
case v015committee.No:
|
||||
return v016committee.VOTE_TYPE_NO
|
||||
case v015committee.Abstain:
|
||||
return v016committee.VOTE_TYPE_ABSTAIN
|
||||
case v015committee.NullVoteType:
|
||||
return v016committee.VOTE_TYPE_UNSPECIFIED
|
||||
default:
|
||||
panic(fmt.Errorf("'%s' is not a valid vote type", oldVoteType))
|
||||
}
|
||||
}
|
||||
|
||||
func migrateVotes(v15votes []v015committee.Vote) []v016committee.Vote {
|
||||
votes := make([]v016committee.Vote, len(v15votes))
|
||||
for i, v15vote := range v15votes {
|
||||
votes[i] = v016committee.Vote{
|
||||
ProposalID: v15vote.ProposalID,
|
||||
Voter: v15vote.Voter,
|
||||
VoteType: migrateVoteType(v15vote.VoteType),
|
||||
}
|
||||
}
|
||||
return votes
|
||||
}
|
||||
|
||||
func Migrate(
|
||||
oldState v015committee.GenesisState,
|
||||
oldPricefeedState v015pricefeed.GenesisState,
|
||||
) *v016committee.GenesisState {
|
||||
newState := v016committee.GenesisState{
|
||||
NextProposalID: oldState.NextProposalID,
|
||||
Committees: migrateCommittees(oldState.Committees, oldPricefeedState),
|
||||
Proposals: migrateProposals(oldState.Proposals),
|
||||
Votes: migrateVotes(oldState.Votes),
|
||||
}
|
||||
return &newState
|
||||
}
|
@ -1,366 +0,0 @@
|
||||
package v0_16
|
||||
|
||||
import (
|
||||
"time"
|
||||
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
|
||||
v016bep3types "github.com/kava-labs/kava/x/bep3/types"
|
||||
v016cdptypes "github.com/kava-labs/kava/x/cdp/types"
|
||||
v015committee "github.com/kava-labs/kava/x/committee/legacy/v0_15"
|
||||
v016committee "github.com/kava-labs/kava/x/committee/types"
|
||||
v016hardtypes "github.com/kava-labs/kava/x/hard/types"
|
||||
v016pricefeedtypes "github.com/kava-labs/kava/x/pricefeed/types"
|
||||
)
|
||||
|
||||
func (s *migrateTestSuite) TestMigrate_Committee_SubparamPermissions() {
|
||||
testcases := []struct {
|
||||
name string
|
||||
v015permission v015committee.Permission
|
||||
v016permission v016committee.Permission
|
||||
}{
|
||||
{
|
||||
name: "allowed collateral params",
|
||||
v015permission: v015committee.SubParamChangePermission{
|
||||
AllowedParams: v015committee.AllowedParams{{
|
||||
Subspace: v016cdptypes.ModuleName,
|
||||
Key: string(v016cdptypes.KeyCollateralParams),
|
||||
}},
|
||||
AllowedCollateralParams: v015committee.AllowedCollateralParams{
|
||||
{
|
||||
Type: "bnb",
|
||||
Denom: true,
|
||||
LiquidationRatio: false,
|
||||
DebtLimit: true,
|
||||
KeeperRewardPercentage: true,
|
||||
},
|
||||
{
|
||||
Type: "btc",
|
||||
Prefix: true,
|
||||
SpotMarketID: false,
|
||||
DebtLimit: true,
|
||||
CheckCollateralizationIndexCount: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
v016permission: &v016committee.ParamsChangePermission{
|
||||
AllowedParamsChanges: v016committee.AllowedParamsChanges{
|
||||
{
|
||||
Subspace: v016cdptypes.ModuleName,
|
||||
Key: string(v016cdptypes.KeyCollateralParams),
|
||||
MultiSubparamsRequirements: []v016committee.SubparamRequirement{
|
||||
{
|
||||
Key: "type",
|
||||
Val: "bnb",
|
||||
AllowedSubparamAttrChanges: []string{"debt_limit", "denom", "keeper_reward_percentage"},
|
||||
},
|
||||
{
|
||||
Key: "type",
|
||||
Val: "btc",
|
||||
AllowedSubparamAttrChanges: []string{"check_collateralization_index_count", "debt_limit", "prefix"},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "allowed collateral params - no requirements",
|
||||
v015permission: v015committee.SubParamChangePermission{
|
||||
AllowedParams: v015committee.AllowedParams{{
|
||||
Subspace: v016cdptypes.ModuleName,
|
||||
Key: string(v016cdptypes.KeyCollateralParams),
|
||||
}},
|
||||
},
|
||||
v016permission: &v016committee.ParamsChangePermission{
|
||||
AllowedParamsChanges: v016committee.AllowedParamsChanges{
|
||||
{
|
||||
Subspace: v016cdptypes.ModuleName,
|
||||
Key: string(v016cdptypes.KeyCollateralParams),
|
||||
MultiSubparamsRequirements: []v016committee.SubparamRequirement{},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "allowed debt params",
|
||||
v015permission: v015committee.SubParamChangePermission{
|
||||
AllowedParams: v015committee.AllowedParams{{
|
||||
Subspace: v016cdptypes.ModuleName,
|
||||
Key: string(v016cdptypes.KeyDebtParam),
|
||||
}},
|
||||
AllowedDebtParam: v015committee.AllowedDebtParam{
|
||||
Denom: true,
|
||||
ReferenceAsset: false,
|
||||
ConversionFactor: true,
|
||||
DebtFloor: true,
|
||||
},
|
||||
},
|
||||
v016permission: &v016committee.ParamsChangePermission{
|
||||
AllowedParamsChanges: v016committee.AllowedParamsChanges{
|
||||
{
|
||||
Subspace: v016cdptypes.ModuleName,
|
||||
Key: string(v016cdptypes.KeyDebtParam),
|
||||
SingleSubparamAllowedAttrs: []string{"conversion_factor", "debt_floor", "denom"},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "allowed debt params - no requirements",
|
||||
v015permission: v015committee.SubParamChangePermission{
|
||||
AllowedParams: v015committee.AllowedParams{{
|
||||
Subspace: v016cdptypes.ModuleName,
|
||||
Key: string(v016cdptypes.KeyDebtParam),
|
||||
}},
|
||||
},
|
||||
v016permission: &v016committee.ParamsChangePermission{
|
||||
AllowedParamsChanges: v016committee.AllowedParamsChanges{
|
||||
{
|
||||
Subspace: v016cdptypes.ModuleName,
|
||||
Key: string(v016cdptypes.KeyDebtParam),
|
||||
SingleSubparamAllowedAttrs: []string{},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "param not allowed",
|
||||
v015permission: v015committee.SubParamChangePermission{
|
||||
AllowedDebtParam: v015committee.AllowedDebtParam{
|
||||
Denom: true,
|
||||
ReferenceAsset: false,
|
||||
ConversionFactor: true,
|
||||
DebtFloor: true,
|
||||
},
|
||||
},
|
||||
v016permission: &v016committee.ParamsChangePermission{
|
||||
AllowedParamsChanges: v016committee.AllowedParamsChanges{},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "allowed asset params",
|
||||
v015permission: v015committee.SubParamChangePermission{
|
||||
AllowedParams: v015committee.AllowedParams{{
|
||||
Subspace: v016bep3types.ModuleName,
|
||||
Key: string(v016bep3types.KeyAssetParams),
|
||||
}},
|
||||
AllowedAssetParams: v015committee.AllowedAssetParams{
|
||||
{
|
||||
Denom: "bnb",
|
||||
CoinID: true,
|
||||
MaxSwapAmount: true,
|
||||
Active: true,
|
||||
},
|
||||
{
|
||||
Denom: "btc",
|
||||
Limit: true,
|
||||
MinBlockLock: true,
|
||||
Active: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
v016permission: &v016committee.ParamsChangePermission{
|
||||
AllowedParamsChanges: v016committee.AllowedParamsChanges{
|
||||
{
|
||||
Subspace: v016bep3types.ModuleName,
|
||||
Key: string(v016bep3types.KeyAssetParams),
|
||||
MultiSubparamsRequirements: []v016committee.SubparamRequirement{
|
||||
{
|
||||
Key: "denom",
|
||||
Val: "bnb",
|
||||
AllowedSubparamAttrChanges: []string{"active", "coin_id", "max_swap_amount"},
|
||||
},
|
||||
{
|
||||
Key: "denom",
|
||||
Val: "btc",
|
||||
AllowedSubparamAttrChanges: []string{"active", "limit", "min_block_lock"},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "allowed asset params - no requirements",
|
||||
v015permission: v015committee.SubParamChangePermission{
|
||||
AllowedParams: v015committee.AllowedParams{{
|
||||
Subspace: v016bep3types.ModuleName,
|
||||
Key: string(v016bep3types.KeyAssetParams),
|
||||
}},
|
||||
},
|
||||
v016permission: &v016committee.ParamsChangePermission{
|
||||
AllowedParamsChanges: v016committee.AllowedParamsChanges{
|
||||
{
|
||||
Subspace: v016bep3types.ModuleName,
|
||||
Key: string(v016bep3types.KeyAssetParams),
|
||||
MultiSubparamsRequirements: []v016committee.SubparamRequirement{},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "allowed markets",
|
||||
v015permission: v015committee.SubParamChangePermission{
|
||||
AllowedParams: v015committee.AllowedParams{{
|
||||
Subspace: v016pricefeedtypes.ModuleName,
|
||||
Key: string(v016pricefeedtypes.KeyMarkets),
|
||||
}},
|
||||
AllowedMarkets: v015committee.AllowedMarkets{
|
||||
{
|
||||
MarketID: "bnb-btc",
|
||||
BaseAsset: false,
|
||||
QuoteAsset: true,
|
||||
Active: true,
|
||||
},
|
||||
{
|
||||
MarketID: "btc-usd",
|
||||
BaseAsset: true,
|
||||
Oracles: true,
|
||||
Active: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
v016permission: &v016committee.ParamsChangePermission{
|
||||
AllowedParamsChanges: v016committee.AllowedParamsChanges{
|
||||
{
|
||||
Subspace: v016pricefeedtypes.ModuleName,
|
||||
Key: string(v016pricefeedtypes.KeyMarkets),
|
||||
MultiSubparamsRequirements: []v016committee.SubparamRequirement{
|
||||
{
|
||||
Key: "market_id",
|
||||
Val: "bnb-btc",
|
||||
AllowedSubparamAttrChanges: []string{"active", "quote_asset"},
|
||||
},
|
||||
{
|
||||
Key: "market_id",
|
||||
Val: "btc-usd",
|
||||
AllowedSubparamAttrChanges: []string{"active", "base_asset", "oracles"},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "allowed markets - no requirements",
|
||||
v015permission: v015committee.SubParamChangePermission{
|
||||
AllowedParams: v015committee.AllowedParams{{
|
||||
Subspace: v016pricefeedtypes.ModuleName,
|
||||
Key: string(v016pricefeedtypes.KeyMarkets),
|
||||
}},
|
||||
},
|
||||
v016permission: &v016committee.ParamsChangePermission{
|
||||
AllowedParamsChanges: v016committee.AllowedParamsChanges{
|
||||
{
|
||||
Subspace: v016pricefeedtypes.ModuleName,
|
||||
Key: string(v016pricefeedtypes.KeyMarkets),
|
||||
MultiSubparamsRequirements: []v016committee.SubparamRequirement{},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "allowed money markets",
|
||||
v015permission: v015committee.SubParamChangePermission{
|
||||
AllowedParams: v015committee.AllowedParams{{
|
||||
Subspace: v016hardtypes.ModuleName,
|
||||
Key: string(v016hardtypes.KeyMoneyMarkets),
|
||||
}},
|
||||
AllowedMoneyMarkets: v015committee.AllowedMoneyMarkets{
|
||||
{
|
||||
Denom: "bnb",
|
||||
BorrowLimit: true,
|
||||
ConversionFactor: false,
|
||||
ReserveFactor: true,
|
||||
KeeperRewardPercentage: true,
|
||||
},
|
||||
{
|
||||
Denom: "btc",
|
||||
BorrowLimit: false,
|
||||
SpotMarketID: true,
|
||||
InterestRateModel: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
v016permission: &v016committee.ParamsChangePermission{
|
||||
AllowedParamsChanges: v016committee.AllowedParamsChanges{
|
||||
{
|
||||
Subspace: v016hardtypes.ModuleName,
|
||||
Key: string(v016hardtypes.KeyMoneyMarkets),
|
||||
MultiSubparamsRequirements: []v016committee.SubparamRequirement{
|
||||
{
|
||||
Key: "denom",
|
||||
Val: "bnb",
|
||||
AllowedSubparamAttrChanges: []string{"borrow_limit", "keeper_reward_percentage", "reserve_factor"},
|
||||
},
|
||||
{
|
||||
Key: "denom",
|
||||
Val: "btc",
|
||||
AllowedSubparamAttrChanges: []string{"interest_rate_model", "spot_market_id"},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "allowed money markets - no requirements",
|
||||
v015permission: v015committee.SubParamChangePermission{
|
||||
AllowedParams: v015committee.AllowedParams{{
|
||||
Subspace: v016hardtypes.ModuleName,
|
||||
Key: string(v016hardtypes.KeyMoneyMarkets),
|
||||
}},
|
||||
},
|
||||
v016permission: &v016committee.ParamsChangePermission{
|
||||
AllowedParamsChanges: v016committee.AllowedParamsChanges{
|
||||
{
|
||||
Subspace: v016hardtypes.ModuleName,
|
||||
Key: string(v016hardtypes.KeyMoneyMarkets),
|
||||
MultiSubparamsRequirements: []v016committee.SubparamRequirement{},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "allowed params",
|
||||
v015permission: v015committee.SubParamChangePermission{
|
||||
AllowedParams: v015committee.AllowedParams{{
|
||||
Subspace: v016hardtypes.ModuleName,
|
||||
Key: string(v016hardtypes.KeyMinimumBorrowUSDValue),
|
||||
}},
|
||||
},
|
||||
v016permission: &v016committee.ParamsChangePermission{
|
||||
AllowedParamsChanges: v016committee.AllowedParamsChanges{
|
||||
{
|
||||
Subspace: v016hardtypes.ModuleName,
|
||||
Key: string(v016hardtypes.KeyMinimumBorrowUSDValue),
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
for _, tc := range testcases {
|
||||
s.Run(tc.name, func() {
|
||||
oldCommittee := v015committee.MemberCommittee{
|
||||
BaseCommittee: v015committee.BaseCommittee{
|
||||
ID: 2,
|
||||
Description: "test",
|
||||
Members: s.addresses,
|
||||
Permissions: []v015committee.Permission{tc.v015permission},
|
||||
VoteThreshold: sdk.NewDec(40),
|
||||
ProposalDuration: time.Hour * 24 * 7,
|
||||
TallyOption: v015committee.FirstPastThePost,
|
||||
},
|
||||
}
|
||||
expectedProposal, err := v016committee.NewMemberCommittee(2, "test", s.addresses, []v016committee.Permission{tc.v016permission}, oldCommittee.VoteThreshold, oldCommittee.ProposalDuration, v016committee.TALLY_OPTION_FIRST_PAST_THE_POST)
|
||||
s.Require().NoError(err)
|
||||
|
||||
s.v15genstate.Committees = []v015committee.Committee{oldCommittee}
|
||||
genState := Migrate(s.v15genstate, s.v15pricefeedgenstate)
|
||||
s.Require().Len(genState.Committees, 1)
|
||||
s.Equal(expectedProposal, genState.GetCommittees()[0])
|
||||
})
|
||||
}
|
||||
}
|
@ -1,440 +0,0 @@
|
||||
package v0_16
|
||||
|
||||
import (
|
||||
"io/ioutil"
|
||||
"path/filepath"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/cosmos/cosmos-sdk/codec"
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
v036distr "github.com/cosmos/cosmos-sdk/x/distribution/legacy/v036"
|
||||
v040distr "github.com/cosmos/cosmos-sdk/x/distribution/types"
|
||||
v036gov "github.com/cosmos/cosmos-sdk/x/gov/legacy/v036"
|
||||
v040gov "github.com/cosmos/cosmos-sdk/x/gov/types"
|
||||
v036params "github.com/cosmos/cosmos-sdk/x/params/legacy/v036"
|
||||
v040params "github.com/cosmos/cosmos-sdk/x/params/types/proposal"
|
||||
v038upgrade "github.com/cosmos/cosmos-sdk/x/upgrade/legacy/v038"
|
||||
v040upgrade "github.com/cosmos/cosmos-sdk/x/upgrade/types"
|
||||
"github.com/stretchr/testify/suite"
|
||||
|
||||
app "github.com/kava-labs/kava/app"
|
||||
v015committee "github.com/kava-labs/kava/x/committee/legacy/v0_15"
|
||||
v016committee "github.com/kava-labs/kava/x/committee/types"
|
||||
v015kavadist "github.com/kava-labs/kava/x/kavadist/legacy/v0_15"
|
||||
v016kavadist "github.com/kava-labs/kava/x/kavadist/types"
|
||||
v015pricefeed "github.com/kava-labs/kava/x/pricefeed/legacy/v0_15"
|
||||
v016pricefeedtypes "github.com/kava-labs/kava/x/pricefeed/types"
|
||||
)
|
||||
|
||||
type migrateTestSuite struct {
|
||||
suite.Suite
|
||||
|
||||
addresses []sdk.AccAddress
|
||||
v15genstate v015committee.GenesisState
|
||||
v15pricefeedgenstate v015pricefeed.GenesisState
|
||||
cdc codec.Codec
|
||||
legacyCdc *codec.LegacyAmino
|
||||
}
|
||||
|
||||
func (s *migrateTestSuite) SetupTest() {
|
||||
app.SetSDKConfig()
|
||||
|
||||
s.v15genstate = v015committee.GenesisState{
|
||||
Committees: v015committee.Committees{},
|
||||
Proposals: []v015committee.Proposal{},
|
||||
NextProposalID: 1,
|
||||
Votes: []v015committee.Vote{},
|
||||
}
|
||||
|
||||
config := app.MakeEncodingConfig()
|
||||
s.cdc = config.Marshaler
|
||||
|
||||
legacyCodec := codec.NewLegacyAmino()
|
||||
v015committee.RegisterLegacyAminoCodec(legacyCodec)
|
||||
v036distr.RegisterLegacyAminoCodec(legacyCodec)
|
||||
v038upgrade.RegisterLegacyAminoCodec(legacyCodec)
|
||||
v036params.RegisterLegacyAminoCodec(legacyCodec)
|
||||
v015kavadist.RegisterLegacyAminoCodec(legacyCodec)
|
||||
|
||||
s.legacyCdc = legacyCodec
|
||||
|
||||
_, accAddresses := app.GeneratePrivKeyAddressPairs(10)
|
||||
s.addresses = accAddresses
|
||||
}
|
||||
|
||||
func (s *migrateTestSuite) TestMigrate_JSON() {
|
||||
file := filepath.Join("testdata", "v15-committee.json")
|
||||
data, err := ioutil.ReadFile(file)
|
||||
s.Require().NoError(err)
|
||||
|
||||
err = s.legacyCdc.UnmarshalJSON(data, &s.v15genstate)
|
||||
s.Require().NoError(err)
|
||||
|
||||
pricefeedFile := filepath.Join("testdata", "v15-pricefeed.json")
|
||||
pricefeedData, err := ioutil.ReadFile(pricefeedFile)
|
||||
s.Require().NoError(err)
|
||||
|
||||
err = s.legacyCdc.UnmarshalJSON(pricefeedData, &s.v15pricefeedgenstate)
|
||||
s.Require().NoError(err)
|
||||
|
||||
genstate := Migrate(s.v15genstate, s.v15pricefeedgenstate)
|
||||
actual := s.cdc.MustMarshalJSON(genstate)
|
||||
|
||||
file = filepath.Join("testdata", "v16-committee.json")
|
||||
expected, err := ioutil.ReadFile(file)
|
||||
|
||||
s.Require().NoError(err)
|
||||
s.Require().JSONEq(string(expected), string(actual))
|
||||
}
|
||||
|
||||
func (s *migrateTestSuite) TestMigrate_PricefeedPermissions() {
|
||||
file := filepath.Join("testdata", "v15-committee.json")
|
||||
data, err := ioutil.ReadFile(file)
|
||||
s.Require().NoError(err)
|
||||
|
||||
err = s.legacyCdc.UnmarshalJSON(data, &s.v15genstate)
|
||||
s.Require().NoError(err)
|
||||
|
||||
pricefeedFile := filepath.Join("testdata", "v15-pricefeed.json")
|
||||
pricefeedData, err := ioutil.ReadFile(pricefeedFile)
|
||||
s.Require().NoError(err)
|
||||
|
||||
err = s.legacyCdc.UnmarshalJSON(pricefeedData, &s.v15pricefeedgenstate)
|
||||
s.Require().NoError(err)
|
||||
|
||||
genstate := Migrate(s.v15genstate, s.v15pricefeedgenstate)
|
||||
|
||||
uniqueMarkets := make(map[string]bool)
|
||||
|
||||
for _, permission := range genstate.GetCommittees()[0].GetPermissions() {
|
||||
paramChangePermission, ok := permission.(v016committee.ParamsChangePermission)
|
||||
if !ok {
|
||||
continue
|
||||
}
|
||||
|
||||
for _, allowedParamChanges := range paramChangePermission.AllowedParamsChanges {
|
||||
if allowedParamChanges.Subspace == v016pricefeedtypes.ModuleName {
|
||||
for _, req := range allowedParamChanges.MultiSubparamsRequirements {
|
||||
_, found := uniqueMarkets[req.Val]
|
||||
s.Require().Falsef(
|
||||
found,
|
||||
"pricefeed market MultiSubparamsRequirement for %v is duplicated",
|
||||
req.Val,
|
||||
)
|
||||
|
||||
uniqueMarkets[req.Val] = true
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (s *migrateTestSuite) TestMigrate_TokenCommittee() {
|
||||
oldTokenCommittee := v015committee.TokenCommittee{
|
||||
BaseCommittee: v015committee.BaseCommittee{
|
||||
ID: 1,
|
||||
Description: "test",
|
||||
Members: s.addresses,
|
||||
Permissions: []v015committee.Permission{},
|
||||
VoteThreshold: sdk.NewDec(40),
|
||||
ProposalDuration: time.Hour * 24 * 7,
|
||||
TallyOption: v015committee.Deadline,
|
||||
},
|
||||
Quorum: sdk.NewDec(40),
|
||||
TallyDenom: "ukava",
|
||||
}
|
||||
|
||||
expectedTokenCommittee, err := v016committee.NewTokenCommittee(1, "test", s.addresses, []v016committee.Permission{}, oldTokenCommittee.VoteThreshold, oldTokenCommittee.ProposalDuration, v016committee.TALLY_OPTION_DEADLINE, oldTokenCommittee.Quorum, oldTokenCommittee.TallyDenom)
|
||||
s.Require().NoError(err)
|
||||
|
||||
s.v15genstate.Committees = []v015committee.Committee{oldTokenCommittee}
|
||||
genState := Migrate(s.v15genstate, s.v15pricefeedgenstate)
|
||||
s.Require().Len(genState.Committees, 1)
|
||||
s.Equal(expectedTokenCommittee, genState.GetCommittees()[0])
|
||||
}
|
||||
|
||||
func (s *migrateTestSuite) TestMigrate_Committee_TallyOption() {
|
||||
testcases := []struct {
|
||||
name string
|
||||
v015tallyOption v015committee.TallyOption
|
||||
v016tallyOption v016committee.TallyOption
|
||||
}{
|
||||
{
|
||||
name: "null tally option",
|
||||
v015tallyOption: v015committee.NullTallyOption,
|
||||
v016tallyOption: v016committee.TALLY_OPTION_UNSPECIFIED,
|
||||
},
|
||||
{
|
||||
name: "first past the post tally option",
|
||||
v015tallyOption: v015committee.FirstPastThePost,
|
||||
v016tallyOption: v016committee.TALLY_OPTION_FIRST_PAST_THE_POST,
|
||||
},
|
||||
{
|
||||
name: "deadline tally",
|
||||
v015tallyOption: v015committee.Deadline,
|
||||
v016tallyOption: v016committee.TALLY_OPTION_DEADLINE,
|
||||
},
|
||||
}
|
||||
|
||||
for _, tc := range testcases {
|
||||
s.Run(tc.name, func() {
|
||||
oldCommittee := v015committee.MemberCommittee{
|
||||
BaseCommittee: v015committee.BaseCommittee{
|
||||
ID: 2,
|
||||
Description: "test",
|
||||
Members: s.addresses,
|
||||
Permissions: []v015committee.Permission{},
|
||||
VoteThreshold: sdk.NewDec(40),
|
||||
ProposalDuration: time.Hour * 24 * 7,
|
||||
TallyOption: tc.v015tallyOption,
|
||||
},
|
||||
}
|
||||
expectedProposal, err := v016committee.NewMemberCommittee(2, "test", s.addresses, []v016committee.Permission{}, oldCommittee.VoteThreshold, oldCommittee.ProposalDuration, tc.v016tallyOption)
|
||||
s.Require().NoError(err)
|
||||
s.v15genstate.Committees = []v015committee.Committee{oldCommittee}
|
||||
genState := Migrate(s.v15genstate, s.v15pricefeedgenstate)
|
||||
s.Require().Len(genState.Committees, 1)
|
||||
s.Equal(expectedProposal.GetTallyOption(), genState.GetCommittees()[0].GetTallyOption())
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func (s *migrateTestSuite) TestMigrate_Committee_Permissions() {
|
||||
testcases := []struct {
|
||||
name string
|
||||
v015permission v015committee.Permission
|
||||
v016permission v016committee.Permission
|
||||
}{
|
||||
{
|
||||
name: "god permission",
|
||||
v015permission: v015committee.GodPermission{},
|
||||
v016permission: &v016committee.GodPermission{},
|
||||
},
|
||||
{
|
||||
name: "text permission",
|
||||
v015permission: v015committee.TextPermission{},
|
||||
v016permission: &v016committee.TextPermission{},
|
||||
},
|
||||
{
|
||||
name: "software upgrade permission",
|
||||
v015permission: v015committee.SoftwareUpgradePermission{},
|
||||
v016permission: &v016committee.SoftwareUpgradePermission{},
|
||||
},
|
||||
{
|
||||
name: "simple param change permission",
|
||||
v015permission: v015committee.SimpleParamChangePermission{
|
||||
AllowedParams: []v015committee.AllowedParam{
|
||||
{Subspace: "staking", Key: "bondDenom"},
|
||||
{Subspace: "test", Key: "testkey"},
|
||||
},
|
||||
},
|
||||
v016permission: &v016committee.ParamsChangePermission{
|
||||
AllowedParamsChanges: []v016committee.AllowedParamsChange{
|
||||
{Subspace: "staking", Key: "bondDenom"},
|
||||
{Subspace: "test", Key: "testkey"},
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "sub param change permission",
|
||||
v015permission: v015committee.SubParamChangePermission{
|
||||
AllowedParams: []v015committee.AllowedParam{
|
||||
{Subspace: "staking", Key: "bondDenom"},
|
||||
{Subspace: "test", Key: "testkey"},
|
||||
},
|
||||
},
|
||||
v016permission: &v016committee.ParamsChangePermission{
|
||||
AllowedParamsChanges: []v016committee.AllowedParamsChange{
|
||||
{Subspace: "staking", Key: "bondDenom"},
|
||||
{Subspace: "test", Key: "testkey"},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
for _, tc := range testcases {
|
||||
s.Run(tc.name, func() {
|
||||
oldCommittee := v015committee.MemberCommittee{
|
||||
BaseCommittee: v015committee.BaseCommittee{
|
||||
ID: 2,
|
||||
Description: "test",
|
||||
Members: s.addresses,
|
||||
Permissions: []v015committee.Permission{tc.v015permission},
|
||||
VoteThreshold: sdk.NewDec(40),
|
||||
ProposalDuration: time.Hour * 24 * 7,
|
||||
TallyOption: v015committee.FirstPastThePost,
|
||||
},
|
||||
}
|
||||
expectedProposal, err := v016committee.NewMemberCommittee(2, "test", s.addresses, []v016committee.Permission{tc.v016permission}, oldCommittee.VoteThreshold, oldCommittee.ProposalDuration, v016committee.TALLY_OPTION_FIRST_PAST_THE_POST)
|
||||
s.Require().NoError(err)
|
||||
s.v15genstate.Committees = []v015committee.Committee{oldCommittee}
|
||||
genState := Migrate(s.v15genstate, s.v15pricefeedgenstate)
|
||||
s.Require().Len(genState.Committees, 1)
|
||||
s.Equal(expectedProposal, genState.GetCommittees()[0])
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func (s *migrateTestSuite) TestMigrate_Proposals() {
|
||||
testcases := []struct {
|
||||
name string
|
||||
v015proposal v015committee.PubProposal
|
||||
v016proposal v016committee.PubProposal
|
||||
}{
|
||||
{
|
||||
name: "text proposal",
|
||||
v015proposal: v036gov.NewTextProposal("A Title", "A description of this proposal."),
|
||||
v016proposal: v040gov.NewTextProposal("A Title", "A description of this proposal."),
|
||||
},
|
||||
{
|
||||
name: "community poll spend proposal",
|
||||
v015proposal: v036distr.CommunityPoolSpendProposal{
|
||||
Title: "Community Pool Spend",
|
||||
Description: "Fund the community pool.",
|
||||
Recipient: s.addresses[0],
|
||||
Amount: sdk.NewCoins(sdk.NewInt64Coin("ukava", 10)),
|
||||
},
|
||||
v016proposal: &v040distr.CommunityPoolSpendProposal{
|
||||
Title: "Community Pool Spend",
|
||||
Description: "Fund the community pool.",
|
||||
Recipient: s.addresses[0].String(),
|
||||
Amount: sdk.NewCoins(sdk.NewInt64Coin("ukava", 10)),
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "software upgrade with deprecated plan time",
|
||||
v015proposal: v038upgrade.SoftwareUpgradeProposal{
|
||||
Title: "Test",
|
||||
Description: "Test",
|
||||
Plan: v038upgrade.Plan{Name: "Test", Height: 100, Time: time.Now()},
|
||||
},
|
||||
v016proposal: &v040upgrade.SoftwareUpgradeProposal{
|
||||
Title: "Test",
|
||||
Description: "Test",
|
||||
Plan: v040upgrade.Plan{Name: "Test", Height: 100},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "param change proposal",
|
||||
v015proposal: v036params.ParameterChangeProposal{
|
||||
Title: "Test",
|
||||
Description: "Test",
|
||||
Changes: []v036params.ParamChange{
|
||||
{Subspace: "Test", Key: "Test", Value: "Test"},
|
||||
},
|
||||
},
|
||||
v016proposal: &v040params.ParameterChangeProposal{
|
||||
Title: "Test",
|
||||
Description: "Test",
|
||||
Changes: []v040params.ParamChange{
|
||||
{Subspace: "Test", Key: "Test", Value: "Test"},
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "kavadist community pool multi spend proposal",
|
||||
v015proposal: v015kavadist.CommunityPoolMultiSpendProposal{
|
||||
Title: "Test",
|
||||
Description: "Test",
|
||||
RecipientList: v015kavadist.MultiSpendRecipients{
|
||||
v015kavadist.MultiSpendRecipient{
|
||||
Address: s.addresses[0],
|
||||
Amount: sdk.NewCoins(sdk.NewInt64Coin("ukava", 10)),
|
||||
},
|
||||
},
|
||||
},
|
||||
v016proposal: &v016kavadist.CommunityPoolMultiSpendProposal{
|
||||
Title: "Test",
|
||||
Description: "Test",
|
||||
RecipientList: []v016kavadist.MultiSpendRecipient{
|
||||
{
|
||||
Address: s.addresses[0].String(),
|
||||
Amount: sdk.NewCoins(sdk.NewInt64Coin("ukava", 10)),
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "cancel software upgrade proposal",
|
||||
v015proposal: v038upgrade.CancelSoftwareUpgradeProposal{
|
||||
Title: "Test",
|
||||
Description: "Test",
|
||||
},
|
||||
v016proposal: &v040upgrade.CancelSoftwareUpgradeProposal{
|
||||
Title: "Test",
|
||||
Description: "Test",
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
for _, tc := range testcases {
|
||||
s.Run(tc.name, func() {
|
||||
deadline := time.Now().Add(2 * time.Hour)
|
||||
oldProposal := v015committee.Proposal{
|
||||
PubProposal: tc.v015proposal,
|
||||
ID: 1,
|
||||
CommitteeID: 2,
|
||||
Deadline: deadline,
|
||||
}
|
||||
expectedProposal, err := v016committee.NewProposal(tc.v016proposal, 1, 2, deadline)
|
||||
s.Require().NoError(err)
|
||||
s.v15genstate.Proposals = []v015committee.Proposal{oldProposal}
|
||||
genState := Migrate(s.v15genstate, s.v15pricefeedgenstate)
|
||||
s.Require().Len(genState.Proposals, 1)
|
||||
s.Equal(expectedProposal, genState.Proposals[0])
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func (s *migrateTestSuite) TestMigrate_Votes() {
|
||||
testcases := []struct {
|
||||
name string
|
||||
v015voteType v015committee.VoteType
|
||||
v016VoteType v016committee.VoteType
|
||||
}{
|
||||
{
|
||||
name: "yes vote",
|
||||
v015voteType: v015committee.Yes,
|
||||
v016VoteType: v016committee.VOTE_TYPE_YES,
|
||||
},
|
||||
{
|
||||
name: "no vote",
|
||||
v015voteType: v015committee.No,
|
||||
v016VoteType: v016committee.VOTE_TYPE_NO,
|
||||
},
|
||||
{
|
||||
name: "null vote",
|
||||
v015voteType: v015committee.NullVoteType,
|
||||
v016VoteType: v016committee.VOTE_TYPE_UNSPECIFIED,
|
||||
},
|
||||
{
|
||||
name: "abstain vote",
|
||||
v015voteType: v015committee.Abstain,
|
||||
v016VoteType: v016committee.VOTE_TYPE_ABSTAIN,
|
||||
},
|
||||
}
|
||||
|
||||
for _, tc := range testcases {
|
||||
s.Run(tc.name, func() {
|
||||
oldVote := v015committee.Vote{
|
||||
ProposalID: 1,
|
||||
Voter: s.addresses[0],
|
||||
VoteType: tc.v015voteType,
|
||||
}
|
||||
expectedVote := v016committee.Vote{
|
||||
ProposalID: 1,
|
||||
Voter: s.addresses[0],
|
||||
VoteType: tc.v016VoteType,
|
||||
}
|
||||
s.v15genstate.Votes = []v015committee.Vote{oldVote}
|
||||
genState := Migrate(s.v15genstate, s.v15pricefeedgenstate)
|
||||
s.Require().Len(genState.Votes, 1)
|
||||
s.Equal(expectedVote, genState.Votes[0])
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestMigrateTestSuite(t *testing.T) {
|
||||
suite.Run(t, new(migrateTestSuite))
|
||||
}
|
658
x/committee/legacy/v0_16/testdata/v15-committee.json
vendored
658
x/committee/legacy/v0_16/testdata/v15-committee.json
vendored
@ -1,658 +0,0 @@
|
||||
{
|
||||
"committees": [
|
||||
{
|
||||
"type": "kava/MemberCommittee",
|
||||
"value": {
|
||||
"base_committee": {
|
||||
"type": "kava/MemberCommittee",
|
||||
"id": "1",
|
||||
"description": "Kava Stability Committee",
|
||||
"members": ["kava1n96qpdfcz2m7y364ewk8srv9zuq6ucwduyjaag"],
|
||||
"permissions": [
|
||||
{
|
||||
"type": "kava/SubParamChangePermission",
|
||||
"value": {
|
||||
"allowed_params": [
|
||||
{
|
||||
"subspace": "auction",
|
||||
"key": "BidDuration"
|
||||
},
|
||||
{
|
||||
"subspace": "auction",
|
||||
"key": "IncrementSurplus"
|
||||
},
|
||||
{
|
||||
"subspace": "auction",
|
||||
"key": "IncrementDebt"
|
||||
},
|
||||
{
|
||||
"subspace": "auction",
|
||||
"key": "IncrementCollateral"
|
||||
},
|
||||
{
|
||||
"subspace": "bep3",
|
||||
"key": "AssetParams"
|
||||
},
|
||||
{
|
||||
"subspace": "cdp",
|
||||
"key": "GlobalDebtLimit"
|
||||
},
|
||||
{
|
||||
"subspace": "cdp",
|
||||
"key": "SurplusThreshold"
|
||||
},
|
||||
{
|
||||
"subspace": "cdp",
|
||||
"key": "SurplusLot"
|
||||
},
|
||||
{
|
||||
"subspace": "cdp",
|
||||
"key": "DebtThreshold"
|
||||
},
|
||||
{
|
||||
"subspace": "cdp",
|
||||
"key": "DebtLot"
|
||||
},
|
||||
{
|
||||
"subspace": "cdp",
|
||||
"key": "DistributionFrequency"
|
||||
},
|
||||
{
|
||||
"subspace": "cdp",
|
||||
"key": "CollateralParams"
|
||||
},
|
||||
{
|
||||
"subspace": "cdp",
|
||||
"key": "DebtParam"
|
||||
},
|
||||
{
|
||||
"subspace": "incentive",
|
||||
"key": "Active"
|
||||
},
|
||||
{
|
||||
"subspace": "kavadist",
|
||||
"key": "Active"
|
||||
},
|
||||
{
|
||||
"subspace": "pricefeed",
|
||||
"key": "Markets"
|
||||
},
|
||||
{
|
||||
"subspace": "hard",
|
||||
"key": "MoneyMarkets"
|
||||
},
|
||||
{
|
||||
"subspace": "hard",
|
||||
"key": "MinimumBorrowUSDValue"
|
||||
}
|
||||
],
|
||||
"allowed_collateral_params": [
|
||||
{
|
||||
"type": "bnb-a",
|
||||
"denom": false,
|
||||
"liquidation_ratio": false,
|
||||
"debt_limit": true,
|
||||
"stability_fee": true,
|
||||
"auction_size": true,
|
||||
"liquidation_penalty": false,
|
||||
"prefix": false,
|
||||
"spot_market_id": false,
|
||||
"liquidation_market_id": false,
|
||||
"conversion_factor": false,
|
||||
"keeper_reward_percentage": true,
|
||||
"check_collateralization_index_count": true
|
||||
},
|
||||
{
|
||||
"type": "busd-a",
|
||||
"denom": false,
|
||||
"liquidation_ratio": false,
|
||||
"debt_limit": true,
|
||||
"stability_fee": true,
|
||||
"auction_size": true,
|
||||
"liquidation_penalty": false,
|
||||
"prefix": false,
|
||||
"spot_market_id": false,
|
||||
"liquidation_market_id": false,
|
||||
"conversion_factor": false,
|
||||
"keeper_reward_percentage": true,
|
||||
"check_collateralization_index_count": true
|
||||
},
|
||||
{
|
||||
"type": "busd-b",
|
||||
"denom": false,
|
||||
"liquidation_ratio": false,
|
||||
"debt_limit": true,
|
||||
"stability_fee": true,
|
||||
"auction_size": true,
|
||||
"liquidation_penalty": false,
|
||||
"prefix": false,
|
||||
"spot_market_id": false,
|
||||
"liquidation_market_id": false,
|
||||
"conversion_factor": false,
|
||||
"keeper_reward_percentage": true,
|
||||
"check_collateralization_index_count": true
|
||||
},
|
||||
{
|
||||
"type": "btcb-a",
|
||||
"denom": false,
|
||||
"liquidation_ratio": false,
|
||||
"debt_limit": true,
|
||||
"stability_fee": true,
|
||||
"auction_size": true,
|
||||
"liquidation_penalty": false,
|
||||
"prefix": false,
|
||||
"spot_market_id": false,
|
||||
"liquidation_market_id": false,
|
||||
"conversion_factor": false,
|
||||
"keeper_reward_percentage": true,
|
||||
"check_collateralization_index_count": true
|
||||
},
|
||||
{
|
||||
"type": "xrpb-a",
|
||||
"denom": false,
|
||||
"liquidation_ratio": false,
|
||||
"debt_limit": true,
|
||||
"stability_fee": true,
|
||||
"auction_size": true,
|
||||
"liquidation_penalty": false,
|
||||
"prefix": false,
|
||||
"spot_market_id": false,
|
||||
"liquidation_market_id": false,
|
||||
"conversion_factor": false,
|
||||
"keeper_reward_percentage": true,
|
||||
"check_collateralization_index_count": true
|
||||
},
|
||||
{
|
||||
"type": "ukava-a",
|
||||
"denom": false,
|
||||
"liquidation_ratio": false,
|
||||
"debt_limit": true,
|
||||
"stability_fee": true,
|
||||
"auction_size": true,
|
||||
"liquidation_penalty": false,
|
||||
"prefix": false,
|
||||
"spot_market_id": false,
|
||||
"liquidation_market_id": false,
|
||||
"conversion_factor": false,
|
||||
"keeper_reward_percentage": true,
|
||||
"check_collateralization_index_count": true
|
||||
},
|
||||
{
|
||||
"type": "hard-a",
|
||||
"denom": false,
|
||||
"liquidation_ratio": false,
|
||||
"debt_limit": true,
|
||||
"stability_fee": true,
|
||||
"auction_size": true,
|
||||
"liquidation_penalty": false,
|
||||
"prefix": false,
|
||||
"spot_market_id": false,
|
||||
"liquidation_market_id": false,
|
||||
"conversion_factor": false,
|
||||
"keeper_reward_percentage": true,
|
||||
"check_collateralization_index_count": true
|
||||
},
|
||||
{
|
||||
"type": "hbtc-a",
|
||||
"denom": false,
|
||||
"liquidation_ratio": false,
|
||||
"debt_limit": true,
|
||||
"stability_fee": true,
|
||||
"auction_size": true,
|
||||
"liquidation_penalty": false,
|
||||
"prefix": false,
|
||||
"spot_market_id": false,
|
||||
"liquidation_market_id": false,
|
||||
"conversion_factor": false,
|
||||
"keeper_reward_percentage": true,
|
||||
"check_collateralization_index_count": true
|
||||
}
|
||||
],
|
||||
"allowed_debt_param": {
|
||||
"denom": false,
|
||||
"reference_asset": false,
|
||||
"conversion_factor": false,
|
||||
"debt_floor": true
|
||||
},
|
||||
"allowed_asset_params": [
|
||||
{
|
||||
"denom": "bnb",
|
||||
"coin_id": false,
|
||||
"limit": true,
|
||||
"active": true,
|
||||
"max_swap_amount": true,
|
||||
"min_block_lock": true
|
||||
},
|
||||
{
|
||||
"denom": "busd",
|
||||
"coin_id": true,
|
||||
"limit": true,
|
||||
"active": true,
|
||||
"max_swap_amount": true,
|
||||
"min_block_lock": true
|
||||
},
|
||||
{
|
||||
"denom": "btcb",
|
||||
"coin_id": false,
|
||||
"limit": true,
|
||||
"active": true,
|
||||
"max_swap_amount": true,
|
||||
"min_block_lock": true
|
||||
},
|
||||
{
|
||||
"denom": "xrpb",
|
||||
"coin_id": false,
|
||||
"limit": true,
|
||||
"active": true,
|
||||
"max_swap_amount": true,
|
||||
"min_block_lock": true
|
||||
}
|
||||
],
|
||||
"allowed_markets": [
|
||||
{
|
||||
"market_id": "bnb:usd",
|
||||
"base_asset": false,
|
||||
"quote_asset": false,
|
||||
"oracles": false,
|
||||
"active": true
|
||||
},
|
||||
{
|
||||
"market_id": "bnb:usd:30",
|
||||
"base_asset": false,
|
||||
"quote_asset": false,
|
||||
"oracles": false,
|
||||
"active": true
|
||||
},
|
||||
{
|
||||
"market_id": "btc:usd",
|
||||
"base_asset": false,
|
||||
"quote_asset": false,
|
||||
"oracles": false,
|
||||
"active": true
|
||||
},
|
||||
{
|
||||
"market_id": "btc:usd:30",
|
||||
"base_asset": false,
|
||||
"quote_asset": false,
|
||||
"oracles": false,
|
||||
"active": true
|
||||
},
|
||||
{
|
||||
"market_id": "xrp:usd",
|
||||
"base_asset": false,
|
||||
"quote_asset": false,
|
||||
"oracles": false,
|
||||
"active": true
|
||||
},
|
||||
{
|
||||
"market_id": "xrp:usd:30",
|
||||
"base_asset": false,
|
||||
"quote_asset": false,
|
||||
"oracles": false,
|
||||
"active": true
|
||||
},
|
||||
{
|
||||
"market_id": "busd:usd",
|
||||
"base_asset": false,
|
||||
"quote_asset": false,
|
||||
"oracles": false,
|
||||
"active": true
|
||||
},
|
||||
{
|
||||
"market_id": "busd:usd:30",
|
||||
"base_asset": false,
|
||||
"quote_asset": false,
|
||||
"oracles": false,
|
||||
"active": true
|
||||
}
|
||||
],
|
||||
"allowed_money_markets": [
|
||||
{
|
||||
"denom": "bnb",
|
||||
"borrow_limit": true,
|
||||
"spot_market_id": false,
|
||||
"conversion_factor": false,
|
||||
"interest_rate_model": true,
|
||||
"reserve_factor": true,
|
||||
"keeper_reward_percentage": true
|
||||
},
|
||||
{
|
||||
"denom": "busd",
|
||||
"borrow_limit": true,
|
||||
"spot_market_id": false,
|
||||
"conversion_factor": false,
|
||||
"interest_rate_model": true,
|
||||
"reserve_factor": true,
|
||||
"keeper_reward_percentage": true
|
||||
},
|
||||
{
|
||||
"denom": "btcb",
|
||||
"borrow_limit": true,
|
||||
"spot_market_id": false,
|
||||
"conversion_factor": false,
|
||||
"interest_rate_model": true,
|
||||
"reserve_factor": true,
|
||||
"keeper_reward_percentage": true
|
||||
},
|
||||
{
|
||||
"denom": "xrpb",
|
||||
"borrow_limit": true,
|
||||
"spot_market_id": false,
|
||||
"conversion_factor": false,
|
||||
"interest_rate_model": true,
|
||||
"reserve_factor": true,
|
||||
"keeper_reward_percentage": true
|
||||
},
|
||||
{
|
||||
"denom": "usdx",
|
||||
"borrow_limit": true,
|
||||
"spot_market_id": false,
|
||||
"conversion_factor": false,
|
||||
"interest_rate_model": true,
|
||||
"reserve_factor": true,
|
||||
"keeper_reward_percentage": true
|
||||
},
|
||||
{
|
||||
"denom": "ukava",
|
||||
"borrow_limit": true,
|
||||
"spot_market_id": false,
|
||||
"conversion_factor": false,
|
||||
"interest_rate_model": true,
|
||||
"reserve_factor": true,
|
||||
"keeper_reward_percentage": true
|
||||
},
|
||||
{
|
||||
"denom": "hard",
|
||||
"borrow_limit": true,
|
||||
"spot_market_id": false,
|
||||
"conversion_factor": false,
|
||||
"interest_rate_model": true,
|
||||
"reserve_factor": true,
|
||||
"keeper_reward_percentage": true
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "kava/TextPermission",
|
||||
"value": {}
|
||||
}
|
||||
],
|
||||
"vote_threshold": "0.500000000000000000",
|
||||
"proposal_duration": "600000000000",
|
||||
"tally_option": "FirstPastThePost"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "kava/MemberCommittee",
|
||||
"value": {
|
||||
"base_committee": {
|
||||
"id": "2",
|
||||
"description": "Kava Safety Committee",
|
||||
"members": ["kava1n96qpdfcz2m7y364ewk8srv9zuq6ucwduyjaag"],
|
||||
"permissions": [
|
||||
{
|
||||
"type": "kava/SoftwareUpgradePermission",
|
||||
"value": {}
|
||||
}
|
||||
],
|
||||
"vote_threshold": "0.500000000000000000",
|
||||
"proposal_duration": "604800000000000",
|
||||
"tally_option": "FirstPastThePost"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "kava/TokenCommittee",
|
||||
"value": {
|
||||
"base_committee": {
|
||||
"id": "3",
|
||||
"description": "Hard Governance Committee",
|
||||
"members": ["kava1n96qpdfcz2m7y364ewk8srv9zuq6ucwduyjaag"],
|
||||
"permissions": [
|
||||
{
|
||||
"type": "kava/SubParamChangePermission",
|
||||
"value": {
|
||||
"allowed_params": [
|
||||
{
|
||||
"subspace": "hard",
|
||||
"key": "MoneyMarkets"
|
||||
},
|
||||
{
|
||||
"subspace": "hard",
|
||||
"key": "MinimumBorrowUSDValue"
|
||||
},
|
||||
{
|
||||
"subspace": "incentive",
|
||||
"key": "HardSupplyRewardPeriods"
|
||||
},
|
||||
{
|
||||
"subspace": "incentive",
|
||||
"key": "HardBorrowRewardPeriods"
|
||||
},
|
||||
{
|
||||
"subspace": "incentive",
|
||||
"key": "HardDelegatorRewardPeriods"
|
||||
}
|
||||
],
|
||||
"allowed_collateral_params": null,
|
||||
"allowed_debt_param": {
|
||||
"denom": false,
|
||||
"reference_asset": false,
|
||||
"conversion_factor": false,
|
||||
"debt_floor": false
|
||||
},
|
||||
"allowed_asset_params": null,
|
||||
"allowed_markets": null,
|
||||
"allowed_money_markets": [
|
||||
{
|
||||
"denom": "bnb",
|
||||
"borrow_limit": true,
|
||||
"spot_market_id": true,
|
||||
"conversion_factor": false,
|
||||
"interest_rate_model": true,
|
||||
"reserve_factor": true,
|
||||
"keeper_reward_percentage": true
|
||||
},
|
||||
{
|
||||
"denom": "busd",
|
||||
"borrow_limit": true,
|
||||
"spot_market_id": true,
|
||||
"conversion_factor": false,
|
||||
"interest_rate_model": true,
|
||||
"reserve_factor": true,
|
||||
"keeper_reward_percentage": true
|
||||
},
|
||||
{
|
||||
"denom": "btcb",
|
||||
"borrow_limit": true,
|
||||
"spot_market_id": true,
|
||||
"conversion_factor": false,
|
||||
"interest_rate_model": true,
|
||||
"reserve_factor": true,
|
||||
"keeper_reward_percentage": true
|
||||
},
|
||||
{
|
||||
"denom": "xrpb",
|
||||
"borrow_limit": true,
|
||||
"spot_market_id": true,
|
||||
"conversion_factor": false,
|
||||
"interest_rate_model": true,
|
||||
"reserve_factor": true,
|
||||
"keeper_reward_percentage": true
|
||||
},
|
||||
{
|
||||
"denom": "usdx",
|
||||
"borrow_limit": true,
|
||||
"spot_market_id": true,
|
||||
"conversion_factor": false,
|
||||
"interest_rate_model": true,
|
||||
"reserve_factor": true,
|
||||
"keeper_reward_percentage": true
|
||||
},
|
||||
{
|
||||
"denom": "ukava",
|
||||
"borrow_limit": true,
|
||||
"spot_market_id": true,
|
||||
"conversion_factor": false,
|
||||
"interest_rate_model": true,
|
||||
"reserve_factor": true,
|
||||
"keeper_reward_percentage": true
|
||||
},
|
||||
{
|
||||
"denom": "hard",
|
||||
"borrow_limit": true,
|
||||
"spot_market_id": true,
|
||||
"conversion_factor": false,
|
||||
"interest_rate_model": true,
|
||||
"reserve_factor": true,
|
||||
"keeper_reward_percentage": true
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
],
|
||||
"vote_threshold": "0.500000000000000000",
|
||||
"proposal_duration": "600000000000",
|
||||
"tally_option": "Deadline"
|
||||
},
|
||||
"quorum": "0.330000000000000000",
|
||||
"tally_denom": "hard"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "kava/TokenCommittee",
|
||||
"value": {
|
||||
"base_committee": {
|
||||
"id": "4",
|
||||
"description": "Swp Governance Committee",
|
||||
"members": ["kava1n96qpdfcz2m7y364ewk8srv9zuq6ucwduyjaag"],
|
||||
"permissions": [
|
||||
{
|
||||
"type": "kava/SubParamChangePermission",
|
||||
"value": {
|
||||
"allowed_params": [
|
||||
{
|
||||
"subspace": "swap",
|
||||
"key": "AllowedPools"
|
||||
},
|
||||
{
|
||||
"subspace": "swap",
|
||||
"key": "SwapFee"
|
||||
},
|
||||
{
|
||||
"subspace": "incentive",
|
||||
"key": "HardDelegatorRewardPeriods"
|
||||
},
|
||||
{
|
||||
"subspace": "incentive",
|
||||
"key": "SwapRewardPeriods"
|
||||
}
|
||||
],
|
||||
"allowed_collateral_params": null,
|
||||
"allowed_debt_param": {
|
||||
"denom": false,
|
||||
"reference_asset": false,
|
||||
"conversion_factor": false,
|
||||
"debt_floor": false
|
||||
},
|
||||
"allowed_asset_params": null,
|
||||
"allowed_markets": null,
|
||||
"allowed_money_markets": null
|
||||
}
|
||||
}
|
||||
],
|
||||
"vote_threshold": "0.500000000000000000",
|
||||
"proposal_duration": "600000000000",
|
||||
"tally_option": "Deadline"
|
||||
},
|
||||
"quorum": "0.330000000000000000",
|
||||
"tally_denom": "swp"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "kava/MemberCommittee",
|
||||
"value": {
|
||||
"base_committee": {
|
||||
"id": "5",
|
||||
"description": "Kava God Committee (testing only)",
|
||||
"members": ["kava1n96qpdfcz2m7y364ewk8srv9zuq6ucwduyjaag"],
|
||||
"permissions": [
|
||||
{
|
||||
"type": "kava/GodPermission",
|
||||
"value": {}
|
||||
}
|
||||
],
|
||||
"vote_threshold": "0.500000000000000000",
|
||||
"proposal_duration": "604800000000000",
|
||||
"tally_option": "FirstPastThePost"
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"next_proposal_id": "1",
|
||||
"proposals": [
|
||||
{
|
||||
"pub_proposal": {
|
||||
"type": "kava/CommunityPoolMultiSpendProposal",
|
||||
"value": {
|
||||
"title": "Test",
|
||||
"description": "Test",
|
||||
"recipient_list": [
|
||||
{
|
||||
"address": "kava1ze7y9qwdddejmy7jlw4cymqqlt2wh05yhwmrv2",
|
||||
"amount": [{ "denom": "ukava", "amount": "10" }]
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"id": "1",
|
||||
"committee_id": "2",
|
||||
"deadline": "2021-11-24T18:48:08.693415Z"
|
||||
},
|
||||
{
|
||||
"pub_proposal": {
|
||||
"type": "cosmos-sdk/CommunityPoolSpendProposal",
|
||||
"value": {
|
||||
"title": "Community Pool Spend",
|
||||
"description": "Fund the community pool.",
|
||||
"recipient": "kava1ze7y9qwdddejmy7jlw4cymqqlt2wh05yhwmrv2",
|
||||
"amount": [{ "denom": "ukava", "amount": "10" }]
|
||||
}
|
||||
},
|
||||
"id": "1",
|
||||
"committee_id": "2",
|
||||
"deadline": "2021-11-24T18:49:44.219341Z"
|
||||
},
|
||||
{
|
||||
"pub_proposal": {
|
||||
"type": "cosmos-sdk/SoftwareUpgradeProposal",
|
||||
"value": {
|
||||
"title": "Test",
|
||||
"description": "Test",
|
||||
"plan": {
|
||||
"name": "Test",
|
||||
"time": "2021-11-24T16:49:44.219327Z",
|
||||
"height": "100"
|
||||
}
|
||||
}
|
||||
},
|
||||
"id": "1",
|
||||
"committee_id": "2",
|
||||
"deadline": "2021-11-24T18:49:44.219693Z"
|
||||
}
|
||||
],
|
||||
"votes": [
|
||||
{
|
||||
"proposal_id": "1",
|
||||
"voter": "kava1ze7y9qwdddejmy7jlw4cymqqlt2wh05yhwmrv2",
|
||||
"vote_type": "Yes"
|
||||
},
|
||||
{
|
||||
"proposal_id": "1",
|
||||
"voter": "kava1ze7y9qwdddejmy7jlw4cymqqlt2wh05yhwmrv2",
|
||||
"vote_type": "Abstain"
|
||||
}
|
||||
]
|
||||
}
|
312
x/committee/legacy/v0_16/testdata/v15-pricefeed.json
vendored
312
x/committee/legacy/v0_16/testdata/v15-pricefeed.json
vendored
@ -1,312 +0,0 @@
|
||||
{
|
||||
"params": {
|
||||
"markets": [
|
||||
{
|
||||
"market_id": "bnb:usd",
|
||||
"base_asset": "bnb",
|
||||
"quote_asset": "usd",
|
||||
"oracles": [
|
||||
"kava12dyshua9nkvx9w8ywp72wdnzrc4t4mnnycz0dl",
|
||||
"kava1tuxyepdrkwraa22k99w04c0wa64tgh70mv87fs",
|
||||
"kava1ueak7nzesm3pnev6lngp6lgk0ry02djz8pjpcg",
|
||||
"kava1sl62nqm89c780yxm3m9lp3tacmpnfljq6tytvl",
|
||||
"kava1ujfrlcd0ted58mzplnyxzklsw0sqevlgxndanp",
|
||||
"kava17fatl3wzxvk4rwfu3tqsctdp5x9vute67j9ufj",
|
||||
"kava19rjk5qmmwywnzfccwzyn02jywgpwjqf60afj92",
|
||||
"kava1xd39avn2f008jmvua0eupg39zsp2xn3wf802vn",
|
||||
"kava1pt6q4kdmwawr3thm9cd82pq7hml8u84rd0f3jy",
|
||||
"kava13tpwqygswyzupqfggfgh9dmtgthgucn5wpfksh"
|
||||
],
|
||||
"active": true
|
||||
},
|
||||
{
|
||||
"market_id": "bnb:usd:30",
|
||||
"base_asset": "bnb",
|
||||
"quote_asset": "usd",
|
||||
"oracles": [
|
||||
"kava12dyshua9nkvx9w8ywp72wdnzrc4t4mnnycz0dl",
|
||||
"kava1tuxyepdrkwraa22k99w04c0wa64tgh70mv87fs",
|
||||
"kava1ueak7nzesm3pnev6lngp6lgk0ry02djz8pjpcg",
|
||||
"kava1sl62nqm89c780yxm3m9lp3tacmpnfljq6tytvl",
|
||||
"kava1ujfrlcd0ted58mzplnyxzklsw0sqevlgxndanp",
|
||||
"kava17fatl3wzxvk4rwfu3tqsctdp5x9vute67j9ufj",
|
||||
"kava19rjk5qmmwywnzfccwzyn02jywgpwjqf60afj92",
|
||||
"kava1xd39avn2f008jmvua0eupg39zsp2xn3wf802vn",
|
||||
"kava1pt6q4kdmwawr3thm9cd82pq7hml8u84rd0f3jy",
|
||||
"kava13tpwqygswyzupqfggfgh9dmtgthgucn5wpfksh"
|
||||
],
|
||||
"active": true
|
||||
},
|
||||
{
|
||||
"market_id": "btc:usd",
|
||||
"base_asset": "btc",
|
||||
"quote_asset": "usd",
|
||||
"oracles": [
|
||||
"kava12dyshua9nkvx9w8ywp72wdnzrc4t4mnnycz0dl",
|
||||
"kava1tuxyepdrkwraa22k99w04c0wa64tgh70mv87fs",
|
||||
"kava1ueak7nzesm3pnev6lngp6lgk0ry02djz8pjpcg",
|
||||
"kava1sl62nqm89c780yxm3m9lp3tacmpnfljq6tytvl",
|
||||
"kava1ujfrlcd0ted58mzplnyxzklsw0sqevlgxndanp",
|
||||
"kava17fatl3wzxvk4rwfu3tqsctdp5x9vute67j9ufj",
|
||||
"kava19rjk5qmmwywnzfccwzyn02jywgpwjqf60afj92",
|
||||
"kava1xd39avn2f008jmvua0eupg39zsp2xn3wf802vn",
|
||||
"kava1pt6q4kdmwawr3thm9cd82pq7hml8u84rd0f3jy",
|
||||
"kava13tpwqygswyzupqfggfgh9dmtgthgucn5wpfksh"
|
||||
],
|
||||
"active": true
|
||||
},
|
||||
{
|
||||
"market_id": "btc:usd:30",
|
||||
"base_asset": "btc",
|
||||
"quote_asset": "usd",
|
||||
"oracles": [
|
||||
"kava12dyshua9nkvx9w8ywp72wdnzrc4t4mnnycz0dl",
|
||||
"kava1tuxyepdrkwraa22k99w04c0wa64tgh70mv87fs",
|
||||
"kava1ueak7nzesm3pnev6lngp6lgk0ry02djz8pjpcg",
|
||||
"kava1sl62nqm89c780yxm3m9lp3tacmpnfljq6tytvl",
|
||||
"kava1ujfrlcd0ted58mzplnyxzklsw0sqevlgxndanp",
|
||||
"kava17fatl3wzxvk4rwfu3tqsctdp5x9vute67j9ufj",
|
||||
"kava19rjk5qmmwywnzfccwzyn02jywgpwjqf60afj92",
|
||||
"kava1xd39avn2f008jmvua0eupg39zsp2xn3wf802vn",
|
||||
"kava1pt6q4kdmwawr3thm9cd82pq7hml8u84rd0f3jy",
|
||||
"kava13tpwqygswyzupqfggfgh9dmtgthgucn5wpfksh"
|
||||
],
|
||||
"active": true
|
||||
},
|
||||
{
|
||||
"market_id": "xrp:usd",
|
||||
"base_asset": "xrp",
|
||||
"quote_asset": "usd",
|
||||
"oracles": [
|
||||
"kava12dyshua9nkvx9w8ywp72wdnzrc4t4mnnycz0dl",
|
||||
"kava1tuxyepdrkwraa22k99w04c0wa64tgh70mv87fs",
|
||||
"kava1ueak7nzesm3pnev6lngp6lgk0ry02djz8pjpcg",
|
||||
"kava1sl62nqm89c780yxm3m9lp3tacmpnfljq6tytvl",
|
||||
"kava1ujfrlcd0ted58mzplnyxzklsw0sqevlgxndanp",
|
||||
"kava17fatl3wzxvk4rwfu3tqsctdp5x9vute67j9ufj",
|
||||
"kava19rjk5qmmwywnzfccwzyn02jywgpwjqf60afj92",
|
||||
"kava1xd39avn2f008jmvua0eupg39zsp2xn3wf802vn",
|
||||
"kava1pt6q4kdmwawr3thm9cd82pq7hml8u84rd0f3jy",
|
||||
"kava13tpwqygswyzupqfggfgh9dmtgthgucn5wpfksh"
|
||||
],
|
||||
"active": true
|
||||
},
|
||||
{
|
||||
"market_id": "xrp:usd:30",
|
||||
"base_asset": "xrp",
|
||||
"quote_asset": "usd",
|
||||
"oracles": [
|
||||
"kava12dyshua9nkvx9w8ywp72wdnzrc4t4mnnycz0dl",
|
||||
"kava1tuxyepdrkwraa22k99w04c0wa64tgh70mv87fs",
|
||||
"kava1ueak7nzesm3pnev6lngp6lgk0ry02djz8pjpcg",
|
||||
"kava1sl62nqm89c780yxm3m9lp3tacmpnfljq6tytvl",
|
||||
"kava1ujfrlcd0ted58mzplnyxzklsw0sqevlgxndanp",
|
||||
"kava17fatl3wzxvk4rwfu3tqsctdp5x9vute67j9ufj",
|
||||
"kava19rjk5qmmwywnzfccwzyn02jywgpwjqf60afj92",
|
||||
"kava1xd39avn2f008jmvua0eupg39zsp2xn3wf802vn",
|
||||
"kava1pt6q4kdmwawr3thm9cd82pq7hml8u84rd0f3jy",
|
||||
"kava13tpwqygswyzupqfggfgh9dmtgthgucn5wpfksh"
|
||||
],
|
||||
"active": true
|
||||
},
|
||||
{
|
||||
"market_id": "busd:usd",
|
||||
"base_asset": "busd",
|
||||
"quote_asset": "usd",
|
||||
"oracles": [
|
||||
"kava12dyshua9nkvx9w8ywp72wdnzrc4t4mnnycz0dl",
|
||||
"kava1tuxyepdrkwraa22k99w04c0wa64tgh70mv87fs",
|
||||
"kava1ueak7nzesm3pnev6lngp6lgk0ry02djz8pjpcg",
|
||||
"kava1sl62nqm89c780yxm3m9lp3tacmpnfljq6tytvl",
|
||||
"kava1ujfrlcd0ted58mzplnyxzklsw0sqevlgxndanp",
|
||||
"kava17fatl3wzxvk4rwfu3tqsctdp5x9vute67j9ufj",
|
||||
"kava19rjk5qmmwywnzfccwzyn02jywgpwjqf60afj92",
|
||||
"kava1xd39avn2f008jmvua0eupg39zsp2xn3wf802vn",
|
||||
"kava1pt6q4kdmwawr3thm9cd82pq7hml8u84rd0f3jy",
|
||||
"kava13tpwqygswyzupqfggfgh9dmtgthgucn5wpfksh"
|
||||
],
|
||||
"active": true
|
||||
},
|
||||
{
|
||||
"market_id": "busd:usd:30",
|
||||
"base_asset": "busd",
|
||||
"quote_asset": "usd",
|
||||
"oracles": [
|
||||
"kava12dyshua9nkvx9w8ywp72wdnzrc4t4mnnycz0dl",
|
||||
"kava1tuxyepdrkwraa22k99w04c0wa64tgh70mv87fs",
|
||||
"kava1ueak7nzesm3pnev6lngp6lgk0ry02djz8pjpcg",
|
||||
"kava1sl62nqm89c780yxm3m9lp3tacmpnfljq6tytvl",
|
||||
"kava1ujfrlcd0ted58mzplnyxzklsw0sqevlgxndanp",
|
||||
"kava17fatl3wzxvk4rwfu3tqsctdp5x9vute67j9ufj",
|
||||
"kava19rjk5qmmwywnzfccwzyn02jywgpwjqf60afj92",
|
||||
"kava1xd39avn2f008jmvua0eupg39zsp2xn3wf802vn",
|
||||
"kava1pt6q4kdmwawr3thm9cd82pq7hml8u84rd0f3jy",
|
||||
"kava13tpwqygswyzupqfggfgh9dmtgthgucn5wpfksh"
|
||||
],
|
||||
"active": true
|
||||
},
|
||||
{
|
||||
"market_id": "kava:usd",
|
||||
"base_asset": "kava",
|
||||
"quote_asset": "usd",
|
||||
"oracles": [
|
||||
"kava12dyshua9nkvx9w8ywp72wdnzrc4t4mnnycz0dl",
|
||||
"kava1tuxyepdrkwraa22k99w04c0wa64tgh70mv87fs",
|
||||
"kava1ueak7nzesm3pnev6lngp6lgk0ry02djz8pjpcg",
|
||||
"kava1sl62nqm89c780yxm3m9lp3tacmpnfljq6tytvl",
|
||||
"kava1ujfrlcd0ted58mzplnyxzklsw0sqevlgxndanp",
|
||||
"kava17fatl3wzxvk4rwfu3tqsctdp5x9vute67j9ufj",
|
||||
"kava19rjk5qmmwywnzfccwzyn02jywgpwjqf60afj92",
|
||||
"kava1xd39avn2f008jmvua0eupg39zsp2xn3wf802vn",
|
||||
"kava1pt6q4kdmwawr3thm9cd82pq7hml8u84rd0f3jy",
|
||||
"kava13tpwqygswyzupqfggfgh9dmtgthgucn5wpfksh"
|
||||
],
|
||||
"active": true
|
||||
},
|
||||
{
|
||||
"market_id": "kava:usd:30",
|
||||
"base_asset": "kava",
|
||||
"quote_asset": "usd",
|
||||
"oracles": [
|
||||
"kava12dyshua9nkvx9w8ywp72wdnzrc4t4mnnycz0dl",
|
||||
"kava1tuxyepdrkwraa22k99w04c0wa64tgh70mv87fs",
|
||||
"kava1ueak7nzesm3pnev6lngp6lgk0ry02djz8pjpcg",
|
||||
"kava1sl62nqm89c780yxm3m9lp3tacmpnfljq6tytvl",
|
||||
"kava1ujfrlcd0ted58mzplnyxzklsw0sqevlgxndanp",
|
||||
"kava17fatl3wzxvk4rwfu3tqsctdp5x9vute67j9ufj",
|
||||
"kava19rjk5qmmwywnzfccwzyn02jywgpwjqf60afj92",
|
||||
"kava1xd39avn2f008jmvua0eupg39zsp2xn3wf802vn",
|
||||
"kava1pt6q4kdmwawr3thm9cd82pq7hml8u84rd0f3jy",
|
||||
"kava13tpwqygswyzupqfggfgh9dmtgthgucn5wpfksh"
|
||||
],
|
||||
"active": true
|
||||
},
|
||||
{
|
||||
"market_id": "hard:usd",
|
||||
"base_asset": "hard",
|
||||
"quote_asset": "usd",
|
||||
"oracles": [
|
||||
"kava12dyshua9nkvx9w8ywp72wdnzrc4t4mnnycz0dl",
|
||||
"kava1tuxyepdrkwraa22k99w04c0wa64tgh70mv87fs",
|
||||
"kava1ueak7nzesm3pnev6lngp6lgk0ry02djz8pjpcg",
|
||||
"kava1sl62nqm89c780yxm3m9lp3tacmpnfljq6tytvl",
|
||||
"kava1ujfrlcd0ted58mzplnyxzklsw0sqevlgxndanp",
|
||||
"kava17fatl3wzxvk4rwfu3tqsctdp5x9vute67j9ufj",
|
||||
"kava19rjk5qmmwywnzfccwzyn02jywgpwjqf60afj92",
|
||||
"kava1xd39avn2f008jmvua0eupg39zsp2xn3wf802vn",
|
||||
"kava1pt6q4kdmwawr3thm9cd82pq7hml8u84rd0f3jy",
|
||||
"kava13tpwqygswyzupqfggfgh9dmtgthgucn5wpfksh"
|
||||
],
|
||||
"active": true
|
||||
},
|
||||
{
|
||||
"market_id": "hard:usd:30",
|
||||
"base_asset": "hard",
|
||||
"quote_asset": "usd",
|
||||
"oracles": [
|
||||
"kava12dyshua9nkvx9w8ywp72wdnzrc4t4mnnycz0dl",
|
||||
"kava1tuxyepdrkwraa22k99w04c0wa64tgh70mv87fs",
|
||||
"kava1ueak7nzesm3pnev6lngp6lgk0ry02djz8pjpcg",
|
||||
"kava1sl62nqm89c780yxm3m9lp3tacmpnfljq6tytvl",
|
||||
"kava1ujfrlcd0ted58mzplnyxzklsw0sqevlgxndanp",
|
||||
"kava17fatl3wzxvk4rwfu3tqsctdp5x9vute67j9ufj",
|
||||
"kava19rjk5qmmwywnzfccwzyn02jywgpwjqf60afj92",
|
||||
"kava1xd39avn2f008jmvua0eupg39zsp2xn3wf802vn",
|
||||
"kava1pt6q4kdmwawr3thm9cd82pq7hml8u84rd0f3jy",
|
||||
"kava13tpwqygswyzupqfggfgh9dmtgthgucn5wpfksh"
|
||||
],
|
||||
"active": true
|
||||
},
|
||||
{
|
||||
"market_id": "usdx:usd",
|
||||
"base_asset": "usdx",
|
||||
"quote_asset": "usd",
|
||||
"oracles": [
|
||||
"kava12dyshua9nkvx9w8ywp72wdnzrc4t4mnnycz0dl",
|
||||
"kava1tuxyepdrkwraa22k99w04c0wa64tgh70mv87fs",
|
||||
"kava1ueak7nzesm3pnev6lngp6lgk0ry02djz8pjpcg",
|
||||
"kava1sl62nqm89c780yxm3m9lp3tacmpnfljq6tytvl",
|
||||
"kava1ujfrlcd0ted58mzplnyxzklsw0sqevlgxndanp",
|
||||
"kava17fatl3wzxvk4rwfu3tqsctdp5x9vute67j9ufj",
|
||||
"kava19rjk5qmmwywnzfccwzyn02jywgpwjqf60afj92",
|
||||
"kava1xd39avn2f008jmvua0eupg39zsp2xn3wf802vn",
|
||||
"kava1pt6q4kdmwawr3thm9cd82pq7hml8u84rd0f3jy",
|
||||
"kava13tpwqygswyzupqfggfgh9dmtgthgucn5wpfksh"
|
||||
],
|
||||
"active": true
|
||||
},
|
||||
{
|
||||
"market_id": "usdx:usd:30",
|
||||
"base_asset": "usdx",
|
||||
"quote_asset": "usd",
|
||||
"oracles": [
|
||||
"kava12dyshua9nkvx9w8ywp72wdnzrc4t4mnnycz0dl",
|
||||
"kava1tuxyepdrkwraa22k99w04c0wa64tgh70mv87fs",
|
||||
"kava1ueak7nzesm3pnev6lngp6lgk0ry02djz8pjpcg",
|
||||
"kava1sl62nqm89c780yxm3m9lp3tacmpnfljq6tytvl",
|
||||
"kava1ujfrlcd0ted58mzplnyxzklsw0sqevlgxndanp",
|
||||
"kava17fatl3wzxvk4rwfu3tqsctdp5x9vute67j9ufj",
|
||||
"kava19rjk5qmmwywnzfccwzyn02jywgpwjqf60afj92",
|
||||
"kava1xd39avn2f008jmvua0eupg39zsp2xn3wf802vn",
|
||||
"kava1pt6q4kdmwawr3thm9cd82pq7hml8u84rd0f3jy",
|
||||
"kava13tpwqygswyzupqfggfgh9dmtgthgucn5wpfksh"
|
||||
],
|
||||
"active": true
|
||||
},
|
||||
{
|
||||
"market_id": "usdx:usd:720",
|
||||
"base_asset": "usdx",
|
||||
"quote_asset": "usd",
|
||||
"oracles": [
|
||||
"kava12dyshua9nkvx9w8ywp72wdnzrc4t4mnnycz0dl",
|
||||
"kava1tuxyepdrkwraa22k99w04c0wa64tgh70mv87fs",
|
||||
"kava1ueak7nzesm3pnev6lngp6lgk0ry02djz8pjpcg",
|
||||
"kava1sl62nqm89c780yxm3m9lp3tacmpnfljq6tytvl",
|
||||
"kava1ujfrlcd0ted58mzplnyxzklsw0sqevlgxndanp",
|
||||
"kava17fatl3wzxvk4rwfu3tqsctdp5x9vute67j9ufj",
|
||||
"kava19rjk5qmmwywnzfccwzyn02jywgpwjqf60afj92",
|
||||
"kava1xd39avn2f008jmvua0eupg39zsp2xn3wf802vn",
|
||||
"kava1pt6q4kdmwawr3thm9cd82pq7hml8u84rd0f3jy",
|
||||
"kava13tpwqygswyzupqfggfgh9dmtgthgucn5wpfksh"
|
||||
],
|
||||
"active": true
|
||||
},
|
||||
{
|
||||
"market_id": "swp:usd",
|
||||
"base_asset": "swp",
|
||||
"quote_asset": "usd",
|
||||
"oracles": [
|
||||
"kava12dyshua9nkvx9w8ywp72wdnzrc4t4mnnycz0dl",
|
||||
"kava1tuxyepdrkwraa22k99w04c0wa64tgh70mv87fs",
|
||||
"kava1ueak7nzesm3pnev6lngp6lgk0ry02djz8pjpcg",
|
||||
"kava1sl62nqm89c780yxm3m9lp3tacmpnfljq6tytvl",
|
||||
"kava1ujfrlcd0ted58mzplnyxzklsw0sqevlgxndanp",
|
||||
"kava17fatl3wzxvk4rwfu3tqsctdp5x9vute67j9ufj",
|
||||
"kava19rjk5qmmwywnzfccwzyn02jywgpwjqf60afj92",
|
||||
"kava1xd39avn2f008jmvua0eupg39zsp2xn3wf802vn",
|
||||
"kava1pt6q4kdmwawr3thm9cd82pq7hml8u84rd0f3jy",
|
||||
"kava13tpwqygswyzupqfggfgh9dmtgthgucn5wpfksh"
|
||||
],
|
||||
"active": true
|
||||
},
|
||||
{
|
||||
"market_id": "swp:usd:30",
|
||||
"base_asset": "swp",
|
||||
"quote_asset": "usd",
|
||||
"oracles": [
|
||||
"kava12dyshua9nkvx9w8ywp72wdnzrc4t4mnnycz0dl",
|
||||
"kava1tuxyepdrkwraa22k99w04c0wa64tgh70mv87fs",
|
||||
"kava1ueak7nzesm3pnev6lngp6lgk0ry02djz8pjpcg",
|
||||
"kava1sl62nqm89c780yxm3m9lp3tacmpnfljq6tytvl",
|
||||
"kava1ujfrlcd0ted58mzplnyxzklsw0sqevlgxndanp",
|
||||
"kava17fatl3wzxvk4rwfu3tqsctdp5x9vute67j9ufj",
|
||||
"kava19rjk5qmmwywnzfccwzyn02jywgpwjqf60afj92",
|
||||
"kava1xd39avn2f008jmvua0eupg39zsp2xn3wf802vn",
|
||||
"kava1pt6q4kdmwawr3thm9cd82pq7hml8u84rd0f3jy",
|
||||
"kava13tpwqygswyzupqfggfgh9dmtgthgucn5wpfksh"
|
||||
],
|
||||
"active": true
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
780
x/committee/legacy/v0_16/testdata/v16-committee.json
vendored
780
x/committee/legacy/v0_16/testdata/v16-committee.json
vendored
@ -1,780 +0,0 @@
|
||||
{
|
||||
"next_proposal_id": "1",
|
||||
"committees": [
|
||||
{
|
||||
"@type": "/kava.committee.v1beta1.MemberCommittee",
|
||||
"base_committee": {
|
||||
"id": "1",
|
||||
"description": "Kava Stability Committee",
|
||||
"members": ["kava1n96qpdfcz2m7y364ewk8srv9zuq6ucwduyjaag"],
|
||||
"permissions": [
|
||||
{
|
||||
"@type": "/kava.committee.v1beta1.ParamsChangePermission",
|
||||
"allowed_params_changes": [
|
||||
{
|
||||
"subspace": "auction",
|
||||
"key": "BidDuration",
|
||||
"single_subparam_allowed_attrs": [],
|
||||
"multi_subparams_requirements": []
|
||||
},
|
||||
{
|
||||
"subspace": "auction",
|
||||
"key": "IncrementSurplus",
|
||||
"single_subparam_allowed_attrs": [],
|
||||
"multi_subparams_requirements": []
|
||||
},
|
||||
{
|
||||
"subspace": "auction",
|
||||
"key": "IncrementDebt",
|
||||
"single_subparam_allowed_attrs": [],
|
||||
"multi_subparams_requirements": []
|
||||
},
|
||||
{
|
||||
"subspace": "auction",
|
||||
"key": "IncrementCollateral",
|
||||
"single_subparam_allowed_attrs": [],
|
||||
"multi_subparams_requirements": []
|
||||
},
|
||||
{
|
||||
"subspace": "cdp",
|
||||
"key": "GlobalDebtLimit",
|
||||
"single_subparam_allowed_attrs": [],
|
||||
"multi_subparams_requirements": []
|
||||
},
|
||||
{
|
||||
"subspace": "cdp",
|
||||
"key": "SurplusThreshold",
|
||||
"single_subparam_allowed_attrs": [],
|
||||
"multi_subparams_requirements": []
|
||||
},
|
||||
{
|
||||
"subspace": "cdp",
|
||||
"key": "SurplusLot",
|
||||
"single_subparam_allowed_attrs": [],
|
||||
"multi_subparams_requirements": []
|
||||
},
|
||||
{
|
||||
"subspace": "cdp",
|
||||
"key": "DebtThreshold",
|
||||
"single_subparam_allowed_attrs": [],
|
||||
"multi_subparams_requirements": []
|
||||
},
|
||||
{
|
||||
"subspace": "cdp",
|
||||
"key": "DebtLot",
|
||||
"single_subparam_allowed_attrs": [],
|
||||
"multi_subparams_requirements": []
|
||||
},
|
||||
{
|
||||
"subspace": "cdp",
|
||||
"key": "DistributionFrequency",
|
||||
"single_subparam_allowed_attrs": [],
|
||||
"multi_subparams_requirements": []
|
||||
},
|
||||
{
|
||||
"subspace": "incentive",
|
||||
"key": "Active",
|
||||
"single_subparam_allowed_attrs": [],
|
||||
"multi_subparams_requirements": []
|
||||
},
|
||||
{
|
||||
"subspace": "kavadist",
|
||||
"key": "Active",
|
||||
"single_subparam_allowed_attrs": [],
|
||||
"multi_subparams_requirements": []
|
||||
},
|
||||
{
|
||||
"subspace": "hard",
|
||||
"key": "MinimumBorrowUSDValue",
|
||||
"single_subparam_allowed_attrs": [],
|
||||
"multi_subparams_requirements": []
|
||||
},
|
||||
{
|
||||
"subspace": "cdp",
|
||||
"key": "CollateralParams",
|
||||
"single_subparam_allowed_attrs": [],
|
||||
"multi_subparams_requirements": [
|
||||
{
|
||||
"key": "type",
|
||||
"val": "bnb-a",
|
||||
"allowed_subparam_attr_changes": [
|
||||
"auction_size",
|
||||
"check_collateralization_index_count",
|
||||
"debt_limit",
|
||||
"keeper_reward_percentage",
|
||||
"stability_fee"
|
||||
]
|
||||
},
|
||||
{
|
||||
"key": "type",
|
||||
"val": "busd-a",
|
||||
"allowed_subparam_attr_changes": [
|
||||
"auction_size",
|
||||
"check_collateralization_index_count",
|
||||
"debt_limit",
|
||||
"keeper_reward_percentage",
|
||||
"stability_fee"
|
||||
]
|
||||
},
|
||||
{
|
||||
"key": "type",
|
||||
"val": "busd-b",
|
||||
"allowed_subparam_attr_changes": [
|
||||
"auction_size",
|
||||
"check_collateralization_index_count",
|
||||
"debt_limit",
|
||||
"keeper_reward_percentage",
|
||||
"stability_fee"
|
||||
]
|
||||
},
|
||||
{
|
||||
"key": "type",
|
||||
"val": "btcb-a",
|
||||
"allowed_subparam_attr_changes": [
|
||||
"auction_size",
|
||||
"check_collateralization_index_count",
|
||||
"debt_limit",
|
||||
"keeper_reward_percentage",
|
||||
"stability_fee"
|
||||
]
|
||||
},
|
||||
{
|
||||
"key": "type",
|
||||
"val": "xrpb-a",
|
||||
"allowed_subparam_attr_changes": [
|
||||
"auction_size",
|
||||
"check_collateralization_index_count",
|
||||
"debt_limit",
|
||||
"keeper_reward_percentage",
|
||||
"stability_fee"
|
||||
]
|
||||
},
|
||||
{
|
||||
"key": "type",
|
||||
"val": "ukava-a",
|
||||
"allowed_subparam_attr_changes": [
|
||||
"auction_size",
|
||||
"check_collateralization_index_count",
|
||||
"debt_limit",
|
||||
"keeper_reward_percentage",
|
||||
"stability_fee"
|
||||
]
|
||||
},
|
||||
{
|
||||
"key": "type",
|
||||
"val": "hard-a",
|
||||
"allowed_subparam_attr_changes": [
|
||||
"auction_size",
|
||||
"check_collateralization_index_count",
|
||||
"debt_limit",
|
||||
"keeper_reward_percentage",
|
||||
"stability_fee"
|
||||
]
|
||||
},
|
||||
{
|
||||
"key": "type",
|
||||
"val": "hbtc-a",
|
||||
"allowed_subparam_attr_changes": [
|
||||
"auction_size",
|
||||
"check_collateralization_index_count",
|
||||
"debt_limit",
|
||||
"keeper_reward_percentage",
|
||||
"stability_fee"
|
||||
]
|
||||
},
|
||||
{
|
||||
"key": "type",
|
||||
"val": "swp-a",
|
||||
"allowed_subparam_attr_changes": [
|
||||
"auction_size",
|
||||
"check_collateralization_index_count",
|
||||
"debt_limit",
|
||||
"keeper_reward_percentage",
|
||||
"stability_fee"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"subspace": "cdp",
|
||||
"key": "DebtParam",
|
||||
"single_subparam_allowed_attrs": ["debt_floor"],
|
||||
"multi_subparams_requirements": []
|
||||
},
|
||||
{
|
||||
"subspace": "bep3",
|
||||
"key": "AssetParams",
|
||||
"single_subparam_allowed_attrs": [],
|
||||
"multi_subparams_requirements": [
|
||||
{
|
||||
"key": "denom",
|
||||
"val": "bnb",
|
||||
"allowed_subparam_attr_changes": [
|
||||
"active",
|
||||
"limit",
|
||||
"max_swap_amount",
|
||||
"min_block_lock"
|
||||
]
|
||||
},
|
||||
{
|
||||
"key": "denom",
|
||||
"val": "busd",
|
||||
"allowed_subparam_attr_changes": [
|
||||
"active",
|
||||
"coin_id",
|
||||
"limit",
|
||||
"max_swap_amount",
|
||||
"min_block_lock"
|
||||
]
|
||||
},
|
||||
{
|
||||
"key": "denom",
|
||||
"val": "btcb",
|
||||
"allowed_subparam_attr_changes": [
|
||||
"active",
|
||||
"limit",
|
||||
"max_swap_amount",
|
||||
"min_block_lock"
|
||||
]
|
||||
},
|
||||
{
|
||||
"key": "denom",
|
||||
"val": "xrpb",
|
||||
"allowed_subparam_attr_changes": [
|
||||
"active",
|
||||
"limit",
|
||||
"max_swap_amount",
|
||||
"min_block_lock"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"subspace": "pricefeed",
|
||||
"key": "Markets",
|
||||
"single_subparam_allowed_attrs": [],
|
||||
"multi_subparams_requirements": [
|
||||
{
|
||||
"key": "market_id",
|
||||
"val": "bnb:usd",
|
||||
"allowed_subparam_attr_changes": ["active"]
|
||||
},
|
||||
{
|
||||
"key": "market_id",
|
||||
"val": "bnb:usd:30",
|
||||
"allowed_subparam_attr_changes": ["active"]
|
||||
},
|
||||
{
|
||||
"key": "market_id",
|
||||
"val": "btc:usd",
|
||||
"allowed_subparam_attr_changes": ["active"]
|
||||
},
|
||||
{
|
||||
"key": "market_id",
|
||||
"val": "btc:usd:30",
|
||||
"allowed_subparam_attr_changes": ["active"]
|
||||
},
|
||||
{
|
||||
"key": "market_id",
|
||||
"val": "xrp:usd",
|
||||
"allowed_subparam_attr_changes": ["active"]
|
||||
},
|
||||
{
|
||||
"key": "market_id",
|
||||
"val": "xrp:usd:30",
|
||||
"allowed_subparam_attr_changes": ["active"]
|
||||
},
|
||||
{
|
||||
"key": "market_id",
|
||||
"val": "busd:usd",
|
||||
"allowed_subparam_attr_changes": ["active"]
|
||||
},
|
||||
{
|
||||
"key": "market_id",
|
||||
"val": "busd:usd:30",
|
||||
"allowed_subparam_attr_changes": ["active"]
|
||||
},
|
||||
{
|
||||
"key": "market_id",
|
||||
"val": "kava:usd",
|
||||
"allowed_subparam_attr_changes": ["active"]
|
||||
},
|
||||
{
|
||||
"key": "market_id",
|
||||
"val": "kava:usd:30",
|
||||
"allowed_subparam_attr_changes": ["active"]
|
||||
},
|
||||
{
|
||||
"key": "market_id",
|
||||
"val": "hard:usd",
|
||||
"allowed_subparam_attr_changes": ["active"]
|
||||
},
|
||||
{
|
||||
"key": "market_id",
|
||||
"val": "hard:usd:30",
|
||||
"allowed_subparam_attr_changes": ["active"]
|
||||
},
|
||||
{
|
||||
"key": "market_id",
|
||||
"val": "usdx:usd",
|
||||
"allowed_subparam_attr_changes": ["active"]
|
||||
},
|
||||
{
|
||||
"key": "market_id",
|
||||
"val": "usdx:usd:30",
|
||||
"allowed_subparam_attr_changes": ["active"]
|
||||
},
|
||||
{
|
||||
"key": "market_id",
|
||||
"val": "usdx:usd:720",
|
||||
"allowed_subparam_attr_changes": ["active"]
|
||||
},
|
||||
{
|
||||
"key": "market_id",
|
||||
"val": "swp:usd",
|
||||
"allowed_subparam_attr_changes": ["active"]
|
||||
},
|
||||
{
|
||||
"key": "market_id",
|
||||
"val": "swp:usd:30",
|
||||
"allowed_subparam_attr_changes": ["active"]
|
||||
},
|
||||
{
|
||||
"key": "market_id",
|
||||
"val": "atom:usd",
|
||||
"allowed_subparam_attr_changes": ["active"]
|
||||
},
|
||||
{
|
||||
"key": "market_id",
|
||||
"val": "atom:usd:30",
|
||||
"allowed_subparam_attr_changes": ["active"]
|
||||
},
|
||||
{
|
||||
"key": "market_id",
|
||||
"val": "akt:usd",
|
||||
"allowed_subparam_attr_changes": ["active"]
|
||||
},
|
||||
{
|
||||
"key": "market_id",
|
||||
"val": "akt:usd:30",
|
||||
"allowed_subparam_attr_changes": ["active"]
|
||||
},
|
||||
{
|
||||
"key": "market_id",
|
||||
"val": "luna:usd",
|
||||
"allowed_subparam_attr_changes": ["active"]
|
||||
},
|
||||
{
|
||||
"key": "market_id",
|
||||
"val": "luna:usd:30",
|
||||
"allowed_subparam_attr_changes": ["active"]
|
||||
},
|
||||
{
|
||||
"key": "market_id",
|
||||
"val": "osmo:usd",
|
||||
"allowed_subparam_attr_changes": ["active"]
|
||||
},
|
||||
{
|
||||
"key": "market_id",
|
||||
"val": "osmo:usd:30",
|
||||
"allowed_subparam_attr_changes": ["active"]
|
||||
},
|
||||
{
|
||||
"key": "market_id",
|
||||
"val": "ust:usd",
|
||||
"allowed_subparam_attr_changes": ["active"]
|
||||
},
|
||||
{
|
||||
"key": "market_id",
|
||||
"val": "ust:usd:30",
|
||||
"allowed_subparam_attr_changes": ["active"]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"subspace": "hard",
|
||||
"key": "MoneyMarkets",
|
||||
"single_subparam_allowed_attrs": [],
|
||||
"multi_subparams_requirements": [
|
||||
{
|
||||
"key": "denom",
|
||||
"val": "bnb",
|
||||
"allowed_subparam_attr_changes": [
|
||||
"borrow_limit",
|
||||
"interest_rate_model",
|
||||
"keeper_reward_percentage",
|
||||
"reserve_factor"
|
||||
]
|
||||
},
|
||||
{
|
||||
"key": "denom",
|
||||
"val": "busd",
|
||||
"allowed_subparam_attr_changes": [
|
||||
"borrow_limit",
|
||||
"interest_rate_model",
|
||||
"keeper_reward_percentage",
|
||||
"reserve_factor"
|
||||
]
|
||||
},
|
||||
{
|
||||
"key": "denom",
|
||||
"val": "btcb",
|
||||
"allowed_subparam_attr_changes": [
|
||||
"borrow_limit",
|
||||
"interest_rate_model",
|
||||
"keeper_reward_percentage",
|
||||
"reserve_factor"
|
||||
]
|
||||
},
|
||||
{
|
||||
"key": "denom",
|
||||
"val": "xrpb",
|
||||
"allowed_subparam_attr_changes": [
|
||||
"borrow_limit",
|
||||
"interest_rate_model",
|
||||
"keeper_reward_percentage",
|
||||
"reserve_factor"
|
||||
]
|
||||
},
|
||||
{
|
||||
"key": "denom",
|
||||
"val": "usdx",
|
||||
"allowed_subparam_attr_changes": [
|
||||
"borrow_limit",
|
||||
"interest_rate_model",
|
||||
"keeper_reward_percentage",
|
||||
"reserve_factor"
|
||||
]
|
||||
},
|
||||
{
|
||||
"key": "denom",
|
||||
"val": "ukava",
|
||||
"allowed_subparam_attr_changes": [
|
||||
"borrow_limit",
|
||||
"interest_rate_model",
|
||||
"keeper_reward_percentage",
|
||||
"reserve_factor"
|
||||
]
|
||||
},
|
||||
{
|
||||
"key": "denom",
|
||||
"val": "hard",
|
||||
"allowed_subparam_attr_changes": [
|
||||
"borrow_limit",
|
||||
"interest_rate_model",
|
||||
"keeper_reward_percentage",
|
||||
"reserve_factor"
|
||||
]
|
||||
},
|
||||
{
|
||||
"key": "denom",
|
||||
"val": "swp",
|
||||
"allowed_subparam_attr_changes": [
|
||||
"borrow_limit",
|
||||
"interest_rate_model",
|
||||
"keeper_reward_percentage",
|
||||
"reserve_factor"
|
||||
]
|
||||
},
|
||||
{
|
||||
"key": "denom",
|
||||
"val": "ibc/27394FB092D2ECCD56123C74F36E4C1F926001CEADA9CA97EA622B25F41E5EB2",
|
||||
"allowed_subparam_attr_changes": [
|
||||
"borrow_limit",
|
||||
"interest_rate_model",
|
||||
"keeper_reward_percentage",
|
||||
"reserve_factor"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{ "@type": "/kava.committee.v1beta1.TextPermission" }
|
||||
],
|
||||
"vote_threshold": "0.500000000000000000",
|
||||
"proposal_duration": "600s",
|
||||
"tally_option": "TALLY_OPTION_FIRST_PAST_THE_POST"
|
||||
}
|
||||
},
|
||||
{
|
||||
"@type": "/kava.committee.v1beta1.MemberCommittee",
|
||||
"base_committee": {
|
||||
"id": "2",
|
||||
"description": "Kava Safety Committee",
|
||||
"members": ["kava1n96qpdfcz2m7y364ewk8srv9zuq6ucwduyjaag"],
|
||||
"permissions": [
|
||||
{ "@type": "/kava.committee.v1beta1.SoftwareUpgradePermission" }
|
||||
],
|
||||
"vote_threshold": "0.500000000000000000",
|
||||
"proposal_duration": "604800s",
|
||||
"tally_option": "TALLY_OPTION_FIRST_PAST_THE_POST"
|
||||
}
|
||||
},
|
||||
{
|
||||
"@type": "/kava.committee.v1beta1.TokenCommittee",
|
||||
"base_committee": {
|
||||
"id": "3",
|
||||
"description": "Hard Governance Committee",
|
||||
"members": ["kava1n96qpdfcz2m7y364ewk8srv9zuq6ucwduyjaag"],
|
||||
"permissions": [
|
||||
{
|
||||
"@type": "/kava.committee.v1beta1.ParamsChangePermission",
|
||||
"allowed_params_changes": [
|
||||
{
|
||||
"subspace": "hard",
|
||||
"key": "MinimumBorrowUSDValue",
|
||||
"single_subparam_allowed_attrs": [],
|
||||
"multi_subparams_requirements": []
|
||||
},
|
||||
{
|
||||
"subspace": "incentive",
|
||||
"key": "HardSupplyRewardPeriods",
|
||||
"single_subparam_allowed_attrs": [],
|
||||
"multi_subparams_requirements": []
|
||||
},
|
||||
{
|
||||
"subspace": "incentive",
|
||||
"key": "HardBorrowRewardPeriods",
|
||||
"single_subparam_allowed_attrs": [],
|
||||
"multi_subparams_requirements": []
|
||||
},
|
||||
{
|
||||
"subspace": "incentive",
|
||||
"key": "HardDelegatorRewardPeriods",
|
||||
"single_subparam_allowed_attrs": [],
|
||||
"multi_subparams_requirements": []
|
||||
},
|
||||
{
|
||||
"subspace": "hard",
|
||||
"key": "MoneyMarkets",
|
||||
"single_subparam_allowed_attrs": [],
|
||||
"multi_subparams_requirements": [
|
||||
{
|
||||
"key": "denom",
|
||||
"val": "bnb",
|
||||
"allowed_subparam_attr_changes": [
|
||||
"borrow_limit",
|
||||
"interest_rate_model",
|
||||
"keeper_reward_percentage",
|
||||
"reserve_factor",
|
||||
"spot_market_id"
|
||||
]
|
||||
},
|
||||
{
|
||||
"key": "denom",
|
||||
"val": "busd",
|
||||
"allowed_subparam_attr_changes": [
|
||||
"borrow_limit",
|
||||
"interest_rate_model",
|
||||
"keeper_reward_percentage",
|
||||
"reserve_factor",
|
||||
"spot_market_id"
|
||||
]
|
||||
},
|
||||
{
|
||||
"key": "denom",
|
||||
"val": "btcb",
|
||||
"allowed_subparam_attr_changes": [
|
||||
"borrow_limit",
|
||||
"interest_rate_model",
|
||||
"keeper_reward_percentage",
|
||||
"reserve_factor",
|
||||
"spot_market_id"
|
||||
]
|
||||
},
|
||||
{
|
||||
"key": "denom",
|
||||
"val": "xrpb",
|
||||
"allowed_subparam_attr_changes": [
|
||||
"borrow_limit",
|
||||
"interest_rate_model",
|
||||
"keeper_reward_percentage",
|
||||
"reserve_factor",
|
||||
"spot_market_id"
|
||||
]
|
||||
},
|
||||
{
|
||||
"key": "denom",
|
||||
"val": "usdx",
|
||||
"allowed_subparam_attr_changes": [
|
||||
"borrow_limit",
|
||||
"interest_rate_model",
|
||||
"keeper_reward_percentage",
|
||||
"reserve_factor",
|
||||
"spot_market_id"
|
||||
]
|
||||
},
|
||||
{
|
||||
"key": "denom",
|
||||
"val": "ukava",
|
||||
"allowed_subparam_attr_changes": [
|
||||
"borrow_limit",
|
||||
"interest_rate_model",
|
||||
"keeper_reward_percentage",
|
||||
"reserve_factor",
|
||||
"spot_market_id"
|
||||
]
|
||||
},
|
||||
{
|
||||
"key": "denom",
|
||||
"val": "hard",
|
||||
"allowed_subparam_attr_changes": [
|
||||
"borrow_limit",
|
||||
"interest_rate_model",
|
||||
"keeper_reward_percentage",
|
||||
"reserve_factor",
|
||||
"spot_market_id"
|
||||
]
|
||||
},
|
||||
{
|
||||
"key": "denom",
|
||||
"val": "swp",
|
||||
"allowed_subparam_attr_changes": [
|
||||
"borrow_limit",
|
||||
"interest_rate_model",
|
||||
"keeper_reward_percentage",
|
||||
"reserve_factor",
|
||||
"spot_market_id"
|
||||
]
|
||||
},
|
||||
{
|
||||
"key": "denom",
|
||||
"val": "ibc/27394FB092D2ECCD56123C74F36E4C1F926001CEADA9CA97EA622B25F41E5EB2",
|
||||
"allowed_subparam_attr_changes": [
|
||||
"borrow_limit",
|
||||
"interest_rate_model",
|
||||
"keeper_reward_percentage",
|
||||
"reserve_factor",
|
||||
"spot_market_id"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"vote_threshold": "0.500000000000000000",
|
||||
"proposal_duration": "600s",
|
||||
"tally_option": "TALLY_OPTION_DEADLINE"
|
||||
},
|
||||
"quorum": "0.330000000000000000",
|
||||
"tally_denom": "hard"
|
||||
},
|
||||
{
|
||||
"@type": "/kava.committee.v1beta1.TokenCommittee",
|
||||
"base_committee": {
|
||||
"id": "4",
|
||||
"description": "Swp Governance Committee",
|
||||
"members": ["kava1n96qpdfcz2m7y364ewk8srv9zuq6ucwduyjaag"],
|
||||
"permissions": [
|
||||
{
|
||||
"@type": "/kava.committee.v1beta1.ParamsChangePermission",
|
||||
"allowed_params_changes": [
|
||||
{
|
||||
"subspace": "swap",
|
||||
"key": "AllowedPools",
|
||||
"single_subparam_allowed_attrs": [],
|
||||
"multi_subparams_requirements": []
|
||||
},
|
||||
{
|
||||
"subspace": "swap",
|
||||
"key": "SwapFee",
|
||||
"single_subparam_allowed_attrs": [],
|
||||
"multi_subparams_requirements": []
|
||||
},
|
||||
{
|
||||
"subspace": "incentive",
|
||||
"key": "HardDelegatorRewardPeriods",
|
||||
"single_subparam_allowed_attrs": [],
|
||||
"multi_subparams_requirements": []
|
||||
},
|
||||
{
|
||||
"subspace": "incentive",
|
||||
"key": "SwapRewardPeriods",
|
||||
"single_subparam_allowed_attrs": [],
|
||||
"multi_subparams_requirements": []
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"vote_threshold": "0.500000000000000000",
|
||||
"proposal_duration": "600s",
|
||||
"tally_option": "TALLY_OPTION_DEADLINE"
|
||||
},
|
||||
"quorum": "0.330000000000000000",
|
||||
"tally_denom": "swp"
|
||||
},
|
||||
{
|
||||
"@type": "/kava.committee.v1beta1.MemberCommittee",
|
||||
"base_committee": {
|
||||
"id": "5",
|
||||
"description": "Kava God Committee (testing only)",
|
||||
"members": ["kava1n96qpdfcz2m7y364ewk8srv9zuq6ucwduyjaag"],
|
||||
"permissions": [{ "@type": "/kava.committee.v1beta1.GodPermission" }],
|
||||
"vote_threshold": "0.500000000000000000",
|
||||
"proposal_duration": "604800s",
|
||||
"tally_option": "TALLY_OPTION_FIRST_PAST_THE_POST"
|
||||
}
|
||||
}
|
||||
],
|
||||
"proposals": [
|
||||
{
|
||||
"content": {
|
||||
"@type": "/kava.kavadist.v1beta1.CommunityPoolMultiSpendProposal",
|
||||
"title": "Test",
|
||||
"description": "Test",
|
||||
"recipient_list": [
|
||||
{
|
||||
"address": "kava1ze7y9qwdddejmy7jlw4cymqqlt2wh05yhwmrv2",
|
||||
"amount": [{ "denom": "ukava", "amount": "10" }]
|
||||
}
|
||||
]
|
||||
},
|
||||
"id": "1",
|
||||
"committee_id": "2",
|
||||
"deadline": "2021-11-24T18:48:08.693415Z"
|
||||
},
|
||||
{
|
||||
"content": {
|
||||
"@type": "/cosmos.distribution.v1beta1.CommunityPoolSpendProposal",
|
||||
"title": "Community Pool Spend",
|
||||
"description": "Fund the community pool.",
|
||||
"recipient": "kava1ze7y9qwdddejmy7jlw4cymqqlt2wh05yhwmrv2",
|
||||
"amount": [{ "denom": "ukava", "amount": "10" }]
|
||||
},
|
||||
"id": "1",
|
||||
"committee_id": "2",
|
||||
"deadline": "2021-11-24T18:49:44.219341Z"
|
||||
},
|
||||
{
|
||||
"content": {
|
||||
"@type": "/cosmos.upgrade.v1beta1.SoftwareUpgradeProposal",
|
||||
"title": "Test",
|
||||
"description": "Test",
|
||||
"plan": {
|
||||
"name": "Test",
|
||||
"time": "0001-01-01T00:00:00Z",
|
||||
"height": "100",
|
||||
"info": "",
|
||||
"upgraded_client_state": null
|
||||
}
|
||||
},
|
||||
"id": "1",
|
||||
"committee_id": "2",
|
||||
"deadline": "2021-11-24T18:49:44.219693Z"
|
||||
}
|
||||
],
|
||||
"votes": [
|
||||
{
|
||||
"proposal_id": "1",
|
||||
"voter": "kava1ze7y9qwdddejmy7jlw4cymqqlt2wh05yhwmrv2",
|
||||
"vote_type": "VOTE_TYPE_YES"
|
||||
},
|
||||
{
|
||||
"proposal_id": "1",
|
||||
"voter": "kava1ze7y9qwdddejmy7jlw4cymqqlt2wh05yhwmrv2",
|
||||
"vote_type": "VOTE_TYPE_ABSTAIN"
|
||||
}
|
||||
]
|
||||
}
|
Loading…
Reference in New Issue
Block a user