diff --git a/x/registry/codec.go b/x/registry/codec.go new file mode 100644 index 00000000..0d45e6d0 --- /dev/null +++ b/x/registry/codec.go @@ -0,0 +1,23 @@ +package registry + +import ( + "github.com/cosmos/cosmos-sdk/codec/types" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/msgservice" +) + +func RegisterInterfaces(registry types.InterfaceRegistry) { + registry.RegisterImplementations((*sdk.Msg)(nil)) // &MsgSetName{}, + // &MsgReserveAuthority{}, + // &MsgDeleteNameAuthority{}, + // &MsgSetAuthorityBond{}, + + // &MsgSetRecord{}, + // &MsgRenewRecord{}, + // &MsgAssociateBond{}, + // &MsgDissociateBond{}, + // &MsgDissociateRecords{}, + // &MsgReAssociateRecords{}, + + msgservice.RegisterMsgServiceDesc(registry, &_Msg_serviceDesc) +} diff --git a/x/registry/genesis.go b/x/registry/genesis.go new file mode 100644 index 00000000..7b45fe1a --- /dev/null +++ b/x/registry/genesis.go @@ -0,0 +1,30 @@ +package registry + +// DefaultGenesisState sets default evm genesis state with empty accounts and default params and +// chain config values. +func DefaultGenesisState() *GenesisState { + return &GenesisState{ + Params: DefaultParams(), + Records: []Record{}, + Authorities: []AuthorityEntry{}, + Names: []NameEntry{}, + } +} + +func NewGenesisState(params Params, records []Record, authorities []AuthorityEntry, names []NameEntry) GenesisState { + return GenesisState{ + Params: params, + Records: records, + Authorities: authorities, + Names: names, + } +} + +// Validate performs basic genesis state validation returning an error upon any +func (gs *GenesisState) Validate() error { + if err := gs.Params.Validate(); err != nil { + return err + } + + return nil +} diff --git a/x/registry/keys.go b/x/registry/keys.go new file mode 100644 index 00000000..29b88bdf --- /dev/null +++ b/x/registry/keys.go @@ -0,0 +1,20 @@ +package registry + +import "cosmossdk.io/collections" + +const ( + // ModuleName is the name of the registry module + ModuleName = "registry" + + // RecordRentModuleAccountName is the name of the module account that keeps track of record rents paid. + RecordRentModuleAccountName = "record_rent" + + // AuthorityRentModuleAccountName is the name of the module account that keeps track of authority rents paid. + AuthorityRentModuleAccountName = "authority_rent" +) + +// Store prefixes +var ( + // ParamsKey is the prefix for params key + ParamsPrefix = collections.NewPrefix(0) +) diff --git a/x/registry/params.go b/x/registry/params.go new file mode 100644 index 00000000..b98fe820 --- /dev/null +++ b/x/registry/params.go @@ -0,0 +1,195 @@ +package registry + +import ( + fmt "fmt" + time "time" + + sdkmath "cosmossdk.io/math" + sdk "github.com/cosmos/cosmos-sdk/types" +) + +// Default parameter values. +var ( + // DefaultRecordRent is the default record rent for 1 time period (see expiry time). + DefaultRecordRent = sdkmath.NewInt(1000000) + + // DefaultRecordExpiryTime is the default record expiry time (1 year). + DefaultRecordExpiryTime = time.Hour * 24 * 365 + + DefaultAuthorityRent = sdkmath.NewInt(1000000) + DefaultAuthorityExpiryTime = time.Hour * 24 * 365 + DefaultAuthorityGracePeriod = time.Hour * 24 * 2 + + DefaultAuthorityAuctionEnabled = false + DefaultCommitsDuration = time.Hour * 24 + DefaultRevealsDuration = time.Hour * 24 + DefaultCommitFee = sdkmath.NewInt(1000000) + DefaultRevealFee = sdkmath.NewInt(1000000) + DefaultMinimumBid = sdkmath.NewInt(5000000) +) + +// NewParams creates a new Params instance +func NewParams( + recordRent sdk.Coin, + recordRentDuration time.Duration, + authorityRent sdk.Coin, + authorityRentDuration time.Duration, + authorityGracePeriod time.Duration, + authorityAuctionEnabled bool, + commitsDuration time.Duration, revealsDuration time.Duration, + commitFee sdk.Coin, revealFee sdk.Coin, + minimumBid sdk.Coin, +) Params { + return Params{ + RecordRent: recordRent, + RecordRentDuration: recordRentDuration, + + AuthorityRent: authorityRent, + AuthorityRentDuration: authorityRentDuration, + AuthorityGracePeriod: authorityGracePeriod, + + AuthorityAuctionEnabled: authorityAuctionEnabled, + AuthorityAuctionCommitsDuration: commitsDuration, + AuthorityAuctionRevealsDuration: revealsDuration, + AuthorityAuctionCommitFee: commitFee, + AuthorityAuctionRevealFee: revealFee, + AuthorityAuctionMinimumBid: minimumBid, + } +} + +// DefaultParams returns a default set of parameters. +func DefaultParams() Params { + return NewParams( + sdk.NewCoin(sdk.DefaultBondDenom, DefaultRecordRent), DefaultRecordExpiryTime, + sdk.NewCoin(sdk.DefaultBondDenom, DefaultAuthorityRent), + DefaultAuthorityExpiryTime, DefaultAuthorityGracePeriod, DefaultAuthorityAuctionEnabled, DefaultCommitsDuration, + DefaultRevealsDuration, + sdk.NewCoin(sdk.DefaultBondDenom, DefaultCommitFee), + sdk.NewCoin(sdk.DefaultBondDenom, DefaultRevealFee), + sdk.NewCoin(sdk.DefaultBondDenom, DefaultMinimumBid), + ) +} + +// Validate a set of params. +func (p Params) Validate() error { + if err := validateRecordRent(p.RecordRent); err != nil { + return err + } + + if err := validateRecordRentDuration(p.RecordRentDuration); err != nil { + return err + } + + if err := validateAuthorityRent(p.AuthorityRent); err != nil { + return err + } + + if err := validateAuthorityRentDuration(p.AuthorityRentDuration); err != nil { + return err + } + + if err := validateAuthorityGracePeriod(p.AuthorityGracePeriod); err != nil { + return err + } + + if err := validateAuthorityAuctionEnabled(p.AuthorityAuctionEnabled); err != nil { + return err + } + + if err := validateCommitsDuration(p.AuthorityAuctionCommitsDuration); err != nil { + return err + } + + if err := validateRevealsDuration(p.AuthorityAuctionRevealsDuration); err != nil { + return err + } + + if err := validateCommitFee(p.AuthorityAuctionCommitFee); err != nil { + return err + } + + if err := validateRevealFee(p.AuthorityAuctionRevealFee); err != nil { + return err + } + + if err := validateMinimumBid(p.AuthorityAuctionMinimumBid); err != nil { + return err + } + + return nil +} + +func validateRecordRent(i interface{}) error { + return validateAmount("RecordRent", i) +} + +func validateRecordRentDuration(i interface{}) error { + return validateDuration("RecordRentDuration", i) +} + +func validateAuthorityRent(i interface{}) error { + return validateAmount("AuthorityRent", i) +} + +func validateAuthorityRentDuration(i interface{}) error { + return validateDuration("AuthorityRentDuration", i) +} + +func validateAuthorityGracePeriod(i interface{}) error { + return validateDuration("AuthorityGracePeriod", i) +} + +func validateAuthorityAuctionEnabled(i interface{}) error { + _, ok := i.(bool) + if !ok { + return fmt.Errorf("%s invalid parameter type: %T", "AuthorityAuctionEnabled", i) + } + + return nil +} + +func validateCommitsDuration(i interface{}) error { + return validateDuration("AuthorityCommitsDuration", i) +} + +func validateRevealsDuration(i interface{}) error { + return validateDuration("AuthorityRevealsDuration", i) +} + +func validateCommitFee(i interface{}) error { + return validateAmount("AuthorityCommitFee", i) +} + +func validateRevealFee(i interface{}) error { + return validateAmount("AuthorityRevealFee", i) +} + +func validateMinimumBid(i interface{}) error { + return validateAmount("AuthorityMinimumBid", i) +} + +func validateAmount(name string, i interface{}) error { + v, ok := i.(sdk.Coin) + if !ok { + return fmt.Errorf("%s invalid parameter type: %T", name, i) + } + + if v.Amount.IsNegative() { + return fmt.Errorf("%s can't be negative", name) + } + + return nil +} + +func validateDuration(name string, i interface{}) error { + v, ok := i.(time.Duration) + if !ok { + return fmt.Errorf("%s invalid parameter type: %T", name, i) + } + + if v <= 0 { + return fmt.Errorf("%s must be a positive integer", name) + } + + return nil +}