From 071fe251ee0c4f07b32dda31ba8a133167d85a5c Mon Sep 17 00:00:00 2001 From: Zaki Manian Date: Wed, 25 Aug 2021 03:03:57 -0700 Subject: [PATCH] feat: periodic vesting msg, cherry-pick 147d798048a482f9263f3e3389fbb88b45829fe2 #9596 (cherry picked from commit 5d01af4fbdb8b186d5c1777333a699918b282c64) (cherry picked from commit aefda6b553a186f031f432c447717ac202e40ef9) (cherry picked from commit 82c42931cd9c48aa04078609a4a79d3fd741d6e6) --- docs/core/proto-docs.md | 156 +++++--- proto/cosmos/vesting/v1beta1/tx.proto | 20 +- x/auth/spec/07_client.md | 2 +- x/auth/vesting/client/cli/tx.go | 93 +++++ x/auth/vesting/msg_server.go | 60 +++ x/auth/vesting/types/msgs.go | 70 ++++ x/auth/vesting/types/tx.pb.go | 543 ++++++++++++++++++++++++-- 7 files changed, 853 insertions(+), 91 deletions(-) diff --git a/docs/core/proto-docs.md b/docs/core/proto-docs.md index 0024398d0752..8b18de94abd6 100644 --- a/docs/core/proto-docs.md +++ b/docs/core/proto-docs.md @@ -581,12 +581,6 @@ - [Query](#cosmos.upgrade.v1beta1.Query) -- [cosmos/vesting/v1beta1/tx.proto](#cosmos/vesting/v1beta1/tx.proto) - - [MsgCreateVestingAccount](#cosmos.vesting.v1beta1.MsgCreateVestingAccount) - - [MsgCreateVestingAccountResponse](#cosmos.vesting.v1beta1.MsgCreateVestingAccountResponse) - - - [Msg](#cosmos.vesting.v1beta1.Msg) - - [cosmos/vesting/v1beta1/vesting.proto](#cosmos/vesting/v1beta1/vesting.proto) - [BaseVestingAccount](#cosmos.vesting.v1beta1.BaseVestingAccount) - [ContinuousVestingAccount](#cosmos.vesting.v1beta1.ContinuousVestingAccount) @@ -595,6 +589,14 @@ - [PeriodicVestingAccount](#cosmos.vesting.v1beta1.PeriodicVestingAccount) - [PermanentLockedAccount](#cosmos.vesting.v1beta1.PermanentLockedAccount) +- [cosmos/vesting/v1beta1/tx.proto](#cosmos/vesting/v1beta1/tx.proto) + - [MsgCreatePeriodicVestingAccount](#cosmos.vesting.v1beta1.MsgCreatePeriodicVestingAccount) + - [MsgCreatePeriodicVestingAccountResponse](#cosmos.vesting.v1beta1.MsgCreatePeriodicVestingAccountResponse) + - [MsgCreateVestingAccount](#cosmos.vesting.v1beta1.MsgCreateVestingAccount) + - [MsgCreateVestingAccountResponse](#cosmos.vesting.v1beta1.MsgCreateVestingAccountResponse) + + - [Msg](#cosmos.vesting.v1beta1.Msg) + - [Scalar Value Types](#scalar-value-types) @@ -8324,62 +8326,6 @@ Since: cosmos-sdk 0.43 | GET|/cosmos/upgrade/v1beta1/module_versions| - -

Top

- -## cosmos/vesting/v1beta1/tx.proto - - - - - -### MsgCreateVestingAccount -MsgCreateVestingAccount defines a message that enables creating a vesting -account. - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| `from_address` | [string](#string) | | | -| `to_address` | [string](#string) | | | -| `amount` | [cosmos.base.v1beta1.Coin](#cosmos.base.v1beta1.Coin) | repeated | | -| `end_time` | [int64](#int64) | | | -| `delayed` | [bool](#bool) | | | - - - - - - - - -### MsgCreateVestingAccountResponse -MsgCreateVestingAccountResponse defines the Msg/CreateVestingAccount response type. - - - - - - - - - - - - - - -### Msg -Msg defines the bank Msg service. - -| Method Name | Request Type | Response Type | Description | HTTP Verb | Endpoint | -| ----------- | ------------ | ------------- | ------------| ------- | -------- | -| `CreateVestingAccount` | [MsgCreateVestingAccount](#cosmos.vesting.v1beta1.MsgCreateVestingAccount) | [MsgCreateVestingAccountResponse](#cosmos.vesting.v1beta1.MsgCreateVestingAccountResponse) | CreateVestingAccount defines a method that enables creating a vesting account. | | - - - - -

Top

@@ -8503,6 +8449,92 @@ Since: cosmos-sdk 0.43 + +

Top

+ +## cosmos/vesting/v1beta1/tx.proto + + + + + +### MsgCreatePeriodicVestingAccount +MsgCreatePeriodicVestingAccount defines a message that enables creating a periodic vesting +account. + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| `from_address` | [string](#string) | | | +| `to_address` | [string](#string) | | | +| `start_time` | [int64](#int64) | | | +| `vesting_periods` | [Period](#cosmos.vesting.v1beta1.Period) | repeated | | + + + + + + + + +### MsgCreatePeriodicVestingAccountResponse +MsgCreatePeriodicVestingAccountResponse defines the Msg/CreatePeriodicVestingAccount response type. + + + + + + + + +### MsgCreateVestingAccount +MsgCreateVestingAccount defines a message that enables creating a vesting +account. + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| `from_address` | [string](#string) | | | +| `to_address` | [string](#string) | | | +| `amount` | [cosmos.base.v1beta1.Coin](#cosmos.base.v1beta1.Coin) | repeated | | +| `end_time` | [int64](#int64) | | | +| `delayed` | [bool](#bool) | | | + + + + + + + + +### MsgCreateVestingAccountResponse +MsgCreateVestingAccountResponse defines the Msg/CreateVestingAccount response type. + + + + + + + + + + + + + + +### Msg +Msg defines the bank Msg service. + +| Method Name | Request Type | Response Type | Description | HTTP Verb | Endpoint | +| ----------- | ------------ | ------------- | ------------| ------- | -------- | +| `CreateVestingAccount` | [MsgCreateVestingAccount](#cosmos.vesting.v1beta1.MsgCreateVestingAccount) | [MsgCreateVestingAccountResponse](#cosmos.vesting.v1beta1.MsgCreateVestingAccountResponse) | CreateVestingAccount defines a method that enables creating a vesting account. | | +| `CreatePeriodicVestingAccount` | [MsgCreatePeriodicVestingAccount](#cosmos.vesting.v1beta1.MsgCreatePeriodicVestingAccount) | [MsgCreatePeriodicVestingAccountResponse](#cosmos.vesting.v1beta1.MsgCreatePeriodicVestingAccountResponse) | CreatePeriodicVestingAccount defines a method that enables creating a periodic vesting account. | | + + + + + ## Scalar Value Types | .proto Type | Notes | C++ | Java | Python | Go | C# | PHP | Ruby | diff --git a/proto/cosmos/vesting/v1beta1/tx.proto b/proto/cosmos/vesting/v1beta1/tx.proto index c49be802a76e..4aa035636ad5 100644 --- a/proto/cosmos/vesting/v1beta1/tx.proto +++ b/proto/cosmos/vesting/v1beta1/tx.proto @@ -3,6 +3,7 @@ package cosmos.vesting.v1beta1; import "gogoproto/gogo.proto"; import "cosmos/base/v1beta1/coin.proto"; +import "cosmos/vesting/v1beta1/vesting.proto"; option go_package = "github.com/cosmos/cosmos-sdk/x/auth/vesting/types"; @@ -11,6 +12,9 @@ service Msg { // CreateVestingAccount defines a method that enables creating a vesting // account. rpc CreateVestingAccount(MsgCreateVestingAccount) returns (MsgCreateVestingAccountResponse); + // CreatePeriodicVestingAccount defines a method that enables creating a + // periodic vesting account. + rpc CreatePeriodicVestingAccount(MsgCreatePeriodicVestingAccount) returns (MsgCreatePeriodicVestingAccountResponse); } // MsgCreateVestingAccount defines a message that enables creating a vesting @@ -28,4 +32,18 @@ message MsgCreateVestingAccount { } // MsgCreateVestingAccountResponse defines the Msg/CreateVestingAccount response type. -message MsgCreateVestingAccountResponse {} \ No newline at end of file +message MsgCreateVestingAccountResponse {} + +// MsgCreatePeriodicVestingAccount defines a message that enables creating a periodic vesting +// account. +message MsgCreatePeriodicVestingAccount { + option (gogoproto.equal) = false; + + string from_address = 1 [(gogoproto.moretags) = "yaml:\"from_address\""]; + string to_address = 2 [(gogoproto.moretags) = "yaml:\"to_address\""]; + int64 start_time = 3 [(gogoproto.moretags) = "yaml:\"start_time\""]; + repeated Period vesting_periods = 4 [(gogoproto.nullable) = false]; +} + +// MsgCreatePeriodicVestingAccountResponse defines the Msg/CreatePeriodicVestingAccount response type. +message MsgCreatePeriodicVestingAccountResponse {} diff --git a/x/auth/spec/07_client.md b/x/auth/spec/07_client.md index bcfdc6f6faee..ac4efef0f108 100644 --- a/x/auth/spec/07_client.md +++ b/x/auth/spec/07_client.md @@ -394,7 +394,7 @@ simd tx vesting --help #### create-periodic-vesting-account -The `create-periodic-vesting-account` command creates a new vesting account funded with an allocation of tokens, where a sequence of coins and period length in seconds. Periods are sequential, in that the duration of of a period only starts at the end of the previous period. The duration of the first period starts upon account creation. +The `create-periodic-vesting-account` command creates a new vesting account funded with an allocation of tokens, where a sequence of coins and period length in seconds. Periods are sequential, in that the duration of a period only starts at the end of the previous period. The duration of the first period starts upon account creation. ```bash simd tx vesting create-periodic-vesting-account [to_address] [periods_json_file] [flags] diff --git a/x/auth/vesting/client/cli/tx.go b/x/auth/vesting/client/cli/tx.go index 686a941e5de2..dc7eaa108422 100644 --- a/x/auth/vesting/client/cli/tx.go +++ b/x/auth/vesting/client/cli/tx.go @@ -1,6 +1,9 @@ package cli import ( + "encoding/json" + "fmt" + "io/ioutil" "strconv" "github.com/spf13/cobra" @@ -29,6 +32,7 @@ func GetTxCmd() *cobra.Command { txCmd.AddCommand( NewMsgCreateVestingAccountCmd(), + NewMsgCreatePeriodicVestingAccountCmd(), ) return txCmd @@ -79,3 +83,92 @@ timestamp.`, return cmd } + +type VestingData struct { + StartTime int64 `json:"start_time"` + Periods []InputPeriod `json:"periods"` +} + +type InputPeriod struct { + Coins string `json:"coins"` + Length int64 `json:"length_seconds"` +} + +// NewMsgCreatePeriodicVestingAccountCmd returns a CLI command handler for creating a +// MsgCreatePeriodicVestingAccountCmd transaction. +func NewMsgCreatePeriodicVestingAccountCmd() *cobra.Command { + cmd := &cobra.Command{ + Use: "create-periodic-vesting-account [to_address] [periods_json_file]", + Short: "Create a new periodic vesting account funded with an allocation of tokens.", + Long: `A sequence of coins and period length in seconds. Periods are sequential, in that the duration of a period only starts at the end of the previous period. The duration of the first period starts upon account creation. For instance, the following periods.json file shows 20 "test" coins vesting 30 days apart from each other. + Where periods.json contains: + + An array of coin strings and unix epoch times for coins to vest +{ + "start_time": 1625204910, + "periods": + [ + { + "coins": "10test", + "length_seconds": 2592000 + }, + { + "coins": "10test", + "length_seconds": 2592000 + } + ] +} + `, + Args: cobra.ExactArgs(2), + RunE: func(cmd *cobra.Command, args []string) error { + clientCtx, err := client.GetClientTxContext(cmd) + if err != nil { + return err + } + + toAddr, err := sdk.AccAddressFromBech32(args[0]) + if err != nil { + return err + } + + contents, err := ioutil.ReadFile(args[1]) + if err != nil { + return err + } + + var vestingData VestingData + + err = json.Unmarshal(contents, &vestingData) + if err != nil { + return err + } + + var periods []types.Period + + for i, p := range vestingData.Periods { + + amount, err := sdk.ParseCoinsNormalized(p.Coins) + if err != nil { + return err + } + + if p.Length < 0 { + return fmt.Errorf("invalid period length of %d in period %d, length must be greater than 0", p.Length, i) + } + period := types.Period{Length: p.Length, Amount: amount} + periods = append(periods, period) + } + + msg := types.NewMsgCreatePeriodicVestingAccount(clientCtx.GetFromAddress(), toAddr, vestingData.StartTime, periods) + if err := msg.ValidateBasic(); err != nil { + return err + } + + return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) + }, + } + + flags.AddTxFlagsToCmd(cmd) + + return cmd +} diff --git a/x/auth/vesting/msg_server.go b/x/auth/vesting/msg_server.go index 658465b95cdc..ad52597c1476 100644 --- a/x/auth/vesting/msg_server.go +++ b/x/auth/vesting/msg_server.go @@ -98,3 +98,63 @@ func (s msgServer) CreateVestingAccount(goCtx context.Context, msg *types.MsgCre return &types.MsgCreateVestingAccountResponse{}, nil } + +func (s msgServer) CreatePeriodicVestingAccount(goCtx context.Context, msg *types.MsgCreatePeriodicVestingAccount) (*types.MsgCreatePeriodicVestingAccountResponse, error) { + ctx := sdk.UnwrapSDKContext(goCtx) + + ak := s.AccountKeeper + bk := s.BankKeeper + + from, err := sdk.AccAddressFromBech32(msg.FromAddress) + if err != nil { + return nil, err + } + to, err := sdk.AccAddressFromBech32(msg.ToAddress) + if err != nil { + return nil, err + } + + if acc := ak.GetAccount(ctx, to); acc != nil { + return nil, sdkerrors.Wrapf(sdkerrors.ErrInvalidRequest, "account %s already exists", msg.ToAddress) + } + + var totalCoins sdk.Coins + + for _, period := range msg.VestingPeriods { + totalCoins = totalCoins.Add(period.Amount...) + } + + baseAccount := ak.NewAccountWithAddress(ctx, to) + + acc := types.NewPeriodicVestingAccount(baseAccount.(*authtypes.BaseAccount), totalCoins.Sort(), msg.StartTime, msg.VestingPeriods) + + ak.SetAccount(ctx, acc) + + defer func() { + telemetry.IncrCounter(1, "new", "account") + + for _, a := range totalCoins { + if a.Amount.IsInt64() { + telemetry.SetGaugeWithLabels( + []string{"tx", "msg", "create_periodic_vesting_account"}, + float32(a.Amount.Int64()), + []metrics.Label{telemetry.NewLabel("denom", a.Denom)}, + ) + } + } + }() + + err = bk.SendCoins(ctx, from, to, totalCoins) + if err != nil { + return nil, err + } + + ctx.EventManager().EmitEvent( + sdk.NewEvent( + sdk.EventTypeMessage, + sdk.NewAttribute(sdk.AttributeKeyModule, types.AttributeValueCategory), + ), + ) + return &types.MsgCreatePeriodicVestingAccountResponse{}, nil + +} diff --git a/x/auth/vesting/types/msgs.go b/x/auth/vesting/types/msgs.go index a00f8819065f..31c0fe53e927 100644 --- a/x/auth/vesting/types/msgs.go +++ b/x/auth/vesting/types/msgs.go @@ -1,6 +1,8 @@ package types import ( + "fmt" + sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" ) @@ -8,8 +10,13 @@ import ( // TypeMsgCreateVestingAccount defines the type value for a MsgCreateVestingAccount. const TypeMsgCreateVestingAccount = "msg_create_vesting_account" +// TypeMsgCreatePeriodicVestingAccount defines the type value for a MsgCreateVestingAccount. +const TypeMsgCreatePeriodicVestingAccount = "msg_create_periodic_vesting_account" + var _ sdk.Msg = &MsgCreateVestingAccount{} +var _ sdk.Msg = &MsgCreatePeriodicVestingAccount{} + // NewMsgCreateVestingAccount returns a reference to a new MsgCreateVestingAccount. // //nolint:interfacer @@ -76,3 +83,66 @@ func (msg MsgCreateVestingAccount) GetSigners() []sdk.AccAddress { } return []sdk.AccAddress{from} } + +// NewMsgCreatePeriodicVestingAccount returns a reference to a new MsgCreatePeriodicVestingAccount. +//nolint:interfacer +func NewMsgCreatePeriodicVestingAccount(fromAddr, toAddr sdk.AccAddress, startTime int64, periods []Period) *MsgCreatePeriodicVestingAccount { + return &MsgCreatePeriodicVestingAccount{ + FromAddress: fromAddr.String(), + ToAddress: toAddr.String(), + StartTime: startTime, + VestingPeriods: periods, + } +} + +// Route returns the message route for a MsgCreatePeriodicVestingAccount. +func (msg MsgCreatePeriodicVestingAccount) Route() string { return RouterKey } + +// Type returns the message type for a MsgCreatePeriodicVestingAccount. +func (msg MsgCreatePeriodicVestingAccount) Type() string { return TypeMsgCreatePeriodicVestingAccount } + +// GetSigners returns the expected signers for a MsgCreatePeriodicVestingAccount. +func (msg MsgCreatePeriodicVestingAccount) GetSigners() []sdk.AccAddress { + from, err := sdk.AccAddressFromBech32(msg.FromAddress) + if err != nil { + panic(err) + } + return []sdk.AccAddress{from} +} + +// GetSignBytes returns the bytes all expected signers must sign over for a +// MsgCreatePeriodicVestingAccount. +func (msg MsgCreatePeriodicVestingAccount) GetSignBytes() []byte { + return sdk.MustSortJSON(amino.MustMarshalJSON(&msg)) +} + +// ValidateBasic Implements Msg. +func (msg MsgCreatePeriodicVestingAccount) ValidateBasic() error { + from, err := sdk.AccAddressFromBech32(msg.FromAddress) + if err != nil { + return err + } + to, err := sdk.AccAddressFromBech32(msg.ToAddress) + if err != nil { + return err + } + if err := sdk.VerifyAddressFormat(from); err != nil { + return sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid sender address: %s", err) + } + + if err := sdk.VerifyAddressFormat(to); err != nil { + return sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid recipient address: %s", err) + } + + if msg.StartTime < 1 { + return fmt.Errorf("invalid start time of %d, length must be greater than 0", msg.StartTime) + } + + for i, period := range msg.VestingPeriods { + if period.Length < 1 { + return fmt.Errorf("invalid period length of %d in period %d, length must be greater than 0", period.Length, i) + } + } + + return nil +} diff --git a/x/auth/vesting/types/tx.pb.go b/x/auth/vesting/types/tx.pb.go index d07a154dd326..199e2f977bdc 100644 --- a/x/auth/vesting/types/tx.pb.go +++ b/x/auth/vesting/types/tx.pb.go @@ -145,41 +145,159 @@ func (m *MsgCreateVestingAccountResponse) XXX_DiscardUnknown() { var xxx_messageInfo_MsgCreateVestingAccountResponse proto.InternalMessageInfo +// MsgCreatePeriodicVestingAccount defines a message that enables creating a periodic vesting +// account. +type MsgCreatePeriodicVestingAccount struct { + FromAddress string `protobuf:"bytes,1,opt,name=from_address,json=fromAddress,proto3" json:"from_address,omitempty" yaml:"from_address"` + ToAddress string `protobuf:"bytes,2,opt,name=to_address,json=toAddress,proto3" json:"to_address,omitempty" yaml:"to_address"` + StartTime int64 `protobuf:"varint,3,opt,name=start_time,json=startTime,proto3" json:"start_time,omitempty" yaml:"start_time"` + VestingPeriods []Period `protobuf:"bytes,4,rep,name=vesting_periods,json=vestingPeriods,proto3" json:"vesting_periods"` +} + +func (m *MsgCreatePeriodicVestingAccount) Reset() { *m = MsgCreatePeriodicVestingAccount{} } +func (m *MsgCreatePeriodicVestingAccount) String() string { return proto.CompactTextString(m) } +func (*MsgCreatePeriodicVestingAccount) ProtoMessage() {} +func (*MsgCreatePeriodicVestingAccount) Descriptor() ([]byte, []int) { + return fileDescriptor_5338ca97811f9792, []int{2} +} +func (m *MsgCreatePeriodicVestingAccount) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgCreatePeriodicVestingAccount) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgCreatePeriodicVestingAccount.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgCreatePeriodicVestingAccount) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgCreatePeriodicVestingAccount.Merge(m, src) +} +func (m *MsgCreatePeriodicVestingAccount) XXX_Size() int { + return m.Size() +} +func (m *MsgCreatePeriodicVestingAccount) XXX_DiscardUnknown() { + xxx_messageInfo_MsgCreatePeriodicVestingAccount.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgCreatePeriodicVestingAccount proto.InternalMessageInfo + +func (m *MsgCreatePeriodicVestingAccount) GetFromAddress() string { + if m != nil { + return m.FromAddress + } + return "" +} + +func (m *MsgCreatePeriodicVestingAccount) GetToAddress() string { + if m != nil { + return m.ToAddress + } + return "" +} + +func (m *MsgCreatePeriodicVestingAccount) GetStartTime() int64 { + if m != nil { + return m.StartTime + } + return 0 +} + +func (m *MsgCreatePeriodicVestingAccount) GetVestingPeriods() []Period { + if m != nil { + return m.VestingPeriods + } + return nil +} + +// MsgCreatePeriodicVestingAccountResponse defines the Msg/CreatePeriodicVestingAccount response type. +type MsgCreatePeriodicVestingAccountResponse struct { +} + +func (m *MsgCreatePeriodicVestingAccountResponse) Reset() { + *m = MsgCreatePeriodicVestingAccountResponse{} +} +func (m *MsgCreatePeriodicVestingAccountResponse) String() string { return proto.CompactTextString(m) } +func (*MsgCreatePeriodicVestingAccountResponse) ProtoMessage() {} +func (*MsgCreatePeriodicVestingAccountResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_5338ca97811f9792, []int{3} +} +func (m *MsgCreatePeriodicVestingAccountResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgCreatePeriodicVestingAccountResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgCreatePeriodicVestingAccountResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgCreatePeriodicVestingAccountResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgCreatePeriodicVestingAccountResponse.Merge(m, src) +} +func (m *MsgCreatePeriodicVestingAccountResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgCreatePeriodicVestingAccountResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgCreatePeriodicVestingAccountResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgCreatePeriodicVestingAccountResponse proto.InternalMessageInfo + func init() { proto.RegisterType((*MsgCreateVestingAccount)(nil), "cosmos.vesting.v1beta1.MsgCreateVestingAccount") proto.RegisterType((*MsgCreateVestingAccountResponse)(nil), "cosmos.vesting.v1beta1.MsgCreateVestingAccountResponse") + proto.RegisterType((*MsgCreatePeriodicVestingAccount)(nil), "cosmos.vesting.v1beta1.MsgCreatePeriodicVestingAccount") + proto.RegisterType((*MsgCreatePeriodicVestingAccountResponse)(nil), "cosmos.vesting.v1beta1.MsgCreatePeriodicVestingAccountResponse") } func init() { proto.RegisterFile("cosmos/vesting/v1beta1/tx.proto", fileDescriptor_5338ca97811f9792) } var fileDescriptor_5338ca97811f9792 = []byte{ - // 410 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x52, 0xbd, 0xae, 0xd3, 0x30, - 0x14, 0x8e, 0x6f, 0x2e, 0xf7, 0xc7, 0x17, 0x09, 0x91, 0x16, 0x1a, 0x3a, 0xc4, 0x21, 0x53, 0x16, - 0x6c, 0x5a, 0x90, 0x90, 0xba, 0x35, 0x1d, 0x51, 0x97, 0x08, 0x31, 0xb0, 0x54, 0x4e, 0x62, 0xd2, - 0x88, 0x26, 0xae, 0x62, 0xb7, 0x6a, 0x37, 0x46, 0x46, 0x1e, 0x81, 0x99, 0xa7, 0x60, 0xec, 0xd8, - 0x91, 0x29, 0xa0, 0x76, 0x61, 0xee, 0x13, 0xa0, 0xc4, 0x49, 0x61, 0x68, 0x91, 0x98, 0xec, 0xa3, - 0xef, 0xc7, 0xe7, 0x7c, 0x3e, 0x10, 0x85, 0x5c, 0xa4, 0x5c, 0x90, 0x25, 0x13, 0x32, 0xc9, 0x62, - 0xb2, 0xec, 0x05, 0x4c, 0xd2, 0x1e, 0x91, 0x2b, 0x3c, 0xcf, 0xb9, 0xe4, 0xc6, 0x63, 0x45, 0xc0, - 0x35, 0x01, 0xd7, 0x84, 0x6e, 0x3b, 0xe6, 0x31, 0xaf, 0x28, 0xa4, 0xbc, 0x29, 0x76, 0xd7, 0xaa, - 0xed, 0x02, 0x2a, 0xd8, 0xd1, 0x2b, 0xe4, 0x49, 0xa6, 0x70, 0xe7, 0xdb, 0x05, 0xec, 0x8c, 0x45, - 0x3c, 0xca, 0x19, 0x95, 0xec, 0xad, 0xb2, 0x1c, 0x86, 0x21, 0x5f, 0x64, 0xd2, 0x18, 0xc0, 0xfb, - 0xef, 0x73, 0x9e, 0x4e, 0x68, 0x14, 0xe5, 0x4c, 0x08, 0x13, 0xd8, 0xc0, 0xbd, 0xf5, 0x3a, 0x87, - 0x02, 0xb5, 0xd6, 0x34, 0x9d, 0x0d, 0x9c, 0xbf, 0x51, 0xc7, 0xbf, 0x2b, 0xcb, 0xa1, 0xaa, 0x8c, - 0x97, 0x10, 0x4a, 0x7e, 0x54, 0x5e, 0x54, 0xca, 0x47, 0x87, 0x02, 0x3d, 0x54, 0xca, 0x3f, 0x98, - 0xe3, 0xdf, 0x4a, 0xde, 0xa8, 0x42, 0x78, 0x45, 0xd3, 0xf2, 0x6d, 0x53, 0xb7, 0x75, 0xf7, 0xae, - 0xff, 0x04, 0xd7, 0xc3, 0x96, 0xed, 0x37, 0x93, 0xe2, 0x11, 0x4f, 0x32, 0xef, 0xf9, 0xa6, 0x40, - 0xda, 0xd7, 0x1f, 0xc8, 0x8d, 0x13, 0x39, 0x5d, 0x04, 0x38, 0xe4, 0x29, 0xa9, 0x67, 0x55, 0xc7, - 0x33, 0x11, 0x7d, 0x20, 0x72, 0x3d, 0x67, 0xa2, 0x12, 0x08, 0xbf, 0xb6, 0x36, 0x30, 0xbc, 0x61, - 0x59, 0x34, 0x91, 0x49, 0xca, 0xcc, 0x4b, 0x1b, 0xb8, 0xba, 0xd7, 0x3a, 0x14, 0xe8, 0x81, 0x6a, - 0xac, 0x41, 0x1c, 0xff, 0x9a, 0x65, 0xd1, 0x9b, 0x24, 0x65, 0x86, 0x09, 0xaf, 0x23, 0x36, 0xa3, - 0x6b, 0x16, 0x99, 0xf7, 0x6c, 0xe0, 0xde, 0xf8, 0x4d, 0x39, 0xb8, 0xfc, 0xf5, 0x05, 0x01, 0xe7, - 0x29, 0x44, 0x67, 0x12, 0xf4, 0x99, 0x98, 0xf3, 0x4c, 0xb0, 0xfe, 0x27, 0x00, 0xf5, 0xb1, 0x88, - 0x8d, 0x8f, 0x00, 0xb6, 0x4f, 0x46, 0x4d, 0xf0, 0xe9, 0x5f, 0xc5, 0x67, 0x9c, 0xbb, 0xaf, 0xfe, - 0x53, 0xd0, 0xb4, 0xe2, 0xbd, 0xde, 0xec, 0x2c, 0xb0, 0xdd, 0x59, 0xe0, 0xe7, 0xce, 0x02, 0x9f, - 0xf7, 0x96, 0xb6, 0xdd, 0x5b, 0xda, 0xf7, 0xbd, 0xa5, 0xbd, 0xeb, 0xfd, 0x33, 0xc9, 0x15, 0xa1, - 0x0b, 0x39, 0x3d, 0xae, 0x65, 0x15, 0x6c, 0x70, 0x55, 0x2d, 0xd1, 0x8b, 0xdf, 0x01, 0x00, 0x00, - 0xff, 0xff, 0xe7, 0x28, 0xaf, 0xe5, 0xb5, 0x02, 0x00, 0x00, + // 519 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x54, 0x31, 0x6f, 0xd3, 0x40, + 0x14, 0xf6, 0xc5, 0xa1, 0x6d, 0xae, 0x88, 0x0a, 0xb7, 0x50, 0x13, 0x21, 0x3b, 0x9c, 0x90, 0x30, + 0x03, 0x67, 0x52, 0x2a, 0x21, 0x65, 0x41, 0x75, 0x47, 0x14, 0x09, 0x59, 0x88, 0x81, 0x25, 0xba, + 0xd8, 0x87, 0x6b, 0x51, 0xfb, 0x22, 0xdf, 0xa5, 0x6a, 0x36, 0x7e, 0x02, 0x23, 0x13, 0x42, 0x62, + 0xe3, 0x57, 0x30, 0x76, 0xec, 0xc8, 0x14, 0x50, 0xb2, 0x30, 0xe7, 0x17, 0x20, 0xdf, 0x9d, 0xd3, + 0x0c, 0x49, 0x23, 0x58, 0x98, 0x92, 0xe7, 0xef, 0xfb, 0xde, 0xbd, 0xf7, 0xbd, 0x77, 0x07, 0xdd, + 0x88, 0xf1, 0x8c, 0x71, 0xff, 0x8c, 0x72, 0x91, 0xe6, 0x89, 0x7f, 0xd6, 0xee, 0x53, 0x41, 0xda, + 0xbe, 0x38, 0xc7, 0x83, 0x82, 0x09, 0x66, 0xdd, 0x55, 0x04, 0xac, 0x09, 0x58, 0x13, 0x9a, 0x7b, + 0x09, 0x4b, 0x98, 0xa4, 0xf8, 0xe5, 0x3f, 0xc5, 0x6e, 0x3a, 0x3a, 0x5d, 0x9f, 0x70, 0x3a, 0xcf, + 0x15, 0xb1, 0x34, 0xd7, 0xf8, 0xc3, 0x15, 0xc7, 0x55, 0xd9, 0x25, 0x0b, 0x7d, 0xaf, 0xc1, 0xfd, + 0x2e, 0x4f, 0x8e, 0x0b, 0x4a, 0x04, 0x7d, 0xa3, 0xa0, 0xa3, 0x28, 0x62, 0xc3, 0x5c, 0x58, 0x1d, + 0x78, 0xf3, 0x5d, 0xc1, 0xb2, 0x1e, 0x89, 0xe3, 0x82, 0x72, 0x6e, 0x83, 0x16, 0xf0, 0x1a, 0xc1, + 0xfe, 0x6c, 0xec, 0xee, 0x8e, 0x48, 0x76, 0xda, 0x41, 0x8b, 0x28, 0x0a, 0xb7, 0xcb, 0xf0, 0x48, + 0x45, 0xd6, 0x21, 0x84, 0x82, 0xcd, 0x95, 0x35, 0xa9, 0xbc, 0x33, 0x1b, 0xbb, 0xb7, 0x95, 0xf2, + 0x0a, 0x43, 0x61, 0x43, 0xb0, 0x4a, 0x15, 0xc1, 0x0d, 0x92, 0x95, 0x67, 0xdb, 0x66, 0xcb, 0xf4, + 0xb6, 0x0f, 0xee, 0x61, 0x6d, 0x49, 0xd9, 0x64, 0xe5, 0x07, 0x3e, 0x66, 0x69, 0x1e, 0x3c, 0xbd, + 0x18, 0xbb, 0xc6, 0xb7, 0x9f, 0xae, 0x97, 0xa4, 0xe2, 0x64, 0xd8, 0xc7, 0x11, 0xcb, 0x7c, 0xdd, + 0xb1, 0xfa, 0x79, 0xc2, 0xe3, 0xf7, 0xbe, 0x18, 0x0d, 0x28, 0x97, 0x02, 0x1e, 0xea, 0xd4, 0x16, + 0x86, 0x5b, 0x34, 0x8f, 0x7b, 0x22, 0xcd, 0xa8, 0x5d, 0x6f, 0x01, 0xcf, 0x0c, 0x76, 0x67, 0x63, + 0x77, 0x47, 0x15, 0x56, 0x21, 0x28, 0xdc, 0xa4, 0x79, 0xfc, 0x3a, 0xcd, 0xa8, 0x65, 0xc3, 0xcd, + 0x98, 0x9e, 0x92, 0x11, 0x8d, 0xed, 0x1b, 0x2d, 0xe0, 0x6d, 0x85, 0x55, 0xd8, 0xa9, 0xff, 0xfe, + 0xe2, 0x02, 0xf4, 0x00, 0xba, 0x2b, 0x1c, 0x0c, 0x29, 0x1f, 0xb0, 0x9c, 0x53, 0xf4, 0xb9, 0xb6, + 0xc0, 0x79, 0x45, 0x8b, 0x94, 0xc5, 0x69, 0xf4, 0xdf, 0xdd, 0x3e, 0x84, 0x90, 0x0b, 0x52, 0x08, + 0x65, 0x85, 0x29, 0xad, 0x58, 0x50, 0x5d, 0x61, 0x28, 0x6c, 0xc8, 0x40, 0xda, 0xd1, 0x85, 0x3b, + 0x7a, 0x85, 0x7a, 0x03, 0xd9, 0x09, 0xb7, 0xeb, 0x72, 0x58, 0x0e, 0x5e, 0xbe, 0xbf, 0x58, 0x35, + 0x1c, 0xd4, 0xcb, 0x89, 0x85, 0xb7, 0x34, 0xaa, 0x3e, 0x72, 0xe9, 0xa1, 0x81, 0x1e, 0xc3, 0x47, + 0x6b, 0xfc, 0xa9, 0xbc, 0x3c, 0xf8, 0x5a, 0x83, 0x66, 0x97, 0x27, 0xd6, 0x07, 0x00, 0xf7, 0x96, + 0xae, 0xad, 0xbf, 0xaa, 0x8e, 0x15, 0x53, 0x6a, 0x3e, 0xff, 0x4b, 0x41, 0x55, 0x8a, 0xf5, 0x09, + 0xc0, 0xfb, 0xd7, 0xce, 0x74, 0x7d, 0xe6, 0xe5, 0xc2, 0xe6, 0x8b, 0x7f, 0x14, 0x56, 0xa5, 0x05, + 0x2f, 0x2f, 0x26, 0x0e, 0xb8, 0x9c, 0x38, 0xe0, 0xd7, 0xc4, 0x01, 0x1f, 0xa7, 0x8e, 0x71, 0x39, + 0x75, 0x8c, 0x1f, 0x53, 0xc7, 0x78, 0xdb, 0xbe, 0xf6, 0xc2, 0x9c, 0xfb, 0x64, 0x28, 0x4e, 0xe6, + 0x8f, 0x86, 0xbc, 0x3f, 0xfd, 0x0d, 0xf9, 0x56, 0x3c, 0xfb, 0x13, 0x00, 0x00, 0xff, 0xff, 0x28, + 0x5a, 0x9c, 0x7b, 0xc2, 0x04, 0x00, 0x00, } func (this *MsgCreateVestingAccount) Equal(that interface{}) bool { @@ -239,6 +357,9 @@ type MsgClient interface { // CreateVestingAccount defines a method that enables creating a vesting // account. CreateVestingAccount(ctx context.Context, in *MsgCreateVestingAccount, opts ...grpc.CallOption) (*MsgCreateVestingAccountResponse, error) + // CreatePeriodicVestingAccount defines a method that enables creating a + // periodic vesting account. + CreatePeriodicVestingAccount(ctx context.Context, in *MsgCreatePeriodicVestingAccount, opts ...grpc.CallOption) (*MsgCreatePeriodicVestingAccountResponse, error) } type msgClient struct { @@ -258,11 +379,23 @@ func (c *msgClient) CreateVestingAccount(ctx context.Context, in *MsgCreateVesti return out, nil } +func (c *msgClient) CreatePeriodicVestingAccount(ctx context.Context, in *MsgCreatePeriodicVestingAccount, opts ...grpc.CallOption) (*MsgCreatePeriodicVestingAccountResponse, error) { + out := new(MsgCreatePeriodicVestingAccountResponse) + err := c.cc.Invoke(ctx, "/cosmos.vesting.v1beta1.Msg/CreatePeriodicVestingAccount", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // MsgServer is the server API for Msg service. type MsgServer interface { // CreateVestingAccount defines a method that enables creating a vesting // account. CreateVestingAccount(context.Context, *MsgCreateVestingAccount) (*MsgCreateVestingAccountResponse, error) + // CreatePeriodicVestingAccount defines a method that enables creating a + // periodic vesting account. + CreatePeriodicVestingAccount(context.Context, *MsgCreatePeriodicVestingAccount) (*MsgCreatePeriodicVestingAccountResponse, error) } // UnimplementedMsgServer can be embedded to have forward compatible implementations. @@ -272,6 +405,9 @@ type UnimplementedMsgServer struct { func (*UnimplementedMsgServer) CreateVestingAccount(ctx context.Context, req *MsgCreateVestingAccount) (*MsgCreateVestingAccountResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method CreateVestingAccount not implemented") } +func (*UnimplementedMsgServer) CreatePeriodicVestingAccount(ctx context.Context, req *MsgCreatePeriodicVestingAccount) (*MsgCreatePeriodicVestingAccountResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method CreatePeriodicVestingAccount not implemented") +} func RegisterMsgServer(s grpc1.Server, srv MsgServer) { s.RegisterService(&_Msg_serviceDesc, srv) @@ -295,6 +431,24 @@ func _Msg_CreateVestingAccount_Handler(srv interface{}, ctx context.Context, dec return interceptor(ctx, in, info, handler) } +func _Msg_CreatePeriodicVestingAccount_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgCreatePeriodicVestingAccount) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).CreatePeriodicVestingAccount(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/cosmos.vesting.v1beta1.Msg/CreatePeriodicVestingAccount", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).CreatePeriodicVestingAccount(ctx, req.(*MsgCreatePeriodicVestingAccount)) + } + return interceptor(ctx, in, info, handler) +} + var _Msg_serviceDesc = grpc.ServiceDesc{ ServiceName: "cosmos.vesting.v1beta1.Msg", HandlerType: (*MsgServer)(nil), @@ -303,6 +457,10 @@ var _Msg_serviceDesc = grpc.ServiceDesc{ MethodName: "CreateVestingAccount", Handler: _Msg_CreateVestingAccount_Handler, }, + { + MethodName: "CreatePeriodicVestingAccount", + Handler: _Msg_CreatePeriodicVestingAccount_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "cosmos/vesting/v1beta1/tx.proto", @@ -397,6 +555,85 @@ func (m *MsgCreateVestingAccountResponse) MarshalToSizedBuffer(dAtA []byte) (int return len(dAtA) - i, nil } +func (m *MsgCreatePeriodicVestingAccount) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgCreatePeriodicVestingAccount) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgCreatePeriodicVestingAccount) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.VestingPeriods) > 0 { + for iNdEx := len(m.VestingPeriods) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.VestingPeriods[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + } + } + if m.StartTime != 0 { + i = encodeVarintTx(dAtA, i, uint64(m.StartTime)) + i-- + dAtA[i] = 0x18 + } + if len(m.ToAddress) > 0 { + i -= len(m.ToAddress) + copy(dAtA[i:], m.ToAddress) + i = encodeVarintTx(dAtA, i, uint64(len(m.ToAddress))) + i-- + dAtA[i] = 0x12 + } + if len(m.FromAddress) > 0 { + i -= len(m.FromAddress) + copy(dAtA[i:], m.FromAddress) + i = encodeVarintTx(dAtA, i, uint64(len(m.FromAddress))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MsgCreatePeriodicVestingAccountResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgCreatePeriodicVestingAccountResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgCreatePeriodicVestingAccountResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + func encodeVarintTx(dAtA []byte, offset int, v uint64) int { offset -= sovTx(v) base := offset @@ -446,6 +683,41 @@ func (m *MsgCreateVestingAccountResponse) Size() (n int) { return n } +func (m *MsgCreatePeriodicVestingAccount) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.FromAddress) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = len(m.ToAddress) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + if m.StartTime != 0 { + n += 1 + sovTx(uint64(m.StartTime)) + } + if len(m.VestingPeriods) > 0 { + for _, e := range m.VestingPeriods { + l = e.Size() + n += 1 + l + sovTx(uint64(l)) + } + } + return n +} + +func (m *MsgCreatePeriodicVestingAccountResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + func sovTx(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -689,6 +961,223 @@ func (m *MsgCreateVestingAccountResponse) Unmarshal(dAtA []byte) error { } return nil } +func (m *MsgCreatePeriodicVestingAccount) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MsgCreatePeriodicVestingAccount: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgCreatePeriodicVestingAccount: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field FromAddress", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.FromAddress = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ToAddress", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ToAddress = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field StartTime", wireType) + } + m.StartTime = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.StartTime |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field VestingPeriods", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.VestingPeriods = append(m.VestingPeriods, Period{}) + if err := m.VestingPeriods[len(m.VestingPeriods)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgCreatePeriodicVestingAccountResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MsgCreatePeriodicVestingAccountResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgCreatePeriodicVestingAccountResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func skipTx(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0