From 27061a14d059045f05c56c10c49f8bf29709e108 Mon Sep 17 00:00:00 2001 From: skosito Date: Tue, 19 Mar 2024 16:30:18 +0100 Subject: [PATCH 1/7] Reset chain nonces --- proto/observer/tx.proto | 10 + x/observer/client/cli/tx.go | 1 + .../client/cli/tx_reset_chain_nonces.go | 58 ++ .../keeper/msg_server_reset_chain_nonces.go | 49 ++ .../msg_server_reset_chain_nonces_test.go | 143 +++++ x/observer/types/codec.go | 2 + .../types/message_reset_chain_nonces.go | 58 ++ .../types/message_reset_chain_nonces_test.go | 73 +++ x/observer/types/tx.pb.go | 555 ++++++++++++++++-- 9 files changed, 889 insertions(+), 60 deletions(-) create mode 100644 x/observer/client/cli/tx_reset_chain_nonces.go create mode 100644 x/observer/keeper/msg_server_reset_chain_nonces.go create mode 100644 x/observer/keeper/msg_server_reset_chain_nonces_test.go create mode 100644 x/observer/types/message_reset_chain_nonces.go create mode 100644 x/observer/types/message_reset_chain_nonces_test.go diff --git a/proto/observer/tx.proto b/proto/observer/tx.proto index b67e8e0741..c1e3b49d9e 100644 --- a/proto/observer/tx.proto +++ b/proto/observer/tx.proto @@ -22,6 +22,7 @@ service Msg { rpc UpdateCrosschainFlags(MsgUpdateCrosschainFlags) returns (MsgUpdateCrosschainFlagsResponse); rpc UpdateKeygen(MsgUpdateKeygen) returns (MsgUpdateKeygenResponse); rpc AddBlockHeader(MsgAddBlockHeader) returns (MsgAddBlockHeaderResponse); + rpc ResetChainNonces(MsgResetChainNonces) returns (MsgResetChainNoncesResponse); } message MsgUpdateObserver { @@ -88,3 +89,12 @@ message MsgUpdateKeygen { } message MsgUpdateKeygenResponse {} + +message MsgResetChainNonces { + string creator = 1; + int64 chain_id = 2; + uint64 chain_nonce_low = 3; + uint64 chain_nonce_high = 4; +} + +message MsgResetChainNoncesResponse {} diff --git a/x/observer/client/cli/tx.go b/x/observer/client/cli/tx.go index 7f60f10be8..f581f878b9 100644 --- a/x/observer/client/cli/tx.go +++ b/x/observer/client/cli/tx.go @@ -29,6 +29,7 @@ func GetTxCmd() *cobra.Command { CmdAddBlameVote(), CmdUpdateObserver(), CmdEncode(), + CmdResetChainNonces(), ) return cmd diff --git a/x/observer/client/cli/tx_reset_chain_nonces.go b/x/observer/client/cli/tx_reset_chain_nonces.go new file mode 100644 index 0000000000..9f1c81eccb --- /dev/null +++ b/x/observer/client/cli/tx_reset_chain_nonces.go @@ -0,0 +1,58 @@ +package cli + +import ( + "strconv" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/cosmos/cosmos-sdk/client/tx" + "github.com/spf13/cobra" + "github.com/zeta-chain/zetacore/x/observer/types" +) + +func CmdResetChainNonces() *cobra.Command { + cmd := &cobra.Command{ + Use: "reset-chain-nonces [chain-id] [chain-nonce-low] [chain-nonce-high]", + Short: "Broadcast message to reset chain nonces", + Args: cobra.ExactArgs(3), + RunE: func(cmd *cobra.Command, args []string) (err error) { + clientCtx, err := client.GetClientTxContext(cmd) + if err != nil { + return err + } + + // get chainID as int64 + chainID, err := strconv.ParseInt(args[0], 10, 64) + if err != nil { + return err + } + + // get chainNonceLow as uint64 + chainNonceLow, err := strconv.ParseUint(args[1], 10, 64) + if err != nil { + return err + } + + // get chainNonceHigh as uint64 + chainNonceHigh, err := strconv.ParseUint(args[2], 10, 64) + if err != nil { + return err + } + + msg := types.NewMsgResetChainNonces( + clientCtx.GetFromAddress().String(), + chainID, + chainNonceLow, + chainNonceHigh, + ) + if err := msg.ValidateBasic(); err != nil { + return err + } + return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) + }, + } + + flags.AddTxFlagsToCmd(cmd) + + return cmd +} diff --git a/x/observer/keeper/msg_server_reset_chain_nonces.go b/x/observer/keeper/msg_server_reset_chain_nonces.go new file mode 100644 index 0000000000..64645ad4e3 --- /dev/null +++ b/x/observer/keeper/msg_server_reset_chain_nonces.go @@ -0,0 +1,49 @@ +package keeper + +import ( + "context" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/zeta-chain/zetacore/common" + "github.com/zeta-chain/zetacore/x/observer/types" +) + +// ResetChainNonces handles resetting chain nonces +// Authorized: admin policy group 2 (admin update) +func (k msgServer) ResetChainNonces(goCtx context.Context, msg *types.MsgResetChainNonces) (*types.MsgResetChainNoncesResponse, error) { + ctx := sdk.UnwrapSDKContext(goCtx) + if msg.Creator != k.GetParams(ctx).GetAdminPolicyAccount(types.Policy_Type_group2) { + return &types.MsgResetChainNoncesResponse{}, types.ErrNotAuthorizedPolicy + } + + tss, found := k.GetTSS(ctx) + if !found { + return nil, types.ErrTssNotFound + } + + chain := common.GetChainFromChainID(msg.ChainId) + if chain == nil { + return nil, types.ErrSupportedChains + } + + // reset chain nonces + chainNonce := types.ChainNonces{ + Index: chain.ChainName.String(), + ChainId: chain.ChainId, + Nonce: msg.ChainNonceHigh, + // #nosec G701 always positive + FinalizedHeight: uint64(ctx.BlockHeight()), + } + k.SetChainNonces(ctx, chainNonce) + + // reset pending nonces + p := types.PendingNonces{ + NonceLow: int64(msg.ChainNonceLow), + NonceHigh: int64(msg.ChainNonceHigh), + ChainId: chain.ChainId, + Tss: tss.TssPubkey, + } + k.SetPendingNonces(ctx, p) + + return &types.MsgResetChainNoncesResponse{}, nil +} diff --git a/x/observer/keeper/msg_server_reset_chain_nonces_test.go b/x/observer/keeper/msg_server_reset_chain_nonces_test.go new file mode 100644 index 0000000000..fb12c70a1f --- /dev/null +++ b/x/observer/keeper/msg_server_reset_chain_nonces_test.go @@ -0,0 +1,143 @@ +package keeper_test + +import ( + "testing" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/stretchr/testify/require" + "github.com/zeta-chain/zetacore/common" + keepertest "github.com/zeta-chain/zetacore/testutil/keeper" + "github.com/zeta-chain/zetacore/testutil/sample" + "github.com/zeta-chain/zetacore/x/observer/keeper" + "github.com/zeta-chain/zetacore/x/observer/types" +) + +func TestMsgServer_ResetChainNonces(t *testing.T) { + t.Run("cannot reset chain nonces if not authorized", func(t *testing.T) { + k, ctx := keepertest.ObserverKeeper(t) + srv := keeper.NewMsgServerImpl(*k) + + chainId := common.GoerliLocalnetChain().ChainId + _, err := srv.ResetChainNonces(sdk.WrapSDKContext(ctx), &types.MsgResetChainNonces{ + Creator: sample.AccAddress(), + ChainId: chainId, + ChainNonceLow: 1, + ChainNonceHigh: 5, + }) + require.ErrorIs(t, err, types.ErrNotAuthorizedPolicy) + + // group 1 should not be able to reset chain nonces + admin := sample.AccAddress() + setAdminCrossChainFlags(ctx, k, admin, types.Policy_Type_group1) + + _, err = srv.ResetChainNonces(sdk.WrapSDKContext(ctx), &types.MsgResetChainNonces{ + Creator: sample.AccAddress(), + ChainId: chainId, + ChainNonceLow: 1, + ChainNonceHigh: 5, + }) + require.ErrorIs(t, err, types.ErrNotAuthorizedPolicy) + }) + + t.Run("cannot reset chain nonces if tss not found", func(t *testing.T) { + k, ctx := keepertest.ObserverKeeper(t) + srv := keeper.NewMsgServerImpl(*k) + + admin := sample.AccAddress() + setAdminCrossChainFlags(ctx, k, admin, types.Policy_Type_group2) + + chainId := common.GoerliLocalnetChain().ChainId + _, err := srv.ResetChainNonces(sdk.WrapSDKContext(ctx), &types.MsgResetChainNonces{ + Creator: admin, + ChainId: chainId, + ChainNonceLow: 1, + ChainNonceHigh: 5, + }) + require.ErrorIs(t, err, types.ErrTssNotFound) + }) + + t.Run("cannot reset chain nonces if chain not supported", func(t *testing.T) { + k, ctx := keepertest.ObserverKeeper(t) + srv := keeper.NewMsgServerImpl(*k) + tss := sample.Tss() + k.SetTSS(ctx, tss) + + admin := sample.AccAddress() + setAdminCrossChainFlags(ctx, k, admin, types.Policy_Type_group2) + + _, err := srv.ResetChainNonces(sdk.WrapSDKContext(ctx), &types.MsgResetChainNonces{ + Creator: admin, + ChainId: 999, + ChainNonceLow: 1, + ChainNonceHigh: 5, + }) + require.ErrorIs(t, err, types.ErrSupportedChains) + }) + + t.Run("can reset chain nonces", func(t *testing.T) { + k, ctx := keepertest.ObserverKeeper(t) + srv := keeper.NewMsgServerImpl(*k) + tss := sample.Tss() + k.SetTSS(ctx, tss) + + admin := sample.AccAddress() + setAdminCrossChainFlags(ctx, k, admin, types.Policy_Type_group2) + + chainId := common.GoerliLocalnetChain().ChainId + index := common.GoerliLocalnetChain().ChainName.String() + + // check existing chain nonces + _, found := k.GetChainNonces(ctx, index) + require.False(t, found) + _, found = k.GetPendingNonces(ctx, tss.TssPubkey, chainId) + require.False(t, found) + + // reset chain nonces + nonceLow := 1 + nonceHigh := 5 + _, err := srv.ResetChainNonces(sdk.WrapSDKContext(ctx), &types.MsgResetChainNonces{ + Creator: admin, + ChainId: chainId, + ChainNonceLow: uint64(nonceLow), + ChainNonceHigh: uint64(nonceHigh), + }) + require.NoError(t, err) + + // check updated chain nonces + chainNonces, found := k.GetChainNonces(ctx, index) + require.True(t, found) + require.Equal(t, chainId, chainNonces.ChainId) + require.Equal(t, index, chainNonces.Index) + require.Equal(t, uint64(nonceHigh), chainNonces.Nonce) + + pendingNonces, found := k.GetPendingNonces(ctx, tss.TssPubkey, chainId) + require.True(t, found) + require.Equal(t, chainId, pendingNonces.ChainId) + require.Equal(t, tss.TssPubkey, pendingNonces.Tss) + require.Equal(t, int64(nonceLow), pendingNonces.NonceLow) + require.Equal(t, int64(nonceHigh), pendingNonces.NonceHigh) + + // reset nonces back to 0 + _, err = srv.ResetChainNonces(sdk.WrapSDKContext(ctx), &types.MsgResetChainNonces{ + Creator: admin, + ChainId: chainId, + ChainNonceLow: uint64(0), + ChainNonceHigh: uint64(0), + }) + require.NoError(t, err) + + // check updated chain nonces + chainNonces, found = k.GetChainNonces(ctx, index) + require.True(t, found) + require.Equal(t, chainId, chainNonces.ChainId) + require.Equal(t, index, chainNonces.Index) + require.Equal(t, uint64(0), chainNonces.Nonce) + + pendingNonces, found = k.GetPendingNonces(ctx, tss.TssPubkey, chainId) + require.True(t, found) + require.Equal(t, chainId, pendingNonces.ChainId) + require.Equal(t, tss.TssPubkey, pendingNonces.Tss) + require.Equal(t, int64(0), pendingNonces.NonceLow) + require.Equal(t, int64(0), pendingNonces.NonceHigh) + }) +} diff --git a/x/observer/types/codec.go b/x/observer/types/codec.go index b28c4d0041..af6e7d87a5 100644 --- a/x/observer/types/codec.go +++ b/x/observer/types/codec.go @@ -16,6 +16,7 @@ func RegisterCodec(cdc *codec.LegacyAmino) { cdc.RegisterConcrete(&MsgUpdateKeygen{}, "crosschain/UpdateKeygen", nil) cdc.RegisterConcrete(&MsgAddBlockHeader{}, "crosschain/AddBlockHeader", nil) cdc.RegisterConcrete(&MsgUpdateObserver{}, "observer/UpdateObserver", nil) + cdc.RegisterConcrete(&MsgResetChainNonces{}, "observer/ResetChainNonces", nil) } func RegisterInterfaces(registry cdctypes.InterfaceRegistry) { @@ -28,6 +29,7 @@ func RegisterInterfaces(registry cdctypes.InterfaceRegistry) { &MsgUpdateKeygen{}, &MsgAddBlockHeader{}, &MsgUpdateObserver{}, + &MsgResetChainNonces{}, ) msgservice.RegisterMsgServiceDesc(registry, &_Msg_serviceDesc) diff --git a/x/observer/types/message_reset_chain_nonces.go b/x/observer/types/message_reset_chain_nonces.go new file mode 100644 index 0000000000..89bf5698e5 --- /dev/null +++ b/x/observer/types/message_reset_chain_nonces.go @@ -0,0 +1,58 @@ +package types + +import ( + cosmoserrors "cosmossdk.io/errors" + "github.com/zeta-chain/zetacore/common" + + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" +) + +const TypeMsgResetChainNonces = "reset_chain_nonces" + +var _ sdk.Msg = &MsgResetChainNonces{} + +func NewMsgResetChainNonces(creator string, chainID int64, chainNonceLow uint64, chainNonceHigh uint64) *MsgResetChainNonces { + return &MsgResetChainNonces{ + Creator: creator, + ChainId: chainID, + ChainNonceLow: chainNonceLow, + ChainNonceHigh: chainNonceHigh, + } +} + +func (msg *MsgResetChainNonces) Route() string { + return RouterKey +} + +func (msg *MsgResetChainNonces) Type() string { + return TypeMsgResetChainNonces +} + +func (msg *MsgResetChainNonces) GetSigners() []sdk.AccAddress { + creator, err := sdk.AccAddressFromBech32(msg.Creator) + if err != nil { + panic(err) + } + return []sdk.AccAddress{creator} +} + +func (msg *MsgResetChainNonces) GetSignBytes() []byte { + bz := ModuleCdc.MustMarshalJSON(msg) + return sdk.MustSortJSON(bz) +} + +func (msg *MsgResetChainNonces) ValidateBasic() error { + _, err := sdk.AccAddressFromBech32(msg.Creator) + if err != nil { + return cosmoserrors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid creator address (%s)", err) + } + + // Check if chain exists + chain := common.GetChainFromChainID(msg.ChainId) + if chain == nil { + return cosmoserrors.Wrapf(sdkerrors.ErrInvalidChainID, "invalid chain id (%d)", msg.ChainId) + } + + return nil +} diff --git a/x/observer/types/message_reset_chain_nonces_test.go b/x/observer/types/message_reset_chain_nonces_test.go new file mode 100644 index 0000000000..21545dc52d --- /dev/null +++ b/x/observer/types/message_reset_chain_nonces_test.go @@ -0,0 +1,73 @@ +package types_test + +import ( + "testing" + + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/stretchr/testify/require" + "github.com/zeta-chain/zetacore/common" + "github.com/zeta-chain/zetacore/testutil/sample" + "github.com/zeta-chain/zetacore/x/observer/types" +) + +func TestMsgResetChainNonces_ValidateBasic(t *testing.T) { + tests := []struct { + name string + msg types.MsgResetChainNonces + err error + }{ + { + name: "valid message", + msg: types.MsgResetChainNonces{ + Creator: sample.AccAddress(), + ChainId: common.ExternalChainList()[0].ChainId, + ChainNonceLow: 1, + ChainNonceHigh: 5, + }, + }, + { + name: "invalid address", + msg: types.MsgResetChainNonces{ + Creator: "invalid_address", + ChainId: common.ExternalChainList()[0].ChainId, + }, + err: sdkerrors.ErrInvalidAddress, + }, + + { + name: "invalid chain ID", + msg: types.MsgResetChainNonces{ + Creator: sample.AccAddress(), + ChainId: 999, + }, + err: sdkerrors.ErrInvalidChainID, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := tt.msg.ValidateBasic() + if tt.err != nil { + require.ErrorIs(t, err, tt.err) + return + } + require.NoError(t, err) + }) + } +} + +func TestMsgResetChainNonces_Type(t *testing.T) { + msg := types.NewMsgResetChainNonces(sample.AccAddress(), 5, 1, 5) + require.Equal(t, types.TypeMsgResetChainNonces, msg.Type()) +} + +func TestMsgResetChainNonces_Route(t *testing.T) { + msg := types.NewMsgResetChainNonces(sample.AccAddress(), 5, 1, 5) + require.Equal(t, types.RouterKey, msg.Route()) +} + +func TestMsgResetChainNonces_GetSignBytes(t *testing.T) { + msg := types.NewMsgResetChainNonces(sample.AccAddress(), 5, 1, 5) + require.NotPanics(t, func() { + msg.GetSignBytes() + }) +} diff --git a/x/observer/types/tx.pb.go b/x/observer/types/tx.pb.go index bd9bceaf1e..6c73455ae6 100644 --- a/x/observer/types/tx.pb.go +++ b/x/observer/types/tx.pb.go @@ -822,6 +822,110 @@ func (m *MsgUpdateKeygenResponse) XXX_DiscardUnknown() { var xxx_messageInfo_MsgUpdateKeygenResponse proto.InternalMessageInfo +type MsgResetChainNonces struct { + Creator string `protobuf:"bytes,1,opt,name=creator,proto3" json:"creator,omitempty"` + ChainId int64 `protobuf:"varint,2,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` + ChainNonceLow uint64 `protobuf:"varint,3,opt,name=chain_nonce_low,json=chainNonceLow,proto3" json:"chain_nonce_low,omitempty"` + ChainNonceHigh uint64 `protobuf:"varint,4,opt,name=chain_nonce_high,json=chainNonceHigh,proto3" json:"chain_nonce_high,omitempty"` +} + +func (m *MsgResetChainNonces) Reset() { *m = MsgResetChainNonces{} } +func (m *MsgResetChainNonces) String() string { return proto.CompactTextString(m) } +func (*MsgResetChainNonces) ProtoMessage() {} +func (*MsgResetChainNonces) Descriptor() ([]byte, []int) { + return fileDescriptor_1bcd40fa296a2b1d, []int{16} +} +func (m *MsgResetChainNonces) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgResetChainNonces) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgResetChainNonces.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 *MsgResetChainNonces) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgResetChainNonces.Merge(m, src) +} +func (m *MsgResetChainNonces) XXX_Size() int { + return m.Size() +} +func (m *MsgResetChainNonces) XXX_DiscardUnknown() { + xxx_messageInfo_MsgResetChainNonces.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgResetChainNonces proto.InternalMessageInfo + +func (m *MsgResetChainNonces) GetCreator() string { + if m != nil { + return m.Creator + } + return "" +} + +func (m *MsgResetChainNonces) GetChainId() int64 { + if m != nil { + return m.ChainId + } + return 0 +} + +func (m *MsgResetChainNonces) GetChainNonceLow() uint64 { + if m != nil { + return m.ChainNonceLow + } + return 0 +} + +func (m *MsgResetChainNonces) GetChainNonceHigh() uint64 { + if m != nil { + return m.ChainNonceHigh + } + return 0 +} + +type MsgResetChainNoncesResponse struct { +} + +func (m *MsgResetChainNoncesResponse) Reset() { *m = MsgResetChainNoncesResponse{} } +func (m *MsgResetChainNoncesResponse) String() string { return proto.CompactTextString(m) } +func (*MsgResetChainNoncesResponse) ProtoMessage() {} +func (*MsgResetChainNoncesResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_1bcd40fa296a2b1d, []int{17} +} +func (m *MsgResetChainNoncesResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgResetChainNoncesResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgResetChainNoncesResponse.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 *MsgResetChainNoncesResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgResetChainNoncesResponse.Merge(m, src) +} +func (m *MsgResetChainNoncesResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgResetChainNoncesResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgResetChainNoncesResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgResetChainNoncesResponse proto.InternalMessageInfo + func init() { proto.RegisterType((*MsgUpdateObserver)(nil), "zetachain.zetacore.observer.MsgUpdateObserver") proto.RegisterType((*MsgUpdateObserverResponse)(nil), "zetachain.zetacore.observer.MsgUpdateObserverResponse") @@ -839,71 +943,78 @@ func init() { proto.RegisterType((*MsgUpdateCrosschainFlagsResponse)(nil), "zetachain.zetacore.observer.MsgUpdateCrosschainFlagsResponse") proto.RegisterType((*MsgUpdateKeygen)(nil), "zetachain.zetacore.observer.MsgUpdateKeygen") proto.RegisterType((*MsgUpdateKeygenResponse)(nil), "zetachain.zetacore.observer.MsgUpdateKeygenResponse") + proto.RegisterType((*MsgResetChainNonces)(nil), "zetachain.zetacore.observer.MsgResetChainNonces") + proto.RegisterType((*MsgResetChainNoncesResponse)(nil), "zetachain.zetacore.observer.MsgResetChainNoncesResponse") } func init() { proto.RegisterFile("observer/tx.proto", fileDescriptor_1bcd40fa296a2b1d) } var fileDescriptor_1bcd40fa296a2b1d = []byte{ - // 939 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x56, 0xcd, 0x6e, 0xdb, 0x46, - 0x10, 0x36, 0xe3, 0xc4, 0x3f, 0x23, 0xd7, 0x89, 0xb7, 0x76, 0x2c, 0x2b, 0x89, 0x62, 0xf0, 0xe4, - 0xb6, 0xae, 0x14, 0x2b, 0x6d, 0x81, 0x14, 0xe8, 0xc1, 0xee, 0x8f, 0xa3, 0x06, 0xa9, 0x0d, 0x02, - 0xf5, 0xa1, 0x17, 0x62, 0xc9, 0x1d, 0x53, 0x44, 0xa8, 0x5d, 0x81, 0x4b, 0x25, 0x56, 0xd1, 0x1e, - 0xfa, 0x00, 0x45, 0xfb, 0x2a, 0x7d, 0x87, 0x1e, 0x72, 0xcc, 0xb1, 0xa7, 0xa2, 0xb0, 0x4f, 0xed, - 0x0b, 0xf4, 0x1a, 0x70, 0x49, 0xae, 0x44, 0x51, 0xa2, 0xe4, 0x9c, 0xc4, 0xdd, 0xfd, 0xe6, 0x9b, - 0xf9, 0x66, 0xbf, 0x5d, 0x2d, 0x6c, 0x08, 0x47, 0x62, 0xf8, 0x12, 0xc3, 0x66, 0x74, 0xd1, 0xe8, - 0x85, 0x22, 0x12, 0xe4, 0xde, 0x8f, 0x18, 0x51, 0xb7, 0x43, 0x7d, 0xde, 0x50, 0x5f, 0x22, 0xc4, - 0x46, 0x86, 0xaa, 0xbd, 0xef, 0x8a, 0x6e, 0x57, 0xf0, 0x66, 0xf2, 0x93, 0x44, 0xd4, 0x36, 0x3d, - 0xe1, 0x09, 0xf5, 0xd9, 0x8c, 0xbf, 0xb2, 0x59, 0x4d, 0xed, 0x04, 0xb4, 0x8b, 0xe9, 0xec, 0x43, - 0x3d, 0xeb, 0x86, 0x42, 0x4a, 0x95, 0xc7, 0x3e, 0x0f, 0xa8, 0x27, 0x53, 0xc0, 0xb6, 0x06, 0x64, - 0x1f, 0xe9, 0xc2, 0x96, 0x5e, 0xe8, 0xd1, 0x90, 0x76, 0x33, 0xfc, 0x83, 0xe1, 0x34, 0x72, 0xe6, - 0x73, 0xcf, 0xe6, 0x82, 0xbb, 0x98, 0x2d, 0x93, 0xa1, 0x40, 0x99, 0xce, 0x99, 0xff, 0x1a, 0xb0, - 0xf1, 0x5c, 0x7a, 0xdf, 0xf7, 0x18, 0x8d, 0xf0, 0x24, 0x5d, 0x27, 0x55, 0x58, 0x76, 0x43, 0xa4, - 0x91, 0x08, 0xab, 0xc6, 0xae, 0xb1, 0xb7, 0x6a, 0x65, 0x43, 0xf2, 0x08, 0x36, 0x45, 0xc0, 0xec, - 0x8c, 0xc9, 0xa6, 0x8c, 0x85, 0x28, 0x65, 0xf5, 0x86, 0x82, 0x11, 0x11, 0xb0, 0x8c, 0xe4, 0x30, - 0x59, 0x89, 0x23, 0x38, 0xbe, 0x2a, 0x46, 0x2c, 0x26, 0x11, 0x1c, 0x5f, 0x8d, 0x47, 0x9c, 0xc1, - 0x7b, 0x7d, 0x55, 0x8f, 0x1d, 0x22, 0x95, 0x82, 0x57, 0x6f, 0xee, 0x1a, 0x7b, 0xeb, 0xad, 0x83, - 0x46, 0xc9, 0x6e, 0x34, 0x32, 0x92, 0x44, 0x89, 0xa5, 0x02, 0xad, 0xb5, 0xfe, 0xc8, 0xc8, 0xbc, - 0x07, 0x3b, 0x05, 0xa9, 0x16, 0xca, 0x9e, 0xe0, 0x12, 0xcd, 0x3f, 0x92, 0x46, 0x1c, 0x32, 0x76, - 0x14, 0x08, 0xf7, 0xc5, 0x53, 0xa4, 0xac, 0xb4, 0x11, 0x3b, 0xb0, 0x92, 0x6c, 0x98, 0xcf, 0x94, - 0xf8, 0x45, 0x6b, 0x59, 0x8d, 0xdb, 0x8c, 0x3c, 0x00, 0x70, 0x62, 0x0e, 0xbb, 0x43, 0x65, 0x47, - 0xe9, 0x5c, 0xb3, 0x56, 0xd5, 0xcc, 0x53, 0x2a, 0x3b, 0xe4, 0x2e, 0x2c, 0x75, 0xd0, 0xf7, 0x3a, - 0x91, 0xd2, 0xb5, 0x68, 0xa5, 0x23, 0xf2, 0x28, 0x9e, 0x8f, 0xb3, 0x56, 0x6f, 0xed, 0x1a, 0x7b, - 0x95, 0x16, 0x69, 0xa4, 0xce, 0x4a, 0x6a, 0xf9, 0x8a, 0x46, 0xf4, 0xe8, 0xe6, 0xeb, 0xbf, 0x1f, - 0x2e, 0x58, 0x29, 0x2e, 0x15, 0x94, 0x2f, 0x59, 0x0b, 0xfa, 0x09, 0x36, 0xb5, 0xda, 0x2f, 0xe3, - 0xca, 0x4e, 0x95, 0x55, 0x4a, 0x24, 0x7d, 0x0b, 0x15, 0x77, 0x08, 0x54, 0xaa, 0x2a, 0xad, 0xbd, - 0xd2, 0xae, 0x8f, 0x10, 0x5b, 0xa3, 0xc1, 0x66, 0x1d, 0xee, 0x4f, 0xca, 0xae, 0xab, 0x7b, 0xa6, - 0xaa, 0xb3, 0xb0, 0x2b, 0x5e, 0xce, 0x59, 0xdd, 0xf4, 0x86, 0xa7, 0xc9, 0x0a, 0x64, 0x3a, 0xd9, - 0x9f, 0x06, 0xac, 0x27, 0x8d, 0x9a, 0xc3, 0xe1, 0x1f, 0xc0, 0x9d, 0x29, 0xee, 0xbe, 0x2d, 0xc6, - 0x8c, 0xfa, 0x39, 0xec, 0xa8, 0x96, 0x04, 0x3e, 0xf2, 0xc8, 0xf6, 0x42, 0xca, 0x23, 0x44, 0xbb, - 0xd7, 0x77, 0x5e, 0xe0, 0x20, 0xf5, 0xf7, 0xf6, 0x10, 0x70, 0x9c, 0xac, 0x9f, 0xaa, 0x65, 0x72, - 0x00, 0x5b, 0x94, 0x31, 0x9b, 0x0b, 0x86, 0x36, 0x75, 0x5d, 0xd1, 0xe7, 0x91, 0x2d, 0x78, 0x30, - 0x50, 0xa6, 0x58, 0xb1, 0x08, 0x65, 0xec, 0x3b, 0xc1, 0xf0, 0x30, 0x59, 0x3a, 0xe1, 0xc1, 0xc0, - 0xac, 0xc2, 0xdd, 0xbc, 0x0a, 0x2d, 0xf0, 0x37, 0x03, 0x6e, 0x67, 0x4e, 0xa0, 0x5d, 0x3c, 0x13, - 0x11, 0xbe, 0x9b, 0x75, 0x8f, 0x63, 0xeb, 0xd2, 0x2e, 0xda, 0x3e, 0x3f, 0x17, 0x4a, 0x42, 0xa5, - 0x65, 0x96, 0x3a, 0x40, 0x25, 0x4c, 0x7d, 0xb9, 0xaa, 0x62, 0xdb, 0xfc, 0x5c, 0x98, 0x3b, 0xb0, - 0x3d, 0x56, 0x90, 0x2e, 0xf6, 0xff, 0x1b, 0x50, 0x1d, 0x7a, 0x43, 0xdf, 0x7c, 0xdf, 0xc4, 0x17, - 0x5f, 0x49, 0xd5, 0x1f, 0xc2, 0x1d, 0x5f, 0xb6, 0xb9, 0x23, 0xfa, 0x9c, 0x7d, 0xcd, 0xa9, 0x13, - 0x20, 0x53, 0x05, 0xae, 0x58, 0x85, 0x79, 0xb2, 0x0f, 0x1b, 0xbe, 0x3c, 0xe9, 0x47, 0x39, 0x70, - 0xd2, 0xd8, 0xe2, 0x02, 0xe9, 0xc0, 0x96, 0x47, 0xe5, 0x69, 0xe8, 0xbb, 0xd8, 0xe6, 0x71, 0x3a, - 0x89, 0xaa, 0x98, 0xf4, 0x1c, 0xb6, 0x4a, 0xf5, 0x1f, 0x4f, 0x8a, 0xb4, 0x26, 0x13, 0x92, 0x9f, - 0xe1, 0xbe, 0x33, 0x3c, 0xaa, 0x67, 0x18, 0xfa, 0xe7, 0xbe, 0x4b, 0x23, 0x5f, 0x24, 0xea, 0xab, - 0x4b, 0x2a, 0xe1, 0x93, 0x19, 0x0d, 0x9f, 0x4e, 0x60, 0x95, 0xd2, 0x9b, 0x26, 0xec, 0x4e, 0x6b, - 0xbc, 0xde, 0x9d, 0x43, 0xe5, 0xa4, 0x04, 0xf3, 0x0c, 0x07, 0x1e, 0xf2, 0x92, 0x3d, 0xd9, 0x84, - 0x5b, 0x2a, 0x61, 0x6a, 0xa3, 0x64, 0x90, 0xee, 0xfd, 0x28, 0x45, 0xc6, 0xde, 0xfa, 0x6f, 0x19, - 0x16, 0x9f, 0x4b, 0x8f, 0x08, 0xa8, 0x8c, 0x9e, 0xc6, 0x8f, 0x4a, 0x15, 0xe7, 0x4d, 0x5f, 0x7b, - 0x7c, 0x0d, 0x70, 0x96, 0x98, 0x5c, 0xc0, 0xfa, 0xd8, 0x7f, 0x5c, 0x63, 0x16, 0x4d, 0x1e, 0x5f, - 0xfb, 0xec, 0x7a, 0x78, 0x9d, 0xf9, 0x17, 0x03, 0x36, 0x8a, 0xb7, 0xf0, 0xc1, 0x7c, 0x6c, 0x23, - 0x21, 0xb5, 0x27, 0xd7, 0x0e, 0xc9, 0xd5, 0x50, 0xbc, 0x6b, 0x67, 0xd6, 0x50, 0x08, 0x99, 0x5d, - 0xc3, 0xd4, 0x4b, 0x98, 0x84, 0xb0, 0x96, 0xbb, 0x9f, 0xf6, 0xe7, 0xd8, 0x46, 0x8d, 0xae, 0x7d, - 0x72, 0x1d, 0xb4, 0xce, 0xf9, 0xab, 0x01, 0x5b, 0x93, 0xef, 0x99, 0x4f, 0xe7, 0x6c, 0x66, 0x3e, - 0xac, 0xf6, 0xc5, 0x3b, 0x85, 0x8d, 0xf6, 0x20, 0x77, 0xb2, 0xf6, 0xe7, 0xa3, 0x4b, 0xd0, 0xb3, - 0x7b, 0x30, 0xe9, 0xc8, 0xc5, 0xce, 0x1f, 0x7b, 0xd4, 0x34, 0xe6, 0xea, 0xa5, 0xc6, 0xcf, 0x76, - 0xfe, 0xe4, 0x17, 0xc8, 0x51, 0xfb, 0xf5, 0x65, 0xdd, 0x78, 0x73, 0x59, 0x37, 0xfe, 0xb9, 0xac, - 0x1b, 0xbf, 0x5f, 0xd5, 0x17, 0xde, 0x5c, 0xd5, 0x17, 0xfe, 0xba, 0xaa, 0x2f, 0xfc, 0xd0, 0xf4, - 0xfc, 0xa8, 0xd3, 0x77, 0xe2, 0x07, 0x4e, 0x33, 0x66, 0xfc, 0x58, 0x91, 0x37, 0x33, 0xf2, 0xe6, - 0x45, 0x73, 0xf8, 0x54, 0x1d, 0xf4, 0x50, 0x3a, 0x4b, 0xea, 0xb5, 0xfa, 0xf8, 0x6d, 0x00, 0x00, - 0x00, 0xff, 0xff, 0x9f, 0xe7, 0x2f, 0x7d, 0xa4, 0x0b, 0x00, 0x00, + // 1022 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x56, 0xcb, 0x6e, 0xdb, 0x46, + 0x14, 0x35, 0x63, 0xc7, 0xb1, 0xaf, 0x1c, 0x3f, 0x26, 0x76, 0x2c, 0xcb, 0xb1, 0x62, 0x70, 0x51, + 0xa8, 0xad, 0x2b, 0xd9, 0x4a, 0x5b, 0x34, 0x05, 0xba, 0xb0, 0xfb, 0xb0, 0xd5, 0x34, 0xb1, 0x41, + 0xa0, 0x5e, 0x74, 0x43, 0x8c, 0x38, 0x63, 0x92, 0x08, 0x35, 0x23, 0x70, 0xa8, 0xd8, 0x2a, 0xda, + 0x02, 0xfd, 0x80, 0xa2, 0xfd, 0x80, 0xfe, 0x44, 0xff, 0xa1, 0x8b, 0x2c, 0xb3, 0xec, 0xaa, 0x28, + 0xec, 0x55, 0xfb, 0x03, 0xdd, 0x06, 0x1c, 0x92, 0x23, 0x51, 0x94, 0x28, 0xc9, 0x2b, 0x72, 0xe6, + 0x9e, 0x7b, 0xee, 0x63, 0xce, 0x3c, 0x60, 0x8d, 0x37, 0x05, 0xf5, 0x5f, 0x51, 0xbf, 0x16, 0x5c, + 0x55, 0xdb, 0x3e, 0x0f, 0x38, 0xda, 0xfe, 0x9e, 0x06, 0xd8, 0x72, 0xb0, 0xcb, 0xaa, 0xf2, 0x8f, + 0xfb, 0xb4, 0x9a, 0xa0, 0x4a, 0x0f, 0x2c, 0xde, 0x6a, 0x71, 0x56, 0x8b, 0x3e, 0x91, 0x47, 0x69, + 0xdd, 0xe6, 0x36, 0x97, 0xbf, 0xb5, 0xf0, 0x2f, 0x99, 0x55, 0xd4, 0x4d, 0x0f, 0xb7, 0x68, 0x3c, + 0xfb, 0x58, 0xcd, 0x5a, 0x3e, 0x17, 0x42, 0xc6, 0x31, 0x2f, 0x3c, 0x6c, 0x8b, 0x18, 0xb0, 0xa9, + 0x00, 0xc9, 0x4f, 0x6c, 0xd8, 0x50, 0x86, 0x36, 0xf6, 0x71, 0x2b, 0xc1, 0xef, 0xf4, 0xa6, 0x29, + 0x23, 0x2e, 0xb3, 0x4d, 0xc6, 0x99, 0x45, 0x13, 0x33, 0xea, 0x15, 0x28, 0xe2, 0x39, 0xfd, 0x5f, + 0x0d, 0xd6, 0x9e, 0x0b, 0xfb, 0xdb, 0x36, 0xc1, 0x01, 0x3d, 0x8d, 0xed, 0xa8, 0x08, 0xf7, 0x2c, + 0x9f, 0xe2, 0x80, 0xfb, 0x45, 0x6d, 0x57, 0xab, 0x2c, 0x1a, 0xc9, 0x10, 0xed, 0xc3, 0x3a, 0xf7, + 0x88, 0x99, 0x30, 0x99, 0x98, 0x10, 0x9f, 0x0a, 0x51, 0xbc, 0x23, 0x61, 0x88, 0x7b, 0x24, 0x21, + 0x39, 0x8c, 0x2c, 0xa1, 0x07, 0xa3, 0x97, 0x59, 0x8f, 0xd9, 0xc8, 0x83, 0xd1, 0xcb, 0x41, 0x8f, + 0x73, 0xb8, 0xdf, 0x91, 0xf9, 0x98, 0x3e, 0xc5, 0x82, 0xb3, 0xe2, 0xdc, 0xae, 0x56, 0x59, 0xae, + 0x1f, 0x54, 0x73, 0x56, 0xa3, 0x9a, 0x90, 0x44, 0x95, 0x18, 0xd2, 0xd1, 0x58, 0xea, 0xf4, 0x8d, + 0xf4, 0x6d, 0xd8, 0xca, 0x94, 0x6a, 0x50, 0xd1, 0xe6, 0x4c, 0x50, 0xfd, 0x8f, 0xa8, 0x11, 0x87, + 0x84, 0x1c, 0x79, 0xdc, 0x7a, 0x79, 0x42, 0x31, 0xc9, 0x6d, 0xc4, 0x16, 0x2c, 0x44, 0x0b, 0xe6, + 0x12, 0x59, 0xfc, 0xac, 0x71, 0x4f, 0x8e, 0x1b, 0x04, 0xed, 0x00, 0x34, 0x43, 0x0e, 0xd3, 0xc1, + 0xc2, 0x91, 0x75, 0x2e, 0x19, 0x8b, 0x72, 0xe6, 0x04, 0x0b, 0x07, 0x3d, 0x84, 0x79, 0x87, 0xba, + 0xb6, 0x13, 0xc8, 0xba, 0x66, 0x8d, 0x78, 0x84, 0xf6, 0xc3, 0xf9, 0x30, 0x6a, 0xf1, 0xee, 0xae, + 0x56, 0x29, 0xd4, 0x51, 0x35, 0x56, 0x56, 0x94, 0xcb, 0x17, 0x38, 0xc0, 0x47, 0x73, 0xaf, 0xff, + 0x7e, 0x3c, 0x63, 0xc4, 0xb8, 0xb8, 0xa0, 0x74, 0xca, 0xaa, 0xa0, 0x1f, 0x60, 0x5d, 0x55, 0xfb, + 0x79, 0x98, 0xd9, 0x99, 0x94, 0x4a, 0x4e, 0x49, 0x5f, 0x43, 0xc1, 0xea, 0x01, 0x65, 0x55, 0x85, + 0x7a, 0x25, 0xb7, 0xeb, 0x7d, 0xc4, 0x46, 0xbf, 0xb3, 0x5e, 0x86, 0x47, 0xc3, 0xa2, 0xab, 0xec, + 0x9e, 0xc9, 0xec, 0x0c, 0xda, 0xe2, 0xaf, 0x26, 0xcc, 0x6e, 0x74, 0xc3, 0xe3, 0x60, 0x19, 0x32, + 0x15, 0xec, 0x4f, 0x0d, 0x96, 0xa3, 0x46, 0x4d, 0xa0, 0xf0, 0x77, 0x61, 0x75, 0x84, 0xba, 0x57, + 0xf8, 0x80, 0x50, 0x3f, 0x85, 0x2d, 0xd9, 0x12, 0xcf, 0xa5, 0x2c, 0x30, 0x6d, 0x1f, 0xb3, 0x80, + 0x52, 0xb3, 0xdd, 0x69, 0xbe, 0xa4, 0xdd, 0x58, 0xdf, 0x9b, 0x3d, 0xc0, 0x71, 0x64, 0x3f, 0x93, + 0x66, 0x74, 0x00, 0x1b, 0x98, 0x10, 0x93, 0x71, 0x42, 0x4d, 0x6c, 0x59, 0xbc, 0xc3, 0x02, 0x93, + 0x33, 0xaf, 0x2b, 0x45, 0xb1, 0x60, 0x20, 0x4c, 0xc8, 0x0b, 0x4e, 0xe8, 0x61, 0x64, 0x3a, 0x65, + 0x5e, 0x57, 0x2f, 0xc2, 0xc3, 0x74, 0x15, 0xaa, 0xc0, 0x5f, 0x35, 0x58, 0x49, 0x94, 0x80, 0x5b, + 0xf4, 0x9c, 0x07, 0xf4, 0x76, 0xd2, 0x3d, 0x0e, 0xa5, 0x8b, 0x5b, 0xd4, 0x74, 0xd9, 0x05, 0x97, + 0x25, 0x14, 0xea, 0x7a, 0xae, 0x02, 0x64, 0xc0, 0x58, 0x97, 0x8b, 0xd2, 0xb7, 0xc1, 0x2e, 0xb8, + 0xbe, 0x05, 0x9b, 0x03, 0x09, 0xa9, 0x64, 0xff, 0xbf, 0x03, 0xc5, 0x9e, 0x36, 0xd4, 0xc9, 0xf7, + 0x55, 0x78, 0xf0, 0xe5, 0x64, 0xfd, 0x1e, 0xac, 0xba, 0xa2, 0xc1, 0x9a, 0xbc, 0xc3, 0xc8, 0x97, + 0x0c, 0x37, 0x3d, 0x4a, 0x64, 0x82, 0x0b, 0x46, 0x66, 0x1e, 0xed, 0xc1, 0x9a, 0x2b, 0x4e, 0x3b, + 0x41, 0x0a, 0x1c, 0x35, 0x36, 0x6b, 0x40, 0x0e, 0x6c, 0xd8, 0x58, 0x9c, 0xf9, 0xae, 0x45, 0x1b, + 0x2c, 0x0c, 0x27, 0xa8, 0x4c, 0x26, 0xde, 0x87, 0xf5, 0xdc, 0xfa, 0x8f, 0x87, 0x79, 0x1a, 0xc3, + 0x09, 0xd1, 0x8f, 0xf0, 0xa8, 0xd9, 0xdb, 0xaa, 0xe7, 0xd4, 0x77, 0x2f, 0x5c, 0x0b, 0x07, 0x2e, + 0x8f, 0xaa, 0x2f, 0xce, 0xcb, 0x80, 0x4f, 0xc7, 0x34, 0x7c, 0x34, 0x81, 0x91, 0x4b, 0xaf, 0xeb, + 0xb0, 0x3b, 0xaa, 0xf1, 0x6a, 0x75, 0x0e, 0xa5, 0x92, 0x22, 0xcc, 0x33, 0xda, 0xb5, 0x29, 0xcb, + 0x59, 0x93, 0x75, 0xb8, 0x2b, 0x03, 0xc6, 0x32, 0x8a, 0x06, 0xf1, 0xda, 0xf7, 0x53, 0x28, 0xf6, + 0xdf, 0x35, 0x78, 0x20, 0xb7, 0xaa, 0xa0, 0x81, 0xdc, 0xa9, 0x2f, 0xe4, 0x05, 0x75, 0x3b, 0xb1, + 0xbe, 0x03, 0x2b, 0x91, 0x49, 0xde, 0x72, 0xa6, 0xc7, 0x2f, 0xa5, 0x20, 0xe6, 0x8c, 0xfb, 0x96, + 0xa2, 0xfe, 0x86, 0x5f, 0xa2, 0x0a, 0xac, 0xf6, 0xe3, 0x1c, 0xd7, 0x76, 0xa4, 0x18, 0xe6, 0x8c, + 0xe5, 0x1e, 0xf0, 0xc4, 0xb5, 0x1d, 0x7d, 0x07, 0xb6, 0x87, 0x64, 0x97, 0x64, 0x5f, 0xff, 0x6f, + 0x01, 0x66, 0x9f, 0x0b, 0x1b, 0x71, 0x28, 0xf4, 0x9f, 0x25, 0xef, 0xe7, 0xae, 0x57, 0x7a, 0xcb, + 0x96, 0x9e, 0x4c, 0x01, 0x4e, 0x02, 0xa3, 0x2b, 0x58, 0x1e, 0xb8, 0xa1, 0xab, 0xe3, 0x68, 0xd2, + 0xf8, 0xd2, 0xc7, 0xd3, 0xe1, 0x55, 0xe4, 0x9f, 0x35, 0x58, 0xcb, 0xde, 0x21, 0x07, 0x93, 0xb1, + 0xf5, 0xb9, 0x94, 0x9e, 0x4e, 0xed, 0x92, 0xca, 0x21, 0x7b, 0x53, 0x8c, 0xcd, 0x21, 0xe3, 0x32, + 0x3e, 0x87, 0x91, 0x57, 0x08, 0xf2, 0x61, 0x29, 0x75, 0xba, 0xee, 0x4d, 0xb0, 0x8c, 0x0a, 0x5d, + 0xfa, 0x70, 0x1a, 0xb4, 0x8a, 0xf9, 0x8b, 0x06, 0x1b, 0xc3, 0x4f, 0xc9, 0x8f, 0x26, 0x6c, 0x66, + 0xda, 0xad, 0xf4, 0xd9, 0xad, 0xdc, 0xfa, 0x7b, 0x90, 0x3a, 0x17, 0xf6, 0x26, 0xa3, 0x8b, 0xd0, + 0xe3, 0x7b, 0x30, 0xec, 0xc0, 0x08, 0x95, 0x3f, 0xf0, 0x24, 0xab, 0x4e, 0xd4, 0x4b, 0x85, 0x1f, + 0xaf, 0xfc, 0xe1, 0xef, 0x27, 0xf4, 0x13, 0xac, 0x66, 0x8e, 0xa9, 0xfd, 0xf1, 0x02, 0x4a, 0x7b, + 0x94, 0x3e, 0x99, 0xd6, 0x23, 0x89, 0x7f, 0xd4, 0x78, 0x7d, 0x5d, 0xd6, 0xde, 0x5c, 0x97, 0xb5, + 0x7f, 0xae, 0xcb, 0xda, 0x6f, 0x37, 0xe5, 0x99, 0x37, 0x37, 0xe5, 0x99, 0xbf, 0x6e, 0xca, 0x33, + 0xdf, 0xd5, 0x6c, 0x37, 0x70, 0x3a, 0xcd, 0xf0, 0x79, 0x58, 0x0b, 0x39, 0x3f, 0x90, 0xf4, 0xb5, + 0x84, 0xbe, 0x76, 0x55, 0xeb, 0x3d, 0xf4, 0xbb, 0x6d, 0x2a, 0x9a, 0xf3, 0xf2, 0xad, 0xff, 0xe4, + 0x6d, 0x00, 0x00, 0x00, 0xff, 0xff, 0x5b, 0x00, 0x12, 0xf4, 0xe2, 0x0c, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -926,6 +1037,7 @@ type MsgClient interface { UpdateCrosschainFlags(ctx context.Context, in *MsgUpdateCrosschainFlags, opts ...grpc.CallOption) (*MsgUpdateCrosschainFlagsResponse, error) UpdateKeygen(ctx context.Context, in *MsgUpdateKeygen, opts ...grpc.CallOption) (*MsgUpdateKeygenResponse, error) AddBlockHeader(ctx context.Context, in *MsgAddBlockHeader, opts ...grpc.CallOption) (*MsgAddBlockHeaderResponse, error) + ResetChainNonces(ctx context.Context, in *MsgResetChainNonces, opts ...grpc.CallOption) (*MsgResetChainNoncesResponse, error) } type msgClient struct { @@ -1008,6 +1120,15 @@ func (c *msgClient) AddBlockHeader(ctx context.Context, in *MsgAddBlockHeader, o return out, nil } +func (c *msgClient) ResetChainNonces(ctx context.Context, in *MsgResetChainNonces, opts ...grpc.CallOption) (*MsgResetChainNoncesResponse, error) { + out := new(MsgResetChainNoncesResponse) + err := c.cc.Invoke(ctx, "/zetachain.zetacore.observer.Msg/ResetChainNonces", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // MsgServer is the server API for Msg service. type MsgServer interface { AddObserver(context.Context, *MsgAddObserver) (*MsgAddObserverResponse, error) @@ -1018,6 +1139,7 @@ type MsgServer interface { UpdateCrosschainFlags(context.Context, *MsgUpdateCrosschainFlags) (*MsgUpdateCrosschainFlagsResponse, error) UpdateKeygen(context.Context, *MsgUpdateKeygen) (*MsgUpdateKeygenResponse, error) AddBlockHeader(context.Context, *MsgAddBlockHeader) (*MsgAddBlockHeaderResponse, error) + ResetChainNonces(context.Context, *MsgResetChainNonces) (*MsgResetChainNoncesResponse, error) } // UnimplementedMsgServer can be embedded to have forward compatible implementations. @@ -1048,6 +1170,9 @@ func (*UnimplementedMsgServer) UpdateKeygen(ctx context.Context, req *MsgUpdateK func (*UnimplementedMsgServer) AddBlockHeader(ctx context.Context, req *MsgAddBlockHeader) (*MsgAddBlockHeaderResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method AddBlockHeader not implemented") } +func (*UnimplementedMsgServer) ResetChainNonces(ctx context.Context, req *MsgResetChainNonces) (*MsgResetChainNoncesResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ResetChainNonces not implemented") +} func RegisterMsgServer(s grpc1.Server, srv MsgServer) { s.RegisterService(&_Msg_serviceDesc, srv) @@ -1197,6 +1322,24 @@ func _Msg_AddBlockHeader_Handler(srv interface{}, ctx context.Context, dec func( return interceptor(ctx, in, info, handler) } +func _Msg_ResetChainNonces_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgResetChainNonces) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).ResetChainNonces(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/zetachain.zetacore.observer.Msg/ResetChainNonces", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).ResetChainNonces(ctx, req.(*MsgResetChainNonces)) + } + return interceptor(ctx, in, info, handler) +} + var _Msg_serviceDesc = grpc.ServiceDesc{ ServiceName: "zetachain.zetacore.observer.Msg", HandlerType: (*MsgServer)(nil), @@ -1233,6 +1376,10 @@ var _Msg_serviceDesc = grpc.ServiceDesc{ MethodName: "AddBlockHeader", Handler: _Msg_AddBlockHeader_Handler, }, + { + MethodName: "ResetChainNonces", + Handler: _Msg_ResetChainNonces_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "observer/tx.proto", @@ -1813,6 +1960,74 @@ func (m *MsgUpdateKeygenResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) return len(dAtA) - i, nil } +func (m *MsgResetChainNonces) 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 *MsgResetChainNonces) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgResetChainNonces) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.ChainNonceHigh != 0 { + i = encodeVarintTx(dAtA, i, uint64(m.ChainNonceHigh)) + i-- + dAtA[i] = 0x20 + } + if m.ChainNonceLow != 0 { + i = encodeVarintTx(dAtA, i, uint64(m.ChainNonceLow)) + i-- + dAtA[i] = 0x18 + } + if m.ChainId != 0 { + i = encodeVarintTx(dAtA, i, uint64(m.ChainId)) + i-- + dAtA[i] = 0x10 + } + if len(m.Creator) > 0 { + i -= len(m.Creator) + copy(dAtA[i:], m.Creator) + i = encodeVarintTx(dAtA, i, uint64(len(m.Creator))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MsgResetChainNoncesResponse) 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 *MsgResetChainNoncesResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgResetChainNoncesResponse) 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 @@ -2063,6 +2278,37 @@ func (m *MsgUpdateKeygenResponse) Size() (n int) { return n } +func (m *MsgResetChainNonces) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Creator) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + if m.ChainId != 0 { + n += 1 + sovTx(uint64(m.ChainId)) + } + if m.ChainNonceLow != 0 { + n += 1 + sovTx(uint64(m.ChainNonceLow)) + } + if m.ChainNonceHigh != 0 { + n += 1 + sovTx(uint64(m.ChainNonceHigh)) + } + return n +} + +func (m *MsgResetChainNoncesResponse) 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 } @@ -3635,6 +3881,195 @@ func (m *MsgUpdateKeygenResponse) Unmarshal(dAtA []byte) error { } return nil } +func (m *MsgResetChainNonces) 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: MsgResetChainNonces: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgResetChainNonces: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Creator", 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.Creator = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ChainId", wireType) + } + m.ChainId = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.ChainId |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ChainNonceLow", wireType) + } + m.ChainNonceLow = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.ChainNonceLow |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ChainNonceHigh", wireType) + } + m.ChainNonceHigh = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.ChainNonceHigh |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + 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 *MsgResetChainNoncesResponse) 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: MsgResetChainNoncesResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgResetChainNoncesResponse: 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 From e32f662af48964ea078422d65f0ae0604f3b0bc1 Mon Sep 17 00:00:00 2001 From: skosito Date: Tue, 19 Mar 2024 19:20:09 +0100 Subject: [PATCH 2/7] PR comments and nosec --- changelog.md | 6 ++++++ x/observer/keeper/msg_server_reset_chain_nonces.go | 8 +++++--- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/changelog.md b/changelog.md index a71f368313..62d684c3a7 100644 --- a/changelog.md +++ b/changelog.md @@ -57,6 +57,12 @@ * [1891](https://github.com/zeta-chain/node/pull/1891) - fix typo that was introduced to docker-compose and a typo in start.sh for the docker start script for full nodes. * [1894](https://github.com/zeta-chain/node/pull/1894) - added download binaries and configs to the start sequence so it will download binaries that don't exist +## Version: v15 + +### Features + +*[1912](https://github.com/zeta-chain/node/pull/1912) - add reset chain nonces msg + ## Version: v14 - [1817](https://github.com/zeta-chain/node/pull/1817) - Add migration script to fix pending and chain nonces on testnet diff --git a/x/observer/keeper/msg_server_reset_chain_nonces.go b/x/observer/keeper/msg_server_reset_chain_nonces.go index 64645ad4e3..997e693b20 100644 --- a/x/observer/keeper/msg_server_reset_chain_nonces.go +++ b/x/observer/keeper/msg_server_reset_chain_nonces.go @@ -26,7 +26,7 @@ func (k msgServer) ResetChainNonces(goCtx context.Context, msg *types.MsgResetCh return nil, types.ErrSupportedChains } - // reset chain nonces + // set chain nonces chainNonce := types.ChainNonces{ Index: chain.ChainName.String(), ChainId: chain.ChainId, @@ -36,9 +36,11 @@ func (k msgServer) ResetChainNonces(goCtx context.Context, msg *types.MsgResetCh } k.SetChainNonces(ctx, chainNonce) - // reset pending nonces + // set pending nonces p := types.PendingNonces{ - NonceLow: int64(msg.ChainNonceLow), + // #nosec G701 always in the range + NonceLow: int64(msg.ChainNonceLow), + // #nosec G701 always in the range NonceHigh: int64(msg.ChainNonceHigh), ChainId: chain.ChainId, Tss: tss.TssPubkey, From 9f0afafe8797dd1cf2312042d6f97beb60186065 Mon Sep 17 00:00:00 2001 From: skosito Date: Tue, 19 Mar 2024 19:20:15 +0100 Subject: [PATCH 3/7] Gen docs --- docs/cli/zetacored/zetacored_tx_observer.md | 1 + ...etacored_tx_observer_reset-chain-nonces.md | 52 +++++++++++++++++ docs/openapi/openapi.swagger.yaml | 2 + docs/spec/observer/messages.md | 14 +++++ typescript/observer/tx_pb.d.ts | 58 +++++++++++++++++++ 5 files changed, 127 insertions(+) create mode 100644 docs/cli/zetacored/zetacored_tx_observer_reset-chain-nonces.md diff --git a/docs/cli/zetacored/zetacored_tx_observer.md b/docs/cli/zetacored/zetacored_tx_observer.md index 5340a1041a..de1145c512 100644 --- a/docs/cli/zetacored/zetacored_tx_observer.md +++ b/docs/cli/zetacored/zetacored_tx_observer.md @@ -29,6 +29,7 @@ zetacored tx observer [flags] * [zetacored tx observer add-observer](zetacored_tx_observer_add-observer.md) - Broadcast message add-observer * [zetacored tx observer encode](zetacored_tx_observer_encode.md) - Encode a json string into hex * [zetacored tx observer remove-chain-params](zetacored_tx_observer_remove-chain-params.md) - Broadcast message to remove chain params +* [zetacored tx observer reset-chain-nonces](zetacored_tx_observer_reset-chain-nonces.md) - Broadcast message to reset chain nonces * [zetacored tx observer update-chain-params](zetacored_tx_observer_update-chain-params.md) - Broadcast message updateChainParams * [zetacored tx observer update-crosschain-flags](zetacored_tx_observer_update-crosschain-flags.md) - Update crosschain flags * [zetacored tx observer update-keygen](zetacored_tx_observer_update-keygen.md) - command to update the keygen block via a group proposal diff --git a/docs/cli/zetacored/zetacored_tx_observer_reset-chain-nonces.md b/docs/cli/zetacored/zetacored_tx_observer_reset-chain-nonces.md new file mode 100644 index 0000000000..6a858d99b2 --- /dev/null +++ b/docs/cli/zetacored/zetacored_tx_observer_reset-chain-nonces.md @@ -0,0 +1,52 @@ +# tx observer reset-chain-nonces + +Broadcast message to reset chain nonces + +``` +zetacored tx observer reset-chain-nonces [chain-id] [chain-nonce-low] [chain-nonce-high] [flags] +``` + +### Options + +``` + -a, --account-number uint The account number of the signing account (offline mode only) + --aux Generate aux signer data instead of sending a tx + -b, --broadcast-mode string Transaction broadcasting mode (sync|async|block) + --dry-run ignore the --gas flag and perform a simulation of a transaction, but don't broadcast it (when enabled, the local Keybase is not accessible) + --fee-granter string Fee granter grants fees for the transaction + --fee-payer string Fee payer pays fees for the transaction instead of deducting from the signer + --fees string Fees to pay along with transaction; eg: 10uatom + --from string Name or address of private key with which to sign + --gas string gas limit to set per-transaction; set to "auto" to calculate sufficient gas automatically. Note: "auto" option doesn't always report accurate results. Set a valid coin value to adjust the result. Can be used instead of "fees". (default 200000) + --gas-adjustment float adjustment factor to be multiplied against the estimate returned by the tx simulation; if the gas limit is set manually this flag is ignored (default 1) + --gas-prices string Gas prices in decimal format to determine the transaction fee (e.g. 0.1uatom) + --generate-only Build an unsigned transaction and write it to STDOUT (when enabled, the local Keybase only accessed when providing a key name) + -h, --help help for reset-chain-nonces + --keyring-backend string Select keyring's backend (os|file|kwallet|pass|test|memory) + --keyring-dir string The client Keyring directory; if omitted, the default 'home' directory will be used + --ledger Use a connected Ledger device + --node string [host]:[port] to tendermint rpc interface for this chain + --note string Note to add a description to the transaction (previously --memo) + --offline Offline mode (does not allow any online functionality) + -o, --output string Output format (text|json) + -s, --sequence uint The sequence number of the signing account (offline mode only) + --sign-mode string Choose sign mode (direct|amino-json|direct-aux), this is an advanced feature + --timeout-height uint Set a block timeout height to prevent the tx from being committed past a certain height + --tip string Tip is the amount that is going to be transferred to the fee payer on the target chain. This flag is only valid when used with --aux, and is ignored if the target chain didn't enable the TipDecorator + -y, --yes Skip tx broadcasting prompt confirmation +``` + +### Options inherited from parent commands + +``` + --chain-id string The network chain ID + --home string directory for config and data + --log_format string The logging format (json|plain) + --log_level string The logging level (trace|debug|info|warn|error|fatal|panic) + --trace print out full stack trace on errors +``` + +### SEE ALSO + +* [zetacored tx observer](zetacored_tx_observer.md) - observer transactions subcommands + diff --git a/docs/openapi/openapi.swagger.yaml b/docs/openapi/openapi.swagger.yaml index 8e2cb02f21..dc7759c5a2 100644 --- a/docs/openapi/openapi.swagger.yaml +++ b/docs/openapi/openapi.swagger.yaml @@ -54364,6 +54364,8 @@ definitions: type: object observerMsgRemoveChainParamsResponse: type: object + observerMsgResetChainNoncesResponse: + type: object observerMsgUpdateChainParamsResponse: type: object observerMsgUpdateCrosschainFlagsResponse: diff --git a/docs/spec/observer/messages.md b/docs/spec/observer/messages.md index ebf63c3781..6a23e1abbb 100644 --- a/docs/spec/observer/messages.md +++ b/docs/spec/observer/messages.md @@ -108,3 +108,17 @@ message MsgAddBlockHeader { } ``` +## MsgResetChainNonces + +ResetChainNonces handles resetting chain nonces +Authorized: admin policy group 2 (admin update) + +```proto +message MsgResetChainNonces { + string creator = 1; + int64 chain_id = 2; + uint64 chain_nonce_low = 3; + uint64 chain_nonce_high = 4; +} +``` + diff --git a/typescript/observer/tx_pb.d.ts b/typescript/observer/tx_pb.d.ts index 3684b24d01..3543427ae3 100644 --- a/typescript/observer/tx_pb.d.ts +++ b/typescript/observer/tx_pb.d.ts @@ -450,3 +450,61 @@ export declare class MsgUpdateKeygenResponse extends Message | undefined, b: MsgUpdateKeygenResponse | PlainMessage | undefined): boolean; } +/** + * @generated from message zetachain.zetacore.observer.MsgResetChainNonces + */ +export declare class MsgResetChainNonces extends Message { + /** + * @generated from field: string creator = 1; + */ + creator: string; + + /** + * @generated from field: int64 chain_id = 2; + */ + chainId: bigint; + + /** + * @generated from field: uint64 chain_nonce_low = 3; + */ + chainNonceLow: bigint; + + /** + * @generated from field: uint64 chain_nonce_high = 4; + */ + chainNonceHigh: bigint; + + constructor(data?: PartialMessage); + + static readonly runtime: typeof proto3; + static readonly typeName = "zetachain.zetacore.observer.MsgResetChainNonces"; + static readonly fields: FieldList; + + static fromBinary(bytes: Uint8Array, options?: Partial): MsgResetChainNonces; + + static fromJson(jsonValue: JsonValue, options?: Partial): MsgResetChainNonces; + + static fromJsonString(jsonString: string, options?: Partial): MsgResetChainNonces; + + static equals(a: MsgResetChainNonces | PlainMessage | undefined, b: MsgResetChainNonces | PlainMessage | undefined): boolean; +} + +/** + * @generated from message zetachain.zetacore.observer.MsgResetChainNoncesResponse + */ +export declare class MsgResetChainNoncesResponse extends Message { + constructor(data?: PartialMessage); + + static readonly runtime: typeof proto3; + static readonly typeName = "zetachain.zetacore.observer.MsgResetChainNoncesResponse"; + static readonly fields: FieldList; + + static fromBinary(bytes: Uint8Array, options?: Partial): MsgResetChainNoncesResponse; + + static fromJson(jsonValue: JsonValue, options?: Partial): MsgResetChainNoncesResponse; + + static fromJsonString(jsonString: string, options?: Partial): MsgResetChainNoncesResponse; + + static equals(a: MsgResetChainNoncesResponse | PlainMessage | undefined, b: MsgResetChainNoncesResponse | PlainMessage | undefined): boolean; +} + From 9b0be983625aa8edea4ca6afe2e3720e9d8b0e25 Mon Sep 17 00:00:00 2001 From: skosito Date: Tue, 19 Mar 2024 20:17:46 +0100 Subject: [PATCH 4/7] PR comments --- proto/observer/tx.proto | 4 +- .../client/cli/tx_reset_chain_nonces.go | 8 +- .../keeper/msg_server_reset_chain_nonces.go | 9 +- .../msg_server_reset_chain_nonces_test.go | 8 +- .../types/message_reset_chain_nonces.go | 16 +- .../types/message_reset_chain_nonces_test.go | 58 ++++++-- x/observer/types/tx.pb.go | 140 +++++++++--------- 7 files changed, 147 insertions(+), 96 deletions(-) diff --git a/proto/observer/tx.proto b/proto/observer/tx.proto index c1e3b49d9e..85e0ffe9ef 100644 --- a/proto/observer/tx.proto +++ b/proto/observer/tx.proto @@ -93,8 +93,8 @@ message MsgUpdateKeygenResponse {} message MsgResetChainNonces { string creator = 1; int64 chain_id = 2; - uint64 chain_nonce_low = 3; - uint64 chain_nonce_high = 4; + int64 chain_nonce_low = 3; + int64 chain_nonce_high = 4; } message MsgResetChainNoncesResponse {} diff --git a/x/observer/client/cli/tx_reset_chain_nonces.go b/x/observer/client/cli/tx_reset_chain_nonces.go index 9f1c81eccb..01a992bd9e 100644 --- a/x/observer/client/cli/tx_reset_chain_nonces.go +++ b/x/observer/client/cli/tx_reset_chain_nonces.go @@ -27,14 +27,14 @@ func CmdResetChainNonces() *cobra.Command { return err } - // get chainNonceLow as uint64 - chainNonceLow, err := strconv.ParseUint(args[1], 10, 64) + // get chainNonceLow as int64 + chainNonceLow, err := strconv.ParseInt(args[1], 10, 64) if err != nil { return err } - // get chainNonceHigh as uint64 - chainNonceHigh, err := strconv.ParseUint(args[2], 10, 64) + // get chainNonceHigh as int64 + chainNonceHigh, err := strconv.ParseInt(args[2], 10, 64) if err != nil { return err } diff --git a/x/observer/keeper/msg_server_reset_chain_nonces.go b/x/observer/keeper/msg_server_reset_chain_nonces.go index 997e693b20..48a9f59eb4 100644 --- a/x/observer/keeper/msg_server_reset_chain_nonces.go +++ b/x/observer/keeper/msg_server_reset_chain_nonces.go @@ -30,7 +30,8 @@ func (k msgServer) ResetChainNonces(goCtx context.Context, msg *types.MsgResetCh chainNonce := types.ChainNonces{ Index: chain.ChainName.String(), ChainId: chain.ChainId, - Nonce: msg.ChainNonceHigh, + // #nosec G701 always positive + Nonce: uint64(msg.ChainNonceHigh), // #nosec G701 always positive FinalizedHeight: uint64(ctx.BlockHeight()), } @@ -38,10 +39,8 @@ func (k msgServer) ResetChainNonces(goCtx context.Context, msg *types.MsgResetCh // set pending nonces p := types.PendingNonces{ - // #nosec G701 always in the range - NonceLow: int64(msg.ChainNonceLow), - // #nosec G701 always in the range - NonceHigh: int64(msg.ChainNonceHigh), + NonceLow: msg.ChainNonceLow, + NonceHigh: msg.ChainNonceHigh, ChainId: chain.ChainId, Tss: tss.TssPubkey, } diff --git a/x/observer/keeper/msg_server_reset_chain_nonces_test.go b/x/observer/keeper/msg_server_reset_chain_nonces_test.go index fb12c70a1f..9a0c8cd696 100644 --- a/x/observer/keeper/msg_server_reset_chain_nonces_test.go +++ b/x/observer/keeper/msg_server_reset_chain_nonces_test.go @@ -98,8 +98,8 @@ func TestMsgServer_ResetChainNonces(t *testing.T) { _, err := srv.ResetChainNonces(sdk.WrapSDKContext(ctx), &types.MsgResetChainNonces{ Creator: admin, ChainId: chainId, - ChainNonceLow: uint64(nonceLow), - ChainNonceHigh: uint64(nonceHigh), + ChainNonceLow: int64(nonceLow), + ChainNonceHigh: int64(nonceHigh), }) require.NoError(t, err) @@ -121,8 +121,8 @@ func TestMsgServer_ResetChainNonces(t *testing.T) { _, err = srv.ResetChainNonces(sdk.WrapSDKContext(ctx), &types.MsgResetChainNonces{ Creator: admin, ChainId: chainId, - ChainNonceLow: uint64(0), - ChainNonceHigh: uint64(0), + ChainNonceLow: 0, + ChainNonceHigh: 0, }) require.NoError(t, err) diff --git a/x/observer/types/message_reset_chain_nonces.go b/x/observer/types/message_reset_chain_nonces.go index 89bf5698e5..71e438d103 100644 --- a/x/observer/types/message_reset_chain_nonces.go +++ b/x/observer/types/message_reset_chain_nonces.go @@ -1,6 +1,8 @@ package types import ( + "errors" + cosmoserrors "cosmossdk.io/errors" "github.com/zeta-chain/zetacore/common" @@ -12,7 +14,7 @@ const TypeMsgResetChainNonces = "reset_chain_nonces" var _ sdk.Msg = &MsgResetChainNonces{} -func NewMsgResetChainNonces(creator string, chainID int64, chainNonceLow uint64, chainNonceHigh uint64) *MsgResetChainNonces { +func NewMsgResetChainNonces(creator string, chainID int64, chainNonceLow int64, chainNonceHigh int64) *MsgResetChainNonces { return &MsgResetChainNonces{ Creator: creator, ChainId: chainID, @@ -54,5 +56,17 @@ func (msg *MsgResetChainNonces) ValidateBasic() error { return cosmoserrors.Wrapf(sdkerrors.ErrInvalidChainID, "invalid chain id (%d)", msg.ChainId) } + if msg.ChainNonceLow < 0 { + return errors.New("chain nonce low must be greater or equal 0") + } + + if msg.ChainNonceHigh < 0 { + return errors.New("chain nonce high must be greater or equal 0") + } + + if msg.ChainNonceLow > msg.ChainNonceHigh { + return errors.New("chain nonce low must be less or equal than chain nonce high") + } + return nil } diff --git a/x/observer/types/message_reset_chain_nonces_test.go b/x/observer/types/message_reset_chain_nonces_test.go index 21545dc52d..8c79fbf4ea 100644 --- a/x/observer/types/message_reset_chain_nonces_test.go +++ b/x/observer/types/message_reset_chain_nonces_test.go @@ -3,7 +3,6 @@ package types_test import ( "testing" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" "github.com/stretchr/testify/require" "github.com/zeta-chain/zetacore/common" "github.com/zeta-chain/zetacore/testutil/sample" @@ -12,18 +11,29 @@ import ( func TestMsgResetChainNonces_ValidateBasic(t *testing.T) { tests := []struct { - name string - msg types.MsgResetChainNonces - err error + name string + msg types.MsgResetChainNonces + wantErr bool }{ { - name: "valid message", + name: "valid message chain nonce high greater than nonce low", msg: types.MsgResetChainNonces{ Creator: sample.AccAddress(), ChainId: common.ExternalChainList()[0].ChainId, ChainNonceLow: 1, ChainNonceHigh: 5, }, + wantErr: false, + }, + { + name: "valid message chain nonce high same as nonce low", + msg: types.MsgResetChainNonces{ + Creator: sample.AccAddress(), + ChainId: common.ExternalChainList()[0].ChainId, + ChainNonceLow: 1, + ChainNonceHigh: 1, + }, + wantErr: false, }, { name: "invalid address", @@ -31,23 +41,51 @@ func TestMsgResetChainNonces_ValidateBasic(t *testing.T) { Creator: "invalid_address", ChainId: common.ExternalChainList()[0].ChainId, }, - err: sdkerrors.ErrInvalidAddress, + wantErr: true, }, - { name: "invalid chain ID", msg: types.MsgResetChainNonces{ Creator: sample.AccAddress(), ChainId: 999, }, - err: sdkerrors.ErrInvalidChainID, + wantErr: true, + }, + { + name: "invalid chain nonce low", + msg: types.MsgResetChainNonces{ + Creator: sample.AccAddress(), + ChainId: common.ExternalChainList()[0].ChainId, + ChainNonceLow: -1, + }, + wantErr: true, + }, + { + name: "invalid chain nonce high", + msg: types.MsgResetChainNonces{ + Creator: sample.AccAddress(), + ChainId: common.ExternalChainList()[0].ChainId, + ChainNonceLow: 1, + ChainNonceHigh: -1, + }, + wantErr: true, + }, + { + name: "invalid chain nonce low greater than chain nonce high", + msg: types.MsgResetChainNonces{ + Creator: sample.AccAddress(), + ChainId: common.ExternalChainList()[0].ChainId, + ChainNonceLow: 1, + ChainNonceHigh: 0, + }, + wantErr: true, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { err := tt.msg.ValidateBasic() - if tt.err != nil { - require.ErrorIs(t, err, tt.err) + if tt.wantErr { + require.Error(t, err) return } require.NoError(t, err) diff --git a/x/observer/types/tx.pb.go b/x/observer/types/tx.pb.go index 6c73455ae6..481efd0716 100644 --- a/x/observer/types/tx.pb.go +++ b/x/observer/types/tx.pb.go @@ -825,8 +825,8 @@ var xxx_messageInfo_MsgUpdateKeygenResponse proto.InternalMessageInfo type MsgResetChainNonces struct { Creator string `protobuf:"bytes,1,opt,name=creator,proto3" json:"creator,omitempty"` ChainId int64 `protobuf:"varint,2,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` - ChainNonceLow uint64 `protobuf:"varint,3,opt,name=chain_nonce_low,json=chainNonceLow,proto3" json:"chain_nonce_low,omitempty"` - ChainNonceHigh uint64 `protobuf:"varint,4,opt,name=chain_nonce_high,json=chainNonceHigh,proto3" json:"chain_nonce_high,omitempty"` + ChainNonceLow int64 `protobuf:"varint,3,opt,name=chain_nonce_low,json=chainNonceLow,proto3" json:"chain_nonce_low,omitempty"` + ChainNonceHigh int64 `protobuf:"varint,4,opt,name=chain_nonce_high,json=chainNonceHigh,proto3" json:"chain_nonce_high,omitempty"` } func (m *MsgResetChainNonces) Reset() { *m = MsgResetChainNonces{} } @@ -876,14 +876,14 @@ func (m *MsgResetChainNonces) GetChainId() int64 { return 0 } -func (m *MsgResetChainNonces) GetChainNonceLow() uint64 { +func (m *MsgResetChainNonces) GetChainNonceLow() int64 { if m != nil { return m.ChainNonceLow } return 0 } -func (m *MsgResetChainNonces) GetChainNonceHigh() uint64 { +func (m *MsgResetChainNonces) GetChainNonceHigh() int64 { if m != nil { return m.ChainNonceHigh } @@ -950,71 +950,71 @@ func init() { func init() { proto.RegisterFile("observer/tx.proto", fileDescriptor_1bcd40fa296a2b1d) } var fileDescriptor_1bcd40fa296a2b1d = []byte{ - // 1022 bytes of a gzipped FileDescriptorProto + // 1021 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x56, 0xcb, 0x6e, 0xdb, 0x46, - 0x14, 0x35, 0x63, 0xc7, 0xb1, 0xaf, 0x1c, 0x3f, 0x26, 0x76, 0x2c, 0xcb, 0xb1, 0x62, 0x70, 0x51, - 0xa8, 0xad, 0x2b, 0xd9, 0x4a, 0x5b, 0x34, 0x05, 0xba, 0xb0, 0xfb, 0xb0, 0xd5, 0x34, 0xb1, 0x41, - 0xa0, 0x5e, 0x74, 0x43, 0x8c, 0x38, 0x63, 0x92, 0x08, 0x35, 0x23, 0x70, 0xa8, 0xd8, 0x2a, 0xda, - 0x02, 0xfd, 0x80, 0xa2, 0xfd, 0x80, 0xfe, 0x44, 0xff, 0xa1, 0x8b, 0x2c, 0xb3, 0xec, 0xaa, 0x28, - 0xec, 0x55, 0xfb, 0x03, 0xdd, 0x06, 0x1c, 0x92, 0x23, 0x51, 0x94, 0x28, 0xc9, 0x2b, 0x72, 0xe6, - 0x9e, 0x7b, 0xee, 0x63, 0xce, 0x3c, 0x60, 0x8d, 0x37, 0x05, 0xf5, 0x5f, 0x51, 0xbf, 0x16, 0x5c, - 0x55, 0xdb, 0x3e, 0x0f, 0x38, 0xda, 0xfe, 0x9e, 0x06, 0xd8, 0x72, 0xb0, 0xcb, 0xaa, 0xf2, 0x8f, - 0xfb, 0xb4, 0x9a, 0xa0, 0x4a, 0x0f, 0x2c, 0xde, 0x6a, 0x71, 0x56, 0x8b, 0x3e, 0x91, 0x47, 0x69, - 0xdd, 0xe6, 0x36, 0x97, 0xbf, 0xb5, 0xf0, 0x2f, 0x99, 0x55, 0xd4, 0x4d, 0x0f, 0xb7, 0x68, 0x3c, - 0xfb, 0x58, 0xcd, 0x5a, 0x3e, 0x17, 0x42, 0xc6, 0x31, 0x2f, 0x3c, 0x6c, 0x8b, 0x18, 0xb0, 0xa9, - 0x00, 0xc9, 0x4f, 0x6c, 0xd8, 0x50, 0x86, 0x36, 0xf6, 0x71, 0x2b, 0xc1, 0xef, 0xf4, 0xa6, 0x29, - 0x23, 0x2e, 0xb3, 0x4d, 0xc6, 0x99, 0x45, 0x13, 0x33, 0xea, 0x15, 0x28, 0xe2, 0x39, 0xfd, 0x5f, - 0x0d, 0xd6, 0x9e, 0x0b, 0xfb, 0xdb, 0x36, 0xc1, 0x01, 0x3d, 0x8d, 0xed, 0xa8, 0x08, 0xf7, 0x2c, - 0x9f, 0xe2, 0x80, 0xfb, 0x45, 0x6d, 0x57, 0xab, 0x2c, 0x1a, 0xc9, 0x10, 0xed, 0xc3, 0x3a, 0xf7, - 0x88, 0x99, 0x30, 0x99, 0x98, 0x10, 0x9f, 0x0a, 0x51, 0xbc, 0x23, 0x61, 0x88, 0x7b, 0x24, 0x21, - 0x39, 0x8c, 0x2c, 0xa1, 0x07, 0xa3, 0x97, 0x59, 0x8f, 0xd9, 0xc8, 0x83, 0xd1, 0xcb, 0x41, 0x8f, - 0x73, 0xb8, 0xdf, 0x91, 0xf9, 0x98, 0x3e, 0xc5, 0x82, 0xb3, 0xe2, 0xdc, 0xae, 0x56, 0x59, 0xae, - 0x1f, 0x54, 0x73, 0x56, 0xa3, 0x9a, 0x90, 0x44, 0x95, 0x18, 0xd2, 0xd1, 0x58, 0xea, 0xf4, 0x8d, - 0xf4, 0x6d, 0xd8, 0xca, 0x94, 0x6a, 0x50, 0xd1, 0xe6, 0x4c, 0x50, 0xfd, 0x8f, 0xa8, 0x11, 0x87, - 0x84, 0x1c, 0x79, 0xdc, 0x7a, 0x79, 0x42, 0x31, 0xc9, 0x6d, 0xc4, 0x16, 0x2c, 0x44, 0x0b, 0xe6, - 0x12, 0x59, 0xfc, 0xac, 0x71, 0x4f, 0x8e, 0x1b, 0x04, 0xed, 0x00, 0x34, 0x43, 0x0e, 0xd3, 0xc1, - 0xc2, 0x91, 0x75, 0x2e, 0x19, 0x8b, 0x72, 0xe6, 0x04, 0x0b, 0x07, 0x3d, 0x84, 0x79, 0x87, 0xba, - 0xb6, 0x13, 0xc8, 0xba, 0x66, 0x8d, 0x78, 0x84, 0xf6, 0xc3, 0xf9, 0x30, 0x6a, 0xf1, 0xee, 0xae, - 0x56, 0x29, 0xd4, 0x51, 0x35, 0x56, 0x56, 0x94, 0xcb, 0x17, 0x38, 0xc0, 0x47, 0x73, 0xaf, 0xff, - 0x7e, 0x3c, 0x63, 0xc4, 0xb8, 0xb8, 0xa0, 0x74, 0xca, 0xaa, 0xa0, 0x1f, 0x60, 0x5d, 0x55, 0xfb, - 0x79, 0x98, 0xd9, 0x99, 0x94, 0x4a, 0x4e, 0x49, 0x5f, 0x43, 0xc1, 0xea, 0x01, 0x65, 0x55, 0x85, - 0x7a, 0x25, 0xb7, 0xeb, 0x7d, 0xc4, 0x46, 0xbf, 0xb3, 0x5e, 0x86, 0x47, 0xc3, 0xa2, 0xab, 0xec, - 0x9e, 0xc9, 0xec, 0x0c, 0xda, 0xe2, 0xaf, 0x26, 0xcc, 0x6e, 0x74, 0xc3, 0xe3, 0x60, 0x19, 0x32, - 0x15, 0xec, 0x4f, 0x0d, 0x96, 0xa3, 0x46, 0x4d, 0xa0, 0xf0, 0x77, 0x61, 0x75, 0x84, 0xba, 0x57, - 0xf8, 0x80, 0x50, 0x3f, 0x85, 0x2d, 0xd9, 0x12, 0xcf, 0xa5, 0x2c, 0x30, 0x6d, 0x1f, 0xb3, 0x80, - 0x52, 0xb3, 0xdd, 0x69, 0xbe, 0xa4, 0xdd, 0x58, 0xdf, 0x9b, 0x3d, 0xc0, 0x71, 0x64, 0x3f, 0x93, - 0x66, 0x74, 0x00, 0x1b, 0x98, 0x10, 0x93, 0x71, 0x42, 0x4d, 0x6c, 0x59, 0xbc, 0xc3, 0x02, 0x93, - 0x33, 0xaf, 0x2b, 0x45, 0xb1, 0x60, 0x20, 0x4c, 0xc8, 0x0b, 0x4e, 0xe8, 0x61, 0x64, 0x3a, 0x65, - 0x5e, 0x57, 0x2f, 0xc2, 0xc3, 0x74, 0x15, 0xaa, 0xc0, 0x5f, 0x35, 0x58, 0x49, 0x94, 0x80, 0x5b, - 0xf4, 0x9c, 0x07, 0xf4, 0x76, 0xd2, 0x3d, 0x0e, 0xa5, 0x8b, 0x5b, 0xd4, 0x74, 0xd9, 0x05, 0x97, - 0x25, 0x14, 0xea, 0x7a, 0xae, 0x02, 0x64, 0xc0, 0x58, 0x97, 0x8b, 0xd2, 0xb7, 0xc1, 0x2e, 0xb8, - 0xbe, 0x05, 0x9b, 0x03, 0x09, 0xa9, 0x64, 0xff, 0xbf, 0x03, 0xc5, 0x9e, 0x36, 0xd4, 0xc9, 0xf7, - 0x55, 0x78, 0xf0, 0xe5, 0x64, 0xfd, 0x1e, 0xac, 0xba, 0xa2, 0xc1, 0x9a, 0xbc, 0xc3, 0xc8, 0x97, - 0x0c, 0x37, 0x3d, 0x4a, 0x64, 0x82, 0x0b, 0x46, 0x66, 0x1e, 0xed, 0xc1, 0x9a, 0x2b, 0x4e, 0x3b, - 0x41, 0x0a, 0x1c, 0x35, 0x36, 0x6b, 0x40, 0x0e, 0x6c, 0xd8, 0x58, 0x9c, 0xf9, 0xae, 0x45, 0x1b, - 0x2c, 0x0c, 0x27, 0xa8, 0x4c, 0x26, 0xde, 0x87, 0xf5, 0xdc, 0xfa, 0x8f, 0x87, 0x79, 0x1a, 0xc3, - 0x09, 0xd1, 0x8f, 0xf0, 0xa8, 0xd9, 0xdb, 0xaa, 0xe7, 0xd4, 0x77, 0x2f, 0x5c, 0x0b, 0x07, 0x2e, - 0x8f, 0xaa, 0x2f, 0xce, 0xcb, 0x80, 0x4f, 0xc7, 0x34, 0x7c, 0x34, 0x81, 0x91, 0x4b, 0xaf, 0xeb, - 0xb0, 0x3b, 0xaa, 0xf1, 0x6a, 0x75, 0x0e, 0xa5, 0x92, 0x22, 0xcc, 0x33, 0xda, 0xb5, 0x29, 0xcb, - 0x59, 0x93, 0x75, 0xb8, 0x2b, 0x03, 0xc6, 0x32, 0x8a, 0x06, 0xf1, 0xda, 0xf7, 0x53, 0x28, 0xf6, - 0xdf, 0x35, 0x78, 0x20, 0xb7, 0xaa, 0xa0, 0x81, 0xdc, 0xa9, 0x2f, 0xe4, 0x05, 0x75, 0x3b, 0xb1, - 0xbe, 0x03, 0x2b, 0x91, 0x49, 0xde, 0x72, 0xa6, 0xc7, 0x2f, 0xa5, 0x20, 0xe6, 0x8c, 0xfb, 0x96, - 0xa2, 0xfe, 0x86, 0x5f, 0xa2, 0x0a, 0xac, 0xf6, 0xe3, 0x1c, 0xd7, 0x76, 0xa4, 0x18, 0xe6, 0x8c, - 0xe5, 0x1e, 0xf0, 0xc4, 0xb5, 0x1d, 0x7d, 0x07, 0xb6, 0x87, 0x64, 0x97, 0x64, 0x5f, 0xff, 0x6f, - 0x01, 0x66, 0x9f, 0x0b, 0x1b, 0x71, 0x28, 0xf4, 0x9f, 0x25, 0xef, 0xe7, 0xae, 0x57, 0x7a, 0xcb, - 0x96, 0x9e, 0x4c, 0x01, 0x4e, 0x02, 0xa3, 0x2b, 0x58, 0x1e, 0xb8, 0xa1, 0xab, 0xe3, 0x68, 0xd2, - 0xf8, 0xd2, 0xc7, 0xd3, 0xe1, 0x55, 0xe4, 0x9f, 0x35, 0x58, 0xcb, 0xde, 0x21, 0x07, 0x93, 0xb1, - 0xf5, 0xb9, 0x94, 0x9e, 0x4e, 0xed, 0x92, 0xca, 0x21, 0x7b, 0x53, 0x8c, 0xcd, 0x21, 0xe3, 0x32, - 0x3e, 0x87, 0x91, 0x57, 0x08, 0xf2, 0x61, 0x29, 0x75, 0xba, 0xee, 0x4d, 0xb0, 0x8c, 0x0a, 0x5d, - 0xfa, 0x70, 0x1a, 0xb4, 0x8a, 0xf9, 0x8b, 0x06, 0x1b, 0xc3, 0x4f, 0xc9, 0x8f, 0x26, 0x6c, 0x66, - 0xda, 0xad, 0xf4, 0xd9, 0xad, 0xdc, 0xfa, 0x7b, 0x90, 0x3a, 0x17, 0xf6, 0x26, 0xa3, 0x8b, 0xd0, - 0xe3, 0x7b, 0x30, 0xec, 0xc0, 0x08, 0x95, 0x3f, 0xf0, 0x24, 0xab, 0x4e, 0xd4, 0x4b, 0x85, 0x1f, - 0xaf, 0xfc, 0xe1, 0xef, 0x27, 0xf4, 0x13, 0xac, 0x66, 0x8e, 0xa9, 0xfd, 0xf1, 0x02, 0x4a, 0x7b, - 0x94, 0x3e, 0x99, 0xd6, 0x23, 0x89, 0x7f, 0xd4, 0x78, 0x7d, 0x5d, 0xd6, 0xde, 0x5c, 0x97, 0xb5, - 0x7f, 0xae, 0xcb, 0xda, 0x6f, 0x37, 0xe5, 0x99, 0x37, 0x37, 0xe5, 0x99, 0xbf, 0x6e, 0xca, 0x33, - 0xdf, 0xd5, 0x6c, 0x37, 0x70, 0x3a, 0xcd, 0xf0, 0x79, 0x58, 0x0b, 0x39, 0x3f, 0x90, 0xf4, 0xb5, - 0x84, 0xbe, 0x76, 0x55, 0xeb, 0x3d, 0xf4, 0xbb, 0x6d, 0x2a, 0x9a, 0xf3, 0xf2, 0xad, 0xff, 0xe4, - 0x6d, 0x00, 0x00, 0x00, 0xff, 0xff, 0x5b, 0x00, 0x12, 0xf4, 0xe2, 0x0c, 0x00, 0x00, + 0x17, 0x36, 0xa3, 0xc4, 0xb1, 0x8f, 0x1c, 0x5f, 0x26, 0x76, 0x2c, 0xcb, 0xb1, 0x62, 0x70, 0xf1, + 0x43, 0x7f, 0xeb, 0x4a, 0xb6, 0xd2, 0x16, 0x4d, 0x81, 0x2e, 0xec, 0x5e, 0x6c, 0x35, 0x4d, 0x6c, + 0x10, 0xa8, 0x17, 0xdd, 0x10, 0x23, 0xce, 0x98, 0x24, 0x42, 0xcd, 0x08, 0x1c, 0x2a, 0xb6, 0x8a, + 0xb6, 0x40, 0x1f, 0xa0, 0x68, 0x1f, 0xa0, 0x2f, 0xd1, 0x77, 0xe8, 0x22, 0xcb, 0x2c, 0xbb, 0x2a, + 0x0a, 0x7b, 0xd5, 0xbe, 0x40, 0xb7, 0x05, 0x87, 0xe4, 0x48, 0x14, 0x25, 0x4a, 0xf2, 0x8a, 0x9c, + 0x39, 0xdf, 0xf9, 0xce, 0x65, 0xbe, 0xb9, 0xc0, 0x1a, 0x6f, 0x09, 0xea, 0xbf, 0xa6, 0x7e, 0x3d, + 0xb8, 0xaa, 0x75, 0x7c, 0x1e, 0x70, 0xb4, 0xfd, 0x2d, 0x0d, 0xb0, 0xe5, 0x60, 0x97, 0xd5, 0xe4, + 0x1f, 0xf7, 0x69, 0x2d, 0x41, 0x95, 0x1f, 0x5a, 0xbc, 0xdd, 0xe6, 0xac, 0x1e, 0x7d, 0x22, 0x8f, + 0xf2, 0xba, 0xcd, 0x6d, 0x2e, 0x7f, 0xeb, 0xe1, 0x5f, 0x32, 0xab, 0xa8, 0x5b, 0x1e, 0x6e, 0xd3, + 0x78, 0xf6, 0x89, 0x9a, 0xb5, 0x7c, 0x2e, 0x84, 0x8c, 0x63, 0x5e, 0x78, 0xd8, 0x16, 0x31, 0x60, + 0x53, 0x01, 0x92, 0x9f, 0xd8, 0xb0, 0xa1, 0x0c, 0x1d, 0xec, 0xe3, 0x76, 0x82, 0xdf, 0xe9, 0x4f, + 0x53, 0x46, 0x5c, 0x66, 0x9b, 0x8c, 0x33, 0x8b, 0x26, 0x66, 0xd4, 0x2f, 0x50, 0xc4, 0x73, 0xfa, + 0xdf, 0x1a, 0xac, 0xbd, 0x10, 0xf6, 0xd7, 0x1d, 0x82, 0x03, 0x7a, 0x1a, 0xdb, 0x51, 0x09, 0xee, + 0x5b, 0x3e, 0xc5, 0x01, 0xf7, 0x4b, 0xda, 0xae, 0x56, 0x5d, 0x34, 0x92, 0x21, 0xda, 0x87, 0x75, + 0xee, 0x11, 0x33, 0x61, 0x32, 0x31, 0x21, 0x3e, 0x15, 0xa2, 0x74, 0x47, 0xc2, 0x10, 0xf7, 0x48, + 0x42, 0x72, 0x18, 0x59, 0x42, 0x0f, 0x46, 0x2f, 0xb3, 0x1e, 0x85, 0xc8, 0x83, 0xd1, 0xcb, 0x61, + 0x8f, 0x73, 0x78, 0xd0, 0x95, 0xf9, 0x98, 0x3e, 0xc5, 0x82, 0xb3, 0xd2, 0xdd, 0x5d, 0xad, 0xba, + 0xdc, 0x38, 0xa8, 0xe5, 0xac, 0x46, 0x2d, 0x21, 0x89, 0x2a, 0x31, 0xa4, 0xa3, 0xb1, 0xd4, 0x1d, + 0x18, 0xe9, 0xdb, 0xb0, 0x95, 0x29, 0xd5, 0xa0, 0xa2, 0xc3, 0x99, 0xa0, 0xfa, 0x6f, 0x51, 0x23, + 0x0e, 0x09, 0x39, 0xf2, 0xb8, 0xf5, 0xea, 0x84, 0x62, 0x92, 0xdb, 0x88, 0x2d, 0x58, 0x88, 0x16, + 0xcc, 0x25, 0xb2, 0xf8, 0x82, 0x71, 0x5f, 0x8e, 0x9b, 0x04, 0xed, 0x00, 0xb4, 0x42, 0x0e, 0xd3, + 0xc1, 0xc2, 0x91, 0x75, 0x2e, 0x19, 0x8b, 0x72, 0xe6, 0x04, 0x0b, 0x07, 0x3d, 0x82, 0x79, 0x87, + 0xba, 0xb6, 0x13, 0xc8, 0xba, 0x0a, 0x46, 0x3c, 0x42, 0xfb, 0xe1, 0x7c, 0x18, 0xb5, 0x74, 0x6f, + 0x57, 0xab, 0x16, 0x1b, 0xa8, 0x16, 0x2b, 0x2b, 0xca, 0xe5, 0x33, 0x1c, 0xe0, 0xa3, 0xbb, 0x6f, + 0xfe, 0x7c, 0x32, 0x67, 0xc4, 0xb8, 0xb8, 0xa0, 0x74, 0xca, 0xaa, 0xa0, 0xef, 0x60, 0x5d, 0x55, + 0xfb, 0x69, 0x98, 0xd9, 0x99, 0x94, 0x4a, 0x4e, 0x49, 0x5f, 0x42, 0xd1, 0xea, 0x03, 0x65, 0x55, + 0xc5, 0x46, 0x35, 0xb7, 0xeb, 0x03, 0xc4, 0xc6, 0xa0, 0xb3, 0x5e, 0x81, 0xc7, 0xa3, 0xa2, 0xab, + 0xec, 0x9e, 0xcb, 0xec, 0x0c, 0xda, 0xe6, 0xaf, 0xa7, 0xcc, 0x6e, 0x7c, 0xc3, 0xe3, 0x60, 0x19, + 0x32, 0x15, 0xec, 0x77, 0x0d, 0x96, 0xa3, 0x46, 0x4d, 0xa1, 0xf0, 0xff, 0xc3, 0xea, 0x18, 0x75, + 0xaf, 0xf0, 0x21, 0xa1, 0x7e, 0x0c, 0x5b, 0xb2, 0x25, 0x9e, 0x4b, 0x59, 0x60, 0xda, 0x3e, 0x66, + 0x01, 0xa5, 0x66, 0xa7, 0xdb, 0x7a, 0x45, 0x7b, 0xb1, 0xbe, 0x37, 0xfb, 0x80, 0xe3, 0xc8, 0x7e, + 0x26, 0xcd, 0xe8, 0x00, 0x36, 0x30, 0x21, 0x26, 0xe3, 0x84, 0x9a, 0xd8, 0xb2, 0x78, 0x97, 0x05, + 0x26, 0x67, 0x5e, 0x4f, 0x8a, 0x62, 0xc1, 0x40, 0x98, 0x90, 0x97, 0x9c, 0xd0, 0xc3, 0xc8, 0x74, + 0xca, 0xbc, 0x9e, 0x5e, 0x82, 0x47, 0xe9, 0x2a, 0x54, 0x81, 0x3f, 0x6b, 0xb0, 0x92, 0x28, 0x01, + 0xb7, 0xe9, 0x39, 0x0f, 0xe8, 0xed, 0xa4, 0x7b, 0x1c, 0x4a, 0x17, 0xb7, 0xa9, 0xe9, 0xb2, 0x0b, + 0x2e, 0x4b, 0x28, 0x36, 0xf4, 0x5c, 0x05, 0xc8, 0x80, 0xb1, 0x2e, 0x17, 0xa5, 0x6f, 0x93, 0x5d, + 0x70, 0x7d, 0x0b, 0x36, 0x87, 0x12, 0x52, 0xc9, 0xfe, 0x7b, 0x07, 0x4a, 0x7d, 0x6d, 0xa8, 0x93, + 0xef, 0x8b, 0xf0, 0xe0, 0xcb, 0xc9, 0xfa, 0x1d, 0x58, 0x75, 0x45, 0x93, 0xb5, 0x78, 0x97, 0x91, + 0xcf, 0x19, 0x6e, 0x79, 0x94, 0xc8, 0x04, 0x17, 0x8c, 0xcc, 0x3c, 0xda, 0x83, 0x35, 0x57, 0x9c, + 0x76, 0x83, 0x14, 0x38, 0x6a, 0x6c, 0xd6, 0x80, 0x1c, 0xd8, 0xb0, 0xb1, 0x38, 0xf3, 0x5d, 0x8b, + 0x36, 0x59, 0x18, 0x4e, 0x50, 0x99, 0x4c, 0xbc, 0x0f, 0x1b, 0xb9, 0xf5, 0x1f, 0x8f, 0xf2, 0x34, + 0x46, 0x13, 0xa2, 0xef, 0xe1, 0x71, 0xab, 0xbf, 0x55, 0xcf, 0xa9, 0xef, 0x5e, 0xb8, 0x16, 0x0e, + 0x5c, 0x1e, 0x55, 0x5f, 0x9a, 0x97, 0x01, 0x9f, 0x4d, 0x68, 0xf8, 0x78, 0x02, 0x23, 0x97, 0x5e, + 0xd7, 0x61, 0x77, 0x5c, 0xe3, 0xd5, 0xea, 0x1c, 0x4a, 0x25, 0x45, 0x98, 0xe7, 0xb4, 0x67, 0x53, + 0x96, 0xb3, 0x26, 0xeb, 0x70, 0x4f, 0x06, 0x8c, 0x65, 0x14, 0x0d, 0xe2, 0xb5, 0x1f, 0xa4, 0x50, + 0xec, 0xbf, 0x6a, 0xf0, 0x50, 0x6e, 0x55, 0x41, 0x03, 0xb9, 0x53, 0x5f, 0xca, 0x0b, 0xea, 0x76, + 0x62, 0xfd, 0x1f, 0xac, 0x44, 0x26, 0x79, 0xcb, 0x99, 0x1e, 0xbf, 0x94, 0x82, 0x28, 0x18, 0x0f, + 0x2c, 0x45, 0xfd, 0x15, 0xbf, 0x44, 0x55, 0x58, 0x1d, 0xc4, 0x39, 0xae, 0xed, 0xc4, 0x47, 0xef, + 0x72, 0x1f, 0x78, 0xe2, 0xda, 0x8e, 0xbe, 0x03, 0xdb, 0x23, 0xb2, 0x4b, 0xb2, 0x6f, 0xfc, 0xb3, + 0x00, 0x85, 0x17, 0xc2, 0x46, 0x1c, 0x8a, 0x83, 0x67, 0xc9, 0xbb, 0xb9, 0xeb, 0x95, 0xde, 0xb2, + 0xe5, 0xa7, 0x33, 0x80, 0x93, 0xc0, 0xe8, 0x0a, 0x96, 0x87, 0x6e, 0xe8, 0xda, 0x24, 0x9a, 0x34, + 0xbe, 0xfc, 0xe1, 0x6c, 0x78, 0x15, 0xf9, 0x47, 0x0d, 0xd6, 0xb2, 0x77, 0xc8, 0xc1, 0x74, 0x6c, + 0x03, 0x2e, 0xe5, 0x67, 0x33, 0xbb, 0xa4, 0x72, 0xc8, 0xde, 0x14, 0x13, 0x73, 0xc8, 0xb8, 0x4c, + 0xce, 0x61, 0xec, 0x15, 0x82, 0x7c, 0x58, 0x4a, 0x9d, 0xae, 0x7b, 0x53, 0x2c, 0xa3, 0x42, 0x97, + 0xdf, 0x9f, 0x05, 0xad, 0x62, 0xfe, 0xa4, 0xc1, 0xc6, 0xe8, 0x53, 0xf2, 0x83, 0x29, 0x9b, 0x99, + 0x76, 0x2b, 0x7f, 0x72, 0x2b, 0xb7, 0xc1, 0x1e, 0xa4, 0xce, 0x85, 0xbd, 0xe9, 0xe8, 0x22, 0xf4, + 0xe4, 0x1e, 0x8c, 0x3a, 0x30, 0x42, 0xe5, 0x0f, 0x3d, 0xc9, 0x6a, 0x53, 0xf5, 0x52, 0xe1, 0x27, + 0x2b, 0x7f, 0xf4, 0xfb, 0x09, 0xfd, 0x00, 0xab, 0x99, 0x63, 0x6a, 0x7f, 0xb2, 0x80, 0xd2, 0x1e, + 0xe5, 0x8f, 0x66, 0xf5, 0x48, 0xe2, 0x1f, 0x35, 0xdf, 0x5c, 0x57, 0xb4, 0xb7, 0xd7, 0x15, 0xed, + 0xaf, 0xeb, 0x8a, 0xf6, 0xcb, 0x4d, 0x65, 0xee, 0xed, 0x4d, 0x65, 0xee, 0x8f, 0x9b, 0xca, 0xdc, + 0x37, 0x75, 0xdb, 0x0d, 0x9c, 0x6e, 0x2b, 0x7c, 0x1e, 0xd6, 0x43, 0xce, 0xf7, 0x24, 0x7d, 0x3d, + 0xa1, 0xaf, 0x5f, 0xd5, 0xfb, 0x0f, 0xfd, 0x5e, 0x87, 0x8a, 0xd6, 0xbc, 0x7c, 0xeb, 0x3f, 0xfd, + 0x2f, 0x00, 0x00, 0xff, 0xff, 0xd0, 0xc2, 0x64, 0xda, 0xe2, 0x0c, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -3975,7 +3975,7 @@ func (m *MsgResetChainNonces) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.ChainNonceLow |= uint64(b&0x7F) << shift + m.ChainNonceLow |= int64(b&0x7F) << shift if b < 0x80 { break } @@ -3994,7 +3994,7 @@ func (m *MsgResetChainNonces) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.ChainNonceHigh |= uint64(b&0x7F) << shift + m.ChainNonceHigh |= int64(b&0x7F) << shift if b < 0x80 { break } From 4a3c832f939665bdeff4faa9223222064575d6f7 Mon Sep 17 00:00:00 2001 From: skosito Date: Tue, 19 Mar 2024 20:33:15 +0100 Subject: [PATCH 5/7] Make generate --- docs/spec/observer/messages.md | 4 ++-- typescript/observer/tx_pb.d.ts | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/spec/observer/messages.md b/docs/spec/observer/messages.md index 6a23e1abbb..dfa2d3d1de 100644 --- a/docs/spec/observer/messages.md +++ b/docs/spec/observer/messages.md @@ -117,8 +117,8 @@ Authorized: admin policy group 2 (admin update) message MsgResetChainNonces { string creator = 1; int64 chain_id = 2; - uint64 chain_nonce_low = 3; - uint64 chain_nonce_high = 4; + int64 chain_nonce_low = 3; + int64 chain_nonce_high = 4; } ``` diff --git a/typescript/observer/tx_pb.d.ts b/typescript/observer/tx_pb.d.ts index 3543427ae3..4f7a346cc2 100644 --- a/typescript/observer/tx_pb.d.ts +++ b/typescript/observer/tx_pb.d.ts @@ -465,12 +465,12 @@ export declare class MsgResetChainNonces extends Message { chainId: bigint; /** - * @generated from field: uint64 chain_nonce_low = 3; + * @generated from field: int64 chain_nonce_low = 3; */ chainNonceLow: bigint; /** - * @generated from field: uint64 chain_nonce_high = 4; + * @generated from field: int64 chain_nonce_high = 4; */ chainNonceHigh: bigint; From d57c28b92b87f81174a60046adef9d2e8c4114e6 Mon Sep 17 00:00:00 2001 From: skosito Date: Wed, 20 Mar 2024 20:36:21 +0100 Subject: [PATCH 6/7] Use authority keeper and fix tests --- .../keeper/msg_server_reset_chain_nonces.go | 3 +- .../msg_server_reset_chain_nonces_test.go | 43 +++++++++++-------- 2 files changed, 26 insertions(+), 20 deletions(-) diff --git a/x/observer/keeper/msg_server_reset_chain_nonces.go b/x/observer/keeper/msg_server_reset_chain_nonces.go index 48a9f59eb4..b3d1731645 100644 --- a/x/observer/keeper/msg_server_reset_chain_nonces.go +++ b/x/observer/keeper/msg_server_reset_chain_nonces.go @@ -5,6 +5,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/zeta-chain/zetacore/common" + authoritytypes "github.com/zeta-chain/zetacore/x/authority/types" "github.com/zeta-chain/zetacore/x/observer/types" ) @@ -12,7 +13,7 @@ import ( // Authorized: admin policy group 2 (admin update) func (k msgServer) ResetChainNonces(goCtx context.Context, msg *types.MsgResetChainNonces) (*types.MsgResetChainNoncesResponse, error) { ctx := sdk.UnwrapSDKContext(goCtx) - if msg.Creator != k.GetParams(ctx).GetAdminPolicyAccount(types.Policy_Type_group2) { + if !k.GetAuthorityKeeper().IsAuthorized(ctx, msg.Creator, authoritytypes.PolicyType_groupAdmin) { return &types.MsgResetChainNoncesResponse{}, types.ErrNotAuthorizedPolicy } diff --git a/x/observer/keeper/msg_server_reset_chain_nonces_test.go b/x/observer/keeper/msg_server_reset_chain_nonces_test.go index 9a0c8cd696..46da328fe8 100644 --- a/x/observer/keeper/msg_server_reset_chain_nonces_test.go +++ b/x/observer/keeper/msg_server_reset_chain_nonces_test.go @@ -8,30 +8,25 @@ import ( "github.com/zeta-chain/zetacore/common" keepertest "github.com/zeta-chain/zetacore/testutil/keeper" "github.com/zeta-chain/zetacore/testutil/sample" + authoritytypes "github.com/zeta-chain/zetacore/x/authority/types" "github.com/zeta-chain/zetacore/x/observer/keeper" "github.com/zeta-chain/zetacore/x/observer/types" ) func TestMsgServer_ResetChainNonces(t *testing.T) { t.Run("cannot reset chain nonces if not authorized", func(t *testing.T) { - k, ctx := keepertest.ObserverKeeper(t) + k, ctx, _, _ := keepertest.ObserverKeeperWithMocks(t, keepertest.ObserverMockOptions{ + UseAuthorityMock: true, + }) srv := keeper.NewMsgServerImpl(*k) - chainId := common.GoerliLocalnetChain().ChainId - _, err := srv.ResetChainNonces(sdk.WrapSDKContext(ctx), &types.MsgResetChainNonces{ - Creator: sample.AccAddress(), - ChainId: chainId, - ChainNonceLow: 1, - ChainNonceHigh: 5, - }) - require.ErrorIs(t, err, types.ErrNotAuthorizedPolicy) - // group 1 should not be able to reset chain nonces admin := sample.AccAddress() - setAdminCrossChainFlags(ctx, k, admin, types.Policy_Type_group1) + authorityMock := keepertest.GetObserverAuthorityMock(t, k) + keepertest.MockIsAuthorized(&authorityMock.Mock, admin, authoritytypes.PolicyType_groupAdmin, false) - _, err = srv.ResetChainNonces(sdk.WrapSDKContext(ctx), &types.MsgResetChainNonces{ - Creator: sample.AccAddress(), + _, err := srv.ResetChainNonces(sdk.WrapSDKContext(ctx), &types.MsgResetChainNonces{ + Creator: admin, ChainId: chainId, ChainNonceLow: 1, ChainNonceHigh: 5, @@ -40,11 +35,14 @@ func TestMsgServer_ResetChainNonces(t *testing.T) { }) t.Run("cannot reset chain nonces if tss not found", func(t *testing.T) { - k, ctx := keepertest.ObserverKeeper(t) + k, ctx, _, _ := keepertest.ObserverKeeperWithMocks(t, keepertest.ObserverMockOptions{ + UseAuthorityMock: true, + }) srv := keeper.NewMsgServerImpl(*k) admin := sample.AccAddress() - setAdminCrossChainFlags(ctx, k, admin, types.Policy_Type_group2) + authorityMock := keepertest.GetObserverAuthorityMock(t, k) + keepertest.MockIsAuthorized(&authorityMock.Mock, admin, authoritytypes.PolicyType_groupAdmin, true) chainId := common.GoerliLocalnetChain().ChainId _, err := srv.ResetChainNonces(sdk.WrapSDKContext(ctx), &types.MsgResetChainNonces{ @@ -57,13 +55,16 @@ func TestMsgServer_ResetChainNonces(t *testing.T) { }) t.Run("cannot reset chain nonces if chain not supported", func(t *testing.T) { - k, ctx := keepertest.ObserverKeeper(t) + k, ctx, _, _ := keepertest.ObserverKeeperWithMocks(t, keepertest.ObserverMockOptions{ + UseAuthorityMock: true, + }) srv := keeper.NewMsgServerImpl(*k) tss := sample.Tss() k.SetTSS(ctx, tss) admin := sample.AccAddress() - setAdminCrossChainFlags(ctx, k, admin, types.Policy_Type_group2) + authorityMock := keepertest.GetObserverAuthorityMock(t, k) + keepertest.MockIsAuthorized(&authorityMock.Mock, admin, authoritytypes.PolicyType_groupAdmin, true) _, err := srv.ResetChainNonces(sdk.WrapSDKContext(ctx), &types.MsgResetChainNonces{ Creator: admin, @@ -75,13 +76,17 @@ func TestMsgServer_ResetChainNonces(t *testing.T) { }) t.Run("can reset chain nonces", func(t *testing.T) { - k, ctx := keepertest.ObserverKeeper(t) + k, ctx, _, _ := keepertest.ObserverKeeperWithMocks(t, keepertest.ObserverMockOptions{ + UseAuthorityMock: true, + }) srv := keeper.NewMsgServerImpl(*k) tss := sample.Tss() k.SetTSS(ctx, tss) admin := sample.AccAddress() - setAdminCrossChainFlags(ctx, k, admin, types.Policy_Type_group2) + authorityMock := keepertest.GetObserverAuthorityMock(t, k) + keepertest.MockIsAuthorized(&authorityMock.Mock, admin, authoritytypes.PolicyType_groupAdmin, true) + keepertest.MockIsAuthorized(&authorityMock.Mock, admin, authoritytypes.PolicyType_groupAdmin, true) chainId := common.GoerliLocalnetChain().ChainId index := common.GoerliLocalnetChain().ChainName.String() From 9c772147dbd8358480f8d76fa0cbeec17d6e2ed6 Mon Sep 17 00:00:00 2001 From: skosito Date: Thu, 21 Mar 2024 12:28:11 +0100 Subject: [PATCH 7/7] PR comments --- changelog.md | 4 +-- .../types/message_reset_chain_nonces_test.go | 34 +++++++++++++++++++ 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/changelog.md b/changelog.md index 62d684c3a7..b485c3438c 100644 --- a/changelog.md +++ b/changelog.md @@ -57,13 +57,13 @@ * [1891](https://github.com/zeta-chain/node/pull/1891) - fix typo that was introduced to docker-compose and a typo in start.sh for the docker start script for full nodes. * [1894](https://github.com/zeta-chain/node/pull/1894) - added download binaries and configs to the start sequence so it will download binaries that don't exist -## Version: v15 +## Version: v15.0.0 ### Features *[1912](https://github.com/zeta-chain/node/pull/1912) - add reset chain nonces msg -## Version: v14 +## Version: v14.0.1 - [1817](https://github.com/zeta-chain/node/pull/1817) - Add migration script to fix pending and chain nonces on testnet diff --git a/x/observer/types/message_reset_chain_nonces_test.go b/x/observer/types/message_reset_chain_nonces_test.go index 8c79fbf4ea..7043432952 100644 --- a/x/observer/types/message_reset_chain_nonces_test.go +++ b/x/observer/types/message_reset_chain_nonces_test.go @@ -3,6 +3,7 @@ package types_test import ( "testing" + sdk "github.com/cosmos/cosmos-sdk/types" "github.com/stretchr/testify/require" "github.com/zeta-chain/zetacore/common" "github.com/zeta-chain/zetacore/testutil/sample" @@ -93,6 +94,39 @@ func TestMsgResetChainNonces_ValidateBasic(t *testing.T) { } } +func TestMsgResetChainNonces_GetSigners(t *testing.T) { + signer := sample.AccAddress() + tests := []struct { + name string + msg *types.MsgResetChainNonces + panics bool + }{ + { + name: "valid signer", + msg: types.NewMsgResetChainNonces(signer, 5, 1, 5), + panics: false, + }, + { + name: "invalid signer", + msg: types.NewMsgResetChainNonces("invalid", 5, 1, 5), + panics: true, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if !tt.panics { + signers := tt.msg.GetSigners() + require.Equal(t, []sdk.AccAddress{sdk.MustAccAddressFromBech32(signer)}, signers) + } else { + require.Panics(t, func() { + tt.msg.GetSigners() + }) + } + }) + } +} + func TestMsgResetChainNonces_Type(t *testing.T) { msg := types.NewMsgResetChainNonces(sample.AccAddress(), 5, 1, 5) require.Equal(t, types.TypeMsgResetChainNonces, msg.Type())