From 8242bc678943abafdd68e458286c229155a9e0af Mon Sep 17 00:00:00 2001 From: Uncle Bogdan <85982863+freshe4qa@users.noreply.github.com> Date: Tue, 7 Feb 2023 10:30:50 +0200 Subject: [PATCH 01/59] Fix whitespace for Make 4.3 (#303) --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 123435446..00efc4f0d 100644 --- a/Makefile +++ b/Makefile @@ -61,7 +61,7 @@ ifeq (secp,$(findstring secp,$(BABYLON_BUILD_OPTIONS))) endif whitespace := -whitespace += $(whitespace) +whitespace := $(whitespace) $(whitespace) comma := , build_tags_comma_sep := $(subst $(whitespace),$(comma),$(build_tags)) From a5b42bfec18afe83cbcecbabfa35aa1834640983 Mon Sep 17 00:00:00 2001 From: Runchao Han Date: Wed, 15 Feb 2023 10:34:10 +1100 Subject: [PATCH 02/59] fix: remove `start_epoch` and `end_epoch` parameters in APIs (#305) --- client/docs/swagger-ui/swagger.yaml | 20 --- proto/babylon/btccheckpoint/query.proto | 5 +- proto/babylon/epoching/v1/query.proto | 5 +- x/btccheckpoint/keeper/grpc_query.go | 13 -- x/btccheckpoint/types/query.pb.go | 156 +++++------------- x/epoching/keeper/grpc_query.go | 14 -- x/epoching/keeper/grpc_query_test.go | 37 ----- x/epoching/types/query.pb.go | 211 ++++++++---------------- 8 files changed, 114 insertions(+), 347 deletions(-) diff --git a/client/docs/swagger-ui/swagger.yaml b/client/docs/swagger-ui/swagger.yaml index a4c2ae549..5cba57a67 100644 --- a/client/docs/swagger-ui/swagger.yaml +++ b/client/docs/swagger-ui/swagger.yaml @@ -110,16 +110,6 @@ paths: type: string format: byte parameters: - - name: start_epoch - in: query - required: false - type: string - format: uint64 - - name: end_epoch - in: query - required: false - type: string - format: uint64 - name: pagination.key description: |- key is a value returned in PageResponse.next_key to begin @@ -1875,16 +1865,6 @@ paths: "value": "1.212s" } parameters: - - name: start_epoch - in: query - required: false - type: string - format: uint64 - - name: end_epoch - in: query - required: false - type: string - format: uint64 - name: pagination.key description: |- key is a value returned in PageResponse.next_key to begin diff --git a/proto/babylon/btccheckpoint/query.proto b/proto/babylon/btccheckpoint/query.proto index 6cad44bab..8788178be 100644 --- a/proto/babylon/btccheckpoint/query.proto +++ b/proto/babylon/btccheckpoint/query.proto @@ -52,11 +52,8 @@ message QueryBtcCheckpointInfoResponse { // QueryBtcCheckpointsInfoRequest is request type for the Query/BtcCheckpointsInfo RPC method message QueryBtcCheckpointsInfoRequest { - uint64 start_epoch = 1; - uint64 end_epoch = 2; - // pagination defines whether to have the pagination in the request - cosmos.base.query.v1beta1.PageRequest pagination = 3; + cosmos.base.query.v1beta1.PageRequest pagination = 1; } // QueryBtcCheckpointsInfoResponse is response type for the Query/BtcCheckpointsInfo RPC method diff --git a/proto/babylon/epoching/v1/query.proto b/proto/babylon/epoching/v1/query.proto index 18fcead52..7a8f01d87 100644 --- a/proto/babylon/epoching/v1/query.proto +++ b/proto/babylon/epoching/v1/query.proto @@ -77,11 +77,8 @@ message QueryEpochInfoResponse { } message QueryEpochsInfoRequest { - uint64 start_epoch = 1; - uint64 end_epoch = 2; - // pagination defines whether to have the pagination in the request - cosmos.base.query.v1beta1.PageRequest pagination = 3; + cosmos.base.query.v1beta1.PageRequest pagination = 1; } message QueryEpochsInfoResponse { diff --git a/x/btccheckpoint/keeper/grpc_query.go b/x/btccheckpoint/keeper/grpc_query.go index 3b1834d51..1c7108809 100644 --- a/x/btccheckpoint/keeper/grpc_query.go +++ b/x/btccheckpoint/keeper/grpc_query.go @@ -121,19 +121,6 @@ func (k Keeper) BtcCheckpointsInfo(c context.Context, req *types.QueryBtcCheckpo ctx := sdk.UnwrapSDKContext(c) - // parse start_epoch and end_epoch and forward to the pagination request - if req.EndEpoch > 0 { - // this query uses start_epoch and end_epoch to specify range - if req.StartEpoch > req.EndEpoch { - return nil, fmt.Errorf("StartEpoch (%d) should not be larger than EndEpoch (%d)", req.StartEpoch, req.EndEpoch) - } - req.Pagination = &query.PageRequest{ - Key: sdk.Uint64ToBigEndian(req.StartEpoch), - Limit: req.EndEpoch - req.StartEpoch + 1, - Reverse: false, - } - } - store := ctx.KVStore(k.storeKey) epochDataStore := prefix.NewStore(store, types.EpochDataPrefix) diff --git a/x/btccheckpoint/types/query.pb.go b/x/btccheckpoint/types/query.pb.go index c1227dbfd..f5a98260e 100644 --- a/x/btccheckpoint/types/query.pb.go +++ b/x/btccheckpoint/types/query.pb.go @@ -205,10 +205,8 @@ func (m *QueryBtcCheckpointInfoResponse) GetInfo() *BTCCheckpointInfo { // QueryBtcCheckpointsInfoRequest is request type for the Query/BtcCheckpointsInfo RPC method type QueryBtcCheckpointsInfoRequest struct { - StartEpoch uint64 `protobuf:"varint,1,opt,name=start_epoch,json=startEpoch,proto3" json:"start_epoch,omitempty"` - EndEpoch uint64 `protobuf:"varint,2,opt,name=end_epoch,json=endEpoch,proto3" json:"end_epoch,omitempty"` // pagination defines whether to have the pagination in the request - Pagination *query.PageRequest `protobuf:"bytes,3,opt,name=pagination,proto3" json:"pagination,omitempty"` + Pagination *query.PageRequest `protobuf:"bytes,1,opt,name=pagination,proto3" json:"pagination,omitempty"` } func (m *QueryBtcCheckpointsInfoRequest) Reset() { *m = QueryBtcCheckpointsInfoRequest{} } @@ -244,20 +242,6 @@ func (m *QueryBtcCheckpointsInfoRequest) XXX_DiscardUnknown() { var xxx_messageInfo_QueryBtcCheckpointsInfoRequest proto.InternalMessageInfo -func (m *QueryBtcCheckpointsInfoRequest) GetStartEpoch() uint64 { - if m != nil { - return m.StartEpoch - } - return 0 -} - -func (m *QueryBtcCheckpointsInfoRequest) GetEndEpoch() uint64 { - if m != nil { - return m.EndEpoch - } - return 0 -} - func (m *QueryBtcCheckpointsInfoRequest) GetPagination() *query.PageRequest { if m != nil { return m.Pagination @@ -439,48 +423,46 @@ func init() { func init() { proto.RegisterFile("babylon/btccheckpoint/query.proto", fileDescriptor_009c1165ec392ace) } var fileDescriptor_009c1165ec392ace = []byte{ - // 653 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x95, 0x4d, 0x6f, 0xd3, 0x30, - 0x18, 0xc7, 0xeb, 0xae, 0x9b, 0x36, 0xef, 0x02, 0x66, 0x87, 0x92, 0x8d, 0xac, 0x8b, 0x04, 0x1d, - 0x2f, 0x4b, 0xd4, 0x4d, 0x30, 0x26, 0x10, 0x48, 0x9d, 0x78, 0x13, 0x08, 0x46, 0x81, 0x0b, 0x97, - 0xca, 0xc9, 0xbc, 0x34, 0x5a, 0x63, 0x67, 0xb5, 0x53, 0x51, 0x21, 0x2e, 0xf0, 0x01, 0x40, 0xe2, - 0x33, 0xc0, 0x89, 0x23, 0x5c, 0x91, 0xb8, 0xed, 0x38, 0x89, 0x0b, 0x27, 0x84, 0x5a, 0x3e, 0x08, - 0x8a, 0xe3, 0xf5, 0x3d, 0x6a, 0x3b, 0x71, 0xab, 0x9c, 0xe7, 0xef, 0xff, 0xcf, 0x7f, 0x3f, 0x8f, - 0x0b, 0x57, 0x6c, 0x6c, 0x37, 0xaa, 0x8c, 0x5a, 0xb6, 0x70, 0x9c, 0x0a, 0x71, 0xf6, 0x03, 0xe6, - 0x51, 0x61, 0x1d, 0x84, 0xa4, 0xd6, 0x30, 0x83, 0x1a, 0x13, 0x0c, 0x65, 0x55, 0x89, 0xd9, 0x53, - 0x62, 0xd6, 0x0b, 0xda, 0x82, 0xcb, 0x5c, 0x26, 0x8b, 0xac, 0xe8, 0x57, 0x5c, 0xaf, 0x2d, 0xb9, - 0x8c, 0xb9, 0x55, 0x62, 0xe1, 0xc0, 0xb3, 0x30, 0xa5, 0x4c, 0x60, 0xe1, 0x31, 0xca, 0xd5, 0xd7, - 0x4b, 0x0e, 0xe3, 0x3e, 0xe3, 0x96, 0x8d, 0x39, 0x89, 0x6d, 0xac, 0x7a, 0xc1, 0x26, 0x02, 0x17, - 0xac, 0x00, 0xbb, 0x1e, 0x95, 0xc5, 0xaa, 0xd6, 0x18, 0x0e, 0x17, 0xe0, 0x1a, 0xf6, 0x8f, 0xf7, - 0xbb, 0x38, 0xbc, 0xa6, 0x97, 0x55, 0x96, 0x1a, 0x0b, 0x10, 0x3d, 0x8d, 0x0c, 0x77, 0xa4, 0xbe, - 0x44, 0x0e, 0x42, 0xc2, 0x85, 0xf1, 0x02, 0x9e, 0xe9, 0x59, 0xe5, 0x01, 0xa3, 0x9c, 0xa0, 0x5b, - 0x70, 0x26, 0xf6, 0xc9, 0x82, 0x1c, 0x58, 0x9d, 0x5f, 0xcf, 0x99, 0x49, 0x31, 0x98, 0xb1, 0xb2, - 0x98, 0x39, 0xfc, 0xbd, 0x9c, 0x2a, 0x29, 0x95, 0x71, 0x13, 0x9e, 0x93, 0xdb, 0x16, 0x85, 0xb3, - 0xdd, 0xae, 0x7e, 0x40, 0xf7, 0x98, 0xf2, 0x45, 0x8b, 0x70, 0x8e, 0x04, 0xcc, 0xa9, 0x94, 0x69, - 0xe8, 0x4b, 0x8f, 0x4c, 0x69, 0x56, 0x2e, 0x3c, 0x0e, 0x7d, 0x03, 0x43, 0x3d, 0x49, 0xad, 0xf8, - 0x6e, 0xc3, 0x8c, 0x47, 0xf7, 0x98, 0xa2, 0xbb, 0x9c, 0x4c, 0x57, 0x7c, 0xbe, 0xdd, 0xb7, 0x85, - 0x14, 0x1a, 0x9f, 0xc1, 0x30, 0x0f, 0xde, 0x8d, 0xb8, 0x0c, 0xe7, 0xb9, 0xc0, 0x35, 0x51, 0x96, - 0x5c, 0x0a, 0x12, 0xca, 0xa5, 0x3b, 0xd1, 0x8a, 0x3c, 0x03, 0xdd, 0x55, 0x9f, 0xd3, 0xea, 0x0c, - 0x74, 0x37, 0xfe, 0x78, 0x17, 0xc2, 0xce, 0x8d, 0x66, 0xa7, 0x24, 0xe7, 0x05, 0x33, 0xbe, 0x7e, - 0x33, 0xba, 0x7e, 0x33, 0xee, 0x32, 0x75, 0xfd, 0xe6, 0x0e, 0x76, 0x89, 0x72, 0x2e, 0x75, 0x29, - 0x8d, 0xaf, 0x00, 0x2e, 0x27, 0x82, 0xaa, 0x34, 0xee, 0xc3, 0xb9, 0xe8, 0x50, 0xe5, 0xaa, 0xc7, - 0x45, 0x16, 0xe4, 0xa6, 0x26, 0x8d, 0x64, 0x36, 0x52, 0x3f, 0xf2, 0xb8, 0x40, 0xf7, 0x7a, 0xa8, - 0xd3, 0x92, 0x3a, 0x3f, 0x92, 0x3a, 0xc6, 0xe8, 0xc1, 0x7e, 0x07, 0xe0, 0x92, 0xc4, 0x96, 0x69, - 0x3c, 0x0b, 0x6d, 0xdf, 0xe3, 0x3c, 0x1a, 0x84, 0x71, 0x1a, 0xa0, 0x2f, 0xbc, 0xf4, 0x89, 0xc3, - 0xfb, 0x04, 0x54, 0x1f, 0x0e, 0x52, 0xa8, 0xe8, 0x6e, 0xc0, 0xcc, 0x3e, 0x69, 0x70, 0x95, 0x5a, - 0x3e, 0x39, 0xb5, 0x8e, 0xf8, 0x21, 0x69, 0x94, 0xa4, 0xe8, 0xbf, 0xa5, 0xb5, 0xfe, 0x63, 0x1a, - 0x4e, 0x4b, 0x4e, 0xf4, 0x1e, 0xc0, 0x99, 0x78, 0xa2, 0xd0, 0x95, 0x64, 0x98, 0xc1, 0x41, 0xd6, - 0xd6, 0xc6, 0xac, 0x8e, 0xdd, 0x8d, 0xd5, 0xb7, 0x3f, 0xff, 0x7e, 0x4c, 0x1b, 0x28, 0x67, 0x0d, - 0x7f, 0x41, 0xea, 0x05, 0xf5, 0xd0, 0xa0, 0x6f, 0x00, 0x9e, 0x1e, 0x18, 0x44, 0xb4, 0x39, 0xc2, - 0x2e, 0x69, 0xf0, 0xb5, 0xeb, 0x93, 0x0b, 0x15, 0xf2, 0x9a, 0x44, 0xce, 0xa3, 0xf3, 0xc9, 0xc8, - 0xaf, 0xdb, 0x2d, 0xf5, 0x06, 0x7d, 0x01, 0x10, 0x0d, 0xce, 0x0c, 0x9a, 0xc8, 0xbf, 0xfb, 0x3d, - 0xd0, 0xb6, 0x4e, 0xa0, 0x54, 0xe8, 0x2b, 0x12, 0x7d, 0x11, 0x9d, 0x4d, 0x44, 0x47, 0xdf, 0x01, - 0x3c, 0xd5, 0xdf, 0xa5, 0xe8, 0xda, 0x08, 0xcb, 0x84, 0xe1, 0xd2, 0x36, 0x27, 0xd6, 0x29, 0xd0, - 0x2d, 0x09, 0xba, 0x81, 0x0a, 0x63, 0x65, 0x6c, 0xf1, 0xce, 0x16, 0xc5, 0x27, 0x87, 0x4d, 0x1d, - 0x1c, 0x35, 0x75, 0xf0, 0xa7, 0xa9, 0x83, 0x0f, 0x2d, 0x3d, 0x75, 0xd4, 0xd2, 0x53, 0xbf, 0x5a, - 0x7a, 0xea, 0xe5, 0x55, 0xd7, 0x13, 0x95, 0xd0, 0x36, 0x1d, 0xe6, 0x1f, 0x6f, 0xeb, 0x54, 0xb0, - 0x47, 0xdb, 0x1e, 0xaf, 0xfa, 0x5c, 0x44, 0x23, 0x20, 0xdc, 0x9e, 0x91, 0xff, 0x5b, 0x1b, 0xff, - 0x02, 0x00, 0x00, 0xff, 0xff, 0xb5, 0x86, 0x0a, 0xe9, 0xa5, 0x07, 0x00, 0x00, + // 623 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x95, 0x3d, 0x6f, 0xd3, 0x40, + 0x1c, 0xc6, 0x73, 0x21, 0x8d, 0xda, 0x63, 0x81, 0xa3, 0x43, 0x70, 0x8b, 0x9b, 0x5a, 0x82, 0x94, + 0x97, 0xda, 0x4a, 0x2b, 0x28, 0x15, 0x08, 0xa4, 0x54, 0xbc, 0x09, 0x04, 0x25, 0xc0, 0xc2, 0x52, + 0x9d, 0xad, 0xab, 0x63, 0x35, 0xbe, 0x73, 0x73, 0xe7, 0x88, 0x08, 0xb1, 0xc0, 0x07, 0x00, 0x89, + 0xcf, 0xc0, 0xc6, 0x08, 0x2b, 0x12, 0x5b, 0xc7, 0x4a, 0x2c, 0x4c, 0x08, 0x25, 0x7c, 0x10, 0xe4, + 0xf3, 0x35, 0x89, 0x93, 0x58, 0x49, 0xaa, 0x6e, 0x95, 0xfb, 0x3c, 0xff, 0xe7, 0xe7, 0xff, 0x8b, + 0x03, 0x97, 0x6d, 0x6c, 0xb7, 0xea, 0x8c, 0x5a, 0xb6, 0x70, 0x9c, 0x1a, 0x71, 0xf6, 0x02, 0xe6, + 0x51, 0x61, 0xed, 0x87, 0xa4, 0xd1, 0x32, 0x83, 0x06, 0x13, 0x0c, 0x15, 0x94, 0xc4, 0x4c, 0x48, + 0xcc, 0x66, 0x59, 0x9b, 0x77, 0x99, 0xcb, 0xa4, 0xc8, 0x8a, 0xfe, 0x8a, 0xf5, 0xda, 0xa2, 0xcb, + 0x98, 0x5b, 0x27, 0x16, 0x0e, 0x3c, 0x0b, 0x53, 0xca, 0x04, 0x16, 0x1e, 0xa3, 0x5c, 0xfd, 0xf7, + 0x8a, 0xc3, 0xb8, 0xcf, 0xb8, 0x65, 0x63, 0x4e, 0xe2, 0x18, 0xab, 0x59, 0xb6, 0x89, 0xc0, 0x65, + 0x2b, 0xc0, 0xae, 0x47, 0xa5, 0x58, 0x69, 0x8d, 0xd1, 0x70, 0x01, 0x6e, 0x60, 0xff, 0xa8, 0xde, + 0xe5, 0xd1, 0x9a, 0x24, 0xab, 0x94, 0x1a, 0xf3, 0x10, 0x3d, 0x8f, 0x02, 0xb7, 0xa5, 0xbf, 0x4a, + 0xf6, 0x43, 0xc2, 0x85, 0xf1, 0x0a, 0x9e, 0x4b, 0x3c, 0xe5, 0x01, 0xa3, 0x9c, 0xa0, 0x3b, 0x30, + 0x1f, 0xe7, 0x14, 0x40, 0x11, 0xac, 0x9c, 0x5e, 0x2b, 0x9a, 0x69, 0x6d, 0x30, 0x63, 0x67, 0x25, + 0x77, 0xf0, 0x67, 0x29, 0x53, 0x55, 0x2e, 0xe3, 0x36, 0xbc, 0x20, 0xcb, 0x56, 0x84, 0xb3, 0xd5, + 0x55, 0x3f, 0xa2, 0xbb, 0x4c, 0xe5, 0xa2, 0x05, 0x38, 0x47, 0x02, 0xe6, 0xd4, 0x76, 0x68, 0xe8, + 0xcb, 0x8c, 0x5c, 0x75, 0x56, 0x3e, 0x78, 0x1a, 0xfa, 0x06, 0x86, 0x7a, 0x9a, 0x5b, 0xf1, 0xdd, + 0x85, 0x39, 0x8f, 0xee, 0x32, 0x45, 0x77, 0x35, 0x9d, 0xae, 0xf2, 0x72, 0x6b, 0xa0, 0x84, 0x34, + 0x1a, 0xb5, 0x51, 0x11, 0xbc, 0x9f, 0xf0, 0x3e, 0x84, 0xbd, 0x91, 0xa8, 0xa0, 0x4b, 0x66, 0x3c, + 0x3f, 0x33, 0x9a, 0x9f, 0x19, 0xaf, 0x89, 0x9a, 0x9f, 0xb9, 0x8d, 0x5d, 0xa2, 0xbc, 0xd5, 0x3e, + 0xa7, 0xf1, 0x0d, 0xc0, 0xa5, 0xd4, 0x28, 0xf5, 0x3a, 0x0f, 0xe1, 0x5c, 0x44, 0xb5, 0x53, 0xf7, + 0xb8, 0x28, 0x80, 0xe2, 0xa9, 0x69, 0xdf, 0x69, 0x36, 0x72, 0x3f, 0xf1, 0xb8, 0x40, 0x0f, 0x12, + 0xd4, 0x59, 0x49, 0x5d, 0x1a, 0x4b, 0x1d, 0x63, 0x24, 0xb0, 0x3f, 0x00, 0xb8, 0x28, 0xb1, 0xef, + 0x45, 0x53, 0x79, 0x11, 0xda, 0xbe, 0xc7, 0x79, 0xb4, 0xc9, 0x93, 0x4c, 0x70, 0xa0, 0x79, 0xd9, + 0x63, 0x37, 0xef, 0x0b, 0x50, 0x8b, 0x34, 0x4c, 0xa1, 0x5a, 0x77, 0x0b, 0xe6, 0xf6, 0x48, 0x8b, + 0xab, 0xae, 0x95, 0xd2, 0xbb, 0xd6, 0x33, 0x3f, 0x26, 0xad, 0xaa, 0x34, 0x9d, 0x58, 0xb7, 0xd6, + 0x7e, 0xce, 0xc0, 0x19, 0xc9, 0x89, 0x3e, 0x02, 0x98, 0x8f, 0x4f, 0x02, 0x5d, 0x4b, 0x87, 0x19, + 0xbe, 0x44, 0x6d, 0x75, 0x42, 0x75, 0x9c, 0x6e, 0xac, 0xbc, 0xff, 0xf5, 0xef, 0x73, 0xd6, 0x40, + 0x45, 0x6b, 0xf4, 0x27, 0xa0, 0x59, 0x56, 0x5f, 0x0a, 0xf4, 0x1d, 0xc0, 0xb3, 0x43, 0x97, 0x84, + 0x36, 0xc6, 0xc4, 0xa5, 0x5d, 0xae, 0x76, 0x73, 0x7a, 0xa3, 0x42, 0x5e, 0x95, 0xc8, 0x25, 0x74, + 0x31, 0x1d, 0xf9, 0x6d, 0x77, 0xa5, 0xde, 0xa1, 0xaf, 0x00, 0xa2, 0xe1, 0x9b, 0x41, 0x53, 0xe5, + 0xf7, 0x5f, 0xb4, 0xb6, 0x79, 0x0c, 0xa7, 0x42, 0x5f, 0x96, 0xe8, 0x0b, 0xe8, 0x7c, 0x2a, 0x3a, + 0xfa, 0x01, 0xe0, 0x99, 0xc1, 0x2d, 0x45, 0x37, 0xc6, 0x44, 0xa6, 0x1c, 0x97, 0xb6, 0x31, 0xb5, + 0x4f, 0x81, 0x6e, 0x4a, 0xd0, 0x75, 0x54, 0x9e, 0xa8, 0xc7, 0x16, 0xef, 0x95, 0xa8, 0x3c, 0x3b, + 0x68, 0xeb, 0xe0, 0xb0, 0xad, 0x83, 0xbf, 0x6d, 0x1d, 0x7c, 0xea, 0xe8, 0x99, 0xc3, 0x8e, 0x9e, + 0xf9, 0xdd, 0xd1, 0x33, 0xaf, 0xaf, 0xbb, 0x9e, 0xa8, 0x85, 0xb6, 0xe9, 0x30, 0xff, 0xa8, 0xac, + 0x53, 0xc3, 0x1e, 0xed, 0x66, 0xbc, 0x19, 0x48, 0x11, 0xad, 0x80, 0x70, 0x3b, 0x2f, 0x7f, 0x78, + 0xd6, 0xff, 0x07, 0x00, 0x00, 0xff, 0xff, 0x85, 0x8a, 0x90, 0xbc, 0x66, 0x07, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -826,17 +808,7 @@ func (m *QueryBtcCheckpointsInfoRequest) MarshalToSizedBuffer(dAtA []byte) (int, i = encodeVarintQuery(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x1a - } - if m.EndEpoch != 0 { - i = encodeVarintQuery(dAtA, i, uint64(m.EndEpoch)) - i-- - dAtA[i] = 0x10 - } - if m.StartEpoch != 0 { - i = encodeVarintQuery(dAtA, i, uint64(m.StartEpoch)) - i-- - dAtA[i] = 0x8 + dAtA[i] = 0xa } return len(dAtA) - i, nil } @@ -1041,12 +1013,6 @@ func (m *QueryBtcCheckpointsInfoRequest) Size() (n int) { } var l int _ = l - if m.StartEpoch != 0 { - n += 1 + sovQuery(uint64(m.StartEpoch)) - } - if m.EndEpoch != 0 { - n += 1 + sovQuery(uint64(m.EndEpoch)) - } if m.Pagination != nil { l = m.Pagination.Size() n += 1 + l + sovQuery(uint64(l)) @@ -1432,44 +1398,6 @@ func (m *QueryBtcCheckpointsInfoRequest) Unmarshal(dAtA []byte) error { } switch fieldNum { case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field StartEpoch", wireType) - } - m.StartEpoch = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.StartEpoch |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field EndEpoch", wireType) - } - m.EndEpoch = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.EndEpoch |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 3: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Pagination", wireType) } diff --git a/x/epoching/keeper/grpc_query.go b/x/epoching/keeper/grpc_query.go index f76c5f81a..270018ebc 100644 --- a/x/epoching/keeper/grpc_query.go +++ b/x/epoching/keeper/grpc_query.go @@ -3,7 +3,6 @@ package keeper import ( "context" "errors" - "fmt" "cosmossdk.io/math" @@ -59,19 +58,6 @@ func (k Keeper) EpochInfo(c context.Context, req *types.QueryEpochInfoRequest) ( func (k Keeper) EpochsInfo(c context.Context, req *types.QueryEpochsInfoRequest) (*types.QueryEpochsInfoResponse, error) { ctx := sdk.UnwrapSDKContext(c) - // parse start_epoch and end_epoch and forward to the pagination request - if req.EndEpoch > 0 { - // this query uses start_epoch and end_epoch to specify range - if req.StartEpoch > req.EndEpoch { - return nil, fmt.Errorf("StartEpoch (%d) should not be larger than EndEpoch (%d)", req.StartEpoch, req.EndEpoch) - } - req.Pagination = &query.PageRequest{ - Key: sdk.Uint64ToBigEndian(req.StartEpoch), - Limit: req.EndEpoch - req.StartEpoch + 1, - Reverse: false, - } - } - epochInfoStore := k.epochInfoStore(ctx) epochs := []*types.Epoch{} pageRes, err := query.Paginate(epochInfoStore, req.Pagination, func(key, value []byte) error { diff --git a/x/epoching/keeper/grpc_query_test.go b/x/epoching/keeper/grpc_query_test.go index 2f3f2a10e..663b0aeea 100644 --- a/x/epoching/keeper/grpc_query_test.go +++ b/x/epoching/keeper/grpc_query_test.go @@ -124,43 +124,6 @@ func FuzzEpochsInfo(f *testing.F) { }) } -func FuzzEpochsInfo_QueryParams(f *testing.F) { - datagen.AddRandomSeedsToFuzzer(f, 10) - - f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) - numEpochs := datagen.RandomInt(10) + 2 - - endEpoch := rand.Uint64()%(numEpochs-1) + 1 - startEpoch := rand.Uint64() % endEpoch - - helper := testepoching.NewHelper(t) - ctx, keeper, queryClient := helper.Ctx, helper.EpochingKeeper, helper.QueryClient - wctx := sdk.WrapSDKContext(ctx) - - // enque the first block of the numEpochs'th epoch - epochInterval := keeper.GetParams(ctx).EpochInterval - for i := uint64(0); i < numEpochs-1; i++ { - for j := uint64(0); j < epochInterval; j++ { - helper.GenAndApplyEmptyBlock() - } - } - - // get epoch msgs - req := types.QueryEpochsInfoRequest{ - StartEpoch: startEpoch, - EndEpoch: endEpoch, - } - resp, err := queryClient.EpochsInfo(wctx, &req) - require.NoError(t, err) - - require.Equal(t, endEpoch-startEpoch+1, uint64(len(resp.Epochs))) - for i, epoch := range resp.Epochs { - require.Equal(t, uint64(i)+startEpoch, epoch.EpochNumber) - } - }) -} - // FuzzEpochMsgsQuery fuzzes queryClient.EpochMsgs // 1. randomly generate msgs and limit in pagination // 2. check the returned msg was previously enqueued diff --git a/x/epoching/types/query.pb.go b/x/epoching/types/query.pb.go index 8d90b59d9..798a86562 100644 --- a/x/epoching/types/query.pb.go +++ b/x/epoching/types/query.pb.go @@ -202,10 +202,8 @@ func (m *QueryEpochInfoResponse) GetEpoch() *Epoch { } type QueryEpochsInfoRequest struct { - StartEpoch uint64 `protobuf:"varint,1,opt,name=start_epoch,json=startEpoch,proto3" json:"start_epoch,omitempty"` - EndEpoch uint64 `protobuf:"varint,2,opt,name=end_epoch,json=endEpoch,proto3" json:"end_epoch,omitempty"` // pagination defines whether to have the pagination in the request - Pagination *query.PageRequest `protobuf:"bytes,3,opt,name=pagination,proto3" json:"pagination,omitempty"` + Pagination *query.PageRequest `protobuf:"bytes,1,opt,name=pagination,proto3" json:"pagination,omitempty"` } func (m *QueryEpochsInfoRequest) Reset() { *m = QueryEpochsInfoRequest{} } @@ -241,20 +239,6 @@ func (m *QueryEpochsInfoRequest) XXX_DiscardUnknown() { var xxx_messageInfo_QueryEpochsInfoRequest proto.InternalMessageInfo -func (m *QueryEpochsInfoRequest) GetStartEpoch() uint64 { - if m != nil { - return m.StartEpoch - } - return 0 -} - -func (m *QueryEpochsInfoRequest) GetEndEpoch() uint64 { - if m != nil { - return m.EndEpoch - } - return 0 -} - func (m *QueryEpochsInfoRequest) GetPagination() *query.PageRequest { if m != nil { return m.Pagination @@ -948,75 +932,74 @@ func init() { func init() { proto.RegisterFile("babylon/epoching/v1/query.proto", fileDescriptor_1821b530f2ec2711) } var fileDescriptor_1821b530f2ec2711 = []byte{ - // 1088 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x97, 0xcd, 0x6f, 0xdc, 0x44, - 0x14, 0xc0, 0xe3, 0x24, 0x0d, 0xed, 0x4b, 0x4b, 0x61, 0x52, 0x20, 0x75, 0xca, 0x26, 0x72, 0xa1, - 0x09, 0x49, 0x63, 0x67, 0x93, 0xb4, 0xa8, 0x1f, 0x80, 0x48, 0xf8, 0x10, 0x55, 0x8a, 0x52, 0x23, - 0xe5, 0xc0, 0x65, 0x35, 0xbb, 0x9e, 0x38, 0x96, 0xbc, 0x9e, 0xad, 0xc7, 0x5e, 0x58, 0x95, 0x20, - 0xc4, 0x99, 0x03, 0x12, 0x12, 0xa8, 0x17, 0x84, 0xc4, 0x91, 0x3f, 0x01, 0x0e, 0x1c, 0x7b, 0x0c, - 0xe2, 0xc2, 0x09, 0xa1, 0x84, 0x3f, 0x04, 0xf9, 0xcd, 0x78, 0xd7, 0xde, 0xda, 0xd9, 0x4d, 0x15, - 0x71, 0x4b, 0x66, 0xde, 0xc7, 0xef, 0x7d, 0xf8, 0xbd, 0x59, 0x98, 0xad, 0xd3, 0x7a, 0xc7, 0xe7, - 0x81, 0xc5, 0x5a, 0xbc, 0xb1, 0xe7, 0x05, 0xae, 0xd5, 0xae, 0x5a, 0x0f, 0x63, 0x16, 0x76, 0xcc, - 0x56, 0xc8, 0x23, 0x4e, 0xa6, 0x94, 0x80, 0x99, 0x0a, 0x98, 0xed, 0xaa, 0x7e, 0xc9, 0xe5, 0x2e, - 0xc7, 0x7b, 0x2b, 0xf9, 0x4b, 0x8a, 0xea, 0x57, 0x5c, 0xce, 0x5d, 0x9f, 0x59, 0xb4, 0xe5, 0x59, - 0x34, 0x08, 0x78, 0x44, 0x23, 0x8f, 0x07, 0x42, 0xdd, 0x2e, 0x36, 0xb8, 0x68, 0x72, 0x61, 0xd5, - 0xa9, 0x60, 0xd2, 0x83, 0xd5, 0xae, 0xd6, 0x59, 0x44, 0xab, 0x56, 0x8b, 0xba, 0x5e, 0x80, 0xc2, - 0x4a, 0x76, 0xae, 0x88, 0xaa, 0x45, 0x43, 0xda, 0x4c, 0xad, 0x19, 0x45, 0x12, 0x5d, 0x44, 0x94, - 0x31, 0x2e, 0x01, 0x79, 0x90, 0xf8, 0xd9, 0x46, 0x45, 0x9b, 0x3d, 0x8c, 0x99, 0x88, 0x8c, 0x6d, - 0x98, 0xca, 0x9d, 0x8a, 0x16, 0x0f, 0x04, 0x23, 0xb7, 0x60, 0x42, 0x3a, 0x98, 0xd6, 0xe6, 0xb4, - 0x85, 0xc9, 0xd5, 0x19, 0xb3, 0x20, 0x70, 0x53, 0x2a, 0x6d, 0x8c, 0x3f, 0xf9, 0x7b, 0x76, 0xc4, - 0x56, 0x0a, 0xc6, 0x3a, 0xbc, 0x84, 0x16, 0xdf, 0x4f, 0x04, 0x3f, 0x0a, 0x76, 0xb9, 0x72, 0x45, - 0x66, 0xe0, 0x1c, 0x2a, 0xd7, 0x82, 0xb8, 0x89, 0x66, 0xc7, 0xed, 0xb3, 0x78, 0xf0, 0x71, 0xdc, - 0x34, 0xee, 0xc1, 0xcb, 0xfd, 0x5a, 0x0a, 0x65, 0x05, 0xce, 0xa0, 0x94, 0x22, 0xd1, 0x0b, 0x49, - 0x50, 0xcd, 0x96, 0x82, 0xc6, 0x8f, 0x5a, 0xd6, 0x98, 0xc8, 0x32, 0xcc, 0xc2, 0xa4, 0x88, 0x68, - 0x18, 0xd5, 0x7a, 0x26, 0xc7, 0x6d, 0xc0, 0x23, 0x14, 0x46, 0xc8, 0xc0, 0x51, 0xd7, 0xa3, 0x0a, - 0x32, 0x70, 0xe4, 0xe5, 0x07, 0x00, 0xbd, 0xe2, 0x4c, 0x8f, 0x21, 0xcf, 0x35, 0x53, 0x56, 0xd2, - 0x4c, 0x2a, 0x69, 0xca, 0x5e, 0x51, 0x95, 0x34, 0xb7, 0xa9, 0xcb, 0x94, 0x67, 0x3b, 0xa3, 0x69, - 0x7c, 0xaf, 0xc1, 0x2b, 0x4f, 0x01, 0xaa, 0x70, 0x57, 0x61, 0x02, 0x9d, 0x27, 0x99, 0x1f, 0x1b, - 0x10, 0xaf, 0x92, 0x24, 0x1f, 0xe6, 0xb8, 0x46, 0x91, 0x6b, 0x7e, 0x20, 0x97, 0x74, 0x98, 0x03, - 0xd3, 0x61, 0x1a, 0xb9, 0x36, 0xe3, 0x30, 0x64, 0x81, 0x4c, 0x49, 0xda, 0x29, 0x2e, 0x5c, 0x2e, - 0xb8, 0x53, 0xd4, 0x57, 0xe1, 0x42, 0x43, 0x9e, 0xe7, 0x32, 0x7b, 0xbe, 0x91, 0x11, 0x26, 0xaf, - 0xc3, 0xf3, 0xb2, 0x01, 0xea, 0x3c, 0x0e, 0x1c, 0x1a, 0x76, 0x54, 0x82, 0x2f, 0xe0, 0xe9, 0x86, - 0x3a, 0x34, 0xbe, 0xc8, 0x36, 0xd0, 0x7d, 0xe1, 0x8a, 0x61, 0x1a, 0xa8, 0xaf, 0x36, 0xa3, 0xcf, - 0x5c, 0x9b, 0xc7, 0xb9, 0xe6, 0x91, 0xee, 0x55, 0x90, 0x37, 0x61, 0xbc, 0x29, 0xdc, 0xb4, 0x30, - 0x46, 0x61, 0x61, 0x1e, 0xc4, 0x2c, 0x66, 0xce, 0x7d, 0x26, 0x44, 0x62, 0x1f, 0xe5, 0x4f, 0xaf, - 0x3c, 0x3f, 0x6b, 0x30, 0x83, 0x6c, 0x5b, 0x34, 0x62, 0x22, 0x2a, 0x4c, 0x50, 0xb7, 0x79, 0xb5, - 0xbe, 0xe6, 0x9d, 0x85, 0x49, 0x99, 0xbd, 0x06, 0x8f, 0x83, 0x48, 0xa5, 0x1e, 0xf0, 0x68, 0x33, - 0x39, 0x39, 0xb5, 0xee, 0xfe, 0x55, 0x83, 0x2b, 0xc5, 0x94, 0x2a, 0x8f, 0x36, 0xbc, 0xe8, 0xe3, - 0x95, 0x24, 0xad, 0x65, 0x92, 0x7a, 0x6d, 0x70, 0x52, 0xb7, 0x3c, 0x11, 0xd9, 0x17, 0xfd, 0xbc, - 0xed, 0xd3, 0xcb, 0xf1, 0x1d, 0xa8, 0x20, 0xfc, 0x0e, 0xf5, 0x3d, 0x87, 0x46, 0x3c, 0xdc, 0xf2, - 0x76, 0x59, 0xa3, 0xd3, 0xf0, 0xd3, 0x58, 0xc9, 0x65, 0x38, 0xdb, 0xa6, 0x7e, 0x8d, 0x3a, 0x4e, - 0x88, 0x49, 0x3e, 0x67, 0x3f, 0xd7, 0xa6, 0xfe, 0xbb, 0x8e, 0x13, 0x1a, 0x0c, 0x66, 0x4b, 0x95, - 0x55, 0xf0, 0x1b, 0x52, 0xdb, 0xf7, 0x76, 0x99, 0x9a, 0x68, 0xf3, 0x85, 0x31, 0x17, 0x98, 0x48, - 0xdc, 0x24, 0xff, 0x19, 0x77, 0x95, 0x9b, 0xf7, 0x98, 0xcf, 0x5c, 0xc4, 0x2e, 0x82, 0x74, 0x58, - 0x1e, 0xd2, 0x61, 0x12, 0xd2, 0x85, 0xb9, 0x72, 0x6d, 0x45, 0xb9, 0x29, 0xd5, 0x33, 0x94, 0x0b, - 0x85, 0x94, 0x45, 0x36, 0x12, 0x47, 0x88, 0xf9, 0x65, 0x76, 0xca, 0xed, 0x50, 0xff, 0x13, 0x16, - 0xfd, 0xaf, 0x9f, 0xf2, 0x1f, 0x9a, 0x1a, 0x67, 0x39, 0x00, 0x15, 0xe1, 0xdb, 0x00, 0xed, 0x34, - 0xc5, 0x69, 0xf7, 0x55, 0x8e, 0xaf, 0x84, 0x9d, 0xd1, 0x20, 0xd7, 0x81, 0x44, 0x3c, 0xa2, 0x7e, - 0xad, 0xcd, 0x23, 0x2f, 0x70, 0x6b, 0x2d, 0xfe, 0x19, 0x0b, 0x11, 0x76, 0xcc, 0x7e, 0x01, 0x6f, - 0x76, 0xf0, 0x62, 0x3b, 0x39, 0xef, 0x6b, 0xcf, 0xb1, 0x67, 0x6e, 0xcf, 0xd5, 0x83, 0x49, 0x38, - 0x83, 0x31, 0x91, 0xaf, 0x34, 0x98, 0x90, 0x0b, 0x98, 0xcc, 0x97, 0x7d, 0x35, 0x7d, 0xdb, 0x5e, - 0x5f, 0x18, 0x2c, 0x28, 0x7d, 0x1a, 0x57, 0xbf, 0xfe, 0xf3, 0xdf, 0xef, 0x46, 0x5f, 0x25, 0x33, - 0x56, 0xf9, 0xe3, 0x83, 0xfc, 0xa0, 0xc1, 0xb9, 0xee, 0xc2, 0x26, 0x8b, 0xe5, 0xc6, 0xfb, 0xdf, - 0x02, 0xfa, 0xd2, 0x50, 0xb2, 0x8a, 0xa5, 0x8a, 0x2c, 0x4b, 0xe4, 0x0d, 0xab, 0xf4, 0x99, 0x23, - 0xac, 0x47, 0xdd, 0x7e, 0x7a, 0x6b, 0x71, 0x9f, 0x7c, 0xa3, 0x01, 0xf4, 0x96, 0x2b, 0x19, 0xe4, - 0x2e, 0xfb, 0x46, 0xd0, 0xaf, 0x0f, 0x27, 0x3c, 0x54, 0xa2, 0xd4, 0x82, 0x7e, 0xac, 0xc1, 0xf9, - 0xec, 0xde, 0x24, 0xcb, 0xe5, 0x3e, 0x0a, 0x76, 0xaf, 0x6e, 0x0e, 0x2b, 0xae, 0xa0, 0x16, 0x11, - 0xea, 0x35, 0x62, 0x14, 0x42, 0xe5, 0x36, 0x35, 0xf9, 0x29, 0x2d, 0x22, 0xce, 0xd1, 0x41, 0x45, - 0xcc, 0xac, 0x9b, 0x81, 0x45, 0xcc, 0x0e, 0x7d, 0xe3, 0x36, 0x22, 0xad, 0x93, 0xd5, 0xa1, 0x8b, - 0x68, 0x35, 0xe5, 0xc0, 0x17, 0xe4, 0x17, 0x0d, 0x2e, 0xf6, 0x2d, 0x13, 0xb2, 0x52, 0xee, 0xbc, - 0x78, 0x3b, 0xea, 0xd5, 0x13, 0x68, 0x28, 0xe8, 0x35, 0x84, 0x5e, 0x26, 0x4b, 0xc7, 0x40, 0xdf, - 0x96, 0xab, 0xa8, 0x47, 0xfb, 0x9b, 0x06, 0xe4, 0xe9, 0xe9, 0x4d, 0xd6, 0xca, 0xdd, 0x97, 0xee, - 0x1a, 0x7d, 0xfd, 0x64, 0x4a, 0x0a, 0xfb, 0x0e, 0x62, 0xdf, 0x20, 0x6b, 0x85, 0xd8, 0xdd, 0x21, - 0x86, 0xe3, 0x1d, 0x35, 0xad, 0x47, 0xe9, 0x46, 0xdb, 0x27, 0xbf, 0x6b, 0x30, 0x55, 0x30, 0xd6, - 0xc9, 0x31, 0x28, 0xe5, 0x7b, 0x48, 0xbf, 0x71, 0x42, 0x2d, 0x15, 0xc1, 0x5d, 0x8c, 0xe0, 0x26, - 0x59, 0x2f, 0x8c, 0xc0, 0xe9, 0x6a, 0x66, 0x43, 0x48, 0xf7, 0xdd, 0x7e, 0xd2, 0x2f, 0x93, 0x99, - 0x99, 0x4f, 0x06, 0x7d, 0xd1, 0xb9, 0xdd, 0xa4, 0x2f, 0x0f, 0x29, 0xad, 0x50, 0xdf, 0x41, 0xd4, - 0x5b, 0xe4, 0xcd, 0xe1, 0x1b, 0xbb, 0x57, 0x01, 0xc1, 0xa2, 0x8d, 0x7b, 0x4f, 0x0e, 0x2b, 0xda, - 0xc1, 0x61, 0x45, 0xfb, 0xe7, 0xb0, 0xa2, 0x7d, 0x7b, 0x54, 0x19, 0x39, 0x38, 0xaa, 0x8c, 0xfc, - 0x75, 0x54, 0x19, 0xf9, 0x74, 0xc5, 0xf5, 0xa2, 0xbd, 0xb8, 0x6e, 0x36, 0x78, 0x33, 0x35, 0xde, - 0xd8, 0xa3, 0x5e, 0xd0, 0xf5, 0xf4, 0x79, 0xcf, 0x57, 0xd4, 0x69, 0x31, 0x51, 0x9f, 0xc0, 0xdf, - 0x7a, 0x6b, 0xff, 0x05, 0x00, 0x00, 0xff, 0xff, 0x45, 0xf9, 0x53, 0x14, 0xc9, 0x0e, 0x00, 0x00, + // 1071 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x97, 0xcf, 0x6f, 0x1b, 0x45, + 0x14, 0xc7, 0xb3, 0x89, 0x1b, 0x92, 0x97, 0x96, 0xc2, 0xa4, 0x40, 0xbb, 0x29, 0x4e, 0xb4, 0x85, + 0x26, 0x24, 0xcd, 0x6e, 0x9c, 0xa4, 0x45, 0xfd, 0x01, 0x88, 0x84, 0x1f, 0xa2, 0x4a, 0x51, 0xba, + 0x48, 0x39, 0x70, 0x31, 0x63, 0xef, 0x64, 0xb3, 0xd2, 0x7a, 0xc7, 0xdd, 0x1f, 0x06, 0xab, 0x04, + 0x21, 0xce, 0x1c, 0x90, 0x90, 0x40, 0xbd, 0x21, 0x71, 0xe4, 0x4f, 0x80, 0x03, 0xc7, 0x1e, 0x83, + 0xb8, 0x70, 0x42, 0x28, 0xe1, 0x0f, 0x41, 0xfb, 0x66, 0xd6, 0x5e, 0xbb, 0xb3, 0xb1, 0x13, 0x45, + 0xdc, 0xda, 0x99, 0xf7, 0xe3, 0xf3, 0xde, 0x9b, 0x7d, 0x5f, 0x07, 0x66, 0x6b, 0xb4, 0xd6, 0xf6, + 0x79, 0x60, 0xb1, 0x26, 0xaf, 0xef, 0x79, 0x81, 0x6b, 0xb5, 0x2a, 0xd6, 0xa3, 0x84, 0x85, 0x6d, + 0xb3, 0x19, 0xf2, 0x98, 0x93, 0x69, 0x69, 0x60, 0x66, 0x06, 0x66, 0xab, 0xa2, 0x5f, 0x72, 0xb9, + 0xcb, 0xf1, 0xde, 0x4a, 0xff, 0x25, 0x4c, 0xf5, 0xab, 0x2e, 0xe7, 0xae, 0xcf, 0x2c, 0xda, 0xf4, + 0x2c, 0x1a, 0x04, 0x3c, 0xa6, 0xb1, 0xc7, 0x83, 0x48, 0xde, 0x2e, 0xd6, 0x79, 0xd4, 0xe0, 0x91, + 0x55, 0xa3, 0x11, 0x13, 0x19, 0xac, 0x56, 0xa5, 0xc6, 0x62, 0x5a, 0xb1, 0x9a, 0xd4, 0xf5, 0x02, + 0x34, 0x96, 0xb6, 0x73, 0x2a, 0xaa, 0x26, 0x0d, 0x69, 0x23, 0x8b, 0x66, 0xa8, 0x2c, 0x3a, 0x88, + 0x68, 0x63, 0x5c, 0x02, 0xf2, 0x30, 0xcd, 0xb3, 0x8d, 0x8e, 0x36, 0x7b, 0x94, 0xb0, 0x28, 0x36, + 0xb6, 0x61, 0xba, 0xe7, 0x34, 0x6a, 0xf2, 0x20, 0x62, 0xe4, 0x36, 0x8c, 0x8b, 0x04, 0x97, 0xb5, + 0x39, 0x6d, 0x61, 0x6a, 0x75, 0xc6, 0x54, 0x14, 0x6e, 0x0a, 0xa7, 0x8d, 0xd2, 0xd3, 0xbf, 0x67, + 0x47, 0x6c, 0xe9, 0x60, 0xac, 0xc3, 0x4b, 0x18, 0xf1, 0xfd, 0xd4, 0xf0, 0xa3, 0x60, 0x97, 0xcb, + 0x54, 0x64, 0x06, 0x26, 0xd1, 0xb9, 0x1a, 0x24, 0x0d, 0x0c, 0x5b, 0xb2, 0x27, 0xf0, 0xe0, 0xe3, + 0xa4, 0x61, 0xdc, 0x87, 0x97, 0xfb, 0xbd, 0x24, 0xca, 0x0a, 0x9c, 0x43, 0x2b, 0x49, 0xa2, 0x2b, + 0x49, 0xd0, 0xcd, 0x16, 0x86, 0xc6, 0x67, 0xf9, 0x58, 0x51, 0x1e, 0xe1, 0x03, 0x80, 0x6e, 0x77, + 0x65, 0xc0, 0xeb, 0xa6, 0x18, 0x85, 0x99, 0x8e, 0xc2, 0x14, 0xc3, 0x96, 0xa3, 0x30, 0xb7, 0xa9, + 0xcb, 0xa4, 0xaf, 0x9d, 0xf3, 0x34, 0x7e, 0xd0, 0xe0, 0x95, 0x67, 0x52, 0x48, 0xde, 0x55, 0x18, + 0x47, 0x8c, 0xb4, 0x75, 0x63, 0x03, 0x80, 0xa5, 0x25, 0xf9, 0xb0, 0x87, 0x6b, 0x14, 0xb9, 0xe6, + 0x07, 0x72, 0x89, 0x84, 0x3d, 0x60, 0x3a, 0x5c, 0x46, 0xae, 0xcd, 0x24, 0x0c, 0x59, 0x10, 0x8b, + 0x2c, 0x72, 0xd4, 0x2e, 0x5c, 0x51, 0xdc, 0x49, 0xea, 0x6b, 0x70, 0xa1, 0x2e, 0xce, 0xab, 0xdd, + 0x6e, 0x97, 0xec, 0xf3, 0xf5, 0x9c, 0x31, 0x79, 0x1d, 0x9e, 0x17, 0x13, 0xac, 0xf1, 0x24, 0x70, + 0x68, 0xd8, 0x46, 0xd4, 0x92, 0x7d, 0x01, 0x4f, 0x37, 0xe4, 0xa1, 0xf1, 0x65, 0xfe, 0x05, 0x3c, + 0x88, 0xdc, 0x68, 0x98, 0x17, 0xd0, 0x37, 0x9b, 0xd1, 0x53, 0xcf, 0xe6, 0x89, 0x96, 0x1f, 0xbf, + 0x48, 0x2f, 0x8b, 0xbc, 0x05, 0xa5, 0x46, 0xe4, 0x66, 0x83, 0x31, 0x94, 0x83, 0x79, 0x98, 0xb0, + 0x84, 0x39, 0x0f, 0x58, 0x14, 0xa5, 0xf1, 0xd1, 0xfe, 0xec, 0xc6, 0xf3, 0xb3, 0x06, 0x33, 0xc8, + 0xb6, 0x45, 0x63, 0x16, 0xc5, 0xca, 0x06, 0x05, 0x4e, 0xcf, 0x04, 0x26, 0x58, 0xe0, 0x88, 0xee, + 0xcf, 0xc2, 0x94, 0xe8, 0x5e, 0x9d, 0x27, 0x41, 0x2c, 0x5b, 0x0f, 0x78, 0xb4, 0x99, 0x9e, 0xf4, + 0x75, 0x70, 0xec, 0xd4, 0x1d, 0xfc, 0x55, 0x83, 0xab, 0x6a, 0x4a, 0xd9, 0x47, 0x1b, 0x5e, 0xf4, + 0xf1, 0x4a, 0x90, 0x56, 0x73, 0x4d, 0xbd, 0x3e, 0xb8, 0xa9, 0x5b, 0x5e, 0x14, 0xdb, 0x17, 0xfd, + 0xde, 0xd8, 0x67, 0xd7, 0xe3, 0xbb, 0x50, 0x46, 0xf8, 0x1d, 0xea, 0x7b, 0x0e, 0x8d, 0x79, 0xb8, + 0xe5, 0xed, 0xb2, 0x7a, 0xbb, 0xee, 0x67, 0xb5, 0x92, 0x2b, 0x30, 0xd1, 0xa2, 0x7e, 0x95, 0x3a, + 0x4e, 0x88, 0x4d, 0x9e, 0xb4, 0x9f, 0x6b, 0x51, 0xff, 0x5d, 0xc7, 0x09, 0x0d, 0x06, 0xb3, 0x85, + 0xce, 0xb2, 0xf8, 0x0d, 0xe1, 0xed, 0x7b, 0xbb, 0x4c, 0x6e, 0x90, 0x79, 0x65, 0xcd, 0x8a, 0x10, + 0x69, 0x9a, 0xf4, 0x7f, 0xc6, 0x3d, 0x99, 0xe6, 0x3d, 0xe6, 0x33, 0x17, 0xb1, 0x55, 0x90, 0x0e, + 0xeb, 0x85, 0x74, 0x98, 0x80, 0x74, 0x61, 0xae, 0xd8, 0x5b, 0x52, 0x6e, 0x0a, 0xf7, 0x1c, 0xe5, + 0x82, 0x92, 0x52, 0x15, 0x23, 0x4d, 0x84, 0x98, 0x5f, 0xe5, 0xb7, 0xdc, 0x0e, 0xf5, 0x3f, 0x61, + 0xf1, 0xff, 0xfa, 0x29, 0xff, 0xa1, 0xc9, 0x75, 0xd6, 0x03, 0x20, 0x2b, 0x7c, 0x1b, 0xa0, 0x95, + 0xb5, 0x38, 0x7b, 0x7d, 0xe5, 0xe3, 0x27, 0x61, 0xe7, 0x3c, 0xc8, 0x0d, 0x20, 0x31, 0x8f, 0xa9, + 0x5f, 0x6d, 0xf1, 0xd8, 0x0b, 0xdc, 0x6a, 0x93, 0x7f, 0xce, 0x42, 0x84, 0x1d, 0xb3, 0x5f, 0xc0, + 0x9b, 0x1d, 0xbc, 0xd8, 0x4e, 0xcf, 0xfb, 0x9e, 0xe7, 0xd8, 0xa9, 0x9f, 0xe7, 0xea, 0xc1, 0x14, + 0x9c, 0xc3, 0x9a, 0xc8, 0xd7, 0x1a, 0x8c, 0x0b, 0x05, 0x25, 0xf3, 0x45, 0x5f, 0x4d, 0x9f, 0x5c, + 0xeb, 0x0b, 0x83, 0x0d, 0x45, 0x4e, 0xe3, 0xda, 0x37, 0x7f, 0xfe, 0xfb, 0xfd, 0xe8, 0xab, 0x64, + 0xc6, 0x2a, 0xfe, 0xf5, 0x40, 0x7e, 0xd4, 0x60, 0xb2, 0xa3, 0xb8, 0x64, 0xb1, 0x38, 0x78, 0xbf, + 0x98, 0xeb, 0x4b, 0x43, 0xd9, 0x4a, 0x96, 0x0a, 0xb2, 0x2c, 0x91, 0x37, 0xac, 0xc2, 0xdf, 0x29, + 0x91, 0xf5, 0xb8, 0xf3, 0x9e, 0xde, 0x5a, 0xdc, 0x27, 0xdf, 0x6a, 0x00, 0x5d, 0x71, 0x25, 0x83, + 0xd2, 0xe5, 0x55, 0x5e, 0xbf, 0x31, 0x9c, 0xf1, 0x50, 0x8d, 0x92, 0x02, 0xfd, 0x44, 0x83, 0xf3, + 0x79, 0xdd, 0x24, 0xcb, 0xc5, 0x39, 0x14, 0xda, 0xab, 0x9b, 0xc3, 0x9a, 0x4b, 0xa8, 0x45, 0x84, + 0x7a, 0x8d, 0x18, 0x4a, 0xa8, 0x1e, 0xa5, 0x26, 0x3f, 0x65, 0x43, 0xc4, 0x3d, 0x3a, 0x68, 0x88, + 0x39, 0xb9, 0x19, 0x38, 0xc4, 0xfc, 0xd2, 0x37, 0xee, 0x20, 0xd2, 0x3a, 0x59, 0x1d, 0x7a, 0x88, + 0x56, 0x43, 0x2c, 0xfc, 0x88, 0xfc, 0xa2, 0xc1, 0xc5, 0x3e, 0x31, 0x21, 0x2b, 0xc5, 0xc9, 0xd5, + 0xea, 0xa8, 0x57, 0x4e, 0xe0, 0x21, 0xa1, 0xd7, 0x10, 0x7a, 0x99, 0x2c, 0x1d, 0x03, 0x7d, 0x47, + 0x48, 0x51, 0x97, 0xf6, 0x37, 0x0d, 0xc8, 0xb3, 0xdb, 0x9b, 0xac, 0x15, 0xa7, 0x2f, 0xd4, 0x1a, + 0x7d, 0xfd, 0x64, 0x4e, 0x12, 0xfb, 0x2e, 0x62, 0xdf, 0x24, 0x6b, 0x4a, 0xec, 0xce, 0x12, 0xc3, + 0xf5, 0x8e, 0x9e, 0xd6, 0xe3, 0x4c, 0xd1, 0xf6, 0xc9, 0xef, 0x1a, 0x4c, 0x2b, 0xd6, 0x3a, 0x39, + 0x06, 0xa5, 0x58, 0x87, 0xf4, 0x9b, 0x27, 0xf4, 0x92, 0x15, 0xdc, 0xc3, 0x0a, 0x6e, 0x91, 0x75, + 0x65, 0x05, 0x4e, 0xc7, 0x33, 0x5f, 0x42, 0xa6, 0x77, 0xfb, 0xe9, 0x7b, 0x99, 0xca, 0xed, 0x7c, + 0x32, 0xe8, 0x8b, 0xee, 0xd1, 0x26, 0x7d, 0x79, 0x48, 0x6b, 0x89, 0xfa, 0x0e, 0xa2, 0xde, 0x26, + 0x6f, 0x0e, 0xff, 0xb0, 0xbb, 0x13, 0x88, 0x58, 0xbc, 0x71, 0xff, 0xe9, 0x61, 0x59, 0x3b, 0x38, + 0x2c, 0x6b, 0xff, 0x1c, 0x96, 0xb5, 0xef, 0x8e, 0xca, 0x23, 0x07, 0x47, 0xe5, 0x91, 0xbf, 0x8e, + 0xca, 0x23, 0x9f, 0xae, 0xb8, 0x5e, 0xbc, 0x97, 0xd4, 0xcc, 0x3a, 0x6f, 0x64, 0xc1, 0xeb, 0x7b, + 0xd4, 0x0b, 0x3a, 0x99, 0xbe, 0xe8, 0xe6, 0x8a, 0xdb, 0x4d, 0x16, 0xd5, 0xc6, 0xf1, 0x8f, 0xb5, + 0xb5, 0xff, 0x02, 0x00, 0x00, 0xff, 0xff, 0x76, 0x01, 0x0c, 0x73, 0x8a, 0x0e, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -1558,17 +1541,7 @@ func (m *QueryEpochsInfoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) i = encodeVarintQuery(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x1a - } - if m.EndEpoch != 0 { - i = encodeVarintQuery(dAtA, i, uint64(m.EndEpoch)) - i-- - dAtA[i] = 0x10 - } - if m.StartEpoch != 0 { - i = encodeVarintQuery(dAtA, i, uint64(m.StartEpoch)) - i-- - dAtA[i] = 0x8 + dAtA[i] = 0xa } return len(dAtA) - i, nil } @@ -2147,12 +2120,6 @@ func (m *QueryEpochsInfoRequest) Size() (n int) { } var l int _ = l - if m.StartEpoch != 0 { - n += 1 + sovQuery(uint64(m.StartEpoch)) - } - if m.EndEpoch != 0 { - n += 1 + sovQuery(uint64(m.EndEpoch)) - } if m.Pagination != nil { l = m.Pagination.Size() n += 1 + l + sovQuery(uint64(l)) @@ -2690,44 +2657,6 @@ func (m *QueryEpochsInfoRequest) Unmarshal(dAtA []byte) error { } switch fieldNum { case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field StartEpoch", wireType) - } - m.StartEpoch = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.StartEpoch |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field EndEpoch", wireType) - } - m.EndEpoch = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.EndEpoch |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 3: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Pagination", wireType) } From c92e9484a74c55284688a70c4e728ddc8e86f943 Mon Sep 17 00:00:00 2001 From: Vitalis Salis Date: Thu, 16 Feb 2023 12:17:55 +0200 Subject: [PATCH 03/59] prepare-genesis cmd: Add flags related to inflation (#306) --- cmd/babylond/cmd/flags.go | 25 +++++++++++++++++++++++++ cmd/babylond/cmd/genesis.go | 14 ++++++++++++-- cmd/babylond/cmd/testnet.go | 4 +++- 3 files changed, 40 insertions(+), 3 deletions(-) diff --git a/cmd/babylond/cmd/flags.go b/cmd/babylond/cmd/flags.go index b6c5e6fbc..28cfd9de9 100644 --- a/cmd/babylond/cmd/flags.go +++ b/cmd/babylond/cmd/flags.go @@ -14,6 +14,11 @@ const ( flagBtcFinalizationTimeout = "btc-finalization-timeout" flagBaseBtcHeaderHex = "btc-base-header" flagBaseBtcHeaderHeight = "btc-base-header-height" + flagInflationRateChange = "inflation-rate-change" + flagInflationMax = "inflation-max" + flagInflationMin = "inflation-min" + flagGoalBonded = "goal-bonded" + flagBlocksPerYear = "blocks-per-year" flagGenesisTime = "genesis-time" ) @@ -25,6 +30,11 @@ type GenesisCLIArgs struct { EpochInterval uint64 BaseBtcHeaderHex string BaseBtcHeaderHeight uint64 + InflationRateChange float64 + InflationMax float64 + InflationMin float64 + GoalBonded float64 + BlocksPerYear uint64 GenesisTime time.Time } @@ -41,6 +51,11 @@ func addGenesisFlags(cmd *cobra.Command) { // Genesis header for the simnet cmd.Flags().String(flagBaseBtcHeaderHex, "0100000000000000000000000000000000000000000000000000000000000000000000003ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a45068653ffff7f2002000000", "Hex of the base Bitcoin header.") cmd.Flags().Uint64(flagBaseBtcHeaderHeight, 0, "Height of the base Bitcoin header.") + cmd.Flags().Float64(flagInflationRateChange, 0.13, "Inflation rate change") + cmd.Flags().Float64(flagInflationMax, 0.2, "Maximum inflation") + cmd.Flags().Float64(flagInflationMin, 0.07, "Minimum inflation") + cmd.Flags().Float64(flagGoalBonded, 0.67, "Bonded tokens goal") + cmd.Flags().Uint64(flagBlocksPerYear, 6311520, "Blocks per year") cmd.Flags().Int64(flagGenesisTime, time.Now().Unix(), "Genesis time") } @@ -53,6 +68,11 @@ func parseGenesisFlags(cmd *cobra.Command) *GenesisCLIArgs { baseBtcHeaderHex, _ := cmd.Flags().GetString(flagBaseBtcHeaderHex) baseBtcHeaderHeight, _ := cmd.Flags().GetUint64(flagBaseBtcHeaderHeight) genesisTimeUnix, _ := cmd.Flags().GetInt64(flagGenesisTime) + inflationRateChange, _ := cmd.Flags().GetFloat64(flagInflationRateChange) + inflationMax, _ := cmd.Flags().GetFloat64(flagInflationMax) + inflationMin, _ := cmd.Flags().GetFloat64(flagInflationMin) + goalBonded, _ := cmd.Flags().GetFloat64(flagGoalBonded) + blocksPerYear, _ := cmd.Flags().GetUint64(flagBlocksPerYear) if chainID == "" { chainID = "chain-" + tmrand.NewRand().Str(6) @@ -69,5 +89,10 @@ func parseGenesisFlags(cmd *cobra.Command) *GenesisCLIArgs { BaseBtcHeaderHeight: baseBtcHeaderHeight, BaseBtcHeaderHex: baseBtcHeaderHex, GenesisTime: genesisTime, + InflationRateChange: inflationRateChange, + InflationMax: inflationMax, + InflationMin: inflationMin, + GoalBonded: goalBonded, + BlocksPerYear: blocksPerYear, } } diff --git a/cmd/babylond/cmd/genesis.go b/cmd/babylond/cmd/genesis.go index 9caf49a22..fc90db703 100644 --- a/cmd/babylond/cmd/genesis.go +++ b/cmd/babylond/cmd/genesis.go @@ -64,7 +64,9 @@ Example: genesisParams = TestnetGenesisParams(genesisCliArgs.MaxActiveValidators, genesisCliArgs.BtcConfirmationDepth, genesisCliArgs.BtcFinalizationTimeout, genesisCliArgs.EpochInterval, genesisCliArgs.BaseBtcHeaderHex, - genesisCliArgs.BaseBtcHeaderHeight, genesisCliArgs.GenesisTime) + genesisCliArgs.BaseBtcHeaderHeight, genesisCliArgs.InflationRateChange, + genesisCliArgs.InflationMin, genesisCliArgs.InflationMax, genesisCliArgs.GoalBonded, + genesisCliArgs.BlocksPerYear, genesisCliArgs.GenesisTime) } else if network == "mainnet" { // TODO: mainnet genesis params panic("Mainnet params not implemented.") @@ -191,7 +193,9 @@ type GenesisParams struct { func TestnetGenesisParams(maxActiveValidators uint32, btcConfirmationDepth uint64, btcFinalizationTimeout uint64, epochInterval uint64, baseBtcHeaderHex string, - baseBtcHeaderHeight uint64, genesisTime time.Time) GenesisParams { + baseBtcHeaderHeight uint64, inflationRateChange float64, + inflationMin float64, inflationMax float64, goalBonded float64, + blocksPerYear uint64, genesisTime time.Time) GenesisParams { genParams := GenesisParams{} @@ -226,6 +230,12 @@ func TestnetGenesisParams(maxActiveValidators uint32, btcConfirmationDepth uint6 genParams.MintParams = minttypes.DefaultParams() genParams.MintParams.MintDenom = genParams.NativeCoinMetadatas[0].Base + genParams.MintParams.BlocksPerYear = blocksPerYear + // This should always work as inflation rate is already a float64 + genParams.MintParams.InflationRateChange = sdk.MustNewDecFromStr(fmt.Sprintf("%f", inflationRateChange)) + genParams.MintParams.InflationMin = sdk.MustNewDecFromStr(fmt.Sprintf("%f", inflationMin)) + genParams.MintParams.InflationMax = sdk.MustNewDecFromStr(fmt.Sprintf("%f", inflationMax)) + genParams.MintParams.GoalBonded = sdk.MustNewDecFromStr(fmt.Sprintf("%f", goalBonded)) genParams.GovParams = govv1.DefaultParams() genParams.GovParams.DepositParams.MinDeposit = sdk.NewCoins(sdk.NewCoin( diff --git a/cmd/babylond/cmd/testnet.go b/cmd/babylond/cmd/testnet.go index 6cd7d9b74..534db601b 100644 --- a/cmd/babylond/cmd/testnet.go +++ b/cmd/babylond/cmd/testnet.go @@ -98,7 +98,9 @@ Example: genesisParams := TestnetGenesisParams(genesisCliArgs.MaxActiveValidators, genesisCliArgs.BtcConfirmationDepth, genesisCliArgs.BtcFinalizationTimeout, genesisCliArgs.EpochInterval, genesisCliArgs.BaseBtcHeaderHex, - genesisCliArgs.BaseBtcHeaderHeight, genesisCliArgs.GenesisTime) + genesisCliArgs.BaseBtcHeaderHeight, genesisCliArgs.InflationRateChange, + genesisCliArgs.InflationMin, genesisCliArgs.InflationMax, genesisCliArgs.GoalBonded, + genesisCliArgs.BlocksPerYear, genesisCliArgs.GenesisTime) return InitTestnet( clientCtx, cmd, config, mbm, genBalIterator, outputDir, genesisCliArgs.ChainID, minGasPrices, From 093ebe5f2e7104d276db28873c4d336ec28f1bb3 Mon Sep 17 00:00:00 2001 From: KonradStaniec Date: Mon, 20 Feb 2023 08:54:28 +0100 Subject: [PATCH 04/59] fix gas cost of insert header (#309) * fix gas cost of insert header --- app/app.go | 4 +++- testutil/keeper/btccheckpoint.go | 2 ++ x/btccheckpoint/abci.go | 16 ++++++++++++++++ x/btccheckpoint/keeper/hooks.go | 4 ++-- x/btccheckpoint/keeper/keeper.go | 18 ++++++++++++++++++ x/btccheckpoint/module.go | 3 ++- x/btccheckpoint/types/keys.go | 15 ++++++++++++--- 7 files changed, 55 insertions(+), 7 deletions(-) create mode 100644 x/btccheckpoint/abci.go diff --git a/app/app.go b/app/app.go index 6790210f7..112ceb159 100644 --- a/app/app.go +++ b/app/app.go @@ -298,7 +298,8 @@ func NewBabylonApp( ibctransfertypes.StoreKey, zctypes.StoreKey, ) - tkeys := sdk.NewTransientStoreKeys(paramstypes.TStoreKey) + tkeys := sdk.NewTransientStoreKeys( + paramstypes.TStoreKey, btccheckpointtypes.TStoreKey) // NOTE: The testingkey is just mounted for testing purposes. Actual applications should // not include this key. memKeys := sdk.NewMemoryStoreKeys(capabilitytypes.MemStoreKey, "testingkey") @@ -518,6 +519,7 @@ func NewBabylonApp( btccheckpointkeeper.NewKeeper( appCodec, keys[btccheckpointtypes.StoreKey], + tkeys[btccheckpointtypes.TStoreKey], keys[btccheckpointtypes.MemStoreKey], app.GetSubspace(btccheckpointtypes.ModuleName), &btclightclientKeeper, diff --git a/testutil/keeper/btccheckpoint.go b/testutil/keeper/btccheckpoint.go index e106a43c5..fd417b225 100644 --- a/testutil/keeper/btccheckpoint.go +++ b/testutil/keeper/btccheckpoint.go @@ -26,6 +26,7 @@ func NewBTCCheckpointKeeper( ek btcctypes.CheckpointingKeeper, powLimit *big.Int) (*keeper.Keeper, sdk.Context) { storeKey := sdk.NewKVStoreKey(btcctypes.StoreKey) + tstoreKey := sdk.NewTransientStoreKey(btcctypes.TStoreKey) memStoreKey := storetypes.NewMemoryStoreKey(btcctypes.MemStoreKey) db := tmdb.NewMemDB() @@ -47,6 +48,7 @@ func NewBTCCheckpointKeeper( k := keeper.NewKeeper( cdc, storeKey, + tstoreKey, memStoreKey, paramsSubspace, lk, diff --git a/x/btccheckpoint/abci.go b/x/btccheckpoint/abci.go new file mode 100644 index 000000000..63851f45c --- /dev/null +++ b/x/btccheckpoint/abci.go @@ -0,0 +1,16 @@ +package btccheckpoint + +import ( + "github.com/babylonchain/babylon/x/btccheckpoint/keeper" + sdk "github.com/cosmos/cosmos-sdk/types" + abci "github.com/tendermint/tendermint/abci/types" +) + +// EndBlocker checks if during block execution btc light client head had been +// updated. If the head had been updated, status of all available checkpoints +// is checked to determine if any of them became confirmed/finalized/abandonded. +func EndBlocker(ctx sdk.Context, k keeper.Keeper, req abci.RequestEndBlock) { + if k.BtcLightClientUpdated(ctx) { + k.OnTipChange(ctx) + } +} diff --git a/x/btccheckpoint/keeper/hooks.go b/x/btccheckpoint/keeper/hooks.go index c70d2654d..126e49fbd 100644 --- a/x/btccheckpoint/keeper/hooks.go +++ b/x/btccheckpoint/keeper/hooks.go @@ -21,11 +21,11 @@ var _ HandledHooks = Hooks{} func (k Keeper) Hooks() Hooks { return Hooks{k} } func (h Hooks) AfterBTCRollBack(ctx sdk.Context, headerInfo *ltypes.BTCHeaderInfo) { - h.k.OnTipChange(ctx) + h.k.setBtcLightClientUpdated(ctx) } func (h Hooks) AfterBTCRollForward(ctx sdk.Context, headerInfo *ltypes.BTCHeaderInfo) { - h.k.OnTipChange(ctx) + h.k.setBtcLightClientUpdated(ctx) } func (h Hooks) AfterBTCHeaderInserted(ctx sdk.Context, headerInfo *ltypes.BTCHeaderInfo) {} diff --git a/x/btccheckpoint/keeper/keeper.go b/x/btccheckpoint/keeper/keeper.go index d49b87b1c..06c4dd5e8 100644 --- a/x/btccheckpoint/keeper/keeper.go +++ b/x/btccheckpoint/keeper/keeper.go @@ -20,6 +20,7 @@ type ( Keeper struct { cdc codec.BinaryCodec storeKey storetypes.StoreKey + tstoreKey storetypes.StoreKey memKey storetypes.StoreKey paramstore paramtypes.Subspace btcLightClientKeeper types.BTCLightClientKeeper @@ -60,6 +61,7 @@ const ( func NewKeeper( cdc codec.BinaryCodec, storeKey, + tstoreKey, memKey storetypes.StoreKey, ps paramtypes.Subspace, bk types.BTCLightClientKeeper, @@ -75,6 +77,7 @@ func NewKeeper( return Keeper{ cdc: cdc, storeKey: storeKey, + tstoreKey: tstoreKey, memKey: memKey, paramstore: ps, btcLightClientKeeper: bk, @@ -347,6 +350,21 @@ func (k Keeper) OnTipChange(ctx sdk.Context) { k.checkCheckpoints(ctx) } +func (k Keeper) setBtcLightClientUpdated(ctx sdk.Context) { + store := ctx.TransientStore(k.tstoreKey) + store.Set(types.GetBtcLightClientUpdatedKey(), []byte{1}) +} + +// BtcLightClientUpdated checks if btc light client was updated during block execution +func (k Keeper) BtcLightClientUpdated(ctx sdk.Context) bool { + // transient store is cleared after each block execution, therfore if + // BtcLightClientKey is set, it means setBtcLightClientUpdated was called during + // current block execution + store := ctx.TransientStore(k.tstoreKey) + lcUpdated := store.Get(types.GetBtcLightClientUpdatedKey()) + return len(lcUpdated) > 0 +} + func (k Keeper) getLastFinalizedEpochNumber(ctx sdk.Context) uint64 { store := ctx.KVStore(k.storeKey) epoch := store.Get(types.GetLatestFinalizedEpochKey()) diff --git a/x/btccheckpoint/module.go b/x/btccheckpoint/module.go index debdbf97b..a25079770 100644 --- a/x/btccheckpoint/module.go +++ b/x/btccheckpoint/module.go @@ -172,6 +172,7 @@ func (am AppModule) BeginBlock(_ sdk.Context, _ abci.RequestBeginBlock) {} // EndBlock executes all ABCI EndBlock logic respective to the capability module. It // returns no validator updates. -func (am AppModule) EndBlock(_ sdk.Context, _ abci.RequestEndBlock) []abci.ValidatorUpdate { +func (am AppModule) EndBlock(ctx sdk.Context, req abci.RequestEndBlock) []abci.ValidatorUpdate { + EndBlocker(ctx, am.keeper, req) return []abci.ValidatorUpdate{} } diff --git a/x/btccheckpoint/types/keys.go b/x/btccheckpoint/types/keys.go index 138778787..8d831ef95 100644 --- a/x/btccheckpoint/types/keys.go +++ b/x/btccheckpoint/types/keys.go @@ -18,16 +18,21 @@ const ( // QuerierRoute defines the module's query routing key QuerierRoute = ModuleName + TStoreKey = "transient_btccheckpoint" + // MemStoreKey defines the in-memory store key MemStoreKey = "mem_btccheckpoint" LatestFinalizedEpochKey = "latestFinalizedEpoch" + + btcLightClientUpdated = "btcLightClientUpdated" ) var ( - SubmisionKeyPrefix = []byte{3} - EpochDataPrefix = []byte{4} - LastFinalizedEpochKey = append([]byte{5}, []byte(LatestFinalizedEpochKey)...) + SubmisionKeyPrefix = []byte{3} + EpochDataPrefix = []byte{4} + LastFinalizedEpochKey = append([]byte{5}, []byte(LatestFinalizedEpochKey)...) + BtcLightClientUpdatedKey = append([]byte{6}, []byte(btcLightClientUpdated)...) ) func KeyPrefix(p string) []byte { @@ -45,3 +50,7 @@ func GetEpochIndexKey(e uint64) []byte { func GetLatestFinalizedEpochKey() []byte { return LastFinalizedEpochKey } + +func GetBtcLightClientUpdatedKey() []byte { + return BtcLightClientUpdatedKey +} From 27d3e1762bc5aaf86c1fa5bd2adfc20459e4fccf Mon Sep 17 00:00:00 2001 From: Cirrus Gai Date: Mon, 20 Feb 2023 22:30:58 +0800 Subject: [PATCH 05/59] feat: Checkpointing/Add fee estimation in sending BLS-sig tx (#307) --- app/utils.go | 1 + client/tx/tx.go | 37 ++++++++---- cmd/babylond/cmd/custom_babylon_config.go | 25 ++++++-- types/signer_config.go | 72 +++++++++++++++++++++++ x/checkpointing/keeper/bls_signer.go | 8 ++- x/checkpointing/keeper/bls_signer_test.go | 49 +-------------- x/checkpointing/keeper/keeper.go | 10 ++-- x/checkpointing/keeper/msg_server.go | 7 ++- 8 files changed, 137 insertions(+), 72 deletions(-) diff --git a/app/utils.go b/app/utils.go index 9705ebe72..1cd4bb8f9 100644 --- a/app/utils.go +++ b/app/utils.go @@ -78,6 +78,7 @@ func InitPrivSigner(clientCtx client.Context, nodeDir string, kr keyring.Keyring ClientCtx: clientCtx, }, nil } + func CreateClientConfig(chainID string, backend string, homePath string) (*config.ClientConfig, error) { cliConf := &config.ClientConfig{ ChainID: chainID, diff --git a/client/tx/tx.go b/client/tx/tx.go index 1460728d7..5701bc471 100644 --- a/client/tx/tx.go +++ b/client/tx/tx.go @@ -1,14 +1,14 @@ package tx import ( + "errors" "fmt" - appparams "github.com/babylonchain/babylon/app/params" "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/client/flags" sdktx "github.com/cosmos/cosmos-sdk/client/tx" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/spf13/pflag" + + "github.com/babylonchain/babylon/types" ) func SendMsgToTendermint(clientCtx client.Context, msg sdk.Msg) (*sdk.TxResponse, error) { @@ -22,16 +22,16 @@ func SendMsgsToTendermint(clientCtx client.Context, msgs []sdk.Msg) (*sdk.TxResp } } - // TODO make the fee dynamic - fs := pflag.NewFlagSet("", pflag.ContinueOnError) - fs.String(flags.FlagFees, "", "Fees to pay along with transaction; eg: 10ubbn") - fee := fmt.Sprintf("100%s", appparams.BaseCoinUnit) - err := fs.Set(flags.FlagFees, fee) - if err != nil { - return nil, err - } - - txf := sdktx.NewFactoryCLI(clientCtx, fs) + gasPrice, gasAdjustment := types.MustGetGasSettings(clientCtx.HomeDir, clientCtx.Viper) + txf := sdktx.Factory{}. + WithTxConfig(clientCtx.TxConfig). + WithAccountRetriever(clientCtx.AccountRetriever). + WithKeybase(clientCtx.Keyring). + WithChainID(clientCtx.ChainID). + WithFeeGranter(clientCtx.FeeGranter). + WithFeePayer(clientCtx.FeePayer). + WithGasPrices(gasPrice). + WithGasAdjustment(gasAdjustment) return BroadcastTx(clientCtx, txf, msgs...) } @@ -47,6 +47,17 @@ func BroadcastTx(clientCtx client.Context, txf sdktx.Factory, msgs ...sdk.Msg) ( return nil, err } + _, adjusted, err := sdktx.CalculateGas(clientCtx, txf, msgs...) + if err != nil { + return nil, err + } + + if adjusted <= 0 { + return nil, errors.New("calculated gas should be positive") + } + + txf = txf.WithGas(adjusted) + tx, err := txf.BuildUnsignedTx(msgs...) if err != nil { return nil, err diff --git a/cmd/babylond/cmd/custom_babylon_config.go b/cmd/babylond/cmd/custom_babylon_config.go index 4a0917d37..b214f9ba3 100644 --- a/cmd/babylond/cmd/custom_babylon_config.go +++ b/cmd/babylond/cmd/custom_babylon_config.go @@ -1,9 +1,16 @@ package cmd import ( + serverconfig "github.com/cosmos/cosmos-sdk/server/config" + txformat "github.com/babylonchain/babylon/btctxformatter" bbn "github.com/babylonchain/babylon/types" - serverconfig "github.com/cosmos/cosmos-sdk/server/config" +) + +const ( + defaultKeyName = "default" + defaultGasPrice = "0.01ubbn" + defaultGasAdjustment = 1.5 ) type BtcConfig struct { @@ -15,16 +22,22 @@ type BtcConfig struct { func defaultBabylonBtcConfig() BtcConfig { return BtcConfig{ Network: string(bbn.BtcMainnet), - CheckpointTag: string(txformat.DefaultMainTagStr), + CheckpointTag: txformat.DefaultMainTagStr, } } func defaultSignerConfig() SignerConfig { - return SignerConfig{KeyName: ""} + return SignerConfig{ + KeyName: defaultKeyName, + GasPrice: defaultGasPrice, + GasAdjustment: defaultGasAdjustment, + } } type SignerConfig struct { - KeyName string `mapstructure:"key-name"` + KeyName string `mapstructure:"key-name"` + GasPrice string `mapstructure:"gas-price"` + GasAdjustment float64 `mapstructure:"gas-adjustment"` } type BabylonAppConfig struct { @@ -64,5 +77,9 @@ checkpoint-tag = "{{ .BtcConfig.CheckpointTag }}" # Configures which key that the BLS signer uses to sign BLS-sig transactions key-name = "{{ .SignerConfig.KeyName }}" +# Configures the gas-price that the signer would like to pay +gas-price = "{{ .SignerConfig.GasPrice }}" +# Configures the adjustment of the gas cost of estimation +gas-adjustment = "{{ .SignerConfig.GasAdjustment }}" ` } diff --git a/types/signer_config.go b/types/signer_config.go index 0b82f3615..0ad3298cf 100644 --- a/types/signer_config.go +++ b/types/signer_config.go @@ -1,8 +1,12 @@ package types import ( + "errors" + servertypes "github.com/cosmos/cosmos-sdk/server/types" + sdk "github.com/cosmos/cosmos-sdk/types" "github.com/spf13/cast" + "github.com/spf13/viper" ) func ParseKeyNameFromConfig(opts servertypes.AppOptions) string { @@ -17,3 +21,71 @@ func ParseKeyNameFromConfig(opts servertypes.AppOptions) string { return keyName } + +func parseGasPriceFromConfig(opts servertypes.AppOptions) (string, error) { + valueInterface := opts.Get("signer-config.gas-price") + if valueInterface == nil { + return "", errors.New("signer gas price should be provided in options") + } + gasPrice, err := cast.ToStringE(valueInterface) + if err != nil { + return "", errors.New("signer gas price should be valid string") + } + + coin, err := sdk.ParseDecCoin(gasPrice) + if err != nil { + return "", errors.New("signer gas price is invalid") + } + + if !coin.Amount.IsPositive() { + return "", errors.New("gas price should be positive") + } + + return gasPrice, nil +} + +func parseGasAdjustmentFromConfig(opts servertypes.AppOptions) (float64, error) { + valueInterface := opts.Get("signer-config.gas-adjustment") + if valueInterface == nil { + return 0, errors.New("signer gas adjustment should be provided in options") + } + gasAdjustment, err := cast.ToFloat64E(valueInterface) + if err != nil { + return 0, errors.New("signer gas adjustment should be valid float number") + } + + if gasAdjustment <= 1 { + return 0, errors.New("signer gas adjustment should be more than 1") + } + + return gasAdjustment, nil +} + +// MustGetGasSettings reads GasPrice and GasAdjustment from app.toml file +func MustGetGasSettings(configPath string, v *viper.Viper) (string, float64) { + var ( + gasPrice string + gasAdjustment float64 + err error + ) + + v.AddConfigPath(configPath) + v.SetConfigName("app") + v.SetConfigType("toml") + + if err := v.ReadInConfig(); err != nil { + panic("failed to read app.toml") + } + + gasPrice, err = parseGasPriceFromConfig(v) + if err != nil { + panic(err) + } + + gasAdjustment, err = parseGasAdjustmentFromConfig(v) + if err != nil { + panic(err) + } + + return gasPrice, gasAdjustment +} diff --git a/x/checkpointing/keeper/bls_signer.go b/x/checkpointing/keeper/bls_signer.go index 56009ccad..2aace4042 100644 --- a/x/checkpointing/keeper/bls_signer.go +++ b/x/checkpointing/keeper/bls_signer.go @@ -6,11 +6,12 @@ import ( epochingtypes "github.com/babylonchain/babylon/x/epoching/types" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/babylonchain/babylon/client/tx" "github.com/babylonchain/babylon/crypto/bls12381" "github.com/babylonchain/babylon/types/retry" "github.com/babylonchain/babylon/x/checkpointing/types" - sdk "github.com/cosmos/cosmos-sdk/types" ) type BlsSigner interface { @@ -43,8 +44,9 @@ func (k Keeper) SendBlsSig(ctx sdk.Context, epochNum uint64, lch types.LastCommi // keep sending the message to Tendermint until success or timeout // TODO should read the parameters from config file + var res *sdk.TxResponse err = retry.Do(1*time.Second, 1*time.Minute, func() error { - _, err := tx.SendMsgToTendermint(k.clientCtx, msg) + res, err = tx.SendMsgToTendermint(k.clientCtx, msg) if err != nil { return err } @@ -55,7 +57,7 @@ func (k Keeper) SendBlsSig(ctx sdk.Context, epochNum uint64, lch types.LastCommi return err } - ctx.Logger().Info(fmt.Sprintf("Successfully sent BLS-sig tx for epoch %v", epochNum)) + ctx.Logger().Info(fmt.Sprintf("Successfully sent BLS-sig tx for epoch %d, tx hash: %s, gas used: %d, gas wanted: %d", epochNum, res.TxHash, res.GasUsed, res.GasWanted)) return nil } diff --git a/x/checkpointing/keeper/bls_signer_test.go b/x/checkpointing/keeper/bls_signer_test.go index b204c667a..a6b367238 100644 --- a/x/checkpointing/keeper/bls_signer_test.go +++ b/x/checkpointing/keeper/bls_signer_test.go @@ -1,21 +1,11 @@ package keeper_test import ( - "fmt" - "testing" + "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" + sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/babylonchain/babylon/app" "github.com/babylonchain/babylon/crypto/bls12381" - testkeeper "github.com/babylonchain/babylon/testutil/keeper" - "github.com/babylonchain/babylon/testutil/mocks" epochingtypes "github.com/babylonchain/babylon/x/epoching/types" - "github.com/cosmos/cosmos-sdk/client/flags" - "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" - "github.com/cosmos/cosmos-sdk/testutil/network" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/golang/mock/gomock" - "github.com/stretchr/testify/require" - "github.com/tendermint/tendermint/crypto/tmhash" ) var ( @@ -38,38 +28,3 @@ var ( blsPubKey2 = blsPrivKey2.PubKey() pubkeys = []bls12381.PublicKey{blsPubKey1, blsPubKey2} ) - -func TestKeeper_SendBlsSig(t *testing.T) { - cfg := network.DefaultConfig() - encodingCfg := app.MakeTestEncodingConfig() - cfg.InterfaceRegistry = encodingCfg.InterfaceRegistry - cfg.TxConfig = encodingCfg.TxConfig - cfg.NumValidators = 1 - - testNetwork, err := network.New(t, t.TempDir(), cfg) - require.NoError(t, err) - defer testNetwork.Cleanup() - - val := testNetwork.Validators[0] - nodeDirName := fmt.Sprintf("node%d", 0) - clientCtx := val.ClientCtx.WithHeight(2). - WithFromAddress(val.Address). - WithFromName(nodeDirName). - WithBroadcastMode(flags.BroadcastAsync) - clientCtx.SkipConfirm = true - - epochNum := uint64(10) - lch := tmhash.Sum([]byte("last_commit_hash")) - signBytes := append(sdk.Uint64ToBigEndian(epochNum), lch...) - - ctrl := gomock.NewController(t) - defer ctrl.Finish() - ek := mocks.NewMockEpochingKeeper(ctrl) - signer := mocks.NewMockBlsSigner(ctrl) - ckptkeeper, ctx, _ := testkeeper.CheckpointingKeeper(t, ek, signer, clientCtx) - - signer.EXPECT().GetAddress().Return(addr1) - signer.EXPECT().SignMsgWithBls(gomock.Eq(signBytes)).Return(bls12381.Sign(blsPrivKey1, signBytes), nil) - err = ckptkeeper.SendBlsSig(ctx, epochNum, lch, valSet) - require.NoError(t, err) -} diff --git a/x/checkpointing/keeper/keeper.go b/x/checkpointing/keeper/keeper.go index 69c0e0647..a8167b684 100644 --- a/x/checkpointing/keeper/keeper.go +++ b/x/checkpointing/keeper/keeper.go @@ -3,17 +3,19 @@ package keeper import ( "errors" "fmt" + txformat "github.com/babylonchain/babylon/btctxformatter" - "github.com/babylonchain/babylon/crypto/bls12381" - "github.com/babylonchain/babylon/x/checkpointing/types" - epochingtypes "github.com/babylonchain/babylon/x/epoching/types" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/codec" storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" "github.com/tendermint/tendermint/libs/log" + + "github.com/babylonchain/babylon/crypto/bls12381" + "github.com/babylonchain/babylon/x/checkpointing/types" + epochingtypes "github.com/babylonchain/babylon/x/epoching/types" ) type ( @@ -136,7 +138,7 @@ func (k Keeper) addBlsSig(ctx sdk.Context, sig *types.BlsSig) error { // if reaching this line, it means ckptWithMeta is updated, // and we need to write the updated ckptWithMeta back to KVStore - if err := k.UpdateCheckpoint(ctx, ckptWithMeta); err != nil { + if err = k.UpdateCheckpoint(ctx, ckptWithMeta); err != nil { return err } diff --git a/x/checkpointing/keeper/msg_server.go b/x/checkpointing/keeper/msg_server.go index 15e0a446e..b1a13e7de 100644 --- a/x/checkpointing/keeper/msg_server.go +++ b/x/checkpointing/keeper/msg_server.go @@ -2,9 +2,12 @@ package keeper import ( "context" - epochingtypes "github.com/babylonchain/babylon/x/epoching/types" + "fmt" + sdk "github.com/cosmos/cosmos-sdk/types" + epochingtypes "github.com/babylonchain/babylon/x/epoching/types" + "github.com/babylonchain/babylon/x/checkpointing/types" ) @@ -24,6 +27,8 @@ var _ types.MsgServer = msgServer{} func (m msgServer) AddBlsSig(goCtx context.Context, msg *types.MsgAddBlsSig) (*types.MsgAddBlsSigResponse, error) { ctx := sdk.UnwrapSDKContext(goCtx) + ctx.Logger().Info(fmt.Sprintf("received BLS sig for epoch %d from %s", msg.BlsSig.EpochNum, msg.GetSigners())) + err := m.k.addBlsSig(ctx, msg.BlsSig) if err != nil { return nil, err From 570860e26a6c697381238726dfe39368853adf5d Mon Sep 17 00:00:00 2001 From: Cirrus Gai Date: Tue, 21 Feb 2023 15:21:29 +0800 Subject: [PATCH 06/59] chore: Keep a single encoding config in the application (#308) --- app/app_test.go | 4 ++-- app/encoding.go | 18 ++++++++------ app/modules.go | 2 +- app/params/proto.go | 14 +++++------ app/test_helpers.go | 16 ++++++++----- app/utils.go | 6 ++--- cmd/babylond/cmd/add_gen_bls_test.go | 5 ++-- cmd/babylond/cmd/genaccounts_test.go | 7 +++--- cmd/babylond/cmd/genbls_test.go | 2 +- cmd/babylond/cmd/root.go | 6 ++--- cmd/babylond/cmd/testnet_test.go | 5 ++-- cmd/babylond/cmd/validate_genesis_test.go | 4 ++-- simapp/sim_bench_test.go | 4 ++-- simapp/sim_test.go | 24 ++++++++++--------- test/e2e/util/codec.go | 2 +- test/utils.go | 15 ++++++------ x/checkpointing/client/cli/tx_test.go | 13 +++++----- x/epoching/simulation/decoder_test.go | 12 ++++++---- x/zoneconcierge/keeper/keeper_test.go | 9 +++---- .../keeper/proof_tx_in_block_test.go | 7 +++--- x/zoneconcierge/module_ibc_packet_test.go | 7 +++--- x/zoneconcierge/module_test.go | 7 +++--- 22 files changed, 103 insertions(+), 86 deletions(-) diff --git a/app/app_test.go b/app/app_test.go index 429796666..df3f279e6 100644 --- a/app/app_test.go +++ b/app/app_test.go @@ -11,7 +11,7 @@ import ( ) func TestBabylonBlockedAddrs(t *testing.T) { - encCfg := MakeTestEncodingConfig() + encCfg := GetEncodingConfig() db := dbm.NewMemDB() signer, _ := SetupPrivSigner() logger := log.NewTMLogger(log.NewSyncWriter(os.Stdout)) @@ -48,7 +48,7 @@ func TestGetMaccPerms(t *testing.T) { } func TestUpgradeStateOnGenesis(t *testing.T) { - encCfg := MakeTestEncodingConfig() + encCfg := GetEncodingConfig() db := dbm.NewMemDB() privSigner, err := SetupPrivSigner() require.NoError(t, err) diff --git a/app/encoding.go b/app/encoding.go index c414f23f0..800f0e302 100644 --- a/app/encoding.go +++ b/app/encoding.go @@ -1,16 +1,20 @@ package app import ( - appparams "github.com/babylonchain/babylon/app/params" "github.com/cosmos/cosmos-sdk/std" + + appparams "github.com/babylonchain/babylon/app/params" ) -// MakeTestEncodingConfig creates an EncodingConfig for testing. This function -// should be used only in tests or when creating a new app instance (NewApp*()). -// App user shouldn't create new codecs - use the app.AppCodec instead. -// [DEPRECATED] -func MakeTestEncodingConfig() appparams.EncodingConfig { - encodingConfig := appparams.MakeTestEncodingConfig() +var encodingConfig = makeEncodingConfig() + +func GetEncodingConfig() appparams.EncodingConfig { + return encodingConfig +} + +// makeEncodingConfig creates an EncodingConfig. +func makeEncodingConfig() appparams.EncodingConfig { + encodingConfig := appparams.GetEncodingConfig() std.RegisterLegacyAminoCodec(encodingConfig.Amino) std.RegisterInterfaces(encodingConfig.InterfaceRegistry) ModuleBasics.RegisterLegacyAminoCodec(encodingConfig.Amino) diff --git a/app/modules.go b/app/modules.go index d3fafbc66..8a9252c50 100644 --- a/app/modules.go +++ b/app/modules.go @@ -23,5 +23,5 @@ func (app *BabylonApp) GetScopedIBCKeeper() capabilitykeeper.ScopedKeeper { } func (app *BabylonApp) GetTxConfig() client.TxConfig { - return MakeTestEncodingConfig().TxConfig + return GetEncodingConfig().TxConfig } diff --git a/app/params/proto.go b/app/params/proto.go index a752d1079..f2f36aae3 100644 --- a/app/params/proto.go +++ b/app/params/proto.go @@ -9,19 +9,17 @@ import ( "github.com/cosmos/cosmos-sdk/x/auth/tx" ) -// MakeTestEncodingConfig creates an EncodingConfig for a non-amino based test configuration. -// This function should be used only internally (in the SDK). -// App user should'nt create new codecs - use the app.AppCodec instead. -// [DEPRECATED] -func MakeTestEncodingConfig() EncodingConfig { - cdc := codec.NewLegacyAmino() +// GetEncodingConfig creates an EncodingConfig for an amino based test configuration. +func GetEncodingConfig() EncodingConfig { + amino := codec.NewLegacyAmino() interfaceRegistry := types.NewInterfaceRegistry() marshaler := codec.NewProtoCodec(interfaceRegistry) + txCfg := tx.NewTxConfig(marshaler, tx.DefaultSignModes) return EncodingConfig{ InterfaceRegistry: interfaceRegistry, Marshaler: marshaler, - TxConfig: tx.NewTxConfig(marshaler, tx.DefaultSignModes), - Amino: cdc, + TxConfig: txCfg, + Amino: amino, } } diff --git a/app/test_helpers.go b/app/test_helpers.go index 170e95d19..e02cf9fde 100644 --- a/app/test_helpers.go +++ b/app/test_helpers.go @@ -13,13 +13,13 @@ import ( "cosmossdk.io/math" tmconfig "github.com/tendermint/tendermint/config" + tmjson "github.com/tendermint/tendermint/libs/json" + + "github.com/babylonchain/babylon/testutil/datagen" + "github.com/babylonchain/babylon/app/params" appparams "github.com/babylonchain/babylon/app/params" - "github.com/babylonchain/babylon/testutil/datagen" - tmjson "github.com/tendermint/tendermint/libs/json" - txformat "github.com/babylonchain/babylon/btctxformatter" - bbn "github.com/babylonchain/babylon/types" bam "github.com/cosmos/cosmos-sdk/baseapp" "github.com/cosmos/cosmos-sdk/client" codectypes "github.com/cosmos/cosmos-sdk/codec/types" @@ -43,6 +43,9 @@ import ( tmproto "github.com/tendermint/tendermint/proto/tendermint/types" tmtypes "github.com/tendermint/tendermint/types" dbm "github.com/tendermint/tm-db" + + txformat "github.com/babylonchain/babylon/btctxformatter" + bbn "github.com/babylonchain/babylon/types" ) // DefaultConsensusParams defines the default Tendermint consensus params used in @@ -77,7 +80,7 @@ type SetupOptions struct { func setup(withGenesis bool, invCheckPeriod uint) (*BabylonApp, GenesisState) { db := dbm.NewMemDB() - encCdc := MakeTestEncodingConfig() + encCdc := GetEncodingConfig() privSigner, err := SetupPrivSigner() if err != nil { panic(err) @@ -242,7 +245,8 @@ func SetupPrivSigner() (*PrivSigner, error) { if err != nil { return nil, err } - privSigner, _ := InitPrivSigner(client.Context{}, ".", kr) + encodingCfg := appparams.GetEncodingConfig() + privSigner, _ := InitPrivSigner(client.Context{}, ".", kr, encodingCfg) privSigner.WrappedPV.Clean(nodeCfg.PrivValidatorKeyFile(), nodeCfg.PrivValidatorStateFile()) return privSigner, nil } diff --git a/app/utils.go b/app/utils.go index 1cd4bb8f9..2d11432bd 100644 --- a/app/utils.go +++ b/app/utils.go @@ -16,6 +16,7 @@ import ( tmconfig "github.com/tendermint/tendermint/config" tmos "github.com/tendermint/tendermint/libs/os" + appparams "github.com/babylonchain/babylon/app/params" "github.com/babylonchain/babylon/privval" ) @@ -43,7 +44,7 @@ type PrivSigner struct { ClientCtx client.Context } -func InitPrivSigner(clientCtx client.Context, nodeDir string, kr keyring.Keyring) (*PrivSigner, error) { +func InitPrivSigner(clientCtx client.Context, nodeDir string, kr keyring.Keyring, encodingCfg appparams.EncodingConfig) (*PrivSigner, error) { // setup private validator nodeCfg := tmconfig.DefaultConfig() pvKeyFile := filepath.Join(nodeDir, nodeCfg.PrivValidatorKeyFile()) @@ -58,9 +59,6 @@ func InitPrivSigner(clientCtx client.Context, nodeDir string, kr keyring.Keyring } wrappedPV := privval.LoadOrGenWrappedFilePV(pvKeyFile, pvStateFile) - // TODO this should probably not create separate config, but rahter accept it - // as argument - encodingCfg := MakeTestEncodingConfig() clientCtx = clientCtx. WithInterfaceRegistry(encodingCfg.InterfaceRegistry). WithCodec(encodingCfg.Marshaler). diff --git a/cmd/babylond/cmd/add_gen_bls_test.go b/cmd/babylond/cmd/add_gen_bls_test.go index f1e631ba3..ac6c34b2a 100644 --- a/cmd/babylond/cmd/add_gen_bls_test.go +++ b/cmd/babylond/cmd/add_gen_bls_test.go @@ -3,10 +3,11 @@ package cmd_test import ( "context" "fmt" - "github.com/cosmos/cosmos-sdk/server/config" "path/filepath" "testing" + "github.com/cosmos/cosmos-sdk/server/config" + "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" "github.com/cosmos/cosmos-sdk/server" @@ -36,7 +37,7 @@ func Test_AddGenBlsCmdWithoutGentx(t *testing.T) { tmcfg, err := genutiltest.CreateDefaultTendermintConfig(home) require.NoError(t, err) - appCodec := app.MakeTestEncodingConfig().Marshaler + appCodec := app.GetEncodingConfig().Marshaler err = genutiltest.ExecInitCmd(testMbm, home, appCodec) require.NoError(t, err) diff --git a/cmd/babylond/cmd/genaccounts_test.go b/cmd/babylond/cmd/genaccounts_test.go index ef8a2101a..803df1f55 100644 --- a/cmd/babylond/cmd/genaccounts_test.go +++ b/cmd/babylond/cmd/genaccounts_test.go @@ -13,8 +13,6 @@ import ( "github.com/stretchr/testify/require" "github.com/tendermint/tendermint/libs/log" - "github.com/babylonchain/babylon/app" - bbncmd "github.com/babylonchain/babylon/cmd/babylond/cmd" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" "github.com/cosmos/cosmos-sdk/server" @@ -22,6 +20,9 @@ import ( "github.com/cosmos/cosmos-sdk/types/module" "github.com/cosmos/cosmos-sdk/x/genutil" genutiltest "github.com/cosmos/cosmos-sdk/x/genutil/client/testutil" + + "github.com/babylonchain/babylon/app" + bbncmd "github.com/babylonchain/babylon/cmd/babylond/cmd" ) var testMbm = module.NewBasicManager(genutil.AppModuleBasic{}) @@ -73,7 +74,7 @@ func TestAddGenesisAccountCmd(t *testing.T) { cfg, err := genutiltest.CreateDefaultTendermintConfig(home) require.NoError(t, err) - appCodec := app.MakeTestEncodingConfig().Marshaler + appCodec := app.GetEncodingConfig().Marshaler err = genutiltest.ExecInitCmd(testMbm, home, appCodec) require.NoError(t, err) diff --git a/cmd/babylond/cmd/genbls_test.go b/cmd/babylond/cmd/genbls_test.go index 46904a3c6..5f7379a55 100644 --- a/cmd/babylond/cmd/genbls_test.go +++ b/cmd/babylond/cmd/genbls_test.go @@ -28,7 +28,7 @@ import ( func Test_GenBlsCmd(t *testing.T) { home := t.TempDir() - encodingConfig := app.MakeTestEncodingConfig() + encodingConfig := app.GetEncodingConfig() logger := log.NewNopLogger() cfg, err := genutiltest.CreateDefaultTendermintConfig(home) require.NoError(t, err) diff --git a/cmd/babylond/cmd/root.go b/cmd/babylond/cmd/root.go index c04b2dac8..43429f7f3 100644 --- a/cmd/babylond/cmd/root.go +++ b/cmd/babylond/cmd/root.go @@ -40,7 +40,7 @@ import ( // NewRootCmd creates a new root command for babylond. It is called once in the // main function. func NewRootCmd() (*cobra.Command, params.EncodingConfig) { - encodingConfig := app.MakeTestEncodingConfig() + encodingConfig := app.GetEncodingConfig() initClientCtx := client.Context{}. WithCodec(encodingConfig.Marshaler). WithInterfaceRegistry(encodingConfig.InterfaceRegistry). @@ -274,7 +274,7 @@ func (a appCreator) newApp(logger log.Logger, db dbm.DB, traceStore io.Writer, a if err != nil { panic(err) } - privSigner, err := app.InitPrivSigner(clientCtx, homeDir, clientCtx.Keyring) + privSigner, err := app.InitPrivSigner(clientCtx, homeDir, clientCtx.Keyring, a.encCfg) if err != nil { panic(err) } @@ -337,7 +337,7 @@ func (a appCreator) appExport( panic(err) } - privSigner, err := app.InitPrivSigner(clientCtx, homePath, kr) + privSigner, err := app.InitPrivSigner(clientCtx, homePath, kr, a.encCfg) if err != nil { panic(err) } diff --git a/cmd/babylond/cmd/testnet_test.go b/cmd/babylond/cmd/testnet_test.go index a8660c821..1fc62f834 100644 --- a/cmd/babylond/cmd/testnet_test.go +++ b/cmd/babylond/cmd/testnet_test.go @@ -5,7 +5,6 @@ import ( "fmt" "testing" - "github.com/babylonchain/babylon/app" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" "github.com/cosmos/cosmos-sdk/server" @@ -15,11 +14,13 @@ import ( "github.com/spf13/viper" "github.com/stretchr/testify/require" "github.com/tendermint/tendermint/libs/log" + + "github.com/babylonchain/babylon/app" ) func Test_TestnetCmd(t *testing.T) { home := t.TempDir() - encodingConfig := app.MakeTestEncodingConfig() + encodingConfig := app.GetEncodingConfig() logger := log.NewNopLogger() cfg, err := genutiltest.CreateDefaultTendermintConfig(home) require.NoError(t, err) diff --git a/cmd/babylond/cmd/validate_genesis_test.go b/cmd/babylond/cmd/validate_genesis_test.go index 070ce5037..aae452917 100644 --- a/cmd/babylond/cmd/validate_genesis_test.go +++ b/cmd/babylond/cmd/validate_genesis_test.go @@ -26,7 +26,7 @@ import ( func TestCheckCorrespondence(t *testing.T) { homePath := t.TempDir() - encodingCft := app.MakeTestEncodingConfig() + encodingCft := app.GetEncodingConfig() clientCtx := client.Context{}.WithCodec(encodingCft.Marshaler).WithTxConfig(encodingCft.TxConfig) // generate valid genesis doc @@ -85,7 +85,7 @@ func TestCheckCorrespondence(t *testing.T) { } func generateTestGenesisState(home string, n int) (map[string]json.RawMessage, *tmtypes.GenesisDoc) { - encodingConfig := app.MakeTestEncodingConfig() + encodingConfig := app.GetEncodingConfig() logger := log.NewNopLogger() cfg, _ := genutiltest.CreateDefaultTendermintConfig(home) diff --git a/simapp/sim_bench_test.go b/simapp/sim_bench_test.go index 7eb28b0d3..797931399 100644 --- a/simapp/sim_bench_test.go +++ b/simapp/sim_bench_test.go @@ -39,7 +39,7 @@ func BenchmarkFullAppSimulation(b *testing.B) { if err != nil { b.Fatal(err) } - babylon := app.NewBabylonApp(logger, db, nil, true, map[int64]bool{}, app.DefaultNodeHome, FlagPeriodValue, app.MakeTestEncodingConfig(), privSigner, sdksimapp.EmptyAppOptions{}, interBlockCacheOpt()) + babylon := app.NewBabylonApp(logger, db, nil, true, map[int64]bool{}, app.DefaultNodeHome, FlagPeriodValue, app.GetEncodingConfig(), privSigner, sdksimapp.EmptyAppOptions{}, interBlockCacheOpt()) // run randomized simulation _, simParams, simErr := simulation.SimulateFromSeed( @@ -93,7 +93,7 @@ func BenchmarkInvariants(b *testing.B) { if err != nil { b.Fatal(err) } - babylon := app.NewBabylonApp(logger, db, nil, true, map[int64]bool{}, app.DefaultNodeHome, FlagPeriodValue, app.MakeTestEncodingConfig(), privSigner, sdksimapp.EmptyAppOptions{}, interBlockCacheOpt()) + babylon := app.NewBabylonApp(logger, db, nil, true, map[int64]bool{}, app.DefaultNodeHome, FlagPeriodValue, app.GetEncodingConfig(), privSigner, sdksimapp.EmptyAppOptions{}, interBlockCacheOpt()) // run randomized simulation _, simParams, simErr := simulation.SimulateFromSeed( diff --git a/simapp/sim_test.go b/simapp/sim_test.go index e18fd3c35..4bab4fd39 100644 --- a/simapp/sim_test.go +++ b/simapp/sim_test.go @@ -12,13 +12,10 @@ import ( tmproto "github.com/tendermint/tendermint/proto/tendermint/types" dbm "github.com/tendermint/tm-db" - "github.com/babylonchain/babylon/app" storetypes "github.com/cosmos/cosmos-sdk/store/types" - btccheckpointtypes "github.com/babylonchain/babylon/x/btccheckpoint/types" - btclightclienttypes "github.com/babylonchain/babylon/x/btclightclient/types" - checkpointingtypes "github.com/babylonchain/babylon/x/checkpointing/types" - epochingtypes "github.com/babylonchain/babylon/x/epoching/types" + "github.com/babylonchain/babylon/app" + "github.com/cosmos/cosmos-sdk/baseapp" sdksimapp "github.com/cosmos/cosmos-sdk/simapp" "github.com/cosmos/cosmos-sdk/simapp/helpers" @@ -38,6 +35,11 @@ import ( slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" abci "github.com/tendermint/tendermint/abci/types" + + btccheckpointtypes "github.com/babylonchain/babylon/x/btccheckpoint/types" + btclightclienttypes "github.com/babylonchain/babylon/x/btclightclient/types" + checkpointingtypes "github.com/babylonchain/babylon/x/checkpointing/types" + epochingtypes "github.com/babylonchain/babylon/x/epoching/types" ) // Get flags every time the simulator is run @@ -77,7 +79,7 @@ func TestFullAppSimulation(t *testing.T) { privSigner, err := app.SetupPrivSigner() require.NoError(t, err) - babylon := app.NewBabylonApp(logger, db, nil, true, map[int64]bool{}, app.DefaultNodeHome, FlagPeriodValue, app.MakeTestEncodingConfig(), privSigner, sdksimapp.EmptyAppOptions{}, fauxMerkleModeOpt) + babylon := app.NewBabylonApp(logger, db, nil, true, map[int64]bool{}, app.DefaultNodeHome, FlagPeriodValue, app.GetEncodingConfig(), privSigner, sdksimapp.EmptyAppOptions{}, fauxMerkleModeOpt) require.Equal(t, "BabylonApp", babylon.Name()) // run randomized simulation @@ -117,7 +119,7 @@ func TestAppImportExport(t *testing.T) { privSigner, err := app.SetupPrivSigner() require.NoError(t, err) - babylon := app.NewBabylonApp(logger, db, nil, true, map[int64]bool{}, app.DefaultNodeHome, FlagPeriodValue, app.MakeTestEncodingConfig(), privSigner, sdksimapp.EmptyAppOptions{}, fauxMerkleModeOpt) + babylon := app.NewBabylonApp(logger, db, nil, true, map[int64]bool{}, app.DefaultNodeHome, FlagPeriodValue, app.GetEncodingConfig(), privSigner, sdksimapp.EmptyAppOptions{}, fauxMerkleModeOpt) require.Equal(t, "BabylonApp", babylon.Name()) // Run randomized simulation @@ -157,7 +159,7 @@ func TestAppImportExport(t *testing.T) { require.NoError(t, os.RemoveAll(newDir)) }() - newBabylon := app.NewBabylonApp(log.NewNopLogger(), newDB, nil, true, map[int64]bool{}, app.DefaultNodeHome, FlagPeriodValue, app.MakeTestEncodingConfig(), privSigner, sdksimapp.EmptyAppOptions{}, fauxMerkleModeOpt) + newBabylon := app.NewBabylonApp(log.NewNopLogger(), newDB, nil, true, map[int64]bool{}, app.DefaultNodeHome, FlagPeriodValue, app.GetEncodingConfig(), privSigner, sdksimapp.EmptyAppOptions{}, fauxMerkleModeOpt) require.Equal(t, "BabylonApp", newBabylon.Name()) var genesisState app.GenesisState @@ -221,7 +223,7 @@ func TestAppSimulationAfterImport(t *testing.T) { privSigner, err := app.SetupPrivSigner() require.NoError(t, err) - babylon := app.NewBabylonApp(logger, db, nil, true, map[int64]bool{}, app.DefaultNodeHome, FlagPeriodValue, app.MakeTestEncodingConfig(), privSigner, sdksimapp.EmptyAppOptions{}, fauxMerkleModeOpt) + babylon := app.NewBabylonApp(logger, db, nil, true, map[int64]bool{}, app.DefaultNodeHome, FlagPeriodValue, app.GetEncodingConfig(), privSigner, sdksimapp.EmptyAppOptions{}, fauxMerkleModeOpt) require.Equal(t, "BabylonApp", babylon.Name()) // Run randomized simulation @@ -266,7 +268,7 @@ func TestAppSimulationAfterImport(t *testing.T) { require.NoError(t, os.RemoveAll(newDir)) }() - newBabylon := app.NewBabylonApp(log.NewNopLogger(), newDB, nil, true, map[int64]bool{}, app.DefaultNodeHome, FlagPeriodValue, app.MakeTestEncodingConfig(), privSigner, sdksimapp.EmptyAppOptions{}, fauxMerkleModeOpt) + newBabylon := app.NewBabylonApp(log.NewNopLogger(), newDB, nil, true, map[int64]bool{}, app.DefaultNodeHome, FlagPeriodValue, app.GetEncodingConfig(), privSigner, sdksimapp.EmptyAppOptions{}, fauxMerkleModeOpt) require.Equal(t, "BabylonApp", newBabylon.Name()) newBabylon.InitChain(abci.RequestInitChain{ @@ -319,7 +321,7 @@ func TestAppStateDeterminism(t *testing.T) { db := dbm.NewMemDB() privSigner, err := app.SetupPrivSigner() require.NoError(t, err) - babylon := app.NewBabylonApp(logger, db, nil, true, map[int64]bool{}, app.DefaultNodeHome, FlagPeriodValue, app.MakeTestEncodingConfig(), privSigner, sdksimapp.EmptyAppOptions{}, interBlockCacheOpt()) + babylon := app.NewBabylonApp(logger, db, nil, true, map[int64]bool{}, app.DefaultNodeHome, FlagPeriodValue, app.GetEncodingConfig(), privSigner, sdksimapp.EmptyAppOptions{}, interBlockCacheOpt()) fmt.Printf( "running non-determinism simulation; seed %d: %d/%d, attempt: %d/%d\n", diff --git a/test/e2e/util/codec.go b/test/e2e/util/codec.go index 7fb561788..73e4bb911 100644 --- a/test/e2e/util/codec.go +++ b/test/e2e/util/codec.go @@ -22,7 +22,7 @@ func init() { } func initEncodingConfigAndCdc() (params.EncodingConfig, codec.Codec) { - encodingConfig := babylonApp.MakeTestEncodingConfig() + encodingConfig := babylonApp.GetEncodingConfig() encodingConfig.InterfaceRegistry.RegisterImplementations( (*sdk.Msg)(nil), diff --git a/test/utils.go b/test/utils.go index 532a78527..12bfec43b 100644 --- a/test/utils.go +++ b/test/utils.go @@ -8,12 +8,6 @@ import ( tm "github.com/cosmos/cosmos-sdk/client/grpc/tmservice" - "github.com/babylonchain/babylon/app" - appparams "github.com/babylonchain/babylon/app/params" - "github.com/babylonchain/babylon/testutil/datagen" - bbn "github.com/babylonchain/babylon/types" - btccheckpoint "github.com/babylonchain/babylon/x/btccheckpoint/types" - lightclient "github.com/babylonchain/babylon/x/btclightclient/types" "github.com/btcsuite/btcd/wire" "github.com/cosmos/cosmos-sdk/client/tx" "github.com/cosmos/cosmos-sdk/crypto/keyring" @@ -22,6 +16,13 @@ import ( acctypes "github.com/cosmos/cosmos-sdk/x/auth/types" "github.com/tendermint/tendermint/types" "google.golang.org/grpc" + + "github.com/babylonchain/babylon/app" + appparams "github.com/babylonchain/babylon/app/params" + "github.com/babylonchain/babylon/testutil/datagen" + bbn "github.com/babylonchain/babylon/types" + btccheckpoint "github.com/babylonchain/babylon/x/btccheckpoint/types" + lightclient "github.com/babylonchain/babylon/x/btclightclient/types" ) type TestTxSender struct { @@ -37,7 +38,7 @@ func NewTestTxSender( genesisPath string, conn *grpc.ClientConn, ) (*TestTxSender, error) { - cfg := app.MakeTestEncodingConfig() + cfg := app.GetEncodingConfig() kb, err := keyring.New("babylond", "test", keyringPath, nil, cfg.Marshaler) diff --git a/x/checkpointing/client/cli/tx_test.go b/x/checkpointing/client/cli/tx_test.go index c7150d3cc..155627884 100644 --- a/x/checkpointing/client/cli/tx_test.go +++ b/x/checkpointing/client/cli/tx_test.go @@ -22,11 +22,6 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/staking/client/cli" - "github.com/babylonchain/babylon/app" - "github.com/babylonchain/babylon/app/params" - "github.com/babylonchain/babylon/privval" - testutilcli "github.com/babylonchain/babylon/testutil/cli" - checkpointcli "github.com/babylonchain/babylon/x/checkpointing/client/cli" abci "github.com/tendermint/tendermint/abci/types" tmconfig "github.com/tendermint/tendermint/config" tmbytes "github.com/tendermint/tendermint/libs/bytes" @@ -35,6 +30,12 @@ import ( rpcclientmock "github.com/tendermint/tendermint/rpc/client/mock" coretypes "github.com/tendermint/tendermint/rpc/core/types" tmtypes "github.com/tendermint/tendermint/types" + + "github.com/babylonchain/babylon/app" + "github.com/babylonchain/babylon/app/params" + "github.com/babylonchain/babylon/privval" + testutilcli "github.com/babylonchain/babylon/testutil/cli" + checkpointcli "github.com/babylonchain/babylon/x/checkpointing/client/cli" ) type mockTendermintRPC struct { @@ -70,7 +71,7 @@ type CLITestSuite struct { } func (s *CLITestSuite) SetupSuite() { - s.encCfg = app.MakeTestEncodingConfig() + s.encCfg = app.GetEncodingConfig() s.kr = keyring.NewInMemory(s.encCfg.Marshaler) ctrl := gomock.NewController(s.T()) mockAccountRetriever := mocks.NewMockAccountRetriever(ctrl) diff --git a/x/epoching/simulation/decoder_test.go b/x/epoching/simulation/decoder_test.go index f8fc723d6..79f173215 100644 --- a/x/epoching/simulation/decoder_test.go +++ b/x/epoching/simulation/decoder_test.go @@ -2,17 +2,19 @@ package simulation_test import ( "fmt" - stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "testing" + stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" + "github.com/stretchr/testify/require" - "github.com/babylonchain/babylon/app" - "github.com/babylonchain/babylon/x/epoching/simulation" - "github.com/babylonchain/babylon/x/epoching/types" "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/kv" + + "github.com/babylonchain/babylon/app" + "github.com/babylonchain/babylon/x/epoching/simulation" + "github.com/babylonchain/babylon/x/epoching/types" ) // nolint:deadcode,unused,varcheck @@ -25,7 +27,7 @@ var ( ) func TestDecodeStore(t *testing.T) { - cdc := app.MakeTestEncodingConfig().Marshaler + cdc := app.GetEncodingConfig().Marshaler dec := simulation.NewDecodeStore(cdc) epochNumber := uint64(123) diff --git a/x/zoneconcierge/keeper/keeper_test.go b/x/zoneconcierge/keeper/keeper_test.go index 12069d90f..eb69f4f86 100644 --- a/x/zoneconcierge/keeper/keeper_test.go +++ b/x/zoneconcierge/keeper/keeper_test.go @@ -4,12 +4,13 @@ import ( "encoding/json" "testing" - "github.com/babylonchain/babylon/app" - "github.com/babylonchain/babylon/testutil/datagen" - zckeeper "github.com/babylonchain/babylon/x/zoneconcierge/keeper" sdk "github.com/cosmos/cosmos-sdk/types" ibctmtypes "github.com/cosmos/ibc-go/v5/modules/light-clients/07-tendermint/types" ibctesting "github.com/cosmos/ibc-go/v5/testing" + + "github.com/babylonchain/babylon/app" + "github.com/babylonchain/babylon/testutil/datagen" + zckeeper "github.com/babylonchain/babylon/x/zoneconcierge/keeper" ) // SetupTest creates a coordinator with 2 test chains, and a ZoneConcierge keeper. @@ -20,7 +21,7 @@ func SetupTest(t *testing.T) (*ibctesting.Coordinator, *ibctesting.TestChain, *i ibctesting.DefaultTestingAppInit = func() (ibctesting.TestingApp, map[string]json.RawMessage) { babylonApp := app.Setup(t, false) bbnApp = babylonApp - encCdc := app.MakeTestEncodingConfig() + encCdc := app.GetEncodingConfig() genesis := app.NewDefaultGenesisState(encCdc.Marshaler) return babylonApp, genesis } diff --git a/x/zoneconcierge/keeper/proof_tx_in_block_test.go b/x/zoneconcierge/keeper/proof_tx_in_block_test.go index 11944081a..889121542 100644 --- a/x/zoneconcierge/keeper/proof_tx_in_block_test.go +++ b/x/zoneconcierge/keeper/proof_tx_in_block_test.go @@ -4,8 +4,6 @@ import ( "fmt" "testing" - "github.com/babylonchain/babylon/app" - zckeeper "github.com/babylonchain/babylon/x/zoneconcierge/keeper" "github.com/cosmos/cosmos-sdk/client/flags" "github.com/cosmos/cosmos-sdk/client/tx" "github.com/cosmos/cosmos-sdk/testutil/network" @@ -13,12 +11,15 @@ import ( banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" "github.com/spf13/pflag" "github.com/stretchr/testify/require" + + "github.com/babylonchain/babylon/app" + zckeeper "github.com/babylonchain/babylon/x/zoneconcierge/keeper" ) func TestProveTxInBlock(t *testing.T) { // setup virtual network cfg := network.DefaultConfig() - encodingCfg := app.MakeTestEncodingConfig() + encodingCfg := app.GetEncodingConfig() cfg.InterfaceRegistry = encodingCfg.InterfaceRegistry cfg.TxConfig = encodingCfg.TxConfig cfg.NumValidators = 2 diff --git a/x/zoneconcierge/module_ibc_packet_test.go b/x/zoneconcierge/module_ibc_packet_test.go index 468e766e3..01f56aacb 100644 --- a/x/zoneconcierge/module_ibc_packet_test.go +++ b/x/zoneconcierge/module_ibc_packet_test.go @@ -4,10 +4,11 @@ import ( "encoding/json" "math/rand" - "github.com/babylonchain/babylon/app" - zctypes "github.com/babylonchain/babylon/x/zoneconcierge/types" channeltypes "github.com/cosmos/ibc-go/v5/modules/core/04-channel/types" ibctesting "github.com/cosmos/ibc-go/v5/testing" + + "github.com/babylonchain/babylon/app" + zctypes "github.com/babylonchain/babylon/x/zoneconcierge/types" ) // SetupTest creates a coordinator with 2 test chains. @@ -17,7 +18,7 @@ func (suite *ZoneConciergeTestSuite) SetupTestForIBCPackets() { ibctesting.DefaultTestingAppInit = func() (ibctesting.TestingApp, map[string]json.RawMessage) { babylonApp := app.Setup(suite.T(), false) suite.zcKeeper = babylonApp.ZoneConciergeKeeper - encCdc := app.MakeTestEncodingConfig() + encCdc := app.GetEncodingConfig() genesis := app.NewDefaultGenesisState(encCdc.Marshaler) return babylonApp, genesis } diff --git a/x/zoneconcierge/module_test.go b/x/zoneconcierge/module_test.go index 8289001a0..b15dc3320 100644 --- a/x/zoneconcierge/module_test.go +++ b/x/zoneconcierge/module_test.go @@ -7,8 +7,6 @@ import ( "testing" "time" - "github.com/babylonchain/babylon/app" - zckeeper "github.com/babylonchain/babylon/x/zoneconcierge/keeper" "github.com/cosmos/cosmos-sdk/codec" cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" sdk "github.com/cosmos/cosmos-sdk/types" @@ -26,6 +24,9 @@ import ( tmbytes "github.com/tendermint/tendermint/libs/bytes" tmproto "github.com/tendermint/tendermint/proto/tendermint/types" tmtypes "github.com/tendermint/tendermint/types" + + "github.com/babylonchain/babylon/app" + zckeeper "github.com/babylonchain/babylon/x/zoneconcierge/keeper" ) // ZoneConciergeTestSuite provides a test suite for IBC functionalities in ZoneConcierge @@ -65,7 +66,7 @@ func (suite *ZoneConciergeTestSuite) SetupTest() { ibctesting.DefaultTestingAppInit = func() (ibctesting.TestingApp, map[string]json.RawMessage) { babylonApp := app.Setup(suite.T(), false) suite.zcKeeper = babylonApp.ZoneConciergeKeeper - encCdc := app.MakeTestEncodingConfig() + encCdc := app.GetEncodingConfig() return babylonApp, app.NewDefaultGenesisState(encCdc.Marshaler) } babylonChainID := ibctesting.GetChainID(1) From e3e6fb954cc5b7a0cb96ffedd5abd8c8a74dc398 Mon Sep 17 00:00:00 2001 From: Vitalis Salis Date: Tue, 21 Feb 2023 15:24:57 +0200 Subject: [PATCH 07/59] btccheckpoint: Add information about transactions to BTCCheckpointInfo (#312) --- client/docs/swagger-ui/swagger.yaml | 402 +++++++++++++++--- .../babylon/btccheckpoint/btccheckpoint.proto | 8 +- x/btccheckpoint/keeper/grpc_query.go | 8 +- x/btccheckpoint/keeper/keeper.go | 6 +- x/btccheckpoint/types/btccheckpoint.pb.go | 188 +++++--- 5 files changed, 494 insertions(+), 118 deletions(-) diff --git a/client/docs/swagger-ui/swagger.yaml b/client/docs/swagger-ui/swagger.yaml index 5cba57a67..fd1ce2e99 100644 --- a/client/docs/swagger-ui/swagger.yaml +++ b/client/docs/swagger-ui/swagger.yaml @@ -33,6 +33,68 @@ paths: type: string format: byte title: hash of earliest BTC block that includes this checkpoint + earliest_btc_block_txs: + type: array + items: + type: object + properties: + key: + description: >- + key is the position (txIdx, blockHash) of this tx + on BTC blockchain + + Although it is already a part of SubmissionKey, we + store it here again + + to make TransactionInfo self-contained. + + For example, storing the key allows + TransactionInfo to not relay on + + the fact that TransactionInfo will be ordered in + the same order as + + TransactionKeys in SubmissionKey. + type: object + properties: + index: + type: integer + format: int64 + hash: + type: string + format: byte + title: >- + Each provided OP_RETURN transaction can be + idendtified by hash of block in + + which transaction was included and transaction + index in the block + transaction: + type: string + format: byte + title: transaction is the full transaction in bytes + proof: + type: string + format: byte + title: >- + proof is the Merkle proof that this tx is included + in the position in `key` + + TODO: maybe it could use here better format as we + already processed and + + valideated the proof? + title: >- + TransactionInfo is the info of a tx that contains + Babylon checkpoint, including + + - the position of the tx on BTC blockchain + + - the full tx content + + - the Merkle proof that this tx is on the above + position + title: the BTC checkpoint transactions on the above block vigilante_address_list: type: array items: @@ -260,6 +322,67 @@ paths: type: string format: byte title: hash of earliest BTC block that includes this checkpoint + earliest_btc_block_txs: + type: array + items: + type: object + properties: + key: + description: >- + key is the position (txIdx, blockHash) of this tx on + BTC blockchain + + Although it is already a part of SubmissionKey, we + store it here again + + to make TransactionInfo self-contained. + + For example, storing the key allows TransactionInfo + to not relay on + + the fact that TransactionInfo will be ordered in the + same order as + + TransactionKeys in SubmissionKey. + type: object + properties: + index: + type: integer + format: int64 + hash: + type: string + format: byte + title: >- + Each provided OP_RETURN transaction can be + idendtified by hash of block in + + which transaction was included and transaction index + in the block + transaction: + type: string + format: byte + title: transaction is the full transaction in bytes + proof: + type: string + format: byte + title: >- + proof is the Merkle proof that this tx is included + in the position in `key` + + TODO: maybe it could use here better format as we + already processed and + + valideated the proof? + title: >- + TransactionInfo is the info of a tx that contains + Babylon checkpoint, including + + - the position of the tx on BTC blockchain + + - the full tx content + + - the Merkle proof that this tx is on the above position + title: the BTC checkpoint transactions on the above block vigilante_address_list: type: array items: @@ -9902,6 +10025,67 @@ definitions: type: string format: byte title: hash of earliest BTC block that includes this checkpoint + earliest_btc_block_txs: + type: array + items: + type: object + properties: + key: + description: >- + key is the position (txIdx, blockHash) of this tx on BTC + blockchain + + Although it is already a part of SubmissionKey, we store it here + again + + to make TransactionInfo self-contained. + + For example, storing the key allows TransactionInfo to not relay + on + + the fact that TransactionInfo will be ordered in the same order + as + + TransactionKeys in SubmissionKey. + type: object + properties: + index: + type: integer + format: int64 + hash: + type: string + format: byte + title: >- + Each provided OP_RETURN transaction can be idendtified by hash + of block in + + which transaction was included and transaction index in the + block + transaction: + type: string + format: byte + title: transaction is the full transaction in bytes + proof: + type: string + format: byte + title: >- + proof is the Merkle proof that this tx is included in the + position in `key` + + TODO: maybe it could use here better format as we already + processed and + + valideated the proof? + title: >- + TransactionInfo is the info of a tx that contains Babylon + checkpoint, including + + - the position of the tx on BTC blockchain + + - the full tx content + + - the Merkle proof that this tx is on the above position + title: the BTC checkpoint transactions on the above block vigilante_address_list: type: array items: @@ -9990,6 +10174,67 @@ definitions: type: string format: byte title: hash of earliest BTC block that includes this checkpoint + earliest_btc_block_txs: + type: array + items: + type: object + properties: + key: + description: >- + key is the position (txIdx, blockHash) of this tx on BTC + blockchain + + Although it is already a part of SubmissionKey, we store it + here again + + to make TransactionInfo self-contained. + + For example, storing the key allows TransactionInfo to not + relay on + + the fact that TransactionInfo will be ordered in the same + order as + + TransactionKeys in SubmissionKey. + type: object + properties: + index: + type: integer + format: int64 + hash: + type: string + format: byte + title: >- + Each provided OP_RETURN transaction can be idendtified by + hash of block in + + which transaction was included and transaction index in the + block + transaction: + type: string + format: byte + title: transaction is the full transaction in bytes + proof: + type: string + format: byte + title: >- + proof is the Merkle proof that this tx is included in the + position in `key` + + TODO: maybe it could use here better format as we already + processed and + + valideated the proof? + title: >- + TransactionInfo is the info of a tx that contains Babylon + checkpoint, including + + - the position of the tx on BTC blockchain + + - the full tx content + + - the Merkle proof that this tx is on the above position + title: the BTC checkpoint transactions on the above block vigilante_address_list: type: array items: @@ -10035,6 +10280,67 @@ definitions: type: string format: byte title: hash of earliest BTC block that includes this checkpoint + earliest_btc_block_txs: + type: array + items: + type: object + properties: + key: + description: >- + key is the position (txIdx, blockHash) of this tx on BTC + blockchain + + Although it is already a part of SubmissionKey, we store + it here again + + to make TransactionInfo self-contained. + + For example, storing the key allows TransactionInfo to not + relay on + + the fact that TransactionInfo will be ordered in the same + order as + + TransactionKeys in SubmissionKey. + type: object + properties: + index: + type: integer + format: int64 + hash: + type: string + format: byte + title: >- + Each provided OP_RETURN transaction can be idendtified by + hash of block in + + which transaction was included and transaction index in + the block + transaction: + type: string + format: byte + title: transaction is the full transaction in bytes + proof: + type: string + format: byte + title: >- + proof is the Merkle proof that this tx is included in the + position in `key` + + TODO: maybe it could use here better format as we already + processed and + + valideated the proof? + title: >- + TransactionInfo is the info of a tx that contains Babylon + checkpoint, including + + - the position of the tx on BTC blockchain + + - the full tx content + + - the Merkle proof that this tx is on the above position + title: the BTC checkpoint transactions on the above block vigilante_address_list: type: array items: @@ -10232,6 +10538,54 @@ definitions: is only 33 (1 byte for prefix encoding and 32 byte hash), so there should be other strong arguments for this optimization + babylon.btccheckpoint.v1.TransactionInfo: + type: object + properties: + key: + description: |- + key is the position (txIdx, blockHash) of this tx on BTC blockchain + Although it is already a part of SubmissionKey, we store it here again + to make TransactionInfo self-contained. + For example, storing the key allows TransactionInfo to not relay on + the fact that TransactionInfo will be ordered in the same order as + TransactionKeys in SubmissionKey. + type: object + properties: + index: + type: integer + format: int64 + hash: + type: string + format: byte + title: >- + Each provided OP_RETURN transaction can be idendtified by hash of + block in + + which transaction was included and transaction index in the block + transaction: + type: string + format: byte + title: transaction is the full transaction in bytes + proof: + type: string + format: byte + title: >- + proof is the Merkle proof that this tx is included in the position in + `key` + + TODO: maybe it could use here better format as we already processed + and + + valideated the proof? + title: >- + TransactionInfo is the info of a tx that contains Babylon checkpoint, + including + + - the position of the tx on BTC blockchain + + - the full tx content + + - the Merkle proof that this tx is on the above position babylon.btccheckpoint.v1.TransactionKey: type: object properties: @@ -14194,54 +14548,6 @@ definitions: title: >- ValidatorWithBlsKey couples validator address, voting power, and its bls public key - babylon.btccheckpoint.v1.TransactionInfo: - type: object - properties: - key: - type: object - properties: - index: - type: integer - format: int64 - hash: - type: string - format: byte - title: >- - Each provided OP_RETURN transaction can be idendtified by hash of - block in - - which transaction was included and transaction index in the block - description: |- - key is the position (txIdx, blockHash) of this tx on BTC blockchain - Although it is already a part of SubmissionKey, we store it here again - to make TransactionInfo self-contained. - For example, storing the key allows TransactionInfo to not relay on - the fact that TransactionInfo will be ordered in the same order as - TransactionKeys in SubmissionKey. - transaction: - type: string - format: byte - title: transaction is the full transaction in bytes - proof: - type: string - format: byte - title: >- - proof is the Merkle proof that this tx is included in the position in - `key` - - TODO: maybe it could use here better format as we already processed - and - - valideated the proof? - title: >- - TransactionInfo is the info of a tx that contains Babylon checkpoint, - including - - - the position of the tx on BTC blockchain - - - the full tx content - - - the Merkle proof that this tx is on the above position babylon.zoneconcierge.v1.ChainInfo: type: object properties: diff --git a/proto/babylon/btccheckpoint/btccheckpoint.proto b/proto/babylon/btccheckpoint/btccheckpoint.proto index 84067295c..cce526149 100644 --- a/proto/babylon/btccheckpoint/btccheckpoint.proto +++ b/proto/babylon/btccheckpoint/btccheckpoint.proto @@ -134,7 +134,11 @@ message BTCCheckpointInfo { // height of earliest BTC block that includes this checkpoint uint64 earliest_btc_block_number = 2; // hash of earliest BTC block that includes this checkpoint - bytes earliest_btc_block_hash = 3; + bytes earliest_btc_block_hash = 3 [ + (gogoproto.customtype) = "github.com/babylonchain/babylon/types.BTCHeaderHashBytes" + ]; + // the BTC checkpoint transactions on the above block + repeated TransactionInfo earliest_btc_block_txs = 4; // list of vigilantes' addresses - repeated CheckpointAddresses vigilante_address_list = 4; + repeated CheckpointAddresses vigilante_address_list = 5; } diff --git a/x/btccheckpoint/keeper/grpc_query.go b/x/btccheckpoint/keeper/grpc_query.go index 1c7108809..3bdb75cec 100644 --- a/x/btccheckpoint/keeper/grpc_query.go +++ b/x/btccheckpoint/keeper/grpc_query.go @@ -4,6 +4,7 @@ import ( "context" "errors" "fmt" + bbntypes "github.com/babylonchain/babylon/types" "math" "github.com/babylonchain/babylon/x/btccheckpoint/types" @@ -16,10 +17,10 @@ import ( var _ types.QueryServer = Keeper{} -func (k Keeper) lowestBtcHeightAndHash(ctx sdk.Context, subKey *types.SubmissionKey) (uint64, []byte, error) { +func (k Keeper) lowestBtcHeightAndHash(ctx sdk.Context, subKey *types.SubmissionKey) (uint64, *bbntypes.BTCHeaderHashBytes, error) { // initializing to max, as then every header height will be smaller var lowestHeaderNumber uint64 = math.MaxUint64 - var lowestHeaderHash []byte + var lowestHeaderHash *bbntypes.BTCHeaderHashBytes for _, tk := range subKey.Key { @@ -38,7 +39,7 @@ func (k Keeper) lowestBtcHeightAndHash(ctx sdk.Context, subKey *types.Submission if headerNumber < lowestHeaderNumber { lowestHeaderNumber = headerNumber - lowestHeaderHash = *tk.Hash + lowestHeaderHash = tk.Hash } } @@ -74,6 +75,7 @@ func (k Keeper) getCheckpointInfo(ctx sdk.Context, epochNum uint64, subKeys []*t if headerNumber < info.EarliestBtcBlockNumber { info.EarliestBtcBlockNumber = headerNumber info.EarliestBtcBlockHash = headerHash + info.EarliestBtcBlockTxs = sd.TxsInfo } // append vigilante addresses vAddrs := *sd.VigilanteAddresses // make a new copy diff --git a/x/btccheckpoint/keeper/keeper.go b/x/btccheckpoint/keeper/keeper.go index 06c4dd5e8..9301d7523 100644 --- a/x/btccheckpoint/keeper/keeper.go +++ b/x/btccheckpoint/keeper/keeper.go @@ -329,8 +329,8 @@ func (k Keeper) deleteSubmission(ctx sdk.Context, sk types.SubmissionKey) { store.Delete(kBytes) } -// GetSubmissionData return submission data for given key, return nil if there is not data -// under givem key +// GetSubmissionData returns submission data for a given key or nil if there is no data +// under the given key func (k Keeper) GetSubmissionData(ctx sdk.Context, sk types.SubmissionKey) *types.SubmissionData { store := ctx.KVStore(k.storeKey) kBytes := types.PrefixedSubmisionKey(k.cdc, &sk) @@ -345,7 +345,7 @@ func (k Keeper) GetSubmissionData(ctx sdk.Context, sk types.SubmissionKey) *type return &sd } -// Callback to be called when btc light client tip change +// Callback to be called when btc light client tip changes func (k Keeper) OnTipChange(ctx sdk.Context) { k.checkCheckpoints(ctx) } diff --git a/x/btccheckpoint/types/btccheckpoint.pb.go b/x/btccheckpoint/types/btccheckpoint.pb.go index f85ff42ef..41d5b3248 100644 --- a/x/btccheckpoint/types/btccheckpoint.pb.go +++ b/x/btccheckpoint/types/btccheckpoint.pb.go @@ -505,9 +505,11 @@ type BTCCheckpointInfo struct { // height of earliest BTC block that includes this checkpoint EarliestBtcBlockNumber uint64 `protobuf:"varint,2,opt,name=earliest_btc_block_number,json=earliestBtcBlockNumber,proto3" json:"earliest_btc_block_number,omitempty"` // hash of earliest BTC block that includes this checkpoint - EarliestBtcBlockHash []byte `protobuf:"bytes,3,opt,name=earliest_btc_block_hash,json=earliestBtcBlockHash,proto3" json:"earliest_btc_block_hash,omitempty"` + EarliestBtcBlockHash *github_com_babylonchain_babylon_types.BTCHeaderHashBytes `protobuf:"bytes,3,opt,name=earliest_btc_block_hash,json=earliestBtcBlockHash,proto3,customtype=github.com/babylonchain/babylon/types.BTCHeaderHashBytes" json:"earliest_btc_block_hash,omitempty"` + // the BTC checkpoint transactions on the above block + EarliestBtcBlockTxs []*TransactionInfo `protobuf:"bytes,4,rep,name=earliest_btc_block_txs,json=earliestBtcBlockTxs,proto3" json:"earliest_btc_block_txs,omitempty"` // list of vigilantes' addresses - VigilanteAddressList []*CheckpointAddresses `protobuf:"bytes,4,rep,name=vigilante_address_list,json=vigilanteAddressList,proto3" json:"vigilante_address_list,omitempty"` + VigilanteAddressList []*CheckpointAddresses `protobuf:"bytes,5,rep,name=vigilante_address_list,json=vigilanteAddressList,proto3" json:"vigilante_address_list,omitempty"` } func (m *BTCCheckpointInfo) Reset() { *m = BTCCheckpointInfo{} } @@ -557,9 +559,9 @@ func (m *BTCCheckpointInfo) GetEarliestBtcBlockNumber() uint64 { return 0 } -func (m *BTCCheckpointInfo) GetEarliestBtcBlockHash() []byte { +func (m *BTCCheckpointInfo) GetEarliestBtcBlockTxs() []*TransactionInfo { if m != nil { - return m.EarliestBtcBlockHash + return m.EarliestBtcBlockTxs } return nil } @@ -588,55 +590,57 @@ func init() { } var fileDescriptor_da8b9af3dbd18a36 = []byte{ - // 768 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x55, 0xcf, 0x4f, 0xdb, 0x48, - 0x14, 0x8e, 0x43, 0x60, 0xc9, 0x24, 0x04, 0x76, 0x12, 0x58, 0x6f, 0xb4, 0x0a, 0xc1, 0x7b, 0x20, - 0xac, 0xb4, 0x89, 0x96, 0x5d, 0x24, 0xd8, 0xdd, 0x0b, 0x4e, 0x82, 0x88, 0x80, 0x04, 0x39, 0xe6, - 0xc2, 0xa1, 0x96, 0xed, 0x4c, 0xe2, 0x51, 0x1c, 0x4f, 0xe4, 0x99, 0xa0, 0xa4, 0xd7, 0xaa, 0x52, - 0x55, 0xa9, 0x52, 0xd5, 0x7b, 0x4f, 0xfd, 0x67, 0x7a, 0xe8, 0x81, 0x63, 0xc5, 0x01, 0x55, 0xf0, - 0x67, 0xf4, 0x52, 0x79, 0xec, 0xfc, 0x84, 0xa8, 0xe5, 0xe6, 0xf7, 0xde, 0xf7, 0xde, 0xbc, 0xef, - 0x7b, 0x6f, 0xc6, 0x60, 0xc7, 0xd0, 0x8d, 0x81, 0x4d, 0x9c, 0x82, 0xc1, 0x4c, 0xd3, 0x42, 0x66, - 0xbb, 0x4b, 0xb0, 0xc3, 0xa6, 0xad, 0x7c, 0xd7, 0x25, 0x8c, 0x40, 0x31, 0x80, 0xe6, 0xa7, 0x83, - 0x57, 0x7f, 0xa5, 0x53, 0x2d, 0xd2, 0x22, 0x1c, 0x54, 0xf0, 0xbe, 0x7c, 0xbc, 0xf4, 0x55, 0x00, - 0x31, 0x59, 0x2d, 0xd6, 0xbb, 0x57, 0xe7, 0x2e, 0x21, 0x4d, 0xb8, 0x0d, 0x56, 0x0d, 0x66, 0x6a, - 0xcc, 0xd5, 0x1d, 0xaa, 0x9b, 0x0c, 0x13, 0x47, 0x14, 0xb2, 0x42, 0x2e, 0xae, 0x24, 0x0c, 0x66, - 0xaa, 0x63, 0x2f, 0xdc, 0x05, 0xeb, 0x33, 0x40, 0x0d, 0x3b, 0x0d, 0xd4, 0x17, 0xc3, 0x59, 0x21, - 0xb7, 0xa2, 0x24, 0xa7, 0xe1, 0x15, 0x2f, 0x04, 0xb7, 0x40, 0xbc, 0x83, 0xdc, 0xb6, 0x8d, 0x34, - 0x87, 0x34, 0x10, 0x15, 0x17, 0x78, 0xe5, 0x98, 0xef, 0xab, 0x7a, 0x2e, 0x68, 0x83, 0x75, 0x93, - 0x38, 0x4d, 0xec, 0x76, 0xb0, 0xd3, 0xd2, 0xbc, 0x13, 0x2c, 0xa4, 0x37, 0x90, 0x2b, 0x46, 0x3c, - 0xac, 0xbc, 0x7f, 0x73, 0xbb, 0xf9, 0x4f, 0x0b, 0x33, 0xab, 0x67, 0xe4, 0x4d, 0xd2, 0x29, 0x04, - 0x6c, 0x4d, 0x4b, 0xc7, 0xce, 0xd0, 0x28, 0xb0, 0x41, 0x17, 0xd1, 0xbc, 0xac, 0x16, 0x8f, 0x79, - 0xaa, 0x3c, 0x60, 0x88, 0x2a, 0xc9, 0x71, 0x59, 0x99, 0x99, 0x7e, 0x44, 0xea, 0x83, 0xc4, 0x44, - 0x93, 0x27, 0x68, 0x00, 0x53, 0x60, 0xd1, 0xa7, 0x21, 0x70, 0x1a, 0xbe, 0x01, 0xcf, 0x41, 0xc4, - 0xd2, 0xa9, 0xc5, 0xb9, 0xc5, 0xe5, 0xff, 0x6f, 0x6e, 0x37, 0xf7, 0x9f, 0xd8, 0xc4, 0xb1, 0x4e, - 0x2d, 0xbf, 0x11, 0x5e, 0x49, 0x3a, 0x01, 0x2b, 0xf5, 0x9e, 0xd1, 0xc1, 0x94, 0x06, 0x07, 0xff, - 0x0b, 0x16, 0xda, 0x68, 0x20, 0x0a, 0xd9, 0x85, 0x5c, 0x6c, 0x37, 0x97, 0x9f, 0x37, 0xc6, 0xfc, - 0x74, 0xbf, 0x8a, 0x97, 0x24, 0xbd, 0x14, 0xc0, 0xea, 0x94, 0xd8, 0x4d, 0x32, 0xae, 0x27, 0x3c, - 0xb9, 0x1e, 0xcc, 0x82, 0xd8, 0xe4, 0x02, 0x84, 0xfd, 0x31, 0x4d, 0xb8, 0x3c, 0x99, 0xba, 0xde, - 0xbe, 0x04, 0x23, 0xf4, 0x0d, 0xe9, 0x93, 0x00, 0x12, 0x63, 0x56, 0x25, 0x9d, 0xe9, 0xf0, 0x19, - 0x48, 0x5e, 0xe1, 0x16, 0xb6, 0x75, 0x87, 0x21, 0x4d, 0x6f, 0x34, 0x5c, 0x44, 0x29, 0xa2, 0x41, - 0x5b, 0x7f, 0xce, 0x6f, 0xab, 0x38, 0xb2, 0x0e, 0x87, 0x49, 0x0a, 0x1c, 0x55, 0x1a, 0xf9, 0x60, - 0x09, 0x2c, 0xb3, 0x3e, 0xd5, 0xb0, 0xd3, 0x24, 0x62, 0x98, 0x6b, 0xb7, 0xf3, 0x43, 0x5c, 0x3d, - 0x8d, 0x94, 0x9f, 0x58, 0x9f, 0x72, 0xb1, 0x52, 0x60, 0x11, 0x75, 0x89, 0x69, 0x71, 0x3a, 0x11, - 0xc5, 0x37, 0xa4, 0x17, 0x02, 0x88, 0x96, 0xbd, 0x2f, 0xce, 0xe4, 0x60, 0x72, 0x40, 0xdb, 0xf3, - 0x0f, 0x99, 0x1a, 0xab, 0xaf, 0xe7, 0x7f, 0x60, 0x89, 0x32, 0x9d, 0xf5, 0x28, 0x97, 0x32, 0xb1, - 0xfb, 0xfb, 0xfc, 0x6c, 0x99, 0x99, 0x75, 0x0e, 0x55, 0x82, 0x14, 0xa9, 0x06, 0x92, 0x8f, 0x88, - 0x01, 0x7f, 0x03, 0x51, 0xea, 0x9d, 0xc4, 0x18, 0x72, 0x83, 0x2b, 0x3a, 0x76, 0xc0, 0x34, 0x58, - 0x76, 0x51, 0x97, 0xb8, 0x5e, 0xd0, 0x1f, 0xdf, 0xc8, 0x96, 0xde, 0x84, 0xc1, 0xcf, 0xb2, 0x5a, - 0x1c, 0x17, 0xe5, 0x12, 0x6c, 0x81, 0x38, 0x67, 0xad, 0x39, 0xbd, 0x8e, 0x11, 0x94, 0x8c, 0x28, - 0x31, 0xee, 0xab, 0x72, 0x17, 0x3c, 0x00, 0xbf, 0x22, 0xdd, 0xb5, 0x31, 0xa2, 0x8c, 0xdf, 0x4c, - 0xc3, 0x26, 0x66, 0x7b, 0x88, 0x0f, 0x73, 0xfc, 0xc6, 0x10, 0x20, 0x33, 0x53, 0xf6, 0xc2, 0x41, - 0xea, 0x1e, 0xf8, 0xe5, 0x91, 0x54, 0x7e, 0xa7, 0xfc, 0x0d, 0x4a, 0xcd, 0x26, 0x7a, 0x17, 0x06, - 0x9a, 0x60, 0xe3, 0xc1, 0xf6, 0x68, 0x36, 0xa6, 0x4c, 0x8c, 0xf0, 0x31, 0x3c, 0x71, 0x81, 0x52, - 0xb3, 0x0b, 0x74, 0x8a, 0x29, 0xfb, 0xe3, 0x9d, 0x00, 0xa2, 0x23, 0xd9, 0xe1, 0x0e, 0xd8, 0x28, - 0x9f, 0xd7, 0x8a, 0xc7, 0x5a, 0x5d, 0x3d, 0x54, 0x2f, 0xea, 0x5a, 0xfd, 0x42, 0x3e, 0xab, 0xa8, - 0x6a, 0xb9, 0xb4, 0x16, 0x4a, 0xaf, 0xbc, 0x7e, 0x9f, 0x8d, 0xd6, 0x03, 0x91, 0x1b, 0x0f, 0xa0, - 0xc5, 0x5a, 0xf5, 0xa8, 0xa2, 0x9c, 0x95, 0x4b, 0x6b, 0x82, 0x0f, 0x2d, 0xfa, 0x4f, 0xce, 0x23, - 0xd0, 0xa3, 0x4a, 0xf5, 0xf0, 0xb4, 0x72, 0x59, 0x2e, 0xad, 0x85, 0x7d, 0xe8, 0x11, 0x76, 0x74, - 0x1b, 0x3f, 0x47, 0x8d, 0x74, 0xe4, 0xd5, 0x87, 0x4c, 0x48, 0xae, 0x7d, 0xbc, 0xcb, 0x08, 0xd7, - 0x77, 0x19, 0xe1, 0xcb, 0x5d, 0x46, 0x78, 0x7b, 0x9f, 0x09, 0x5d, 0xdf, 0x67, 0x42, 0x9f, 0xef, - 0x33, 0xa1, 0xcb, 0xbd, 0xef, 0xbd, 0x3c, 0xfd, 0x99, 0xdf, 0x04, 0x7f, 0x89, 0x8c, 0x25, 0xfe, - 0xde, 0xff, 0xfd, 0x2d, 0x00, 0x00, 0xff, 0xff, 0xc6, 0x76, 0xd4, 0x3c, 0x4c, 0x06, 0x00, 0x00, + // 785 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x55, 0xbf, 0x6f, 0xfa, 0x46, + 0x14, 0xc7, 0x40, 0xd2, 0x70, 0x10, 0x92, 0x1e, 0x84, 0xba, 0xa8, 0x22, 0xc4, 0x1d, 0x42, 0x2a, + 0x15, 0xd4, 0xb4, 0x95, 0x92, 0xb6, 0x4b, 0x0c, 0x44, 0x41, 0x49, 0x20, 0x32, 0xce, 0x92, 0x21, + 0x96, 0x6d, 0x0e, 0x7c, 0xc2, 0xf8, 0x90, 0xef, 0x88, 0xa0, 0x6b, 0x55, 0xa9, 0xea, 0x54, 0x75, + 0xef, 0xd4, 0xb1, 0xff, 0x48, 0x87, 0x0e, 0x19, 0xab, 0x0c, 0x51, 0x95, 0xfc, 0x19, 0x5d, 0x2a, + 0x9f, 0xcd, 0xcf, 0x80, 0xfa, 0x45, 0xfa, 0x6e, 0xbc, 0xf7, 0x3e, 0xef, 0xc7, 0xe7, 0xf3, 0xde, + 0x61, 0x70, 0x64, 0xe8, 0xc6, 0xc8, 0x26, 0x4e, 0xc9, 0x60, 0xa6, 0x69, 0x21, 0xb3, 0xdb, 0x27, + 0xd8, 0x61, 0xf3, 0x56, 0xb1, 0xef, 0x12, 0x46, 0xa0, 0x18, 0x40, 0x8b, 0xf3, 0xc1, 0x87, 0x2f, + 0xb2, 0xe9, 0x0e, 0xe9, 0x10, 0x0e, 0x2a, 0x79, 0xbf, 0x7c, 0xbc, 0xf4, 0xaf, 0x00, 0xe2, 0xb2, + 0x5a, 0x6e, 0xf6, 0x1f, 0x6e, 0x5c, 0x42, 0xda, 0xf0, 0x10, 0xec, 0x18, 0xcc, 0xd4, 0x98, 0xab, + 0x3b, 0x54, 0x37, 0x19, 0x26, 0x8e, 0x28, 0xe4, 0x85, 0x42, 0x42, 0x49, 0x1a, 0xcc, 0x54, 0xa7, + 0x5e, 0x78, 0x0c, 0xf6, 0x16, 0x80, 0x1a, 0x76, 0x5a, 0x68, 0x28, 0x86, 0xf3, 0x42, 0x61, 0x5b, + 0x49, 0xcd, 0xc3, 0x6b, 0x5e, 0x08, 0x1e, 0x80, 0x44, 0x0f, 0xb9, 0x5d, 0x1b, 0x69, 0x0e, 0x69, + 0x21, 0x2a, 0x46, 0x78, 0xe5, 0xb8, 0xef, 0xab, 0x7b, 0x2e, 0x68, 0x83, 0x3d, 0x93, 0x38, 0x6d, + 0xec, 0xf6, 0xb0, 0xd3, 0xd1, 0xbc, 0x0e, 0x16, 0xd2, 0x5b, 0xc8, 0x15, 0xa3, 0x1e, 0x56, 0x3e, + 0x79, 0x7a, 0xde, 0xff, 0xaa, 0x83, 0x99, 0x35, 0x30, 0x8a, 0x26, 0xe9, 0x95, 0x02, 0xb6, 0xa6, + 0xa5, 0x63, 0x67, 0x6c, 0x94, 0xd8, 0xa8, 0x8f, 0x68, 0x51, 0x56, 0xcb, 0x17, 0x3c, 0x55, 0x1e, + 0x31, 0x44, 0x95, 0xd4, 0xb4, 0xac, 0xcc, 0x4c, 0x3f, 0x22, 0x0d, 0x41, 0x72, 0x66, 0xc8, 0x4b, + 0x34, 0x82, 0x69, 0xb0, 0xe1, 0xd3, 0x10, 0x38, 0x0d, 0xdf, 0x80, 0x37, 0x20, 0x6a, 0xe9, 0xd4, + 0xe2, 0xdc, 0x12, 0xf2, 0x77, 0x4f, 0xcf, 0xfb, 0x27, 0x6b, 0x0e, 0x71, 0xa1, 0x53, 0xcb, 0x1f, + 0x84, 0x57, 0x92, 0x2e, 0xc1, 0x76, 0x73, 0x60, 0xf4, 0x30, 0xa5, 0x41, 0xe3, 0x6f, 0x40, 0xa4, + 0x8b, 0x46, 0xa2, 0x90, 0x8f, 0x14, 0xe2, 0xc7, 0x85, 0xe2, 0xaa, 0x35, 0x16, 0xe7, 0xe7, 0x55, + 0xbc, 0x24, 0xe9, 0x47, 0x01, 0xec, 0xcc, 0x89, 0xdd, 0x26, 0xd3, 0x7a, 0xc2, 0xda, 0xf5, 0x60, + 0x1e, 0xc4, 0x67, 0x0f, 0x20, 0xec, 0xaf, 0x69, 0xc6, 0xe5, 0xc9, 0xd4, 0xf7, 0xee, 0x25, 0x58, + 0xa1, 0x6f, 0x48, 0x7f, 0x09, 0x20, 0x39, 0x65, 0x55, 0xd1, 0x99, 0x0e, 0xef, 0x41, 0xea, 0x01, + 0x77, 0xb0, 0xad, 0x3b, 0x0c, 0x69, 0x7a, 0xab, 0xe5, 0x22, 0x4a, 0x11, 0x0d, 0xc6, 0xfa, 0x7c, + 0xf5, 0x58, 0xe5, 0x89, 0x75, 0x36, 0x4e, 0x52, 0xe0, 0xa4, 0xd2, 0xc4, 0x07, 0x2b, 0x60, 0x8b, + 0x0d, 0xa9, 0x86, 0x9d, 0x36, 0x11, 0xc3, 0x5c, 0xbb, 0xa3, 0x77, 0xe2, 0xea, 0x69, 0xa4, 0x7c, + 0xc0, 0x86, 0x94, 0x8b, 0x95, 0x06, 0x1b, 0xa8, 0x4f, 0x4c, 0x8b, 0xd3, 0x89, 0x2a, 0xbe, 0x21, + 0xfd, 0x20, 0x80, 0x58, 0xd5, 0xfb, 0xc5, 0x99, 0x9c, 0xce, 0x2e, 0xe8, 0x70, 0x75, 0x93, 0xb9, + 0xb5, 0xfa, 0x7a, 0x7e, 0x0b, 0x36, 0x29, 0xd3, 0xd9, 0x80, 0x72, 0x29, 0x93, 0xc7, 0x9f, 0xae, + 0xce, 0x96, 0x99, 0xd9, 0xe4, 0x50, 0x25, 0x48, 0x91, 0x1a, 0x20, 0xb5, 0x44, 0x0c, 0xf8, 0x09, + 0x88, 0x51, 0xaf, 0x13, 0x63, 0xc8, 0x0d, 0x9e, 0xe8, 0xd4, 0x01, 0xb3, 0x60, 0xcb, 0x45, 0x7d, + 0xe2, 0x7a, 0x41, 0x7f, 0x7d, 0x13, 0x5b, 0xfa, 0x23, 0x02, 0x3e, 0x94, 0xd5, 0xf2, 0xb4, 0x28, + 0x97, 0xe0, 0x00, 0x24, 0x38, 0x6b, 0xcd, 0x19, 0xf4, 0x8c, 0xa0, 0x64, 0x54, 0x89, 0x73, 0x5f, + 0x9d, 0xbb, 0xe0, 0x29, 0xf8, 0x18, 0xe9, 0xae, 0x8d, 0x11, 0x65, 0xfc, 0x65, 0x1a, 0x36, 0x31, + 0xbb, 0x63, 0x7c, 0x98, 0xe3, 0x33, 0x63, 0x80, 0xcc, 0x4c, 0xd9, 0x0b, 0x07, 0xa9, 0x14, 0x7c, + 0xb4, 0x24, 0x95, 0xbf, 0xa9, 0xc8, 0x7b, 0x78, 0x53, 0xe9, 0xc5, 0xb6, 0x5e, 0x08, 0xde, 0x83, + 0xcc, 0x92, 0xa6, 0x6c, 0x48, 0xc5, 0xe8, 0xba, 0x97, 0x92, 0x5a, 0x6c, 0xa0, 0x0e, 0x29, 0x34, + 0x41, 0xe6, 0xcd, 0x6d, 0x6b, 0x36, 0xa6, 0x4c, 0xdc, 0xe0, 0xf5, 0xd7, 0x3c, 0xef, 0xf4, 0xe2, + 0x79, 0x5f, 0x61, 0xca, 0x3e, 0xfb, 0x55, 0x00, 0xb1, 0xc9, 0x51, 0xc0, 0x23, 0x90, 0xa9, 0xde, + 0x34, 0xca, 0x17, 0x5a, 0x53, 0x3d, 0x53, 0x6f, 0x9b, 0x5a, 0xf3, 0x56, 0xbe, 0xae, 0xa9, 0x6a, + 0xb5, 0xb2, 0x1b, 0xca, 0x6e, 0xff, 0xfc, 0x5b, 0x3e, 0xd6, 0x0c, 0x4e, 0xa0, 0xf5, 0x06, 0x5a, + 0x6e, 0xd4, 0xcf, 0x6b, 0xca, 0x75, 0xb5, 0xb2, 0x2b, 0xf8, 0xd0, 0xb2, 0xff, 0x87, 0xb8, 0x04, + 0x7a, 0x5e, 0xab, 0x9f, 0x5d, 0xd5, 0xee, 0xaa, 0x95, 0xdd, 0xb0, 0x0f, 0x3d, 0xc7, 0x8e, 0x6e, + 0xe3, 0xef, 0x51, 0x2b, 0x1b, 0xfd, 0xe9, 0xf7, 0x5c, 0x48, 0x6e, 0xfc, 0xf9, 0x92, 0x13, 0x1e, + 0x5f, 0x72, 0xc2, 0x3f, 0x2f, 0x39, 0xe1, 0x97, 0xd7, 0x5c, 0xe8, 0xf1, 0x35, 0x17, 0xfa, 0xfb, + 0x35, 0x17, 0xba, 0xfb, 0xfa, 0xff, 0x76, 0x38, 0x5c, 0xf8, 0x88, 0xf1, 0x9d, 0x1a, 0x9b, 0xfc, + 0x6b, 0xf4, 0xe5, 0x7f, 0x01, 0x00, 0x00, 0xff, 0xff, 0xbe, 0x10, 0x77, 0xf8, 0xea, 0x06, 0x00, + 0x00, } func (m *BTCSpvProof) Marshal() (dAtA []byte, err error) { @@ -983,13 +987,32 @@ func (m *BTCCheckpointInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintBtccheckpoint(dAtA, i, uint64(size)) } i-- + dAtA[i] = 0x2a + } + } + if len(m.EarliestBtcBlockTxs) > 0 { + for iNdEx := len(m.EarliestBtcBlockTxs) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.EarliestBtcBlockTxs[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintBtccheckpoint(dAtA, i, uint64(size)) + } + i-- dAtA[i] = 0x22 } } - if len(m.EarliestBtcBlockHash) > 0 { - i -= len(m.EarliestBtcBlockHash) - copy(dAtA[i:], m.EarliestBtcBlockHash) - i = encodeVarintBtccheckpoint(dAtA, i, uint64(len(m.EarliestBtcBlockHash))) + if m.EarliestBtcBlockHash != nil { + { + size := m.EarliestBtcBlockHash.Size() + i -= size + if _, err := m.EarliestBtcBlockHash.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintBtccheckpoint(dAtA, i, uint64(size)) + } i-- dAtA[i] = 0x1a } @@ -1162,10 +1185,16 @@ func (m *BTCCheckpointInfo) Size() (n int) { if m.EarliestBtcBlockNumber != 0 { n += 1 + sovBtccheckpoint(uint64(m.EarliestBtcBlockNumber)) } - l = len(m.EarliestBtcBlockHash) - if l > 0 { + if m.EarliestBtcBlockHash != nil { + l = m.EarliestBtcBlockHash.Size() n += 1 + l + sovBtccheckpoint(uint64(l)) } + if len(m.EarliestBtcBlockTxs) > 0 { + for _, e := range m.EarliestBtcBlockTxs { + l = e.Size() + n += 1 + l + sovBtccheckpoint(uint64(l)) + } + } if len(m.VigilanteAddressList) > 0 { for _, e := range m.VigilanteAddressList { l = e.Size() @@ -2151,12 +2180,47 @@ func (m *BTCCheckpointInfo) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.EarliestBtcBlockHash = append(m.EarliestBtcBlockHash[:0], dAtA[iNdEx:postIndex]...) - if m.EarliestBtcBlockHash == nil { - m.EarliestBtcBlockHash = []byte{} + var v github_com_babylonchain_babylon_types.BTCHeaderHashBytes + m.EarliestBtcBlockHash = &v + if err := m.EarliestBtcBlockHash.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err } iNdEx = postIndex case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field EarliestBtcBlockTxs", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowBtccheckpoint + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthBtccheckpoint + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthBtccheckpoint + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.EarliestBtcBlockTxs = append(m.EarliestBtcBlockTxs, &TransactionInfo{}) + if err := m.EarliestBtcBlockTxs[len(m.EarliestBtcBlockTxs)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field VigilanteAddressList", wireType) } From b22ceda7a7e9ac881e22a84f4d3186a6e6745c87 Mon Sep 17 00:00:00 2001 From: Cirrus Gai Date: Wed, 22 Feb 2023 09:41:57 +0800 Subject: [PATCH 08/59] chore: Add fuzz test of addBlsSig (#313) --- testutil/datagen/raw_checkpoint.go | 5 +- testutil/datagen/val_set.go | 13 +- x/checkpointing/keeper/bls_signer.go | 2 +- x/checkpointing/keeper/keeper.go | 8 +- x/checkpointing/keeper/keeper_test.go | 18 +- x/checkpointing/keeper/msg_server_test.go | 262 +++++++++++++++++----- x/checkpointing/types/errors.go | 5 +- x/checkpointing/types/types_test.go | 10 +- x/checkpointing/types/utils.go | 10 +- x/epoching/testepoching/helper.go | 15 +- 10 files changed, 262 insertions(+), 86 deletions(-) diff --git a/testutil/datagen/raw_checkpoint.go b/testutil/datagen/raw_checkpoint.go index a798171c5..97471c3b3 100644 --- a/testutil/datagen/raw_checkpoint.go +++ b/testutil/datagen/raw_checkpoint.go @@ -3,13 +3,12 @@ package datagen import ( "math/rand" - sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/boljen/go-bitmap" "github.com/babylonchain/babylon/btctxformatter" txformat "github.com/babylonchain/babylon/btctxformatter" "github.com/babylonchain/babylon/crypto/bls12381" "github.com/babylonchain/babylon/x/checkpointing/types" - "github.com/boljen/go-bitmap" ) // GenRandomBitmap generates a random bitmap for the validator set @@ -109,7 +108,7 @@ func GenerateLegitimateRawCheckpoint(privKeys []bls12381.PrivateKey) *types.RawC signerNum := n/3 + 1 epochNum := GenRandomEpochNum() lch := GenRandomLastCommitHash() - msgBytes := append(sdk.Uint64ToBigEndian(epochNum), lch.MustMarshal()...) + msgBytes := types.GetSignBytes(epochNum, lch) sigs := GenerateBLSSigs(privKeys[:signerNum], msgBytes) multiSig, _ := bls12381.AggrSigList(sigs) bm := bitmap.New(types.BitmapBits) diff --git a/testutil/datagen/val_set.go b/testutil/datagen/val_set.go index e468332b7..8c55f9bec 100644 --- a/testutil/datagen/val_set.go +++ b/testutil/datagen/val_set.go @@ -1,19 +1,20 @@ package datagen import ( - "github.com/babylonchain/babylon/crypto/bls12381" - checkpointingtypes "github.com/babylonchain/babylon/x/checkpointing/types" - epochingtypes "github.com/babylonchain/babylon/x/epoching/types" "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" sdk "github.com/cosmos/cosmos-sdk/types" + + "github.com/babylonchain/babylon/crypto/bls12381" + checkpointingtypes "github.com/babylonchain/babylon/x/checkpointing/types" + epochingtypes "github.com/babylonchain/babylon/x/epoching/types" ) func GenRandomValSet(n int) epochingtypes.ValidatorSet { power := int64(10) var valSet []epochingtypes.Validator for i := 0; i < n; i++ { - address := sdk.ValAddress(ed25519.GenPrivKey().PubKey().Address()) + address := GenRandomValidatorAddress() val := epochingtypes.Validator{ Addr: address, Power: power, @@ -24,6 +25,10 @@ func GenRandomValSet(n int) epochingtypes.ValidatorSet { return epochingtypes.NewSortedValidatorSet(valSet) } +func GenRandomValidatorAddress() sdk.ValAddress { + return sdk.ValAddress(ed25519.GenPrivKey().PubKey().Address()) +} + func GenRandomPubkeysAndSigs(n int, msg []byte) ([]bls12381.PublicKey, []bls12381.Signature) { var blsPubkeys []bls12381.PublicKey var blsSigs []bls12381.Signature diff --git a/x/checkpointing/keeper/bls_signer.go b/x/checkpointing/keeper/bls_signer.go index 2aace4042..584de5bea 100644 --- a/x/checkpointing/keeper/bls_signer.go +++ b/x/checkpointing/keeper/bls_signer.go @@ -33,7 +33,7 @@ func (k Keeper) SendBlsSig(ctx sdk.Context, epochNum uint64, lch types.LastCommi } // get BLS signature by signing - signBytes := append(sdk.Uint64ToBigEndian(epochNum), lch...) + signBytes := types.GetSignBytes(epochNum, lch) blsSig, err := k.blsSigner.SignMsgWithBls(signBytes) if err != nil { return err diff --git a/x/checkpointing/keeper/keeper.go b/x/checkpointing/keeper/keeper.go index a8167b684..768956c3f 100644 --- a/x/checkpointing/keeper/keeper.go +++ b/x/checkpointing/keeper/keeper.go @@ -107,13 +107,13 @@ func (k Keeper) addBlsSig(ctx sdk.Context, sig *types.BlsSig) error { } // verify BLS sig - msgBytes := append(sdk.Uint64ToBigEndian(sig.GetEpochNum()), *sig.LastCommitHash...) - ok, err := bls12381.Verify(*sig.BlsSig, signerBlsKey, msgBytes) + signBytes := types.GetSignBytes(sig.GetEpochNum(), *sig.LastCommitHash) + ok, err := bls12381.Verify(*sig.BlsSig, signerBlsKey, signBytes) if err != nil { return err } if !ok { - return errors.New("BLS signature does not match the public key") + return types.ErrInvalidBlsSignature } // accumulate BLS signatures @@ -238,7 +238,7 @@ func (k Keeper) verifyCkptBytes(ctx sdk.Context, rawCheckpoint *txformat.RawBtcC if sum <= totalPower*1/3 { return nil, types.ErrInvalidRawCheckpoint.Wrap("insufficient voting power") } - msgBytes := append(sdk.Uint64ToBigEndian(ckpt.GetEpochNum()), *ckpt.LastCommitHash...) + msgBytes := types.GetSignBytes(ckpt.GetEpochNum(), *ckpt.LastCommitHash) ok, err := bls12381.VerifyMultiSig(*ckpt.BlsMultiSig, signersPubKeys, msgBytes) if err != nil { return nil, err diff --git a/x/checkpointing/keeper/keeper_test.go b/x/checkpointing/keeper/keeper_test.go index 37eebec6d..c6f15987e 100644 --- a/x/checkpointing/keeper/keeper_test.go +++ b/x/checkpointing/keeper/keeper_test.go @@ -4,18 +4,20 @@ import ( "math/rand" "testing" - "github.com/babylonchain/babylon/btctxformatter" - "github.com/babylonchain/babylon/crypto/bls12381" "github.com/boljen/go-bitmap" sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/babylonchain/babylon/btctxformatter" + "github.com/babylonchain/babylon/crypto/bls12381" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/golang/mock/gomock" + "github.com/stretchr/testify/require" + "github.com/babylonchain/babylon/testutil/datagen" testkeeper "github.com/babylonchain/babylon/testutil/keeper" "github.com/babylonchain/babylon/testutil/mocks" "github.com/babylonchain/babylon/x/checkpointing/types" - "github.com/cosmos/cosmos-sdk/client" - "github.com/golang/mock/gomock" - "github.com/stretchr/testify/require" ) // FuzzKeeperAddRawCheckpoint checks @@ -179,7 +181,7 @@ func FuzzKeeperCheckpointEpoch(f *testing.F) { localCkptWithMeta.Status = types.Sealed localCkptWithMeta.PowerSum = 10 localCkptWithMeta.Ckpt.Bitmap = bm - msgBytes := append(sdk.Uint64ToBigEndian(localCkptWithMeta.Ckpt.EpochNum), *localCkptWithMeta.Ckpt.LastCommitHash...) + msgBytes := types.GetSignBytes(localCkptWithMeta.Ckpt.EpochNum, *localCkptWithMeta.Ckpt.LastCommitHash) sig := bls12381.Sign(blsPrivKey1, msgBytes) localCkptWithMeta.Ckpt.BlsMultiSig = &sig _ = ckptKeeper.AddRawCheckpoint( @@ -212,7 +214,7 @@ func FuzzKeeperCheckpointEpoch(f *testing.F) { // 3. check a conflicting checkpoint; signed on a random lastcommithash conflictLastCommitHash := datagen.GenRandomByteArray(btctxformatter.LastCommitHashLength) - msgBytes = append(sdk.Uint64ToBigEndian(localCkptWithMeta.Ckpt.EpochNum), conflictLastCommitHash...) + msgBytes = types.GetSignBytes(localCkptWithMeta.Ckpt.EpochNum, conflictLastCommitHash) rawBtcCheckpoint = makeBtcCkptBytes( localCkptWithMeta.Ckpt.EpochNum, conflictLastCommitHash, @@ -221,7 +223,7 @@ func FuzzKeeperCheckpointEpoch(f *testing.F) { t, ) require.Panics(t, func() { - _ = ckptKeeper.VerifyCheckpoint(ctx, *rawBtcCheckpoint) + _ = ckptKeeper.VerifyCheckpoint(ctx, *rawBtcCheckpoint) }) }) } diff --git a/x/checkpointing/keeper/msg_server_test.go b/x/checkpointing/keeper/msg_server_test.go index 786b93a1a..dcd1bc8ad 100644 --- a/x/checkpointing/keeper/msg_server_test.go +++ b/x/checkpointing/keeper/msg_server_test.go @@ -5,6 +5,12 @@ import ( "testing" "cosmossdk.io/math" + "github.com/cosmos/cosmos-sdk/crypto/codec" + sdk "github.com/cosmos/cosmos-sdk/types" + stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" + "github.com/stretchr/testify/require" + "github.com/tendermint/tendermint/crypto/ed25519" + "github.com/babylonchain/babylon/app" appparams "github.com/babylonchain/babylon/app/params" "github.com/babylonchain/babylon/crypto/bls12381" @@ -13,11 +19,6 @@ import ( checkpointingkeeper "github.com/babylonchain/babylon/x/checkpointing/keeper" "github.com/babylonchain/babylon/x/checkpointing/types" "github.com/babylonchain/babylon/x/epoching/testepoching" - "github.com/cosmos/cosmos-sdk/crypto/codec" - sdk "github.com/cosmos/cosmos-sdk/types" - stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - "github.com/stretchr/testify/require" - "github.com/tendermint/tendermint/crypto/ed25519" ) // FuzzWrappedCreateValidator_InsufficientTokens tests adding new validators with zero voting power @@ -163,57 +164,216 @@ func FuzzWrappedCreateValidator(f *testing.F) { }) } -func TestInvalidLastCommitHash(t *testing.T) { - helper := testepoching.NewHelperWithValSet(t) - ck := helper.App.CheckpointingKeeper - msgServer := checkpointingkeeper.NewMsgServerImpl(ck) - // needed to init total voting power - helper.BeginBlock() - - epoch := uint64(1) - validLch := datagen.GenRandomByteArray(32) - // correct checkpoint for epoch 1 - _, err := ck.BuildRawCheckpoint(helper.Ctx, epoch, validLch) - require.NoError(t, err) - - // Malicious validator created message with valid bls signature but for invalid - // commit hash - invalidLch := datagen.GenRandomByteArray(32) - val0Info := helper.ValBlsPrivKeys[0] - signBytes := append(sdk.Uint64ToBigEndian(epoch), invalidLch...) - sig := bls12381.Sign(val0Info.BlsKey, signBytes) - msg := types.NewMsgAddBlsSig(epoch, invalidLch, sig, val0Info.Address) - - _, err = msgServer.AddBlsSig(helper.Ctx, msg) - require.ErrorIs(t, err, types.ErrInvalidLastCommitHash) +// FuzzAddBlsSig_NoError tests adding BLS signatures via MsgAddBlsSig +// it covers the following scenarios that would not cause errors: +// 1. a BLS signature is successfully accumulated and the checkpoint remains ACCUMULATING +// 2. a BLS signature is successfully accumulated and the checkpoint is changed to SEALED +// 3. a BLS signature is rejected if the checkpoint is not ACCUMULATING +func FuzzAddBlsSig_NoError(f *testing.F) { + datagen.AddRandomSeedsToFuzzer(f, 4) + + f.Fuzz(func(t *testing.T, seed int64) { + rand.Seed(seed) + + helper := testepoching.NewHelperWithValSet(t) + ek := helper.EpochingKeeper + ck := helper.App.CheckpointingKeeper + msgServer := checkpointingkeeper.NewMsgServerImpl(ck) + + // BeginBlock of block 1, and thus entering epoch 1 + ctx := helper.BeginBlock() + epoch := ek.GetEpoch(ctx) + require.Equal(t, uint64(1), epoch.EpochNumber) + + // apply 2 blocks to ensure that a raw checkpoint for the previous epoch is built + for i := uint64(0); i < 2; i++ { + ctx = helper.GenAndApplyEmptyBlock() + } + endingEpoch := ek.GetEpoch(ctx).EpochNumber - 1 + _, err := ck.GetRawCheckpoint(ctx, endingEpoch) + require.NoError(t, err) + + // add BLS signatures + n := len(helper.ValBlsPrivKeys) + totalPower := uint64(ck.GetTotalVotingPower(ctx, endingEpoch)) + for i := 0; i < n; i++ { + lch := ctx.BlockHeader().LastCommitHash + blsPrivKey := helper.ValBlsPrivKeys[i].BlsKey + addr := helper.ValBlsPrivKeys[i].Address + signBytes := types.GetSignBytes(endingEpoch, lch) + blsSig := bls12381.Sign(blsPrivKey, signBytes) + + // create MsgAddBlsSig message + msg := types.NewMsgAddBlsSig(endingEpoch, lch, blsSig, addr) + _, err = msgServer.AddBlsSig(ctx, msg) + require.NoError(t, err) + afterCkpt, err := ck.GetRawCheckpoint(ctx, endingEpoch) + require.NoError(t, err) + if afterCkpt.PowerSum <= totalPower/3 { + require.True(t, afterCkpt.Status == types.Accumulating) + } else { + require.True(t, afterCkpt.Status == types.Sealed) + } + } + }) } -func buildMsgWrappedCreateValidator(addr sdk.AccAddress) (*types.MsgWrappedCreateValidator, error) { - tmValPrivkey := ed25519.GenPrivKey() - bondTokens := sdk.TokensFromConsensusPower(10, sdk.DefaultPowerReduction) - bondCoin := sdk.NewCoin(appparams.DefaultBondDenom, bondTokens) - description := stakingtypes.NewDescription("foo_moniker", "", "", "", "") - commission := stakingtypes.NewCommissionRates(sdk.ZeroDec(), sdk.ZeroDec(), sdk.ZeroDec()) +// FuzzAddBlsSig_Error tests adding BLS signatures via MsgAddBlsSig +// in a scenario where the signer is not in the checkpoint's validator set +func FuzzAddBlsSig_NotInValSet(f *testing.F) { + datagen.AddRandomSeedsToFuzzer(f, 4) - pk, err := codec.FromTmPubKeyInterface(tmValPrivkey.PubKey()) - if err != nil { - return nil, err - } + f.Fuzz(func(t *testing.T, seed int64) { + rand.Seed(seed) - createValidatorMsg, err := stakingtypes.NewMsgCreateValidator( - sdk.ValAddress(addr), pk, bondCoin, description, commission, sdk.OneInt(), - ) - if err != nil { - return nil, err - } - blsPrivKey := bls12381.GenPrivKey() - pop, err := privval.BuildPoP(tmValPrivkey, blsPrivKey) - if err != nil { - return nil, err - } - blsPubKey := blsPrivKey.PubKey() + helper := testepoching.NewHelperWithValSet(t) + ek := helper.EpochingKeeper + ck := helper.App.CheckpointingKeeper + msgServer := checkpointingkeeper.NewMsgServerImpl(ck) - return types.NewMsgWrappedCreateValidator(createValidatorMsg, &blsPubKey, pop) + // BeginBlock of block 1, and thus entering epoch 1 + ctx := helper.BeginBlock() + // apply 2 blocks to ensure that a raw checkpoint for the previous epoch is built + for i := uint64(0); i < 2; i++ { + ctx = helper.GenAndApplyEmptyBlock() + } + endingEpoch := ek.GetEpoch(ctx).EpochNumber - 1 + _, err := ck.GetRawCheckpoint(ctx, endingEpoch) + require.NoError(t, err) + + // build BLS sig from a random validator (not in the validator set) + lch := ctx.BlockHeader().LastCommitHash + blsPrivKey := bls12381.GenPrivKey() + valAddr := datagen.GenRandomValidatorAddress() + signBytes := types.GetSignBytes(endingEpoch, lch) + blsSig := bls12381.Sign(blsPrivKey, signBytes) + msg := types.NewMsgAddBlsSig(endingEpoch, lch, blsSig, valAddr) + + _, err = msgServer.AddBlsSig(ctx, msg) + require.Error(t, err, types.ErrCkptDoesNotExist) + }) +} + +// FuzzAddBlsSig_CkptNotExist tests adding BLS signatures via MsgAddBlsSig +// in a scenario where the corresponding checkpoint does not exist +func FuzzAddBlsSig_CkptNotExist(f *testing.F) { + datagen.AddRandomSeedsToFuzzer(f, 4) + + f.Fuzz(func(t *testing.T, seed int64) { + rand.Seed(seed) + + helper := testepoching.NewHelperWithValSet(t) + ek := helper.EpochingKeeper + ck := helper.App.CheckpointingKeeper + msgServer := checkpointingkeeper.NewMsgServerImpl(ck) + + // BeginBlock of block 1, and thus entering epoch 1 + ctx := helper.BeginBlock() + epoch := ek.GetEpoch(ctx) + require.Equal(t, uint64(1), epoch.EpochNumber) + + // build BLS signature from a random validator of the validator set + n := len(helper.ValBlsPrivKeys) + i := rand.Intn(n) + lch := ctx.BlockHeader().LastCommitHash + blsPrivKey := helper.ValBlsPrivKeys[i].BlsKey + addr := helper.ValBlsPrivKeys[i].Address + signBytes := types.GetSignBytes(epoch.EpochNumber-1, lch) + blsSig := bls12381.Sign(blsPrivKey, signBytes) + msg := types.NewMsgAddBlsSig(epoch.EpochNumber-1, lch, blsSig, addr) + + // add the BLS signature + _, err := msgServer.AddBlsSig(ctx, msg) + require.Error(t, err, types.ErrCkptDoesNotExist) + }) +} + +// FuzzAddBlsSig_WrongLastCommitHash tests adding BLS signatures via MsgAddBlsSig +// in a scenario where the signature is signed over wrong last_commit_hash +// 4. a BLS signature is rejected if the signature is invalid +func FuzzAddBlsSig_WrongLastCommitHash(f *testing.F) { + datagen.AddRandomSeedsToFuzzer(f, 4) + + f.Fuzz(func(t *testing.T, seed int64) { + rand.Seed(seed) + + helper := testepoching.NewHelperWithValSet(t) + ek := helper.EpochingKeeper + ck := helper.App.CheckpointingKeeper + msgServer := checkpointingkeeper.NewMsgServerImpl(ck) + + // BeginBlock of block 1, and thus entering epoch 1 + ctx := helper.BeginBlock() + epoch := ek.GetEpoch(ctx) + require.Equal(t, uint64(1), epoch.EpochNumber) + // apply 2 blocks to ensure that a raw checkpoint for the previous epoch is built + for i := uint64(0); i < 2; i++ { + ctx = helper.GenAndApplyEmptyBlock() + } + endingEpoch := ek.GetEpoch(ctx).EpochNumber - 1 + _, err := ck.GetRawCheckpoint(ctx, endingEpoch) + require.NoError(t, err) + + // build BLS sig from a random validator + n := len(helper.ValBlsPrivKeys) + i := rand.Intn(n) + // inject random last commit hash + lch := datagen.GenRandomLastCommitHash() + blsPrivKey := helper.ValBlsPrivKeys[i].BlsKey + addr := helper.ValBlsPrivKeys[i].Address + signBytes := types.GetSignBytes(endingEpoch, lch) + blsSig := bls12381.Sign(blsPrivKey, signBytes) + msg := types.NewMsgAddBlsSig(endingEpoch, lch, blsSig, addr) + + // add the BLS signature + _, err = msgServer.AddBlsSig(ctx, msg) + require.Error(t, err, types.ErrInvalidLastCommitHash) + }) +} + +// FuzzAddBlsSig_InvalidSignature tests adding BLS signatures via MsgAddBlsSig +// in a scenario where the signature is invalid +func FuzzAddBlsSig_InvalidSignature(f *testing.F) { + datagen.AddRandomSeedsToFuzzer(f, 4) + + f.Fuzz(func(t *testing.T, seed int64) { + rand.Seed(seed) + + helper := testepoching.NewHelperWithValSet(t) + ek := helper.EpochingKeeper + ck := helper.App.CheckpointingKeeper + msgServer := checkpointingkeeper.NewMsgServerImpl(ck) + + // BeginBlock of block 1, and thus entering epoch 1 + ctx := helper.BeginBlock() + epoch := ek.GetEpoch(ctx) + require.Equal(t, uint64(1), epoch.EpochNumber) + // apply 2 blocks to ensure that a raw checkpoint for the previous epoch is built + for i := uint64(0); i < 2; i++ { + ctx = helper.GenAndApplyEmptyBlock() + } + endingEpoch := ek.GetEpoch(ctx).EpochNumber - 1 + _, err := ck.GetRawCheckpoint(ctx, endingEpoch) + require.NoError(t, err) + + // build BLS sig from a random validator + n := len(helper.ValBlsPrivKeys) + i := rand.Intn(n) + // inject random last commit hash + lch := ctx.BlockHeader().LastCommitHash + addr := helper.ValBlsPrivKeys[i].Address + blsSig := datagen.GenRandomBlsMultiSig() + msg := types.NewMsgAddBlsSig(endingEpoch, lch, blsSig, addr) + + // add the BLS signature message + _, err = msgServer.AddBlsSig(ctx, msg) + require.Error(t, err, types.ErrInvalidBlsSignature) + }) +} + +func buildMsgWrappedCreateValidator(addr sdk.AccAddress) (*types.MsgWrappedCreateValidator, error) { + bondTokens := sdk.TokensFromConsensusPower(10, sdk.DefaultPowerReduction) + return buildMsgWrappedCreateValidatorWithAmount(addr, bondTokens) } func buildMsgWrappedCreateValidatorWithAmount(addr sdk.AccAddress, bondTokens math.Int) (*types.MsgWrappedCreateValidator, error) { diff --git a/x/checkpointing/types/errors.go b/x/checkpointing/types/errors.go index 95fd9cdcb..124fac9d0 100644 --- a/x/checkpointing/types/errors.go +++ b/x/checkpointing/types/errors.go @@ -15,6 +15,7 @@ var ( ErrBlsKeyDoesNotExist = sdkerrors.Register(ModuleName, 1209, "BLS public key does not exist") ErrBlsKeyAlreadyExist = sdkerrors.Register(ModuleName, 1210, "BLS public key already exists") ErrBlsPrivKeyDoesNotExist = sdkerrors.Register(ModuleName, 1211, "BLS private key does not exist") - ErrConflictingCheckpoint = sdkerrors.Register(ModuleName, 1212, "Conflicting checkpoint is found") - ErrInvalidLastCommitHash = sdkerrors.Register(ModuleName, 1213, "Provided last commit hash is Invalid") + ErrInvalidBlsSignature = sdkerrors.Register(ModuleName, 1212, "BLS signature is invalid") + ErrConflictingCheckpoint = sdkerrors.Register(ModuleName, 1213, "Conflicting checkpoint is found") + ErrInvalidLastCommitHash = sdkerrors.Register(ModuleName, 1214, "Provided last commit hash is Invalid") ) diff --git a/x/checkpointing/types/types_test.go b/x/checkpointing/types/types_test.go index 3bfe4aa33..388ff3183 100644 --- a/x/checkpointing/types/types_test.go +++ b/x/checkpointing/types/types_test.go @@ -3,12 +3,12 @@ package types_test import ( "testing" + "github.com/cosmos/cosmos-sdk/client" + "github.com/stretchr/testify/require" + "github.com/babylonchain/babylon/testutil/datagen" testkeeper "github.com/babylonchain/babylon/testutil/keeper" "github.com/babylonchain/babylon/x/checkpointing/types" - "github.com/cosmos/cosmos-sdk/client" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/stretchr/testify/require" ) // a single validator @@ -18,7 +18,7 @@ func TestRawCheckpointWithMeta_Accumulate1(t *testing.T) { totalPower := int64(10) ckptkeeper, ctx, _ := testkeeper.CheckpointingKeeper(t, nil, nil, client.Context{}) lch := datagen.GenRandomLastCommitHash() - msg := append(sdk.Uint64ToBigEndian(epochNum), lch...) + msg := types.GetSignBytes(epochNum, lch) blsPubkeys, blsSigs := datagen.GenRandomPubkeysAndSigs(n, msg) ckpt, err := ckptkeeper.BuildRawCheckpoint(ctx, epochNum, lch) require.NoError(t, err) @@ -40,7 +40,7 @@ func TestRawCheckpointWithMeta_Accumulate4(t *testing.T) { totalPower := int64(10) * int64(n) ckptkeeper, ctx, _ := testkeeper.CheckpointingKeeper(t, nil, nil, client.Context{}) lch := datagen.GenRandomLastCommitHash() - msg := append(sdk.Uint64ToBigEndian(epochNum), lch...) + msg := types.GetSignBytes(epochNum, lch) blsPubkeys, blsSigs := datagen.GenRandomPubkeysAndSigs(n, msg) ckpt, err := ckptkeeper.BuildRawCheckpoint(ctx, epochNum, lch) require.NoError(t, err) diff --git a/x/checkpointing/types/utils.go b/x/checkpointing/types/utils.go index 584037089..5da396553 100644 --- a/x/checkpointing/types/utils.go +++ b/x/checkpointing/types/utils.go @@ -3,10 +3,12 @@ package types import ( "bytes" "encoding/hex" - "github.com/babylonchain/babylon/btctxformatter" - "github.com/babylonchain/babylon/crypto/bls12381" + sdk "github.com/cosmos/cosmos-sdk/types" "github.com/tendermint/tendermint/crypto/tmhash" + + "github.com/babylonchain/babylon/btctxformatter" + "github.com/babylonchain/babylon/crypto/bls12381" ) func (m BlsSig) Hash() BlsSigHash { @@ -116,3 +118,7 @@ func FromRawCkptToBTCCkpt(rawCkpt *RawCheckpoint, address []byte) (*btctxformatt return btcCkpt, nil } + +func GetSignBytes(epoch uint64, hash []byte) []byte { + return append(sdk.Uint64ToBigEndian(epoch), hash...) +} diff --git a/x/epoching/testepoching/helper.go b/x/epoching/testepoching/helper.go index 56c401b98..14df4f6b0 100644 --- a/x/epoching/testepoching/helper.go +++ b/x/epoching/testepoching/helper.go @@ -7,13 +7,10 @@ import ( "github.com/babylonchain/babylon/testutil/datagen" "cosmossdk.io/math" - appparams "github.com/babylonchain/babylon/app/params" "github.com/stretchr/testify/require" - "github.com/babylonchain/babylon/app" - "github.com/babylonchain/babylon/x/epoching" - "github.com/babylonchain/babylon/x/epoching/keeper" - "github.com/babylonchain/babylon/x/epoching/types" + appparams "github.com/babylonchain/babylon/app/params" + "github.com/cosmos/cosmos-sdk/baseapp" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" sdk "github.com/cosmos/cosmos-sdk/types" @@ -23,6 +20,11 @@ import ( stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" abci "github.com/tendermint/tendermint/abci/types" tmproto "github.com/tendermint/tendermint/proto/tendermint/types" + + "github.com/babylonchain/babylon/app" + "github.com/babylonchain/babylon/x/epoching" + "github.com/babylonchain/babylon/x/epoching/keeper" + "github.com/babylonchain/babylon/x/epoching/types" ) type ValidatorInfo struct { @@ -131,9 +133,10 @@ func (h *Helper) GenAndApplyEmptyBlock() sdk.Context { valhash := CalculateValHash(valSet) newHeader := tmproto.Header{ Height: newHeight, - AppHash: datagen.GenRandomByteArray(32), ValidatorsHash: valhash, NextValidatorsHash: valhash, + AppHash: datagen.GenRandomByteArray(32), + LastCommitHash: datagen.GenRandomLastCommitHash(), } h.App.BeginBlock(abci.RequestBeginBlock{Header: newHeader}) From 285f2085f5e5f771a25a21e66dec1c42797ea5d8 Mon Sep 17 00:00:00 2001 From: Runchao Han Date: Wed, 22 Feb 2023 18:51:34 +1100 Subject: [PATCH 09/59] checkpointing: stateless checks on `MsgCreateValidator` (#316) --- .../mocks/checkpointing_expected_keepers.go | 76 ++++++++++++--- x/checkpointing/keeper/msg_server.go | 5 + x/checkpointing/types/expected_keepers.go | 2 + x/epoching/keeper/staking_functions.go | 97 +++++++++++++++++++ x/epoching/types/expected_keepers.go | 1 + 5 files changed, 165 insertions(+), 16 deletions(-) create mode 100644 x/epoching/keeper/staking_functions.go diff --git a/testutil/mocks/checkpointing_expected_keepers.go b/testutil/mocks/checkpointing_expected_keepers.go index 3c13ba778..2c7327500 100644 --- a/testutil/mocks/checkpointing_expected_keepers.go +++ b/testutil/mocks/checkpointing_expected_keepers.go @@ -7,9 +7,11 @@ package mocks import ( reflect "reflect" - types "github.com/babylonchain/babylon/x/epoching/types" - types0 "github.com/cosmos/cosmos-sdk/types" - types1 "github.com/cosmos/cosmos-sdk/x/auth/types" + types "github.com/babylonchain/babylon/x/checkpointing/types" + types0 "github.com/babylonchain/babylon/x/epoching/types" + types1 "github.com/cosmos/cosmos-sdk/types" + types2 "github.com/cosmos/cosmos-sdk/x/auth/types" + types3 "github.com/cosmos/cosmos-sdk/x/staking/types" gomock "github.com/golang/mock/gomock" ) @@ -37,10 +39,10 @@ func (m *MockAccountKeeper) EXPECT() *MockAccountKeeperMockRecorder { } // GetAccount mocks base method. -func (m *MockAccountKeeper) GetAccount(ctx types0.Context, addr types0.AccAddress) types1.AccountI { +func (m *MockAccountKeeper) GetAccount(ctx types1.Context, addr types1.AccAddress) types2.AccountI { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetAccount", ctx, addr) - ret0, _ := ret[0].(types1.AccountI) + ret0, _ := ret[0].(types2.AccountI) return ret0 } @@ -74,10 +76,10 @@ func (m *MockBankKeeper) EXPECT() *MockBankKeeperMockRecorder { } // SpendableCoins mocks base method. -func (m *MockBankKeeper) SpendableCoins(ctx types0.Context, addr types0.AccAddress) types0.Coins { +func (m *MockBankKeeper) SpendableCoins(ctx types1.Context, addr types1.AccAddress) types1.Coins { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "SpendableCoins", ctx, addr) - ret0, _ := ret[0].(types0.Coins) + ret0, _ := ret[0].(types1.Coins) return ret0 } @@ -110,8 +112,22 @@ func (m *MockEpochingKeeper) EXPECT() *MockEpochingKeeperMockRecorder { return m.recorder } +// CheckMsgCreateValidator mocks base method. +func (m *MockEpochingKeeper) CheckMsgCreateValidator(ctx types1.Context, msg *types3.MsgCreateValidator) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CheckMsgCreateValidator", ctx, msg) + ret0, _ := ret[0].(error) + return ret0 +} + +// CheckMsgCreateValidator indicates an expected call of CheckMsgCreateValidator. +func (mr *MockEpochingKeeperMockRecorder) CheckMsgCreateValidator(ctx, msg interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CheckMsgCreateValidator", reflect.TypeOf((*MockEpochingKeeper)(nil).CheckMsgCreateValidator), ctx, msg) +} + // EnqueueMsg mocks base method. -func (m *MockEpochingKeeper) EnqueueMsg(ctx types0.Context, msg types.QueuedMessage) { +func (m *MockEpochingKeeper) EnqueueMsg(ctx types1.Context, msg types0.QueuedMessage) { m.ctrl.T.Helper() m.ctrl.Call(m, "EnqueueMsg", ctx, msg) } @@ -123,10 +139,10 @@ func (mr *MockEpochingKeeperMockRecorder) EnqueueMsg(ctx, msg interface{}) *gomo } // GetEpoch mocks base method. -func (m *MockEpochingKeeper) GetEpoch(ctx types0.Context) *types.Epoch { +func (m *MockEpochingKeeper) GetEpoch(ctx types1.Context) *types0.Epoch { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetEpoch", ctx) - ret0, _ := ret[0].(*types.Epoch) + ret0, _ := ret[0].(*types0.Epoch) return ret0 } @@ -137,7 +153,7 @@ func (mr *MockEpochingKeeperMockRecorder) GetEpoch(ctx interface{}) *gomock.Call } // GetTotalVotingPower mocks base method. -func (m *MockEpochingKeeper) GetTotalVotingPower(ctx types0.Context, epochNumber uint64) int64 { +func (m *MockEpochingKeeper) GetTotalVotingPower(ctx types1.Context, epochNumber uint64) int64 { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetTotalVotingPower", ctx, epochNumber) ret0, _ := ret[0].(int64) @@ -151,10 +167,10 @@ func (mr *MockEpochingKeeperMockRecorder) GetTotalVotingPower(ctx, epochNumber i } // GetValidatorSet mocks base method. -func (m *MockEpochingKeeper) GetValidatorSet(ctx types0.Context, epochNumer uint64) types.ValidatorSet { +func (m *MockEpochingKeeper) GetValidatorSet(ctx types1.Context, epochNumer uint64) types0.ValidatorSet { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetValidatorSet", ctx, epochNumer) - ret0, _ := ret[0].(types.ValidatorSet) + ret0, _ := ret[0].(types0.ValidatorSet) return ret0 } @@ -188,7 +204,7 @@ func (m *MockCheckpointingHooks) EXPECT() *MockCheckpointingHooksMockRecorder { } // AfterBlsKeyRegistered mocks base method. -func (m *MockCheckpointingHooks) AfterBlsKeyRegistered(ctx types0.Context, valAddr types0.ValAddress) error { +func (m *MockCheckpointingHooks) AfterBlsKeyRegistered(ctx types1.Context, valAddr types1.ValAddress) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "AfterBlsKeyRegistered", ctx, valAddr) ret0, _ := ret[0].(error) @@ -201,8 +217,22 @@ func (mr *MockCheckpointingHooksMockRecorder) AfterBlsKeyRegistered(ctx, valAddr return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AfterBlsKeyRegistered", reflect.TypeOf((*MockCheckpointingHooks)(nil).AfterBlsKeyRegistered), ctx, valAddr) } +// AfterRawCheckpointBlsSigVerified mocks base method. +func (m *MockCheckpointingHooks) AfterRawCheckpointBlsSigVerified(ctx types1.Context, ckpt *types.RawCheckpoint) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AfterRawCheckpointBlsSigVerified", ctx, ckpt) + ret0, _ := ret[0].(error) + return ret0 +} + +// AfterRawCheckpointBlsSigVerified indicates an expected call of AfterRawCheckpointBlsSigVerified. +func (mr *MockCheckpointingHooksMockRecorder) AfterRawCheckpointBlsSigVerified(ctx, ckpt interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AfterRawCheckpointBlsSigVerified", reflect.TypeOf((*MockCheckpointingHooks)(nil).AfterRawCheckpointBlsSigVerified), ctx, ckpt) +} + // AfterRawCheckpointConfirmed mocks base method. -func (m *MockCheckpointingHooks) AfterRawCheckpointConfirmed(ctx types0.Context, epoch uint64) error { +func (m *MockCheckpointingHooks) AfterRawCheckpointConfirmed(ctx types1.Context, epoch uint64) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "AfterRawCheckpointConfirmed", ctx, epoch) ret0, _ := ret[0].(error) @@ -216,7 +246,7 @@ func (mr *MockCheckpointingHooksMockRecorder) AfterRawCheckpointConfirmed(ctx, e } // AfterRawCheckpointFinalized mocks base method. -func (m *MockCheckpointingHooks) AfterRawCheckpointFinalized(ctx types0.Context, epoch uint64) error { +func (m *MockCheckpointingHooks) AfterRawCheckpointFinalized(ctx types1.Context, epoch uint64) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "AfterRawCheckpointFinalized", ctx, epoch) ret0, _ := ret[0].(error) @@ -228,3 +258,17 @@ func (mr *MockCheckpointingHooksMockRecorder) AfterRawCheckpointFinalized(ctx, e mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AfterRawCheckpointFinalized", reflect.TypeOf((*MockCheckpointingHooks)(nil).AfterRawCheckpointFinalized), ctx, epoch) } + +// AfterRawCheckpointForgotten mocks base method. +func (m *MockCheckpointingHooks) AfterRawCheckpointForgotten(ctx types1.Context, ckpt *types.RawCheckpoint) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AfterRawCheckpointForgotten", ctx, ckpt) + ret0, _ := ret[0].(error) + return ret0 +} + +// AfterRawCheckpointForgotten indicates an expected call of AfterRawCheckpointForgotten. +func (mr *MockCheckpointingHooksMockRecorder) AfterRawCheckpointForgotten(ctx, ckpt interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AfterRawCheckpointForgotten", reflect.TypeOf((*MockCheckpointingHooks)(nil).AfterRawCheckpointForgotten), ctx, ckpt) +} diff --git a/x/checkpointing/keeper/msg_server.go b/x/checkpointing/keeper/msg_server.go index b1a13e7de..70baa36a5 100644 --- a/x/checkpointing/keeper/msg_server.go +++ b/x/checkpointing/keeper/msg_server.go @@ -43,6 +43,11 @@ func (m msgServer) AddBlsSig(goCtx context.Context, msg *types.MsgAddBlsSig) (*t func (m msgServer) WrappedCreateValidator(goCtx context.Context, msg *types.MsgWrappedCreateValidator) (*types.MsgWrappedCreateValidatorResponse, error) { ctx := sdk.UnwrapSDKContext(goCtx) + // stateless checks on the inside `MsgCreateValidator` msg + if err := m.k.epochingKeeper.CheckMsgCreateValidator(ctx, msg.MsgCreateValidator); err != nil { + return nil, err + } + valAddr, err := sdk.ValAddressFromBech32(msg.MsgCreateValidator.ValidatorAddress) if err != nil { return nil, err diff --git a/x/checkpointing/types/expected_keepers.go b/x/checkpointing/types/expected_keepers.go index 2d3645970..36eda39a8 100644 --- a/x/checkpointing/types/expected_keepers.go +++ b/x/checkpointing/types/expected_keepers.go @@ -4,6 +4,7 @@ import ( epochingtypes "github.com/babylonchain/babylon/x/epoching/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/auth/types" + stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" ) // AccountKeeper defines the expected account keeper used for simulations (noalias) @@ -24,6 +25,7 @@ type EpochingKeeper interface { EnqueueMsg(ctx sdk.Context, msg epochingtypes.QueuedMessage) GetValidatorSet(ctx sdk.Context, epochNumer uint64) epochingtypes.ValidatorSet GetTotalVotingPower(ctx sdk.Context, epochNumber uint64) int64 + CheckMsgCreateValidator(ctx sdk.Context, msg *stakingtypes.MsgCreateValidator) error } // Event Hooks diff --git a/x/epoching/keeper/staking_functions.go b/x/epoching/keeper/staking_functions.go new file mode 100644 index 000000000..6443c521c --- /dev/null +++ b/x/epoching/keeper/staking_functions.go @@ -0,0 +1,97 @@ +package keeper + +import ( + cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" +) + +// CheckMsgCreateValidator performs stateless checks on a given `MsgCreateValidator` message +// The checkpointing module will use this function to verify the `MsgCreateValidator` message +// inside a `MsgWrappedCreateValidator` message. +// (adapted from https://github.com/cosmos/cosmos-sdk/blob/v0.46.10/x/staking/keeper/msg_server.go#L34-L108) +func (k Keeper) CheckMsgCreateValidator(ctx sdk.Context, msg *stakingtypes.MsgCreateValidator) error { + // ensure validator address is correctly encoded + valAddr, err := sdk.ValAddressFromBech32(msg.ValidatorAddress) + if err != nil { + return err + } + + // get parameters of the staking module + sParams := k.stk.GetParams(ctx) + + // check commission rate + if msg.Commission.Rate.LT(sParams.MinCommissionRate) { + return sdkerrors.Wrapf(stakingtypes.ErrCommissionLTMinRate, "cannot set validator commission to less than minimum rate of %s", sParams.MinCommissionRate) + } + + // ensure the validator operator was not registered before + if _, found := k.stk.GetValidator(ctx, valAddr); found { + return stakingtypes.ErrValidatorOwnerExists + } + + // check if the pubkey is correctly encoded + pk, ok := msg.Pubkey.GetCachedValue().(cryptotypes.PubKey) + if !ok { + return sdkerrors.Wrapf(sdkerrors.ErrInvalidType, "Expecting cryptotypes.PubKey, got %T", pk) + } + + // ensure the validator was not registered before + if _, found := k.stk.GetValidatorByConsAddr(ctx, sdk.GetConsAddress(pk)); found { + return stakingtypes.ErrValidatorPubKeyExists + } + + // ensure BondDemon is correct + if msg.Value.Denom != sParams.BondDenom { + return sdkerrors.Wrapf( + sdkerrors.ErrInvalidRequest, "invalid coin denomination: got %s, expected %s", msg.Value.Denom, sParams.BondDenom, + ) + } + + // ensure description's length is valid + if _, err := msg.Description.EnsureLength(); err != nil { + return err + } + + // ensure public key type is supported + cp := ctx.ConsensusParams() + if cp != nil && cp.Validator != nil { + pkType := pk.Type() + hasKeyType := false + for _, keyType := range cp.Validator.PubKeyTypes { + if pkType == keyType { + hasKeyType = true + break + } + } + if !hasKeyType { + return sdkerrors.Wrapf( + stakingtypes.ErrValidatorPubKeyTypeNotSupported, + "got: %s, expected: %s", pk.Type(), cp.Validator.PubKeyTypes, + ) + } + } + + // check validator + validator, err := stakingtypes.NewValidator(valAddr, pk, msg.Description) + if err != nil { + return err + } + + // check if SetInitialCommission fails or not + commission := stakingtypes.NewCommissionWithTime( + msg.Commission.Rate, msg.Commission.MaxRate, + msg.Commission.MaxChangeRate, ctx.BlockHeader().Time, + ) + if _, err := validator.SetInitialCommission(commission); err != nil { + return err + } + + // sanity check on delegator address + if _, err := sdk.AccAddressFromBech32(msg.DelegatorAddress); err != nil { + return err + } + + return nil +} diff --git a/x/epoching/types/expected_keepers.go b/x/epoching/types/expected_keepers.go index bd0e8e475..3e437eba8 100644 --- a/x/epoching/types/expected_keepers.go +++ b/x/epoching/types/expected_keepers.go @@ -45,6 +45,7 @@ type StakingKeeper interface { UnbondingToUnbonded(ctx sdk.Context, validator stakingtypes.Validator) stakingtypes.Validator RemoveValidator(ctx sdk.Context, address sdk.ValAddress) UnbondAllMatureValidators(ctx sdk.Context) + GetValidatorByConsAddr(ctx sdk.Context, consAddr sdk.ConsAddress) (stakingtypes.Validator, bool) } // Event Hooks From bdebe17b396f910c5f9220c6db699634b94aaaa5 Mon Sep 17 00:00:00 2001 From: Cirrus Gai Date: Thu, 23 Feb 2023 19:00:38 +0800 Subject: [PATCH 10/59] chore: Add balance check before inserting MsgWrappedCreateValidator into the epoch message queue (#318) --- app/app.go | 28 ++++++++++------- testutil/keeper/epoching.go | 6 ++-- x/checkpointing/keeper/msg_server_test.go | 38 +++++++++++++++++++++++ x/epoching/keeper/keeper.go | 6 +++- x/epoching/keeper/staking_functions.go | 12 +++++-- x/epoching/types/errors.go | 1 + 6 files changed, 74 insertions(+), 17 deletions(-) diff --git a/app/app.go b/app/app.go index 112ceb159..c817a4ba1 100644 --- a/app/app.go +++ b/app/app.go @@ -10,7 +10,6 @@ import ( nodeservice "github.com/cosmos/cosmos-sdk/client/grpc/node" - bbn "github.com/babylonchain/babylon/types" "github.com/gorilla/mux" "github.com/rakyll/statik/fs" "github.com/spf13/cast" @@ -19,7 +18,8 @@ import ( tmos "github.com/tendermint/tendermint/libs/os" dbm "github.com/tendermint/tm-db" - appparams "github.com/babylonchain/babylon/app/params" + bbn "github.com/babylonchain/babylon/types" + "github.com/cosmos/cosmos-sdk/baseapp" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/grpc/tmservice" @@ -87,9 +87,16 @@ import ( upgradekeeper "github.com/cosmos/cosmos-sdk/x/upgrade/keeper" upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" + appparams "github.com/babylonchain/babylon/app/params" + // unnamed import of statik for swagger UI support _ "github.com/cosmos/cosmos-sdk/client/docs/statik" + storetypes "github.com/cosmos/cosmos-sdk/store/types" + govclient "github.com/cosmos/cosmos-sdk/x/gov/client" + govv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" + govv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" + "github.com/babylonchain/babylon/x/btccheckpoint" btccheckpointkeeper "github.com/babylonchain/babylon/x/btccheckpoint/keeper" btccheckpointtypes "github.com/babylonchain/babylon/x/btccheckpoint/types" @@ -105,16 +112,8 @@ import ( "github.com/babylonchain/babylon/x/monitor" monitorkeeper "github.com/babylonchain/babylon/x/monitor/keeper" monitortypes "github.com/babylonchain/babylon/x/monitor/types" - storetypes "github.com/cosmos/cosmos-sdk/store/types" - govclient "github.com/cosmos/cosmos-sdk/x/gov/client" - govv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" - govv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" - // IBC-related - "github.com/babylonchain/babylon/x/zoneconcierge" - zckeeper "github.com/babylonchain/babylon/x/zoneconcierge/keeper" - zctypes "github.com/babylonchain/babylon/x/zoneconcierge/types" - transfer "github.com/cosmos/ibc-go/v5/modules/apps/transfer" + "github.com/cosmos/ibc-go/v5/modules/apps/transfer" ibctransferkeeper "github.com/cosmos/ibc-go/v5/modules/apps/transfer/keeper" ibctransfertypes "github.com/cosmos/ibc-go/v5/modules/apps/transfer/types" ibc "github.com/cosmos/ibc-go/v5/modules/core" @@ -122,6 +121,11 @@ import ( porttypes "github.com/cosmos/ibc-go/v5/modules/core/05-port/types" ibchost "github.com/cosmos/ibc-go/v5/modules/core/24-host" // ibc module puts types under `ibchost` rather than `ibctypes` ibckeeper "github.com/cosmos/ibc-go/v5/modules/core/keeper" + + // IBC-related + "github.com/babylonchain/babylon/x/zoneconcierge" + zckeeper "github.com/babylonchain/babylon/x/zoneconcierge/keeper" + zctypes "github.com/babylonchain/babylon/x/zoneconcierge/types" ) const ( @@ -346,7 +350,7 @@ func NewBabylonApp( // NOTE: the epoching module has to be set before the chekpointing module, as the checkpointing module will have access to the epoching module epochingKeeper := epochingkeeper.NewKeeper( - appCodec, keys[epochingtypes.StoreKey], keys[epochingtypes.StoreKey], app.GetSubspace(epochingtypes.ModuleName), &app.StakingKeeper, + appCodec, keys[epochingtypes.StoreKey], keys[epochingtypes.StoreKey], app.GetSubspace(epochingtypes.ModuleName), app.BankKeeper, &app.StakingKeeper, ) app.MintKeeper = mintkeeper.NewKeeper( diff --git a/testutil/keeper/epoching.go b/testutil/keeper/epoching.go index bbfc150b4..91cf13733 100644 --- a/testutil/keeper/epoching.go +++ b/testutil/keeper/epoching.go @@ -3,8 +3,6 @@ package keeper import ( "testing" - "github.com/babylonchain/babylon/x/epoching/keeper" - "github.com/babylonchain/babylon/x/epoching/types" "github.com/cosmos/cosmos-sdk/codec" codectypes "github.com/cosmos/cosmos-sdk/codec/types" "github.com/cosmos/cosmos-sdk/store" @@ -15,6 +13,9 @@ import ( "github.com/tendermint/tendermint/libs/log" tmproto "github.com/tendermint/tendermint/proto/tendermint/types" tmdb "github.com/tendermint/tm-db" + + "github.com/babylonchain/babylon/x/epoching/keeper" + "github.com/babylonchain/babylon/x/epoching/types" ) func EpochingKeeper(t testing.TB) (*keeper.Keeper, sdk.Context) { @@ -43,6 +44,7 @@ func EpochingKeeper(t testing.TB) (*keeper.Keeper, sdk.Context) { paramsSubspace, // TODO: make this compile at the moment, will fix for integrated testing nil, + nil, ) // TODO: add msgServiceRouter? diff --git a/x/checkpointing/keeper/msg_server_test.go b/x/checkpointing/keeper/msg_server_test.go index dcd1bc8ad..16c1c3690 100644 --- a/x/checkpointing/keeper/msg_server_test.go +++ b/x/checkpointing/keeper/msg_server_test.go @@ -19,6 +19,7 @@ import ( checkpointingkeeper "github.com/babylonchain/babylon/x/checkpointing/keeper" "github.com/babylonchain/babylon/x/checkpointing/types" "github.com/babylonchain/babylon/x/epoching/testepoching" + epochingtypes "github.com/babylonchain/babylon/x/epoching/types" ) // FuzzWrappedCreateValidator_InsufficientTokens tests adding new validators with zero voting power @@ -97,6 +98,43 @@ func FuzzWrappedCreateValidator_InsufficientTokens(f *testing.F) { }) } +// FuzzWrappedCreateValidator_InsufficientBalance tests adding a new validator +// but the delegator has insufficient balance to perform delegating +func FuzzWrappedCreateValidator_InsufficientBalance(f *testing.F) { + datagen.AddRandomSeedsToFuzzer(f, 4) + + f.Fuzz(func(t *testing.T, seed int64) { + rand.Seed(seed) + + // a genesis validator is generate for setup + helper := testepoching.NewHelper(t) + ek := helper.EpochingKeeper + ck := helper.App.CheckpointingKeeper + msgServer := checkpointingkeeper.NewMsgServerImpl(ck) + + // BeginBlock of block 1, and thus entering epoch 1 + ctx := helper.BeginBlock() + epoch := ek.GetEpoch(ctx) + require.Equal(t, uint64(1), epoch.EpochNumber) + + n := rand.Intn(3) + 1 + balance := rand.Int63n(100) + addrs := app.AddTestAddrs(helper.App, helper.Ctx, n, sdk.NewInt(balance)) + + // add n new validators with value more than the delegator balance via MsgWrappedCreateValidator + wcvMsgs := make([]*types.MsgWrappedCreateValidator, n) + for i := 0; i < n; i++ { + // make sure the value is more than the balance + value := sdk.NewInt(balance).Add(sdk.NewInt(rand.Int63n(100))) + msg, err := buildMsgWrappedCreateValidatorWithAmount(addrs[i], value) + require.NoError(t, err) + wcvMsgs[i] = msg + _, err = msgServer.WrappedCreateValidator(ctx, msg) + require.ErrorIs(t, err, epochingtypes.ErrInsufficientBalance) + } + }) +} + // FuzzWrappedCreateValidator tests adding new validators via // MsgWrappedCreateValidator, which first registers BLS pubkey // and then unwrapped into MsgCreateValidator and enqueued into diff --git a/x/epoching/keeper/keeper.go b/x/epoching/keeper/keeper.go index f663d54c7..ccd989113 100644 --- a/x/epoching/keeper/keeper.go +++ b/x/epoching/keeper/keeper.go @@ -3,13 +3,14 @@ package keeper import ( "fmt" - "github.com/babylonchain/babylon/x/epoching/types" "github.com/cosmos/cosmos-sdk/baseapp" "github.com/cosmos/cosmos-sdk/codec" storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" "github.com/tendermint/tendermint/libs/log" + + "github.com/babylonchain/babylon/x/epoching/types" ) type ( @@ -19,6 +20,7 @@ type ( memKey storetypes.StoreKey hooks types.EpochingHooks paramstore paramtypes.Subspace + bk types.BankKeeper stk types.StakingKeeper router *baseapp.MsgServiceRouter } @@ -29,6 +31,7 @@ func NewKeeper( storeKey, memKey storetypes.StoreKey, ps paramtypes.Subspace, + bk types.BankKeeper, stk types.StakingKeeper, ) Keeper { // set KeyTable if it has not already been set @@ -42,6 +45,7 @@ func NewKeeper( memKey: memKey, paramstore: ps, hooks: nil, + bk: bk, stk: stk, } } diff --git a/x/epoching/keeper/staking_functions.go b/x/epoching/keeper/staking_functions.go index 6443c521c..ad03c20fa 100644 --- a/x/epoching/keeper/staking_functions.go +++ b/x/epoching/keeper/staking_functions.go @@ -5,9 +5,11 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" + + "github.com/babylonchain/babylon/x/epoching/types" ) -// CheckMsgCreateValidator performs stateless checks on a given `MsgCreateValidator` message +// CheckMsgCreateValidator performs checks on a given `MsgCreateValidator` message // The checkpointing module will use this function to verify the `MsgCreateValidator` message // inside a `MsgWrappedCreateValidator` message. // (adapted from https://github.com/cosmos/cosmos-sdk/blob/v0.46.10/x/staking/keeper/msg_server.go#L34-L108) @@ -89,9 +91,15 @@ func (k Keeper) CheckMsgCreateValidator(ctx sdk.Context, msg *stakingtypes.MsgCr } // sanity check on delegator address - if _, err := sdk.AccAddressFromBech32(msg.DelegatorAddress); err != nil { + delegatorAddr, err := sdk.AccAddressFromBech32(msg.DelegatorAddress) + if err != nil { return err } + balance := k.bk.GetBalance(ctx, delegatorAddr, msg.Value.GetDenom()) + if msg.Value.IsGTE(balance) { + return types.ErrInsufficientBalance + } + return nil } diff --git a/x/epoching/types/errors.go b/x/epoching/types/errors.go index a2fc6a004..2798ac410 100644 --- a/x/epoching/types/errors.go +++ b/x/epoching/types/errors.go @@ -21,4 +21,5 @@ var ( ErrZeroEpochMsg = sdkerrors.Register(ModuleName, 11, "the 0-th epoch does not handle messages") ErrInvalidEpoch = sdkerrors.Register(ModuleName, 12, "the epoch is invalid") ErrInvalidHeight = sdkerrors.Register(ModuleName, 13, "the height is invalid") + ErrInsufficientBalance = sdkerrors.Register(ModuleName, 14, "the delegator has insufficient balance to perform delegate") ) From f32db3a1f26cf85a9066a9b14c4e8205d1aea4a3 Mon Sep 17 00:00:00 2001 From: KonradStaniec Date: Fri, 3 Mar 2023 08:06:09 +0100 Subject: [PATCH 11/59] Use cosmos v47 (#320) - Bump cosmos to v47 --- .circleci/config.yml | 9 +- Makefile | 14 +- app/app.go | 278 +++---- app/app_test.go | 22 +- app/export.go | 8 +- app/modules.go | 4 +- app/params/config.go | 7 +- app/params/params.go | 1 + app/test_helpers.go | 68 +- app/types.go | 2 +- client/docs/swagger-ui/swagger.yaml | 136 ++-- cmd/babylond/cmd/add_gen_bls.go | 5 +- cmd/babylond/cmd/add_gen_bls_test.go | 11 +- cmd/babylond/cmd/genesis.go | 4 +- cmd/babylond/cmd/root.go | 29 +- cmd/babylond/cmd/testnet.go | 10 +- cmd/babylond/cmd/validate_genesis.go | 8 +- cmd/babylond/cmd/validate_genesis_test.go | 5 +- contrib/images/babylond-env/Dockerfile | 2 +- go.mod | 132 ++-- go.sum | 685 ++++-------------- privval/file.go | 2 + simapp/sim_bench_test.go | 39 +- simapp/sim_test.go | 38 +- simapp/state.go | 4 +- simapp/utils.go | 17 +- test/e2e/configurer/base.go | 4 +- test/e2e/configurer/setup.go | 4 +- test/e2e/containers/config.go | 6 +- test/e2e/initialization/node.go | 3 + test/e2e/scripts/hermes_bootstrap.sh | 14 +- testutil/datagen/btc_header_info.go | 8 +- testutil/datagen/btc_transaction.go | 2 +- testutil/datagen/tendermint.go | 2 +- testutil/keeper/zoneconcierge.go | 4 +- types/btcutils.go | 2 +- x/btccheckpoint/handler.go | 3 +- x/btccheckpoint/module.go | 10 - x/btccheckpoint/module_simulation.go | 12 +- x/btccheckpoint/types/btccheckpoint.pb.go | 16 +- x/btccheckpoint/types/btcutils.go | 2 +- x/btccheckpoint/types/errors.go | 16 +- x/btccheckpoint/types/genesis.pb.go | 2 +- x/btccheckpoint/types/params.pb.go | 2 +- x/btccheckpoint/types/query.pb.go | 4 +- x/btccheckpoint/types/tx.pb.go | 4 +- x/btclightclient/handler.go | 3 +- x/btclightclient/keeper/keeper_test.go | 23 +- x/btclightclient/keeper/msg_server.go | 2 +- x/btclightclient/keeper/state.go | 16 +- x/btclightclient/module.go | 10 - x/btclightclient/module_simulation.go | 12 +- x/btclightclient/types/btc_header_info.go | 4 +- x/btclightclient/types/btclightclient.pb.go | 2 +- x/btclightclient/types/errors.go | 14 +- x/btclightclient/types/event.pb.go | 2 +- x/btclightclient/types/genesis.pb.go | 2 +- x/btclightclient/types/msgs_test.go | 2 +- x/btclightclient/types/params.pb.go | 2 +- x/btclightclient/types/query.pb.go | 4 +- x/btclightclient/types/tx.pb.go | 4 +- x/checkpointing/client/cli/tx_test.go | 4 +- x/checkpointing/client/cli/utils.go | 4 +- x/checkpointing/handler.go | 3 +- x/checkpointing/module.go | 10 - x/checkpointing/module_simulation.go | 12 +- x/checkpointing/testckpt/helper.go | 2 +- x/checkpointing/types/bls_key.pb.go | 2 +- x/checkpointing/types/checkpoint.pb.go | 10 +- x/checkpointing/types/errors.go | 30 +- x/checkpointing/types/events.pb.go | 2 +- x/checkpointing/types/genesis.pb.go | 2 +- x/checkpointing/types/params.pb.go | 2 +- x/checkpointing/types/query.pb.go | 4 +- x/checkpointing/types/tx.pb.go | 4 +- x/epoching/handler.go | 3 +- x/epoching/keeper/apphash_chain.go | 8 +- x/epoching/keeper/epoch_msg_queue.go | 8 +- x/epoching/keeper/epoch_msg_queue_test.go | 11 +- x/epoching/keeper/epoch_slashed_val_set.go | 12 +- x/epoching/keeper/epoch_val_set.go | 12 +- x/epoching/keeper/epochs.go | 4 +- x/epoching/keeper/grpc_query.go | 5 +- x/epoching/keeper/hooks.go | 4 + x/epoching/keeper/msg_server.go | 7 +- x/epoching/keeper/staking_functions.go | 9 +- x/epoching/module.go | 10 - x/epoching/module_simulation.go | 11 +- x/epoching/simulation/decoder.go | 10 +- x/epoching/simulation/operations.go | 10 +- x/epoching/simulation/params.go | 21 - x/epoching/simulation/params_test.go | 37 - x/epoching/testepoching/helper.go | 4 +- x/epoching/types/epoching.go | 4 +- x/epoching/types/epoching.pb.go | 22 +- x/epoching/types/errors.go | 30 +- x/epoching/types/events.pb.go | 2 +- x/epoching/types/genesis.pb.go | 2 +- x/epoching/types/params.pb.go | 2 +- x/epoching/types/query.pb.go | 4 +- x/epoching/types/tx.pb.go | 4 +- x/monitor/handler.go | 3 +- x/monitor/module.go | 10 - x/monitor/module_simulation.go | 12 +- x/monitor/types/errors.go | 6 +- x/monitor/types/genesis.pb.go | 2 +- x/monitor/types/params.pb.go | 2 +- x/monitor/types/query.pb.go | 4 +- x/zoneconcierge/keeper/chain_info_indexer.go | 10 +- .../keeper/epoch_chain_info_indexer_test.go | 2 +- x/zoneconcierge/keeper/grpc_query_test.go | 2 +- x/zoneconcierge/keeper/hooks.go | 8 +- x/zoneconcierge/keeper/ibc_packet.go | 37 +- x/zoneconcierge/keeper/keeper.go | 7 +- x/zoneconcierge/keeper/keeper_test.go | 4 +- x/zoneconcierge/keeper/proof_epoch_sealed.go | 6 +- .../keeper/proof_tx_in_block_test.go | 3 +- x/zoneconcierge/module.go | 10 +- x/zoneconcierge/module_ibc.go | 27 +- x/zoneconcierge/module_ibc_packet_test.go | 4 +- x/zoneconcierge/module_simulation.go | 13 +- x/zoneconcierge/module_test.go | 30 +- x/zoneconcierge/types/errors.go | 32 +- x/zoneconcierge/types/expected_keepers.go | 18 +- x/zoneconcierge/types/genesis.go | 2 +- x/zoneconcierge/types/genesis.pb.go | 2 +- x/zoneconcierge/types/mocked_keepers.go | 6 +- x/zoneconcierge/types/packet.pb.go | 3 +- x/zoneconcierge/types/params.pb.go | 2 +- x/zoneconcierge/types/query.pb.go | 4 +- x/zoneconcierge/types/tx.pb.go | 4 +- x/zoneconcierge/types/zoneconcierge.pb.go | 8 +- 132 files changed, 984 insertions(+), 1408 deletions(-) delete mode 100644 x/epoching/simulation/params.go delete mode 100644 x/epoching/simulation/params_test.go diff --git a/.circleci/config.yml b/.circleci/config.yml index ee3bc7769..1dc98b5c2 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -45,10 +45,11 @@ jobs: make localnet-stop # TODO: If CI tests will take to long consider having only this e2e test # instead of separate integration tests and e2e tests. - - run: - name: Run e2e tests - command: | - make test-e2e + # TODO: re-enable e2e test after bumping heremes releyer + # - run: + # name: Run e2e tests + # command: | + # make test-e2e # Invoke jobs via workflows diff --git a/Makefile b/Makefile index 00efc4f0d..519380e21 100644 --- a/Makefile +++ b/Makefile @@ -351,23 +351,19 @@ devdoc-update: ### Protobuf ### ############################################################################### -containerProtoVer=v0.7 -containerProtoImage=tendermintdev/sdk-proto-gen:$(containerProtoVer) -containerProtoGen=babylon-sdk-proto-gen-$(containerProtoVer) -containerProtoGenSwagger=cosmos-sdk-proto-gen-swagger-$(containerProtoVer) -containerProtoFmt=babylon-sdk-proto-fmt-$(containerProtoVer) +protoVer=0.11.5 +protoImageName=ghcr.io/cosmos/proto-builder:$(protoVer) +protoImage=$(DOCKER) run --rm -v $(CURDIR):/workspace --workdir /workspace $(protoImageName) proto-all: proto-gen proto-swagger-gen proto-gen: @echo "Generating Protobuf files" - @if docker ps -a --format '{{.Names}}' | grep -Eq "^${containerProtoGen}$$"; then docker start -a $(containerProtoGen); else docker run --name $(containerProtoGen) -v $(CURDIR):/workspace --workdir /workspace $(containerProtoImage) \ - sh ./proto/scripts/protocgen.sh; fi + @$(protoImage) sh ./proto/scripts/protocgen.sh proto-swagger-gen: @echo "Generating Protobuf Swagger" - @if docker ps -a --format '{{.Names}}' | grep -Eq "^${containerProtoGenSwagger}$$"; then docker start -a $(containerProtoGenSwagger); else docker run --name $(containerProtoGenSwagger) -v $(CURDIR):/workspace --workdir /workspace $(containerProtoImage) \ - sh ./proto/scripts/protoc-swagger-gen.sh; fi + @$(protoImage) sh ./proto/scripts/protoc-swagger-gen.sh .PHONY: proto-gen proto-swagger-gen diff --git a/app/app.go b/app/app.go index c817a4ba1..03b4886e3 100644 --- a/app/app.go +++ b/app/app.go @@ -8,8 +8,19 @@ import ( "os" "path/filepath" + autocliv1 "cosmossdk.io/api/cosmos/autocli/v1" + reflectionv1 "cosmossdk.io/api/cosmos/reflection/v1" + nodeservice "github.com/cosmos/cosmos-sdk/client/grpc/node" + bbn "github.com/babylonchain/babylon/types" + runtimeservices "github.com/cosmos/cosmos-sdk/runtime/services" + consensusparamkeeper "github.com/cosmos/cosmos-sdk/x/consensus/keeper" + consensusparamtypes "github.com/cosmos/cosmos-sdk/x/consensus/types" + ibcclient "github.com/cosmos/ibc-go/v7/modules/core/02-client" + ibcclienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" + + ibcclientclient "github.com/cosmos/ibc-go/v7/modules/core/02-client/client" "github.com/gorilla/mux" "github.com/rakyll/statik/fs" "github.com/spf13/cast" @@ -18,8 +29,7 @@ import ( tmos "github.com/tendermint/tendermint/libs/os" dbm "github.com/tendermint/tm-db" - bbn "github.com/babylonchain/babylon/types" - + errorsmod "cosmossdk.io/errors" "github.com/cosmos/cosmos-sdk/baseapp" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/grpc/tmservice" @@ -54,7 +64,6 @@ import ( crisiskeeper "github.com/cosmos/cosmos-sdk/x/crisis/keeper" crisistypes "github.com/cosmos/cosmos-sdk/x/crisis/types" distr "github.com/cosmos/cosmos-sdk/x/distribution" - distrclient "github.com/cosmos/cosmos-sdk/x/distribution/client" distrkeeper "github.com/cosmos/cosmos-sdk/x/distribution/keeper" distrtypes "github.com/cosmos/cosmos-sdk/x/distribution/types" "github.com/cosmos/cosmos-sdk/x/evidence" @@ -113,19 +122,20 @@ import ( monitorkeeper "github.com/babylonchain/babylon/x/monitor/keeper" monitortypes "github.com/babylonchain/babylon/x/monitor/types" - "github.com/cosmos/ibc-go/v5/modules/apps/transfer" - ibctransferkeeper "github.com/cosmos/ibc-go/v5/modules/apps/transfer/keeper" - ibctransfertypes "github.com/cosmos/ibc-go/v5/modules/apps/transfer/types" - ibc "github.com/cosmos/ibc-go/v5/modules/core" - ibcclientkeeper "github.com/cosmos/ibc-go/v5/modules/core/02-client/keeper" - porttypes "github.com/cosmos/ibc-go/v5/modules/core/05-port/types" - ibchost "github.com/cosmos/ibc-go/v5/modules/core/24-host" // ibc module puts types under `ibchost` rather than `ibctypes` - ibckeeper "github.com/cosmos/ibc-go/v5/modules/core/keeper" + "github.com/cosmos/ibc-go/v7/modules/apps/transfer" + ibctransferkeeper "github.com/cosmos/ibc-go/v7/modules/apps/transfer/keeper" + ibctransfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" + ibc "github.com/cosmos/ibc-go/v7/modules/core" + ibcclientkeeper "github.com/cosmos/ibc-go/v7/modules/core/02-client/keeper" + porttypes "github.com/cosmos/ibc-go/v7/modules/core/05-port/types" // ibc module puts types under `ibchost` rather than `ibctypes` + ibcexported "github.com/cosmos/ibc-go/v7/modules/core/exported" + ibckeeper "github.com/cosmos/ibc-go/v7/modules/core/keeper" // IBC-related "github.com/babylonchain/babylon/x/zoneconcierge" zckeeper "github.com/babylonchain/babylon/x/zoneconcierge/keeper" zctypes "github.com/babylonchain/babylon/x/zoneconcierge/types" + ibctm "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" ) const ( @@ -140,20 +150,25 @@ const ( var ( // DefaultNodeHome default home directories for the application daemon DefaultNodeHome string - // ModuleBasics defines the module BasicManager is in charge of setting up basic, // non-dependant module elements, such as codec registration // and genesis verification. ModuleBasics = module.NewBasicManager( auth.AppModuleBasic{}, - genutil.AppModuleBasic{}, + genutil.NewAppModuleBasic(genutiltypes.DefaultMessageValidator), bank.AppModuleBasic{}, capability.AppModuleBasic{}, staking.AppModuleBasic{}, mint.AppModuleBasic{}, distr.AppModuleBasic{}, gov.NewAppModuleBasic( - []govclient.ProposalHandler{paramsclient.ProposalHandler, distrclient.ProposalHandler, upgradeclient.LegacyProposalHandler, upgradeclient.LegacyCancelProposalHandler}, + []govclient.ProposalHandler{ + paramsclient.ProposalHandler, + upgradeclient.LegacyProposalHandler, + upgradeclient.LegacyCancelProposalHandler, + ibcclientclient.UpdateClientProposalHandler, + ibcclientclient.UpgradeProposalHandler, + }, ), params.AppModuleBasic{}, crisis.AppModuleBasic{}, @@ -173,6 +188,7 @@ var ( // IBC-related ibc.AppModuleBasic{}, + ibctm.AppModuleBasic{}, transfer.AppModuleBasic{}, zoneconcierge.AppModuleBasic{}, ) @@ -201,8 +217,10 @@ var ( // capabilities aren't needed for testing. type BabylonApp struct { *baseapp.BaseApp - legacyAmino *codec.LegacyAmino - appCodec codec.Codec + legacyAmino *codec.LegacyAmino + appCodec codec.Codec + txConfig client.TxConfig + interfaceRegistry types.InterfaceRegistry invCheckPeriod uint @@ -213,20 +231,21 @@ type BabylonApp struct { memKeys map[string]*storetypes.MemoryStoreKey // keepers - AccountKeeper authkeeper.AccountKeeper - BankKeeper bankkeeper.Keeper - CapabilityKeeper *capabilitykeeper.Keeper - StakingKeeper stakingkeeper.Keeper - SlashingKeeper slashingkeeper.Keeper - MintKeeper mintkeeper.Keeper - DistrKeeper distrkeeper.Keeper - GovKeeper govkeeper.Keeper - CrisisKeeper crisiskeeper.Keeper - UpgradeKeeper upgradekeeper.Keeper - ParamsKeeper paramskeeper.Keeper - AuthzKeeper authzkeeper.Keeper - EvidenceKeeper evidencekeeper.Keeper - FeeGrantKeeper feegrantkeeper.Keeper + AccountKeeper authkeeper.AccountKeeper + BankKeeper bankkeeper.Keeper + CapabilityKeeper *capabilitykeeper.Keeper + StakingKeeper *stakingkeeper.Keeper + SlashingKeeper slashingkeeper.Keeper + MintKeeper mintkeeper.Keeper + DistrKeeper distrkeeper.Keeper + GovKeeper govkeeper.Keeper + CrisisKeeper *crisiskeeper.Keeper + UpgradeKeeper *upgradekeeper.Keeper + ParamsKeeper paramskeeper.Keeper + AuthzKeeper authzkeeper.Keeper + EvidenceKeeper evidencekeeper.Keeper + FeeGrantKeeper feegrantkeeper.Keeper + ConsensusParamsKeeper consensusparamkeeper.Keeper // Babylon modules EpochingKeeper epochingkeeper.Keeper @@ -279,16 +298,17 @@ func NewBabylonApp( appCodec := encodingConfig.Marshaler legacyAmino := encodingConfig.Amino interfaceRegistry := encodingConfig.InterfaceRegistry - - bApp := baseapp.NewBaseApp(appName, logger, db, encodingConfig.TxConfig.TxDecoder(), baseAppOptions...) + txConfig := encodingConfig.TxConfig + bApp := baseapp.NewBaseApp(appName, logger, db, txConfig.TxDecoder(), baseAppOptions...) bApp.SetCommitMultiStoreTracer(traceStore) bApp.SetVersion(version.Version) bApp.SetInterfaceRegistry(interfaceRegistry) + bApp.SetTxEncoder(txConfig.TxEncoder()) keys := sdk.NewKVStoreKeys( - authtypes.StoreKey, banktypes.StoreKey, stakingtypes.StoreKey, + authtypes.StoreKey, banktypes.StoreKey, stakingtypes.StoreKey, crisistypes.StoreKey, minttypes.StoreKey, distrtypes.StoreKey, slashingtypes.StoreKey, - govtypes.StoreKey, paramstypes.StoreKey, upgradetypes.StoreKey, feegrant.StoreKey, + govtypes.StoreKey, paramstypes.StoreKey, consensusparamtypes.StoreKey, upgradetypes.StoreKey, feegrant.StoreKey, evidencetypes.StoreKey, capabilitytypes.StoreKey, authzkeeper.StoreKey, // Babylon modules @@ -298,7 +318,7 @@ func NewBabylonApp( checkpointingtypes.StoreKey, monitortypes.StoreKey, // IBC-related modules - ibchost.StoreKey, + ibcexported.StoreKey, ibctransfertypes.StoreKey, zctypes.StoreKey, ) @@ -312,6 +332,7 @@ func NewBabylonApp( BaseApp: bApp, legacyAmino: legacyAmino, appCodec: appCodec, + txConfig: txConfig, interfaceRegistry: interfaceRegistry, invCheckPeriod: invCheckPeriod, keys: keys, @@ -321,13 +342,13 @@ func NewBabylonApp( app.ParamsKeeper = initParamsKeeper(appCodec, legacyAmino, keys[paramstypes.StoreKey], tkeys[paramstypes.TStoreKey]) - // set the BaseApp's parameter store - bApp.SetParamStore(app.ParamsKeeper.Subspace(baseapp.Paramspace).WithKeyTable(paramstypes.ConsensusParamsKeyTable())) + app.ConsensusParamsKeeper = consensusparamkeeper.NewKeeper(appCodec, keys[consensusparamtypes.StoreKey], authtypes.NewModuleAddress(govtypes.ModuleName).String()) + bApp.SetParamStore(&app.ConsensusParamsKeeper) app.CapabilityKeeper = capabilitykeeper.NewKeeper(appCodec, keys[capabilitytypes.StoreKey], memKeys[capabilitytypes.MemStoreKey]) // grant capabilities for the ibc and ibc-transfer modules - scopedIBCKeeper := app.CapabilityKeeper.ScopeToModule(ibchost.ModuleName) + scopedIBCKeeper := app.CapabilityKeeper.ScopeToModule(ibcexported.ModuleName) scopedTransferKeeper := app.CapabilityKeeper.ScopeToModule(ibctransfertypes.ModuleName) scopedZoneConciergeKeeper := app.CapabilityKeeper.ScopeToModule(zctypes.ModuleName) @@ -338,48 +359,57 @@ func NewBabylonApp( // TODO: Grant capabilities for the ibc and ibc-transfer modules // add keepers - app.AccountKeeper = authkeeper.NewAccountKeeper( - appCodec, keys[authtypes.StoreKey], app.GetSubspace(authtypes.ModuleName), authtypes.ProtoBaseAccount, maccPerms, appparams.Bech32PrefixAccAddr, - ) + app.AccountKeeper = authkeeper.NewAccountKeeper(appCodec, keys[authtypes.StoreKey], authtypes.ProtoBaseAccount, maccPerms, appparams.Bech32PrefixAccAddr, authtypes.NewModuleAddress(govtypes.ModuleName).String()) + app.BankKeeper = bankkeeper.NewBaseKeeper( - appCodec, keys[banktypes.StoreKey], app.AccountKeeper, app.GetSubspace(banktypes.ModuleName), app.ModuleAccountAddrs(), + appCodec, + keys[banktypes.StoreKey], + app.AccountKeeper, + BlockedAddresses(), + authtypes.NewModuleAddress(govtypes.ModuleName).String(), ) - stakingKeeper := stakingkeeper.NewKeeper( - appCodec, keys[stakingtypes.StoreKey], app.AccountKeeper, app.BankKeeper, app.GetSubspace(stakingtypes.ModuleName), + + app.StakingKeeper = stakingkeeper.NewKeeper( + appCodec, keys[stakingtypes.StoreKey], app.AccountKeeper, app.BankKeeper, authtypes.NewModuleAddress(govtypes.ModuleName).String(), ) // NOTE: the epoching module has to be set before the chekpointing module, as the checkpointing module will have access to the epoching module epochingKeeper := epochingkeeper.NewKeeper( - appCodec, keys[epochingtypes.StoreKey], keys[epochingtypes.StoreKey], app.GetSubspace(epochingtypes.ModuleName), app.BankKeeper, &app.StakingKeeper, + appCodec, keys[epochingtypes.StoreKey], keys[epochingtypes.StoreKey], app.GetSubspace(epochingtypes.ModuleName), app.BankKeeper, app.StakingKeeper, ) - app.MintKeeper = mintkeeper.NewKeeper( - appCodec, keys[minttypes.StoreKey], app.GetSubspace(minttypes.ModuleName), &stakingKeeper, - app.AccountKeeper, app.BankKeeper, authtypes.FeeCollectorName, - ) - app.DistrKeeper = distrkeeper.NewKeeper( - appCodec, keys[distrtypes.StoreKey], app.GetSubspace(distrtypes.ModuleName), app.AccountKeeper, app.BankKeeper, - &stakingKeeper, authtypes.FeeCollectorName, - ) + app.MintKeeper = mintkeeper.NewKeeper(appCodec, keys[minttypes.StoreKey], app.StakingKeeper, app.AccountKeeper, app.BankKeeper, authtypes.FeeCollectorName, authtypes.NewModuleAddress(govtypes.ModuleName).String()) + + app.DistrKeeper = distrkeeper.NewKeeper(appCodec, keys[distrtypes.StoreKey], app.AccountKeeper, app.BankKeeper, app.StakingKeeper, authtypes.FeeCollectorName, authtypes.NewModuleAddress(govtypes.ModuleName).String()) + app.SlashingKeeper = slashingkeeper.NewKeeper( - appCodec, keys[slashingtypes.StoreKey], &stakingKeeper, app.GetSubspace(slashingtypes.ModuleName), - ) - app.CrisisKeeper = crisiskeeper.NewKeeper( - app.GetSubspace(crisistypes.ModuleName), invCheckPeriod, app.BankKeeper, authtypes.FeeCollectorName, + appCodec, legacyAmino, keys[slashingtypes.StoreKey], app.StakingKeeper, authtypes.NewModuleAddress(govtypes.ModuleName).String(), ) + app.CrisisKeeper = crisiskeeper.NewKeeper(appCodec, keys[crisistypes.StoreKey], invCheckPeriod, + app.BankKeeper, authtypes.FeeCollectorName, authtypes.NewModuleAddress(govtypes.ModuleName).String()) + app.FeeGrantKeeper = feegrantkeeper.NewKeeper(appCodec, keys[feegrant.StoreKey], app.AccountKeeper) // set the governance module account as the authority for conducting upgrades app.UpgradeKeeper = upgradekeeper.NewKeeper(skipUpgradeHeights, keys[upgradetypes.StoreKey], appCodec, homePath, app.BaseApp, authtypes.NewModuleAddress(govtypes.ModuleName).String()) // register the staking hooks // NOTE: stakingKeeper above is passed by reference, so that it will contain these hooks - app.StakingKeeper = *stakingKeeper.SetHooks( + app.StakingKeeper.SetHooks( stakingtypes.NewMultiStakingHooks(app.DistrKeeper.Hooks(), app.SlashingKeeper.Hooks(), epochingKeeper.Hooks()), ) app.AuthzKeeper = authzkeeper.NewKeeper(keys[authzkeeper.StoreKey], appCodec, app.MsgServiceRouter(), app.AccountKeeper) + app.IBCKeeper = ibckeeper.NewKeeper( + appCodec, + keys[ibcexported.StoreKey], + app.GetSubspace(ibcexported.ModuleName), + app.StakingKeeper, + app.UpgradeKeeper, + scopedIBCKeeper, + ) + // ... other modules keepers // TODO: Create IBC keeper @@ -391,8 +421,9 @@ func NewBabylonApp( govRouter := govv1beta1.NewRouter() govRouter.AddRoute(govtypes.RouterKey, govv1beta1.ProposalHandler). AddRoute(paramproposal.RouterKey, params.NewParamChangeProposalHandler(app.ParamsKeeper)). - AddRoute(distrtypes.RouterKey, distr.NewCommunityPoolSpendProposalHandler(app.DistrKeeper)). - AddRoute(upgradetypes.RouterKey, upgrade.NewSoftwareUpgradeProposalHandler(app.UpgradeKeeper)) + AddRoute(upgradetypes.RouterKey, upgrade.NewSoftwareUpgradeProposalHandler(app.UpgradeKeeper)). + AddRoute(ibcclienttypes.RouterKey, ibcclient.NewClientProposalHandler(app.IBCKeeper.ClientKeeper)) + govConfig := govtypes.DefaultConfig() /* @@ -400,8 +431,8 @@ func NewBabylonApp( govConfig.MaxMetadataLen = 10000 */ govKeeper := govkeeper.NewKeeper( - appCodec, keys[govtypes.StoreKey], app.GetSubspace(govtypes.ModuleName), app.AccountKeeper, app.BankKeeper, - &stakingKeeper, govRouter, app.MsgServiceRouter(), govConfig, + appCodec, keys[govtypes.StoreKey], app.AccountKeeper, app.BankKeeper, + app.StakingKeeper, app.MsgServiceRouter(), govConfig, authtypes.NewModuleAddress(govtypes.ModuleName).String(), ) app.GovKeeper = *govKeeper.SetHooks( @@ -410,16 +441,6 @@ func NewBabylonApp( ), ) - // Keepers for IBC-related modules - ibcKeeper := ibckeeper.NewKeeper( - appCodec, - keys[ibchost.StoreKey], - app.GetSubspace(ibchost.ModuleName), - app.StakingKeeper, - app.UpgradeKeeper, - scopedIBCKeeper, - ) - // create Tendermint client tmClient, err := client.NewClientFromNode(privSigner.ClientCtx.NodeURI) // create a Tendermint client for ZoneConcierge if err != nil { @@ -428,16 +449,16 @@ func NewBabylonApp( // create querier for KVStore storeQuerier, ok := app.CommitMultiStore().(sdk.Queryable) if !ok { - panic(sdkerrors.Wrap(sdkerrors.ErrUnknownRequest, "multistore doesn't support queries")) + panic(errorsmod.Wrap(sdkerrors.ErrUnknownRequest, "multistore doesn't support queries")) } zcKeeper := zckeeper.NewKeeper( appCodec, keys[zctypes.StoreKey], keys[zctypes.MemStoreKey], app.GetSubspace(zctypes.ModuleName), - ibcKeeper.ChannelKeeper, - ibcKeeper.ChannelKeeper, - &ibcKeeper.PortKeeper, + app.IBCKeeper.ChannelKeeper, + app.IBCKeeper.ChannelKeeper, + &app.IBCKeeper.PortKeeper, app.AccountKeeper, app.BankKeeper, nil, // CheckpointingKeeper is set later (TODO: figure out a proper way for this) @@ -449,15 +470,13 @@ func NewBabylonApp( ) // replace IBC keeper's client keeper with our ExtendedKeeper - extendedClientKeeper := ibcclientkeeper.NewExtendedKeeper(appCodec, keys[ibchost.StoreKey], app.GetSubspace(ibchost.ModuleName), stakingKeeper, app.UpgradeKeeper) + extendedClientKeeper := ibcclientkeeper.NewExtendedKeeper(appCodec, keys[ibcexported.StoreKey], app.GetSubspace(ibcexported.ModuleName), app.StakingKeeper, app.UpgradeKeeper) // make zcKeeper to hooks onto extendedClientKeeper so that zcKeeper can receive notifications of new headers extendedClientKeeper = *extendedClientKeeper.SetHooks( ibcclientkeeper.NewMultiClientHooks(zcKeeper.Hooks()), ) - ibcKeeper.ClientKeeper = extendedClientKeeper + app.IBCKeeper.ClientKeeper = extendedClientKeeper - // set IBC keeper and ZC keeper for app - app.IBCKeeper = ibcKeeper app.ZoneConciergeKeeper = *zcKeeper // Create Transfer Keepers @@ -541,7 +560,7 @@ func NewBabylonApp( // create evidence keeper with router evidenceKeeper := evidencekeeper.NewKeeper( - appCodec, keys[evidencetypes.StoreKey], &app.StakingKeeper, app.SlashingKeeper, + appCodec, keys[evidencetypes.StoreKey], app.StakingKeeper, app.SlashingKeeper, ) // If evidence needs to be handled for the app, set routes in router here and seal app.EvidenceKeeper = *evidenceKeeper @@ -559,17 +578,17 @@ func NewBabylonApp( app.AccountKeeper, app.StakingKeeper, app.BaseApp.DeliverTx, encodingConfig.TxConfig, ), - auth.NewAppModule(appCodec, app.AccountKeeper, authsims.RandomGenesisAccounts), + auth.NewAppModule(appCodec, app.AccountKeeper, authsims.RandomGenesisAccounts, app.GetSubspace(authtypes.ModuleName)), vesting.NewAppModule(app.AccountKeeper, app.BankKeeper), - bank.NewAppModule(appCodec, app.BankKeeper, app.AccountKeeper), - capability.NewAppModule(appCodec, *app.CapabilityKeeper), - crisis.NewAppModule(&app.CrisisKeeper, skipGenesisInvariants), + bank.NewAppModule(appCodec, app.BankKeeper, app.AccountKeeper, app.GetSubspace(banktypes.ModuleName)), + capability.NewAppModule(appCodec, *app.CapabilityKeeper, false), + crisis.NewAppModule(app.CrisisKeeper, skipGenesisInvariants, app.GetSubspace(crisistypes.ModuleName)), feegrantmodule.NewAppModule(appCodec, app.AccountKeeper, app.BankKeeper, app.FeeGrantKeeper, app.interfaceRegistry), - gov.NewAppModule(appCodec, app.GovKeeper, app.AccountKeeper, app.BankKeeper), - mint.NewAppModule(appCodec, app.MintKeeper, app.AccountKeeper, nil), - slashing.NewAppModule(appCodec, app.SlashingKeeper, app.AccountKeeper, app.BankKeeper, app.StakingKeeper), - distr.NewAppModule(appCodec, app.DistrKeeper, app.AccountKeeper, app.BankKeeper, app.StakingKeeper), - staking.NewAppModule(appCodec, app.StakingKeeper, app.AccountKeeper, app.BankKeeper), + gov.NewAppModule(appCodec, &app.GovKeeper, app.AccountKeeper, app.BankKeeper, app.GetSubspace(govtypes.ModuleName)), + mint.NewAppModule(appCodec, app.MintKeeper, app.AccountKeeper, nil, app.GetSubspace(minttypes.ModuleName)), + slashing.NewAppModule(appCodec, app.SlashingKeeper, app.AccountKeeper, app.BankKeeper, app.StakingKeeper, app.GetSubspace(slashingtypes.ModuleName)), + distr.NewAppModule(appCodec, app.DistrKeeper, app.AccountKeeper, app.BankKeeper, app.StakingKeeper, app.GetSubspace(distrtypes.ModuleName)), + staking.NewAppModule(appCodec, app.StakingKeeper, app.AccountKeeper, app.BankKeeper, app.GetSubspace(stakingtypes.ModuleName)), upgrade.NewAppModule(app.UpgradeKeeper), evidence.NewAppModule(app.EvidenceKeeper), params.NewAppModule(app.ParamsKeeper), @@ -596,7 +615,7 @@ func NewBabylonApp( evidencetypes.ModuleName, stakingtypes.ModuleName, authtypes.ModuleName, banktypes.ModuleName, govtypes.ModuleName, crisistypes.ModuleName, genutiltypes.ModuleName, authz.ModuleName, feegrant.ModuleName, - paramstypes.ModuleName, vestingtypes.ModuleName, + paramstypes.ModuleName, vestingtypes.ModuleName, consensusparamtypes.ModuleName, // Babylon modules epochingtypes.ModuleName, btclightclienttypes.ModuleName, @@ -604,7 +623,7 @@ func NewBabylonApp( checkpointingtypes.ModuleName, monitortypes.ModuleName, // IBC-related modules - ibchost.ModuleName, + ibcexported.ModuleName, ibctransfertypes.ModuleName, zctypes.ModuleName, ) @@ -619,7 +638,7 @@ func NewBabylonApp( slashingtypes.ModuleName, minttypes.ModuleName, genutiltypes.ModuleName, evidencetypes.ModuleName, authz.ModuleName, feegrant.ModuleName, - paramstypes.ModuleName, upgradetypes.ModuleName, vestingtypes.ModuleName, + paramstypes.ModuleName, upgradetypes.ModuleName, vestingtypes.ModuleName, consensusparamtypes.ModuleName, // Babylon modules epochingtypes.ModuleName, btclightclienttypes.ModuleName, @@ -627,7 +646,7 @@ func NewBabylonApp( checkpointingtypes.ModuleName, monitortypes.ModuleName, // IBC-related modules - ibchost.ModuleName, + ibcexported.ModuleName, ibctransfertypes.ModuleName, zctypes.ModuleName, ) @@ -644,7 +663,7 @@ func NewBabylonApp( slashingtypes.ModuleName, govtypes.ModuleName, minttypes.ModuleName, crisistypes.ModuleName, genutiltypes.ModuleName, evidencetypes.ModuleName, authz.ModuleName, feegrant.ModuleName, - paramstypes.ModuleName, upgradetypes.ModuleName, vestingtypes.ModuleName, + paramstypes.ModuleName, upgradetypes.ModuleName, vestingtypes.ModuleName, consensusparamtypes.ModuleName, // Babylon modules epochingtypes.ModuleName, btclightclienttypes.ModuleName, @@ -652,7 +671,7 @@ func NewBabylonApp( checkpointingtypes.ModuleName, monitortypes.ModuleName, // IBC-related modules - ibchost.ModuleName, + ibcexported.ModuleName, ibctransfertypes.ModuleName, zctypes.ModuleName, ) @@ -660,11 +679,18 @@ func NewBabylonApp( // Uncomment if you want to set a custom migration order here. // app.mm.SetOrderMigrations(custom order) - app.mm.RegisterInvariants(&app.CrisisKeeper) - app.mm.RegisterRoutes(app.Router(), app.QueryRouter(), encodingConfig.Amino) + app.mm.RegisterInvariants(app.CrisisKeeper) app.configurator = module.NewConfigurator(app.appCodec, app.MsgServiceRouter(), app.GRPCQueryRouter()) app.mm.RegisterServices(app.configurator) + autocliv1.RegisterQueryServer(app.GRPCQueryRouter(), runtimeservices.NewAutoCLIQueryService(app.mm.Modules)) + + reflectionSvc, err := runtimeservices.NewReflectionService() + if err != nil { + panic(err) + } + reflectionv1.RegisterReflectionServiceServer(app.GRPCQueryRouter(), reflectionSvc) + // add test gRPC service for testing gRPC queries in isolation testdata.RegisterQueryServer(app.GRPCQueryRouter(), testdata.QueryImpl{}) @@ -672,30 +698,10 @@ func NewBabylonApp( // // NOTE: this is not required apps that don't use the simulator for fuzz testing // transactions - app.sm = module.NewSimulationManager( - auth.NewAppModule(appCodec, app.AccountKeeper, authsims.RandomGenesisAccounts), - bank.NewAppModule(appCodec, app.BankKeeper, app.AccountKeeper), - capability.NewAppModule(appCodec, *app.CapabilityKeeper), - feegrantmodule.NewAppModule(appCodec, app.AccountKeeper, app.BankKeeper, app.FeeGrantKeeper, app.interfaceRegistry), - gov.NewAppModule(appCodec, app.GovKeeper, app.AccountKeeper, app.BankKeeper), - mint.NewAppModule(appCodec, app.MintKeeper, app.AccountKeeper, nil), - staking.NewAppModule(appCodec, app.StakingKeeper, app.AccountKeeper, app.BankKeeper), - distr.NewAppModule(appCodec, app.DistrKeeper, app.AccountKeeper, app.BankKeeper, app.StakingKeeper), - slashing.NewAppModule(appCodec, app.SlashingKeeper, app.AccountKeeper, app.BankKeeper, app.StakingKeeper), - params.NewAppModule(app.ParamsKeeper), - evidence.NewAppModule(app.EvidenceKeeper), - authzmodule.NewAppModule(appCodec, app.AuthzKeeper, app.AccountKeeper, app.BankKeeper, app.interfaceRegistry), - // Babylon modules - epoching.NewAppModule(appCodec, app.EpochingKeeper, app.AccountKeeper, app.BankKeeper, app.StakingKeeper), - btclightclient.NewAppModule(appCodec, app.BTCLightClientKeeper, app.AccountKeeper, app.BankKeeper), - btccheckpoint.NewAppModule(appCodec, app.BtcCheckpointKeeper, app.AccountKeeper, app.BankKeeper), - checkpointing.NewAppModule(appCodec, app.CheckpointingKeeper, app.AccountKeeper, app.BankKeeper), - monitor.NewAppModule(appCodec, app.MonitorKeeper, app.AccountKeeper, app.BankKeeper), - // IBC-related modules - ibc.NewAppModule(app.IBCKeeper), - transferModule, - zoneconcierge.NewAppModule(appCodec, app.ZoneConciergeKeeper, app.AccountKeeper, app.BankKeeper), - ) + overrideModules := map[string]module.AppModuleSimulation{ + authtypes.ModuleName: auth.NewAppModule(app.appCodec, app.AccountKeeper, authsims.RandomGenesisAccounts, app.GetSubspace(authtypes.ModuleName)), + } + app.sm = module.NewSimulationManagerFromAppModules(app.ModuleManager().Modules, overrideModules) app.sm.RegisterStoreDecoders() @@ -882,10 +888,23 @@ func (app *BabylonApp) RegisterTendermintService(clientCtx client.Context) { ) } +func (app *BabylonApp) RegisterNodeService(clientCtx client.Context) { + nodeservice.RegisterNodeService(clientCtx, app.GRPCQueryRouter()) +} + func (app *BabylonApp) ModuleManager() *module.Manager { return app.mm } +// DefaultGenesis returns a default genesis from the registered AppModuleBasic's. +func (a *BabylonApp) DefaultGenesis() map[string]json.RawMessage { + return ModuleBasics.DefaultGenesis(a.appCodec) +} + +func (app *BabylonApp) TxConfig() client.TxConfig { + return app.txConfig +} + // RegisterSwaggerAPI registers swagger route with API Server func RegisterSwaggerAPI(ctx client.Context, rtr *mux.Router) { statikFS, err := fs.New() @@ -906,6 +925,19 @@ func GetMaccPerms() map[string][]string { return dupMaccPerms } +// BlockedAddresses returns all the app's blocked account addresses. +func BlockedAddresses() map[string]bool { + modAccAddrs := make(map[string]bool) + for acc := range GetMaccPerms() { + modAccAddrs[authtypes.NewModuleAddress(acc).String()] = true + } + + // allow the following addresses to receive funds + delete(modAccAddrs, authtypes.NewModuleAddress(govtypes.ModuleName).String()) + + return modAccAddrs +} + // initParamsKeeper init params keeper and its subspaces func initParamsKeeper(appCodec codec.BinaryCodec, legacyAmino *codec.LegacyAmino, key, tkey storetypes.StoreKey) paramskeeper.Keeper { paramsKeeper := paramskeeper.NewKeeper(appCodec, legacyAmino, key, tkey) @@ -925,7 +957,7 @@ func initParamsKeeper(appCodec codec.BinaryCodec, legacyAmino *codec.LegacyAmino paramsKeeper.Subspace(checkpointingtypes.ModuleName) paramsKeeper.Subspace(monitortypes.ModuleName) // IBC-related modules - paramsKeeper.Subspace(ibchost.ModuleName) + paramsKeeper.Subspace(ibcexported.ModuleName) paramsKeeper.Subspace(ibctransfertypes.ModuleName) paramsKeeper.Subspace(zctypes.ModuleName) diff --git a/app/app_test.go b/app/app_test.go index df3f279e6..8c6a9a827 100644 --- a/app/app_test.go +++ b/app/app_test.go @@ -1,9 +1,12 @@ package app import ( + "fmt" "os" "testing" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/module" "github.com/stretchr/testify/require" "github.com/tendermint/tendermint/libs/log" tmproto "github.com/tendermint/tendermint/proto/tendermint/types" @@ -25,11 +28,18 @@ func TestBabylonBlockedAddrs(t *testing.T) { AppOpts: EmptyAppOptions{}, }) - for acc := range maccPerms { + for acc := range BlockedAddresses() { + var addr sdk.AccAddress + if modAddr, err := sdk.AccAddressFromBech32(acc); err == nil { + addr = modAddr + } else { + addr = app.AccountKeeper.GetModuleAddress(acc) + } + require.True( t, - app.BankKeeper.BlockedAddr(app.AccountKeeper.GetModuleAddress(acc)), - "ensure that blocked addresses are properly set in bank keeper", + app.BankKeeper.BlockedAddr(addr), + fmt.Sprintf("ensure that blocked addresses are properly set in bank keeper: %s should be blocked", acc), ) } @@ -38,7 +48,7 @@ func TestBabylonBlockedAddrs(t *testing.T) { logger2 := log.NewTMLogger(log.NewSyncWriter(os.Stdout)) // Making a new app object with the db, so that initchain hasn't been called app2 := NewBabylonApp(logger2, db, nil, true, map[int64]bool{}, DefaultNodeHome, 0, encCfg, signer, EmptyAppOptions{}) - _, err := app2.ExportAppStateAndValidators(false, []string{}) + _, err := app2.ExportAppStateAndValidators(false, []string{}, []string{}) require.NoError(t, err, "ExportAppStateAndValidators should not have an error") } @@ -68,6 +78,8 @@ func TestUpgradeStateOnGenesis(t *testing.T) { ctx := app.NewContext(false, tmproto.Header{}) vm := app.UpgradeKeeper.GetModuleVersionMap(ctx) for v, i := range app.mm.Modules { - require.Equal(t, vm[v], i.ConsensusVersion()) + if i, ok := i.(module.HasConsensusVersion); ok { + require.Equal(t, vm[v], i.ConsensusVersion()) + } } } diff --git a/app/export.go b/app/export.go index 32ff9374b..c85c4133e 100644 --- a/app/export.go +++ b/app/export.go @@ -16,8 +16,9 @@ import ( // ExportAppStateAndValidators exports the state of the application for a genesis // file. func (app *BabylonApp) ExportAppStateAndValidators( - forZeroHeight bool, jailAllowedAddrs []string, -) (servertypes.ExportedApp, error) { + forZeroHeight bool, + jailAllowedAddrs []string, + modulesToExport []string) (servertypes.ExportedApp, error) { // as if they could withdraw from the start of the next block ctx := app.NewContext(true, tmproto.Header{Height: app.LastBlockHeight()}) @@ -29,7 +30,8 @@ func (app *BabylonApp) ExportAppStateAndValidators( app.prepForZeroHeightGenesis(ctx, jailAllowedAddrs) } - genState := app.mm.ExportGenesis(ctx, app.appCodec) + genState := app.mm.ExportGenesisForModules(ctx, app.appCodec, modulesToExport) + appState, err := json.MarshalIndent(genState, "", " ") if err != nil { return servertypes.ExportedApp{}, err diff --git a/app/modules.go b/app/modules.go index 8a9252c50..424a5179a 100644 --- a/app/modules.go +++ b/app/modules.go @@ -3,8 +3,8 @@ package app import ( "github.com/cosmos/cosmos-sdk/client" capabilitykeeper "github.com/cosmos/cosmos-sdk/x/capability/keeper" - ibckeeper "github.com/cosmos/ibc-go/v5/modules/core/keeper" - ibctestingtypes "github.com/cosmos/ibc-go/v5/testing/types" + ibckeeper "github.com/cosmos/ibc-go/v7/modules/core/keeper" + ibctestingtypes "github.com/cosmos/ibc-go/v7/testing/types" ) // The following functions are required by ibctesting diff --git a/app/params/config.go b/app/params/config.go index 3dd8ee782..7649b7066 100644 --- a/app/params/config.go +++ b/app/params/config.go @@ -3,6 +3,7 @@ package params import ( "github.com/cosmos/cosmos-sdk/types/address" + errorsmod "cosmossdk.io/errors" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" ) @@ -57,16 +58,16 @@ func SetAddressPrefixes() { // source: https://github.com/cosmos/cosmos-sdk/blob/v0.43.0-beta1/types/address.go#L141 config.SetAddressVerifier(func(bytes []byte) error { if len(bytes) == 0 { - return sdkerrors.Wrap(sdkerrors.ErrUnknownAddress, "addresses cannot be empty") + return errorsmod.Wrap(sdkerrors.ErrUnknownAddress, "addresses cannot be empty") } if len(bytes) > address.MaxAddrLen { - return sdkerrors.Wrapf(sdkerrors.ErrUnknownAddress, "address max length is %d, got %d", address.MaxAddrLen, len(bytes)) + return errorsmod.Wrapf(sdkerrors.ErrUnknownAddress, "address max length is %d, got %d", address.MaxAddrLen, len(bytes)) } // TODO: Do we want to allow addresses of lengths other than 20 and 32 bytes? if len(bytes) != 20 && len(bytes) != 32 { - return sdkerrors.Wrapf(sdkerrors.ErrUnknownAddress, "address length must be 20 or 32 bytes, got %d", len(bytes)) + return errorsmod.Wrapf(sdkerrors.ErrUnknownAddress, "address length must be 20 or 32 bytes, got %d", len(bytes)) } return nil diff --git a/app/params/params.go b/app/params/params.go index b6aa5fb55..85d61e3c1 100644 --- a/app/params/params.go +++ b/app/params/params.go @@ -4,4 +4,5 @@ package params const ( StakePerAccount = "stake_per_account" InitiallyBondedValidators = "initially_bonded_validators" + SimAppChainID = "simulation-app" ) diff --git a/app/test_helpers.go b/app/test_helpers.go index e02cf9fde..b56678112 100644 --- a/app/test_helpers.go +++ b/app/test_helpers.go @@ -17,9 +17,11 @@ import ( "github.com/babylonchain/babylon/testutil/datagen" + errorsmod "cosmossdk.io/errors" "github.com/babylonchain/babylon/app/params" appparams "github.com/babylonchain/babylon/app/params" - + txformat "github.com/babylonchain/babylon/btctxformatter" + bbn "github.com/babylonchain/babylon/types" bam "github.com/cosmos/cosmos-sdk/baseapp" "github.com/cosmos/cosmos-sdk/client" codectypes "github.com/cosmos/cosmos-sdk/codec/types" @@ -29,7 +31,7 @@ import ( sec256k1 "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" "github.com/cosmos/cosmos-sdk/server/types" - "github.com/cosmos/cosmos-sdk/simapp/helpers" + simsutils "github.com/cosmos/cosmos-sdk/testutil/sims" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/errors" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" @@ -43,30 +45,8 @@ import ( tmproto "github.com/tendermint/tendermint/proto/tendermint/types" tmtypes "github.com/tendermint/tendermint/types" dbm "github.com/tendermint/tm-db" - - txformat "github.com/babylonchain/babylon/btctxformatter" - bbn "github.com/babylonchain/babylon/types" ) -// DefaultConsensusParams defines the default Tendermint consensus params used in -// Babylon testing. -var DefaultConsensusParams = &abci.ConsensusParams{ - Block: &abci.BlockParams{ - MaxBytes: 200000, - MaxGas: 2000000, - }, - Evidence: &tmproto.EvidenceParams{ - MaxAgeNumBlocks: 302400, - MaxAgeDuration: 504 * time.Hour, // 3 weeks is the max duration - MaxBytes: 10000, - }, - Validator: &tmproto.ValidatorParams{ - PubKeyTypes: []string{ - tmtypes.ABCIPubKeyTypeEd25519, - }, - }, -} - // SetupOptions defines arguments that are passed into `Simapp` constructor. type SetupOptions struct { Logger log.Logger @@ -137,7 +117,7 @@ func NewBabyblonAppWithCustomOptions(t *testing.T, isCheckTx bool, privSigner *P app.InitChain( abci.RequestInitChain{ Validators: []abci.ValidatorUpdate{}, - ConsensusParams: DefaultConsensusParams, + ConsensusParams: simsutils.DefaultConsensusParams, AppStateBytes: stateBytes, }, ) @@ -204,7 +184,13 @@ func genesisStateWithValSet(t *testing.T, }) // update total supply - bankGenesis := banktypes.NewGenesisState(banktypes.DefaultGenesisState().Params, balances, totalSupply, []banktypes.Metadata{}) + bankGenesis := banktypes.NewGenesisState( + banktypes.DefaultGenesisState().Params, + balances, + totalSupply, + []banktypes.Metadata{}, + []banktypes.SendEnabled{}, + ) genesisState[banktypes.ModuleName] = app.AppCodec().MustMarshalJSON(bankGenesis) return genesisState @@ -311,7 +297,13 @@ func SetupWithGenesisValSet(t *testing.T, valSet *tmtypes.ValidatorSet, genAccs }) // update total supply - bankGenesis := banktypes.NewGenesisState(banktypes.DefaultGenesisState().Params, balances, totalSupply, []banktypes.Metadata{}) + bankGenesis := banktypes.NewGenesisState( + banktypes.DefaultGenesisState().Params, + balances, + totalSupply, + []banktypes.Metadata{}, + []banktypes.SendEnabled{}, + ) genesisState[banktypes.ModuleName] = app.AppCodec().MustMarshalJSON(bankGenesis) stateBytes, err := json.MarshalIndent(genesisState, "", " ") @@ -321,7 +313,7 @@ func SetupWithGenesisValSet(t *testing.T, valSet *tmtypes.ValidatorSet, genAccs app.InitChain( abci.RequestInitChain{ Validators: []abci.ValidatorUpdate{}, - ConsensusParams: DefaultConsensusParams, + ConsensusParams: simsutils.DefaultConsensusParams, AppStateBytes: stateBytes, }, ) @@ -341,7 +333,13 @@ func SetupWithGenesisAccounts(genAccs []authtypes.GenesisAccount, balances ...ba totalSupply = totalSupply.Add(b.Coins...) } - bankGenesis := banktypes.NewGenesisState(banktypes.DefaultGenesisState().Params, balances, totalSupply, []banktypes.Metadata{}) + bankGenesis := banktypes.NewGenesisState( + banktypes.DefaultGenesisState().Params, + balances, + totalSupply, + []banktypes.Metadata{}, + []banktypes.SendEnabled{}, + ) genesisState[banktypes.ModuleName] = app.AppCodec().MustMarshalJSON(bankGenesis) stateBytes, err := json.MarshalIndent(genesisState, "", " ") @@ -352,7 +350,7 @@ func SetupWithGenesisAccounts(genAccs []authtypes.GenesisAccount, balances ...ba app.InitChain( abci.RequestInitChain{ Validators: []abci.ValidatorUpdate{}, - ConsensusParams: DefaultConsensusParams, + ConsensusParams: simsutils.DefaultConsensusParams, AppStateBytes: stateBytes, }, ) @@ -490,12 +488,12 @@ func SignCheckDeliver( chainID string, accNums, accSeqs []uint64, expSimPass, expPass bool, priv ...cryptotypes.PrivKey, ) (sdk.GasInfo, *sdk.Result, error) { r := rand.New(rand.NewSource(time.Now().UnixNano())) - tx, err := helpers.GenSignedMockTx( + tx, err := simsutils.GenSignedMockTx( r, txCfg, msgs, sdk.Coins{sdk.NewInt64Coin(appparams.DefaultBondDenom, 0)}, - helpers.DefaultGenTxGas, + simsutils.DefaultGenTxGas, chainID, accNums, accSeqs, @@ -542,12 +540,12 @@ func GenSequenceOfTxs(txGen client.TxConfig, msgs []sdk.Msg, accNums []uint64, i var err error for i := 0; i < numToGenerate; i++ { r := rand.New(rand.NewSource(time.Now().UnixNano())) - txs[i], err = helpers.GenSignedMockTx( + txs[i], err = simsutils.GenSignedMockTx( r, txGen, msgs, sdk.Coins{sdk.NewInt64Coin(appparams.DefaultBondDenom, 0)}, - helpers.DefaultGenTxGas, + simsutils.DefaultGenTxGas, "", accNums, initSeqNums, @@ -592,7 +590,7 @@ func NewPubKeyFromHex(pk string) (res cryptotypes.PubKey) { panic(err) } if len(pkBytes) != ed25519.PubKeySize { - panic(errors.Wrap(errors.ErrInvalidPubKey, "invalid pubkey size")) + panic(errorsmod.Wrap(errors.ErrInvalidPubKey, "invalid pubkey size")) } return &ed25519.PubKey{Key: pkBytes} } diff --git a/app/types.go b/app/types.go index 180944f3e..2f880bc65 100644 --- a/app/types.go +++ b/app/types.go @@ -33,7 +33,7 @@ type App interface { // Exports the state of the application for a genesis file. ExportAppStateAndValidators( - forZeroHeight bool, jailAllowedAddrs []string, + forZeroHeight bool, jailAllowedAddrs []string, modulesToExport []string, ) (types.ExportedApp, error) // All the registered module account addreses. diff --git a/client/docs/swagger-ui/swagger.yaml b/client/docs/swagger-ui/swagger.yaml index fd1ce2e99..4af7653bf 100644 --- a/client/docs/swagger-ui/swagger.yaml +++ b/client/docs/swagger-ui/swagger.yaml @@ -1241,7 +1241,7 @@ paths: foo = any.unpack(Foo.class); } - Example 3: Pack and unpack a message in Python. + Example 3: Pack and unpack a message in Python. foo = Foo(...) any = Any() @@ -1251,7 +1251,7 @@ paths: any.Unpack(foo) ... - Example 4: Pack and unpack a message in Go + Example 4: Pack and unpack a message in Go foo := &pb.Foo{...} any, err := anypb.New(foo) @@ -1282,7 +1282,6 @@ paths: JSON - ==== The JSON representation of an `Any` value uses the regular @@ -1472,7 +1471,7 @@ paths: foo = any.unpack(Foo.class); } - Example 3: Pack and unpack a message in Python. + Example 3: Pack and unpack a message in Python. foo = Foo(...) any = Any() @@ -1482,7 +1481,7 @@ paths: any.Unpack(foo) ... - Example 4: Pack and unpack a message in Go + Example 4: Pack and unpack a message in Go foo := &pb.Foo{...} any, err := anypb.New(foo) @@ -1513,7 +1512,6 @@ paths: JSON - ==== The JSON representation of an `Any` value uses the regular @@ -1909,7 +1907,7 @@ paths: foo = any.unpack(Foo.class); } - Example 3: Pack and unpack a message in Python. + Example 3: Pack and unpack a message in Python. foo = Foo(...) any = Any() @@ -1919,7 +1917,7 @@ paths: any.Unpack(foo) ... - Example 4: Pack and unpack a message in Go + Example 4: Pack and unpack a message in Go foo := &pb.Foo{...} any, err := anypb.New(foo) @@ -1950,7 +1948,6 @@ paths: JSON - ==== The JSON representation of an `Any` value uses the regular @@ -2358,7 +2355,7 @@ paths: foo = any.unpack(Foo.class); } - Example 3: Pack and unpack a message in Python. + Example 3: Pack and unpack a message in Python. foo = Foo(...) any = Any() @@ -2368,7 +2365,7 @@ paths: any.Unpack(foo) ... - Example 4: Pack and unpack a message in Go + Example 4: Pack and unpack a message in Go foo := &pb.Foo{...} any, err := anypb.New(foo) @@ -2399,7 +2396,6 @@ paths: JSON - ==== The JSON representation of an `Any` value uses the regular @@ -2640,7 +2636,7 @@ paths: foo = any.unpack(Foo.class); } - Example 3: Pack and unpack a message in Python. + Example 3: Pack and unpack a message in Python. foo = Foo(...) any = Any() @@ -2650,7 +2646,7 @@ paths: any.Unpack(foo) ... - Example 4: Pack and unpack a message in Go + Example 4: Pack and unpack a message in Go foo := &pb.Foo{...} any, err := anypb.New(foo) @@ -2681,7 +2677,6 @@ paths: JSON - ==== The JSON representation of an `Any` value uses the regular @@ -2976,7 +2971,7 @@ paths: foo = any.unpack(Foo.class); } - Example 3: Pack and unpack a message in Python. + Example 3: Pack and unpack a message in Python. foo = Foo(...) any = Any() @@ -2986,7 +2981,7 @@ paths: any.Unpack(foo) ... - Example 4: Pack and unpack a message in Go + Example 4: Pack and unpack a message in Go foo := &pb.Foo{...} any, err := anypb.New(foo) @@ -3017,7 +3012,6 @@ paths: JSON - ==== The JSON representation of an `Any` value uses the regular @@ -3287,7 +3281,7 @@ paths: foo = any.unpack(Foo.class); } - Example 3: Pack and unpack a message in Python. + Example 3: Pack and unpack a message in Python. foo = Foo(...) any = Any() @@ -3297,7 +3291,7 @@ paths: any.Unpack(foo) ... - Example 4: Pack and unpack a message in Go + Example 4: Pack and unpack a message in Go foo := &pb.Foo{...} any, err := anypb.New(foo) @@ -3328,7 +3322,6 @@ paths: JSON - ==== The JSON representation of an `Any` value uses the regular @@ -3641,7 +3634,8 @@ paths: foo = any.unpack(Foo.class); } - Example 3: Pack and unpack a message in Python. + Example 3: Pack and unpack a message in + Python. foo = Foo(...) any = Any() @@ -3651,7 +3645,7 @@ paths: any.Unpack(foo) ... - Example 4: Pack and unpack a message in Go + Example 4: Pack and unpack a message in Go foo := &pb.Foo{...} any, err := anypb.New(foo) @@ -3682,7 +3676,6 @@ paths: JSON - ==== The JSON representation of an `Any` value uses the regular @@ -3980,7 +3973,7 @@ paths: foo = any.unpack(Foo.class); } - Example 3: Pack and unpack a message in Python. + Example 3: Pack and unpack a message in Python. foo = Foo(...) any = Any() @@ -3990,7 +3983,7 @@ paths: any.Unpack(foo) ... - Example 4: Pack and unpack a message in Go + Example 4: Pack and unpack a message in Go foo := &pb.Foo{...} any, err := anypb.New(foo) @@ -4021,7 +4014,6 @@ paths: JSON - ==== The JSON representation of an `Any` value uses the regular @@ -4266,7 +4258,7 @@ paths: foo = any.unpack(Foo.class); } - Example 3: Pack and unpack a message in Python. + Example 3: Pack and unpack a message in Python. foo = Foo(...) any = Any() @@ -4276,7 +4268,7 @@ paths: any.Unpack(foo) ... - Example 4: Pack and unpack a message in Go + Example 4: Pack and unpack a message in Go foo := &pb.Foo{...} any, err := anypb.New(foo) @@ -4307,7 +4299,6 @@ paths: JSON - ==== The JSON representation of an `Any` value uses the regular @@ -4495,7 +4486,7 @@ paths: foo = any.unpack(Foo.class); } - Example 3: Pack and unpack a message in Python. + Example 3: Pack and unpack a message in Python. foo = Foo(...) any = Any() @@ -4505,7 +4496,7 @@ paths: any.Unpack(foo) ... - Example 4: Pack and unpack a message in Go + Example 4: Pack and unpack a message in Go foo := &pb.Foo{...} any, err := anypb.New(foo) @@ -4536,7 +4527,6 @@ paths: JSON - ==== The JSON representation of an `Any` value uses the regular @@ -5756,7 +5746,7 @@ paths: foo = any.unpack(Foo.class); } - Example 3: Pack and unpack a message in Python. + Example 3: Pack and unpack a message in Python. foo = Foo(...) any = Any() @@ -5766,7 +5756,7 @@ paths: any.Unpack(foo) ... - Example 4: Pack and unpack a message in Go + Example 4: Pack and unpack a message in Go foo := &pb.Foo{...} any, err := anypb.New(foo) @@ -5797,7 +5787,6 @@ paths: JSON - ==== The JSON representation of an `Any` value uses the regular @@ -6257,7 +6246,7 @@ paths: foo = any.unpack(Foo.class); } - Example 3: Pack and unpack a message in Python. + Example 3: Pack and unpack a message in Python. foo = Foo(...) any = Any() @@ -6267,7 +6256,7 @@ paths: any.Unpack(foo) ... - Example 4: Pack and unpack a message in Go + Example 4: Pack and unpack a message in Go foo := &pb.Foo{...} any, err := anypb.New(foo) @@ -6298,7 +6287,6 @@ paths: JSON - ==== The JSON representation of an `Any` value uses the regular @@ -6739,7 +6727,7 @@ paths: foo = any.unpack(Foo.class); } - Example 3: Pack and unpack a message in Python. + Example 3: Pack and unpack a message in Python. foo = Foo(...) any = Any() @@ -6749,7 +6737,7 @@ paths: any.Unpack(foo) ... - Example 4: Pack and unpack a message in Go + Example 4: Pack and unpack a message in Go foo := &pb.Foo{...} any, err := anypb.New(foo) @@ -6780,7 +6768,6 @@ paths: JSON - ==== The JSON representation of an `Any` value uses the regular @@ -6992,7 +6979,7 @@ paths: foo = any.unpack(Foo.class); } - Example 3: Pack and unpack a message in Python. + Example 3: Pack and unpack a message in Python. foo = Foo(...) any = Any() @@ -7002,7 +6989,7 @@ paths: any.Unpack(foo) ... - Example 4: Pack and unpack a message in Go + Example 4: Pack and unpack a message in Go foo := &pb.Foo{...} any, err := anypb.New(foo) @@ -7033,7 +7020,6 @@ paths: JSON - ==== The JSON representation of an `Any` value uses the regular @@ -7988,7 +7974,7 @@ paths: foo = any.unpack(Foo.class); } - Example 3: Pack and unpack a message in Python. + Example 3: Pack and unpack a message in Python. foo = Foo(...) any = Any() @@ -7998,7 +7984,7 @@ paths: any.Unpack(foo) ... - Example 4: Pack and unpack a message in Go + Example 4: Pack and unpack a message in Go foo := &pb.Foo{...} any, err := anypb.New(foo) @@ -8029,7 +8015,6 @@ paths: JSON - ==== The JSON representation of an `Any` value uses the regular @@ -8940,7 +8925,7 @@ paths: foo = any.unpack(Foo.class); } - Example 3: Pack and unpack a message in Python. + Example 3: Pack and unpack a message in Python. foo = Foo(...) any = Any() @@ -8950,7 +8935,7 @@ paths: any.Unpack(foo) ... - Example 4: Pack and unpack a message in Go + Example 4: Pack and unpack a message in Go foo := &pb.Foo{...} any, err := anypb.New(foo) @@ -8981,7 +8966,6 @@ paths: JSON - ==== The JSON representation of an `Any` value uses the regular @@ -9320,7 +9304,7 @@ paths: foo = any.unpack(Foo.class); } - Example 3: Pack and unpack a message in Python. + Example 3: Pack and unpack a message in Python. foo = Foo(...) any = Any() @@ -9330,7 +9314,7 @@ paths: any.Unpack(foo) ... - Example 4: Pack and unpack a message in Go + Example 4: Pack and unpack a message in Go foo := &pb.Foo{...} any, err := anypb.New(foo) @@ -9361,7 +9345,6 @@ paths: JSON - ==== The JSON representation of an `Any` value uses the regular @@ -9709,7 +9692,7 @@ paths: foo = any.unpack(Foo.class); } - Example 3: Pack and unpack a message in Python. + Example 3: Pack and unpack a message in Python. foo = Foo(...) any = Any() @@ -9719,7 +9702,7 @@ paths: any.Unpack(foo) ... - Example 4: Pack and unpack a message in Go + Example 4: Pack and unpack a message in Go foo := &pb.Foo{...} any, err := anypb.New(foo) @@ -9750,7 +9733,6 @@ paths: JSON - ==== The JSON representation of an `Any` value uses the regular @@ -9929,7 +9911,7 @@ paths: foo = any.unpack(Foo.class); } - Example 3: Pack and unpack a message in Python. + Example 3: Pack and unpack a message in Python. foo = Foo(...) any = Any() @@ -9939,7 +9921,7 @@ paths: any.Unpack(foo) ... - Example 4: Pack and unpack a message in Go + Example 4: Pack and unpack a message in Go foo := &pb.Foo{...} any, err := anypb.New(foo) @@ -9970,7 +9952,6 @@ paths: JSON - ==== The JSON representation of an `Any` value uses the regular @@ -10764,7 +10745,7 @@ definitions: foo = any.unpack(Foo.class); } - Example 3: Pack and unpack a message in Python. + Example 3: Pack and unpack a message in Python. foo = Foo(...) any = Any() @@ -10774,7 +10755,7 @@ definitions: any.Unpack(foo) ... - Example 4: Pack and unpack a message in Go + Example 4: Pack and unpack a message in Go foo := &pb.Foo{...} any, err := anypb.New(foo) @@ -10801,7 +10782,6 @@ definitions: JSON - ==== The JSON representation of an `Any` value uses the regular @@ -10941,7 +10921,7 @@ definitions: foo = any.unpack(Foo.class); } - Example 3: Pack and unpack a message in Python. + Example 3: Pack and unpack a message in Python. foo = Foo(...) any = Any() @@ -10951,7 +10931,7 @@ definitions: any.Unpack(foo) ... - Example 4: Pack and unpack a message in Go + Example 4: Pack and unpack a message in Go foo := &pb.Foo{...} any, err := anypb.New(foo) @@ -10978,7 +10958,6 @@ definitions: JSON - ==== The JSON representation of an `Any` value uses the regular @@ -11833,7 +11812,7 @@ definitions: foo = any.unpack(Foo.class); } - Example 3: Pack and unpack a message in Python. + Example 3: Pack and unpack a message in Python. foo = Foo(...) any = Any() @@ -11843,7 +11822,7 @@ definitions: any.Unpack(foo) ... - Example 4: Pack and unpack a message in Go + Example 4: Pack and unpack a message in Go foo := &pb.Foo{...} any, err := anypb.New(foo) @@ -11874,7 +11853,6 @@ definitions: JSON - ==== The JSON representation of an `Any` value uses the regular @@ -12504,7 +12482,7 @@ definitions: foo = any.unpack(Foo.class); } - Example 3: Pack and unpack a message in Python. + Example 3: Pack and unpack a message in Python. foo = Foo(...) any = Any() @@ -12514,7 +12492,7 @@ definitions: any.Unpack(foo) ... - Example 4: Pack and unpack a message in Go + Example 4: Pack and unpack a message in Go foo := &pb.Foo{...} any, err := anypb.New(foo) @@ -12545,7 +12523,6 @@ definitions: JSON - ==== The JSON representation of an `Any` value uses the regular @@ -12938,7 +12915,7 @@ definitions: foo = any.unpack(Foo.class); } - Example 3: Pack and unpack a message in Python. + Example 3: Pack and unpack a message in Python. foo = Foo(...) any = Any() @@ -12948,7 +12925,7 @@ definitions: any.Unpack(foo) ... - Example 4: Pack and unpack a message in Go + Example 4: Pack and unpack a message in Go foo := &pb.Foo{...} any, err := anypb.New(foo) @@ -12976,7 +12953,6 @@ definitions: JSON - ==== The JSON representation of an `Any` value uses the regular @@ -13295,7 +13271,7 @@ definitions: foo = any.unpack(Foo.class); } - Example 3: Pack and unpack a message in Python. + Example 3: Pack and unpack a message in Python. foo = Foo(...) any = Any() @@ -13305,7 +13281,7 @@ definitions: any.Unpack(foo) ... - Example 4: Pack and unpack a message in Go + Example 4: Pack and unpack a message in Go foo := &pb.Foo{...} any, err := anypb.New(foo) @@ -13336,7 +13312,6 @@ definitions: JSON - ==== The JSON representation of an `Any` value uses the regular @@ -13754,7 +13729,7 @@ definitions: foo = any.unpack(Foo.class); } - Example 3: Pack and unpack a message in Python. + Example 3: Pack and unpack a message in Python. foo = Foo(...) any = Any() @@ -13764,7 +13739,7 @@ definitions: any.Unpack(foo) ... - Example 4: Pack and unpack a message in Go + Example 4: Pack and unpack a message in Go foo := &pb.Foo{...} any, err := anypb.New(foo) @@ -13791,7 +13766,6 @@ definitions: JSON - ==== The JSON representation of an `Any` value uses the regular diff --git a/cmd/babylond/cmd/add_gen_bls.go b/cmd/babylond/cmd/add_gen_bls.go index 11eb6e1be..dbbadb5fe 100644 --- a/cmd/babylond/cmd/add_gen_bls.go +++ b/cmd/babylond/cmd/add_gen_bls.go @@ -4,6 +4,7 @@ import ( "encoding/json" "errors" "fmt" + "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/server" "github.com/cosmos/cosmos-sdk/x/genutil" @@ -15,7 +16,7 @@ import ( "github.com/babylonchain/babylon/x/checkpointing/types" ) -func AddGenBlsCmd() *cobra.Command { +func AddGenBlsCmd(validator genutiltypes.MessageValidator) *cobra.Command { cmd := &cobra.Command{ Use: "add-genesis-bls [genesis_bls_file]", Short: "Add a genesis BLS key to genesis.json", @@ -65,7 +66,7 @@ BLS keys in the checkpointing module's genesis state.' genTxState := genutiltypes.GetGenesisStateFromAppState(clientCtx.Codec, appState) foundInGenTx := false for _, genTx := range genTxState.GenTxs { - tx, err := genutiltypes.ValidateAndGetGenTx(genTx, clientCtx.TxConfig.TxJSONDecoder()) + tx, err := genutiltypes.ValidateAndGetGenTx(genTx, clientCtx.TxConfig.TxJSONDecoder(), validator) if err != nil { return err } diff --git a/cmd/babylond/cmd/add_gen_bls_test.go b/cmd/babylond/cmd/add_gen_bls_test.go index ac6c34b2a..1bbb7b811 100644 --- a/cmd/babylond/cmd/add_gen_bls_test.go +++ b/cmd/babylond/cmd/add_gen_bls_test.go @@ -7,6 +7,7 @@ import ( "testing" "github.com/cosmos/cosmos-sdk/server/config" + "github.com/cosmos/cosmos-sdk/x/genutil" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" @@ -38,6 +39,8 @@ func Test_AddGenBlsCmdWithoutGentx(t *testing.T) { require.NoError(t, err) appCodec := app.GetEncodingConfig().Marshaler + gentxModule := app.ModuleBasics[genutiltypes.ModuleName].(genutil.AppModuleBasic) + err = genutiltest.ExecInitCmd(testMbm, home, appCodec) require.NoError(t, err) @@ -56,7 +59,7 @@ func Test_AddGenBlsCmdWithoutGentx(t *testing.T) { genKeyFileName := filepath.Join(home, fmt.Sprintf("gen-bls-%s.json", genKey.ValidatorAddress)) err = tempfile.WriteFileAtomic(genKeyFileName, jsonBytes, 0600) require.NoError(t, err) - addGenBlsCmd := cmd.AddGenBlsCmd() + addGenBlsCmd := cmd.AddGenBlsCmd(gentxModule.GenTxValidator) addGenBlsCmd.SetArgs( []string{genKeyFileName}, ) @@ -67,7 +70,8 @@ func Test_AddGenBlsCmdWithoutGentx(t *testing.T) { // test adding genesis BLS keys with gentx // error is expected if adding duplicate func Test_AddGenBlsCmdWithGentx(t *testing.T) { - cfg := network.DefaultConfig() + min := network.MinimumAppConfig() + cfg, _ := network.DefaultConfigWithAppConfig(min) config.SetConfigTemplate(config.DefaultConfigTemplate) cfg.NumValidators = 1 @@ -77,6 +81,7 @@ func Test_AddGenBlsCmdWithGentx(t *testing.T) { _, err = testNetwork.WaitForHeight(1) require.NoError(t, err) + gentxModule := app.ModuleBasics[genutiltypes.ModuleName].(genutil.AppModuleBasic) targetCfg := tmconfig.DefaultConfig() targetCfg.SetRoot(filepath.Join(testNetwork.Validators[0].Dir, "simd")) @@ -102,7 +107,7 @@ func Test_AddGenBlsCmdWithGentx(t *testing.T) { require.NotNil(t, genKey) // add genesis BLS key to the target context - addBlsCmd := cmd.AddGenBlsCmd() + addBlsCmd := cmd.AddGenBlsCmd(gentxModule.GenTxValidator) _, err = cli.ExecTestCLICmd(targetCtx, addBlsCmd, []string{genKeyFileName}) require.NoError(t, err) appState, _, err := genutiltypes.GenesisStateFromGenFile(targetGenesisFile) diff --git a/cmd/babylond/cmd/genesis.go b/cmd/babylond/cmd/genesis.go index fc90db703..abc626f4d 100644 --- a/cmd/babylond/cmd/genesis.go +++ b/cmd/babylond/cmd/genesis.go @@ -146,7 +146,7 @@ func PrepareGenesis(clientCtx client.Context, appState map[string]json.RawMessag // gov module genesis govGenState := govv1.DefaultGenesisState() - govGenState.DepositParams = &genesisParams.GovParams.DepositParams + govGenState.Params = &genesisParams.GovParams appState[govtypes.ModuleName] = cdc.MustMarshalJSON(govGenState) // crisis module genesis @@ -238,7 +238,7 @@ func TestnetGenesisParams(maxActiveValidators uint32, btcConfirmationDepth uint6 genParams.MintParams.GoalBonded = sdk.MustNewDecFromStr(fmt.Sprintf("%f", goalBonded)) genParams.GovParams = govv1.DefaultParams() - genParams.GovParams.DepositParams.MinDeposit = sdk.NewCoins(sdk.NewCoin( + genParams.GovParams.MinDeposit = sdk.NewCoins(sdk.NewCoin( genParams.NativeCoinMetadatas[0].Base, sdk.NewInt(2_500_000_000), )) diff --git a/cmd/babylond/cmd/root.go b/cmd/babylond/cmd/root.go index 43429f7f3..51f18ef94 100644 --- a/cmd/babylond/cmd/root.go +++ b/cmd/babylond/cmd/root.go @@ -6,6 +6,7 @@ import ( "os" "path/filepath" + rosettaCmd "cosmossdk.io/tools/rosetta/cmd" "github.com/cosmos/cosmos-sdk/baseapp" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/config" @@ -24,7 +25,9 @@ import ( "github.com/cosmos/cosmos-sdk/x/auth/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" "github.com/cosmos/cosmos-sdk/x/crisis" + "github.com/cosmos/cosmos-sdk/x/genutil" genutilcli "github.com/cosmos/cosmos-sdk/x/genutil/client/cli" + genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types" "github.com/spf13/cast" "github.com/spf13/cobra" tmcfg "github.com/tendermint/tendermint/config" @@ -133,19 +136,21 @@ func initRootCmd(rootCmd *cobra.Command, encodingConfig params.EncodingConfig) { cfg := sdk.GetConfig() cfg.Seal() + gentxModule := app.ModuleBasics[genutiltypes.ModuleName].(genutil.AppModuleBasic) + rootCmd.AddCommand( genutilcli.InitCmd(app.ModuleBasics, app.DefaultNodeHome), - genutilcli.CollectGenTxsCmd(banktypes.GenesisBalancesIterator{}, app.DefaultNodeHome), + genutilcli.CollectGenTxsCmd(banktypes.GenesisBalancesIterator{}, app.DefaultNodeHome, gentxModule.GenTxValidator), genutilcli.MigrateGenesisCmd(), genutilcli.GenTxCmd(app.ModuleBasics, encodingConfig.TxConfig, banktypes.GenesisBalancesIterator{}, app.DefaultNodeHome), - ValidateGenesisCmd(app.ModuleBasics), + ValidateGenesisCmd(app.ModuleBasics, gentxModule.GenTxValidator), PrepareGenesisCmd(app.DefaultNodeHome, app.ModuleBasics), AddGenesisAccountCmd(app.DefaultNodeHome), tmcli.NewCompletionCmd(rootCmd, true), TestnetCmd(app.ModuleBasics, banktypes.GenesisBalancesIterator{}), CreateBlsKeyCmd(), GenBlsCmd(), - AddGenBlsCmd(), + AddGenBlsCmd(gentxModule.GenTxValidator), debug.Cmd(), config.Cmd(), ) @@ -162,7 +167,7 @@ func initRootCmd(rootCmd *cobra.Command, encodingConfig params.EncodingConfig) { ) // add rosetta - rootCmd.AddCommand(server.RosettaCommand(encodingConfig.InterfaceRegistry, encodingConfig.Marshaler)) + rootCmd.AddCommand(rosettaCmd.RosettaCommand(encodingConfig.InterfaceRegistry, encodingConfig.Marshaler)) } func addModuleInitFlags(startCmd *cobra.Command) { @@ -246,7 +251,8 @@ func (a appCreator) newApp(logger log.Logger, db dbm.DB, traceStore io.Writer, a homeDir := cast.ToString(appOpts.Get(flags.FlagHome)) snapshotDir := filepath.Join(homeDir, "data", "snapshots") - snapshotDB, err := sdk.NewLevelDB("metadata", snapshotDir) //nolint:staticcheck // Prefer the old-fashioned way. + snapshotDB, err := dbm.NewDB("metadata", server.GetAppDBBackend(appOpts), snapshotDir) + if err != nil { panic(err) } @@ -308,8 +314,15 @@ func (a appCreator) newApp(logger log.Logger, db dbm.DB, traceStore io.Writer, a // appExport creates a new app (optionally at a given height) // and exports state. func (a appCreator) appExport( - logger log.Logger, db dbm.DB, traceStore io.Writer, height int64, forZeroHeight bool, jailAllowedAddrs []string, - appOpts servertypes.AppOptions) (servertypes.ExportedApp, error) { + logger log.Logger, + db dbm.DB, + traceStore io.Writer, + height int64, + forZeroHeight bool, + jailAllowedAddrs []string, + appOpts servertypes.AppOptions, + modulesToExport []string, +) (servertypes.ExportedApp, error) { var babylonApp *app.BabylonApp homePath, ok := appOpts.Get(flags.FlagHome).(string) @@ -351,5 +364,5 @@ func (a appCreator) appExport( babylonApp = app.NewBabylonApp(logger, db, traceStore, true, map[int64]bool{}, homePath, uint(1), a.encCfg, privSigner, appOpts) } - return babylonApp.ExportAppStateAndValidators(forZeroHeight, jailAllowedAddrs) + return babylonApp.ExportAppStateAndValidators(forZeroHeight, jailAllowedAddrs, modulesToExport) } diff --git a/cmd/babylond/cmd/testnet.go b/cmd/babylond/cmd/testnet.go index 534db601b..c33286519 100644 --- a/cmd/babylond/cmd/testnet.go +++ b/cmd/babylond/cmd/testnet.go @@ -165,6 +165,7 @@ func InitTestnet( babylonConfig.BtcConfig.CheckpointTag = btcCheckpointTag // Explorer related config. Allow CORS connections. babylonConfig.API.EnableUnsafeCORS = true + babylonConfig.GRPC.Address = "0.0.0.0:9090" var ( genAccounts []authtypes.GenesisAccount @@ -449,7 +450,14 @@ func collectGenFiles( return err } - nodeAppState, err := genutil.GenAppStateFromConfig(clientCtx.Codec, clientCtx.TxConfig, nodeConfig, initCfg, *genDoc, genBalIterator) + nodeAppState, err := genutil.GenAppStateFromConfig( + clientCtx.Codec, + clientCtx.TxConfig, + nodeConfig, initCfg, + *genDoc, + genBalIterator, + genutiltypes.DefaultMessageValidator, + ) if err != nil { return err } diff --git a/cmd/babylond/cmd/validate_genesis.go b/cmd/babylond/cmd/validate_genesis.go index 68d80d75e..522a5d97b 100644 --- a/cmd/babylond/cmd/validate_genesis.go +++ b/cmd/babylond/cmd/validate_genesis.go @@ -25,7 +25,7 @@ const chainUpgradeGuide = "https://github.com/cosmos/cosmos-sdk/blob/a51aa517c46 // 2. each genesis BLS key or gentx should have a corresponding gentx or genesis // BLS key // modified based on "https://github.com/cosmos/cosmos-sdk/blob/6d32debf1aca4b7f1ed1429d87be1d02c315f02d/x/genutil/client/cli/validate_genesis.go" -func ValidateGenesisCmd(mbm module.BasicManager) *cobra.Command { +func ValidateGenesisCmd(mbm module.BasicManager, validator genutiltypes.MessageValidator) *cobra.Command { return &cobra.Command{ Use: "validate-genesis [file]", Args: cobra.RangeArgs(0, 1), @@ -58,7 +58,7 @@ func ValidateGenesisCmd(mbm module.BasicManager) *cobra.Command { return fmt.Errorf("error validating genesis file %s: %s", genesis, err.Error()) } - if err = CheckCorrespondence(clientCtx, genState); err != nil { + if err = CheckCorrespondence(clientCtx, genState, validator); err != nil { return fmt.Errorf("error validating genesis file correspondence %s: %s", genesis, err.Error()) } @@ -86,7 +86,7 @@ func validateGenDoc(importGenesisFile string) (*tmtypes.GenesisDoc, error) { // CheckCorrespondence checks that each genesis tx/BLS key should have one // corresponding BLS key/genesis tx -func CheckCorrespondence(ctx client.Context, genesis map[string]json.RawMessage) error { +func CheckCorrespondence(ctx client.Context, genesis map[string]json.RawMessage, validator genutiltypes.MessageValidator) error { checkpointingGenState := types.GetGenesisStateFromAppState(ctx.Codec, genesis) gks := checkpointingGenState.GetGenesisKeys() genTxState := genutiltypes.GetGenesisStateFromAppState(ctx.Codec, genesis) @@ -105,7 +105,7 @@ func CheckCorrespondence(ctx client.Context, genesis map[string]json.RawMessage) } // ensure every gentx has a match with BLS key by address for _, genTx := range genTxState.GenTxs { - tx, err := genutiltypes.ValidateAndGetGenTx(genTx, ctx.TxConfig.TxJSONDecoder()) + tx, err := genutiltypes.ValidateAndGetGenTx(genTx, ctx.TxConfig.TxJSONDecoder(), validator) if err != nil { return err } diff --git a/cmd/babylond/cmd/validate_genesis_test.go b/cmd/babylond/cmd/validate_genesis_test.go index aae452917..27470aa74 100644 --- a/cmd/babylond/cmd/validate_genesis_test.go +++ b/cmd/babylond/cmd/validate_genesis_test.go @@ -8,6 +8,7 @@ import ( "github.com/spf13/viper" "github.com/stretchr/testify/require" + "github.com/cosmos/cosmos-sdk/x/genutil" "github.com/babylonchain/babylon/app" "github.com/babylonchain/babylon/cmd/babylond/cmd" @@ -68,6 +69,8 @@ func TestCheckCorrespondence(t *testing.T) { }, } + gentxModule := app.ModuleBasics[genutiltypes.ModuleName].(genutil.AppModuleBasic) + for _, tc := range testCases { genDoc, err := tmtypes.GenesisDocFromJSON(tc.genesis) require.NoError(t, err) @@ -75,7 +78,7 @@ func TestCheckCorrespondence(t *testing.T) { genesisState, err := genutiltypes.GenesisStateFromGenDoc(*genDoc) require.NoError(t, err) require.NotEmpty(t, genesisState) - err = cmd.CheckCorrespondence(clientCtx, genesisState) + err = cmd.CheckCorrespondence(clientCtx, genesisState, gentxModule.GenTxValidator) if tc.expErr { require.Error(t, err) } else { diff --git a/contrib/images/babylond-env/Dockerfile b/contrib/images/babylond-env/Dockerfile index 9fe29b87c..426845bd0 100644 --- a/contrib/images/babylond-env/Dockerfile +++ b/contrib/images/babylond-env/Dockerfile @@ -15,7 +15,7 @@ VOLUME /babylond COPY --from=build /work/build/babylond /babylond/ WORKDIR /babylond -EXPOSE 26656 26657 1317 +EXPOSE 26656 26657 1317 9090 ENTRYPOINT ["/usr/bin/wrapper.sh"] CMD ["start", "--log_format", "plain"] STOPSIGNAL SIGTERM diff --git a/go.mod b/go.mod index 2c7954cc8..3f064140b 100644 --- a/go.mod +++ b/go.mod @@ -3,8 +3,8 @@ go 1.19 module github.com/babylonchain/babylon require ( - github.com/btcsuite/btcd v0.22.3 - github.com/cosmos/cosmos-sdk v0.46.6 + github.com/btcsuite/btcd v0.23.4 + github.com/cosmos/cosmos-sdk v0.47.0-rc2 github.com/gogo/protobuf v1.3.3 github.com/golang/protobuf v1.5.2 github.com/gorilla/mux v1.8.0 @@ -12,28 +12,31 @@ require ( github.com/pkg/errors v0.9.1 github.com/rakyll/statik v0.1.7 github.com/spf13/cast v1.5.0 - github.com/spf13/cobra v1.6.0 - github.com/spf13/viper v1.13.0 - github.com/stretchr/testify v1.8.0 + github.com/spf13/cobra v1.6.1 + github.com/spf13/viper v1.15.0 + github.com/stretchr/testify v1.8.1 github.com/supranational/blst v0.3.8 - github.com/tendermint/tendermint v0.34.24 - github.com/tendermint/tm-db v0.6.7 - google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a - google.golang.org/grpc v1.51.0 + google.golang.org/genproto v0.0.0-20221227171554-f9683d7f8bef + google.golang.org/grpc v1.52.3 gopkg.in/yaml.v2 v2.4.0 ) require ( + cosmossdk.io/api v0.2.6 cosmossdk.io/errors v1.0.0-beta.7 - cosmossdk.io/math v1.0.0-beta.3 + cosmossdk.io/math v1.0.0-beta.4 + cosmossdk.io/tools/rosetta v0.2.0 github.com/boljen/go-bitmap v0.0.0-20151001105940-23cd2fb0ce7d + github.com/btcsuite/btcd/btcutil v1.1.2 github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 - github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce - github.com/cosmos/cosmos-proto v1.0.0-alpha7 - github.com/cosmos/ibc-go/v5 v5.1.0 + github.com/cosmos/cosmos-proto v1.0.0-beta.1 + github.com/cosmos/gogoproto v1.4.4 + github.com/cosmos/ibc-go/v7 v7.0.0-rc0 github.com/golang/mock v1.6.0 github.com/jinzhu/copier v0.3.5 github.com/ory/dockertest/v3 v3.9.1 + github.com/tendermint/tendermint v0.37.0-rc2 + github.com/tendermint/tm-db v0.6.7 google.golang.org/protobuf v1.28.2-0.20220831092852-f930b1dc76e8 ) @@ -41,35 +44,31 @@ require ( filippo.io/edwards25519 v1.0.0-rc.1 // indirect github.com/99designs/keyring v1.2.1 // indirect github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d // indirect - github.com/Workiva/go-datastructures v1.0.53 // indirect - github.com/armon/go-metrics v0.4.0 + github.com/armon/go-metrics v0.4.1 github.com/beorn7/perks v1.0.1 // indirect - github.com/bgentry/speakeasy v0.1.0 // indirect + github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 // indirect github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f // indirect github.com/cespare/xxhash v1.1.0 // indirect github.com/cespare/xxhash/v2 v2.1.2 // indirect - github.com/coinbase/rosetta-sdk-go v0.7.9 // indirect - github.com/confio/ics23/go v0.7.0 // indirect - github.com/cosmos/btcutil v1.0.4 // indirect + github.com/confio/ics23/go v0.9.0 // indirect + github.com/cosmos/btcutil v1.0.5 // indirect github.com/cosmos/go-bip39 v1.0.0 - github.com/cosmos/iavl v0.19.4 // indirect - github.com/cosmos/ledger-cosmos-go v0.11.1 // indirect - github.com/cosmos/ledger-go v0.9.2 // indirect + github.com/cosmos/iavl v0.19.5-rc.1 // indirect + github.com/cosmos/ledger-cosmos-go v0.12.1 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f // indirect github.com/dgraph-io/badger/v2 v2.2007.4 // indirect - github.com/dgraph-io/ristretto v0.1.0 // indirect + github.com/dgraph-io/ristretto v0.1.1 // indirect github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 // indirect github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac // indirect github.com/dvsekhvalnov/jose2go v1.5.0 // indirect - github.com/fsnotify/fsnotify v1.5.4 // indirect + github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/go-kit/kit v0.12.0 // indirect github.com/go-kit/log v0.2.1 // indirect github.com/go-logfmt/logfmt v0.5.1 // indirect github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect - github.com/gogo/gateway v1.1.0 // indirect github.com/golang/snappy v0.0.4 // indirect - github.com/google/btree v1.0.1 // indirect + github.com/google/btree v1.1.2 // indirect github.com/google/orderedcode v0.0.1 // indirect github.com/gorilla/handlers v1.5.1 // indirect github.com/gorilla/websocket v1.5.0 // indirect @@ -85,79 +84,87 @@ require ( github.com/inconshreveable/mousetrap v1.0.1 // indirect github.com/jmhodges/levigo v1.0.0 // indirect github.com/keybase/go-keychain v0.0.0-20190712205309-48d3d31d256d // indirect - github.com/klauspost/compress v1.15.11 // indirect - github.com/lib/pq v1.10.6 // indirect + github.com/klauspost/compress v1.15.12 // indirect + github.com/lib/pq v1.10.7 // indirect github.com/libp2p/go-buffer-pool v0.1.0 // indirect - github.com/magiconair/properties v1.8.6 // indirect + github.com/magiconair/properties v1.8.7 // indirect github.com/mattn/go-isatty v0.0.16 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0 // indirect github.com/minio/highwayhash v1.0.2 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/mtibben/percent v0.2.1 // indirect - github.com/pelletier/go-toml v1.9.5 // indirect github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.12.2 // indirect - github.com/prometheus/client_model v0.2.0 // indirect - github.com/prometheus/common v0.34.0 // indirect + github.com/prometheus/client_golang v1.14.0 // indirect + github.com/prometheus/client_model v0.3.0 // indirect + github.com/prometheus/common v0.37.0 // indirect github.com/prometheus/procfs v0.8.0 // indirect github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect github.com/rs/cors v1.8.2 // indirect - github.com/rs/zerolog v1.27.0 // indirect + github.com/rs/zerolog v1.28.0 // indirect github.com/sasha-s/go-deadlock v0.3.1 // indirect - github.com/spf13/afero v1.8.2 // indirect + github.com/spf13/afero v1.9.3 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/spf13/pflag v1.0.5 - github.com/subosito/gotenv v1.4.1 // indirect + github.com/subosito/gotenv v1.4.2 // indirect github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 // indirect - github.com/tendermint/btcd v0.1.1 // indirect - github.com/tendermint/crypto v0.0.0-20191022145703-50d29ede1e15 // indirect github.com/tendermint/go-amino v0.16.0 // indirect - github.com/zondax/hid v0.9.1-0.20220302062450-5552068d2266 // indirect + github.com/zondax/hid v0.9.1 // indirect go.etcd.io/bbolt v1.3.6 // indirect - golang.org/x/crypto v0.1.0 // indirect - golang.org/x/sys v0.2.0 // indirect - golang.org/x/term v0.2.0 // indirect - golang.org/x/text v0.4.0 // indirect + golang.org/x/crypto v0.5.0 // indirect + golang.org/x/sys v0.5.0 // indirect + golang.org/x/term v0.5.0 // indirect + golang.org/x/text v0.7.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect nhooyr.io/websocket v1.8.6 // indirect ) require ( - cloud.google.com/go v0.102.1 // indirect - cloud.google.com/go/compute v1.7.0 // indirect - cloud.google.com/go/iam v0.4.0 // indirect - cloud.google.com/go/storage v1.22.1 // indirect + cloud.google.com/go v0.105.0 // indirect + cloud.google.com/go/compute v1.14.0 // indirect + cloud.google.com/go/compute/metadata v0.2.3 // indirect + cloud.google.com/go/iam v0.8.0 // indirect + cloud.google.com/go/storage v1.27.0 // indirect + cosmossdk.io/core v0.3.2 // indirect + cosmossdk.io/depinject v1.0.0-alpha.3 // indirect github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect github.com/Microsoft/go-winio v0.6.0 // indirect github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 // indirect github.com/aws/aws-sdk-go v1.40.45 // indirect github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect + github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect github.com/cenkalti/backoff/v4 v4.2.0 // indirect github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e // indirect github.com/cockroachdb/apd/v2 v2.0.2 // indirect github.com/containerd/continuity v0.3.0 // indirect + github.com/cosmos/gogogateway v1.2.0 // indirect github.com/cosmos/gorocksdb v1.2.0 // indirect + github.com/cosmos/ics23/go v0.9.1-0.20221207100636-b1abd8678aab // indirect + github.com/cosmos/rosetta-sdk-go v0.9.0 // indirect github.com/creachadair/taskgroup v0.3.2 // indirect github.com/danieljoos/wincred v1.1.2 // indirect + github.com/decred/dcrd/crypto/blake256 v1.0.0 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect github.com/docker/cli v20.10.21+incompatible // indirect github.com/docker/docker v20.10.21+incompatible // indirect github.com/docker/go-connections v0.4.0 // indirect github.com/docker/go-units v0.5.0 // indirect - github.com/felixge/httpsnoop v1.0.1 // indirect + github.com/felixge/httpsnoop v1.0.2 // indirect + github.com/gofrs/uuid v4.3.0+incompatible // indirect + github.com/gogo/googleapis v1.4.1-0.20201022092350-68b0159b7869 // indirect github.com/golang/glog v1.0.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/google/go-cmp v0.5.9 // indirect github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect github.com/google/uuid v1.3.0 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.1.0 // indirect - github.com/googleapis/gax-go/v2 v2.4.0 // indirect - github.com/googleapis/go-type-adapters v1.0.0 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.2.1 // indirect + github.com/googleapis/gax-go/v2 v2.7.0 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect - github.com/hashicorp/go-getter v1.6.1 // indirect + github.com/hashicorp/go-getter v1.6.2 // indirect github.com/hashicorp/go-safetemp v1.0.0 // indirect github.com/hashicorp/go-version v1.6.0 // indirect + github.com/huandu/skiplist v1.2.0 // indirect github.com/imdario/mergo v0.3.13 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/manifoldco/promptui v0.9.0 // indirect @@ -168,24 +175,25 @@ require ( github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.1.0-rc2 // indirect github.com/opencontainers/runc v1.1.4 // indirect - github.com/pelletier/go-toml/v2 v2.0.5 // indirect - github.com/regen-network/cosmos-proto v0.3.1 // indirect - github.com/rogpeppe/go-internal v1.8.1 // indirect + github.com/pelletier/go-toml/v2 v2.0.6 // indirect github.com/sirupsen/logrus v1.9.0 // indirect + github.com/tidwall/btree v1.5.2 // indirect github.com/ulikunitz/xz v0.5.8 // indirect github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect github.com/xeipuuv/gojsonschema v1.2.0 // indirect - go.opencensus.io v0.23.0 // indirect - golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e // indirect + github.com/zondax/ledger-go v0.14.0 // indirect + go.opencensus.io v0.24.0 // indirect + golang.org/x/exp v0.0.0-20221019170559-20944726eadf // indirect golang.org/x/mod v0.7.0 // indirect - golang.org/x/net v0.2.0 // indirect + golang.org/x/net v0.7.0 // indirect golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783 // indirect - golang.org/x/tools v0.3.0 // indirect - golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f // indirect - google.golang.org/api v0.93.0 // indirect + golang.org/x/tools v0.4.0 // indirect + golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect + google.golang.org/api v0.107.0 // indirect google.golang.org/appengine v1.6.7 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect + pgregory.net/rapid v0.5.3 // indirect sigs.k8s.io/yaml v1.3.0 // indirect ) @@ -194,7 +202,7 @@ replace ( // slay the dragonberry github.com/confio/ics23/go => github.com/cosmos/cosmos-sdk/ics23/go v0.8.0 - github.com/cosmos/ibc-go/v5 => github.com/babylonchain/ibc-go/v5 v5.0.1-0.20221107054049-dbf7e4efe6fd + github.com/cosmos/ibc-go/v7 => github.com/babylonchain/ibc-go/v7 v7.0.0-20230222123128-9fc81e93ac35 // Fix upstream GHSA-h395-qcrw-5vmq vulnerability. // TODO Remove it: https://github.com/cosmos/cosmos-sdk/issues/10409 diff --git a/go.sum b/go.sum index 5aec91ca3..6def58b22 100644 --- a/go.sum +++ b/go.sum @@ -1,14 +1,12 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.43.0/go.mod h1:BOSR3VbTLkk6FDC/TcffxP4NF/FFBGA5ku+jvKOP7pg= cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.51.0/go.mod h1:hWtGJ6gnXH+KgDv+V0zFGDvpi07n3z8ZNj3T1RW0Gcw= cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= @@ -19,40 +17,23 @@ cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHOb cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= -cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= -cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= -cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= -cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= -cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= -cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= -cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= -cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= -cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= -cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= -cloud.google.com/go v0.102.1 h1:vpK6iQWv/2uUeFJth4/cBHsQAGjn1iIE6AAlxipRaA0= -cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= +cloud.google.com/go v0.105.0 h1:DNtEKRBAAzeS4KyIory52wWHuClNaXJ5x1F7xa4q+5Y= +cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFOKM= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/bigtable v1.2.0/go.mod h1:JcVAOl45lrTmQfLj7T6TxyMzIN/3FGGcFm+2xVAli2o= -cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= -cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= -cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= -cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= -cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= -cloud.google.com/go/compute v1.7.0 h1:v/k9Eueb8aAJ0vZuxKMrgm6kPhCLZU9HxFU+AFDs9Uk= -cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= +cloud.google.com/go/compute v1.14.0 h1:hfm2+FfxVmnRlh6LpB7cg1ZNU+5edAHmW679JePztk0= +cloud.google.com/go/compute v1.14.0/go.mod h1:YfLtxrj9sU4Yxv+sXzZkyPjEyPBZfXHUvjxega5vAdo= +cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= +cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= -cloud.google.com/go/iam v0.4.0 h1:YBYU00SCDzZJdHqVc4I5d6lsklcYIjQZa1YmEz4jlSE= -cloud.google.com/go/iam v0.4.0/go.mod h1:cbaZxyScUhxl7ZAkNWiALgihfP75wS/fUsVNaa1r3vA= +cloud.google.com/go/iam v0.8.0 h1:E2osAkZzxI/+8pZcxVLcDtAQx/u+hZXVryUaYQ5O0Kk= +cloud.google.com/go/iam v0.8.0/go.mod h1:lga0/y3iH6CX7sYqypWJ33hf7kkfXJag67naqGESjkE= +cloud.google.com/go/longrunning v0.3.0 h1:NjljC+FYPV3uh5/OwWT6pVU+doBqMg2x/rZlE+CamDs= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= @@ -63,30 +44,30 @@ cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohl cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= -cloud.google.com/go/storage v1.22.1 h1:F6IlQJZrZM++apn9V5/VfS3gbTUYg98PS3EMQAzqtfg= -cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= -collectd.org v0.3.0/go.mod h1:A/8DzQBkF6abtvrT2j/AU/4tiBgJWYyh0y/oB/4MlWE= +cloud.google.com/go/storage v1.27.0 h1:YOO045NZI9RKfCj1c5A/ZtuuENUc8OAW+gHdGnDgyMQ= +cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= +cosmossdk.io/api v0.2.6 h1:AoNwaLLapcLsphhMK6+o0kZl+D6MMUaHVqSdwinASGU= +cosmossdk.io/api v0.2.6/go.mod h1:u/d+GAxil0nWpl1XnQL8nkziQDIWuBDhv8VnDm/s6dI= +cosmossdk.io/core v0.3.2 h1:KlQIufpJHJvOs7YLGTZsZcCo1WlkencDXepsr8STKZQ= +cosmossdk.io/core v0.3.2/go.mod h1:CO7vbe+evrBvHc0setFHL/u7nlY7HJGzdRSBkT/sirc= +cosmossdk.io/depinject v1.0.0-alpha.3 h1:6evFIgj//Y3w09bqOUOzEpFj5tsxBqdc5CfkO7z+zfw= +cosmossdk.io/depinject v1.0.0-alpha.3/go.mod h1:eRbcdQ7MRpIPEM5YUJh8k97nxHpYbc3sMUnEtt8HPWU= cosmossdk.io/errors v1.0.0-beta.7 h1:gypHW76pTQGVnHKo6QBkb4yFOJjC+sUGRc5Al3Odj1w= cosmossdk.io/errors v1.0.0-beta.7/go.mod h1:mz6FQMJRku4bY7aqS/Gwfcmr/ue91roMEKAmDUDpBfE= -cosmossdk.io/math v1.0.0-beta.3 h1:TbZxSopz2LqjJ7aXYfn7nJSb8vNaBklW6BLpcei1qwM= -cosmossdk.io/math v1.0.0-beta.3/go.mod h1:3LYasri3Zna4XpbrTNdKsWmD5fHHkaNAod/mNT9XdE4= +cosmossdk.io/math v1.0.0-beta.4 h1:JtKedVLGzA0vv84xjYmZ75RKG35Kf2WwcFu8IjRkIIw= +cosmossdk.io/math v1.0.0-beta.4/go.mod h1:An0MllWJY6PxibUpnwGk8jOm+a/qIxlKmL5Zyp9NnaM= +cosmossdk.io/tools/rosetta v0.2.0 h1:Ae499UiZ9yPNCXvjOBO/R9I1pksCJfxoqWauEZgA/gs= +cosmossdk.io/tools/rosetta v0.2.0/go.mod h1:3mn8QuE2wLUdTi77/gbDXdFqXZdBdiBJhgAWUTSXPv8= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= filippo.io/edwards25519 v1.0.0-rc.1 h1:m0VOOB23frXZvAOK44usCgLWvtsxIoMCTBGJZlpmGfU= filippo.io/edwards25519 v1.0.0-rc.1/go.mod h1:N1IkdkCkiLB6tki+MYJoSx2JTY9NUlxZE7eHn5EwJns= -git.sr.ht/~sircmpwn/getopt v0.0.0-20191230200459-23622cc906b3/go.mod h1:wMEGFFFNuPos7vHmWXfszqImLppbc0wEhh6JBfJIUgw= -git.sr.ht/~sircmpwn/go-bare v0.0.0-20210406120253-ab86bc2846d9/go.mod h1:BVJwbDfVjCjoFiKrhkei6NdGcZYpkDkdyCdg1ukytRA= -github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1/go.mod h1:fBF9PQNqB8scdgpZ3ufzaLntG0AG7C1WjPMsiFOmfHM= -github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3/go.mod h1:KLF4gFr6DcKFZwSuH8w8yEK6DpFl3LP5rhdvAb7Yz5I= -github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0/go.mod h1:tPaiy8S5bQ+S5sOiDlINkp7+Ef339+Nz5L5XO+cnOHo= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d h1:nalkkPQcITbvhmL4+C4cKA87NW0tfm3Kl9VXRoPywFg= github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d/go.mod h1:URdX5+vg25ts3aCh8H5IFZybJYKWhJHYMTnf+ULtoC4= -github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= -github.com/DataDog/zstd v1.5.0/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= github.com/Microsoft/go-winio v0.6.0 h1:slsWYD/zyx7lCXoZVlvQrj0hPTM1HI4+v1sIda2yDvg= github.com/Microsoft/go-winio v0.6.0/go.mod h1:cTAf44im0RAYeL23bpB+fzCyDH2MJiz2BO69KH/soAE= @@ -96,33 +77,25 @@ github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= -github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= -github.com/VictoriaMetrics/fastcache v1.6.0/go.mod h1:0qHz5QP0GMX4pfmMA/zt5RgfNuXJrTP0zS7DqpHGGTw= github.com/VividCortex/gohistogram v1.0.0 h1:6+hBz+qvs0JOrrNhhmR7lFxo5sINxBCGXrdtl/UvroE= github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= -github.com/Workiva/go-datastructures v1.0.53 h1:J6Y/52yX10Xc5JjXmGtWoSSxs3mZnGSaq37xZZh7Yig= -github.com/Workiva/go-datastructures v1.0.53/go.mod h1:1yZL+zfsztete+ePzZz/Zb1/t5BnDuE2Ya2MMGhzP6A= -github.com/Zilliqa/gozilliqa-sdk v1.2.1-0.20201201074141-dd0ecada1be6/go.mod h1:eSYp2T6f0apnuW8TzhV3f6Aff2SE8Dwio++U4ha4yEM= github.com/adlio/schema v1.3.3 h1:oBJn8I02PyTB466pZO1UZEn1TV5XLlifBSyMrmHl/1I= github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= -github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= +github.com/alecthomas/participle/v2 v2.0.0-alpha7 h1:cK4vjj0VSgb3lN1nuKA5F7dw+1s1pWBe5bx7nNCnN+c= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= -github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/apache/arrow/go/arrow v0.0.0-20191024131854-af6fa24be0db/go.mod h1:VTxUBvSJ3s3eHAg65PNgrsn5BtqCRPdmyXh6rAfdxN0= github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-metrics v0.4.0 h1:yCQqn7dwca4ITXb+CbubHmedzaQYHhNhrEXLYUeEe8Q= -github.com/armon/go-metrics v0.4.0/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= +github.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA= +github.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= @@ -131,59 +104,45 @@ github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN github.com/aws/aws-sdk-go v1.40.45 h1:QN1nsY27ssD/JmW4s83qmSb+uL6DG4GmCDzjmJB4xUI= github.com/aws/aws-sdk-go v1.40.45/go.mod h1:585smgzpB/KqRA+K3y/NL/oYRqQvpNJYvLm+LY1U59Q= github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= -github.com/aws/aws-sdk-go-v2 v1.2.0/go.mod h1:zEQs02YRBw1DjK0PoJv3ygDYOFTre1ejlJWl8FwAuQo= -github.com/aws/aws-sdk-go-v2/config v1.1.1/go.mod h1:0XsVy9lBI/BCXm+2Tuvt39YmdHwS5unDQmxZOYe8F5Y= -github.com/aws/aws-sdk-go-v2/credentials v1.1.1/go.mod h1:mM2iIjwl7LULWtS6JCACyInboHirisUUdkBPoTHMOUo= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.0.2/go.mod h1:3hGg3PpiEjHnrkrlasTfxFqUsZ2GCk/fMUn4CbKgSkM= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.0.2/go.mod h1:45MfaXZ0cNbeuT0KQ1XJylq8A6+OpVV2E5kvY/Kq+u8= -github.com/aws/aws-sdk-go-v2/service/route53 v1.1.1/go.mod h1:rLiOUrPLW/Er5kRcQ7NkwbjlijluLsrIbu/iyl35RO4= -github.com/aws/aws-sdk-go-v2/service/sso v1.1.1/go.mod h1:SuZJxklHxLAXgLTc1iFXbEWkXs7QRTQpCLGaKIprQW0= -github.com/aws/aws-sdk-go-v2/service/sts v1.1.1/go.mod h1:Wi0EBZwiz/K44YliU0EKxqTCJGUfYTWXrrBwkq736bM= -github.com/aws/smithy-go v1.1.0/go.mod h1:EzMw8dbp/YJL4A5/sbhGddag+NPT7q084agLbB9LgIw= -github.com/babylonchain/ibc-go/v5 v5.0.1-0.20221107054049-dbf7e4efe6fd h1:0y7HPL7xb/N1Oa/q5cQJ80K3ZfnQoKSG5sveZwpm0/E= -github.com/babylonchain/ibc-go/v5 v5.0.1-0.20221107054049-dbf7e4efe6fd/go.mod h1:Wqsguq98Iuns8tgTv8+xaGYbC+Q8zJfbpjzT6IgMJbs= +github.com/babylonchain/ibc-go/v7 v7.0.0-20230222123128-9fc81e93ac35 h1:RzddJDVLAmhKK4BXAOMDgms0bkG+l+HkWWDgsxFIP4k= +github.com/babylonchain/ibc-go/v7 v7.0.0-20230222123128-9fc81e93ac35/go.mod h1:cD4Mltu+wH/FRXKaUP3tf0K/CzVoBp9e0r4x8OLUuSo= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d h1:xDfNPAt8lFiC1UJrqV3uuy861HCTo708pDMbjHHdCas= github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d/go.mod h1:6QX/PXZ00z/TKoufEY6K/a0k6AhaJrQKdFe6OfVXsa4= -github.com/bgentry/speakeasy v0.1.0 h1:ByYyxL9InA1OWqxJqqp2A5pYHUrCiAL6K3J+LKSsQkY= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bmizerany/pat v0.0.0-20170815010413-6226ea591a40/go.mod h1:8rLXio+WjiTceGBHIoTvn60HIbs7Hm7bcHjyrSqYB9c= +github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 h1:41iFGWnSlI2gVpmOtVTJZNodLdLQLn/KsJqFvXwnd/s= +github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/boljen/go-bitmap v0.0.0-20151001105940-23cd2fb0ce7d h1:zsO4lp+bjv5XvPTF58Vq+qgmZEYZttJK+CWtSZhKenI= github.com/boljen/go-bitmap v0.0.0-20151001105940-23cd2fb0ce7d/go.mod h1:f1iKL6ZhUWvbk7PdWVmOaak10o86cqMUYEmn1CZNGEI= -github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= -github.com/btcsuite/btcd v0.0.0-20190115013929-ed77733ec07d/go.mod h1:d3C0AkH6BRcvO8T0UEPu53cnw4IbV63x1bEjildYhO0= -github.com/btcsuite/btcd v0.0.0-20190315201642-aa6e0f35703c/go.mod h1:DrZx5ec/dmnfpw9KyYoQyYo7d0KEvTkk/5M/vbZjAr8= github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= -github.com/btcsuite/btcd v0.21.0-beta.0.20201114000516-e9c7a5ac6401/go.mod h1:Sv4JPQ3/M+teHz9Bo5jBpkNcP0x6r7rdihlNL/7tTAs= -github.com/btcsuite/btcd v0.22.1/go.mod h1:wqgTSL29+50LRkmOVknEdmt8ZojIzhuWvgu/iptuN7Y= -github.com/btcsuite/btcd v0.22.3 h1:kYNaWFvOw6xvqP0vR20RP1Zq1DVMBxEO8QN5d1/EfNg= -github.com/btcsuite/btcd v0.22.3/go.mod h1:wqgTSL29+50LRkmOVknEdmt8ZojIzhuWvgu/iptuN7Y= -github.com/btcsuite/btcd/btcec/v2 v2.1.2/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJkZBd6mui8ZsAZE= +github.com/btcsuite/btcd v0.22.0-beta.0.20220111032746-97732e52810c/go.mod h1:tjmYdS6MLJ5/s0Fj4DbLgSbDHbEqLJrtnHecBFkdz5M= +github.com/btcsuite/btcd v0.23.0/go.mod h1:0QJIIN1wwIXF/3G/m87gIwGniDMDQqjVn4SZgnFpsYY= +github.com/btcsuite/btcd v0.23.4 h1:IzV6qqkfwbItOS/sg/aDfPDsjPP8twrCOE2R93hxMlQ= +github.com/btcsuite/btcd v0.23.4/go.mod h1:0QJIIN1wwIXF/3G/m87gIwGniDMDQqjVn4SZgnFpsYY= +github.com/btcsuite/btcd/btcec/v2 v2.1.0/go.mod h1:2VzYrv4Gm4apmbVVsSq5bqf1Ec8v56E48Vt0Y/umPgA= +github.com/btcsuite/btcd/btcec/v2 v2.1.3/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJkZBd6mui8ZsAZE= +github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= +github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= +github.com/btcsuite/btcd/btcutil v1.0.0/go.mod h1:Uoxwv0pqYWhD//tfTiipkxNfdhG9UrLwaeswfjfdF0A= +github.com/btcsuite/btcd/btcutil v1.1.0/go.mod h1:5OapHB7A2hBBWLm48mmw4MOHNJCcUBTwmWH/0Jn8VHE= +github.com/btcsuite/btcd/btcutil v1.1.2 h1:XLMbX8JQEiwMcYft2EGi8zPUkoa0abKIU6/BJSRsjzQ= +github.com/btcsuite/btcd/btcutil v1.1.2/go.mod h1:UR7dsSJzJUfMmFiiLlIrMq1lS9jh9EdCV7FStZSnpi0= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f h1:bAs4lUbRJpnnkd9VhRV3jjAVU7DJVjMaK+IsvSeZvFo= github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= -github.com/btcsuite/btcutil v0.0.0-20180706230648-ab6388e0c60a/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= -github.com/btcsuite/btcutil v0.0.0-20190207003914-4c204d697803/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= -github.com/btcsuite/btcutil v1.0.2/go.mod h1:j9HUFwoQRsZL3V4n+qG+CUnEGHOarIxfC3Le2Yhbcts= -github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce h1:YtWJF7RHm2pYCvA5t0RPmAaLUhREsKuKd+SLhxFbFeQ= -github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce/go.mod h1:0DVlHczLPewLcPGEIeUEzfOJhqGPQ0mJJRDBtD307+o= github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= -github.com/btcsuite/goleveldb v1.0.0 h1:Tvd0BfvqX9o823q1j2UZ/epQo09eJh6dTcRp79ilIN4= github.com/btcsuite/goleveldb v1.0.0/go.mod h1:QiK9vBlgftBg6rWQIj6wFzbPfRjiykIEhBH4obrXJ/I= github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= -github.com/btcsuite/snappy-go v1.0.0 h1:ZxaA6lo2EpxGddsA8JwWOcxlzRybb444sgmeJQMJGQE= github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= -github.com/bwesterb/go-ristretto v1.2.0/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= -github.com/c-bata/go-prompt v0.2.2/go.mod h1:VzqtzE2ksDBcdln8G7mk2RX9QyGjH+OVqOCSiVIqS34= github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= @@ -191,7 +150,6 @@ github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInq github.com/cenkalti/backoff/v4 v4.2.0 h1:HN5dHm3WBOgndBH6E8V0q2jIYIR3s9yglV8k/+MN3u4= github.com/cenkalti/backoff/v4 v4.2.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= @@ -210,27 +168,19 @@ github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6D github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cloudflare/cloudflare-go v0.14.0/go.mod h1:EnwdgGMaFOruiPZRFSgn+TsQ3hQ7C/YWzIGLeu5c304= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/apd/v2 v2.0.2 h1:weh8u7Cneje73dDh+2tEVLUvyBc89iwepWCD8b8034E= github.com/cockroachdb/apd/v2 v2.0.2/go.mod h1:DDxRlzC2lo3/vSlmSoS7JkqbbrARPuFOGr0B9pvN3Gw= +github.com/cockroachdb/apd/v3 v3.1.0 h1:MK3Ow7LH0W8zkd5GMKA1PvS9qG3bWFI95WaVNfyZJ/w= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= -github.com/coinbase/kryptology v1.8.0/go.mod h1:RYXOAPdzOGUe3qlSFkMGn58i3xUA8hmxYHksuq+8ciI= -github.com/coinbase/rosetta-sdk-go v0.7.9 h1:lqllBjMnazTjIqYrOGv8h8jxjg9+hJazIGZr9ZvoCcA= -github.com/coinbase/rosetta-sdk-go v0.7.9/go.mod h1:0/knutI7XGVqXmmH4OQD8OckFrbQ8yMsUZTG7FXCR2M= -github.com/consensys/bavard v0.1.8-0.20210406032232-f3452dc9b572/go.mod h1:Bpd0/3mZuaj6Sj+PqrmIquiOKy397AKGThQPaGzNXAQ= -github.com/consensys/bavard v0.1.8-0.20210915155054-088da2f7f54a/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= -github.com/consensys/gnark-crypto v0.4.1-0.20210426202927-39ac3d4b3f1f/go.mod h1:815PAHg3wvysy0SyIqanF8gZ0Y1wjk/hrDHD/iT88+Q= -github.com/consensys/gnark-crypto v0.5.3/go.mod h1:hOdPlWQV1gDLp7faZVeg8Y0iEPFaOUnCc4XeCCk96p0= github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= github.com/containerd/continuity v0.3.0 h1:nisirsYROK15TAMVukJOUyGJjz4BNQJBVsNvAXZJ/eg= github.com/containerd/continuity v0.3.0/go.mod h1:wJEAIwKOm/pBZuBd0JmeTvnLquTB1Ag8espWhkykbPM= @@ -241,71 +191,70 @@ github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7 github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/go-systemd/v22 v22.3.3-0.20220203105225-a9a7ef127534/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cosmos/btcutil v1.0.4 h1:n7C2ngKXo7UC9gNyMNLbzqz7Asuf+7Qv4gnX/rOdQ44= -github.com/cosmos/btcutil v1.0.4/go.mod h1:Ffqc8Hn6TJUdDgHBwIZLtrLQC1KdJ9jGJl/TvgUaxbU= -github.com/cosmos/cosmos-proto v1.0.0-alpha7 h1:yqYUOHF2jopwZh4dVQp3xgqwftE5/2hkrwIV6vkUbO0= -github.com/cosmos/cosmos-proto v1.0.0-alpha7/go.mod h1:dosO4pSAbJF8zWCzCoTWP7nNsjcvSUBQmniFxDg5daw= -github.com/cosmos/cosmos-sdk v0.46.6 h1:K9EZsqOZ2jQX3bIQUpn7Hk/YCoaJWRLU56PzvpX8INk= -github.com/cosmos/cosmos-sdk v0.46.6/go.mod h1:JNklMfXo7MhDF1j/jxZCmDyOYyqhVoKB22e8p1ATEqA= +github.com/cosmos/btcutil v1.0.5 h1:t+ZFcX77LpKtDBhjucvnOH8C2l2ioGsBNEQ3jef8xFk= +github.com/cosmos/btcutil v1.0.5/go.mod h1:IyB7iuqZMJlthe2tkIFL33xPyzbFYP0XVdS8P5lUPis= +github.com/cosmos/cosmos-proto v1.0.0-beta.1 h1:iDL5qh++NoXxG8hSy93FdYJut4XfgbShIocllGaXx/0= +github.com/cosmos/cosmos-proto v1.0.0-beta.1/go.mod h1:8k2GNZghi5sDRFw/scPL8gMSowT1vDA+5ouxL8GjaUE= +github.com/cosmos/cosmos-sdk v0.47.0-rc2 h1:BwQC41zQXG/pN9DdLaWzYJrC911St5lYOQIoW4Hf5wQ= +github.com/cosmos/cosmos-sdk v0.47.0-rc2/go.mod h1:e0ZEpY/nhVoXAkijdHPdFOJNOXCddfvyFrFLp2QmCCY= github.com/cosmos/cosmos-sdk/ics23/go v0.8.0 h1:iKclrn3YEOwk4jQHT2ulgzuXyxmzmPczUalMwW4XH9k= github.com/cosmos/cosmos-sdk/ics23/go v0.8.0/go.mod h1:2a4dBq88TUoqoWAU5eu0lGvpFP3wWDPgdHPargtyw30= github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d/go.mod h1:tSxLoYXyBmiFeKpvmq4dzayMdCjCnu8uqmCysIGBT2Y= github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY= github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw= +github.com/cosmos/gogogateway v1.2.0 h1:Ae/OivNhp8DqBi/sh2A8a1D0y638GpL3tkmLQAiKxTE= +github.com/cosmos/gogogateway v1.2.0/go.mod h1:iQpLkGWxYcnCdz5iAdLcRBSw3h7NXeOkZ4GUkT+tbFI= +github.com/cosmos/gogoproto v1.4.2/go.mod h1:cLxOsn1ljAHSV527CHOtaIP91kK6cCrZETRBrkzItWU= +github.com/cosmos/gogoproto v1.4.4 h1:nVAsgLlAf5jeN0fV7hRlkZvf768zU+dy4pG+hxc2P34= +github.com/cosmos/gogoproto v1.4.4/go.mod h1:/yl6/nLwsZcZ2JY3OrqjRqvqCG9InUMcXRfRjQiF9DU= github.com/cosmos/gorocksdb v1.2.0 h1:d0l3jJG8M4hBouIZq0mDUHZ+zjOx044J3nGRskwTb4Y= github.com/cosmos/gorocksdb v1.2.0/go.mod h1:aaKvKItm514hKfNJpUJXnnOWeBnk2GL4+Qw9NHizILw= -github.com/cosmos/iavl v0.19.4 h1:t82sN+Y0WeqxDLJRSpNd8YFX5URIrT+p8n6oJbJ2Dok= -github.com/cosmos/iavl v0.19.4/go.mod h1:X9PKD3J0iFxdmgNLa7b2LYWdsGd90ToV5cAONApkEPw= +github.com/cosmos/iavl v0.19.5-rc.1 h1:4PjF2PdScyPbN1WbXpiQU21YtyonnrMU31xN74g8Rkg= +github.com/cosmos/iavl v0.19.5-rc.1/go.mod h1:X9PKD3J0iFxdmgNLa7b2LYWdsGd90ToV5cAONApkEPw= +github.com/cosmos/ics23/go v0.9.1-0.20221207100636-b1abd8678aab h1:I9ialKTQo7248V827Bba4OuKPmk+FPzmTVHsLXaIJWw= +github.com/cosmos/ics23/go v0.9.1-0.20221207100636-b1abd8678aab/go.mod h1:2CwqasX5dSD7Hbp/9b6lhK6BwoBDCBldx7gPKRukR60= github.com/cosmos/keyring v1.1.7-0.20210622111912-ef00f8ac3d76 h1:DdzS1m6o/pCqeZ8VOAit/gyATedRgjvkVI+UCrLpyuU= github.com/cosmos/keyring v1.1.7-0.20210622111912-ef00f8ac3d76/go.mod h1:0mkLWIoZuQ7uBoospo5Q9zIpqq6rYCPJDSUdeCJvPM8= -github.com/cosmos/ledger-cosmos-go v0.11.1 h1:9JIYsGnXP613pb2vPjFeMMjBI5lEDsEaF6oYorTy6J4= -github.com/cosmos/ledger-cosmos-go v0.11.1/go.mod h1:J8//BsAGTo3OC/vDLjMRFLW6q0WAaXvHnVc7ZmE8iUY= -github.com/cosmos/ledger-go v0.9.2 h1:Nnao/dLwaVTk1Q5U9THldpUMMXU94BOTWPddSmVB6pI= -github.com/cosmos/ledger-go v0.9.2/go.mod h1:oZJ2hHAZROdlHiwTg4t7kP+GKIIkBT+o6c9QWFanOyI= +github.com/cosmos/ledger-cosmos-go v0.12.1 h1:sMBxza5p/rNK/06nBSNmsI/WDqI0pVJFVNihy1Y984w= +github.com/cosmos/ledger-cosmos-go v0.12.1/go.mod h1:dhO6kj+Y+AHIOgAe4L9HL/6NDdyyth4q238I9yFpD2g= +github.com/cosmos/rosetta-sdk-go v0.9.0 h1:3mj2naR+GUhUXabtb96WWSsPFZDCYkdtp6r0jffgugg= +github.com/cosmos/rosetta-sdk-go v0.9.0/go.mod h1:2v41yXL25xxAXrczVSnbDHcQH9CgildruDlGQGKW/JU= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creachadair/taskgroup v0.3.2 h1:zlfutDS+5XG40AOxcHDSThxKzns8Tnr9jnr6VqkYlkM= github.com/creachadair/taskgroup v0.3.2/go.mod h1:wieWwecHVzsidg2CsUnFinW1faVN4+kq+TDlRJQ0Wbk= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.11 h1:07n33Z8lZxZ2qwegKbObQohDhXDQxiMMz1NOUGYlesw= -github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4= +github.com/cucumber/common/gherkin/go/v22 v22.0.0 h1:4K8NqptbvdOrjL9DEea6HFjSpbdT9+Q5kgLpmmsHYl0= +github.com/cucumber/common/messages/go/v17 v17.1.1 h1:RNqopvIFyLWnKv0LfATh34SWBhXeoFTJnSrgm9cT/Ts= github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= github.com/danieljoos/wincred v1.0.2/go.mod h1:SnuYRW9lp1oJrZX/dXJqr0cPK5gYXqx3EJbmjhLdK9U= github.com/danieljoos/wincred v1.1.2 h1:QLdCxFs1/Yl4zduvBdcHB8goaYk9RARS2SgLLRuAyr0= github.com/danieljoos/wincred v1.1.2/go.mod h1:GijpziifJoIBfYh+S7BbkdUTU4LfM+QnGqR5Vl2tAx0= -github.com/dave/jennifer v1.2.0/go.mod h1:fIb+770HOpJ2fmN9EPPKOqm1vMGhB+TwXKMZhrIygKg= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/deckarep/golang-set v1.8.0/go.mod h1:5nI87KwE7wgsBU1F4GKAw2Qod7p5kyS383rP6+o6qqo= +github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= -github.com/deepmap/oapi-codegen v1.6.0/go.mod h1:ryDa9AgbELGeB+YEXE1dR53yAjHwFvE9iAUlWl9Al3M= -github.com/deepmap/oapi-codegen v1.8.2/go.mod h1:YLgSKSDv/bZQB7N4ws6luhozi3cEdRktEqrX88CvjIw= github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f h1:U5y3Y5UE0w7amNe7Z5G/twsBW0KEalRQXZzf8ufSh9I= github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f/go.mod h1:xH/i4TFMt8koVQZ6WFms69WAsDWr2XsYL3Hkl7jkoLE= github.com/dgraph-io/badger/v2 v2.2007.4 h1:TRWBQg8UrlUhaFdco01nO2uXwzKS7zd+HVdwV/GHc4o= github.com/dgraph-io/badger/v2 v2.2007.4/go.mod h1:vSw/ax2qojzbN6eXHIx6KPKtCSHJN/Uz0X0VPruTIhk= github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= -github.com/dgraph-io/ristretto v0.0.3/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= -github.com/dgraph-io/ristretto v0.1.0 h1:Jv3CGQHp9OjuMBSne1485aDpUkTKEcUqF+jm/LuerPI= -github.com/dgraph-io/ristretto v0.1.0/go.mod h1:fux0lOrBhrVCJd3lcTHsIJhq1T2rokOu6v9Vcb3Q9ug= +github.com/dgraph-io/ristretto v0.1.1 h1:6CWw5tJNgpegArSHpNHJKldNeq03FQCwYvfMVWajOK8= +github.com/dgraph-io/ristretto v0.1.1/go.mod h1:S1GPSBCYCIhmVNfcth17y2zZtQT6wzkzgwUve0VDWWA= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-bitstream v0.0.0-20180413035011-3522498ce2c8/go.mod h1:VMaSuZ+SZcx/wljOQKvp5srsbCiKDEb6K2wC4+PiBmQ= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WAFKLNi6ZS0675eEUC9y3AlwSbQu1Y= github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/dlclark/regexp2 v1.4.1-0.20201116162257-a2a8dda75c91/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= -github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= -github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= github.com/docker/cli v20.10.21+incompatible h1:qVkgyYUnOLQ98LtXBrwd/duVqPT2X4SHndOuGsfwyhU= github.com/docker/cli v20.10.21+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= -github.com/docker/docker v1.4.2-0.20180625184442-8e610b2b55bf/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker v20.10.21+incompatible h1:UTLdBmHk3bEY+w8qeO5KttOhy6OmXWsl/FEet9Uswog= github.com/docker/docker v20.10.21+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= @@ -313,8 +262,6 @@ github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5Xh github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/dop251/goja v0.0.0-20211011172007-d99e4b8cbf48/go.mod h1:R9ET47fwRVRPZnOGvHxxhuZcbrMCuiqOz3Rlrh4KSnk= -github.com/dop251/goja_nodejs v0.0.0-20210225215109-d91c329300e7/go.mod h1:hn7BA7c8pLvoGndExHudxTDKZ84Pyvv+90pbBjbTz0Y= github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac h1:opbrjaN/L8gg6Xh5D04Tem+8xVcz6ajZlGCs49mQgyg= @@ -325,7 +272,6 @@ github.com/dvsekhvalnov/jose2go v1.5.0/go.mod h1:QsHjhyTlD/lAVqn/NSbVZmSCGeDehTB github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= -github.com/eclipse/paho.mqtt.golang v1.2.0/go.mod h1:H9keYFcgq3Qr5OUJm/JZI/i6U7joQ8SYLhZwfeOo6Ts= github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= @@ -333,21 +279,16 @@ github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.m github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/ethereum/go-ethereum v1.10.17/go.mod h1:Lt5WzjM07XlXc95YzrhosmR4J9Ahd6X2wyEV2SvGhk0= github.com/facebookgo/ensure v0.0.0-20200202191622-63f1cf65ac4c h1:8ISkoahWXwZR41ois5lSJBSVw4D0OV19Ht/JSTzvSv0= github.com/facebookgo/stack v0.0.0-20160209184415-751773369052 h1:JWuenKqqX8nojtoVVWjGfOF9635RETekkoH6Cc9SX0A= github.com/facebookgo/subset v0.0.0-20200203212716-c811ad88dec4 h1:7HZCaLC5+BZpmbhCOZJ293Lz68O7PYrF2EzeiFMwCLk= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/felixge/httpsnoop v1.0.1 h1:lvB5Jl89CsZtGIWuTcDM1E/vkVs49/Ml7JJe07l8SPQ= github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= -github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= +github.com/felixge/httpsnoop v1.0.2 h1:+nS9g82KMXccJ/wp0zyRW9ZBHFETmMGtkk+2CTTrW4o= +github.com/felixge/httpsnoop v1.0.2/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= @@ -355,19 +296,13 @@ github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= -github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= -github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= -github.com/getkin/kin-openapi v0.53.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= -github.com/getkin/kin-openapi v0.61.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= +github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= +github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= github.com/gin-gonic/gin v1.7.0 h1:jGB9xAJQ12AIGNB4HguylppmDK1Am9ppF7XnGXXJuoU= github.com/gin-gonic/gin v1.7.0/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY= -github.com/glycerine/go-unsnap-stream v0.0.0-20180323001048-9f0cb55181dd/go.mod h1:/20jfyN9Y5QPEAprSgKAUr+glWDY39ZiUEAYOEv5dsE= -github.com/glycerine/goconvey v0.0.0-20190410193231-58a59202ab31/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24= -github.com/go-chi/chi/v5 v5.0.0/go.mod h1:BBug9lr0cqtdAhsu6R4AAdvufI0/XBzAQSsUqJpoZOs= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -385,9 +320,6 @@ github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-logfmt/logfmt v0.5.1 h1:otpy5pqBCBZ1ng9RQ0dPu4PN7ba75Y/aA+UpowDyNVA= github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= -github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= -github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q= github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= @@ -395,9 +327,7 @@ github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD87 github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= github.com/go-playground/validator/v10 v10.4.1 h1:pH2c5ADXtd66mxoE0Zm9SUhxE20r7aM3F26W0hOn+GE= github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= -github.com/go-sourcemap/sourcemap v2.1.3+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= -github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee h1:s+21KNqlpePfkah2I+gwHF8xmJWRjooY+5248k6m4A0= @@ -410,13 +340,11 @@ github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 h1:ZpnhV/YsD2/4cESfV5+ github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godbus/dbus/v5 v5.0.6/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gofrs/uuid v3.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/gogo/gateway v1.1.0 h1:u0SuhL9+Il+UbjM9VIE3ntfRujKbvVpFvNB4HbjeVQ0= -github.com/gogo/gateway v1.1.0/go.mod h1:S7rR8FRQyG3QFESeSv4l2WnsyzlCLG0CzBbUUo/mbic= +github.com/gofrs/uuid v4.3.0+incompatible h1:CaSVZxm5B+7o45rtab4jC2G37WGYX1zQfuU2i6DSvnc= +github.com/gofrs/uuid v4.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= -github.com/golang-jwt/jwt/v4 v4.3.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= -github.com/golang/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI= +github.com/gogo/googleapis v1.4.1-0.20201022092350-68b0159b7869 h1:kRpU4zq+Pzh4feET49aEWPOzwQy3U2SsbZEQ7QEcif0= +github.com/gogo/googleapis v1.4.1-0.20201022092350-68b0159b7869/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/glog v1.0.0 h1:nfP3RFugxnNRyKgeWd4oI1nYvXpxrx8ck8ZrcizshdQ= github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= @@ -433,7 +361,6 @@ github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -452,19 +379,16 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219/go.mod h1:/X8TswGSh1pIozq4ZwCfxS0WA5JGXguxk94ar/4c87Y= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4= -github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= -github.com/google/flatbuffers v1.11.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU= +github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= @@ -477,20 +401,16 @@ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.1.1-0.20200604201612-c04b05f3adfa h1:Q75Upo5UN4JbPFURXZ8nLKYUvF85dyFRop/vQ0Rv+64= -github.com/google/gofuzz v1.1.1-0.20200604201612-c04b05f3adfa/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.2.1 h1:d8MncMlErDFTwQGBK1xhv026j9kqhvw1Qv9IbWT1VLQ= -github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/orderedcode v0.0.1 h1:UzfcAexk9Vhv8+9pNOgRu41f16lHq725vPwnSeiG/Us= github.com/google/orderedcode v0.0.1/go.mod h1:iVyU4/qPKHY5h/wSd6rZZCDcLJNxiWO6dvsYES2Sb20= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= @@ -503,33 +423,19 @@ github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= -github.com/googleapis/enterprise-certificate-proxy v0.1.0 h1:zO8WHNx/MYiAKJ3d5spxZXZE6KHmIQGQcAzwUzV7qQw= -github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= +github.com/googleapis/enterprise-certificate-proxy v0.2.1 h1:RY7tHKZcRlk788d5WSo/e83gOyyy742E8GSs771ySpg= +github.com/googleapis/enterprise-certificate-proxy v0.2.1/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= -github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= -github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= -github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= -github.com/googleapis/gax-go/v2 v2.4.0 h1:dS9eYAjhrE2RjmzYw2XAPvcXfmcQLtFEQWn0CR82awk= -github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= -github.com/googleapis/go-type-adapters v1.0.0 h1:9XdMn+d/G57qq1s8dNc5IesGCXHf6V2HZ2JwRxfA2tA= -github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= +github.com/googleapis/gax-go/v2 v2.7.0 h1:IcsPKeInNvYi7eqSaDjiZqDDKu5rsmunY0Y1YupQSSQ= +github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= @@ -541,16 +447,13 @@ github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/graph-gophers/graphql-go v1.3.0/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc= github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.2.2/go.mod h1:EaizFBKfUKtMIF5iaDEhniwNedqGo9FuLFzppDr3uwI= github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw= github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.8.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= @@ -564,13 +467,12 @@ github.com/gtank/ristretto255 v0.1.2/go.mod h1:Ph5OpO6c7xKUGROZfWVLiJf9icMDwUeIv github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-bexpr v0.1.10/go.mod h1:oxlubA2vC/gFVfX1A6JGp7ls7uCDlfJn732ehYYg+g0= github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hashicorp/go-getter v1.6.1 h1:NASsgP4q6tL94WH6nJxKWj8As2H/2kop/bB1d8JMyRY= -github.com/hashicorp/go-getter v1.6.1/go.mod h1:IZCrswsZPeWv9IkVnLElzRU/gz/QPi6pZHn4tv6vbwA= +github.com/hashicorp/go-getter v1.6.2 h1:7jX7xcB+uVCliddZgeKyNxv0xoT7qL5KDtH7rU4IqIk= +github.com/hashicorp/go-getter v1.6.2/go.mod h1:IZCrswsZPeWv9IkVnLElzRU/gz/QPi6pZHn4tv6vbwA= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= @@ -602,12 +504,12 @@ github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2p github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/hdevalence/ed25519consensus v0.0.0-20220222234857-c00d1f31bab3 h1:aSVUgRRRtOrZOC1fYmY9gV0e9z/Iu+xNVSASWjsuyGU= github.com/hdevalence/ed25519consensus v0.0.0-20220222234857-c00d1f31bab3/go.mod h1:5PC6ZNPde8bBqU/ewGZig35+UIZtw9Ytxez8/q5ZyFE= -github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= -github.com/holiman/uint256 v1.2.0/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/huandu/go-assert v1.1.5 h1:fjemmA7sSfYHJD7CUqs9qTwwfdNAx7/j2/ZlHXzNB3c= +github.com/huandu/go-assert v1.1.5/go.mod h1:yOLvuqZwmcHIC5rIzrBhT7D3Q9c3GFnd0JrPVhn/06U= +github.com/huandu/skiplist v1.2.0 h1:gox56QD77HzSC0w+Ws3MH3iie755GBJU1OER3h5VsYw= +github.com/huandu/skiplist v1.2.0/go.mod h1:7v3iFjLcSAzO4fN5B8dvebvo/qsfumiLiDXMrPiHF9w= github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= -github.com/huin/goupnp v1.0.3-0.20220313090229-ca81a64b4204/go.mod h1:ZxNlw5WqJj6wSsRK5+YfflQGXYfccj5VgQsMNixHM7Y= -github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk= @@ -617,20 +519,7 @@ github.com/improbable-eng/grpc-web v0.15.0/go.mod h1:1sy9HKV4Jt9aEs9JSnkWlRJPuPt github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/inconshreveable/mousetrap v1.0.1 h1:U3uMjPSQEBMNp1lFxmllqCPM6P5u/Xq7Pgzkat/bFNc= github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/influxdata/flux v0.65.1/go.mod h1:J754/zds0vvpfwuq7Gc2wRdVwEodfpCFM7mYlOw2LqY= -github.com/influxdata/influxdb v1.8.3/go.mod h1:JugdFhsvvI8gadxOI6noqNeeBHvWNTbfYGtiAn+2jhI= -github.com/influxdata/influxdb-client-go/v2 v2.4.0/go.mod h1:vLNHdxTJkIf2mSLvGrpj8TCcISApPoXkaxP8g9uRlW8= github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= -github.com/influxdata/influxql v1.1.1-0.20200828144457-65d3ef77d385/go.mod h1:gHp9y86a/pxhjJ+zMjNXiQAA197Xk9wLxaz+fGG+kWk= -github.com/influxdata/line-protocol v0.0.0-20180522152040-32c6aa80de5e/go.mod h1:4kt73NQhadE3daL3WhR5EJ/J2ocX0PZzwxQ0gXJ7oFE= -github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= -github.com/influxdata/line-protocol v0.0.0-20210311194329-9aa0e372d097/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= -github.com/influxdata/promql/v2 v2.12.0/go.mod h1:fxOPu+DY0bqCTCECchSRtWfc+0X19ybifQhZoQNF5D8= -github.com/influxdata/roaring v0.4.13-0.20180809181101-fc520f41fab6/go.mod h1:bSgUQ7q5ZLSO+bKBGqJiCBGAl+9DxyW63zLTujjUlOE= -github.com/influxdata/tdigest v0.0.0-20181121200506-bf2b5ad3c0a9/go.mod h1:Js0mqiSBE6Ffsg94weZZ2c+v/ciT8QRHFOap7EKDrR0= -github.com/influxdata/usage-client v0.0.0-20160829180054-6d3895376368/go.mod h1:Wbbw6tYNvwa5dlB6304Sd+82Z3f7PmVZHVKU637d4po= -github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= -github.com/jedisct1/go-minisign v0.0.0-20190909160543-45766022959e/go.mod h1:G1CVv03EnqU1wYL2dFwXxW2An0az9JTl/ZsqXQeBlkU= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jhump/protoreflect v1.12.1-0.20220721211354-060cc04fc18b h1:izTof8BKh/nE1wrKOrloNA5q4odOarjf+Xpe+4qow98= @@ -657,28 +546,20 @@ github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnr github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/jsternberg/zap-logfmt v1.0.0/go.mod h1:uvPs/4X51zdkcm5jXl5SYoN+4RK21K8mysFmDaM/h+o= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= -github.com/jwilder/encoding v0.0.0-20170811194829-b4e1701a28ef/go.mod h1:Ct9fl0F6iIOGgxJ5npU/IUOhOhqlVrGjyIZc8/MagT0= -github.com/karalabe/usb v0.0.2/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= github.com/keybase/go-keychain v0.0.0-20190712205309-48d3d31d256d h1:Z+RDyXzjKE0i2sTjZ/b1uxiGtPhFy34Ou/Tk0qwN0kM= github.com/keybase/go-keychain v0.0.0-20190712205309-48d3d31d256d/go.mod h1:JJNrCn9otv/2QP4D7SMJBgaleKpOf66PnW6F5WGNRIc= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= -github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.11.2/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= -github.com/klauspost/compress v1.15.11 h1:Lcadnb3RKGin4FYM/orgq0qde+nc15E5Cbqg4B9Sx9c= -github.com/klauspost/compress v1.15.11/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= -github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= -github.com/klauspost/crc32 v0.0.0-20161016154125-cb6bfca970f6/go.mod h1:+ZoRqAPRLkC4NPOvfYeR5KNOrY6TD+/sAC3HXPZgDYg= -github.com/klauspost/pgzip v1.0.2-0.20170402124221-0bf5dcad4ada/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= +github.com/klauspost/compress v1.15.12 h1:YClS/PImqYbn+UILDnqxQCZ3RehC9N318SU3kElDUEM= +github.com/klauspost/compress v1.15.12/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= @@ -689,52 +570,32 @@ github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/labstack/echo/v4 v4.2.1/go.mod h1:AA49e0DZ8kk5jTOOCKNuPR6oTnBS0dYiM4FW1e6jwpg= -github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= -github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= -github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.10.6 h1:jbk+ZieJ0D7EVGJYpL9QTz7/YW6UHbmdnZWYyK5cdBs= -github.com/lib/pq v1.10.6/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lib/pq v1.10.7 h1:p7ZhMD+KsSRozJr34udlUrhboJwWAgCg34+/ZZNvZZw= +github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= -github.com/lucasjones/reggen v0.0.0-20180717132126-cdb49ff09d77/go.mod h1:5ELEyG+X8f+meRWHuqUOewBOhvHkl7M76pdGEansxW4= github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= -github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= +github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/manifoldco/promptui v0.9.0 h1:3V4HzJk1TtXW1MTZMP7mdlwbBpIinw3HztaIlYthEiA= github.com/manifoldco/promptui v0.9.0/go.mod h1:ka04sppxSGFAtxX0qhlYQjISsg9mR4GWtQEhdbn6Pgg= -github.com/matryer/moq v0.0.0-20190312154309-6cfb0558e1bd/go.mod h1:9ELz6aaclSIGnZBoaSLZ3NAl1VTufbOrXBPvtcy6WiQ= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= -github.com/mattn/go-tty v0.0.0-20180907095812-13ff1204f104/go.mod h1:XPvLUNfbS4fJH25nqRHfWLMa1ONC8Amw+mIA639KxkE= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= @@ -754,11 +615,8 @@ github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS4 github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= github.com/moby/sys/mountinfo v0.5.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU= github.com/moby/term v0.0.0-20221120202655-abb19827d345 h1:J9c53/kxIH+2nTKBEfZYFMlhghtHpIHSXpm5VRGHSnU= github.com/moby/term v0.0.0-20221120202655-abb19827d345/go.mod h1:15ce4BGCFxt7I5NQKT+HV0yEDxmf6fSysfEDiVo3zFM= @@ -769,17 +627,13 @@ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lN github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= -github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae/go.mod h1:qAyveg+e4CE+eKJXWVjKXM4ck2QobLqTDytGJbLLhJg= github.com/mtibben/percent v0.2.1 h1:5gssi8Nqo8QU/r2pynCm+hBQHpkB/uNK7BJCFogWdzs= github.com/mtibben/percent v0.2.1/go.mod h1:KG9uO+SZkUp+VkRHsCdYQV3XSZrrSpR3O9ibNBTZrns= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/grpc-proxy v0.0.0-20181017164139-0f1106ef9c76/go.mod h1:x5OoJHDHqxHS801UIuhqGl6QdSAEJvtausosHSdazIo= -github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= -github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= @@ -787,25 +641,22 @@ github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzE github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= -github.com/neilotoole/errgroup v0.1.6/go.mod h1:Q2nLGf+594h0CLBs/Mbg6qOr7GtqDK7C2S41udRnToE= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= -github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.14.0 h1:2mOpI4JVVPBN+WQRa0WKH2eXR+Ey+uK4n7Zj0aYpIQA= github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= +github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.10.1 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.20.0 h1:8W0cWlwFkflGPLltQvLRB7ZVD5HuP6ng320w2IS245Q= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= @@ -818,7 +669,6 @@ github.com/opencontainers/selinux v1.10.0/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuh github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/opentracing/opentracing-go v1.0.3-0.20180606204148-bd9c31933947/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= @@ -831,30 +681,21 @@ github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIw github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/paulbellamy/ratecounter v0.2.0/go.mod h1:Hfx1hDpSGoqxkVVpBi/IlYD7kChlfo5C6hzIHwPqfFE= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= -github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml/v2 v2.0.5 h1:ipoSadvV8oGUjnUbMub59IDPPwfxF694nG/jwbMiyQg= -github.com/pelletier/go-toml/v2 v2.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaFVNZzmWyNfXas= +github.com/pelletier/go-toml/v2 v2.0.6 h1:nrzqCb7j9cDFj2coyLNLaZuJTLjWjlaz6nvTvIwycIU= +github.com/pelletier/go-toml/v2 v2.0.6/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek= github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= -github.com/peterh/liner v1.0.1-0.20180619022028-8c1271fcf47f/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc= -github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5 h1:q2e307iGHPdTGp0hoxKjt1H5pDo6utceo3dQVK3I5XQ= github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5/go.mod h1:jvVRKCrJTQWu0XVbaOlby/2lO20uSCHEMzzplHXte1o= -github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= -github.com/philhofer/fwd v1.1.1/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= -github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= -github.com/pkg/term v0.0.0-20180730021639-bffc007b7fd5/go.mod h1:eCbImbZ95eXtAUIbLAuAVnBnwf83mjf6QIVH8SHYwqQ= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= @@ -866,27 +707,26 @@ github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3O github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= -github.com/prometheus/client_golang v1.12.2 h1:51L9cDoUHVrXx4zWYlcLQIZ+d+VXHgqnYKkIuq4g/34= -github.com/prometheus/client_golang v1.12.2/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= +github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw= +github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= +github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.34.0 h1:RBmGO9d/FVjqHT0yUGQwBJhkwKV+wPCn7KGpvfab0uE= -github.com/prometheus/common v0.34.0/go.mod h1:gB3sOl7P0TvJabZpLY5uQMpUqRCPPCyRLCZYc7JZTNE= +github.com/prometheus/common v0.37.0 h1:ccBbHCgIiT9uSoFY0vX8H3zsNR5eLt17/RQLUvn8pXE= +github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= @@ -897,29 +737,24 @@ github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1 github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo= github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/rakyll/statik v0.1.7 h1:OF3QCZUuyPxuGEP7B4ypUa7sB/iHtqOTDYZXGM8KOdQ= github.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= -github.com/regen-network/cosmos-proto v0.3.1 h1:rV7iM4SSFAagvy8RiyhiACbWEGotmqzywPxOvwMdxcg= -github.com/regen-network/cosmos-proto v0.3.1/go.mod h1:jO0sVX6a1B36nmE8C9xBFXpNwWejXC7QqCOnH3O0+YM= +github.com/regen-network/gocuke v0.6.2 h1:pHviZ0kKAq2U2hN2q3smKNxct6hS0mGByFMHGnWA97M= github.com/regen-network/protobuf v1.3.3-alpha.regen.1 h1:OHEc+q5iIAXpqiqFKeLpu5NwTIkVXUs48vFMwzqpqY4= github.com/regen-network/protobuf v1.3.3-alpha.regen.1/go.mod h1:2DjTFR1HhMQhiWC5sZ4OhQ3+NtdbZ6oBDKQwq5Ou+FI= -github.com/retailnext/hllpp v1.0.1-0.20180308014038-101a6d2f8b52/go.mod h1:RDpi1RftBQPUCDRw6SmxeaREsAaRKnOclghuzp/WRzc= -github.com/rjeczalik/notify v0.9.1/go.mod h1:rKwnCoCGeuQnwBtTSPL9Dad03Vh2n40ePRrjvIXnJho= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.8.1 h1:geMPLpDpQOgVyCg5z5GoRwLHepNdb71NXb67XFkP+Eg= -github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/cors v1.8.2 h1:KCooALfAYGs415Cwu5ABvv9n9509fSiG5SQJn/AQo4U= github.com/rs/cors v1.8.2/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= -github.com/rs/xid v1.3.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -github.com/rs/zerolog v1.27.0 h1:1T7qCieN22GVc8S4Q2yuexzBb1EqjbgjSH9RohbMjKs= -github.com/rs/zerolog v1.27.0/go.mod h1:7frBqO0oezxmnO7GF86FY++uy8I0Tk/If5ni1G9Qc0U= +github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= +github.com/rs/zerolog v1.28.0 h1:MirSo27VyNi7RJYP3078AA1+Cyzd2GB66qy3aUHvsWY= +github.com/rs/zerolog v1.28.0/go.mod h1:NILgTygv/Uej1ra5XxGf82ZFSLk58MFGAUS2o6usyD0= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= @@ -929,11 +764,6 @@ github.com/sasha-s/go-deadlock v0.3.1 h1:sqv7fDNShgjcaxkO0JNcOAlr8B9+cV5Ey/OB71e github.com/sasha-s/go-deadlock v0.3.1/go.mod h1:F73l+cr82YSh10GxyRI6qZiCgK64VaZjwesgfQ1/iLM= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/seccomp/libseccomp-golang v0.9.2-0.20220502022130-f33da4d89646/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= -github.com/segmentio/fasthash v1.0.3/go.mod h1:waKX8l2N8yckOgmSsXJi7x1ZfdKZ4x7KRMzBtS3oedY= -github.com/segmentio/kafka-go v0.1.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= -github.com/segmentio/kafka-go v0.2.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= -github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= -github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= @@ -950,15 +780,15 @@ github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasO github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.8.2 h1:xehSyVa0YnHWsJ49JFljMpg1HX19V6NDZ1fkm1Xznbo= -github.com/spf13/afero v1.8.2/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo= +github.com/spf13/afero v1.9.3 h1:41FoI0fD7OR7mGcKE/aOiLkGreyf8ifIOQmJANWogMk= +github.com/spf13/afero v1.9.3/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= -github.com/spf13/cobra v1.6.0 h1:42a0n6jwCot1pUmomAp4T7DeMD+20LFv4Q54pxLf2LI= -github.com/spf13/cobra v1.6.0/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY= +github.com/spf13/cobra v1.6.1 h1:o94oiPyS4KD1mPy2fmcYYHHfCxLqYjJOhGsCHFZtEzA= +github.com/spf13/cobra v1.6.1/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= @@ -967,18 +797,17 @@ github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnIn github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= -github.com/spf13/viper v1.13.0 h1:BWSJ/M+f+3nmdz9bxB+bWX28kkALN2ok11D0rSo8EJU= -github.com/spf13/viper v1.13.0/go.mod h1:Icm2xNL3/8uyh/wFuB1jI7TiTNKp8632Nwegu+zgdYw= -github.com/status-im/keycard-go v0.0.0-20190316090335-8537d3370df4/go.mod h1:RZLeN1LMWmRsyYjvAu+I6Dm9QmlDaIIt+Y+4Kd7Tp+Q= +github.com/spf13/viper v1.15.0 h1:js3yy885G8xwJa6iOISGFwd+qlUo5AvyXb7CiihdtiU= +github.com/spf13/viper v1.15.0/go.mod h1:fFcTBJxvhhzSJiZy8n+PeW6t8l+KeT/uTARa0jHOQLA= github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -github.com/stretchr/objx v0.4.0 h1:M2gUjqZET1qApGOWNSnZ49BAIMX4F/1plDv3+l31EJ4= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/testify v1.2.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= @@ -986,39 +815,26 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5 github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/subosito/gotenv v1.4.1 h1:jyEFiXpy21Wm81FBN71l9VoMMV8H8jG+qIK3GCpY6Qs= -github.com/subosito/gotenv v1.4.1/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= +github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= +github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= github.com/supranational/blst v0.3.8 h1:glwLF4oBRSJOTr05lRBgNwGQST0ndP2wg29fSeTRKCY= github.com/supranational/blst v0.3.8/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= -github.com/tendermint/btcd v0.1.1 h1:0VcxPfflS2zZ3RiOAHkBiFUcPvbtRj5O7zHmcJWHV7s= -github.com/tendermint/btcd v0.1.1/go.mod h1:DC6/m53jtQzr/NFmMNEu0rxf18/ktVoVtMrnDD5pN+U= -github.com/tendermint/crypto v0.0.0-20191022145703-50d29ede1e15 h1:hqAk8riJvK4RMWx1aInLzndwxKalgi5rTqgfXxOxbEI= -github.com/tendermint/crypto v0.0.0-20191022145703-50d29ede1e15/go.mod h1:z4YtwM70uOnk8h0pjJYlj3zdYwi9l03By6iAIF5j/Pk= github.com/tendermint/go-amino v0.16.0 h1:GyhmgQKvqF82e2oZeuMSp9JTN0N09emoSZlb2lyGa2E= github.com/tendermint/go-amino v0.16.0/go.mod h1:TQU0M1i/ImAo+tYpZi73AU3V/dKeCoMC9Sphe2ZwGME= -github.com/tendermint/tendermint v0.34.24 h1:879MKKJWYYPJEMMKME+DWUTY4V9f/FBpnZDI82ky+4k= -github.com/tendermint/tendermint v0.34.24/go.mod h1:rXVrl4OYzmIa1I91av3iLv2HS0fGSiucyW9J4aMTpKI= +github.com/tendermint/tendermint v0.37.0-rc2 h1:2n1em+jfbhSv6QnBj8F6KHCpbIzZCB8KgcjidJUQNlY= +github.com/tendermint/tendermint v0.37.0-rc2/go.mod h1:uYQO9DRNPeZROa9X3hJOZpYcVREDC2/HST+EiU5g2+A= github.com/tendermint/tm-db v0.6.7 h1:fE00Cbl0jayAoqlExN6oyQJ7fR/ZtoVOmvPJ//+shu8= github.com/tendermint/tm-db v0.6.7/go.mod h1:byQDzFkZV1syXr/ReXS808NxA2xvyuuVgXOJ/088L6I= -github.com/tidwall/gjson v1.12.1/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= -github.com/tidwall/gjson v1.14.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= -github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= -github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= -github.com/tidwall/sjson v1.2.4/go.mod h1:098SZ494YoMWPmMO6ct4dcFnqxwj9r/gF0Etp19pSNM= -github.com/tinylib/msgp v1.0.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE= -github.com/tinylib/msgp v1.1.5/go.mod h1:eQsjooMTnV42mHu917E26IogZ2930nFyBQdofk10Udg= -github.com/tklauser/go-sysconf v0.3.5/go.mod h1:MkWzOF4RMCshBAMXuhXJs64Rte09mITnppBXY/rYEFI= -github.com/tklauser/numcpus v0.2.2/go.mod h1:x3qojaO3uyYt0i56EW/VUYs7uBvdl2fkfZFu0T9wgjM= +github.com/tidwall/btree v1.5.2 h1:5eA83Gfki799V3d3bJo9sWk+yL2LRoTEah3O/SA6/8w= +github.com/tidwall/btree v1.5.2/go.mod h1:twD9XRA5jj9VUQGELzDO4HPQTNJsoWWfYEL+EUQ2cKY= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/ttacon/chalk v0.0.0-20160626202418-22c06c80ed31/go.mod h1:onvgF043R+lC5RZ8IT9rBXDaEDnpnw/Cl+HFiw+v/7Q= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= -github.com/tyler-smith/go-bip39 v1.0.1-0.20181017060643-dbb3b84ba2ef/go.mod h1:sJ5fKU0s6JVwZjjcUEX2zFOnvq0ASQ2K9Zr6cf67kNs= -github.com/tyler-smith/go-bip39 v1.0.2/go.mod h1:sJ5fKU0s6JVwZjjcUEX2zFOnvq0ASQ2K9Zr6cf67kNs= github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= @@ -1028,15 +844,8 @@ github.com/ulikunitz/xz v0.5.8 h1:ERv8V6GKqVi23rgu5cj9pVfVzJbOqAY2Ntl88O6c2nQ= github.com/ulikunitz/xz v0.5.8/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= -github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= -github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= -github.com/vmihailenco/msgpack/v5 v5.3.5/go.mod h1:7xyJ9e+0+9SaZT0Wt1RGleJXzli6Q/V5KbhBonMG9jc= -github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= -github.com/willf/bitset v1.1.3/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo= github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= @@ -1045,17 +854,16 @@ github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1: github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xlab/treeprint v0.0.0-20180616005107-d6fb6747feb6/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -github.com/ybbus/jsonrpc v2.1.2+incompatible/go.mod h1:XJrh1eMSzdIYFbM08flv0wp5G35eRniyeGut1z+LSiE= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/zondax/hid v0.9.0/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM= -github.com/zondax/hid v0.9.1-0.20220302062450-5552068d2266 h1:O9XLFXGkVswDFmH9LaYpqu+r/AAFWqr0DL6V00KEVFg= -github.com/zondax/hid v0.9.1-0.20220302062450-5552068d2266/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM= +github.com/zondax/hid v0.9.1 h1:gQe66rtmyZ8VeGFcOpbuH3r7erYtNEAezCAYu8LdkJo= +github.com/zondax/hid v0.9.1/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM= +github.com/zondax/ledger-go v0.14.0 h1:dlMC7aO8Wss1CxBq2I96kZ69Nh1ligzbs8UWOtq/AsA= +github.com/zondax/ledger-go v0.14.0/go.mod h1:fZ3Dqg6qcdXWSOJFKMG8GCTnD7slO/RL2feOQv8K320= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.6 h1:/ecaJf0sk1l4l6V4awd65v2C3ILy7MSj+s/x1ADCIMU= go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= @@ -1068,8 +876,8 @@ go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= +go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= @@ -1077,7 +885,6 @@ go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= -go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -1085,29 +892,18 @@ golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnf golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190909091759-094676da4a83/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.1.0 h1:MDRAIl0xIo9Io2xV565hzXHw3zVseKrJKodhohM5CjU= -golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= -golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/crypto v0.5.0 h1:U/0M97KRkSFvyD/3FSmdP5W5swImpNgle/EHFhOsQPE= +golang.org/x/crypto v0.5.0/go.mod h1:NK/OQwhpMQP3MwtdjgLlYHnH9ebylxKWv3e0fK+mkQU= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= @@ -1118,9 +914,8 @@ golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= -golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e h1:+WEEuIdZHnUeJJmEUjyYC2gfUMj69yZXw17EnHg/otA= -golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e/go.mod h1:Kr81I6Kryrl9sr8s2FK3vxD90NdsKWRuOIl2O4CvYbA= -golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= +golang.org/x/exp v0.0.0-20221019170559-20944726eadf h1:nFVjjKDgNY37+ZSYCJmtYf7tOlfQswHqplG2eosjOMg= +golang.org/x/exp v0.0.0-20221019170559-20944726eadf/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -1134,7 +929,6 @@ golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRu golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= @@ -1186,32 +980,20 @@ golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81R golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210220033124-5f55cee0dc0d/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.2.0 h1:sZfSu1wtKLGlWI4ZZayP0ck9Y73K1ynO6gqzTdBVdPU= -golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= +golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1221,18 +1003,8 @@ golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= -golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783 h1:nt+Q6cXKz4MosCSpnbMtqiQ8Oz0pxTef2B4Vca2lvfk= golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1246,7 +1018,6 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1259,7 +1030,6 @@ golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190130150945-aca44879d564/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1271,7 +1041,6 @@ golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190712062909-fae7ac547cb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1283,7 +1052,6 @@ golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200107162124-548cf772de50/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1303,7 +1071,6 @@ golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200826173525-f9321e4c35a6/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1312,59 +1079,35 @@ golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210316164454-77fc1eacc6aa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210420205809-ac73e9fd8988/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210819135213-f52c844e1c1c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210906170528-6f6e22806c34/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220315194320-039c03cc5b86/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220517195934-5e4e11fc645e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.2.0 h1:ljd4t30dBnAvMZaQCevtY0xLLD0A+bRZXbgLMLU1F/A= -golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= +golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.2.0 h1:z85xZCsEl7bi/KwbNADeBYoOP0++7W1ipu+aGnpwzRM= -golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= +golang.org/x/term v0.5.0 h1:n2a8QNdAb0sZNpU9R1ALUXBbY+w51fCQDN+7EdxNBsY= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1374,19 +1117,15 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.4.0 h1:BrVqGRd7+k1DiOgtnFvAkoQEWQvBc25ouMJM6429SFg= -golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= @@ -1411,7 +1150,6 @@ golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200108203644-89082a384178/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= @@ -1432,7 +1170,6 @@ golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201022035929-9cf592e881e9/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= @@ -1441,26 +1178,14 @@ golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.3.0 h1:SrNbZl6ECOS1qFzgTdQfWXZM9XBkiA6tkFrH9YSTPHM= -golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= +golang.org/x/tools v0.4.0 h1:7mTAgkunk3fr4GAloyyCasadO6h9zSsQZbwvcaIciV4= +golang.org/x/tools v0.4.0/go.mod h1:UE5sM2OK9E/d67R0ANs2xJizIymRP5gJU295PvKXxjQ= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f h1:uF6paiQQebLeSXkrTqHqz0MXhXXS1KgF41eUdBNvxK0= -golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= -gonum.org/v1/gonum v0.0.0-20181121035319-3f7ecaa7e8ca/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= -gonum.org/v1/gonum v0.6.0/go.mod h1:9mxDZsDKxgMAuccQkewq682L+0eCu4dCN2yonUJTCLU= -gonum.org/v1/netlib v0.0.0-20181029234149-ec6d1f5cefe6/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= -gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= -gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= +golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= +golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= @@ -1481,28 +1206,8 @@ google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz513 google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= -google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= -google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= -google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= -google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= -google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= -google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= -google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= -google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= -google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= -google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= -google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= -google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= -google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= -google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg= -google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o= -google.golang.org/api v0.93.0 h1:T2xt9gi0gHdxdnRkVQhT8mIvPaXKNsDNWz+L696M66M= -google.golang.org/api v0.93.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= +google.golang.org/api v0.107.0 h1:I2SlFjD8ZWabaIFOfeEDg3pf0BHJDh6iYQ1ic3Yu/UU= +google.golang.org/api v0.107.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -1519,7 +1224,6 @@ google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRn google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= -google.golang.org/genproto v0.0.0-20190716160619-c506a9f90610/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= @@ -1527,7 +1231,6 @@ google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvx google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200108215221-bd8f9a0ef82f/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= @@ -1555,57 +1258,12 @@ google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210126160654-44e461bb6506/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= -google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= -google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220624142145-8cd45d7dbd1f/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a h1:GH6UPn3ixhWcKDhpnEC55S75cerLPdpp3hrhfKYjZgw= -google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= +google.golang.org/genproto v0.0.0-20220314164441-57ef72a4c106/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= +google.golang.org/genproto v0.0.0-20221227171554-f9683d7f8bef h1:uQ2vjV/sHTsWSqdKeLqmwitzgvjMl7o4IdtHwUDXSJY= +google.golang.org/genproto v0.0.0-20221227171554-f9683d7f8bef/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.19.1/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -1628,22 +1286,10 @@ google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= -google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.51.0 h1:E1eGv1FTqoLIdnBCZufiSHgKjlqG6fKFf6pPWtMTh8U= -google.golang.org/grpc v1.51.0/go.mod h1:wgNDFcnuBGmxLKI/qn4T+m5BtEBYXJPvibbUPsAIPww= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= +google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc v1.52.3 h1:pf7sOysg4LdgBqduXveGKrcEwbStiK2rtfghdzlUYDQ= +google.golang.org/grpc v1.52.3/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5vorUY= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -1657,7 +1303,7 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.28.2-0.20220831092852-f930b1dc76e8 h1:KR8+MyP7/qOlV+8Af01LtjL04bu7on42eVsxT4EyBQk= google.golang.org/protobuf v1.28.2-0.20220831092852-f930b1dc76e8/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= @@ -1666,7 +1312,6 @@ gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/cheggaaa/pb.v1 v1.0.27/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= @@ -1674,12 +1319,9 @@ gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMy gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= -gopkg.in/olebedev/go-duktape.v3 v3.0.0-20200619000410-60c24ae608a6/go.mod h1:uAJfkITjFhyEEuUfm7bsmCZRbW5WRq8s9EY8HZ6hCns= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/urfave/cli.v1 v1.20.0/go.mod h1:vuBzUtMdQeixQj8LVd+/98pzhxNGQoyuPBlsXHOQNO0= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -1696,9 +1338,7 @@ gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= -gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= -gotest.tools/v3 v3.2.0 h1:I0DwBVMGAx26dttAj1BtJLAkVGncrkkUXfJLC4Flt/I= +gotest.tools/v3 v3.4.0 h1:ZazjZUfuVeZGLAmlKKuyv3IKP5orXcwtOwDQH6YVr6o= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -1707,16 +1347,13 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= nhooyr.io/websocket v1.8.6 h1:s+C3xAMLwGmlI31Nyn/eAehUlZPwfYZu2JXM621Q5/k= nhooyr.io/websocket v1.8.6/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= -pgregory.net/rapid v0.4.7 h1:MTNRktPuv5FNqOO151TM9mDTa+XHcX6ypYeISDVD14g= -pgregory.net/rapid v0.4.7/go.mod h1:UYpPVyjFHzYBGHIxLFoupi8vwk6rXNzRY9OMvVxFIOU= +pgregory.net/rapid v0.5.3 h1:163N50IHFqr1phZens4FQOdPgfJscR7a562mjQqeo4M= +pgregory.net/rapid v0.5.3/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= diff --git a/privval/file.go b/privval/file.go index 46e70831a..4fe44893d 100644 --- a/privval/file.go +++ b/privval/file.go @@ -23,6 +23,8 @@ import ( ) // copied from github.com/tendermint/tendermint/privval/file.go" +// +//nolint:unused const ( stepNone int8 = 0 // Used to distinguish the initial state stepPropose int8 = 1 diff --git a/simapp/sim_bench_test.go b/simapp/sim_bench_test.go index 797931399..da83006b6 100644 --- a/simapp/sim_bench_test.go +++ b/simapp/sim_bench_test.go @@ -5,11 +5,10 @@ import ( "os" "testing" - tmproto "github.com/tendermint/tendermint/proto/tendermint/types" - - sdksimapp "github.com/cosmos/cosmos-sdk/simapp" + "github.com/cosmos/cosmos-sdk/testutil/sims" simtypes "github.com/cosmos/cosmos-sdk/types/simulation" "github.com/cosmos/cosmos-sdk/x/simulation" + tmproto "github.com/tendermint/tendermint/proto/tendermint/types" "github.com/babylonchain/babylon/app" ) @@ -39,7 +38,18 @@ func BenchmarkFullAppSimulation(b *testing.B) { if err != nil { b.Fatal(err) } - babylon := app.NewBabylonApp(logger, db, nil, true, map[int64]bool{}, app.DefaultNodeHome, FlagPeriodValue, app.GetEncodingConfig(), privSigner, sdksimapp.EmptyAppOptions{}, interBlockCacheOpt()) + babylon := app.NewBabylonApp( + logger, + db, + nil, + true, + map[int64]bool{}, + app.DefaultNodeHome, + FlagPeriodValue, + app.GetEncodingConfig(), + privSigner, + sims.EmptyAppOptions{}, + interBlockCacheOpt()) // run randomized simulation _, simParams, simErr := simulation.SimulateFromSeed( @@ -55,7 +65,7 @@ func BenchmarkFullAppSimulation(b *testing.B) { ) // export state and simParams before the simulation error is checked - if err = sdksimapp.CheckExportSimulation(babylon, config, simParams); err != nil { + if err = sims.CheckExportSimulation(babylon, config, simParams); err != nil { b.Fatal(err) } @@ -64,7 +74,7 @@ func BenchmarkFullAppSimulation(b *testing.B) { } if config.Commit { - sdksimapp.PrintStats(db) + sims.PrintStats(db) } } @@ -93,7 +103,18 @@ func BenchmarkInvariants(b *testing.B) { if err != nil { b.Fatal(err) } - babylon := app.NewBabylonApp(logger, db, nil, true, map[int64]bool{}, app.DefaultNodeHome, FlagPeriodValue, app.GetEncodingConfig(), privSigner, sdksimapp.EmptyAppOptions{}, interBlockCacheOpt()) + babylon := app.NewBabylonApp( + logger, + db, + nil, + true, + map[int64]bool{}, + app.DefaultNodeHome, + FlagPeriodValue, + app.GetEncodingConfig(), + privSigner, + sims.EmptyAppOptions{}, + interBlockCacheOpt()) // run randomized simulation _, simParams, simErr := simulation.SimulateFromSeed( @@ -109,7 +130,7 @@ func BenchmarkInvariants(b *testing.B) { ) // export state and simParams before the simulation error is checked - if err = sdksimapp.CheckExportSimulation(babylon, config, simParams); err != nil { + if err = sims.CheckExportSimulation(babylon, config, simParams); err != nil { b.Fatal(err) } @@ -118,7 +139,7 @@ func BenchmarkInvariants(b *testing.B) { } if config.Commit { - sdksimapp.PrintStats(db) + sims.PrintStats(db) } ctx := babylon.NewContext(true, tmproto.Header{Height: babylon.LastBlockHeight() + 1}) diff --git a/simapp/sim_test.go b/simapp/sim_test.go index 4bab4fd39..e1a5a00a7 100644 --- a/simapp/sim_test.go +++ b/simapp/sim_test.go @@ -7,18 +7,18 @@ import ( "os" "testing" + simappparams "github.com/babylonchain/babylon/app/params" "github.com/stretchr/testify/require" "github.com/tendermint/tendermint/libs/log" tmproto "github.com/tendermint/tendermint/proto/tendermint/types" dbm "github.com/tendermint/tm-db" storetypes "github.com/cosmos/cosmos-sdk/store/types" + "github.com/cosmos/cosmos-sdk/testutil/sims" "github.com/babylonchain/babylon/app" "github.com/cosmos/cosmos-sdk/baseapp" - sdksimapp "github.com/cosmos/cosmos-sdk/simapp" - "github.com/cosmos/cosmos-sdk/simapp/helpers" "github.com/cosmos/cosmos-sdk/store" sdk "github.com/cosmos/cosmos-sdk/types" simtypes "github.com/cosmos/cosmos-sdk/types/simulation" @@ -79,7 +79,7 @@ func TestFullAppSimulation(t *testing.T) { privSigner, err := app.SetupPrivSigner() require.NoError(t, err) - babylon := app.NewBabylonApp(logger, db, nil, true, map[int64]bool{}, app.DefaultNodeHome, FlagPeriodValue, app.GetEncodingConfig(), privSigner, sdksimapp.EmptyAppOptions{}, fauxMerkleModeOpt) + babylon := app.NewBabylonApp(logger, db, nil, true, map[int64]bool{}, app.DefaultNodeHome, FlagPeriodValue, app.GetEncodingConfig(), privSigner, sims.EmptyAppOptions{}, fauxMerkleModeOpt) require.Equal(t, "BabylonApp", babylon.Name()) // run randomized simulation @@ -96,12 +96,12 @@ func TestFullAppSimulation(t *testing.T) { ) // export state and simParams before the simulation error is checked - err = sdksimapp.CheckExportSimulation(babylon, config, simParams) + err = sims.CheckExportSimulation(babylon, config, simParams) require.NoError(t, err) require.NoError(t, simErr) if config.Commit { - sdksimapp.PrintStats(db) + sims.PrintStats(db) } } @@ -119,7 +119,7 @@ func TestAppImportExport(t *testing.T) { privSigner, err := app.SetupPrivSigner() require.NoError(t, err) - babylon := app.NewBabylonApp(logger, db, nil, true, map[int64]bool{}, app.DefaultNodeHome, FlagPeriodValue, app.GetEncodingConfig(), privSigner, sdksimapp.EmptyAppOptions{}, fauxMerkleModeOpt) + babylon := app.NewBabylonApp(logger, db, nil, true, map[int64]bool{}, app.DefaultNodeHome, FlagPeriodValue, app.GetEncodingConfig(), privSigner, sims.EmptyAppOptions{}, fauxMerkleModeOpt) require.Equal(t, "BabylonApp", babylon.Name()) // Run randomized simulation @@ -136,17 +136,17 @@ func TestAppImportExport(t *testing.T) { ) // export state and simParams before the simulation error is checked - err = sdksimapp.CheckExportSimulation(babylon, config, simParams) + err = sims.CheckExportSimulation(babylon, config, simParams) require.NoError(t, err) require.NoError(t, simErr) if config.Commit { - sdksimapp.PrintStats(db) + sims.PrintStats(db) } fmt.Printf("exporting genesis...\n") - exported, err := babylon.ExportAppStateAndValidators(false, []string{}) + exported, err := babylon.ExportAppStateAndValidators(false, []string{}, []string{}) require.NoError(t, err) fmt.Printf("importing genesis...\n") @@ -159,7 +159,7 @@ func TestAppImportExport(t *testing.T) { require.NoError(t, os.RemoveAll(newDir)) }() - newBabylon := app.NewBabylonApp(log.NewNopLogger(), newDB, nil, true, map[int64]bool{}, app.DefaultNodeHome, FlagPeriodValue, app.GetEncodingConfig(), privSigner, sdksimapp.EmptyAppOptions{}, fauxMerkleModeOpt) + newBabylon := app.NewBabylonApp(log.NewNopLogger(), newDB, nil, true, map[int64]bool{}, app.DefaultNodeHome, FlagPeriodValue, app.GetEncodingConfig(), privSigner, sims.EmptyAppOptions{}, fauxMerkleModeOpt) require.Equal(t, "BabylonApp", newBabylon.Name()) var genesisState app.GenesisState @@ -205,7 +205,7 @@ func TestAppImportExport(t *testing.T) { require.Equal(t, len(failedKVAs), len(failedKVBs), "unequal sets of key-values to compare") fmt.Printf("compared %d different key/value pairs between %s and %s\n", len(failedKVAs), skp.A, skp.B) - require.Equal(t, len(failedKVAs), 0, sdksimapp.GetSimulationLog(skp.A.Name(), babylon.SimulationManager().StoreDecoders, failedKVAs, failedKVBs)) + require.Equal(t, len(failedKVAs), 0, sims.GetSimulationLog(skp.A.Name(), babylon.SimulationManager().StoreDecoders, failedKVAs, failedKVBs)) } } @@ -223,7 +223,7 @@ func TestAppSimulationAfterImport(t *testing.T) { privSigner, err := app.SetupPrivSigner() require.NoError(t, err) - babylon := app.NewBabylonApp(logger, db, nil, true, map[int64]bool{}, app.DefaultNodeHome, FlagPeriodValue, app.GetEncodingConfig(), privSigner, sdksimapp.EmptyAppOptions{}, fauxMerkleModeOpt) + babylon := app.NewBabylonApp(logger, db, nil, true, map[int64]bool{}, app.DefaultNodeHome, FlagPeriodValue, app.GetEncodingConfig(), privSigner, sims.EmptyAppOptions{}, fauxMerkleModeOpt) require.Equal(t, "BabylonApp", babylon.Name()) // Run randomized simulation @@ -240,12 +240,12 @@ func TestAppSimulationAfterImport(t *testing.T) { ) // export state and simParams before the simulation error is checked - err = sdksimapp.CheckExportSimulation(babylon, config, simParams) + err = sims.CheckExportSimulation(babylon, config, simParams) require.NoError(t, err) require.NoError(t, simErr) if config.Commit { - sdksimapp.PrintStats(db) + sims.PrintStats(db) } if stopEarly { @@ -255,7 +255,7 @@ func TestAppSimulationAfterImport(t *testing.T) { fmt.Printf("exporting genesis...\n") - exported, err := babylon.ExportAppStateAndValidators(true, []string{}) + exported, err := babylon.ExportAppStateAndValidators(true, []string{}, []string{}) require.NoError(t, err) fmt.Printf("importing genesis...\n") @@ -268,7 +268,7 @@ func TestAppSimulationAfterImport(t *testing.T) { require.NoError(t, os.RemoveAll(newDir)) }() - newBabylon := app.NewBabylonApp(log.NewNopLogger(), newDB, nil, true, map[int64]bool{}, app.DefaultNodeHome, FlagPeriodValue, app.GetEncodingConfig(), privSigner, sdksimapp.EmptyAppOptions{}, fauxMerkleModeOpt) + newBabylon := app.NewBabylonApp(log.NewNopLogger(), newDB, nil, true, map[int64]bool{}, app.DefaultNodeHome, FlagPeriodValue, app.GetEncodingConfig(), privSigner, sims.EmptyAppOptions{}, fauxMerkleModeOpt) require.Equal(t, "BabylonApp", newBabylon.Name()) newBabylon.InitChain(abci.RequestInitChain{ @@ -301,7 +301,7 @@ func TestAppStateDeterminism(t *testing.T) { config.ExportParamsPath = "" config.OnOperation = false config.AllInvariants = false - config.ChainID = helpers.SimAppChainID + config.ChainID = simappparams.SimAppChainID numSeeds := 3 numTimesToRunPerSeed := 5 @@ -321,7 +321,7 @@ func TestAppStateDeterminism(t *testing.T) { db := dbm.NewMemDB() privSigner, err := app.SetupPrivSigner() require.NoError(t, err) - babylon := app.NewBabylonApp(logger, db, nil, true, map[int64]bool{}, app.DefaultNodeHome, FlagPeriodValue, app.GetEncodingConfig(), privSigner, sdksimapp.EmptyAppOptions{}, interBlockCacheOpt()) + babylon := app.NewBabylonApp(logger, db, nil, true, map[int64]bool{}, app.DefaultNodeHome, FlagPeriodValue, app.GetEncodingConfig(), privSigner, sims.EmptyAppOptions{}, interBlockCacheOpt()) fmt.Printf( "running non-determinism simulation; seed %d: %d/%d, attempt: %d/%d\n", @@ -342,7 +342,7 @@ func TestAppStateDeterminism(t *testing.T) { require.NoError(t, err) if config.Commit { - sdksimapp.PrintStats(db) + sims.PrintStats(db) } appHash := babylon.LastCommitID().Hash diff --git a/simapp/state.go b/simapp/state.go index 58f5c17ee..ff47c4d87 100644 --- a/simapp/state.go +++ b/simapp/state.go @@ -9,6 +9,7 @@ import ( "time" sdkmath "cosmossdk.io/math" + simappparams "github.com/babylonchain/babylon/app/params" tmjson "github.com/tendermint/tendermint/libs/json" tmtypes "github.com/tendermint/tendermint/types" @@ -17,7 +18,6 @@ import ( "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" - simappparams "github.com/cosmos/cosmos-sdk/simapp/params" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" simtypes "github.com/cosmos/cosmos-sdk/types/simulation" @@ -43,7 +43,6 @@ func AppStateFn(cdc codec.JSONCodec, simManager *module.SimulationManager) simty switch { case config.ParamsFile != "" && config.GenesisFile != "": panic("cannot provide both a genesis file and a params file") - case config.GenesisFile != "": // override the default chain-id from simapp to set it later to the config genesisDoc, accounts := AppStateFromGenesisFileFn(r, cdc, config.GenesisFile) @@ -69,7 +68,6 @@ func AppStateFn(cdc codec.JSONCodec, simManager *module.SimulationManager) simty panic(err) } appState, simAccs = AppStateRandomizedFn(simManager, r, cdc, accs, genesisTimestamp, appParams) - default: appParams := make(simtypes.AppParams) appState, simAccs = AppStateRandomizedFn(simManager, r, cdc, accs, genesisTimestamp, appParams) diff --git a/simapp/utils.go b/simapp/utils.go index 110278212..b085f9e95 100644 --- a/simapp/utils.go +++ b/simapp/utils.go @@ -6,11 +6,10 @@ import ( "github.com/tendermint/tendermint/libs/log" dbm "github.com/tendermint/tm-db" - + simappparams "github.com/babylonchain/babylon/app/params" + "github.com/babylonchain/babylon/app" "github.com/cosmos/cosmos-sdk/codec" - "github.com/cosmos/cosmos-sdk/simapp" - "github.com/cosmos/cosmos-sdk/simapp/helpers" - sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/module" simtypes "github.com/cosmos/cosmos-sdk/types/simulation" "github.com/cosmos/cosmos-sdk/x/staking" @@ -30,7 +29,7 @@ func SetupSimulation(dirPrefix, dbName string) (simtypes.Config, dbm.DB, string, } config := NewConfigFromFlags() - config.ChainID = helpers.SimAppChainID + config.ChainID = simappparams.SimAppChainID var logger log.Logger if FlagVerboseValue { @@ -44,7 +43,7 @@ func SetupSimulation(dirPrefix, dbName string) (simtypes.Config, dbm.DB, string, return simtypes.Config{}, nil, "", nil, false, err } - db, err := sdk.NewLevelDB(dbName, dir) //nolint:staticcheck // Prefer the old-fashioned way. + db, err := dbm.NewDB(dbName, dbm.BackendType(config.DBBackend), dir) if err != nil { return simtypes.Config{}, nil, "", nil, false, err } @@ -57,7 +56,7 @@ func SetupSimulation(dirPrefix, dbName string) (simtypes.Config, dbm.DB, string, // NOTE: the code is same as https://github.com/cosmos/cosmos-sdk/blob/v0.45.5/simapp/utils.go#L50-L73, // except that this function modifies the default weights given in Cosmos SDK. // Specifically, Babylon does not want unwrapped message types in the staking module. -func SimulationOperations(app simapp.App, cdc codec.JSONCodec, config simtypes.Config) []simtypes.WeightedOperation { +func SimulationOperations(app app.App, cdc codec.JSONCodec, config simtypes.Config) []simtypes.WeightedOperation { simState := module.SimulationState{ AppParams: make(simtypes.AppParams), Cdc: cdc, @@ -74,10 +73,6 @@ func SimulationOperations(app simapp.App, cdc codec.JSONCodec, config simtypes.C panic(err) } } - - simState.ParamChanges = app.SimulationManager().GenerateParamChanges(config.Seed) - simState.Contents = app.SimulationManager().GetProposalContents(simState) - // get weighted operations from all modules, except for the staking module whose messages will be rejected by Babylon sm := app.SimulationManager() appWOps := make([]simtypes.WeightedOperation, 0, len(sm.Modules)) diff --git a/test/e2e/configurer/base.go b/test/e2e/configurer/base.go index 4f50c852d..5e22941fc 100644 --- a/test/e2e/configurer/base.go +++ b/test/e2e/configurer/base.go @@ -168,8 +168,8 @@ func (bc *baseConfigurer) runIBCRelayer(chainConfigA *chain.Config, chainConfigB func (bc *baseConfigurer) connectIBCChains(chainA *chain.Config, chainB *chain.Config) error { bc.t.Logf("connecting %s and %s chains via IBC", chainA.ChainMeta.Id, chainB.ChainMeta.Id) - cmd := []string{"hermes", "create", "channel", chainA.ChainMeta.Id, chainB.ChainMeta.Id, "--port-a=zoneconcierge", "--port-b=zoneconcierge"} - _, _, err := bc.containerManager.ExecHermesCmd(bc.t, cmd, "successfully opened init channel") + cmd := []string{"hermes", "create", "channel", "--a-chain", chainA.ChainMeta.Id, "--b-chain", chainB.ChainMeta.Id, "--a-port", "zoneconcierge", "--b-port", "zoneconcierge", "--new-client-connection", "--yes"} + _, _, err := bc.containerManager.ExecHermesCmd(bc.t, cmd, "SUCCESS") if err != nil { return err } diff --git a/test/e2e/configurer/setup.go b/test/e2e/configurer/setup.go index 4eea29e7d..50a6d2c15 100644 --- a/test/e2e/configurer/setup.go +++ b/test/e2e/configurer/setup.go @@ -1,5 +1,7 @@ package configurer +import "time" + type setupFn func(configurer Configurer) error func baseSetup(configurer Configurer) error { @@ -14,7 +16,7 @@ func withIBC(setupHandler setupFn) setupFn { if err := setupHandler(configurer); err != nil { return err } - + time.Sleep(5 * time.Second) if err := configurer.RunIBC(); err != nil { return err } diff --git a/test/e2e/containers/config.go b/test/e2e/containers/config.go index 1340d70fb..652fb5462 100644 --- a/test/e2e/containers/config.go +++ b/test/e2e/containers/config.go @@ -12,10 +12,8 @@ const ( // name of babylon container produced by running `make localnet-build-env` BabylonContainerName = "babylonchain/babylond" - // TODO currently using image hosted by osmolab we should probably use our own - // Hermes repo/version for relayer - relayerRepository = "osmolabs/hermes" - relayerTag = "0.13.0" + relayerRepository = "informalsystems/hermes" + relayerTag = "1.3.0" ) // Returns ImageConfig needed for running e2e test. diff --git a/test/e2e/initialization/node.go b/test/e2e/initialization/node.go index 2d990ed9c..9a1e1615d 100644 --- a/test/e2e/initialization/node.go +++ b/test/e2e/initialization/node.go @@ -125,12 +125,15 @@ func (n *internalNode) createAppConfig(nodeConfig *NodeConfig) { appConfig.BaseConfig.PruningKeepRecent = nodeConfig.PruningKeepRecent appConfig.BaseConfig.PruningInterval = nodeConfig.PruningInterval appConfig.API.Enable = true + appConfig.API.Address = "tcp://0.0.0.0:1317" appConfig.MinGasPrices = fmt.Sprintf("%s%s", MinGasPrice, BabylonDenom) appConfig.StateSync.SnapshotInterval = nodeConfig.SnapshotInterval appConfig.StateSync.SnapshotKeepRecent = nodeConfig.SnapshotKeepRecent appConfig.SignerConfig.KeyName = ValidatorWalletName appConfig.BtcConfig.Network = string(bbn.BtcSimnet) appConfig.BtcConfig.CheckpointTag = BabylonOpReturnTag + appConfig.GRPC.Enable = true + appConfig.GRPC.Address = "0.0.0.0:9090" customTemplate := cmd.DefaultBabylonTemplate() diff --git a/test/e2e/scripts/hermes_bootstrap.sh b/test/e2e/scripts/hermes_bootstrap.sh index bed26faf5..cfb3702bd 100644 --- a/test/e2e/scripts/hermes_bootstrap.sh +++ b/test/e2e/scripts/hermes_bootstrap.sh @@ -6,10 +6,12 @@ set -ex mkdir -p /root/.hermes/ touch /root/.hermes/config.toml +echo $BBN_A_E2E_VAL_MNEMONIC > /root/.hermes/BBN_A_MNEMONIC.txt +echo $BBN_B_E2E_VAL_MNEMONIC > /root/.hermes/BBN_B_MNEMONIC.txt # setup Hermes relayer configuration tee /root/.hermes/config.toml < bool denoting whether the hash diff --git a/x/btclightclient/module.go b/x/btclightclient/module.go index f84dd82a6..321bc7e23 100644 --- a/x/btclightclient/module.go +++ b/x/btclightclient/module.go @@ -122,19 +122,9 @@ func (am AppModule) Name() string { return am.AppModuleBasic.Name() } -// Route returns the capability module's message routing key. -func (am AppModule) Route() sdk.Route { - return sdk.NewRoute(types.RouterKey, NewHandler(am.keeper)) -} - // QuerierRoute returns the capability module's query routing key. func (AppModule) QuerierRoute() string { return types.QuerierRoute } -// LegacyQuerierHandler returns the capability module's Querier. -func (am AppModule) LegacyQuerierHandler(legacyQuerierCdc *codec.LegacyAmino) sdk.Querier { - return nil -} - // RegisterServices registers a GRPC query service to respond to the // module-specific GRPC queries. func (am AppModule) RegisterServices(cfg module.Configurator) { diff --git a/x/btclightclient/module_simulation.go b/x/btclightclient/module_simulation.go index ac0b0d351..1de351013 100644 --- a/x/btclightclient/module_simulation.go +++ b/x/btclightclient/module_simulation.go @@ -1,13 +1,11 @@ package btclightclient import ( - "math/rand" - + simappparams "github.com/babylonchain/babylon/app/params" "github.com/babylonchain/babylon/testutil/sample" btclightclientsimulation "github.com/babylonchain/babylon/x/btclightclient/simulation" "github.com/babylonchain/babylon/x/btclightclient/types" "github.com/cosmos/cosmos-sdk/baseapp" - simappparams "github.com/cosmos/cosmos-sdk/simapp/params" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" simtypes "github.com/cosmos/cosmos-sdk/types/simulation" @@ -34,16 +32,10 @@ func (AppModule) GenerateGenesisState(simState *module.SimulationState) { } // ProposalContents doesn't return any content functions for governance proposals -func (AppModule) ProposalContents(_ module.SimulationState) []simtypes.WeightedProposalContent { +func (AppModule) ProposalContents(_ module.SimulationState) []simtypes.WeightedProposalMsg { return nil } -// RandomizedParams creates randomized param changes for the simulator -func (am AppModule) RandomizedParams(_ *rand.Rand) []simtypes.ParamChange { - - return []simtypes.ParamChange{} -} - // RegisterStoreDecoder registers a decoder func (am AppModule) RegisterStoreDecoder(_ sdk.StoreDecoderRegistry) {} diff --git a/x/btclightclient/types/btc_header_info.go b/x/btclightclient/types/btc_header_info.go index 46f7ceea5..baabc45a0 100644 --- a/x/btclightclient/types/btc_header_info.go +++ b/x/btclightclient/types/btc_header_info.go @@ -1,11 +1,11 @@ package types import ( + sdkmath "cosmossdk.io/math" bbn "github.com/babylonchain/babylon/types" - sdk "github.com/cosmos/cosmos-sdk/types" ) -func NewBTCHeaderInfo(header *bbn.BTCHeaderBytes, headerHash *bbn.BTCHeaderHashBytes, height uint64, work *sdk.Uint) *BTCHeaderInfo { +func NewBTCHeaderInfo(header *bbn.BTCHeaderBytes, headerHash *bbn.BTCHeaderHashBytes, height uint64, work *sdkmath.Uint) *BTCHeaderInfo { return &BTCHeaderInfo{ Header: header, Hash: headerHash, diff --git a/x/btclightclient/types/btclightclient.pb.go b/x/btclightclient/types/btclightclient.pb.go index 4cea909ea..1387c7ff2 100644 --- a/x/btclightclient/types/btclightclient.pb.go +++ b/x/btclightclient/types/btclightclient.pb.go @@ -7,8 +7,8 @@ import ( fmt "fmt" github_com_babylonchain_babylon_types "github.com/babylonchain/babylon/types" github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" + proto "github.com/cosmos/gogoproto/proto" _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" io "io" math "math" math_bits "math/bits" diff --git a/x/btclightclient/types/errors.go b/x/btclightclient/types/errors.go index dced77ae7..4ff8ee786 100644 --- a/x/btclightclient/types/errors.go +++ b/x/btclightclient/types/errors.go @@ -3,15 +3,15 @@ package types // DONTCOVER import ( - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + errorsmod "cosmossdk.io/errors" ) // x/btclightclient module sentinel errors var ( - ErrHeaderDoesNotExist = sdkerrors.Register(ModuleName, 1100, "header does not exist") - ErrDuplicateHeader = sdkerrors.Register(ModuleName, 1101, "header with provided hash already exists") - ErrHeaderParentDoesNotExist = sdkerrors.Register(ModuleName, 1102, "parent for provided hash is not maintained") - ErrInvalidDifficulty = sdkerrors.Register(ModuleName, 1103, "invalid difficulty bits") - ErrEmptyMessage = sdkerrors.Register(ModuleName, 1104, "empty message provided") - ErrInvalidProofOfWOrk = sdkerrors.Register(ModuleName, 1105, "provided header has invalid proof of work") + ErrHeaderDoesNotExist = errorsmod.Register(ModuleName, 1100, "header does not exist") + ErrDuplicateHeader = errorsmod.Register(ModuleName, 1101, "header with provided hash already exists") + ErrHeaderParentDoesNotExist = errorsmod.Register(ModuleName, 1102, "parent for provided hash is not maintained") + ErrInvalidDifficulty = errorsmod.Register(ModuleName, 1103, "invalid difficulty bits") + ErrEmptyMessage = errorsmod.Register(ModuleName, 1104, "empty message provided") + ErrInvalidProofOfWOrk = errorsmod.Register(ModuleName, 1105, "provided header has invalid proof of work") ) diff --git a/x/btclightclient/types/event.pb.go b/x/btclightclient/types/event.pb.go index b3d08685a..e46d944ce 100644 --- a/x/btclightclient/types/event.pb.go +++ b/x/btclightclient/types/event.pb.go @@ -5,8 +5,8 @@ package types import ( fmt "fmt" + proto "github.com/cosmos/gogoproto/proto" _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" io "io" math "math" math_bits "math/bits" diff --git a/x/btclightclient/types/genesis.pb.go b/x/btclightclient/types/genesis.pb.go index 09cc75a3f..983656c97 100644 --- a/x/btclightclient/types/genesis.pb.go +++ b/x/btclightclient/types/genesis.pb.go @@ -5,8 +5,8 @@ package types import ( fmt "fmt" + proto "github.com/cosmos/gogoproto/proto" _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" io "io" math "math" math_bits "math/bits" diff --git a/x/btclightclient/types/msgs_test.go b/x/btclightclient/types/msgs_test.go index f6a9769a3..02b72036e 100644 --- a/x/btclightclient/types/msgs_test.go +++ b/x/btclightclient/types/msgs_test.go @@ -32,7 +32,7 @@ func FuzzMsgInsertHeader(f *testing.F) { // Perform modifications on the header errorKind = rand.Intn(2) - var bitsBig sdk.Uint + var bitsBig sdkmath.Uint switch errorKind { case 0: // Valid input diff --git a/x/btclightclient/types/params.pb.go b/x/btclightclient/types/params.pb.go index ec3e11789..2d1a03ea7 100644 --- a/x/btclightclient/types/params.pb.go +++ b/x/btclightclient/types/params.pb.go @@ -5,8 +5,8 @@ package types import ( fmt "fmt" + proto "github.com/cosmos/gogoproto/proto" _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" io "io" math "math" math_bits "math/bits" diff --git a/x/btclightclient/types/query.pb.go b/x/btclightclient/types/query.pb.go index fcaff17f8..6f8ef6cf0 100644 --- a/x/btclightclient/types/query.pb.go +++ b/x/btclightclient/types/query.pb.go @@ -8,9 +8,9 @@ import ( fmt "fmt" github_com_babylonchain_babylon_types "github.com/babylonchain/babylon/types" query "github.com/cosmos/cosmos-sdk/types/query" + grpc1 "github.com/cosmos/gogoproto/grpc" + proto "github.com/cosmos/gogoproto/proto" _ "github.com/gogo/protobuf/gogoproto" - grpc1 "github.com/gogo/protobuf/grpc" - proto "github.com/gogo/protobuf/proto" _ "google.golang.org/genproto/googleapis/api/annotations" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" diff --git a/x/btclightclient/types/tx.pb.go b/x/btclightclient/types/tx.pb.go index 229dcefb4..bac2d0b83 100644 --- a/x/btclightclient/types/tx.pb.go +++ b/x/btclightclient/types/tx.pb.go @@ -7,9 +7,9 @@ import ( context "context" fmt "fmt" github_com_babylonchain_babylon_types "github.com/babylonchain/babylon/types" + grpc1 "github.com/cosmos/gogoproto/grpc" + proto "github.com/cosmos/gogoproto/proto" _ "github.com/gogo/protobuf/gogoproto" - grpc1 "github.com/gogo/protobuf/grpc" - proto "github.com/gogo/protobuf/proto" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" diff --git a/x/checkpointing/client/cli/tx_test.go b/x/checkpointing/client/cli/tx_test.go index 155627884..bb3ca58ad 100644 --- a/x/checkpointing/client/cli/tx_test.go +++ b/x/checkpointing/client/cli/tx_test.go @@ -10,7 +10,7 @@ import ( cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" "github.com/cosmos/cosmos-sdk/crypto/hd" - "github.com/cosmos/cosmos-sdk/tests/mocks" + "github.com/cosmos/cosmos-sdk/testutil/mock" "github.com/golang/mock/gomock" "github.com/gogo/protobuf/proto" @@ -74,7 +74,7 @@ func (s *CLITestSuite) SetupSuite() { s.encCfg = app.GetEncodingConfig() s.kr = keyring.NewInMemory(s.encCfg.Marshaler) ctrl := gomock.NewController(s.T()) - mockAccountRetriever := mocks.NewMockAccountRetriever(ctrl) + mockAccountRetriever := mock.NewMockAccountRetriever(ctrl) mockAccountRetriever.EXPECT().EnsureExists(gomock.Any(), gomock.Any()).Return(nil) mockAccountRetriever.EXPECT().GetAccountNumberSequence(gomock.Any(), gomock.Any()).Return(uint64(0), uint64(0), nil) s.baseCtx = client.Context{}. diff --git a/x/checkpointing/client/cli/utils.go b/x/checkpointing/client/cli/utils.go index a29c89903..11fc3996f 100644 --- a/x/checkpointing/client/cli/utils.go +++ b/x/checkpointing/client/cli/utils.go @@ -18,7 +18,7 @@ import ( staketypes "github.com/cosmos/cosmos-sdk/x/staking/types" tmconfig "github.com/tendermint/tendermint/config" tmos "github.com/tendermint/tendermint/libs/os" - + errorsmod "cosmossdk.io/errors" "github.com/babylonchain/babylon/privval" "github.com/babylonchain/babylon/x/checkpointing/types" ) @@ -70,7 +70,7 @@ func newBuildCreateValidatorMsg(clientCtx client.Context, txf tx.Factory, fs *fl minSelfDelegation, ok := sdk.NewIntFromString(msbStr) if !ok { - return txf, nil, sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "minimum self delegation must be a positive integer") + return txf, nil, errorsmod.Wrap(sdkerrors.ErrInvalidRequest, "minimum self delegation must be a positive integer") } msg, err := staketypes.NewMsgCreateValidator( diff --git a/x/checkpointing/handler.go b/x/checkpointing/handler.go index a939e5a03..8d1b3b1a4 100644 --- a/x/checkpointing/handler.go +++ b/x/checkpointing/handler.go @@ -3,6 +3,7 @@ package checkpointing import ( "fmt" + errorsmod "cosmossdk.io/errors" "github.com/babylonchain/babylon/x/checkpointing/keeper" "github.com/babylonchain/babylon/x/checkpointing/types" sdk "github.com/cosmos/cosmos-sdk/types" @@ -17,7 +18,7 @@ func NewHandler(k keeper.Keeper) sdk.Handler { switch msg := msg.(type) { default: errMsg := fmt.Sprintf("unrecognized %s message type: %T", types.ModuleName, msg) - return nil, sdkerrors.Wrap(sdkerrors.ErrUnknownRequest, errMsg) + return nil, errorsmod.Wrap(sdkerrors.ErrUnknownRequest, errMsg) } } } diff --git a/x/checkpointing/module.go b/x/checkpointing/module.go index 9531c2c3e..afc22ab2a 100644 --- a/x/checkpointing/module.go +++ b/x/checkpointing/module.go @@ -123,19 +123,9 @@ func (am AppModule) Name() string { return am.AppModuleBasic.Name() } -// Route returns the capability module's message routing key. -func (am AppModule) Route() sdk.Route { - return sdk.NewRoute(types.RouterKey, NewHandler(am.keeper)) -} - // QuerierRoute returns the capability module's query routing key. func (AppModule) QuerierRoute() string { return types.QuerierRoute } -// LegacyQuerierHandler returns the capability module's Querier. -func (am AppModule) LegacyQuerierHandler(legacyQuerierCdc *codec.LegacyAmino) sdk.Querier { - return nil -} - // RegisterServices registers a GRPC query service to respond to the // module-specific GRPC queries. func (am AppModule) RegisterServices(cfg module.Configurator) { diff --git a/x/checkpointing/module_simulation.go b/x/checkpointing/module_simulation.go index 932686a2a..90ee4172b 100644 --- a/x/checkpointing/module_simulation.go +++ b/x/checkpointing/module_simulation.go @@ -1,13 +1,11 @@ package checkpointing import ( - "math/rand" - + simappparams "github.com/babylonchain/babylon/app/params" "github.com/babylonchain/babylon/testutil/sample" checkpointingsimulation "github.com/babylonchain/babylon/x/checkpointing/simulation" "github.com/babylonchain/babylon/x/checkpointing/types" "github.com/cosmos/cosmos-sdk/baseapp" - simappparams "github.com/cosmos/cosmos-sdk/simapp/params" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" simtypes "github.com/cosmos/cosmos-sdk/types/simulation" @@ -38,16 +36,10 @@ func (AppModule) GenerateGenesisState(simState *module.SimulationState) { } // ProposalContents doesn't return any content functions for governance proposals -func (AppModule) ProposalContents(_ module.SimulationState) []simtypes.WeightedProposalContent { +func (AppModule) ProposalContents(_ module.SimulationState) []simtypes.WeightedProposalMsg { return nil } -// RandomizedParams creates randomized param changes for the simulator -func (am AppModule) RandomizedParams(_ *rand.Rand) []simtypes.ParamChange { - - return []simtypes.ParamChange{} -} - // RegisterStoreDecoder registers a decoder func (am AppModule) RegisterStoreDecoder(_ sdk.StoreDecoderRegistry) {} diff --git a/x/checkpointing/testckpt/helper.go b/x/checkpointing/testckpt/helper.go index b30e68b24..7f86df85e 100644 --- a/x/checkpointing/testckpt/helper.go +++ b/x/checkpointing/testckpt/helper.go @@ -59,7 +59,7 @@ func NewHelper(t *testing.T, n int) *Helper { CheckpointingKeeper: &checkpointingKeeper, MsgSrvr: msgSrvr, QueryClient: queryClient, - StakingKeeper: &stakingKeeper, + StakingKeeper: stakingKeeper, EpochingKeeper: &epochingKeeper, GenAccs: accs, } diff --git a/x/checkpointing/types/bls_key.pb.go b/x/checkpointing/types/bls_key.pb.go index b3addcff0..a15fdd132 100644 --- a/x/checkpointing/types/bls_key.pb.go +++ b/x/checkpointing/types/bls_key.pb.go @@ -6,8 +6,8 @@ package types import ( fmt "fmt" github_com_babylonchain_babylon_crypto_bls12381 "github.com/babylonchain/babylon/crypto/bls12381" + proto "github.com/cosmos/gogoproto/proto" _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" io "io" math "math" math_bits "math/bits" diff --git a/x/checkpointing/types/checkpoint.pb.go b/x/checkpointing/types/checkpoint.pb.go index 7754a8e5b..bb51a3529 100644 --- a/x/checkpointing/types/checkpoint.pb.go +++ b/x/checkpointing/types/checkpoint.pb.go @@ -8,9 +8,9 @@ import ( fmt "fmt" github_com_babylonchain_babylon_crypto_bls12381 "github.com/babylonchain/babylon/crypto/bls12381" _ "github.com/cosmos/cosmos-proto" + proto "github.com/cosmos/gogoproto/proto" + github_com_cosmos_gogoproto_types "github.com/cosmos/gogoproto/types" _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" - github_com_gogo_protobuf_types "github.com/gogo/protobuf/types" _ "google.golang.org/protobuf/types/known/timestamppb" io "io" math "math" @@ -663,7 +663,7 @@ func (m *CheckpointStateUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { var l int _ = l if m.BlockTime != nil { - n2, err2 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.BlockTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.BlockTime):]) + n2, err2 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(*m.BlockTime, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(*m.BlockTime):]) if err2 != nil { return 0, err2 } @@ -821,7 +821,7 @@ func (m *CheckpointStateUpdate) Size() (n int) { n += 1 + sovCheckpoint(uint64(m.BlockHeight)) } if m.BlockTime != nil { - l = github_com_gogo_protobuf_types.SizeOfStdTime(*m.BlockTime) + l = github_com_cosmos_gogoproto_types.SizeOfStdTime(*m.BlockTime) n += 1 + l + sovCheckpoint(uint64(l)) } return n @@ -1322,7 +1322,7 @@ func (m *CheckpointStateUpdate) Unmarshal(dAtA []byte) error { if m.BlockTime == nil { m.BlockTime = new(time.Time) } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(m.BlockTime, dAtA[iNdEx:postIndex]); err != nil { + if err := github_com_cosmos_gogoproto_types.StdTimeUnmarshal(m.BlockTime, dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex diff --git a/x/checkpointing/types/errors.go b/x/checkpointing/types/errors.go index 124fac9d0..722b11db7 100644 --- a/x/checkpointing/types/errors.go +++ b/x/checkpointing/types/errors.go @@ -1,21 +1,21 @@ package types -import sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" +import errorsmod "cosmossdk.io/errors" // x/checkpointing module sentinel errors var ( - ErrCkptDoesNotExist = sdkerrors.Register(ModuleName, 1201, "raw checkpoint does not exist") - ErrCkptAlreadyExist = sdkerrors.Register(ModuleName, 1202, "raw checkpoint already exists") - ErrCkptHashNotEqual = sdkerrors.Register(ModuleName, 1203, "hash does not equal to raw checkpoint") - ErrCkptNotAccumulating = sdkerrors.Register(ModuleName, 1204, "raw checkpoint is no longer accumulating BLS sigs") - ErrCkptAlreadyVoted = sdkerrors.Register(ModuleName, 1205, "raw checkpoint already accumulated the validator") - ErrInvalidRawCheckpoint = sdkerrors.Register(ModuleName, 1206, "raw checkpoint is invalid") - ErrInvalidCkptStatus = sdkerrors.Register(ModuleName, 1207, "raw checkpoint's status is invalid") - ErrInvalidPoP = sdkerrors.Register(ModuleName, 1208, "proof-of-possession is invalid") - ErrBlsKeyDoesNotExist = sdkerrors.Register(ModuleName, 1209, "BLS public key does not exist") - ErrBlsKeyAlreadyExist = sdkerrors.Register(ModuleName, 1210, "BLS public key already exists") - ErrBlsPrivKeyDoesNotExist = sdkerrors.Register(ModuleName, 1211, "BLS private key does not exist") - ErrInvalidBlsSignature = sdkerrors.Register(ModuleName, 1212, "BLS signature is invalid") - ErrConflictingCheckpoint = sdkerrors.Register(ModuleName, 1213, "Conflicting checkpoint is found") - ErrInvalidLastCommitHash = sdkerrors.Register(ModuleName, 1214, "Provided last commit hash is Invalid") + ErrCkptDoesNotExist = errorsmod.Register(ModuleName, 1201, "raw checkpoint does not exist") + ErrCkptAlreadyExist = errorsmod.Register(ModuleName, 1202, "raw checkpoint already exists") + ErrCkptHashNotEqual = errorsmod.Register(ModuleName, 1203, "hash does not equal to raw checkpoint") + ErrCkptNotAccumulating = errorsmod.Register(ModuleName, 1204, "raw checkpoint is no longer accumulating BLS sigs") + ErrCkptAlreadyVoted = errorsmod.Register(ModuleName, 1205, "raw checkpoint already accumulated the validator") + ErrInvalidRawCheckpoint = errorsmod.Register(ModuleName, 1206, "raw checkpoint is invalid") + ErrInvalidCkptStatus = errorsmod.Register(ModuleName, 1207, "raw checkpoint's status is invalid") + ErrInvalidPoP = errorsmod.Register(ModuleName, 1208, "proof-of-possession is invalid") + ErrBlsKeyDoesNotExist = errorsmod.Register(ModuleName, 1209, "BLS public key does not exist") + ErrBlsKeyAlreadyExist = errorsmod.Register(ModuleName, 1210, "BLS public key already exists") + ErrBlsPrivKeyDoesNotExist = errorsmod.Register(ModuleName, 1211, "BLS private key does not exist") + ErrInvalidBlsSignature = errorsmod.Register(ModuleName, 1212, "BLS signature is invalid") + ErrConflictingCheckpoint = errorsmod.Register(ModuleName, 1213, "Conflicting checkpoint is found") + ErrInvalidLastCommitHash = errorsmod.Register(ModuleName, 1214, "Provided last commit hash is Invalid") ) diff --git a/x/checkpointing/types/events.pb.go b/x/checkpointing/types/events.pb.go index 9c1c9f01f..1b528fb41 100644 --- a/x/checkpointing/types/events.pb.go +++ b/x/checkpointing/types/events.pb.go @@ -5,7 +5,7 @@ package types import ( fmt "fmt" - proto "github.com/gogo/protobuf/proto" + proto "github.com/cosmos/gogoproto/proto" io "io" math "math" math_bits "math/bits" diff --git a/x/checkpointing/types/genesis.pb.go b/x/checkpointing/types/genesis.pb.go index a5147303d..2e7a03129 100644 --- a/x/checkpointing/types/genesis.pb.go +++ b/x/checkpointing/types/genesis.pb.go @@ -7,8 +7,8 @@ import ( fmt "fmt" _ "github.com/cosmos/cosmos-proto" ed25519 "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" + proto "github.com/cosmos/gogoproto/proto" _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" io "io" math "math" math_bits "math/bits" diff --git a/x/checkpointing/types/params.pb.go b/x/checkpointing/types/params.pb.go index 4ede32150..28fb03baa 100644 --- a/x/checkpointing/types/params.pb.go +++ b/x/checkpointing/types/params.pb.go @@ -5,8 +5,8 @@ package types import ( fmt "fmt" + proto "github.com/cosmos/gogoproto/proto" _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" io "io" math "math" math_bits "math/bits" diff --git a/x/checkpointing/types/query.pb.go b/x/checkpointing/types/query.pb.go index 5450cf6a9..0422e9637 100644 --- a/x/checkpointing/types/query.pb.go +++ b/x/checkpointing/types/query.pb.go @@ -7,9 +7,9 @@ import ( context "context" fmt "fmt" query "github.com/cosmos/cosmos-sdk/types/query" + grpc1 "github.com/cosmos/gogoproto/grpc" + proto "github.com/cosmos/gogoproto/proto" _ "github.com/gogo/protobuf/gogoproto" - grpc1 "github.com/gogo/protobuf/grpc" - proto "github.com/gogo/protobuf/proto" _ "google.golang.org/genproto/googleapis/api/annotations" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" diff --git a/x/checkpointing/types/tx.pb.go b/x/checkpointing/types/tx.pb.go index 2fab4a133..edbceef5b 100644 --- a/x/checkpointing/types/tx.pb.go +++ b/x/checkpointing/types/tx.pb.go @@ -7,9 +7,9 @@ import ( context "context" fmt "fmt" types "github.com/cosmos/cosmos-sdk/x/staking/types" + grpc1 "github.com/cosmos/gogoproto/grpc" + proto "github.com/cosmos/gogoproto/proto" _ "github.com/gogo/protobuf/gogoproto" - grpc1 "github.com/gogo/protobuf/grpc" - proto "github.com/gogo/protobuf/proto" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" diff --git a/x/epoching/handler.go b/x/epoching/handler.go index 68539c222..1b0e25a85 100644 --- a/x/epoching/handler.go +++ b/x/epoching/handler.go @@ -3,6 +3,7 @@ package epoching import ( "fmt" + errorsmod "cosmossdk.io/errors" "github.com/babylonchain/babylon/x/epoching/keeper" "github.com/babylonchain/babylon/x/epoching/types" sdk "github.com/cosmos/cosmos-sdk/types" @@ -29,7 +30,7 @@ func NewHandler(k keeper.Keeper) sdk.Handler { return sdk.WrapServiceResult(ctx, res, err) default: errMsg := fmt.Sprintf("unrecognized %s message type: %T", types.ModuleName, msg) - return nil, sdkerrors.Wrap(sdkerrors.ErrUnknownRequest, errMsg) + return nil, errorsmod.Wrap(sdkerrors.ErrUnknownRequest, errMsg) } } } diff --git a/x/epoching/keeper/apphash_chain.go b/x/epoching/keeper/apphash_chain.go index 1dae6cf57..14f4b3c37 100644 --- a/x/epoching/keeper/apphash_chain.go +++ b/x/epoching/keeper/apphash_chain.go @@ -4,10 +4,10 @@ import ( "crypto/sha256" "fmt" + errorsmod "cosmossdk.io/errors" "github.com/babylonchain/babylon/x/epoching/types" "github.com/cosmos/cosmos-sdk/store/prefix" sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" "github.com/tendermint/tendermint/crypto/merkle" tmcrypto "github.com/tendermint/tendermint/proto/tendermint/crypto" ) @@ -24,7 +24,7 @@ func (k Keeper) GetAppHash(ctx sdk.Context, height uint64) ([]byte, error) { heightBytes := sdk.Uint64ToBigEndian(height) appHash := store.Get(heightBytes) if appHash == nil { - return nil, sdkerrors.Wrapf(types.ErrInvalidHeight, "height %d is now known in DB yet", height) + return nil, errorsmod.Wrapf(types.ErrInvalidHeight, "height %d is now known in DB yet", height) } return appHash, nil } @@ -40,7 +40,7 @@ func (k Keeper) RecordAppHash(ctx sdk.Context) { func (k Keeper) GetAllAppHashsForEpoch(ctx sdk.Context, epoch *types.Epoch) ([][]byte, error) { // if this epoch is the most recent AND has not ended, then we cannot get all AppHashs for this epoch if k.GetEpoch(ctx).EpochNumber == epoch.EpochNumber && !epoch.IsLastBlock(ctx) { - return nil, sdkerrors.Wrapf(types.ErrInvalidHeight, "GetAllAppHashsForEpoch can only be invoked when this epoch has ended") + return nil, errorsmod.Wrapf(types.ErrInvalidHeight, "GetAllAppHashsForEpoch can only be invoked when this epoch has ended") } // fetch each AppHash in this epoch @@ -64,7 +64,7 @@ func (k Keeper) ProveAppHashInEpoch(ctx sdk.Context, height uint64, epochNumber return nil, err } if !epoch.WithinBoundary(height) { - return nil, sdkerrors.Wrapf(types.ErrInvalidHeight, "the given height %d is not in epoch %d (interval [%d, %d])", height, epoch.EpochNumber, epoch.FirstBlockHeight, uint64(epoch.LastBlockHeader.Height)) + return nil, errorsmod.Wrapf(types.ErrInvalidHeight, "the given height %d is not in epoch %d (interval [%d, %d])", height, epoch.EpochNumber, epoch.FirstBlockHeight, uint64(epoch.LastBlockHeader.Height)) } // calculate index of this height in this epoch diff --git a/x/epoching/keeper/epoch_msg_queue.go b/x/epoching/keeper/epoch_msg_queue.go index b370ba500..e2dbd4426 100644 --- a/x/epoching/keeper/epoch_msg_queue.go +++ b/x/epoching/keeper/epoch_msg_queue.go @@ -3,10 +3,10 @@ package keeper import ( "fmt" + errorsmod "cosmossdk.io/errors" "github.com/babylonchain/babylon/x/epoching/types" "github.com/cosmos/cosmos-sdk/store/prefix" sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" ) // InitMsgQueue initialises the msg queue length of the current epoch to 0 @@ -64,7 +64,7 @@ func (k Keeper) EnqueueMsg(ctx sdk.Context, msg types.QueuedMessage) { // value: msgBytes msgBytes, err := k.cdc.MarshalInterface(&msg) if err != nil { - panic(sdkerrors.Wrap(types.ErrMarshal, err.Error())) + panic(errorsmod.Wrap(types.ErrMarshal, err.Error())) } store.Set(queueLenBytes, msgBytes) @@ -84,7 +84,7 @@ func (k Keeper) GetEpochMsgs(ctx sdk.Context, epochNumber uint64) []*types.Queue queuedMsgBytes := iterator.Value() var sdkMsg sdk.Msg if err := k.cdc.UnmarshalInterface(queuedMsgBytes, &sdkMsg); err != nil { - panic(sdkerrors.Wrap(types.ErrUnmarshal, err.Error())) + panic(errorsmod.Wrap(types.ErrUnmarshal, err.Error())) } queuedMsg, ok := sdkMsg.(*types.QueuedMessage) if !ok { @@ -195,7 +195,7 @@ func (k Keeper) HandleQueuedMsg(ctx sdk.Context, msg *types.QueuedMessage) (*sdk return nil, err } default: - panic(sdkerrors.Wrap(types.ErrInvalidQueuedMessageType, msg.String())) + panic(errorsmod.Wrap(types.ErrInvalidQueuedMessageType, msg.String())) } return result, nil diff --git a/x/epoching/keeper/epoch_msg_queue_test.go b/x/epoching/keeper/epoch_msg_queue_test.go index 6ca85d841..bac8bf16d 100644 --- a/x/epoching/keeper/epoch_msg_queue_test.go +++ b/x/epoching/keeper/epoch_msg_queue_test.go @@ -200,11 +200,12 @@ func FuzzHandleQueuedMsg_MsgWrappedUndelegate(f *testing.F) { // ensure the genesis account has these unbonding tokens unbondingDels := helper.StakingKeeper.GetAllUnbondingDelegations(ctx, genAddr) - require.Equal(t, 1, len(unbondingDels)) // there is only 1 type of tokens - require.Equal(t, numNewUndels, int64(len(unbondingDels[0].Entries))) // there are numNewUndels entries - for _, entry := range unbondingDels[0].Entries { - require.Equal(t, coinWithOnePower.Amount, entry.Balance) // each unbonding delegation entry has tokens of 1 voting power - } + require.Equal(t, 1, len(unbondingDels)) // there is only 1 type of tokens + + // from cosmos v47, all undelegations made at the same height are represented + // by one entry see: https://github.com/cosmos/cosmos-sdk/pull/12967 + require.Equal(t, 1, len(unbondingDels[0].Entries)) + require.Equal(t, unbondingDels[0].Entries[0].Balance, coinWithOnePower.Amount.MulRaw(numNewUndels)) }) } diff --git a/x/epoching/keeper/epoch_slashed_val_set.go b/x/epoching/keeper/epoch_slashed_val_set.go index d5ccc7600..71feae801 100644 --- a/x/epoching/keeper/epoch_slashed_val_set.go +++ b/x/epoching/keeper/epoch_slashed_val_set.go @@ -1,11 +1,11 @@ package keeper import ( + errorsmod "cosmossdk.io/errors" "cosmossdk.io/math" "github.com/babylonchain/babylon/x/epoching/types" "github.com/cosmos/cosmos-sdk/store/prefix" sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" ) // setSlashedVotingPower sets the total amount of voting power that has been slashed in the epoch @@ -17,7 +17,7 @@ func (k Keeper) setSlashedVotingPower(ctx sdk.Context, epochNumber uint64, power // value: power powerBytes, err := sdk.NewInt(power).Marshal() if err != nil { - panic(sdkerrors.Wrap(types.ErrMarshal, err.Error())) + panic(errorsmod.Wrap(types.ErrMarshal, err.Error())) } store.Set(epochNumberBytes, powerBytes) @@ -43,7 +43,7 @@ func (k Keeper) GetSlashedVotingPower(ctx sdk.Context, epochNumber uint64) int64 // get value var slashedVotingPower math.Int if err := slashedVotingPower.Unmarshal(bz); err != nil { - panic(sdkerrors.Wrap(types.ErrUnmarshal, err.Error())) + panic(errorsmod.Wrap(types.ErrUnmarshal, err.Error())) } return slashedVotingPower.Int64() @@ -56,11 +56,11 @@ func (k Keeper) AddSlashedValidator(ctx sdk.Context, valAddr sdk.ValAddress) err store := k.slashedValSetStore(ctx, epochNumber) thisVotingPower, err := k.GetValidatorVotingPower(ctx, epochNumber, valAddr) if err != nil { - panic(sdkerrors.Wrap(types.ErrMarshal, err.Error())) + panic(errorsmod.Wrap(types.ErrMarshal, err.Error())) } thisVotingPowerBytes, err := sdk.NewInt(thisVotingPower).Marshal() if err != nil { - panic(sdkerrors.Wrap(types.ErrMarshal, err.Error())) + panic(errorsmod.Wrap(types.ErrMarshal, err.Error())) } // insert into "set of slashed addresses" as KV pair, where @@ -93,7 +93,7 @@ func (k Keeper) GetSlashedValidators(ctx sdk.Context, epochNumber uint64) types. } var power math.Int if err := power.Unmarshal(powerBytes); err != nil { - panic(sdkerrors.Wrap(types.ErrUnmarshal, err.Error())) + panic(errorsmod.Wrap(types.ErrUnmarshal, err.Error())) } val := types.Validator{Addr: addr, Power: power.Int64()} valSet = append(valSet, val) diff --git a/x/epoching/keeper/epoch_val_set.go b/x/epoching/keeper/epoch_val_set.go index 32c8a9f12..8f7de9a85 100644 --- a/x/epoching/keeper/epoch_val_set.go +++ b/x/epoching/keeper/epoch_val_set.go @@ -1,12 +1,12 @@ package keeper import ( + errorsmod "cosmossdk.io/errors" "cosmossdk.io/math" "github.com/babylonchain/babylon/x/epoching/types" cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" "github.com/cosmos/cosmos-sdk/store/prefix" sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" ) // GetValidatorSet returns the set of validators of a given epoch, where the validators are ordered by their address in ascending order @@ -21,7 +21,7 @@ func (k Keeper) GetValidatorSet(ctx sdk.Context, epochNumber uint64) types.Valid powerBytes := iterator.Value() var power math.Int if err := power.Unmarshal(powerBytes); err != nil { - panic(sdkerrors.Wrap(types.ErrUnmarshal, err.Error())) + panic(errorsmod.Wrap(types.ErrUnmarshal, err.Error())) } val := types.Validator{ Addr: addr, @@ -61,7 +61,7 @@ func (k Keeper) InitValidatorSet(ctx sdk.Context) { addrBytes := []byte(addr) powerBytes, err := sdk.NewInt(power).Marshal() if err != nil { - panic(sdkerrors.Wrap(types.ErrMarshal, err.Error())) + panic(errorsmod.Wrap(types.ErrMarshal, err.Error())) } store.Set(addrBytes, powerBytes) totalPower += power @@ -73,7 +73,7 @@ func (k Keeper) InitValidatorSet(ctx sdk.Context) { epochNumberBytes := sdk.Uint64ToBigEndian(epochNumber) totalPowerBytes, err := sdk.NewInt(totalPower).Marshal() if err != nil { - panic(sdkerrors.Wrap(types.ErrMarshal, err.Error())) + panic(errorsmod.Wrap(types.ErrMarshal, err.Error())) } k.votingPowerStore(ctx).Set(epochNumberBytes, totalPowerBytes) } @@ -105,7 +105,7 @@ func (k Keeper) GetValidatorVotingPower(ctx sdk.Context, epochNumber uint64, val } var power math.Int if err := power.Unmarshal(powerBytes); err != nil { - panic(sdkerrors.Wrap(types.ErrUnmarshal, err.Error())) + panic(errorsmod.Wrap(types.ErrUnmarshal, err.Error())) } return power.Int64(), nil @@ -126,7 +126,7 @@ func (k Keeper) GetTotalVotingPower(ctx sdk.Context, epochNumber uint64) int64 { } var power math.Int if err := power.Unmarshal(powerBytes); err != nil { - panic(sdkerrors.Wrap(types.ErrUnmarshal, err.Error())) + panic(errorsmod.Wrap(types.ErrUnmarshal, err.Error())) } return power.Int64() } diff --git a/x/epoching/keeper/epochs.go b/x/epoching/keeper/epochs.go index 93be60372..46629065d 100644 --- a/x/epoching/keeper/epochs.go +++ b/x/epoching/keeper/epochs.go @@ -1,10 +1,10 @@ package keeper import ( + errorsmod "cosmossdk.io/errors" "github.com/babylonchain/babylon/x/epoching/types" "github.com/cosmos/cosmos-sdk/store/prefix" sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" "github.com/tendermint/tendermint/crypto/merkle" ) @@ -82,7 +82,7 @@ func (k Keeper) GetHistoricalEpoch(ctx sdk.Context, epochNumber uint64) (*types. func (k Keeper) RecordLastHeaderAndAppHashRoot(ctx sdk.Context) error { epoch := k.GetEpoch(ctx) if !epoch.IsLastBlock(ctx) { - return sdkerrors.Wrapf(types.ErrInvalidHeight, "RecordLastBlockHeader can only be invoked at the last block of an epoch") + return errorsmod.Wrapf(types.ErrInvalidHeight, "RecordLastBlockHeader can only be invoked at the last block of an epoch") } // record last block header header := ctx.BlockHeader() diff --git a/x/epoching/keeper/grpc_query.go b/x/epoching/keeper/grpc_query.go index 270018ebc..dfd8f8447 100644 --- a/x/epoching/keeper/grpc_query.go +++ b/x/epoching/keeper/grpc_query.go @@ -6,6 +6,7 @@ import ( "cosmossdk.io/math" + errorsmod "cosmossdk.io/errors" "github.com/babylonchain/babylon/x/epoching/types" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" @@ -129,7 +130,7 @@ func (k Keeper) LatestEpochMsgs(c context.Context, req *types.QueryLatestEpochMs ctx := sdk.UnwrapSDKContext(c) if req.EpochCount == 0 { - return nil, sdkerrors.Wrapf( + return nil, errorsmod.Wrapf( sdkerrors.ErrInvalidRequest, "epoch_count should be specified and be larger than zero", ) } @@ -222,7 +223,7 @@ func (k Keeper) EpochValSet(c context.Context, req *types.QueryEpochValSetReques // Here key is the validator's ValAddress, and value is the voting power var power math.Int if err := power.Unmarshal(value); err != nil { - panic(sdkerrors.Wrap(types.ErrUnmarshal, err.Error())) // this only happens upon a programming error + panic(errorsmod.Wrap(types.ErrUnmarshal, err.Error())) // this only happens upon a programming error } val := types.Validator{ Addr: key, diff --git a/x/epoching/keeper/hooks.go b/x/epoching/keeper/hooks.go index 7117d4a13..a30ab69e6 100644 --- a/x/epoching/keeper/hooks.go +++ b/x/epoching/keeper/hooks.go @@ -134,3 +134,7 @@ func (h Hooks) AfterRawCheckpointForgotten(ctx sdk.Context, ckpt *checkpointingt func (h Hooks) AfterRawCheckpointBlsSigVerified(ctx sdk.Context, ckpt *checkpointingtypes.RawCheckpoint) error { return nil } + +func (h Hooks) AfterUnbondingInitiated(ctx sdk.Context, id uint64) error { + return nil +} diff --git a/x/epoching/keeper/msg_server.go b/x/epoching/keeper/msg_server.go index 0e96d7f38..b05703f75 100644 --- a/x/epoching/keeper/msg_server.go +++ b/x/epoching/keeper/msg_server.go @@ -8,6 +8,7 @@ import ( sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/tendermint/tendermint/crypto/tmhash" + errorsmod "cosmossdk.io/errors" ) type msgServer struct { @@ -39,7 +40,7 @@ func (k msgServer) WrappedDelegate(goCtx context.Context, msg *types.MsgWrappedD } bondDenom := k.stk.BondDenom(ctx) if msg.Msg.Amount.Denom != bondDenom { - return nil, sdkerrors.Wrapf( + return nil, errorsmod.Wrapf( sdkerrors.ErrInvalidRequest, "invalid coin denomination: got %s, expected %s", msg.Msg.Amount.Denom, bondDenom, ) } @@ -92,7 +93,7 @@ func (k msgServer) WrappedUndelegate(goCtx context.Context, msg *types.MsgWrappe } bondDenom := k.stk.BondDenom(ctx) if msg.Msg.Amount.Denom != bondDenom { - return nil, sdkerrors.Wrapf( + return nil, errorsmod.Wrapf( sdkerrors.ErrInvalidRequest, "invalid coin denomination: got %s, expected %s", msg.Msg.Amount.Denom, bondDenom, ) } @@ -145,7 +146,7 @@ func (k msgServer) WrappedBeginRedelegate(goCtx context.Context, msg *types.MsgW } bondDenom := k.stk.BondDenom(ctx) if msg.Msg.Amount.Denom != bondDenom { - return nil, sdkerrors.Wrapf( + return nil, errorsmod.Wrapf( sdkerrors.ErrInvalidRequest, "invalid coin denomination: got %s, expected %s", msg.Msg.Amount.Denom, bondDenom, ) } diff --git a/x/epoching/keeper/staking_functions.go b/x/epoching/keeper/staking_functions.go index ad03c20fa..3ff138444 100644 --- a/x/epoching/keeper/staking_functions.go +++ b/x/epoching/keeper/staking_functions.go @@ -5,6 +5,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" + errorsmod "cosmossdk.io/errors" "github.com/babylonchain/babylon/x/epoching/types" ) @@ -25,7 +26,7 @@ func (k Keeper) CheckMsgCreateValidator(ctx sdk.Context, msg *stakingtypes.MsgCr // check commission rate if msg.Commission.Rate.LT(sParams.MinCommissionRate) { - return sdkerrors.Wrapf(stakingtypes.ErrCommissionLTMinRate, "cannot set validator commission to less than minimum rate of %s", sParams.MinCommissionRate) + return errorsmod.Wrapf(stakingtypes.ErrCommissionLTMinRate, "cannot set validator commission to less than minimum rate of %s", sParams.MinCommissionRate) } // ensure the validator operator was not registered before @@ -36,7 +37,7 @@ func (k Keeper) CheckMsgCreateValidator(ctx sdk.Context, msg *stakingtypes.MsgCr // check if the pubkey is correctly encoded pk, ok := msg.Pubkey.GetCachedValue().(cryptotypes.PubKey) if !ok { - return sdkerrors.Wrapf(sdkerrors.ErrInvalidType, "Expecting cryptotypes.PubKey, got %T", pk) + return errorsmod.Wrapf(sdkerrors.ErrInvalidType, "Expecting cryptotypes.PubKey, got %T", pk) } // ensure the validator was not registered before @@ -46,7 +47,7 @@ func (k Keeper) CheckMsgCreateValidator(ctx sdk.Context, msg *stakingtypes.MsgCr // ensure BondDemon is correct if msg.Value.Denom != sParams.BondDenom { - return sdkerrors.Wrapf( + return errorsmod.Wrapf( sdkerrors.ErrInvalidRequest, "invalid coin denomination: got %s, expected %s", msg.Value.Denom, sParams.BondDenom, ) } @@ -68,7 +69,7 @@ func (k Keeper) CheckMsgCreateValidator(ctx sdk.Context, msg *stakingtypes.MsgCr } } if !hasKeyType { - return sdkerrors.Wrapf( + return errorsmod.Wrapf( stakingtypes.ErrValidatorPubKeyTypeNotSupported, "got: %s, expected: %s", pk.Type(), cp.Validator.PubKeyTypes, ) diff --git a/x/epoching/module.go b/x/epoching/module.go index 77ad84fe9..9b34fdb89 100644 --- a/x/epoching/module.go +++ b/x/epoching/module.go @@ -126,19 +126,9 @@ func (am AppModule) Name() string { return am.AppModuleBasic.Name() } -// Route returns the capability module's message routing key. -func (am AppModule) Route() sdk.Route { - return sdk.NewRoute(types.RouterKey, NewHandler(am.keeper)) -} - // QuerierRoute returns the capability module's query routing key. func (AppModule) QuerierRoute() string { return types.QuerierRoute } -// LegacyQuerierHandler returns the capability module's Querier. -func (am AppModule) LegacyQuerierHandler(legacyQuerierCdc *codec.LegacyAmino) sdk.Querier { - return nil -} - // RegisterServices registers a GRPC query service to respond to the // module-specific GRPC queries. func (am AppModule) RegisterServices(cfg module.Configurator) { diff --git a/x/epoching/module_simulation.go b/x/epoching/module_simulation.go index 40bfc890d..f5591fede 100644 --- a/x/epoching/module_simulation.go +++ b/x/epoching/module_simulation.go @@ -1,12 +1,10 @@ package epoching import ( - "math/rand" - + simappparams "github.com/babylonchain/babylon/app/params" epochingsimulation "github.com/babylonchain/babylon/x/epoching/simulation" "github.com/babylonchain/babylon/x/epoching/types" "github.com/cosmos/cosmos-sdk/baseapp" - simappparams "github.com/cosmos/cosmos-sdk/simapp/params" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" simtypes "github.com/cosmos/cosmos-sdk/types/simulation" @@ -27,15 +25,10 @@ func (AppModule) GenerateGenesisState(simState *module.SimulationState) { } // ProposalContents doesn't return any content functions for governance proposals -func (AppModule) ProposalContents(_ module.SimulationState) []simtypes.WeightedProposalContent { +func (AppModule) ProposalContents(_ module.SimulationState) []simtypes.WeightedProposalMsg { return nil } -// RandomizedParams creates randomized param changes for the simulator -func (am AppModule) RandomizedParams(r *rand.Rand) []simtypes.ParamChange { - return epochingsimulation.ParamChanges(r) -} - // RegisterStoreDecoder registers a decoder func (am AppModule) RegisterStoreDecoder(sdr sdk.StoreDecoderRegistry) { sdr[types.StoreKey] = epochingsimulation.NewDecodeStore(am.cdc) diff --git a/x/epoching/simulation/decoder.go b/x/epoching/simulation/decoder.go index 6346110b9..9c3bccc45 100644 --- a/x/epoching/simulation/decoder.go +++ b/x/epoching/simulation/decoder.go @@ -4,11 +4,11 @@ import ( "bytes" "fmt" + errorsmod "cosmossdk.io/errors" "cosmossdk.io/math" "github.com/babylonchain/babylon/x/epoching/types" "github.com/cosmos/cosmos-sdk/codec" sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" "github.com/cosmos/cosmos-sdk/types/kv" ) @@ -37,11 +37,11 @@ func NewDecodeStore(cdc codec.Codec) func(kvA, kvB kv.Pair) string { bytes.Equal(kvA.Key[:1], types.SlashedValidatorSetKey): valSetA, err := types.NewValidatorSetFromBytes(kvA.Value) if err != nil { - panic(sdkerrors.Wrap(types.ErrUnmarshal, err.Error())) + panic(errorsmod.Wrap(types.ErrUnmarshal, err.Error())) } valSetB, err := types.NewValidatorSetFromBytes(kvB.Value) if err != nil { - panic(sdkerrors.Wrap(types.ErrUnmarshal, err.Error())) + panic(errorsmod.Wrap(types.ErrUnmarshal, err.Error())) } return fmt.Sprintf("%v\n%v", valSetA, valSetB) @@ -49,10 +49,10 @@ func NewDecodeStore(cdc codec.Codec) func(kvA, kvB kv.Pair) string { bytes.Equal(kvA.Key[:1], types.SlashedVotingPowerKey): var powerA, powerB math.Int if err := powerA.Unmarshal(kvA.Value); err != nil { - panic(sdkerrors.Wrap(types.ErrUnmarshal, err.Error())) + panic(errorsmod.Wrap(types.ErrUnmarshal, err.Error())) } if err := powerB.Unmarshal(kvA.Value); err != nil { - panic(sdkerrors.Wrap(types.ErrUnmarshal, err.Error())) + panic(errorsmod.Wrap(types.ErrUnmarshal, err.Error())) } return fmt.Sprintf("%v\n%v", powerA, powerB) diff --git a/x/epoching/simulation/operations.go b/x/epoching/simulation/operations.go index 31760584b..e338bde0a 100644 --- a/x/epoching/simulation/operations.go +++ b/x/epoching/simulation/operations.go @@ -8,10 +8,11 @@ import ( "github.com/babylonchain/babylon/x/epoching/types" "github.com/cosmos/cosmos-sdk/baseapp" "github.com/cosmos/cosmos-sdk/codec" - simappparams "github.com/cosmos/cosmos-sdk/simapp/params" sdk "github.com/cosmos/cosmos-sdk/types" + moduletestutil "github.com/cosmos/cosmos-sdk/types/module/testutil" simtypes "github.com/cosmos/cosmos-sdk/types/simulation" "github.com/cosmos/cosmos-sdk/x/simulation" + simappparams "github.com/cosmos/cosmos-sdk/x/staking/simulation" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" ) @@ -114,10 +115,9 @@ func SimulateMsgWrappedDelegate(ak types.AccountKeeper, bk types.BankKeeper, stk msg := stakingtypes.NewMsgDelegate(simAccount.Address, val.GetOperator(), bondAmt) wmsg := types.NewMsgWrappedDelegate(msg) - txCtx := simulation.OperationInput{ App: app, - TxGen: simappparams.MakeTestEncodingConfig().TxConfig, + TxGen: moduletestutil.MakeTestEncodingConfig().TxConfig, Cdc: nil, Msg: wmsg, MsgType: wmsg.Type(), @@ -203,7 +203,7 @@ func SimulateMsgWrappedUndelegate(ak types.AccountKeeper, bk types.BankKeeper, s txCtx := simulation.OperationInput{ R: r, App: app, - TxGen: simappparams.MakeTestEncodingConfig().TxConfig, + TxGen: moduletestutil.MakeTestEncodingConfig().TxConfig, Cdc: nil, Msg: wmsg, MsgType: wmsg.Type(), @@ -312,7 +312,7 @@ func SimulateMsgWrappedBeginRedelegate(ak types.AccountKeeper, bk types.BankKeep txCtx := simulation.OperationInput{ R: r, App: app, - TxGen: simappparams.MakeTestEncodingConfig().TxConfig, + TxGen: moduletestutil.MakeTestEncodingConfig().TxConfig, Cdc: nil, Msg: wmsg, MsgType: wmsg.Type(), diff --git a/x/epoching/simulation/params.go b/x/epoching/simulation/params.go deleted file mode 100644 index c0a8c4336..000000000 --- a/x/epoching/simulation/params.go +++ /dev/null @@ -1,21 +0,0 @@ -package simulation - -// DONTCOVER - -import ( - "math/rand" - - simtypes "github.com/cosmos/cosmos-sdk/types/simulation" -) - -// ParamChanges defines the parameters that can be modified by param change proposals on the simulation -// TODO: add support of changing EpochInterval on-the-fly -func ParamChanges(r *rand.Rand) []simtypes.ParamChange { - return []simtypes.ParamChange{ - // simulation.NewSimParamChange(types.ModuleName, string(types.KeyEpochInterval), - // func(r *rand.Rand) string { - // return fmt.Sprintf("%d", genEpochInterval(r)) - // }, - // ), - } -} diff --git a/x/epoching/simulation/params_test.go b/x/epoching/simulation/params_test.go deleted file mode 100644 index afd2e3307..000000000 --- a/x/epoching/simulation/params_test.go +++ /dev/null @@ -1,37 +0,0 @@ -package simulation_test - -import ( - "math/rand" - "testing" - - "github.com/stretchr/testify/require" - - "github.com/babylonchain/babylon/x/epoching/simulation" -) - -func TestParamChanges(t *testing.T) { - t.Skip("TODO: support changing epoch interval on-the-fly") - - s := rand.NewSource(1) - r := rand.New(s) - - expected := []struct { - composedKey string - key string - simValue string - subspace string - }{ - {"epoching/EpochInterval", "EpochInterval", "82", "epoching"}, - } - - paramChanges := simulation.ParamChanges(r) - - require.Len(t, paramChanges, 1) - - for i, p := range paramChanges { - require.Equal(t, expected[i].composedKey, p.ComposedKey()) - require.Equal(t, expected[i].key, p.Key()) - require.Equal(t, expected[i].simValue, p.SimValue()(r)) - require.Equal(t, expected[i].subspace, p.Subspace()) - } -} diff --git a/x/epoching/testepoching/helper.go b/x/epoching/testepoching/helper.go index 14df4f6b0..9ce4f0a46 100644 --- a/x/epoching/testepoching/helper.go +++ b/x/epoching/testepoching/helper.go @@ -76,7 +76,7 @@ func NewHelper(t *testing.T) *Helper { &epochingKeeper, msgSrvr, queryClient, - &app.StakingKeeper, + app.StakingKeeper, nil, []ValidatorInfo{ValidatorInfo{ blsPrivKey, @@ -123,7 +123,7 @@ func NewHelperWithValSet(t *testing.T) *Helper { queryClient := types.NewQueryClient(queryHelper) msgSrvr := keeper.NewMsgServerImpl(epochingKeeper) - return &Helper{t, ctx, app, &epochingKeeper, msgSrvr, queryClient, &app.StakingKeeper, GenAccs, valInfos} + return &Helper{t, ctx, app, &epochingKeeper, msgSrvr, queryClient, app.StakingKeeper, GenAccs, valInfos} } // GenAndApplyEmptyBlock generates a new empty block and appends it to the current blockchain diff --git a/x/epoching/types/epoching.go b/x/epoching/types/epoching.go index 2f222fd4c..7c37e18be 100644 --- a/x/epoching/types/epoching.go +++ b/x/epoching/types/epoching.go @@ -3,9 +3,9 @@ package types import ( "time" + errorsmod "cosmossdk.io/errors" codectypes "github.com/cosmos/cosmos-sdk/codec/types" cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" sdk "github.com/cosmos/cosmos-sdk/types" @@ -170,7 +170,7 @@ func (qm *QueuedMessage) UnwrapToSdkMsg() sdk.Msg { case *QueuedMessage_MsgBeginRedelegate: unwrappedMsgWithType = unwrappedMsg.MsgBeginRedelegate default: - panic(sdkerrors.Wrap(ErrInvalidQueuedMessageType, qm.String())) + panic(errorsmod.Wrap(ErrInvalidQueuedMessageType, qm.String())) } return unwrappedMsgWithType } diff --git a/x/epoching/types/epoching.pb.go b/x/epoching/types/epoching.pb.go index a2681aef8..2b726e3d1 100644 --- a/x/epoching/types/epoching.pb.go +++ b/x/epoching/types/epoching.pb.go @@ -6,9 +6,9 @@ package types import ( fmt "fmt" types1 "github.com/cosmos/cosmos-sdk/x/staking/types" + proto "github.com/cosmos/gogoproto/proto" + github_com_cosmos_gogoproto_types "github.com/cosmos/gogoproto/types" _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" - github_com_gogo_protobuf_types "github.com/gogo/protobuf/types" types "github.com/tendermint/tendermint/proto/tendermint/types" _ "google.golang.org/protobuf/types/known/timestamppb" io "io" @@ -815,7 +815,7 @@ func (m *QueuedMessage) MarshalToSizedBuffer(dAtA []byte) (int, error) { } } if m.BlockTime != nil { - n3, err3 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.BlockTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.BlockTime):]) + n3, err3 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(*m.BlockTime, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(*m.BlockTime):]) if err3 != nil { return 0, err3 } @@ -993,7 +993,7 @@ func (m *ValStateUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { var l int _ = l if m.BlockTime != nil { - n8, err8 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.BlockTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.BlockTime):]) + n8, err8 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(*m.BlockTime, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(*m.BlockTime):]) if err8 != nil { return 0, err8 } @@ -1080,7 +1080,7 @@ func (m *DelegationStateUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { var l int _ = l if m.BlockTime != nil { - n9, err9 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.BlockTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.BlockTime):]) + n9, err9 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(*m.BlockTime, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(*m.BlockTime):]) if err9 != nil { return 0, err9 } @@ -1247,7 +1247,7 @@ func (m *QueuedMessage) Size() (n int) { n += 1 + sovEpoching(uint64(m.BlockHeight)) } if m.BlockTime != nil { - l = github_com_gogo_protobuf_types.SizeOfStdTime(*m.BlockTime) + l = github_com_cosmos_gogoproto_types.SizeOfStdTime(*m.BlockTime) n += 1 + l + sovEpoching(uint64(l)) } if m.Msg != nil { @@ -1335,7 +1335,7 @@ func (m *ValStateUpdate) Size() (n int) { n += 1 + sovEpoching(uint64(m.BlockHeight)) } if m.BlockTime != nil { - l = github_com_gogo_protobuf_types.SizeOfStdTime(*m.BlockTime) + l = github_com_cosmos_gogoproto_types.SizeOfStdTime(*m.BlockTime) n += 1 + l + sovEpoching(uint64(l)) } return n @@ -1377,7 +1377,7 @@ func (m *DelegationStateUpdate) Size() (n int) { n += 1 + sovEpoching(uint64(m.BlockHeight)) } if m.BlockTime != nil { - l = github_com_gogo_protobuf_types.SizeOfStdTime(*m.BlockTime) + l = github_com_cosmos_gogoproto_types.SizeOfStdTime(*m.BlockTime) n += 1 + l + sovEpoching(uint64(l)) } return n @@ -1785,7 +1785,7 @@ func (m *QueuedMessage) Unmarshal(dAtA []byte) error { if m.BlockTime == nil { m.BlockTime = new(time.Time) } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(m.BlockTime, dAtA[iNdEx:postIndex]); err != nil { + if err := github_com_cosmos_gogoproto_types.StdTimeUnmarshal(m.BlockTime, dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -2152,7 +2152,7 @@ func (m *ValStateUpdate) Unmarshal(dAtA []byte) error { if m.BlockTime == nil { m.BlockTime = new(time.Time) } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(m.BlockTime, dAtA[iNdEx:postIndex]); err != nil { + if err := github_com_cosmos_gogoproto_types.StdTimeUnmarshal(m.BlockTime, dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -2424,7 +2424,7 @@ func (m *DelegationStateUpdate) Unmarshal(dAtA []byte) error { if m.BlockTime == nil { m.BlockTime = new(time.Time) } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(m.BlockTime, dAtA[iNdEx:postIndex]); err != nil { + if err := github_com_cosmos_gogoproto_types.StdTimeUnmarshal(m.BlockTime, dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex diff --git a/x/epoching/types/errors.go b/x/epoching/types/errors.go index 2798ac410..ab254e392 100644 --- a/x/epoching/types/errors.go +++ b/x/epoching/types/errors.go @@ -3,23 +3,23 @@ package types // DONTCOVER import ( - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + errorsmod "cosmossdk.io/errors" ) // x/epoching module sentinel errors var ( - ErrUnwrappedMsgType = sdkerrors.Register(ModuleName, 1, "invalid message type in {MsgCreateValidator, MsgDelegate, MsgUndelegate, MsgBeginRedelegate} messages. use wrapped versions instead") - ErrInvalidQueuedMessageType = sdkerrors.Register(ModuleName, 2, "invalid message type of a QueuedMessage") - ErrUnknownEpochNumber = sdkerrors.Register(ModuleName, 3, "the epoch number is not known in DB") - ErrUnknownQueueLen = sdkerrors.Register(ModuleName, 4, "the msg queue length is not known in DB") - ErrUnknownSlashedVotingPower = sdkerrors.Register(ModuleName, 5, "the slashed voting power is not known in DB. Maybe the epoch has been checkpointed?") - ErrUnknownValidator = sdkerrors.Register(ModuleName, 6, "the validator is not known in the validator set.") - ErrUnknownTotalVotingPower = sdkerrors.Register(ModuleName, 7, "the total voting power is not known in DB.") - ErrMarshal = sdkerrors.Register(ModuleName, 8, "marshal error.") - ErrUnmarshal = sdkerrors.Register(ModuleName, 9, "unmarshal error.") - ErrNoWrappedMsg = sdkerrors.Register(ModuleName, 10, "the wrapped msg contains no msg inside.") - ErrZeroEpochMsg = sdkerrors.Register(ModuleName, 11, "the 0-th epoch does not handle messages") - ErrInvalidEpoch = sdkerrors.Register(ModuleName, 12, "the epoch is invalid") - ErrInvalidHeight = sdkerrors.Register(ModuleName, 13, "the height is invalid") - ErrInsufficientBalance = sdkerrors.Register(ModuleName, 14, "the delegator has insufficient balance to perform delegate") + ErrUnwrappedMsgType = errorsmod.Register(ModuleName, 1, "invalid message type in {MsgCreateValidator, MsgDelegate, MsgUndelegate, MsgBeginRedelegate} messages. use wrapped versions instead") + ErrInvalidQueuedMessageType = errorsmod.Register(ModuleName, 2, "invalid message type of a QueuedMessage") + ErrUnknownEpochNumber = errorsmod.Register(ModuleName, 3, "the epoch number is not known in DB") + ErrUnknownQueueLen = errorsmod.Register(ModuleName, 4, "the msg queue length is not known in DB") + ErrUnknownSlashedVotingPower = errorsmod.Register(ModuleName, 5, "the slashed voting power is not known in DB. Maybe the epoch has been checkpointed?") + ErrUnknownValidator = errorsmod.Register(ModuleName, 6, "the validator is not known in the validator set.") + ErrUnknownTotalVotingPower = errorsmod.Register(ModuleName, 7, "the total voting power is not known in DB.") + ErrMarshal = errorsmod.Register(ModuleName, 8, "marshal error.") + ErrUnmarshal = errorsmod.Register(ModuleName, 9, "unmarshal error.") + ErrNoWrappedMsg = errorsmod.Register(ModuleName, 10, "the wrapped msg contains no msg inside.") + ErrZeroEpochMsg = errorsmod.Register(ModuleName, 11, "the 0-th epoch does not handle messages") + ErrInvalidEpoch = errorsmod.Register(ModuleName, 12, "the epoch is invalid") + ErrInvalidHeight = errorsmod.Register(ModuleName, 13, "the height is invalid") + ErrInsufficientBalance = errorsmod.Register(ModuleName, 14, "the delegator has insufficient balance to perform delegate") ) diff --git a/x/epoching/types/events.pb.go b/x/epoching/types/events.pb.go index 63842f488..2b9187465 100644 --- a/x/epoching/types/events.pb.go +++ b/x/epoching/types/events.pb.go @@ -5,8 +5,8 @@ package types import ( fmt "fmt" + proto "github.com/cosmos/gogoproto/proto" _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" github_com_tendermint_tendermint_abci_types "github.com/tendermint/tendermint/abci/types" io "io" math "math" diff --git a/x/epoching/types/genesis.pb.go b/x/epoching/types/genesis.pb.go index 3e4e6fd37..82dadbfdf 100644 --- a/x/epoching/types/genesis.pb.go +++ b/x/epoching/types/genesis.pb.go @@ -5,8 +5,8 @@ package types import ( fmt "fmt" + proto "github.com/cosmos/gogoproto/proto" _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" io "io" math "math" math_bits "math/bits" diff --git a/x/epoching/types/params.pb.go b/x/epoching/types/params.pb.go index 3fbf60413..213c6cb4b 100644 --- a/x/epoching/types/params.pb.go +++ b/x/epoching/types/params.pb.go @@ -5,8 +5,8 @@ package types import ( fmt "fmt" + proto "github.com/cosmos/gogoproto/proto" _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" io "io" math "math" math_bits "math/bits" diff --git a/x/epoching/types/query.pb.go b/x/epoching/types/query.pb.go index 798a86562..42e332ba5 100644 --- a/x/epoching/types/query.pb.go +++ b/x/epoching/types/query.pb.go @@ -7,9 +7,9 @@ import ( context "context" fmt "fmt" query "github.com/cosmos/cosmos-sdk/types/query" + grpc1 "github.com/cosmos/gogoproto/grpc" + proto "github.com/cosmos/gogoproto/proto" _ "github.com/gogo/protobuf/gogoproto" - grpc1 "github.com/gogo/protobuf/grpc" - proto "github.com/gogo/protobuf/proto" _ "google.golang.org/genproto/googleapis/api/annotations" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" diff --git a/x/epoching/types/tx.pb.go b/x/epoching/types/tx.pb.go index 8a6295869..f1357370a 100644 --- a/x/epoching/types/tx.pb.go +++ b/x/epoching/types/tx.pb.go @@ -8,9 +8,9 @@ import ( fmt "fmt" _ "github.com/cosmos/cosmos-sdk/codec/types" types "github.com/cosmos/cosmos-sdk/x/staking/types" + grpc1 "github.com/cosmos/gogoproto/grpc" + proto "github.com/cosmos/gogoproto/proto" _ "github.com/gogo/protobuf/gogoproto" - grpc1 "github.com/gogo/protobuf/grpc" - proto "github.com/gogo/protobuf/proto" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" diff --git a/x/monitor/handler.go b/x/monitor/handler.go index f9d925572..38cae1b35 100644 --- a/x/monitor/handler.go +++ b/x/monitor/handler.go @@ -3,6 +3,7 @@ package monitor import ( "fmt" + errorsmod "cosmossdk.io/errors" "github.com/babylonchain/babylon/x/monitor/keeper" "github.com/babylonchain/babylon/x/monitor/types" sdk "github.com/cosmos/cosmos-sdk/types" @@ -17,7 +18,7 @@ func NewHandler(k keeper.Keeper) sdk.Handler { switch msg := msg.(type) { default: errMsg := fmt.Sprintf("unrecognized %s message type: %T", types.ModuleName, msg) - return nil, sdkerrors.Wrap(sdkerrors.ErrUnknownRequest, errMsg) + return nil, errorsmod.Wrap(sdkerrors.ErrUnknownRequest, errMsg) } } } diff --git a/x/monitor/module.go b/x/monitor/module.go index 337d27286..b0cd1298b 100644 --- a/x/monitor/module.go +++ b/x/monitor/module.go @@ -124,19 +124,9 @@ func (am AppModule) Name() string { return am.AppModuleBasic.Name() } -// Route returns the capability module's message routing key. -func (am AppModule) Route() sdk.Route { - return sdk.NewRoute(types.RouterKey, NewHandler(am.keeper)) -} - // QuerierRoute returns the capability module's query routing key. func (AppModule) QuerierRoute() string { return types.QuerierRoute } -// LegacyQuerierHandler returns the capability module's Querier. -func (am AppModule) LegacyQuerierHandler(legacyQuerierCdc *codec.LegacyAmino) sdk.Querier { - return nil -} - // RegisterServices registers a GRPC query service to respond to the // module-specific GRPC queries. func (am AppModule) RegisterServices(cfg module.Configurator) { diff --git a/x/monitor/module_simulation.go b/x/monitor/module_simulation.go index bf642f766..6a904a7be 100644 --- a/x/monitor/module_simulation.go +++ b/x/monitor/module_simulation.go @@ -1,12 +1,10 @@ package monitor import ( - "math/rand" - + simappparams "github.com/babylonchain/babylon/app/params" monitorsimulation "github.com/babylonchain/babylon/x/monitor/simulation" "github.com/babylonchain/babylon/x/monitor/types" "github.com/cosmos/cosmos-sdk/baseapp" - simappparams "github.com/cosmos/cosmos-sdk/simapp/params" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" simtypes "github.com/cosmos/cosmos-sdk/types/simulation" @@ -34,16 +32,10 @@ func (AppModule) GenerateGenesisState(simState *module.SimulationState) { } // ProposalContents doesn't return any content functions for governance proposals -func (AppModule) ProposalContents(_ module.SimulationState) []simtypes.WeightedProposalContent { +func (AppModule) ProposalContents(_ module.SimulationState) []simtypes.WeightedProposalMsg { return nil } -// RandomizedParams creates randomized param changes for the simulator -func (am AppModule) RandomizedParams(_ *rand.Rand) []simtypes.ParamChange { - - return []simtypes.ParamChange{} -} - // RegisterStoreDecoder registers a decoder func (am AppModule) RegisterStoreDecoder(_ sdk.StoreDecoderRegistry) {} diff --git a/x/monitor/types/errors.go b/x/monitor/types/errors.go index 565387fe6..85139bba8 100644 --- a/x/monitor/types/errors.go +++ b/x/monitor/types/errors.go @@ -3,11 +3,11 @@ package types // DONTCOVER import ( - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + errorsmod "cosmossdk.io/errors" ) // x/monitor module sentinel errors var ( - ErrEpochNotEnded = sdkerrors.Register(ModuleName, 1100, "Epoch not ended yet") - ErrCheckpointNotReported = sdkerrors.Register(ModuleName, 1101, "Checkpoint not reported yet") + ErrEpochNotEnded = errorsmod.Register(ModuleName, 1100, "Epoch not ended yet") + ErrCheckpointNotReported = errorsmod.Register(ModuleName, 1101, "Checkpoint not reported yet") ) diff --git a/x/monitor/types/genesis.pb.go b/x/monitor/types/genesis.pb.go index 2bfeb15e0..a7223c78e 100644 --- a/x/monitor/types/genesis.pb.go +++ b/x/monitor/types/genesis.pb.go @@ -5,8 +5,8 @@ package types import ( fmt "fmt" + proto "github.com/cosmos/gogoproto/proto" _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" io "io" math "math" math_bits "math/bits" diff --git a/x/monitor/types/params.pb.go b/x/monitor/types/params.pb.go index 70566842b..24b569b44 100644 --- a/x/monitor/types/params.pb.go +++ b/x/monitor/types/params.pb.go @@ -5,8 +5,8 @@ package types import ( fmt "fmt" + proto "github.com/cosmos/gogoproto/proto" _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" io "io" math "math" math_bits "math/bits" diff --git a/x/monitor/types/query.pb.go b/x/monitor/types/query.pb.go index 8be5efc78..a6beaaef6 100644 --- a/x/monitor/types/query.pb.go +++ b/x/monitor/types/query.pb.go @@ -7,9 +7,9 @@ import ( context "context" fmt "fmt" _ "github.com/cosmos/cosmos-sdk/types/query" + grpc1 "github.com/cosmos/gogoproto/grpc" + proto "github.com/cosmos/gogoproto/proto" _ "github.com/gogo/protobuf/gogoproto" - grpc1 "github.com/gogo/protobuf/grpc" - proto "github.com/gogo/protobuf/proto" _ "google.golang.org/genproto/googleapis/api/annotations" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" diff --git a/x/zoneconcierge/keeper/chain_info_indexer.go b/x/zoneconcierge/keeper/chain_info_indexer.go index b85462fe2..1f6f07c14 100644 --- a/x/zoneconcierge/keeper/chain_info_indexer.go +++ b/x/zoneconcierge/keeper/chain_info_indexer.go @@ -3,7 +3,7 @@ package keeper import ( "fmt" - sdkerrors "cosmossdk.io/errors" + errorsmod "cosmossdk.io/errors" "github.com/babylonchain/babylon/x/zoneconcierge/types" "github.com/cosmos/cosmos-sdk/store/prefix" sdk "github.com/cosmos/cosmos-sdk/types" @@ -20,7 +20,7 @@ func (k Keeper) InitChainInfo(ctx sdk.Context, chainID string) (*types.ChainInfo } // ensure chain info has not been initialised yet if k.HasChainInfo(ctx, chainID) { - return nil, sdkerrors.Wrapf(types.ErrInvalidChainInfo, "chain info has already initialized") + return nil, errorsmod.Wrapf(types.ErrInvalidChainInfo, "chain info has already initialized") } chainInfo := &types.ChainInfo{ @@ -67,7 +67,7 @@ func (k Keeper) GetChainInfo(ctx sdk.Context, chainID string) (*types.ChainInfo, // equal to the total number of headers in CZ. func (k Keeper) updateLatestHeader(ctx sdk.Context, chainID string, header *types.IndexedHeader) error { if header == nil { - return sdkerrors.Wrapf(types.ErrInvalidHeader, "header is nil") + return errorsmod.Wrapf(types.ErrInvalidHeader, "header is nil") } chainInfo, err := k.GetChainInfo(ctx, chainID) if err != nil { @@ -88,12 +88,12 @@ func (k Keeper) updateLatestHeader(ctx sdk.Context, chainID string, header *type // - If this fork header is older than the current latest fork, ignore func (k Keeper) tryToUpdateLatestForkHeader(ctx sdk.Context, chainID string, header *types.IndexedHeader) error { if header == nil { - return sdkerrors.Wrapf(types.ErrInvalidHeader, "header is nil") + return errorsmod.Wrapf(types.ErrInvalidHeader, "header is nil") } chainInfo, err := k.GetChainInfo(ctx, chainID) if err != nil { - return sdkerrors.Wrapf(types.ErrChainInfoNotFound, "cannot insert fork header when chain info is not initialized") + return errorsmod.Wrapf(types.ErrChainInfoNotFound, "cannot insert fork header when chain info is not initialized") } if len(chainInfo.LatestForks.Headers) == 0 { diff --git a/x/zoneconcierge/keeper/epoch_chain_info_indexer_test.go b/x/zoneconcierge/keeper/epoch_chain_info_indexer_test.go index 02f8b0606..7dcdd3465 100644 --- a/x/zoneconcierge/keeper/epoch_chain_info_indexer_test.go +++ b/x/zoneconcierge/keeper/epoch_chain_info_indexer_test.go @@ -5,7 +5,7 @@ import ( "testing" "github.com/babylonchain/babylon/testutil/datagen" - ibctmtypes "github.com/cosmos/ibc-go/v5/modules/light-clients/07-tendermint/types" + ibctmtypes "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" "github.com/stretchr/testify/require" ) diff --git a/x/zoneconcierge/keeper/grpc_query_test.go b/x/zoneconcierge/keeper/grpc_query_test.go index cb910ebfa..a961a7056 100644 --- a/x/zoneconcierge/keeper/grpc_query_test.go +++ b/x/zoneconcierge/keeper/grpc_query_test.go @@ -10,7 +10,7 @@ import ( checkpointingtypes "github.com/babylonchain/babylon/x/checkpointing/types" zctypes "github.com/babylonchain/babylon/x/zoneconcierge/types" "github.com/cosmos/cosmos-sdk/types/query" - ibctmtypes "github.com/cosmos/ibc-go/v5/modules/light-clients/07-tendermint/types" + ibctmtypes "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" "github.com/golang/mock/gomock" "github.com/stretchr/testify/require" tmcrypto "github.com/tendermint/tendermint/proto/tendermint/crypto" diff --git a/x/zoneconcierge/keeper/hooks.go b/x/zoneconcierge/keeper/hooks.go index d3e931377..7e85570c3 100644 --- a/x/zoneconcierge/keeper/hooks.go +++ b/x/zoneconcierge/keeper/hooks.go @@ -3,13 +3,13 @@ package keeper import ( "fmt" + errorsmod "cosmossdk.io/errors" checkpointingtypes "github.com/babylonchain/babylon/x/checkpointing/types" epochingtypes "github.com/babylonchain/babylon/x/epoching/types" "github.com/babylonchain/babylon/x/zoneconcierge/types" sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - ibcclientkeeper "github.com/cosmos/ibc-go/v5/modules/core/02-client/keeper" - ibctmtypes "github.com/cosmos/ibc-go/v5/modules/light-clients/07-tendermint/types" + ibcclientkeeper "github.com/cosmos/ibc-go/v7/modules/core/02-client/keeper" + ibctmtypes "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" ) type Hooks struct { @@ -38,7 +38,7 @@ func (h Hooks) AfterHeaderWithValidCommit(ctx sdk.Context, txHash []byte, header // initialise chain info if not exist chainInfo, err := h.k.GetChainInfo(ctx, indexedHeader.ChainId) if err != nil { - if sdkerrors.IsOf(err, types.ErrEpochChainInfoNotFound) { + if errorsmod.IsOf(err, types.ErrEpochChainInfoNotFound) { // chain info does not exist yet, initialise chain info for this chain chainInfo, err = h.k.InitChainInfo(ctx, indexedHeader.ChainId) if err != nil { diff --git a/x/zoneconcierge/keeper/ibc_packet.go b/x/zoneconcierge/keeper/ibc_packet.go index 7d97c2d32..a75fc2415 100644 --- a/x/zoneconcierge/keeper/ibc_packet.go +++ b/x/zoneconcierge/keeper/ibc_packet.go @@ -4,15 +4,15 @@ import ( "fmt" "time" - sdkerrors "cosmossdk.io/errors" + errorsmod "cosmossdk.io/errors" metrics "github.com/armon/go-metrics" "github.com/babylonchain/babylon/x/zoneconcierge/types" "github.com/cosmos/cosmos-sdk/telemetry" sdk "github.com/cosmos/cosmos-sdk/types" - clienttypes "github.com/cosmos/ibc-go/v5/modules/core/02-client/types" - channeltypes "github.com/cosmos/ibc-go/v5/modules/core/04-channel/types" - host "github.com/cosmos/ibc-go/v5/modules/core/24-host" - coretypes "github.com/cosmos/ibc-go/v5/modules/core/types" + clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" + channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" + host "github.com/cosmos/ibc-go/v7/modules/core/24-host" + coretypes "github.com/cosmos/ibc-go/v7/modules/core/types" ) // SendIBCPacket sends an IBC packet to a channel @@ -24,44 +24,33 @@ func (k Keeper) SendIBCPacket(ctx sdk.Context, channel channeltypes.IdentifiedCh destinationPort := channel.Counterparty.GetPortID() destinationChannel := channel.Counterparty.GetChannelID() - // find the next sequence number - sequence, found := k.channelKeeper.GetNextSequenceSend(ctx, sourcePort, sourceChannel) - if !found { - return sdkerrors.Wrapf( - channeltypes.ErrSequenceSendNotFound, - "source port: %s, source channel: %s", sourcePort, sourceChannel, - ) - } - // begin createOutgoingPacket logic // See spec for this logic: https://github.com/cosmos/ibc/tree/master/spec/app/ics-020-fungible-token-transfer#packet-relay channelCap, ok := k.scopedKeeper.GetCapability(ctx, host.ChannelCapabilityPath(sourcePort, sourceChannel)) if !ok { - return sdkerrors.Wrapf(channeltypes.ErrChannelCapabilityNotFound, "module does not own channel capability: sourcePort: %s, sourceChannel: %s", sourcePort, sourceChannel) + return errorsmod.Wrapf(channeltypes.ErrChannelCapabilityNotFound, "module does not own channel capability: sourcePort: %s, sourceChannel: %s", sourcePort, sourceChannel) } // timeout timeoutTime := uint64(ctx.BlockHeader().Time.Add(time.Hour * 24).UnixNano()) // TODO: parameterise zeroheight := clienttypes.ZeroHeight() - // construct packet from packet data - packet := channeltypes.NewPacket( - k.cdc.MustMarshal(packetData), - sequence, + seq, err := k.ics4Wrapper.SendPacket( + ctx, + channelCap, sourcePort, sourceChannel, - destinationPort, - destinationChannel, zeroheight, // no need to set timeout height if timeout timestamp is set timeoutTime, // if the packet is not relayed after this time, then the packet will be time out + k.cdc.MustMarshal(packetData), ) // send packet - if err := k.ics4Wrapper.SendPacket(ctx, channelCap, packet); err != nil { + if err != nil { // Failed/timeout packet should not make the system crash - k.Logger(ctx).Error(fmt.Sprintf("failed to send IBC packet (sequence number: %d) to channel %v port %s: %v", packet.Sequence, destinationChannel, destinationPort, err)) + k.Logger(ctx).Error(fmt.Sprintf("failed to send IBC packet (sequence number: %d) to channel %v port %s: %v", seq, destinationChannel, destinationPort, err)) } else { - k.Logger(ctx).Info(fmt.Sprintf("successfully sent IBC packet (sequence number: %d) to channel %v port %s", packet.Sequence, destinationChannel, destinationPort)) + k.Logger(ctx).Info(fmt.Sprintf("successfully sent IBC packet (sequence number: %d) to channel %v port %s", seq, destinationChannel, destinationPort)) } // metrics stuff diff --git a/x/zoneconcierge/keeper/keeper.go b/x/zoneconcierge/keeper/keeper.go index 2db45a40a..ef3fe8b5a 100644 --- a/x/zoneconcierge/keeper/keeper.go +++ b/x/zoneconcierge/keeper/keeper.go @@ -7,8 +7,9 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types" paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" - channeltypes "github.com/cosmos/ibc-go/v5/modules/core/04-channel/types" - host "github.com/cosmos/ibc-go/v5/modules/core/24-host" + channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" + host "github.com/cosmos/ibc-go/v7/modules/core/24-host" + ibcexported "github.com/cosmos/ibc-go/v7/modules/core/exported" "github.com/tendermint/tendermint/libs/log" ) @@ -76,7 +77,7 @@ func NewKeeper( // Logger returns a module-specific logger. func (k Keeper) Logger(ctx sdk.Context) log.Logger { - return ctx.Logger().With("module", "x/"+host.ModuleName+"-"+types.ModuleName) + return ctx.Logger().With("module", "x/"+ibcexported.ModuleName+"-"+types.ModuleName) } // IsBound checks if the transfer module is already bound to the desired port diff --git a/x/zoneconcierge/keeper/keeper_test.go b/x/zoneconcierge/keeper/keeper_test.go index eb69f4f86..68e72f86c 100644 --- a/x/zoneconcierge/keeper/keeper_test.go +++ b/x/zoneconcierge/keeper/keeper_test.go @@ -5,8 +5,8 @@ import ( "testing" sdk "github.com/cosmos/cosmos-sdk/types" - ibctmtypes "github.com/cosmos/ibc-go/v5/modules/light-clients/07-tendermint/types" - ibctesting "github.com/cosmos/ibc-go/v5/testing" + ibctmtypes "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" + ibctesting "github.com/cosmos/ibc-go/v7/testing" "github.com/babylonchain/babylon/app" "github.com/babylonchain/babylon/testutil/datagen" diff --git a/x/zoneconcierge/keeper/proof_epoch_sealed.go b/x/zoneconcierge/keeper/proof_epoch_sealed.go index 6d16129d5..ac36f372e 100644 --- a/x/zoneconcierge/keeper/proof_epoch_sealed.go +++ b/x/zoneconcierge/keeper/proof_epoch_sealed.go @@ -3,12 +3,12 @@ package keeper import ( "fmt" + errorsmod "cosmossdk.io/errors" "github.com/babylonchain/babylon/crypto/bls12381" checkpointingtypes "github.com/babylonchain/babylon/x/checkpointing/types" epochingtypes "github.com/babylonchain/babylon/x/epoching/types" "github.com/babylonchain/babylon/x/zoneconcierge/types" sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" tmcrypto "github.com/tendermint/tendermint/proto/tendermint/crypto" ) @@ -154,7 +154,7 @@ func VerifyEpochSealed(epoch *epochingtypes.Epoch, rawCkpt *checkpointingtypes.R return err } if err := VerifyStore(root, epochingtypes.StoreKey, getEpochInfoKey(epoch.EpochNumber), epochBytes, proof.ProofEpochInfo); err != nil { - return sdkerrors.Wrapf(types.ErrInvalidMerkleProof, "invalid inclusion proof for epoch metadata: %w", err) + return errorsmod.Wrapf(types.ErrInvalidMerkleProof, "invalid inclusion proof for epoch metadata: %v", err) } // Ensure The validator set is committed to the app_hash of the sealer header @@ -163,7 +163,7 @@ func VerifyEpochSealed(epoch *epochingtypes.Epoch, rawCkpt *checkpointingtypes.R return err } if err := VerifyStore(root, checkpointingtypes.StoreKey, getValSetKey(epoch.EpochNumber), valSetBytes, proof.ProofEpochValSet); err != nil { - return sdkerrors.Wrapf(types.ErrInvalidMerkleProof, "invalid inclusion proof for validator set: %w", err) + return errorsmod.Wrapf(types.ErrInvalidMerkleProof, "invalid inclusion proof for validator set: %v", err) } return nil diff --git a/x/zoneconcierge/keeper/proof_tx_in_block_test.go b/x/zoneconcierge/keeper/proof_tx_in_block_test.go index 889121542..dc2e73770 100644 --- a/x/zoneconcierge/keeper/proof_tx_in_block_test.go +++ b/x/zoneconcierge/keeper/proof_tx_in_block_test.go @@ -18,7 +18,8 @@ import ( func TestProveTxInBlock(t *testing.T) { // setup virtual network - cfg := network.DefaultConfig() + min := network.MinimumAppConfig() + cfg, _ := network.DefaultConfigWithAppConfig(min) encodingCfg := app.GetEncodingConfig() cfg.InterfaceRegistry = encodingCfg.InterfaceRegistry cfg.TxConfig = encodingCfg.TxConfig diff --git a/x/zoneconcierge/module.go b/x/zoneconcierge/module.go index ee59187f4..333712a53 100644 --- a/x/zoneconcierge/module.go +++ b/x/zoneconcierge/module.go @@ -18,7 +18,7 @@ import ( cdctypes "github.com/cosmos/cosmos-sdk/codec/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" - porttypes "github.com/cosmos/ibc-go/v5/modules/core/05-port/types" + porttypes "github.com/cosmos/ibc-go/v7/modules/core/05-port/types" ) var ( @@ -111,17 +111,9 @@ func NewAppModule( } } -// Deprecated: use RegisterServices -func (am AppModule) Route() sdk.Route { return sdk.Route{} } - // Deprecated: use RegisterServices func (AppModule) QuerierRoute() string { return types.RouterKey } -// Deprecated: use RegisterServices -func (am AppModule) LegacyQuerierHandler(_ *codec.LegacyAmino) sdk.Querier { - return nil -} - // RegisterServices registers a gRPC query service to respond to the module-specific gRPC queries func (am AppModule) RegisterServices(cfg module.Configurator) { types.RegisterMsgServer(cfg.MsgServer(), keeper.NewMsgServerImpl(am.keeper)) diff --git a/x/zoneconcierge/module_ibc.go b/x/zoneconcierge/module_ibc.go index e8a81cd83..758cc6451 100644 --- a/x/zoneconcierge/module_ibc.go +++ b/x/zoneconcierge/module_ibc.go @@ -8,10 +8,11 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types" - channeltypes "github.com/cosmos/ibc-go/v5/modules/core/04-channel/types" - porttypes "github.com/cosmos/ibc-go/v5/modules/core/05-port/types" - host "github.com/cosmos/ibc-go/v5/modules/core/24-host" - ibcexported "github.com/cosmos/ibc-go/v5/modules/core/exported" + channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" + porttypes "github.com/cosmos/ibc-go/v7/modules/core/05-port/types" + host "github.com/cosmos/ibc-go/v7/modules/core/24-host" + ibcexported "github.com/cosmos/ibc-go/v7/modules/core/exported" + errorsmod "cosmossdk.io/errors" ) type IBCModule struct { @@ -38,7 +39,7 @@ func (im IBCModule) OnChanOpenInit( // Require portID to be the one that ZoneConcierge is bound to boundPort := im.keeper.GetPort(ctx) if boundPort != portID { - return "", sdkerrors.Wrapf(porttypes.ErrInvalidPort, "invalid port: %s, expected %s", portID, boundPort) + return "", errorsmod.Wrapf(porttypes.ErrInvalidPort, "invalid port: %s, expected %s", portID, boundPort) } // Claim channel capability passed back by IBC module @@ -63,7 +64,7 @@ func (im IBCModule) OnChanOpenTry( // Require portID to be the one that ZoneConcierge is bound to boundPort := im.keeper.GetPort(ctx) if boundPort != portID { - return "", sdkerrors.Wrapf(porttypes.ErrInvalidPort, "invalid port: %s, expected %s", portID, boundPort) + return "", errorsmod.Wrapf(porttypes.ErrInvalidPort, "invalid port: %s, expected %s", portID, boundPort) } // Module may have already claimed capability in OnChanOpenInit in the case of crossing hellos @@ -90,7 +91,7 @@ func (im IBCModule) OnChanOpenAck( ) error { // // TODO (Babylon): check version consistency (this requires modifying CZ code) // if counterpartyVersion != types.Version { - // return sdkerrors.Wrapf(types.ErrInvalidVersion, "invalid counterparty version: %s, expected %s", counterpartyVersion, types.Version) + // return errorsmod.Wrapf(types.ErrInvalidVersion, "invalid counterparty version: %s, expected %s", counterpartyVersion, types.Version) // } return nil } @@ -111,7 +112,7 @@ func (im IBCModule) OnChanCloseInit( channelID string, ) error { // Disallow user-initiated channel closing for channels - return sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "user cannot close channel") + return errorsmod.Wrap(sdkerrors.ErrInvalidRequest, "user cannot close channel") } // OnChanCloseConfirm implements the IBCModule interface @@ -133,7 +134,7 @@ func (im IBCModule) OnRecvPacket( var modulePacketData types.ZoneconciergePacketData if err := modulePacketData.Unmarshal(modulePacket.GetData()); err != nil { - return channeltypes.NewErrorAcknowledgement(sdkerrors.Wrapf(sdkerrors.ErrUnknownRequest, "cannot unmarshal packet data: %s", err.Error())) + return channeltypes.NewErrorAcknowledgement(errorsmod.Wrapf(sdkerrors.ErrUnknownRequest, "cannot unmarshal packet data: %s", err.Error())) } // // TODO (Babylon): Dispatch and process packet @@ -156,7 +157,7 @@ func (im IBCModule) OnAcknowledgementPacket( ) error { var ack channeltypes.Acknowledgement if err := types.ModuleCdc.UnmarshalJSON(acknowledgement, &ack); err != nil { - return sdkerrors.Wrapf(sdkerrors.ErrUnknownRequest, "cannot unmarshal packet acknowledgement: %v", err) + return errorsmod.Wrapf(sdkerrors.ErrUnknownRequest, "cannot unmarshal packet acknowledgement: %v", err) } var eventType string @@ -165,7 +166,7 @@ func (im IBCModule) OnAcknowledgementPacket( // switch packet := modulePacketData.Packet.(type) { // default: // errMsg := fmt.Sprintf("unrecognized %s packet type: %T", types.ModuleName, packet) - // return sdkerrors.Wrap(sdkerrors.ErrUnknownRequest, errMsg) + // return errorsmod.Wrap(sdkerrors.ErrUnknownRequest, errMsg) // } ctx.EventManager().EmitEvent( @@ -204,14 +205,14 @@ func (im IBCModule) OnTimeoutPacket( ) error { var modulePacketData types.ZoneconciergePacketData if err := modulePacketData.Unmarshal(modulePacket.GetData()); err != nil { - return sdkerrors.Wrapf(sdkerrors.ErrUnknownRequest, "cannot unmarshal packet data: %s", err.Error()) + return errorsmod.Wrapf(sdkerrors.ErrUnknownRequest, "cannot unmarshal packet data: %s", err.Error()) } // // TODO (Babylon): Dispatch and process packet // switch packet := modulePacketData.Packet.(type) { // default: // errMsg := fmt.Sprintf("unrecognized %s packet type: %T", types.ModuleName, packet) - // return sdkerrors.Wrap(sdkerrors.ErrUnknownRequest, errMsg) + // return errorsmod.Wrap(sdkerrors.ErrUnknownRequest, errMsg) // } return nil diff --git a/x/zoneconcierge/module_ibc_packet_test.go b/x/zoneconcierge/module_ibc_packet_test.go index 01f56aacb..3dbcdf712 100644 --- a/x/zoneconcierge/module_ibc_packet_test.go +++ b/x/zoneconcierge/module_ibc_packet_test.go @@ -4,8 +4,8 @@ import ( "encoding/json" "math/rand" - channeltypes "github.com/cosmos/ibc-go/v5/modules/core/04-channel/types" - ibctesting "github.com/cosmos/ibc-go/v5/testing" + channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" + ibctesting "github.com/cosmos/ibc-go/v7/testing" "github.com/babylonchain/babylon/app" zctypes "github.com/babylonchain/babylon/x/zoneconcierge/types" diff --git a/x/zoneconcierge/module_simulation.go b/x/zoneconcierge/module_simulation.go index 104ed625d..52dd2f4f1 100644 --- a/x/zoneconcierge/module_simulation.go +++ b/x/zoneconcierge/module_simulation.go @@ -1,16 +1,15 @@ package zoneconcierge import ( - "math/rand" + simtypes "github.com/cosmos/cosmos-sdk/types/simulation" + simappparams "github.com/babylonchain/babylon/app/params" "github.com/babylonchain/babylon/testutil/sample" zoneconciergesimulation "github.com/babylonchain/babylon/x/zoneconcierge/simulation" "github.com/babylonchain/babylon/x/zoneconcierge/types" "github.com/cosmos/cosmos-sdk/baseapp" - simappparams "github.com/cosmos/cosmos-sdk/simapp/params" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" - simtypes "github.com/cosmos/cosmos-sdk/types/simulation" "github.com/cosmos/cosmos-sdk/x/simulation" ) @@ -37,16 +36,10 @@ func (AppModule) GenerateGenesisState(simState *module.SimulationState) { } // ProposalContents doesn't return any content functions for governance proposals -func (AppModule) ProposalContents(_ module.SimulationState) []simtypes.WeightedProposalContent { +func (AppModule) ProposalContents(_ module.SimulationState) []simtypes.WeightedProposalMsg { return nil } -// RandomizedParams creates randomized param changes for the simulator -func (am AppModule) RandomizedParams(_ *rand.Rand) []simtypes.ParamChange { - - return []simtypes.ParamChange{} -} - // RegisterStoreDecoder registers a decoder func (am AppModule) RegisterStoreDecoder(_ sdk.StoreDecoderRegistry) {} diff --git a/x/zoneconcierge/module_test.go b/x/zoneconcierge/module_test.go index b15dc3320..9867ecd05 100644 --- a/x/zoneconcierge/module_test.go +++ b/x/zoneconcierge/module_test.go @@ -11,15 +11,15 @@ import ( cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" sdk "github.com/cosmos/cosmos-sdk/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - clientexported "github.com/cosmos/ibc-go/v5/modules/core/02-client/exported" - "github.com/cosmos/ibc-go/v5/modules/core/02-client/types" - clienttypes "github.com/cosmos/ibc-go/v5/modules/core/02-client/types" - commitmenttypes "github.com/cosmos/ibc-go/v5/modules/core/23-commitment/types" - "github.com/cosmos/ibc-go/v5/modules/core/exported" - ibctmtypes "github.com/cosmos/ibc-go/v5/modules/light-clients/07-tendermint/types" - ibctesting "github.com/cosmos/ibc-go/v5/testing" - ibctestingmock "github.com/cosmos/ibc-go/v5/testing/mock" - "github.com/cosmos/ibc-go/v5/testing/simapp" + clientexported "github.com/cosmos/ibc-go/v7/modules/core/02-client/exported" + "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" + clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" + commitmenttypes "github.com/cosmos/ibc-go/v7/modules/core/23-commitment/types" + "github.com/cosmos/ibc-go/v7/modules/core/exported" + ibctmtypes "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" + ibctesting "github.com/cosmos/ibc-go/v7/testing" + ibctestingmock "github.com/cosmos/ibc-go/v7/testing/mock" + "github.com/cosmos/ibc-go/v7/testing/simapp" "github.com/stretchr/testify/suite" tmbytes "github.com/tendermint/tendermint/libs/bytes" tmproto "github.com/tendermint/tendermint/proto/tendermint/types" @@ -184,7 +184,7 @@ func (suite *ZoneConciergeTestSuite) TestUpdateClientTendermint() { {"valid duplicate update", func() { clientID := path.EndpointA.ClientID - height1 := clienttypes.NewHeight(0, 1) + height1 := clienttypes.NewHeight(1, 1) // store previous consensus state prevConsState := &ibctmtypes.ConsensusState{ @@ -193,7 +193,7 @@ func (suite *ZoneConciergeTestSuite) TestUpdateClientTendermint() { } suite.babylonChain.App.GetIBCKeeper().ClientKeeper.SetClientConsensusState(suite.babylonChain.GetContext(), clientID, height1, prevConsState) - height5 := clienttypes.NewHeight(0, 5) + height5 := clienttypes.NewHeight(1, 5) // store next consensus state to check that trustedHeight does not need to be hightest consensus state before header height nextConsState := &ibctmtypes.ConsensusState{ Timestamp: suite.past.Add(time.Minute), @@ -201,7 +201,7 @@ func (suite *ZoneConciergeTestSuite) TestUpdateClientTendermint() { } suite.babylonChain.App.GetIBCKeeper().ClientKeeper.SetClientConsensusState(suite.babylonChain.GetContext(), clientID, height5, nextConsState) - height3 := clienttypes.NewHeight(0, 3) + height3 := clienttypes.NewHeight(1, 3) // updateHeader will fill in consensus state between prevConsState and suite.consState // clientState should not be updated updateHeader = createPastUpdateFn(height3, height1) @@ -211,7 +211,7 @@ func (suite *ZoneConciergeTestSuite) TestUpdateClientTendermint() { {"misbehaviour in dishonest majority CZ: conflicting header", func() { clientID := path.EndpointA.ClientID - height1 := clienttypes.NewHeight(0, 1) + height1 := clienttypes.NewHeight(1, 1) // store previous consensus state prevConsState := &ibctmtypes.ConsensusState{ Timestamp: suite.past, @@ -219,7 +219,7 @@ func (suite *ZoneConciergeTestSuite) TestUpdateClientTendermint() { } suite.babylonChain.App.GetIBCKeeper().ClientKeeper.SetClientConsensusState(suite.babylonChain.GetContext(), clientID, height1, prevConsState) - height5 := clienttypes.NewHeight(0, 5) + height5 := clienttypes.NewHeight(1, 5) // store next consensus state to check that trustedHeight does not need to be hightest consensus state before header height nextConsState := &ibctmtypes.ConsensusState{ Timestamp: suite.past.Add(time.Minute), @@ -227,7 +227,7 @@ func (suite *ZoneConciergeTestSuite) TestUpdateClientTendermint() { } suite.babylonChain.App.GetIBCKeeper().ClientKeeper.SetClientConsensusState(suite.babylonChain.GetContext(), clientID, height5, nextConsState) - height3 := clienttypes.NewHeight(0, 3) + height3 := clienttypes.NewHeight(1, 3) // updateHeader will fill in consensus state between prevConsState and suite.consState // clientState should not be updated updateHeader = createPastUpdateFn(height3, height1) diff --git a/x/zoneconcierge/types/errors.go b/x/zoneconcierge/types/errors.go index 483ae213b..9dc7587a6 100644 --- a/x/zoneconcierge/types/errors.go +++ b/x/zoneconcierge/types/errors.go @@ -3,24 +3,24 @@ package types // DONTCOVER import ( - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + errorsmod "cosmossdk.io/errors" ) // x/zoneconcierge module sentinel errors var ( - ErrSample = sdkerrors.Register(ModuleName, 1100, "sample error") - ErrInvalidPacketTimeout = sdkerrors.Register(ModuleName, 1101, "invalid packet timeout") - ErrInvalidVersion = sdkerrors.Register(ModuleName, 1102, "invalid version") - ErrHeaderNotFound = sdkerrors.Register(ModuleName, 1103, "no header exists at this height") - ErrInvalidHeader = sdkerrors.Register(ModuleName, 1104, "input header is invalid") - ErrNoValidAncestorHeader = sdkerrors.Register(ModuleName, 1105, "no valid ancestor for this header") - ErrForkNotFound = sdkerrors.Register(ModuleName, 1106, "cannot find fork") - ErrInvalidForks = sdkerrors.Register(ModuleName, 1107, "input forks is invalid") - ErrChainInfoNotFound = sdkerrors.Register(ModuleName, 1108, "no chain info exists") - ErrEpochChainInfoNotFound = sdkerrors.Register(ModuleName, 1109, "no chain info exists at this epoch") - ErrEpochHeadersNotFound = sdkerrors.Register(ModuleName, 1110, "no timestamped header exists at this epoch") - ErrFinalizedEpochNotFound = sdkerrors.Register(ModuleName, 1111, "cannot find a finalized epoch") - ErrInvalidProofEpochSealed = sdkerrors.Register(ModuleName, 1112, "invalid ProofEpochSealed") - ErrInvalidMerkleProof = sdkerrors.Register(ModuleName, 1113, "invalid Merkle inclusion proof") - ErrInvalidChainInfo = sdkerrors.Register(ModuleName, 1114, "invalid chain info") + ErrSample = errorsmod.Register(ModuleName, 1100, "sample error") + ErrInvalidPacketTimeout = errorsmod.Register(ModuleName, 1101, "invalid packet timeout") + ErrInvalidVersion = errorsmod.Register(ModuleName, 1102, "invalid version") + ErrHeaderNotFound = errorsmod.Register(ModuleName, 1103, "no header exists at this height") + ErrInvalidHeader = errorsmod.Register(ModuleName, 1104, "input header is invalid") + ErrNoValidAncestorHeader = errorsmod.Register(ModuleName, 1105, "no valid ancestor for this header") + ErrForkNotFound = errorsmod.Register(ModuleName, 1106, "cannot find fork") + ErrInvalidForks = errorsmod.Register(ModuleName, 1107, "input forks is invalid") + ErrChainInfoNotFound = errorsmod.Register(ModuleName, 1108, "no chain info exists") + ErrEpochChainInfoNotFound = errorsmod.Register(ModuleName, 1109, "no chain info exists at this epoch") + ErrEpochHeadersNotFound = errorsmod.Register(ModuleName, 1110, "no timestamped header exists at this epoch") + ErrFinalizedEpochNotFound = errorsmod.Register(ModuleName, 1111, "cannot find a finalized epoch") + ErrInvalidProofEpochSealed = errorsmod.Register(ModuleName, 1112, "invalid ProofEpochSealed") + ErrInvalidMerkleProof = errorsmod.Register(ModuleName, 1113, "invalid Merkle inclusion proof") + ErrInvalidChainInfo = errorsmod.Register(ModuleName, 1114, "invalid chain info") ) diff --git a/x/zoneconcierge/types/expected_keepers.go b/x/zoneconcierge/types/expected_keepers.go index 190f1daaf..5ecc04428 100644 --- a/x/zoneconcierge/types/expected_keepers.go +++ b/x/zoneconcierge/types/expected_keepers.go @@ -3,15 +3,17 @@ package types import ( context "context" + clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" + btcctypes "github.com/babylonchain/babylon/x/btccheckpoint/types" checkpointingtypes "github.com/babylonchain/babylon/x/checkpointing/types" epochingtypes "github.com/babylonchain/babylon/x/epoching/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/auth/types" capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types" - connectiontypes "github.com/cosmos/ibc-go/v5/modules/core/03-connection/types" - channeltypes "github.com/cosmos/ibc-go/v5/modules/core/04-channel/types" - ibcexported "github.com/cosmos/ibc-go/v5/modules/core/exported" + connectiontypes "github.com/cosmos/ibc-go/v7/modules/core/03-connection/types" + channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" + ibcexported "github.com/cosmos/ibc-go/v7/modules/core/exported" tmcrypto "github.com/tendermint/tendermint/proto/tendermint/crypto" ctypes "github.com/tendermint/tendermint/rpc/core/types" ) @@ -34,7 +36,15 @@ type BankKeeper interface { // ICS4Wrapper defines the expected ICS4Wrapper for middleware type ICS4Wrapper interface { - SendPacket(ctx sdk.Context, channelCap *capabilitytypes.Capability, packet ibcexported.PacketI) error + SendPacket( + ctx sdk.Context, + channelCap *capabilitytypes.Capability, + sourcePort string, + sourceChannel string, + timeoutHeight clienttypes.Height, + timeoutTimestamp uint64, + data []byte, + ) (uint64, error) } // ChannelKeeper defines the expected IBC channel keeper diff --git a/x/zoneconcierge/types/genesis.go b/x/zoneconcierge/types/genesis.go index 53e808b94..5b3085d4a 100644 --- a/x/zoneconcierge/types/genesis.go +++ b/x/zoneconcierge/types/genesis.go @@ -1,7 +1,7 @@ package types import ( - host "github.com/cosmos/ibc-go/v5/modules/core/24-host" + host "github.com/cosmos/ibc-go/v7/modules/core/24-host" ) // DefaultIndex is the default global index diff --git a/x/zoneconcierge/types/genesis.pb.go b/x/zoneconcierge/types/genesis.pb.go index a71d4ff3d..7ac822bdd 100644 --- a/x/zoneconcierge/types/genesis.pb.go +++ b/x/zoneconcierge/types/genesis.pb.go @@ -5,8 +5,8 @@ package types import ( fmt "fmt" + proto "github.com/cosmos/gogoproto/proto" _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" io "io" math "math" math_bits "math/bits" diff --git a/x/zoneconcierge/types/mocked_keepers.go b/x/zoneconcierge/types/mocked_keepers.go index d58c82a20..90aaeda75 100644 --- a/x/zoneconcierge/types/mocked_keepers.go +++ b/x/zoneconcierge/types/mocked_keepers.go @@ -14,9 +14,9 @@ import ( types2 "github.com/cosmos/cosmos-sdk/types" types3 "github.com/cosmos/cosmos-sdk/x/auth/types" types4 "github.com/cosmos/cosmos-sdk/x/capability/types" - types5 "github.com/cosmos/ibc-go/v5/modules/core/03-connection/types" - types6 "github.com/cosmos/ibc-go/v5/modules/core/04-channel/types" - exported "github.com/cosmos/ibc-go/v5/modules/core/exported" + types5 "github.com/cosmos/ibc-go/v7/modules/core/03-connection/types" + types6 "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" + exported "github.com/cosmos/ibc-go/v7/modules/core/exported" gomock "github.com/golang/mock/gomock" crypto "github.com/tendermint/tendermint/proto/tendermint/crypto" coretypes "github.com/tendermint/tendermint/rpc/core/types" diff --git a/x/zoneconcierge/types/packet.pb.go b/x/zoneconcierge/types/packet.pb.go index 9db34cfb5..a6dff3387 100644 --- a/x/zoneconcierge/types/packet.pb.go +++ b/x/zoneconcierge/types/packet.pb.go @@ -5,7 +5,7 @@ package types import ( fmt "fmt" - proto "github.com/gogo/protobuf/proto" + proto "github.com/cosmos/gogoproto/proto" io "io" math "math" math_bits "math/bits" @@ -24,6 +24,7 @@ const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package type ZoneconciergePacketData struct { // Types that are valid to be assigned to Packet: + // // *ZoneconciergePacketData_Heartbeart Packet isZoneconciergePacketData_Packet `protobuf_oneof:"packet"` } diff --git a/x/zoneconcierge/types/params.pb.go b/x/zoneconcierge/types/params.pb.go index f361d64dc..127da2d72 100644 --- a/x/zoneconcierge/types/params.pb.go +++ b/x/zoneconcierge/types/params.pb.go @@ -5,8 +5,8 @@ package types import ( fmt "fmt" + proto "github.com/cosmos/gogoproto/proto" _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" io "io" math "math" math_bits "math/bits" diff --git a/x/zoneconcierge/types/query.pb.go b/x/zoneconcierge/types/query.pb.go index aa2c0e391..b447c13e8 100644 --- a/x/zoneconcierge/types/query.pb.go +++ b/x/zoneconcierge/types/query.pb.go @@ -10,9 +10,9 @@ import ( types1 "github.com/babylonchain/babylon/x/checkpointing/types" types "github.com/babylonchain/babylon/x/epoching/types" query "github.com/cosmos/cosmos-sdk/types/query" + grpc1 "github.com/cosmos/gogoproto/grpc" + proto "github.com/cosmos/gogoproto/proto" _ "github.com/gogo/protobuf/gogoproto" - grpc1 "github.com/gogo/protobuf/grpc" - proto "github.com/gogo/protobuf/proto" _ "google.golang.org/genproto/googleapis/api/annotations" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" diff --git a/x/zoneconcierge/types/tx.pb.go b/x/zoneconcierge/types/tx.pb.go index c874da3b1..5f5f02dab 100644 --- a/x/zoneconcierge/types/tx.pb.go +++ b/x/zoneconcierge/types/tx.pb.go @@ -6,8 +6,8 @@ package types import ( context "context" fmt "fmt" - grpc1 "github.com/gogo/protobuf/grpc" - proto "github.com/gogo/protobuf/proto" + grpc1 "github.com/cosmos/gogoproto/grpc" + proto "github.com/cosmos/gogoproto/proto" grpc "google.golang.org/grpc" math "math" ) diff --git a/x/zoneconcierge/types/zoneconcierge.pb.go b/x/zoneconcierge/types/zoneconcierge.pb.go index bfb3066fc..9992d6de1 100644 --- a/x/zoneconcierge/types/zoneconcierge.pb.go +++ b/x/zoneconcierge/types/zoneconcierge.pb.go @@ -7,7 +7,7 @@ import ( fmt "fmt" types2 "github.com/babylonchain/babylon/x/btccheckpoint/types" types1 "github.com/babylonchain/babylon/x/checkpointing/types" - proto "github.com/gogo/protobuf/proto" + proto "github.com/cosmos/gogoproto/proto" crypto "github.com/tendermint/tendermint/proto/tendermint/crypto" types "github.com/tendermint/tendermint/proto/tendermint/types" io "io" @@ -123,8 +123,10 @@ func (m *IndexedHeader) GetBabylonTxHash() []byte { // For example, assuming the following blockchain // ``` // A <- B <- C <- D <- E -// \ -- D1 -// \ -- D2 +// +// \ -- D1 +// \ -- D2 +// // ``` // Then the fork will be {[D1, D2]} where each item is in struct `IndexedBlock`. // From bab63043c435fe3549d9d0ddd447549fcf4a5e6d Mon Sep 17 00:00:00 2001 From: KonradStaniec Date: Mon, 6 Mar 2023 11:59:22 +0100 Subject: [PATCH 12/59] Update protobuf generation (#322) - Updates protobuf generation - adds proto-lint and proto-format commands - fixes some minor issues with our proto files --- Makefile | 9 +- buf.work.yaml | 3 + client/docs/config.json | 8 +- client/docs/swagger-ui/swagger.yaml | 1292 +++++++++++------ go.mod | 5 +- go.sum | 13 +- proto/babylon/btccheckpoint/params.proto | 23 - .../{ => v1}/btccheckpoint.proto | 48 +- .../btccheckpoint/{ => v1}/genesis.proto | 2 +- proto/babylon/btccheckpoint/v1/params.proto | 26 + .../btccheckpoint/{ => v1}/query.proto | 32 +- proto/babylon/btccheckpoint/{ => v1}/tx.proto | 3 +- .../btclightclient/btclightclient.proto | 20 - .../btclightclient/v1/btclightclient.proto | 18 + .../btclightclient/{ => v1}/event.proto | 15 +- .../btclightclient/{ => v1}/genesis.proto | 8 +- .../btclightclient/{ => v1}/params.proto | 4 +- .../btclightclient/{ => v1}/query.proto | 54 +- .../babylon/btclightclient/{ => v1}/tx.proto | 8 +- proto/babylon/checkpointing/events.proto | 35 - .../checkpointing/{ => v1}/bls_key.proto | 29 +- .../checkpointing/{ => v1}/checkpoint.proto | 73 +- proto/babylon/checkpointing/v1/events.proto | 23 + .../checkpointing/{ => v1}/genesis.proto | 7 +- .../checkpointing/{ => v1}/params.proto | 0 .../checkpointing/{ => v1}/query.proto | 87 +- proto/babylon/checkpointing/{ => v1}/tx.proto | 10 +- proto/babylon/epoching/v1/epoching.proto | 21 +- proto/babylon/epoching/v1/events.proto | 64 +- proto/babylon/epoching/v1/genesis.proto | 4 +- proto/babylon/epoching/v1/params.proto | 5 +- proto/babylon/epoching/v1/query.proto | 81 +- proto/babylon/epoching/v1/tx.proto | 34 +- proto/babylon/monitor/{ => v1}/genesis.proto | 2 +- proto/babylon/monitor/{ => v1}/params.proto | 4 +- proto/babylon/monitor/{ => v1}/query.proto | 22 +- .../zoneconcierge/{ => v1}/genesis.proto | 2 +- .../zoneconcierge/{ => v1}/packet.proto | 0 .../zoneconcierge/{ => v1}/params.proto | 5 +- .../zoneconcierge/{ => v1}/query.proto | 100 +- proto/babylon/zoneconcierge/{ => v1}/tx.proto | 0 .../{ => v1}/zoneconcierge.proto | 62 +- proto/buf.lock | 2 +- proto/buf.yaml | 12 +- proto/scripts/protocgen.sh | 5 - test/e2e/initialization/config.go | 2 +- x/btccheckpoint/types/btccheckpoint.pb.go | 158 +- x/btccheckpoint/types/genesis.pb.go | 36 +- x/btccheckpoint/types/params.pb.go | 51 +- x/btccheckpoint/types/query.pb.go | 122 +- x/btccheckpoint/types/query.pb.gw.go | 2 +- x/btccheckpoint/types/tx.pb.go | 46 +- x/btclightclient/types/btclightclient.pb.go | 46 +- x/btclightclient/types/event.pb.go | 43 +- x/btclightclient/types/genesis.pb.go | 44 +- x/btclightclient/types/params.pb.go | 31 +- x/btclightclient/types/query.pb.go | 147 +- x/btclightclient/types/query.pb.gw.go | 2 +- x/btclightclient/types/tx.pb.go | 50 +- x/checkpointing/client/cli/tx_test.go | 2 +- x/checkpointing/types/bls_key.pb.go | 85 +- x/checkpointing/types/checkpoint.pb.go | 142 +- x/checkpointing/types/events.pb.go | 60 +- x/checkpointing/types/genesis.pb.go | 63 +- x/checkpointing/types/params.pb.go | 31 +- x/checkpointing/types/query.pb.go | 207 +-- x/checkpointing/types/query.pb.gw.go | 2 +- x/checkpointing/types/tx.pb.go | 71 +- x/epoching/types/epoching.pb.go | 17 +- x/epoching/types/events.pb.go | 2 +- x/epoching/types/genesis.pb.go | 2 +- x/epoching/types/message.pb.go | 264 ---- x/epoching/types/params.pb.go | 2 +- x/epoching/types/query.pb.go | 37 +- x/epoching/types/tx.pb.go | 71 +- x/monitor/types/genesis.pb.go | 38 +- x/monitor/types/params.pb.go | 32 +- x/monitor/types/query.pb.go | 103 +- x/monitor/types/query.pb.gw.go | 2 +- x/zoneconcierge/types/genesis.pb.go | 40 +- x/zoneconcierge/types/packet.pb.go | 37 +- x/zoneconcierge/types/params.pb.go | 31 +- x/zoneconcierge/types/query.pb.go | 257 ++-- x/zoneconcierge/types/query.pb.gw.go | 2 +- x/zoneconcierge/types/tx.pb.go | 26 +- x/zoneconcierge/types/zoneconcierge.pb.go | 163 ++- 86 files changed, 2571 insertions(+), 2278 deletions(-) create mode 100644 buf.work.yaml delete mode 100644 proto/babylon/btccheckpoint/params.proto rename proto/babylon/btccheckpoint/{ => v1}/btccheckpoint.proto (81%) rename proto/babylon/btccheckpoint/{ => v1}/genesis.proto (86%) create mode 100644 proto/babylon/btccheckpoint/v1/params.proto rename proto/babylon/btccheckpoint/{ => v1}/query.proto (68%) rename proto/babylon/btccheckpoint/{ => v1}/tx.proto (83%) delete mode 100644 proto/babylon/btclightclient/btclightclient.proto create mode 100644 proto/babylon/btclightclient/v1/btclightclient.proto rename proto/babylon/btclightclient/{ => v1}/event.proto (75%) rename proto/babylon/btclightclient/{ => v1}/genesis.proto (52%) rename proto/babylon/btclightclient/{ => v1}/params.proto (76%) rename proto/babylon/btclightclient/{ => v1}/query.proto (76%) rename proto/babylon/btclightclient/{ => v1}/tx.proto (72%) delete mode 100644 proto/babylon/checkpointing/events.proto rename proto/babylon/checkpointing/{ => v1}/bls_key.proto (66%) rename proto/babylon/checkpointing/{ => v1}/checkpoint.proto (58%) create mode 100644 proto/babylon/checkpointing/v1/events.proto rename proto/babylon/checkpointing/{ => v1}/genesis.proto (80%) rename proto/babylon/checkpointing/{ => v1}/params.proto (100%) rename proto/babylon/checkpointing/{ => v1}/query.proto (64%) rename proto/babylon/checkpointing/{ => v1}/tx.proto (83%) rename proto/babylon/monitor/{ => v1}/genesis.proto (87%) rename proto/babylon/monitor/{ => v1}/params.proto (75%) rename proto/babylon/monitor/{ => v1}/query.proto (74%) rename proto/babylon/zoneconcierge/{ => v1}/genesis.proto (87%) rename proto/babylon/zoneconcierge/{ => v1}/packet.proto (100%) rename proto/babylon/zoneconcierge/{ => v1}/params.proto (75%) rename proto/babylon/zoneconcierge/{ => v1}/query.proto (74%) rename proto/babylon/zoneconcierge/{ => v1}/tx.proto (100%) rename proto/babylon/zoneconcierge/{ => v1}/zoneconcierge.proto (75%) delete mode 100644 x/epoching/types/message.pb.go diff --git a/Makefile b/Makefile index 519380e21..95613c928 100644 --- a/Makefile +++ b/Makefile @@ -8,7 +8,6 @@ BINDIR ?= $(GOPATH)/bin BUILDDIR ?= $(CURDIR)/build HTTPS_GIT := https://github.com/babylonchain/babylon.git DOCKER := $(shell which docker) -DOCKER_BUF := $(DOCKER) run --rm -v $(CURDIR):/workspace --workdir /workspace bufbuild/buf SIMAPP = ./simapp BRANCH := $(shell git rev-parse --abbrev-ref HEAD) @@ -365,7 +364,13 @@ proto-swagger-gen: @echo "Generating Protobuf Swagger" @$(protoImage) sh ./proto/scripts/protoc-swagger-gen.sh -.PHONY: proto-gen proto-swagger-gen +proto-format: + @$(protoImage) find ./ -name "*.proto" -exec clang-format -i {} \; + +proto-lint: + @$(protoImage) buf lint --error-format=json + +.PHONY: proto-gen proto-swagger-gen proto-format prot-lint ############################################################################### ### Localnet ### diff --git a/buf.work.yaml b/buf.work.yaml new file mode 100644 index 000000000..1878b341b --- /dev/null +++ b/buf.work.yaml @@ -0,0 +1,3 @@ +version: v1 +directories: + - proto diff --git a/client/docs/config.json b/client/docs/config.json index b6dc889ab..ece266f16 100644 --- a/client/docs/config.json +++ b/client/docs/config.json @@ -7,7 +7,7 @@ }, "apis": [ { - "url": "./tmp-swagger-gen/babylon/btccheckpoint/query.swagger.json", + "url": "./tmp-swagger-gen/babylon/btccheckpoint/v1/query.swagger.json", "operationIds": { "rename": { "Params": "BtcCheckpointParams" @@ -15,7 +15,7 @@ } }, { - "url": "./tmp-swagger-gen/babylon/btclightclient/query.swagger.json", + "url": "./tmp-swagger-gen/babylon/btclightclient/v1/query.swagger.json", "operationIds": { "rename": { "Params": "BtcLightClientParams" @@ -31,7 +31,7 @@ } }, { - "url": "./tmp-swagger-gen/babylon/checkpointing/query.swagger.json", + "url": "./tmp-swagger-gen/babylon/checkpointing/v1/query.swagger.json", "operationIds": { "rename": { "Params": "CheckpointingParams" @@ -39,7 +39,7 @@ } }, { - "url": "./tmp-swagger-gen/babylon/zoneconcierge/query.swagger.json", + "url": "./tmp-swagger-gen/babylon/zoneconcierge/v1/query.swagger.json", "operationIds": { "rename": { "Params": "ZoneConciergeParams" diff --git a/client/docs/swagger-ui/swagger.yaml b/client/docs/swagger-ui/swagger.yaml index 4af7653bf..acc8ec4af 100644 --- a/client/docs/swagger-ui/swagger.yaml +++ b/client/docs/swagger-ui/swagger.yaml @@ -86,7 +86,9 @@ paths: valideated the proof? title: >- TransactionInfo is the info of a tx that contains - Babylon checkpoint, including + Babylon checkpoint, + + including - the position of the tx on BTC blockchain @@ -146,7 +148,7 @@ paths: repeated Bar results = 1; PageResponse page = 2; } - title: >- + title: |- QueryBtcCheckpointsInfoResponse is response type for the Query/BtcCheckpointsInfo RPC method default: @@ -259,17 +261,19 @@ paths: format: uint64 title: >- checkpoint_finalization_timeout is the maximum time window - (measured in BTC blocks) between a checkpoint + (measured in BTC + + blocks) between a checkpoint - being submitted to BTC, and - being reported back to BBN If a checkpoint has not been reported back within w BTC - blocks, then BBN has dishonest majority and is stalling - checkpoints + blocks, then BBN - (w in research paper) + has dishonest majority and is stalling checkpoints (w in + research paper) description: >- QueryParamsResponse is response type for the Query/Params RPC method. @@ -375,7 +379,9 @@ paths: valideated the proof? title: >- TransactionInfo is the info of a tx that contains - Babylon checkpoint, including + Babylon checkpoint, + + including - the position of the tx on BTC blockchain @@ -405,7 +411,7 @@ paths: submission message MsgInsertBTCSpvProof itself title: list of vigilantes' addresses - title: >- + title: |- QueryBtcCheckpointInfoResponse is response type for the Query/BtcCheckpointInfo RPC method default: @@ -432,7 +438,7 @@ paths: format: byte parameters: - name: epoch_num - description: >- + description: |- Number of epoch for which the earliest checkpointing btc height is requested in: path @@ -479,20 +485,19 @@ paths: submission we need list of transaction keys. Each submission can generally be identified by this list of - (txIdx, blockHash) + (txIdx, - tuples. + blockHash) tuples. Note: this could possibly be optimized as + if transactions - Note: this could possibly be optimized as if transactions - were in one block + were in one block they would have the same block hash and + different indexes, - they would have the same block hash and different indexes, - but each blockhash + but each blockhash is only 33 (1 byte for prefix encoding + and 32 byte hash), - is only 33 (1 byte for prefix encoding and 32 byte hash), - so there should - - be other strong arguments for this optimization + so there should be other strong arguments for this + optimization description: All submissions saved during an epoch. pagination: type: object @@ -720,7 +725,9 @@ paths: type: boolean description: >- QueryContainsResponse is response type for the temporary - Query/ContainsBytes RPC method. + Query/ContainsBytes + + RPC method. default: description: An unexpected error response. schema: @@ -1126,7 +1133,9 @@ paths: title: epoch_boundary is the height of this epoch's last block title: >- QueryCurrentEpochResponse is the response type for the - Query/CurrentEpoch RPC method + Query/CurrentEpoch RPC + + method default: description: An unexpected error response. schema: @@ -1559,12 +1568,11 @@ paths: get: summary: >- EpochsInfo queries the metadata of epochs in a given range, depending on - the - parameters in the pagination request. Th main use case will be querying - the + the parameters in the pagination request. Th main use case will be + querying - latest epochs in time order. + the latest epochs in time order. operationId: EpochsInfo responses: '200': @@ -1592,11 +1600,15 @@ paths: this epoch. Babylon needs to remember the last header of each epoch - to complete unbonding validators/delegations when a - previous epoch's checkpoint is finalised. + to complete - The last_block_header field is nil in the epoch's - beginning, and is set upon the end of this epoch. + unbonding validators/delegations when a previous epoch's + checkpoint is + + finalised. The last_block_header field is nil in the + epoch's beginning, and + + is set upon the end of this epoch. type: object properties: version: @@ -1685,7 +1697,9 @@ paths: sealer_header is the 2nd header of the next epoch This validator set has generated a BLS multisig on - `last_commit_hash` of the sealer header + `last_commit_hash` of + + the sealer header type: object properties: version: @@ -2071,11 +2085,15 @@ paths: epoch. Babylon needs to remember the last header of each epoch to - complete unbonding validators/delegations when a previous - epoch's checkpoint is finalised. + complete - The last_block_header field is nil in the epoch's - beginning, and is set upon the end of this epoch. + unbonding validators/delegations when a previous epoch's + checkpoint is + + finalised. The last_block_header field is nil in the + epoch's beginning, and + + is set upon the end of this epoch. type: object properties: version: @@ -2164,7 +2182,9 @@ paths: sealer_header is the 2nd header of the next epoch This validator set has generated a BLS multisig on - `last_commit_hash` of the sealer header + `last_commit_hash` of + + the sealer header type: object properties: version: @@ -2823,7 +2843,9 @@ paths: destination validator. title: >- QueuedMessage is a message that can change the validator set - and is delayed to the epoch boundary + and is delayed + + to the epoch boundary title: msgs is the list of messages queued in the current epoch pagination: title: pagination defines the pagination in the response @@ -2856,7 +2878,9 @@ paths: } title: >- QueryEpochMsgsResponse is the response type for the - Query/EpochMsgs RPC method + Query/EpochMsgs RPC + + method default: description: An unexpected error response. schema: @@ -3426,7 +3450,9 @@ paths: get: summary: >- LatestEpochMsgs queries the messages within a given number of most - recent epochs + recent + + epochs operationId: LatestEpochMsgs responses: '200': @@ -3822,7 +3848,9 @@ paths: a destination validator. title: >- QueuedMessage is a message that can change the - validator set and is delayed to the epoch boundary + validator set and is delayed + + to the epoch boundary title: >- epoch_msg_map is a list of QueuedMessageList @@ -3856,7 +3884,7 @@ paths: repeated Bar results = 1; PageResponse page = 2; } - title: >- + title: |- QueryLatestEpochMsgsResponse is the response type for the Query/LatestEpochMsgs RPC method default: @@ -4574,7 +4602,9 @@ paths: get: summary: >- BlsPublicKeyList queries a list of bls public keys of the validators at - a given epoch number. + a + + given epoch number. operationId: BlsPublicKeyList responses: '200': @@ -4597,7 +4627,9 @@ paths: format: uint64 title: >- ValidatorWithBlsKey couples validator address, voting power, - and its bls public key + and its bls + + public key pagination: description: pagination defines the pagination in the response. type: object @@ -4617,11 +4649,9 @@ paths: PageRequest.count_total was set, its value is undefined otherwise - description: >- + description: |- QueryBlsPublicKeyListResponse is the response type for the - Query/BlsPublicKeys - - RPC method. + Query/BlsPublicKeys RPC method. default: description: An unexpected error response. schema: @@ -4773,7 +4803,7 @@ paths: - Query /babylon/checkpointing/v1/epochs:status_count: get: - summary: >- + summary: |- RecentEpochStatusCount queries the number of epochs with each status in recent epochs operationId: RecentEpochStatusCount @@ -4794,11 +4824,9 @@ paths: additionalProperties: type: string format: uint64 - description: >- + description: |- QueryRecentEpochStatusCountResponse is the response type for the - Query/EpochStatusCount - - RPC method. + Query/EpochStatusCount RPC method. default: description: An unexpected error response. schema: @@ -4825,7 +4853,9 @@ paths: - name: epoch_count description: >- epoch_count is the number of the most recent epochs to include in - the aggregation. + the + + aggregation. in: query required: false type: string @@ -4836,7 +4866,9 @@ paths: get: summary: >- LastCheckpointWithStatus queries the last checkpoint with a given status - or a more matured status + or + + a more matured status operationId: LastCheckpointWithStatus responses: '200': @@ -4858,7 +4890,9 @@ paths: format: byte title: >- last_commit_hash defines the 'LastCommitHash' that - individual BLS sigs are signed on + individual BLS sigs are + + signed on bitmap: type: string format: byte @@ -4870,7 +4904,9 @@ paths: format: byte title: >- bls_multi_sig defines the multi sig that is aggregated - from individual BLS sigs + from individual BLS + + sigs title: RawCheckpoint wraps the BLS multi sig with meta data default: description: An unexpected error response. @@ -4974,7 +5010,9 @@ paths: format: byte title: >- last_commit_hash defines the 'LastCommitHash' that - individual BLS sigs are signed on + individual BLS sigs are + + signed on bitmap: type: string format: byte @@ -4986,7 +5024,9 @@ paths: format: byte title: >- bls_multi_sig defines the multi sig that is aggregated - from individual BLS sigs + from individual BLS + + sigs title: RawCheckpoint wraps the BLS multi sig with meta data status: type: string @@ -5046,18 +5086,24 @@ paths: format: uint64 title: >- block_height is the height of the Babylon block that - triggers the state update + triggers the state + + update block_time: type: string format: date-time title: >- block_time is the timestamp in the Babylon block - that triggers the state update + that triggers the state + + update description: >- lifecycle defines the lifecycle of this checkpoint, i.e., - each state transition and + each state + + transition and the time (in both timestamp and block + height) of this - the time (in both timestamp and block height) of this transition. description: RawCheckpointWithMeta wraps the raw checkpoint with meta data. description: >- @@ -5125,7 +5171,9 @@ paths: format: byte title: >- last_commit_hash defines the 'LastCommitHash' that - individual BLS sigs are signed on + individual BLS sigs are + + signed on bitmap: type: string format: byte @@ -5137,7 +5185,9 @@ paths: format: byte title: >- bls_multi_sig defines the multi sig that is - aggregated from individual BLS sigs + aggregated from individual BLS + + sigs title: RawCheckpoint wraps the BLS multi sig with meta data status: type: string @@ -5197,18 +5247,24 @@ paths: format: uint64 title: >- block_height is the height of the Babylon block - that triggers the state update + that triggers the state + + update block_time: type: string format: date-time title: >- block_time is the timestamp in the Babylon block - that triggers the state update + that triggers the state + + update description: >- lifecycle defines the lifecycle of this checkpoint, - i.e., each state transition and + i.e., each state + + transition and the time (in both timestamp and block + height) of this - the time (in both timestamp and block height) of this transition. description: >- RawCheckpointWithMeta wraps the raw checkpoint with meta @@ -5235,11 +5291,9 @@ paths: PageRequest.count_total was set, its value is undefined otherwise - description: >- + description: |- QueryRawCheckpointListResponse is the response type for the - Query/RawCheckpoints - - RPC method. + Query/RawCheckpoints RPC method. default: description: An unexpected error response. schema: @@ -5371,7 +5425,9 @@ paths: babylon_header: title: >- babylon_header is the header of the babylon block that - includes this CZ header + includes this CZ + + header type: object properties: version: @@ -5464,11 +5520,15 @@ paths: this header (babylon_block_height, babylon_tx_hash) jointly - provides the position of the header on Babylon ledger + provides the position of + + the header on Babylon ledger latest_forks: title: >- latest_forks is the latest forks, formed as a series of - IndexedHeader (from low to high) + IndexedHeader (from + + low to high) type: object properties: headers: @@ -5494,7 +5554,9 @@ paths: babylon_header: title: >- babylon_header is the header of the babylon - block that includes this CZ header + block that includes this CZ + + header type: object properties: version: @@ -5589,8 +5651,9 @@ paths: includes this header (babylon_block_height, babylon_tx_hash) jointly - provides the position of the header on Babylon - ledger + provides the position of + + the header on Babylon ledger title: IndexedHeader is the metadata of a CZ header title: >- blocks is the list of non-canonical indexed headers at @@ -5613,22 +5676,27 @@ paths: Note that each `IndexedHeader` in the fork should have a - valid quorum certificate. + valid quorum - Such forks exist since Babylon considers CZs might have - dishonest majority. + certificate. Such forks exist since Babylon considers CZs + might have - Also note that the IBC-Go implementation will only - consider the first header in a fork valid, since + dishonest majority. Also note that the IBC-Go + implementation will only - the subsequent headers cannot be verified without knowing - the validator set in the previous header. + consider the first header in a fork valid, since the + subsequent headers + + cannot be verified without knowing the validator set in + the previous header. timestamped_headers_count: type: string format: uint64 title: >- timestamped_headers_count is the number of timestamped - headers in CZ's canonical chain + headers in CZ's + + canonical chain description: >- QueryChainInfoResponse is response type for the Query/ChainInfo RPC method. @@ -5832,7 +5900,7 @@ paths: - Query /babylon/zoneconcierge/v1/chain_info/{chain_id}/epochs/{epoch_num}: get: - summary: >- + summary: |- EpochChainInfo queries the latest info of a chain in a given epoch of Babylon's view operationId: EpochChainInfo @@ -5871,7 +5939,9 @@ paths: babylon_header: title: >- babylon_header is the header of the babylon block that - includes this CZ header + includes this CZ + + header type: object properties: version: @@ -5964,11 +6034,15 @@ paths: this header (babylon_block_height, babylon_tx_hash) jointly - provides the position of the header on Babylon ledger + provides the position of + + the header on Babylon ledger latest_forks: title: >- latest_forks is the latest forks, formed as a series of - IndexedHeader (from low to high) + IndexedHeader (from + + low to high) type: object properties: headers: @@ -5994,7 +6068,9 @@ paths: babylon_header: title: >- babylon_header is the header of the babylon - block that includes this CZ header + block that includes this CZ + + header type: object properties: version: @@ -6089,8 +6165,9 @@ paths: includes this header (babylon_block_height, babylon_tx_hash) jointly - provides the position of the header on Babylon - ledger + provides the position of + + the header on Babylon ledger title: IndexedHeader is the metadata of a CZ header title: >- blocks is the list of non-canonical indexed headers at @@ -6113,25 +6190,32 @@ paths: Note that each `IndexedHeader` in the fork should have a - valid quorum certificate. + valid quorum + + certificate. Such forks exist since Babylon considers CZs + might have - Such forks exist since Babylon considers CZs might have - dishonest majority. + dishonest majority. Also note that the IBC-Go + implementation will only - Also note that the IBC-Go implementation will only - consider the first header in a fork valid, since + consider the first header in a fork valid, since the + subsequent headers - the subsequent headers cannot be verified without knowing - the validator set in the previous header. + cannot be verified without knowing the validator set in + the previous header. timestamped_headers_count: type: string format: uint64 title: >- timestamped_headers_count is the number of timestamped - headers in CZ's canonical chain + headers in CZ's + + canonical chain description: >- QueryEpochChainInfoResponse is response type for the - Query/EpochChainInfo RPC method. + Query/EpochChainInfo RPC + + method. default: description: An unexpected error response. schema: @@ -6366,7 +6450,9 @@ paths: babylon_header: title: >- babylon_header is the header of the babylon block that - includes this CZ header + includes this CZ + + header type: object properties: version: @@ -6455,7 +6541,9 @@ paths: header (babylon_block_height, babylon_tx_hash) jointly provides - the position of the header on Babylon ledger + the position of + + the header on Babylon ledger title: IndexedHeader is the metadata of a CZ header fork_headers: type: object @@ -6483,7 +6571,9 @@ paths: babylon_header: title: >- babylon_header is the header of the babylon block - that includes this CZ header + that includes this CZ + + header type: object properties: version: @@ -6576,8 +6666,9 @@ paths: this header (babylon_block_height, babylon_tx_hash) jointly - provides the position of the header on Babylon - ledger + provides the position of + + the header on Babylon ledger title: IndexedHeader is the metadata of a CZ header title: >- blocks is the list of non-canonical indexed headers at the @@ -6600,16 +6691,19 @@ paths: Note that each `IndexedHeader` in the fork should have a valid - quorum certificate. + quorum + + certificate. Such forks exist since Babylon considers CZs + might have - Such forks exist since Babylon considers CZs might have - dishonest majority. + dishonest majority. Also note that the IBC-Go implementation + will only - Also note that the IBC-Go implementation will only consider - the first header in a fork valid, since + consider the first header in a fork valid, since the + subsequent headers - the subsequent headers cannot be verified without knowing the - validator set in the previous header. + cannot be verified without knowing the validator set in the + previous header. description: >- QueryParamsResponse is response type for the Query/Header RPC method. @@ -7156,7 +7250,9 @@ paths: babylon_header: title: >- babylon_header is the header of the babylon block that - includes this CZ header + includes this CZ + + header type: object properties: version: @@ -7249,11 +7345,15 @@ paths: this header (babylon_block_height, babylon_tx_hash) jointly - provides the position of the header on Babylon ledger + provides the position of + + the header on Babylon ledger latest_forks: title: >- latest_forks is the latest forks, formed as a series of - IndexedHeader (from low to high) + IndexedHeader (from + + low to high) type: object properties: headers: @@ -7279,7 +7379,9 @@ paths: babylon_header: title: >- babylon_header is the header of the babylon - block that includes this CZ header + block that includes this CZ + + header type: object properties: version: @@ -7374,8 +7476,9 @@ paths: includes this header (babylon_block_height, babylon_tx_hash) jointly - provides the position of the header on Babylon - ledger + provides the position of + + the header on Babylon ledger title: IndexedHeader is the metadata of a CZ header title: >- blocks is the list of non-canonical indexed headers at @@ -7398,22 +7501,27 @@ paths: Note that each `IndexedHeader` in the fork should have a - valid quorum certificate. + valid quorum - Such forks exist since Babylon considers CZs might have - dishonest majority. + certificate. Such forks exist since Babylon considers CZs + might have - Also note that the IBC-Go implementation will only - consider the first header in a fork valid, since + dishonest majority. Also note that the IBC-Go + implementation will only - the subsequent headers cannot be verified without knowing - the validator set in the previous header. + consider the first header in a fork valid, since the + subsequent headers + + cannot be verified without knowing the validator set in + the previous header. timestamped_headers_count: type: string format: uint64 title: >- timestamped_headers_count is the number of timestamped - headers in CZ's canonical chain + headers in CZ's + + canonical chain epoch_info: title: epoch_info is the metadata of the last BTC-finalised epoch type: object @@ -7433,11 +7541,15 @@ paths: epoch. Babylon needs to remember the last header of each epoch to - complete unbonding validators/delegations when a previous - epoch's checkpoint is finalised. + complete + + unbonding validators/delegations when a previous epoch's + checkpoint is - The last_block_header field is nil in the epoch's - beginning, and is set upon the end of this epoch. + finalised. The last_block_header field is nil in the + epoch's beginning, and + + is set upon the end of this epoch. type: object properties: version: @@ -7526,7 +7638,9 @@ paths: sealer_header is the 2nd header of the next epoch This validator set has generated a BLS multisig on - `last_commit_hash` of the sealer header + `last_commit_hash` of + + the sealer header type: object properties: version: @@ -7618,7 +7732,9 @@ paths: format: byte title: >- last_commit_hash defines the 'LastCommitHash' that - individual BLS sigs are signed on + individual BLS sigs are + + signed on bitmap: type: string format: byte @@ -7630,11 +7746,15 @@ paths: format: byte title: >- bls_multi_sig defines the multi sig that is aggregated - from individual BLS sigs + from individual BLS + + sigs btc_submission_key: title: >- btc_submission_key is position of two BTC txs that include the - raw checkpoint of this epoch + raw + + checkpoint of this epoch type: object properties: key: @@ -7661,7 +7781,9 @@ paths: proof_tx_in_block: title: >- proof_tx_in_block is the proof that tx that carries the - header is included in a certain Babylon block + header is included + + in a certain Babylon block type: object properties: root_hash: @@ -7709,7 +7831,9 @@ paths: format: byte title: >- proof_header_in_epoch is the proof that the Babylon header - is in a certain epoch + is in a certain + + epoch proof_epoch_sealed: title: proof_epoch_sealed is the proof that the epoch is sealed type: object @@ -7729,17 +7853,22 @@ paths: format: uint64 title: >- ValidatorWithBlsKey couples validator address, - voting power, and its bls public key + voting power, and its bls + + public key title: >- validator_set is the validator set of the sealed epoch This validator set has generated a BLS multisig on - `last_commit_hash` of the sealer header + `last_commit_hash` of + + the sealer header proof_epoch_info: title: >- proof_epoch_info is the Merkle proof that the epoch's - metadata is committed to `app_hash` of the sealer - header + metadata is committed + + to `app_hash` of the sealer header type: object properties: ops: @@ -7766,8 +7895,9 @@ paths: proof_epoch_val_set: title: >- proof_epoch_info is the Merkle proof that the epoch's - validator set is committed to `app_hash` of the sealer - header + validator set is + + committed to `app_hash` of the sealer header type: object properties: ops: @@ -7844,7 +7974,9 @@ paths: valideated the proof? title: >- TransactionInfo is the info of a tx that contains - Babylon checkpoint, including + Babylon checkpoint, + + including - the position of the tx on BTC blockchain @@ -7853,11 +7985,13 @@ paths: - the Merkle proof that this tx is on the above position title: >- proof_epoch_submitted is the proof that the epoch's - checkpoint is included in BTC ledger + checkpoint is included + + in BTC ledger It is the two TransactionInfo in the best + (i.e., earliest) - It is the two TransactionInfo in the best (i.e., earliest) checkpoint submission - description: >- + description: |- QueryFinalizedChainInfoResponse is response type for the Query/FinalizedChainInfo RPC method. default: @@ -8070,7 +8204,9 @@ paths: get: summary: >- FinalizedChainInfoUntilHeight queries the BTC-finalised info no later - than the provided CZ height, with proofs + than + + the provided CZ height, with proofs operationId: FinalizedChainInfoUntilHeight responses: '200': @@ -8107,7 +8243,9 @@ paths: babylon_header: title: >- babylon_header is the header of the babylon block that - includes this CZ header + includes this CZ + + header type: object properties: version: @@ -8200,11 +8338,15 @@ paths: this header (babylon_block_height, babylon_tx_hash) jointly - provides the position of the header on Babylon ledger + provides the position of + + the header on Babylon ledger latest_forks: title: >- latest_forks is the latest forks, formed as a series of - IndexedHeader (from low to high) + IndexedHeader (from + + low to high) type: object properties: headers: @@ -8230,7 +8372,9 @@ paths: babylon_header: title: >- babylon_header is the header of the babylon - block that includes this CZ header + block that includes this CZ + + header type: object properties: version: @@ -8325,8 +8469,9 @@ paths: includes this header (babylon_block_height, babylon_tx_hash) jointly - provides the position of the header on Babylon - ledger + provides the position of + + the header on Babylon ledger title: IndexedHeader is the metadata of a CZ header title: >- blocks is the list of non-canonical indexed headers at @@ -8349,22 +8494,27 @@ paths: Note that each `IndexedHeader` in the fork should have a - valid quorum certificate. + valid quorum - Such forks exist since Babylon considers CZs might have - dishonest majority. + certificate. Such forks exist since Babylon considers CZs + might have - Also note that the IBC-Go implementation will only - consider the first header in a fork valid, since + dishonest majority. Also note that the IBC-Go + implementation will only - the subsequent headers cannot be verified without knowing - the validator set in the previous header. + consider the first header in a fork valid, since the + subsequent headers + + cannot be verified without knowing the validator set in + the previous header. timestamped_headers_count: type: string format: uint64 title: >- timestamped_headers_count is the number of timestamped - headers in CZ's canonical chain + headers in CZ's + + canonical chain epoch_info: title: epoch_info is the metadata of the last BTC-finalised epoch type: object @@ -8384,11 +8534,15 @@ paths: epoch. Babylon needs to remember the last header of each epoch to - complete unbonding validators/delegations when a previous - epoch's checkpoint is finalised. + complete - The last_block_header field is nil in the epoch's - beginning, and is set upon the end of this epoch. + unbonding validators/delegations when a previous epoch's + checkpoint is + + finalised. The last_block_header field is nil in the + epoch's beginning, and + + is set upon the end of this epoch. type: object properties: version: @@ -8477,7 +8631,9 @@ paths: sealer_header is the 2nd header of the next epoch This validator set has generated a BLS multisig on - `last_commit_hash` of the sealer header + `last_commit_hash` of + + the sealer header type: object properties: version: @@ -8569,7 +8725,9 @@ paths: format: byte title: >- last_commit_hash defines the 'LastCommitHash' that - individual BLS sigs are signed on + individual BLS sigs are + + signed on bitmap: type: string format: byte @@ -8581,11 +8739,15 @@ paths: format: byte title: >- bls_multi_sig defines the multi sig that is aggregated - from individual BLS sigs + from individual BLS + + sigs btc_submission_key: title: >- btc_submission_key is position of two BTC txs that include the - raw checkpoint of this epoch + raw + + checkpoint of this epoch type: object properties: key: @@ -8612,7 +8774,9 @@ paths: proof_tx_in_block: title: >- proof_tx_in_block is the proof that tx that carries the - header is included in a certain Babylon block + header is included + + in a certain Babylon block type: object properties: root_hash: @@ -8660,7 +8824,9 @@ paths: format: byte title: >- proof_header_in_epoch is the proof that the Babylon header - is in a certain epoch + is in a certain + + epoch proof_epoch_sealed: title: proof_epoch_sealed is the proof that the epoch is sealed type: object @@ -8680,17 +8846,22 @@ paths: format: uint64 title: >- ValidatorWithBlsKey couples validator address, - voting power, and its bls public key + voting power, and its bls + + public key title: >- validator_set is the validator set of the sealed epoch This validator set has generated a BLS multisig on - `last_commit_hash` of the sealer header + `last_commit_hash` of + + the sealer header proof_epoch_info: title: >- proof_epoch_info is the Merkle proof that the epoch's - metadata is committed to `app_hash` of the sealer - header + metadata is committed + + to `app_hash` of the sealer header type: object properties: ops: @@ -8717,8 +8888,9 @@ paths: proof_epoch_val_set: title: >- proof_epoch_info is the Merkle proof that the epoch's - validator set is committed to `app_hash` of the sealer - header + validator set is + + committed to `app_hash` of the sealer header type: object properties: ops: @@ -8795,7 +8967,9 @@ paths: valideated the proof? title: >- TransactionInfo is the info of a tx that contains - Babylon checkpoint, including + Babylon checkpoint, + + including - the position of the tx on BTC blockchain @@ -8804,13 +8978,17 @@ paths: - the Merkle proof that this tx is on the above position title: >- proof_epoch_submitted is the proof that the epoch's - checkpoint is included in BTC ledger + checkpoint is included + + in BTC ledger It is the two TransactionInfo in the best + (i.e., earliest) - It is the two TransactionInfo in the best (i.e., earliest) checkpoint submission description: >- QueryFinalizedChainInfoUntilHeightResponse is response type for - the Query/FinalizedChainInfoUntilHeight RPC method. + the + + Query/FinalizedChainInfoUntilHeight RPC method. default: description: An unexpected error response. schema: @@ -9013,7 +9191,9 @@ paths: height is the height of the CZ chain such that the returned finalised chain info will be no later than - this height + this + + height in: path required: true type: string @@ -9029,7 +9209,7 @@ paths: - Query /babylon/zoneconcierge/v1/headers/{chain_id}: get: - summary: >- + summary: |- ListHeaders queries the headers of a chain in Babylon's view, with pagination support operationId: ListHeaders @@ -9062,7 +9242,9 @@ paths: babylon_header: title: >- babylon_header is the header of the babylon block that - includes this CZ header + includes this CZ + + header type: object properties: version: @@ -9155,7 +9337,9 @@ paths: header (babylon_block_height, babylon_tx_hash) jointly provides - the position of the header on Babylon ledger + the position of + + the header on Babylon ledger title: IndexedHeader is the metadata of a CZ header title: headers is the list of headers pagination: @@ -9189,7 +9373,9 @@ paths: } description: >- QueryListHeadersResponse is response type for the - Query/ListHeaders RPC method. + Query/ListHeaders RPC + + method. default: description: An unexpected error response. schema: @@ -9446,7 +9632,7 @@ paths: - Query /babylon/zoneconcierge/v1/headers/{chain_id}/epochs/{epoch_num}: get: - summary: >- + summary: |- ListEpochHeaders queries the headers of a chain timestamped in a given epoch of Babylon, with pagination support operationId: ListEpochHeaders @@ -9479,7 +9665,9 @@ paths: babylon_header: title: >- babylon_header is the header of the babylon block that - includes this CZ header + includes this CZ + + header type: object properties: version: @@ -9572,12 +9760,16 @@ paths: header (babylon_block_height, babylon_tx_hash) jointly provides - the position of the header on Babylon ledger + the position of + + the header on Babylon ledger title: IndexedHeader is the metadata of a CZ header title: headers is the list of headers description: >- QueryListEpochHeadersResponse is response type for the - Query/ListEpochHeaders RPC method. + Query/ListEpochHeaders + + RPC method. default: description: An unexpected error response. schema: @@ -10059,7 +10251,9 @@ definitions: valideated the proof? title: >- TransactionInfo is the info of a tx that contains Babylon - checkpoint, including + checkpoint, + + including - the position of the tx on BTC blockchain @@ -10126,16 +10320,19 @@ definitions: format: uint64 title: >- checkpoint_finalization_timeout is the maximum time window (measured - in BTC blocks) between a checkpoint + in BTC + + blocks) between a checkpoint - being submitted to BTC, and - being reported back to BBN If a checkpoint has not been reported back within w BTC blocks, then - BBN has dishonest majority and is stalling checkpoints + BBN - (w in research paper) + has dishonest majority and is stalling checkpoints (w in research + paper) description: Params defines the parameters for the module. babylon.btccheckpoint.v1.QueryBtcCheckpointInfoResponse: type: object @@ -10208,7 +10405,9 @@ definitions: valideated the proof? title: >- TransactionInfo is the info of a tx that contains Babylon - checkpoint, including + checkpoint, + + including - the position of the tx on BTC blockchain @@ -10238,7 +10437,7 @@ definitions: submission message MsgInsertBTCSpvProof itself title: list of vigilantes' addresses - title: >- + title: |- QueryBtcCheckpointInfoResponse is response type for the Query/BtcCheckpointInfo RPC method babylon.btccheckpoint.v1.QueryBtcCheckpointsInfoResponse: @@ -10314,7 +10513,9 @@ definitions: valideated the proof? title: >- TransactionInfo is the info of a tx that contains Babylon - checkpoint, including + checkpoint, + + including - the position of the tx on BTC blockchain @@ -10371,7 +10572,7 @@ definitions: repeated Bar results = 1; PageResponse page = 2; } - title: >- + title: |- QueryBtcCheckpointsInfoResponse is response type for the Query/BtcCheckpointsInfo RPC method babylon.btccheckpoint.v1.QueryEpochSubmissionsResponse: @@ -10406,20 +10607,17 @@ definitions: submission we need list of transaction keys. Each submission can generally be identified by this list of (txIdx, - blockHash) - tuples. + blockHash) tuples. Note: this could possibly be optimized as if + transactions - Note: this could possibly be optimized as if transactions were in - one block + were in one block they would have the same block hash and different + indexes, - they would have the same block hash and different indexes, but each - blockhash + but each blockhash is only 33 (1 byte for prefix encoding and 32 + byte hash), - is only 33 (1 byte for prefix encoding and 32 byte hash), so there - should - - be other strong arguments for this optimization + so there should be other strong arguments for this optimization description: All submissions saved during an epoch. pagination: type: object @@ -10469,16 +10667,19 @@ definitions: format: uint64 title: >- checkpoint_finalization_timeout is the maximum time window - (measured in BTC blocks) between a checkpoint + (measured in BTC + + blocks) between a checkpoint - being submitted to BTC, and - being reported back to BBN If a checkpoint has not been reported back within w BTC blocks, - then BBN has dishonest majority and is stalling checkpoints + then BBN - (w in research paper) + has dishonest majority and is stalling checkpoints (w in research + paper) description: QueryParamsResponse is response type for the Query/Params RPC method. babylon.btccheckpoint.v1.SubmissionKey: type: object @@ -10506,19 +10707,17 @@ definitions: submission we need list of transaction keys. Each submission can generally be identified by this list of (txIdx, - blockHash) - tuples. + blockHash) tuples. Note: this could possibly be optimized as if + transactions - Note: this could possibly be optimized as if transactions were in one - block + were in one block they would have the same block hash and different + indexes, - they would have the same block hash and different indexes, but each - blockhash + but each blockhash is only 33 (1 byte for prefix encoding and 32 byte + hash), - is only 33 (1 byte for prefix encoding and 32 byte hash), so there should - - be other strong arguments for this optimization + so there should be other strong arguments for this optimization babylon.btccheckpoint.v1.TransactionInfo: type: object properties: @@ -10558,14 +10757,11 @@ definitions: and valideated the proof? - title: >- + title: |- TransactionInfo is the info of a tx that contains Babylon checkpoint, including - - the position of the tx on BTC blockchain - - the full tx content - - the Merkle proof that this tx is on the above position babylon.btccheckpoint.v1.TransactionKey: type: object @@ -11032,7 +11228,9 @@ definitions: type: boolean description: >- QueryContainsResponse is response type for the temporary - Query/ContainsBytes RPC method. + Query/ContainsBytes + + RPC method. babylon.btclightclient.v1.QueryContainsResponse: type: object properties: @@ -11221,11 +11419,13 @@ definitions: last_block_header is the header of the last block in this epoch. Babylon needs to remember the last header of each epoch to complete + unbonding validators/delegations when a previous epoch's checkpoint is - finalised. - The last_block_header field is nil in the epoch's beginning, and is - set upon the end of this epoch. + finalised. The last_block_header field is nil in the epoch's + beginning, and + + is set upon the end of this epoch. type: object properties: version: @@ -11312,7 +11512,9 @@ definitions: sealer_header is the 2nd header of the next epoch This validator set has generated a BLS multisig on `last_commit_hash` - of the sealer header + of + + the sealer header type: object properties: version: @@ -11410,7 +11612,9 @@ definitions: title: epoch_boundary is the height of this epoch's last block title: >- QueryCurrentEpochResponse is the response type for the Query/CurrentEpoch - RPC method + RPC + + method babylon.epoching.v1.QueryDelegationLifecycleResponse: type: object properties: @@ -11461,10 +11665,14 @@ definitions: last_block_header is the header of the last block in this epoch. Babylon needs to remember the last header of each epoch to - complete unbonding validators/delegations when a previous epoch's - checkpoint is finalised. + complete + + unbonding validators/delegations when a previous epoch's + checkpoint is + + finalised. The last_block_header field is nil in the epoch's + beginning, and - The last_block_header field is nil in the epoch's beginning, and is set upon the end of this epoch. type: object properties: @@ -11552,7 +11760,9 @@ definitions: sealer_header is the 2nd header of the next epoch This validator set has generated a BLS multisig on - `last_commit_hash` of the sealer header + `last_commit_hash` of + + the sealer header type: object properties: version: @@ -11993,7 +12203,9 @@ definitions: validator. title: >- QueuedMessage is a message that can change the validator set and is - delayed to the epoch boundary + delayed + + to the epoch boundary title: msgs is the list of messages queued in the current epoch pagination: title: pagination defines the pagination in the response @@ -12022,7 +12234,7 @@ definitions: repeated Bar results = 1; PageResponse page = 2; } - title: >- + title: |- QueryEpochMsgsResponse is the response type for the Query/EpochMsgs RPC method babylon.epoching.v1.QueryEpochValSetResponse: @@ -12092,10 +12304,14 @@ definitions: last_block_header is the header of the last block in this epoch. Babylon needs to remember the last header of each epoch to - complete unbonding validators/delegations when a previous - epoch's checkpoint is finalised. + complete + + unbonding validators/delegations when a previous epoch's + checkpoint is + + finalised. The last_block_header field is nil in the epoch's + beginning, and - The last_block_header field is nil in the epoch's beginning, and is set upon the end of this epoch. type: object properties: @@ -12183,7 +12399,9 @@ definitions: sealer_header is the 2nd header of the next epoch This validator set has generated a BLS multisig on - `last_commit_hash` of the sealer header + `last_commit_hash` of + + the sealer header type: object properties: version: @@ -12669,7 +12887,9 @@ definitions: destination validator. title: >- QueuedMessage is a message that can change the validator set - and is delayed to the epoch boundary + and is delayed + + to the epoch boundary title: |- epoch_msg_map is a list of QueuedMessageList each QueuedMessageList has a field identifying the epoch number @@ -12699,7 +12919,7 @@ definitions: repeated Bar results = 1; PageResponse page = 2; } - title: >- + title: |- QueryLatestEpochMsgsResponse is the response type for the Query/LatestEpochMsgs RPC method babylon.epoching.v1.QueryParamsResponse: @@ -13084,7 +13304,9 @@ definitions: validator. title: >- QueuedMessage is a message that can change the validator set and is - delayed to the epoch boundary + delayed + + to the epoch boundary babylon.epoching.v1.QueuedMessageList: type: object properties: @@ -13452,7 +13674,9 @@ definitions: validator. title: >- QueuedMessage is a message that can change the validator set and is - delayed to the epoch boundary + delayed + + to the epoch boundary babylon.epoching.v1.ValStateUpdate: type: object properties: @@ -14001,13 +14225,17 @@ definitions: format: uint64 title: >- block_height is the height of the Babylon block that triggers the - state update + state + + update block_time: type: string format: date-time title: >- block_time is the timestamp in the Babylon block that triggers the - state update + state + + update babylon.checkpointing.v1.CheckpointStatus: type: string enum: @@ -14046,7 +14274,9 @@ definitions: format: uint64 title: >- ValidatorWithBlsKey couples validator address, voting power, and its - bls public key + bls + + public key pagination: description: pagination defines the pagination in the response. type: object @@ -14066,11 +14296,9 @@ definitions: PageRequest.count_total was set, its value is undefined otherwise - description: >- + description: |- QueryBlsPublicKeyListResponse is the response type for the - Query/BlsPublicKeys - - RPC method. + Query/BlsPublicKeys RPC method. babylon.checkpointing.v1.QueryEpochStatusResponse: type: object properties: @@ -14109,7 +14337,9 @@ definitions: format: byte title: >- last_commit_hash defines the 'LastCommitHash' that individual BLS - sigs are signed on + sigs are + + signed on bitmap: type: string format: byte @@ -14121,7 +14351,9 @@ definitions: format: byte title: >- bls_multi_sig defines the multi sig that is aggregated from - individual BLS sigs + individual BLS + + sigs title: RawCheckpoint wraps the BLS multi sig with meta data babylon.checkpointing.v1.QueryParamsResponse: type: object @@ -14150,7 +14382,9 @@ definitions: format: byte title: >- last_commit_hash defines the 'LastCommitHash' that - individual BLS sigs are signed on + individual BLS sigs are + + signed on bitmap: type: string format: byte @@ -14162,7 +14396,9 @@ definitions: format: byte title: >- bls_multi_sig defines the multi sig that is aggregated from - individual BLS sigs + individual BLS + + sigs title: RawCheckpoint wraps the BLS multi sig with meta data status: type: string @@ -14222,18 +14458,24 @@ definitions: format: uint64 title: >- block_height is the height of the Babylon block that - triggers the state update + triggers the state + + update block_time: type: string format: date-time title: >- block_time is the timestamp in the Babylon block that - triggers the state update + triggers the state + + update description: >- lifecycle defines the lifecycle of this checkpoint, i.e., each - state transition and + state + + transition and the time (in both timestamp and block height) of + this - the time (in both timestamp and block height) of this transition. description: RawCheckpointWithMeta wraps the raw checkpoint with meta data. title: the order is going from the newest to oldest based on the epoch number @@ -14256,11 +14498,9 @@ definitions: PageRequest.count_total was set, its value is undefined otherwise - description: >- + description: |- QueryRawCheckpointListResponse is the response type for the - Query/RawCheckpoints - - RPC method. + Query/RawCheckpoints RPC method. babylon.checkpointing.v1.QueryRawCheckpointResponse: type: object properties: @@ -14279,7 +14519,9 @@ definitions: format: byte title: >- last_commit_hash defines the 'LastCommitHash' that individual - BLS sigs are signed on + BLS sigs are + + signed on bitmap: type: string format: byte @@ -14291,7 +14533,9 @@ definitions: format: byte title: >- bls_multi_sig defines the multi sig that is aggregated from - individual BLS sigs + individual BLS + + sigs title: RawCheckpoint wraps the BLS multi sig with meta data status: type: string @@ -14349,18 +14593,25 @@ definitions: format: uint64 title: >- block_height is the height of the Babylon block that - triggers the state update + triggers the state + + update block_time: type: string format: date-time title: >- block_time is the timestamp in the Babylon block that - triggers the state update + triggers the state + + update description: >- lifecycle defines the lifecycle of this checkpoint, i.e., each - state transition and + state + + transition and the time (in both timestamp and block height) of + this - the time (in both timestamp and block height) of this transition. + transition. description: RawCheckpointWithMeta wraps the raw checkpoint with meta data. description: >- QueryRawCheckpointResponse is the response type for the @@ -14381,11 +14632,9 @@ definitions: additionalProperties: type: string format: uint64 - description: >- + description: |- QueryRecentEpochStatusCountResponse is the response type for the - Query/EpochStatusCount - - RPC method. + Query/EpochStatusCount RPC method. babylon.checkpointing.v1.RawCheckpoint: type: object properties: @@ -14398,7 +14647,9 @@ definitions: format: byte title: >- last_commit_hash defines the 'LastCommitHash' that individual BLS sigs - are signed on + are + + signed on bitmap: type: string format: byte @@ -14410,7 +14661,9 @@ definitions: format: byte title: >- bls_multi_sig defines the multi sig that is aggregated from individual - BLS sigs + BLS + + sigs title: RawCheckpoint wraps the BLS multi sig with meta data babylon.checkpointing.v1.RawCheckpointWithMeta: type: object @@ -14427,7 +14680,9 @@ definitions: format: byte title: >- last_commit_hash defines the 'LastCommitHash' that individual BLS - sigs are signed on + sigs are + + signed on bitmap: type: string format: byte @@ -14439,7 +14694,9 @@ definitions: format: byte title: >- bls_multi_sig defines the multi sig that is aggregated from - individual BLS sigs + individual BLS + + sigs title: RawCheckpoint wraps the BLS multi sig with meta data status: type: string @@ -14495,18 +14752,21 @@ definitions: format: uint64 title: >- block_height is the height of the Babylon block that triggers - the state update + the state + + update block_time: type: string format: date-time title: >- block_time is the timestamp in the Babylon block that triggers - the state update - description: >- - lifecycle defines the lifecycle of this checkpoint, i.e., each state - transition and + the state - the time (in both timestamp and block height) of this transition. + update + description: |- + lifecycle defines the lifecycle of this checkpoint, i.e., each state + transition and the time (in both timestamp and block height) of this + transition. description: RawCheckpointWithMeta wraps the raw checkpoint with meta data. babylon.checkpointing.v1.ValidatorWithBlsKey: type: object @@ -14519,7 +14779,7 @@ definitions: voting_power: type: string format: uint64 - title: >- + title: |- ValidatorWithBlsKey couples validator address, voting power, and its bls public key babylon.zoneconcierge.v1.ChainInfo: @@ -14550,7 +14810,9 @@ definitions: babylon_header: title: >- babylon_header is the header of the babylon block that includes - this CZ header + this CZ + + header type: object properties: version: @@ -14638,11 +14900,15 @@ definitions: babylon_tx_hash is the hash of the tx that includes this header (babylon_block_height, babylon_tx_hash) jointly provides the - position of the header on Babylon ledger + position of + + the header on Babylon ledger latest_forks: title: >- latest_forks is the latest forks, formed as a series of IndexedHeader - (from low to high) + (from + + low to high) type: object properties: headers: @@ -14668,7 +14934,9 @@ definitions: babylon_header: title: >- babylon_header is the header of the babylon block that - includes this CZ header + includes this CZ + + header type: object properties: version: @@ -14757,7 +15025,9 @@ definitions: header (babylon_block_height, babylon_tx_hash) jointly provides the - position of the header on Babylon ledger + position of + + the header on Babylon ledger title: IndexedHeader is the metadata of a CZ header title: >- blocks is the list of non-canonical indexed headers at the same @@ -14779,20 +15049,20 @@ definitions: Note that each `IndexedHeader` in the fork should have a valid quorum - certificate. - Such forks exist since Babylon considers CZs might have dishonest - majority. + certificate. Such forks exist since Babylon considers CZs might have + + dishonest majority. Also note that the IBC-Go implementation will only - Also note that the IBC-Go implementation will only consider the first - header in a fork valid, since + consider the first header in a fork valid, since the subsequent + headers - the subsequent headers cannot be verified without knowing the - validator set in the previous header. + cannot be verified without knowing the validator set in the previous + header. timestamped_headers_count: type: string format: uint64 - title: >- + title: |- timestamped_headers_count is the number of timestamped headers in CZ's canonical chain title: ChainInfo is the information of a CZ @@ -14822,7 +15092,9 @@ definitions: babylon_header: title: >- babylon_header is the header of the babylon block that includes - this CZ header + this CZ + + header type: object properties: version: @@ -14910,7 +15182,9 @@ definitions: babylon_tx_hash is the hash of the tx that includes this header (babylon_block_height, babylon_tx_hash) jointly provides the - position of the header on Babylon ledger + position of + + the header on Babylon ledger title: IndexedHeader is the metadata of a CZ header title: blocks is the list of non-canonical indexed headers at the same height description: >- @@ -14930,16 +15204,15 @@ definitions: Note that each `IndexedHeader` in the fork should have a valid quorum - certificate. - Such forks exist since Babylon considers CZs might have dishonest - majority. + certificate. Such forks exist since Babylon considers CZs might have + + dishonest majority. Also note that the IBC-Go implementation will only - Also note that the IBC-Go implementation will only consider the first - header in a fork valid, since + consider the first header in a fork valid, since the subsequent headers - the subsequent headers cannot be verified without knowing the validator - set in the previous header. + cannot be verified without knowing the validator set in the previous + header. babylon.zoneconcierge.v1.IndexedHeader: type: object properties: @@ -14961,7 +15234,9 @@ definitions: babylon_header: title: >- babylon_header is the header of the babylon block that includes this - CZ header + CZ + + header type: object properties: version: @@ -15049,7 +15324,9 @@ definitions: babylon_tx_hash is the hash of the tx that includes this header (babylon_block_height, babylon_tx_hash) jointly provides the position - of the header on Babylon ledger + of + + the header on Babylon ledger title: IndexedHeader is the metadata of a CZ header babylon.zoneconcierge.v1.Params: type: object @@ -15072,16 +15349,22 @@ definitions: format: uint64 title: >- ValidatorWithBlsKey couples validator address, voting power, and its - bls public key + bls + + public key title: >- validator_set is the validator set of the sealed epoch This validator set has generated a BLS multisig on `last_commit_hash` - of the sealer header + of + + the sealer header proof_epoch_info: title: >- proof_epoch_info is the Merkle proof that the epoch's metadata is - committed to `app_hash` of the sealer header + committed + + to `app_hash` of the sealer header type: object properties: ops: @@ -15102,7 +15385,7 @@ definitions: The data could be arbitrary format, providing nessecary data for example neighbouring node hash proof_epoch_val_set: - title: >- + title: |- proof_epoch_info is the Merkle proof that the epoch's validator set is committed to `app_hash` of the sealer header type: object @@ -15126,9 +15409,9 @@ definitions: for example neighbouring node hash title: >- ProofEpochSealed is the proof that an epoch is sealed by the sealer - header, i.e., the 2nd header of the next epoch + header, - With the access of metadata + i.e., the 2nd header of the next epoch With the access of metadata - Metadata of this epoch, which includes the sealer header @@ -15139,6 +15422,7 @@ definitions: - The raw checkpoint's `last_commit_hash` is same as in the sealer header - More than 1/3 (in voting power) validators in the validator set of this + epoch have signed `last_commit_hash` of the sealer header - The epoch medatata is committed to the `app_hash` of the sealer header @@ -15150,7 +15434,9 @@ definitions: proof_tx_in_block: title: >- proof_tx_in_block is the proof that tx that carries the header is - included in a certain Babylon block + included + + in a certain Babylon block type: object properties: root_hash: @@ -15198,7 +15484,9 @@ definitions: format: byte title: >- proof_header_in_epoch is the proof that the Babylon header is in a - certain epoch + certain + + epoch proof_epoch_sealed: title: proof_epoch_sealed is the proof that the epoch is sealed type: object @@ -15218,16 +15506,22 @@ definitions: format: uint64 title: >- ValidatorWithBlsKey couples validator address, voting power, and - its bls public key + its bls + + public key title: >- validator_set is the validator set of the sealed epoch This validator set has generated a BLS multisig on - `last_commit_hash` of the sealer header + `last_commit_hash` of + + the sealer header proof_epoch_info: title: >- proof_epoch_info is the Merkle proof that the epoch's metadata is - committed to `app_hash` of the sealer header + committed + + to `app_hash` of the sealer header type: object properties: ops: @@ -15253,7 +15547,9 @@ definitions: proof_epoch_val_set: title: >- proof_epoch_info is the Merkle proof that the epoch's validator - set is committed to `app_hash` of the sealer header + set is + + committed to `app_hash` of the sealer header type: object properties: ops: @@ -15329,7 +15625,9 @@ definitions: valideated the proof? title: >- TransactionInfo is the info of a tx that contains Babylon - checkpoint, including + checkpoint, + + including - the position of the tx on BTC blockchain @@ -15338,11 +15636,13 @@ definitions: - the Merkle proof that this tx is on the above position title: >- proof_epoch_submitted is the proof that the epoch's checkpoint is - included in BTC ledger + included - It is the two TransactionInfo in the best (i.e., earliest) checkpoint - submission - title: >- + in BTC ledger It is the two TransactionInfo in the best (i.e., + earliest) + + checkpoint submission + title: |- ProofFinalizedChainInfo is a set of proofs that attest a chain info is BTC-finalised babylon.zoneconcierge.v1.QueryChainInfoResponse: @@ -15377,7 +15677,9 @@ definitions: babylon_header: title: >- babylon_header is the header of the babylon block that - includes this CZ header + includes this CZ + + header type: object properties: version: @@ -15466,11 +15768,15 @@ definitions: header (babylon_block_height, babylon_tx_hash) jointly provides the - position of the header on Babylon ledger + position of + + the header on Babylon ledger latest_forks: title: >- latest_forks is the latest forks, formed as a series of - IndexedHeader (from low to high) + IndexedHeader (from + + low to high) type: object properties: headers: @@ -15496,7 +15802,9 @@ definitions: babylon_header: title: >- babylon_header is the header of the babylon block that - includes this CZ header + includes this CZ + + header type: object properties: version: @@ -15589,7 +15897,9 @@ definitions: header (babylon_block_height, babylon_tx_hash) jointly provides - the position of the header on Babylon ledger + the position of + + the header on Babylon ledger title: IndexedHeader is the metadata of a CZ header title: >- blocks is the list of non-canonical indexed headers at the @@ -15612,22 +15922,27 @@ definitions: Note that each `IndexedHeader` in the fork should have a valid - quorum certificate. + quorum - Such forks exist since Babylon considers CZs might have dishonest - majority. + certificate. Such forks exist since Babylon considers CZs might + have - Also note that the IBC-Go implementation will only consider the - first header in a fork valid, since + dishonest majority. Also note that the IBC-Go implementation will + only - the subsequent headers cannot be verified without knowing the - validator set in the previous header. + consider the first header in a fork valid, since the subsequent + headers + + cannot be verified without knowing the validator set in the + previous header. timestamped_headers_count: type: string format: uint64 title: >- timestamped_headers_count is the number of timestamped headers in - CZ's canonical chain + CZ's + + canonical chain description: >- QueryChainInfoResponse is response type for the Query/ChainInfo RPC method. @@ -15699,7 +16014,9 @@ definitions: babylon_header: title: >- babylon_header is the header of the babylon block that - includes this CZ header + includes this CZ + + header type: object properties: version: @@ -15788,11 +16105,15 @@ definitions: header (babylon_block_height, babylon_tx_hash) jointly provides the - position of the header on Babylon ledger + position of + + the header on Babylon ledger latest_forks: title: >- latest_forks is the latest forks, formed as a series of - IndexedHeader (from low to high) + IndexedHeader (from + + low to high) type: object properties: headers: @@ -15818,7 +16139,9 @@ definitions: babylon_header: title: >- babylon_header is the header of the babylon block that - includes this CZ header + includes this CZ + + header type: object properties: version: @@ -15911,7 +16234,9 @@ definitions: header (babylon_block_height, babylon_tx_hash) jointly provides - the position of the header on Babylon ledger + the position of + + the header on Babylon ledger title: IndexedHeader is the metadata of a CZ header title: >- blocks is the list of non-canonical indexed headers at the @@ -15934,25 +16259,32 @@ definitions: Note that each `IndexedHeader` in the fork should have a valid - quorum certificate. + quorum + + certificate. Such forks exist since Babylon considers CZs might + have - Such forks exist since Babylon considers CZs might have dishonest - majority. + dishonest majority. Also note that the IBC-Go implementation will + only - Also note that the IBC-Go implementation will only consider the - first header in a fork valid, since + consider the first header in a fork valid, since the subsequent + headers - the subsequent headers cannot be verified without knowing the - validator set in the previous header. + cannot be verified without knowing the validator set in the + previous header. timestamped_headers_count: type: string format: uint64 title: >- timestamped_headers_count is the number of timestamped headers in - CZ's canonical chain + CZ's + + canonical chain description: >- QueryEpochChainInfoResponse is response type for the Query/EpochChainInfo - RPC method. + RPC + + method. babylon.zoneconcierge.v1.QueryFinalizedChainInfoResponse: type: object properties: @@ -15985,7 +16317,9 @@ definitions: babylon_header: title: >- babylon_header is the header of the babylon block that - includes this CZ header + includes this CZ + + header type: object properties: version: @@ -16074,11 +16408,15 @@ definitions: header (babylon_block_height, babylon_tx_hash) jointly provides the - position of the header on Babylon ledger + position of + + the header on Babylon ledger latest_forks: title: >- latest_forks is the latest forks, formed as a series of - IndexedHeader (from low to high) + IndexedHeader (from + + low to high) type: object properties: headers: @@ -16104,7 +16442,9 @@ definitions: babylon_header: title: >- babylon_header is the header of the babylon block that - includes this CZ header + includes this CZ + + header type: object properties: version: @@ -16197,7 +16537,9 @@ definitions: header (babylon_block_height, babylon_tx_hash) jointly provides - the position of the header on Babylon ledger + the position of + + the header on Babylon ledger title: IndexedHeader is the metadata of a CZ header title: >- blocks is the list of non-canonical indexed headers at the @@ -16220,22 +16562,27 @@ definitions: Note that each `IndexedHeader` in the fork should have a valid - quorum certificate. + quorum + + certificate. Such forks exist since Babylon considers CZs might + have - Such forks exist since Babylon considers CZs might have dishonest - majority. + dishonest majority. Also note that the IBC-Go implementation will + only - Also note that the IBC-Go implementation will only consider the - first header in a fork valid, since + consider the first header in a fork valid, since the subsequent + headers - the subsequent headers cannot be verified without knowing the - validator set in the previous header. + cannot be verified without knowing the validator set in the + previous header. timestamped_headers_count: type: string format: uint64 title: >- timestamped_headers_count is the number of timestamped headers in - CZ's canonical chain + CZ's + + canonical chain epoch_info: title: epoch_info is the metadata of the last BTC-finalised epoch type: object @@ -16254,10 +16601,14 @@ definitions: last_block_header is the header of the last block in this epoch. Babylon needs to remember the last header of each epoch to - complete unbonding validators/delegations when a previous epoch's - checkpoint is finalised. + complete + + unbonding validators/delegations when a previous epoch's + checkpoint is + + finalised. The last_block_header field is nil in the epoch's + beginning, and - The last_block_header field is nil in the epoch's beginning, and is set upon the end of this epoch. type: object properties: @@ -16345,7 +16696,9 @@ definitions: sealer_header is the 2nd header of the next epoch This validator set has generated a BLS multisig on - `last_commit_hash` of the sealer header + `last_commit_hash` of + + the sealer header type: object properties: version: @@ -16435,7 +16788,9 @@ definitions: format: byte title: >- last_commit_hash defines the 'LastCommitHash' that individual BLS - sigs are signed on + sigs are + + signed on bitmap: type: string format: byte @@ -16447,9 +16802,11 @@ definitions: format: byte title: >- bls_multi_sig defines the multi sig that is aggregated from - individual BLS sigs + individual BLS + + sigs btc_submission_key: - title: >- + title: |- btc_submission_key is position of two BTC txs that include the raw checkpoint of this epoch type: object @@ -16478,7 +16835,9 @@ definitions: proof_tx_in_block: title: >- proof_tx_in_block is the proof that tx that carries the header is - included in a certain Babylon block + included + + in a certain Babylon block type: object properties: root_hash: @@ -16526,7 +16885,9 @@ definitions: format: byte title: >- proof_header_in_epoch is the proof that the Babylon header is in a - certain epoch + certain + + epoch proof_epoch_sealed: title: proof_epoch_sealed is the proof that the epoch is sealed type: object @@ -16546,16 +16907,22 @@ definitions: format: uint64 title: >- ValidatorWithBlsKey couples validator address, voting power, - and its bls public key + and its bls + + public key title: >- validator_set is the validator set of the sealed epoch This validator set has generated a BLS multisig on - `last_commit_hash` of the sealer header + `last_commit_hash` of + + the sealer header proof_epoch_info: title: >- proof_epoch_info is the Merkle proof that the epoch's metadata - is committed to `app_hash` of the sealer header + is committed + + to `app_hash` of the sealer header type: object properties: ops: @@ -16582,7 +16949,9 @@ definitions: proof_epoch_val_set: title: >- proof_epoch_info is the Merkle proof that the epoch's - validator set is committed to `app_hash` of the sealer header + validator set is + + committed to `app_hash` of the sealer header type: object properties: ops: @@ -16659,7 +17028,9 @@ definitions: valideated the proof? title: >- TransactionInfo is the info of a tx that contains Babylon - checkpoint, including + checkpoint, + + including - the position of the tx on BTC blockchain @@ -16668,11 +17039,13 @@ definitions: - the Merkle proof that this tx is on the above position title: >- proof_epoch_submitted is the proof that the epoch's checkpoint is - included in BTC ledger + included + + in BTC ledger It is the two TransactionInfo in the best (i.e., + earliest) - It is the two TransactionInfo in the best (i.e., earliest) checkpoint submission - description: >- + description: |- QueryFinalizedChainInfoResponse is response type for the Query/FinalizedChainInfo RPC method. babylon.zoneconcierge.v1.QueryFinalizedChainInfoUntilHeightResponse: @@ -16707,7 +17080,9 @@ definitions: babylon_header: title: >- babylon_header is the header of the babylon block that - includes this CZ header + includes this CZ + + header type: object properties: version: @@ -16796,11 +17171,15 @@ definitions: header (babylon_block_height, babylon_tx_hash) jointly provides the - position of the header on Babylon ledger + position of + + the header on Babylon ledger latest_forks: title: >- latest_forks is the latest forks, formed as a series of - IndexedHeader (from low to high) + IndexedHeader (from + + low to high) type: object properties: headers: @@ -16826,7 +17205,9 @@ definitions: babylon_header: title: >- babylon_header is the header of the babylon block that - includes this CZ header + includes this CZ + + header type: object properties: version: @@ -16919,7 +17300,9 @@ definitions: header (babylon_block_height, babylon_tx_hash) jointly provides - the position of the header on Babylon ledger + the position of + + the header on Babylon ledger title: IndexedHeader is the metadata of a CZ header title: >- blocks is the list of non-canonical indexed headers at the @@ -16942,22 +17325,27 @@ definitions: Note that each `IndexedHeader` in the fork should have a valid - quorum certificate. + quorum + + certificate. Such forks exist since Babylon considers CZs might + have - Such forks exist since Babylon considers CZs might have dishonest - majority. + dishonest majority. Also note that the IBC-Go implementation will + only - Also note that the IBC-Go implementation will only consider the - first header in a fork valid, since + consider the first header in a fork valid, since the subsequent + headers - the subsequent headers cannot be verified without knowing the - validator set in the previous header. + cannot be verified without knowing the validator set in the + previous header. timestamped_headers_count: type: string format: uint64 title: >- timestamped_headers_count is the number of timestamped headers in - CZ's canonical chain + CZ's + + canonical chain epoch_info: title: epoch_info is the metadata of the last BTC-finalised epoch type: object @@ -16976,10 +17364,14 @@ definitions: last_block_header is the header of the last block in this epoch. Babylon needs to remember the last header of each epoch to - complete unbonding validators/delegations when a previous epoch's - checkpoint is finalised. + complete + + unbonding validators/delegations when a previous epoch's + checkpoint is + + finalised. The last_block_header field is nil in the epoch's + beginning, and - The last_block_header field is nil in the epoch's beginning, and is set upon the end of this epoch. type: object properties: @@ -17067,7 +17459,9 @@ definitions: sealer_header is the 2nd header of the next epoch This validator set has generated a BLS multisig on - `last_commit_hash` of the sealer header + `last_commit_hash` of + + the sealer header type: object properties: version: @@ -17157,7 +17551,9 @@ definitions: format: byte title: >- last_commit_hash defines the 'LastCommitHash' that individual BLS - sigs are signed on + sigs are + + signed on bitmap: type: string format: byte @@ -17169,9 +17565,11 @@ definitions: format: byte title: >- bls_multi_sig defines the multi sig that is aggregated from - individual BLS sigs + individual BLS + + sigs btc_submission_key: - title: >- + title: |- btc_submission_key is position of two BTC txs that include the raw checkpoint of this epoch type: object @@ -17200,7 +17598,9 @@ definitions: proof_tx_in_block: title: >- proof_tx_in_block is the proof that tx that carries the header is - included in a certain Babylon block + included + + in a certain Babylon block type: object properties: root_hash: @@ -17248,7 +17648,9 @@ definitions: format: byte title: >- proof_header_in_epoch is the proof that the Babylon header is in a - certain epoch + certain + + epoch proof_epoch_sealed: title: proof_epoch_sealed is the proof that the epoch is sealed type: object @@ -17268,16 +17670,22 @@ definitions: format: uint64 title: >- ValidatorWithBlsKey couples validator address, voting power, - and its bls public key + and its bls + + public key title: >- validator_set is the validator set of the sealed epoch This validator set has generated a BLS multisig on - `last_commit_hash` of the sealer header + `last_commit_hash` of + + the sealer header proof_epoch_info: title: >- proof_epoch_info is the Merkle proof that the epoch's metadata - is committed to `app_hash` of the sealer header + is committed + + to `app_hash` of the sealer header type: object properties: ops: @@ -17304,7 +17712,9 @@ definitions: proof_epoch_val_set: title: >- proof_epoch_info is the Merkle proof that the epoch's - validator set is committed to `app_hash` of the sealer header + validator set is + + committed to `app_hash` of the sealer header type: object properties: ops: @@ -17381,7 +17791,9 @@ definitions: valideated the proof? title: >- TransactionInfo is the info of a tx that contains Babylon - checkpoint, including + checkpoint, + + including - the position of the tx on BTC blockchain @@ -17390,11 +17802,13 @@ definitions: - the Merkle proof that this tx is on the above position title: >- proof_epoch_submitted is the proof that the epoch's checkpoint is - included in BTC ledger + included + + in BTC ledger It is the two TransactionInfo in the best (i.e., + earliest) - It is the two TransactionInfo in the best (i.e., earliest) checkpoint submission - description: >- + description: |- QueryFinalizedChainInfoUntilHeightResponse is response type for the Query/FinalizedChainInfoUntilHeight RPC method. babylon.zoneconcierge.v1.QueryHeaderResponse: @@ -17421,7 +17835,9 @@ definitions: babylon_header: title: >- babylon_header is the header of the babylon block that includes - this CZ header + this CZ + + header type: object properties: version: @@ -17509,7 +17925,9 @@ definitions: babylon_tx_hash is the hash of the tx that includes this header (babylon_block_height, babylon_tx_hash) jointly provides the - position of the header on Babylon ledger + position of + + the header on Babylon ledger title: IndexedHeader is the metadata of a CZ header fork_headers: type: object @@ -17537,7 +17955,9 @@ definitions: babylon_header: title: >- babylon_header is the header of the babylon block that - includes this CZ header + includes this CZ + + header type: object properties: version: @@ -17626,7 +18046,9 @@ definitions: header (babylon_block_height, babylon_tx_hash) jointly provides the - position of the header on Babylon ledger + position of + + the header on Babylon ledger title: IndexedHeader is the metadata of a CZ header title: >- blocks is the list of non-canonical indexed headers at the same @@ -17648,16 +18070,16 @@ definitions: Note that each `IndexedHeader` in the fork should have a valid quorum - certificate. - Such forks exist since Babylon considers CZs might have dishonest - majority. + certificate. Such forks exist since Babylon considers CZs might have + + dishonest majority. Also note that the IBC-Go implementation will only - Also note that the IBC-Go implementation will only consider the first - header in a fork valid, since + consider the first header in a fork valid, since the subsequent + headers - the subsequent headers cannot be verified without knowing the - validator set in the previous header. + cannot be verified without knowing the validator set in the previous + header. description: QueryParamsResponse is response type for the Query/Header RPC method. babylon.zoneconcierge.v1.QueryListEpochHeadersResponse: type: object @@ -17685,7 +18107,9 @@ definitions: babylon_header: title: >- babylon_header is the header of the babylon block that includes - this CZ header + this CZ + + header type: object properties: version: @@ -17773,12 +18197,16 @@ definitions: babylon_tx_hash is the hash of the tx that includes this header (babylon_block_height, babylon_tx_hash) jointly provides the - position of the header on Babylon ledger + position of + + the header on Babylon ledger title: IndexedHeader is the metadata of a CZ header title: headers is the list of headers description: >- QueryListEpochHeadersResponse is response type for the - Query/ListEpochHeaders RPC method. + Query/ListEpochHeaders + + RPC method. babylon.zoneconcierge.v1.QueryListHeadersResponse: type: object properties: @@ -17805,7 +18233,9 @@ definitions: babylon_header: title: >- babylon_header is the header of the babylon block that includes - this CZ header + this CZ + + header type: object properties: version: @@ -17893,7 +18323,9 @@ definitions: babylon_tx_hash is the hash of the tx that includes this header (babylon_block_height, babylon_tx_hash) jointly provides the - position of the header on Babylon ledger + position of + + the header on Babylon ledger title: IndexedHeader is the metadata of a CZ header title: headers is the list of headers pagination: @@ -17923,7 +18355,7 @@ definitions: repeated Bar results = 1; PageResponse page = 2; } - description: >- + description: |- QueryListHeadersResponse is response type for the Query/ListHeaders RPC method. babylon.zoneconcierge.v1.QueryParamsResponse: diff --git a/go.mod b/go.mod index 3f064140b..4bf7b86d4 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,6 @@ module github.com/babylonchain/babylon require ( github.com/btcsuite/btcd v0.23.4 github.com/cosmos/cosmos-sdk v0.47.0-rc2 - github.com/gogo/protobuf v1.3.3 github.com/golang/protobuf v1.5.2 github.com/gorilla/mux v1.8.0 github.com/grpc-ecosystem/grpc-gateway v1.16.0 @@ -29,7 +28,6 @@ require ( github.com/boljen/go-bitmap v0.0.0-20151001105940-23cd2fb0ce7d github.com/btcsuite/btcd/btcutil v1.1.2 github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 - github.com/cosmos/cosmos-proto v1.0.0-beta.1 github.com/cosmos/gogoproto v1.4.4 github.com/cosmos/ibc-go/v7 v7.0.0-rc0 github.com/golang/mock v1.6.0 @@ -138,6 +136,7 @@ require ( github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e // indirect github.com/cockroachdb/apd/v2 v2.0.2 // indirect github.com/containerd/continuity v0.3.0 // indirect + github.com/cosmos/cosmos-proto v1.0.0-beta.1 // indirect github.com/cosmos/gogogateway v1.2.0 // indirect github.com/cosmos/gorocksdb v1.2.0 // indirect github.com/cosmos/ics23/go v0.9.1-0.20221207100636-b1abd8678aab // indirect @@ -153,6 +152,7 @@ require ( github.com/felixge/httpsnoop v1.0.2 // indirect github.com/gofrs/uuid v4.3.0+incompatible // indirect github.com/gogo/googleapis v1.4.1-0.20201022092350-68b0159b7869 // indirect + github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/glog v1.0.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/google/go-cmp v0.5.9 // indirect @@ -207,5 +207,4 @@ replace ( // Fix upstream GHSA-h395-qcrw-5vmq vulnerability. // TODO Remove it: https://github.com/cosmos/cosmos-sdk/issues/10409 github.com/gin-gonic/gin => github.com/gin-gonic/gin v1.7.0 - github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1 ) diff --git a/go.sum b/go.sum index 6def58b22..d0371dd54 100644 --- a/go.sum +++ b/go.sum @@ -345,6 +345,12 @@ github.com/gofrs/uuid v4.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRx github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/googleapis v1.4.1-0.20201022092350-68b0159b7869 h1:kRpU4zq+Pzh4feET49aEWPOzwQy3U2SsbZEQ7QEcif0= github.com/gogo/googleapis v1.4.1-0.20201022092350-68b0159b7869/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/glog v1.0.0 h1:nfP3RFugxnNRyKgeWd4oI1nYvXpxrx8ck8ZrcizshdQ= github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= @@ -551,6 +557,8 @@ github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7V github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/keybase/go-keychain v0.0.0-20190712205309-48d3d31d256d h1:Z+RDyXzjKE0i2sTjZ/b1uxiGtPhFy34Ou/Tk0qwN0kM= github.com/keybase/go-keychain v0.0.0-20190712205309-48d3d31d256d/go.mod h1:JJNrCn9otv/2QP4D7SMJBgaleKpOf66PnW6F5WGNRIc= +github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= @@ -743,8 +751,6 @@ github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqn github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/regen-network/gocuke v0.6.2 h1:pHviZ0kKAq2U2hN2q3smKNxct6hS0mGByFMHGnWA97M= -github.com/regen-network/protobuf v1.3.3-alpha.regen.1 h1:OHEc+q5iIAXpqiqFKeLpu5NwTIkVXUs48vFMwzqpqY4= -github.com/regen-network/protobuf v1.3.3-alpha.regen.1/go.mod h1:2DjTFR1HhMQhiWC5sZ4OhQ3+NtdbZ6oBDKQwq5Ou+FI= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= @@ -1123,8 +1129,10 @@ golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= @@ -1239,7 +1247,6 @@ google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200324203455-a04cca1dde73/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= diff --git a/proto/babylon/btccheckpoint/params.proto b/proto/babylon/btccheckpoint/params.proto deleted file mode 100644 index 69c2d30c7..000000000 --- a/proto/babylon/btccheckpoint/params.proto +++ /dev/null @@ -1,23 +0,0 @@ -syntax = "proto3"; -package babylon.btccheckpoint.v1; - -import "gogoproto/gogo.proto"; - -option go_package = "github.com/babylonchain/babylon/x/btccheckpoint/types"; - -// Params defines the parameters for the module. -message Params { - option (gogoproto.equal) = true; - - // btc_confirmation_depth is the confirmation depth in BTC. - // A block is considered irreversible only when it is at least k-deep in BTC - // (k in research paper) - uint64 btc_confirmation_depth = 1 [ (gogoproto.moretags) = "yaml:\"btc_confirmation_depth\"" ]; - - // checkpoint_finalization_timeout is the maximum time window (measured in BTC blocks) between a checkpoint - // - being submitted to BTC, and - // - being reported back to BBN - // If a checkpoint has not been reported back within w BTC blocks, then BBN has dishonest majority and is stalling checkpoints - // (w in research paper) - uint64 checkpoint_finalization_timeout = 2 [ (gogoproto.moretags) = "yaml:\"checkpoint_finalization_timeout\"" ]; -} diff --git a/proto/babylon/btccheckpoint/btccheckpoint.proto b/proto/babylon/btccheckpoint/v1/btccheckpoint.proto similarity index 81% rename from proto/babylon/btccheckpoint/btccheckpoint.proto rename to proto/babylon/btccheckpoint/v1/btccheckpoint.proto index cce526149..ca235b5b3 100644 --- a/proto/babylon/btccheckpoint/btccheckpoint.proto +++ b/proto/babylon/btccheckpoint/v1/btccheckpoint.proto @@ -43,37 +43,35 @@ message BTCSpvProof { // which transaction was included and transaction index in the block message TransactionKey { uint32 index = 1; - bytes hash = 2 [ - (gogoproto.customtype) = "github.com/babylonchain/babylon/types.BTCHeaderHashBytes" - ]; + bytes hash = 2 + [ (gogoproto.customtype) = + "github.com/babylonchain/babylon/types.BTCHeaderHashBytes" ]; } // Checkpoint can be composed from multiple transactions, so to identify whole // submission we need list of transaction keys. -// Each submission can generally be identified by this list of (txIdx, blockHash) -// tuples. -// Note: this could possibly be optimized as if transactions were in one block -// they would have the same block hash and different indexes, but each blockhash -// is only 33 (1 byte for prefix encoding and 32 byte hash), so there should -// be other strong arguments for this optimization -message SubmissionKey { - repeated TransactionKey key = 1; -} +// Each submission can generally be identified by this list of (txIdx, +// blockHash) tuples. Note: this could possibly be optimized as if transactions +// were in one block they would have the same block hash and different indexes, +// but each blockhash is only 33 (1 byte for prefix encoding and 32 byte hash), +// so there should be other strong arguments for this optimization +message SubmissionKey { repeated TransactionKey key = 1; } enum BtcStatus { option (gogoproto.goproto_enum_prefix) = false; // SUBMITTED Epoch has Submitted btc status if there ever was at least one // known submission on btc main chain - EPOCH_STATUS_SUBMITTED = 0 [(gogoproto.enumvalue_customname) = "Submitted"]; + EPOCH_STATUS_SUBMITTED = 0 [ (gogoproto.enumvalue_customname) = "Submitted" ]; // CONFIRMED Epoch has Confirmed btc status if there ever was at least one // known submission on btc main chain which was k-deep - EPOCH_STATUS_CONFIRMED = 1 [(gogoproto.enumvalue_customname) = "Confirmed"]; + EPOCH_STATUS_CONFIRMED = 1 [ (gogoproto.enumvalue_customname) = "Confirmed" ]; // CONFIRMED Epoch has Finalized btc status if there is was at exactly one // knon submission on btc main chain which is w-deep - EPOCH_STATUS_FINALIZED = 2 [(gogoproto.enumvalue_customname) = "Finalized"]; + EPOCH_STATUS_FINALIZED = 2 [ (gogoproto.enumvalue_customname) = "Finalized" ]; } -// TransactionInfo is the info of a tx that contains Babylon checkpoint, including +// TransactionInfo is the info of a tx that contains Babylon checkpoint, +// including // - the position of the tx on BTC blockchain // - the full tx content // - the Merkle proof that this tx is on the above position @@ -94,22 +92,24 @@ message TransactionInfo { } // TODO: Determine if we should keep any block number or depth info. -// On one hand it may be usefull to determine if block is stable or not, on other -// depth/block number info, without context (i.e info about chain) is pretty useless -// and blockshash in enough to retrieve is from lightclient +// On one hand it may be usefull to determine if block is stable or not, on +// other depth/block number info, without context (i.e info about chain) is +// pretty useless and blockshash in enough to retrieve is from lightclient message SubmissionData { // address of the submitter and reporter CheckpointAddresses vigilante_addresses = 1; // txs_info is the two `TransactionInfo`s corresponding to the submission // It is used for // - recovering address of sender of btc transction to payup the reward. - // - allowing the ZoneConcierge module to prove the checkpoint is submitted to BTC + // - allowing the ZoneConcierge module to prove the checkpoint is submitted to + // BTC repeated TransactionInfo txs_info = 2; uint64 epoch = 3; } // Data stored in db and indexed by epoch number -// TODO: Add btc blockheight at epooch end, when adding hadnling of epoching callbacks +// TODO: Add btc blockheight at epooch end, when adding hadnling of epoching +// callbacks message EpochData { // List of all received checkpoints during this epoch, sorted by order of // submission. @@ -134,9 +134,9 @@ message BTCCheckpointInfo { // height of earliest BTC block that includes this checkpoint uint64 earliest_btc_block_number = 2; // hash of earliest BTC block that includes this checkpoint - bytes earliest_btc_block_hash = 3 [ - (gogoproto.customtype) = "github.com/babylonchain/babylon/types.BTCHeaderHashBytes" - ]; + bytes earliest_btc_block_hash = 3 + [ (gogoproto.customtype) = + "github.com/babylonchain/babylon/types.BTCHeaderHashBytes" ]; // the BTC checkpoint transactions on the above block repeated TransactionInfo earliest_btc_block_txs = 4; // list of vigilantes' addresses diff --git a/proto/babylon/btccheckpoint/genesis.proto b/proto/babylon/btccheckpoint/v1/genesis.proto similarity index 86% rename from proto/babylon/btccheckpoint/genesis.proto rename to proto/babylon/btccheckpoint/v1/genesis.proto index 2aa6e1b47..49097c360 100644 --- a/proto/babylon/btccheckpoint/genesis.proto +++ b/proto/babylon/btccheckpoint/v1/genesis.proto @@ -2,7 +2,7 @@ syntax = "proto3"; package babylon.btccheckpoint.v1; import "gogoproto/gogo.proto"; -import "babylon/btccheckpoint/params.proto"; +import "babylon/btccheckpoint/v1/params.proto"; option go_package = "github.com/babylonchain/babylon/x/btccheckpoint/types"; diff --git a/proto/babylon/btccheckpoint/v1/params.proto b/proto/babylon/btccheckpoint/v1/params.proto new file mode 100644 index 000000000..2f57cb53d --- /dev/null +++ b/proto/babylon/btccheckpoint/v1/params.proto @@ -0,0 +1,26 @@ +syntax = "proto3"; +package babylon.btccheckpoint.v1; + +import "gogoproto/gogo.proto"; + +option go_package = "github.com/babylonchain/babylon/x/btccheckpoint/types"; + +// Params defines the parameters for the module. +message Params { + option (gogoproto.equal) = true; + + // btc_confirmation_depth is the confirmation depth in BTC. + // A block is considered irreversible only when it is at least k-deep in BTC + // (k in research paper) + uint64 btc_confirmation_depth = 1 + [ (gogoproto.moretags) = "yaml:\"btc_confirmation_depth\"" ]; + + // checkpoint_finalization_timeout is the maximum time window (measured in BTC + // blocks) between a checkpoint + // - being submitted to BTC, and + // - being reported back to BBN + // If a checkpoint has not been reported back within w BTC blocks, then BBN + // has dishonest majority and is stalling checkpoints (w in research paper) + uint64 checkpoint_finalization_timeout = 2 + [ (gogoproto.moretags) = "yaml:\"checkpoint_finalization_timeout\"" ]; +} diff --git a/proto/babylon/btccheckpoint/query.proto b/proto/babylon/btccheckpoint/v1/query.proto similarity index 68% rename from proto/babylon/btccheckpoint/query.proto rename to proto/babylon/btccheckpoint/v1/query.proto index 8788178be..b4c4240c8 100644 --- a/proto/babylon/btccheckpoint/query.proto +++ b/proto/babylon/btccheckpoint/v1/query.proto @@ -4,8 +4,8 @@ package babylon.btccheckpoint.v1; import "gogoproto/gogo.proto"; import "google/api/annotations.proto"; import "cosmos/base/query/v1beta1/pagination.proto"; -import "babylon/btccheckpoint/params.proto"; -import "babylon/btccheckpoint/btccheckpoint.proto"; +import "babylon/btccheckpoint/v1/params.proto"; +import "babylon/btccheckpoint/v1/btccheckpoint.proto"; option go_package = "github.com/babylonchain/babylon/x/btccheckpoint/types"; @@ -17,17 +17,21 @@ service Query { } // BtcCheckpointInfo returns checkpoint info for a given epoch - rpc BtcCheckpointInfo(QueryBtcCheckpointInfoRequest) returns (QueryBtcCheckpointInfoResponse) { + rpc BtcCheckpointInfo(QueryBtcCheckpointInfoRequest) + returns (QueryBtcCheckpointInfoResponse) { option (google.api.http).get = "/babylon/btccheckpoint/v1/{epoch_num}"; } // BtcCheckpointsInfo returns checkpoint info for a range of epochs - rpc BtcCheckpointsInfo(QueryBtcCheckpointsInfoRequest) returns (QueryBtcCheckpointsInfoResponse) { + rpc BtcCheckpointsInfo(QueryBtcCheckpointsInfoRequest) + returns (QueryBtcCheckpointsInfoResponse) { option (google.api.http).get = "/babylon/btccheckpoint/v1"; } - rpc EpochSubmissions(QueryEpochSubmissionsRequest) returns (QueryEpochSubmissionsResponse) { - option (google.api.http).get = "/babylon/btccheckpoint/v1/{epoch_num}/submissions"; + rpc EpochSubmissions(QueryEpochSubmissionsRequest) + returns (QueryEpochSubmissionsResponse) { + option (google.api.http).get = + "/babylon/btccheckpoint/v1/{epoch_num}/submissions"; } } @@ -41,22 +45,24 @@ message QueryParamsResponse { } message QueryBtcCheckpointInfoRequest { - // Number of epoch for which the earliest checkpointing btc height is requested + // Number of epoch for which the earliest checkpointing btc height is + // requested uint64 epoch_num = 1; } -// QueryBtcCheckpointInfoResponse is response type for the Query/BtcCheckpointInfo RPC method -message QueryBtcCheckpointInfoResponse { - BTCCheckpointInfo info = 1; -} +// QueryBtcCheckpointInfoResponse is response type for the +// Query/BtcCheckpointInfo RPC method +message QueryBtcCheckpointInfoResponse { BTCCheckpointInfo info = 1; } -// QueryBtcCheckpointsInfoRequest is request type for the Query/BtcCheckpointsInfo RPC method +// QueryBtcCheckpointsInfoRequest is request type for the +// Query/BtcCheckpointsInfo RPC method message QueryBtcCheckpointsInfoRequest { // pagination defines whether to have the pagination in the request cosmos.base.query.v1beta1.PageRequest pagination = 1; } -// QueryBtcCheckpointsInfoResponse is response type for the Query/BtcCheckpointsInfo RPC method +// QueryBtcCheckpointsInfoResponse is response type for the +// Query/BtcCheckpointsInfo RPC method message QueryBtcCheckpointsInfoResponse { repeated BTCCheckpointInfo info_list = 1; // pagination defines the pagination in the response diff --git a/proto/babylon/btccheckpoint/tx.proto b/proto/babylon/btccheckpoint/v1/tx.proto similarity index 83% rename from proto/babylon/btccheckpoint/tx.proto rename to proto/babylon/btccheckpoint/v1/tx.proto index e4d0f775b..7d3290fe0 100644 --- a/proto/babylon/btccheckpoint/tx.proto +++ b/proto/babylon/btccheckpoint/v1/tx.proto @@ -1,8 +1,7 @@ syntax = "proto3"; package babylon.btccheckpoint.v1; -import "gogoproto/gogo.proto"; -import "babylon/btccheckpoint/btccheckpoint.proto"; +import "babylon/btccheckpoint/v1/btccheckpoint.proto"; option go_package = "github.com/babylonchain/babylon/x/btccheckpoint/types"; diff --git a/proto/babylon/btclightclient/btclightclient.proto b/proto/babylon/btclightclient/btclightclient.proto deleted file mode 100644 index 16891fe49..000000000 --- a/proto/babylon/btclightclient/btclightclient.proto +++ /dev/null @@ -1,20 +0,0 @@ -syntax = "proto3"; -package babylon.btclightclient.v1; - -import "gogoproto/gogo.proto"; - -option go_package = "github.com/babylonchain/babylon/x/btclightclient/types"; - -message BTCHeaderInfo { - bytes header = 1 [ - (gogoproto.customtype) = "github.com/babylonchain/babylon/types.BTCHeaderBytes" - ]; - bytes hash = 2 [ - (gogoproto.customtype) = "github.com/babylonchain/babylon/types.BTCHeaderHashBytes" - ]; - uint64 height = 3; - bytes work = 4 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Uint" - ]; -} - diff --git a/proto/babylon/btclightclient/v1/btclightclient.proto b/proto/babylon/btclightclient/v1/btclightclient.proto new file mode 100644 index 000000000..86b3e78f0 --- /dev/null +++ b/proto/babylon/btclightclient/v1/btclightclient.proto @@ -0,0 +1,18 @@ +syntax = "proto3"; +package babylon.btclightclient.v1; + +import "gogoproto/gogo.proto"; + +option go_package = "github.com/babylonchain/babylon/x/btclightclient/types"; + +message BTCHeaderInfo { + bytes header = 1 + [ (gogoproto.customtype) = + "github.com/babylonchain/babylon/types.BTCHeaderBytes" ]; + bytes hash = 2 + [ (gogoproto.customtype) = + "github.com/babylonchain/babylon/types.BTCHeaderHashBytes" ]; + uint64 height = 3; + bytes work = 4 + [ (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Uint" ]; +} diff --git a/proto/babylon/btclightclient/event.proto b/proto/babylon/btclightclient/v1/event.proto similarity index 75% rename from proto/babylon/btclightclient/event.proto rename to proto/babylon/btclightclient/v1/event.proto index f3278d5e7..4b1a3a0af 100644 --- a/proto/babylon/btclightclient/event.proto +++ b/proto/babylon/btclightclient/v1/event.proto @@ -1,8 +1,7 @@ syntax = "proto3"; package babylon.btclightclient.v1; -import "gogoproto/gogo.proto"; -import "babylon/btclightclient/btclightclient.proto"; +import "babylon/btclightclient/v1/btclightclient.proto"; option go_package = "github.com/babylonchain/babylon/x/btclightclient/types"; @@ -10,21 +9,15 @@ option go_package = "github.com/babylonchain/babylon/x/btclightclient/types"; // of the current mainchain to which we are rolling back to. // In other words, there is one rollback event emitted per re-org, to the // greatest common ancestor of the old and the new fork. -message EventBTCRollBack { - BTCHeaderInfo header = 1; -} +message EventBTCRollBack { BTCHeaderInfo header = 1; } // EventBTCRollForward is emitted on Msg/InsertHeader // The header included in the event is the one the main chain is extended with. // In the event of a reorg, each block on the new fork that comes after // the greatest common ancestor will have a corresponding roll forward event. -message EventBTCRollForward { - BTCHeaderInfo header = 1; -} +message EventBTCRollForward { BTCHeaderInfo header = 1; } // EventBTCHeaderInserted is emitted on Msg/InsertHeader // The header included in the event is the one that was added to the // on chain BTC storage. -message EventBTCHeaderInserted { - BTCHeaderInfo header = 1; -} +message EventBTCHeaderInserted { BTCHeaderInfo header = 1; } diff --git a/proto/babylon/btclightclient/genesis.proto b/proto/babylon/btclightclient/v1/genesis.proto similarity index 52% rename from proto/babylon/btclightclient/genesis.proto rename to proto/babylon/btclightclient/v1/genesis.proto index e159e7d2f..a105b725b 100644 --- a/proto/babylon/btclightclient/genesis.proto +++ b/proto/babylon/btclightclient/v1/genesis.proto @@ -2,14 +2,14 @@ syntax = "proto3"; package babylon.btclightclient.v1; import "gogoproto/gogo.proto"; -import "babylon/btclightclient/params.proto"; -import "babylon/btclightclient/btclightclient.proto"; +import "babylon/btclightclient/v1/params.proto"; +import "babylon/btclightclient/v1/btclightclient.proto"; option go_package = "github.com/babylonchain/babylon/x/btclightclient/types"; // GenesisState defines the btclightclient module's genesis state. message GenesisState { - Params params = 1 [(gogoproto.nullable) = false]; + Params params = 1 [ (gogoproto.nullable) = false ]; - BTCHeaderInfo base_btc_header = 2 [(gogoproto.nullable) = false]; + BTCHeaderInfo base_btc_header = 2 [ (gogoproto.nullable) = false ]; } diff --git a/proto/babylon/btclightclient/params.proto b/proto/babylon/btclightclient/v1/params.proto similarity index 76% rename from proto/babylon/btclightclient/params.proto rename to proto/babylon/btclightclient/v1/params.proto index 2b6488364..3ee535386 100644 --- a/proto/babylon/btclightclient/params.proto +++ b/proto/babylon/btclightclient/v1/params.proto @@ -6,6 +6,4 @@ import "gogoproto/gogo.proto"; option go_package = "github.com/babylonchain/babylon/x/btclightclient/types"; // Params defines the parameters for the module. -message Params { - option (gogoproto.goproto_stringer) = false; -} +message Params { option (gogoproto.goproto_stringer) = false; } diff --git a/proto/babylon/btclightclient/query.proto b/proto/babylon/btclightclient/v1/query.proto similarity index 76% rename from proto/babylon/btclightclient/query.proto rename to proto/babylon/btclightclient/v1/query.proto index a3f422bed..27cf155c8 100644 --- a/proto/babylon/btclightclient/query.proto +++ b/proto/babylon/btclightclient/v1/query.proto @@ -4,8 +4,8 @@ package babylon.btclightclient.v1; import "gogoproto/gogo.proto"; import "google/api/annotations.proto"; import "cosmos/base/query/v1beta1/pagination.proto"; -import "babylon/btclightclient/params.proto"; -import "babylon/btclightclient/btclightclient.proto"; +import "babylon/btclightclient/v1/params.proto"; +import "babylon/btclightclient/v1/btclightclient.proto"; option go_package = "github.com/babylonchain/babylon/x/btclightclient/types"; @@ -30,7 +30,8 @@ service Query { // checks whether a hash is maintained by the module. // See discussion at https://github.com/babylonchain/babylon/pull/132 // for more details. - rpc ContainsBytes(QueryContainsBytesRequest) returns (QueryContainsBytesResponse) { + rpc ContainsBytes(QueryContainsBytesRequest) + returns (QueryContainsBytesResponse) { option (google.api.http).get = "/babylon/btclightclient/v1/containsBytes"; } @@ -55,7 +56,7 @@ message QueryParamsRequest {} // QueryParamsResponse is response type for the Query/Params RPC method. message QueryParamsResponse { // params holds all the parameters of this module. - Params params = 1 [(gogoproto.nullable) = false]; + Params params = 1 [ (gogoproto.nullable) = false ]; } // QueryHashesRequest is request type for the Query/Hashes RPC method. // It involves retrieving all hashes that are maintained by the module. @@ -65,35 +66,30 @@ message QueryHashesRequest { // QueryHashesResponse is response type for the Query/Hashes RPC method. message QueryHashesResponse { - repeated bytes hashes = 1 [ - (gogoproto.customtype) = "github.com/babylonchain/babylon/types.BTCHeaderHashBytes" - ]; + repeated bytes hashes = 1 + [ (gogoproto.customtype) = + "github.com/babylonchain/babylon/types.BTCHeaderHashBytes" ]; cosmos.base.query.v1beta1.PageResponse pagination = 2; } // QueryContainsRequest is request type for the Query/Contains RPC method. // It involves checking whether a hash is maintained by the module. message QueryContainsRequest { - bytes hash = 1 [ - (gogoproto.customtype) = "github.com/babylonchain/babylon/types.BTCHeaderHashBytes" - ]; + bytes hash = 1 + [ (gogoproto.customtype) = + "github.com/babylonchain/babylon/types.BTCHeaderHashBytes" ]; } // QueryContainsResponse is response type for the Query/Contains RPC method. -message QueryContainsResponse { - bool contains = 1; -} +message QueryContainsResponse { bool contains = 1; } -// QueryContainsRequest is request type for the temporary Query/ContainsBytes RPC method. -// It involves checking whether a hash is maintained by the module. -message QueryContainsBytesRequest { - bytes hash = 1; -} +// QueryContainsRequest is request type for the temporary Query/ContainsBytes +// RPC method. It involves checking whether a hash is maintained by the module. +message QueryContainsBytesRequest { bytes hash = 1; } -// QueryContainsResponse is response type for the temporary Query/ContainsBytes RPC method. -message QueryContainsBytesResponse { - bool contains = 1; -} +// QueryContainsResponse is response type for the temporary Query/ContainsBytes +// RPC method. +message QueryContainsBytesResponse { bool contains = 1; } // QueryMainChainRequest is request type for the Query/MainChain RPC method. // It involves retrieving the canonical chain maintained by the module. @@ -108,16 +104,10 @@ message QueryMainChainResponse { cosmos.base.query.v1beta1.PageResponse pagination = 2; } -message QueryTipRequest { -} +message QueryTipRequest {} -message QueryTipResponse { - BTCHeaderInfo header = 1; -} +message QueryTipResponse { BTCHeaderInfo header = 1; } -message QueryBaseHeaderRequest { -} +message QueryBaseHeaderRequest {} -message QueryBaseHeaderResponse { - BTCHeaderInfo header = 1; -} +message QueryBaseHeaderResponse { BTCHeaderInfo header = 1; } diff --git a/proto/babylon/btclightclient/tx.proto b/proto/babylon/btclightclient/v1/tx.proto similarity index 72% rename from proto/babylon/btclightclient/tx.proto rename to proto/babylon/btclightclient/v1/tx.proto index bd79f76b0..4d8605a8f 100644 --- a/proto/babylon/btclightclient/tx.proto +++ b/proto/babylon/btclightclient/v1/tx.proto @@ -2,8 +2,6 @@ syntax = "proto3"; package babylon.btclightclient.v1; import "gogoproto/gogo.proto"; -import "babylon/btclightclient/btclightclient.proto"; - option go_package = "github.com/babylonchain/babylon/x/btclightclient/types"; @@ -15,8 +13,8 @@ service Msg { // MsgInsertHeader defines the message for incoming header bytes message MsgInsertHeader { string signer = 1; - bytes header = 2 [ - (gogoproto.customtype) = "github.com/babylonchain/babylon/types.BTCHeaderBytes" - ]; + bytes header = 2 + [ (gogoproto.customtype) = + "github.com/babylonchain/babylon/types.BTCHeaderBytes" ]; } message MsgInsertHeaderResponse {} diff --git a/proto/babylon/checkpointing/events.proto b/proto/babylon/checkpointing/events.proto deleted file mode 100644 index f5bc3865f..000000000 --- a/proto/babylon/checkpointing/events.proto +++ /dev/null @@ -1,35 +0,0 @@ -syntax = "proto3"; -package babylon.checkpointing.v1; - -import "babylon/checkpointing/checkpoint.proto"; - -option go_package = "github.com/babylonchain/babylon/x/checkpointing/types"; - -message EventCheckpointAccumulating { - RawCheckpointWithMeta checkpoint = 1; -} - -message EventCheckpointSealed { - RawCheckpointWithMeta checkpoint = 1; -} - -message EventCheckpointSubmitted { - RawCheckpointWithMeta checkpoint = 1; -} - -message EventCheckpointConfirmed { - RawCheckpointWithMeta checkpoint = 1; -} - -message EventCheckpointFinalized { - RawCheckpointWithMeta checkpoint = 1; -} - -message EventCheckpointForgotten { - RawCheckpointWithMeta checkpoint = 1; -} - -message EventConflictingCheckpoint { - RawCheckpoint conflicting_checkpoint = 1; - RawCheckpointWithMeta local_checkpoint = 2; -} diff --git a/proto/babylon/checkpointing/bls_key.proto b/proto/babylon/checkpointing/v1/bls_key.proto similarity index 66% rename from proto/babylon/checkpointing/bls_key.proto rename to proto/babylon/checkpointing/v1/bls_key.proto index 4dc568a64..204af94e8 100644 --- a/proto/babylon/checkpointing/bls_key.proto +++ b/proto/babylon/checkpointing/v1/bls_key.proto @@ -8,33 +8,34 @@ option go_package = "github.com/babylonchain/babylon/x/checkpointing/types"; // BlsKey wraps BLS public key with PoP message BlsKey { // pubkey is the BLS public key of a validator - bytes pubkey = 2 [ - (gogoproto.customtype) = "github.com/babylonchain/babylon/crypto/bls12381.PublicKey" - ]; + bytes pubkey = 2 + [ (gogoproto.customtype) = + "github.com/babylonchain/babylon/crypto/bls12381.PublicKey" ]; // pop is the proof-of-possession of the BLS key ProofOfPossession pop = 3; } -// ProofOfPossession defines proof for the ownership of Ed25519 and BLS private keys +// ProofOfPossession defines proof for the ownership of Ed25519 and BLS private +// keys message ProofOfPossession { - // ed25519_sig is used for verification, ed25519_sig = sign(key = Ed25519_sk, data = BLS_pk) + // ed25519_sig is used for verification, ed25519_sig = sign(key = Ed25519_sk, + // data = BLS_pk) bytes ed25519_sig = 2; - // bls_sig is the result of PoP, bls_sig = sign(key = BLS_sk, data = ed25519_sig) - bytes bls_sig = 3 [ - (gogoproto.customtype) = "github.com/babylonchain/babylon/crypto/bls12381.Signature" - ]; + // bls_sig is the result of PoP, bls_sig = sign(key = BLS_sk, data = + // ed25519_sig) + bytes bls_sig = 3 + [ (gogoproto.customtype) = + "github.com/babylonchain/babylon/crypto/bls12381.Signature" ]; } // ValidatorWithBLSSet defines a set of validators with their BLS public keys -message ValidatorWithBlsKeySet { - repeated ValidatorWithBlsKey val_set = 1; -} +message ValidatorWithBlsKeySet { repeated ValidatorWithBlsKey val_set = 1; } -// ValidatorWithBlsKey couples validator address, voting power, and its bls public key +// ValidatorWithBlsKey couples validator address, voting power, and its bls +// public key message ValidatorWithBlsKey { string validator_address = 1; bytes bls_pub_key = 2; uint64 voting_power = 3; } - diff --git a/proto/babylon/checkpointing/checkpoint.proto b/proto/babylon/checkpointing/v1/checkpoint.proto similarity index 58% rename from proto/babylon/checkpointing/checkpoint.proto rename to proto/babylon/checkpointing/v1/checkpoint.proto index ccbac63c4..6f32d186a 100644 --- a/proto/babylon/checkpointing/checkpoint.proto +++ b/proto/babylon/checkpointing/v1/checkpoint.proto @@ -2,44 +2,44 @@ syntax = "proto3"; package babylon.checkpointing.v1; import "google/protobuf/timestamp.proto"; -import "cosmos_proto/cosmos.proto"; import "gogoproto/gogo.proto"; option go_package = "github.com/babylonchain/babylon/x/checkpointing/types"; // RawCheckpoint wraps the BLS multi sig with meta data message RawCheckpoint { - option (gogoproto.equal) = true; + option (gogoproto.equal) = true; // epoch_num defines the epoch number the raw checkpoint is for uint64 epoch_num = 1; - // last_commit_hash defines the 'LastCommitHash' that individual BLS sigs are signed on - bytes last_commit_hash = 2 [ - (gogoproto.customtype) = "LastCommitHash" - ]; + // last_commit_hash defines the 'LastCommitHash' that individual BLS sigs are + // signed on + bytes last_commit_hash = 2 [ (gogoproto.customtype) = "LastCommitHash" ]; // bitmap defines the bitmap that indicates the signers of the BLS multi sig bytes bitmap = 3; - // bls_multi_sig defines the multi sig that is aggregated from individual BLS sigs - bytes bls_multi_sig = 4 [ - (gogoproto.customtype) = "github.com/babylonchain/babylon/crypto/bls12381.Signature" - ]; + // bls_multi_sig defines the multi sig that is aggregated from individual BLS + // sigs + bytes bls_multi_sig = 4 + [ (gogoproto.customtype) = + "github.com/babylonchain/babylon/crypto/bls12381.Signature" ]; } // RawCheckpointWithMeta wraps the raw checkpoint with meta data. message RawCheckpointWithMeta { - option (gogoproto.equal) = true; + option (gogoproto.equal) = true; RawCheckpoint ckpt = 1; // status defines the status of the checkpoint CheckpointStatus status = 2; // bls_aggr_pk defines the aggregated BLS public key - bytes bls_aggr_pk = 3 [ - (gogoproto.customtype) = "github.com/babylonchain/babylon/crypto/bls12381.PublicKey" - ]; + bytes bls_aggr_pk = 3 + [ (gogoproto.customtype) = + "github.com/babylonchain/babylon/crypto/bls12381.PublicKey" ]; // power_sum defines the accumulated voting power for the checkpoint uint64 power_sum = 4; - // lifecycle defines the lifecycle of this checkpoint, i.e., each state transition and - // the time (in both timestamp and block height) of this transition. + // lifecycle defines the lifecycle of this checkpoint, i.e., each state + // transition and the time (in both timestamp and block height) of this + // transition. repeated CheckpointStateUpdate lifecycle = 5; } @@ -48,44 +48,45 @@ enum CheckpointStatus { option (gogoproto.goproto_enum_prefix) = false; // ACCUMULATING defines a checkpoint that is awaiting for BLS signatures. - CKPT_STATUS_ACCUMULATING = 0 [(gogoproto.enumvalue_customname) = "Accumulating"]; + CKPT_STATUS_ACCUMULATING = 0 + [ (gogoproto.enumvalue_customname) = "Accumulating" ]; // SEALED defines a checkpoint that has accumulated sufficient BLS signatures. - CKPT_STATUS_SEALED = 1 [(gogoproto.enumvalue_customname) = "Sealed"]; + CKPT_STATUS_SEALED = 1 [ (gogoproto.enumvalue_customname) = "Sealed" ]; // SUBMITTED defines a checkpoint that is included on BTC. - CKPT_STATUS_SUBMITTED = 2 [(gogoproto.enumvalue_customname) = "Submitted"]; + CKPT_STATUS_SUBMITTED = 2 [ (gogoproto.enumvalue_customname) = "Submitted" ]; // CONFIRMED defines a checkpoint that is k-deep on BTC. - CKPT_STATUS_CONFIRMED = 3 [(gogoproto.enumvalue_customname) = "Confirmed"]; + CKPT_STATUS_CONFIRMED = 3 [ (gogoproto.enumvalue_customname) = "Confirmed" ]; // FINALIZED defines a checkpoint that is w-deep on BTC. - CKPT_STATUS_FINALIZED = 4 [(gogoproto.enumvalue_customname) = "Finalized"]; + CKPT_STATUS_FINALIZED = 4 [ (gogoproto.enumvalue_customname) = "Finalized" ]; } message CheckpointStateUpdate { - option (gogoproto.equal) = true; + option (gogoproto.equal) = true; // state defines the event of a state transition towards this state CheckpointStatus state = 1; - // block_height is the height of the Babylon block that triggers the state update + // block_height is the height of the Babylon block that triggers the state + // update uint64 block_height = 2; - // block_time is the timestamp in the Babylon block that triggers the state update - google.protobuf.Timestamp block_time = 3 [(gogoproto.stdtime) = true]; + // block_time is the timestamp in the Babylon block that triggers the state + // update + google.protobuf.Timestamp block_time = 3 [ (gogoproto.stdtime) = true ]; } // BlsSig wraps the BLS sig with meta data. message BlsSig { - option (gogoproto.equal) = false; + option (gogoproto.equal) = false; // epoch_num defines the epoch number that the BLS sig is signed on uint64 epoch_num = 1; // last_commit_hash defines the 'LastCommitHash' that the BLS sig is signed on - bytes last_commit_hash = 2 [ - (gogoproto.customtype) = "LastCommitHash" - ]; - bytes bls_sig = 3 [ - (gogoproto.customtype) = "github.com/babylonchain/babylon/crypto/bls12381.Signature" - ]; - // can't find cosmos_proto.scalar when compiling due to cosmos v0.45.4 does not support scalar - // string signer_address = 4 [(cosmos_proto.scalar) = "cosmos.AddressString"]; - // the signer_address defines the address of the signer + bytes last_commit_hash = 2 [ (gogoproto.customtype) = "LastCommitHash" ]; + bytes bls_sig = 3 + [ (gogoproto.customtype) = + "github.com/babylonchain/babylon/crypto/bls12381.Signature" ]; + // can't find cosmos_proto.scalar when compiling due to cosmos v0.45.4 does + // not support scalar string signer_address = 4 [(cosmos_proto.scalar) = + // "cosmos.AddressString"]; the signer_address defines the address of the + // signer string signer_address = 4; } - diff --git a/proto/babylon/checkpointing/v1/events.proto b/proto/babylon/checkpointing/v1/events.proto new file mode 100644 index 000000000..59712f713 --- /dev/null +++ b/proto/babylon/checkpointing/v1/events.proto @@ -0,0 +1,23 @@ +syntax = "proto3"; +package babylon.checkpointing.v1; + +import "babylon/checkpointing/v1/checkpoint.proto"; + +option go_package = "github.com/babylonchain/babylon/x/checkpointing/types"; + +message EventCheckpointAccumulating { RawCheckpointWithMeta checkpoint = 1; } + +message EventCheckpointSealed { RawCheckpointWithMeta checkpoint = 1; } + +message EventCheckpointSubmitted { RawCheckpointWithMeta checkpoint = 1; } + +message EventCheckpointConfirmed { RawCheckpointWithMeta checkpoint = 1; } + +message EventCheckpointFinalized { RawCheckpointWithMeta checkpoint = 1; } + +message EventCheckpointForgotten { RawCheckpointWithMeta checkpoint = 1; } + +message EventConflictingCheckpoint { + RawCheckpoint conflicting_checkpoint = 1; + RawCheckpointWithMeta local_checkpoint = 2; +} diff --git a/proto/babylon/checkpointing/genesis.proto b/proto/babylon/checkpointing/v1/genesis.proto similarity index 80% rename from proto/babylon/checkpointing/genesis.proto rename to proto/babylon/checkpointing/v1/genesis.proto index a701f5170..82c31669f 100644 --- a/proto/babylon/checkpointing/genesis.proto +++ b/proto/babylon/checkpointing/v1/genesis.proto @@ -1,18 +1,17 @@ syntax = "proto3"; package babylon.checkpointing.v1; -import "cosmos_proto/cosmos.proto"; import "gogoproto/gogo.proto"; import "cosmos/crypto/ed25519/keys.proto"; -import "babylon/checkpointing/params.proto"; -import "babylon/checkpointing/bls_key.proto"; +import "babylon/checkpointing/v1/params.proto"; +import "babylon/checkpointing/v1/bls_key.proto"; option go_package = "github.com/babylonchain/babylon/x/checkpointing/types"; // GenesisState defines the checkpointing module's genesis state. message GenesisState { // params defines all the paramaters of related to checkpointing - Params params = 1 [(gogoproto.nullable) = false]; + Params params = 1 [ (gogoproto.nullable) = false ]; repeated GenesisKey genesis_keys = 2; } diff --git a/proto/babylon/checkpointing/params.proto b/proto/babylon/checkpointing/v1/params.proto similarity index 100% rename from proto/babylon/checkpointing/params.proto rename to proto/babylon/checkpointing/v1/params.proto diff --git a/proto/babylon/checkpointing/query.proto b/proto/babylon/checkpointing/v1/query.proto similarity index 64% rename from proto/babylon/checkpointing/query.proto rename to proto/babylon/checkpointing/v1/query.proto index 3accee792..379f049f4 100644 --- a/proto/babylon/checkpointing/query.proto +++ b/proto/babylon/checkpointing/v1/query.proto @@ -1,45 +1,59 @@ syntax = "proto3"; package babylon.checkpointing.v1; -import "babylon/checkpointing/bls_key.proto"; +import "babylon/checkpointing/v1/bls_key.proto"; import "cosmos/base/query/v1beta1/pagination.proto"; import "gogoproto/gogo.proto"; import "google/api/annotations.proto"; -import "babylon/checkpointing/params.proto"; -import "babylon/checkpointing/checkpoint.proto"; +import "babylon/checkpointing/v1/params.proto"; +import "babylon/checkpointing/v1/checkpoint.proto"; option go_package = "github.com/babylonchain/babylon/x/checkpointing/types"; // Query defines the gRPC querier service. service Query { // RawCheckpointList queries all checkpoints that match the given status. - rpc RawCheckpointList(QueryRawCheckpointListRequest) returns (QueryRawCheckpointListResponse) { - option (google.api.http).get = "/babylon/checkpointing/v1/raw_checkpoints/{status}"; + rpc RawCheckpointList(QueryRawCheckpointListRequest) + returns (QueryRawCheckpointListResponse) { + option (google.api.http).get = + "/babylon/checkpointing/v1/raw_checkpoints/{status}"; } // RawCheckpoint queries a checkpoints at a given epoch number. - rpc RawCheckpoint(QueryRawCheckpointRequest) returns (QueryRawCheckpointResponse) { - option (google.api.http).get = "/babylon/checkpointing/v1/raw_checkpoint/{epoch_num}"; + rpc RawCheckpoint(QueryRawCheckpointRequest) + returns (QueryRawCheckpointResponse) { + option (google.api.http).get = + "/babylon/checkpointing/v1/raw_checkpoint/{epoch_num}"; } - // BlsPublicKeyList queries a list of bls public keys of the validators at a given epoch number. - rpc BlsPublicKeyList(QueryBlsPublicKeyListRequest) returns (QueryBlsPublicKeyListResponse) { - option (google.api.http).get = "/babylon/checkpointing/v1/bls_public_keys/{epoch_num}"; + // BlsPublicKeyList queries a list of bls public keys of the validators at a + // given epoch number. + rpc BlsPublicKeyList(QueryBlsPublicKeyListRequest) + returns (QueryBlsPublicKeyListResponse) { + option (google.api.http).get = + "/babylon/checkpointing/v1/bls_public_keys/{epoch_num}"; } // EpochStatus queries the status of the checkpoint at a given epoch rpc EpochStatus(QueryEpochStatusRequest) returns (QueryEpochStatusResponse) { - option (google.api.http).get = "/babylon/checkpointing/v1/epochs/{epoch_num}/status"; + option (google.api.http).get = + "/babylon/checkpointing/v1/epochs/{epoch_num}/status"; } - // RecentEpochStatusCount queries the number of epochs with each status in recent epochs - rpc RecentEpochStatusCount(QueryRecentEpochStatusCountRequest) returns (QueryRecentEpochStatusCountResponse) { - option (google.api.http).get = "/babylon/checkpointing/v1/epochs:status_count"; + // RecentEpochStatusCount queries the number of epochs with each status in + // recent epochs + rpc RecentEpochStatusCount(QueryRecentEpochStatusCountRequest) + returns (QueryRecentEpochStatusCountResponse) { + option (google.api.http).get = + "/babylon/checkpointing/v1/epochs:status_count"; } - // LastCheckpointWithStatus queries the last checkpoint with a given status or a more matured status - rpc LastCheckpointWithStatus(QueryLastCheckpointWithStatusRequest) returns (QueryLastCheckpointWithStatusResponse) { - option (google.api.http).get = "/babylon/checkpointing/v1/last_raw_checkpoint/{status}"; + // LastCheckpointWithStatus queries the last checkpoint with a given status or + // a more matured status + rpc LastCheckpointWithStatus(QueryLastCheckpointWithStatusRequest) + returns (QueryLastCheckpointWithStatusResponse) { + option (google.api.http).get = + "/babylon/checkpointing/v1/last_raw_checkpoint/{status}"; } // Parameters queries the parameters of the module. @@ -48,8 +62,8 @@ service Query { } } -// QueryRawCheckpointListRequest is the request type for the Query/RawCheckpoints -// RPC method. +// QueryRawCheckpointListRequest is the request type for the +// Query/RawCheckpoints RPC method. message QueryRawCheckpointListRequest { // status defines the status of the raw checkpoints of the query CheckpointStatus status = 1; @@ -58,8 +72,8 @@ message QueryRawCheckpointListRequest { cosmos.base.query.v1beta1.PageRequest pagination = 2; } -// QueryRawCheckpointListResponse is the response type for the Query/RawCheckpoints -// RPC method. +// QueryRawCheckpointListResponse is the response type for the +// Query/RawCheckpoints RPC method. message QueryRawCheckpointListResponse { // the order is going from the newest to oldest based on the epoch number repeated RawCheckpointWithMeta raw_checkpoints = 1; @@ -77,9 +91,7 @@ message QueryRawCheckpointRequest { // QueryRawCheckpointResponse is the response type for the Query/RawCheckpoint // RPC method. -message QueryRawCheckpointResponse { - RawCheckpointWithMeta raw_checkpoint = 1; -} +message QueryRawCheckpointResponse { RawCheckpointWithMeta raw_checkpoint = 1; } // QueryBlsPublicKeyListRequest is the request type for the Query/BlsPublicKeys // RPC method. @@ -91,8 +103,8 @@ message QueryBlsPublicKeyListRequest { cosmos.base.query.v1beta1.PageRequest pagination = 2; } -// QueryBlsPublicKeyListResponse is the response type for the Query/BlsPublicKeys -// RPC method. +// QueryBlsPublicKeyListResponse is the response type for the +// Query/BlsPublicKeys RPC method. message QueryBlsPublicKeyListResponse { repeated ValidatorWithBlsKey validator_with_bls_keys = 1; @@ -102,34 +114,29 @@ message QueryBlsPublicKeyListResponse { // QueryEpochStatusRequest is the request type for the Query/EpochStatus // RPC method. -message QueryEpochStatusRequest { - uint64 epoch_num = 1; -} +message QueryEpochStatusRequest { uint64 epoch_num = 1; } // QueryEpochStatusResponse is the response type for the Query/EpochStatus // RPC method. -message QueryEpochStatusResponse { - CheckpointStatus status = 1; -} +message QueryEpochStatusResponse { CheckpointStatus status = 1; } -// QueryRecentEpochStatusCountRequest is the request type for the Query/EpochStatusCount -// RPC method. +// QueryRecentEpochStatusCountRequest is the request type for the +// Query/EpochStatusCount RPC method. message QueryRecentEpochStatusCountRequest { - // epoch_count is the number of the most recent epochs to include in the aggregation + // epoch_count is the number of the most recent epochs to include in the + // aggregation uint64 epoch_count = 1; } -// QueryRecentEpochStatusCountResponse is the response type for the Query/EpochStatusCount -// RPC method. +// QueryRecentEpochStatusCountResponse is the response type for the +// Query/EpochStatusCount RPC method. message QueryRecentEpochStatusCountResponse { uint64 tip_epoch = 1; uint64 epoch_count = 2; map status_count = 3; } -message QueryLastCheckpointWithStatusRequest { - CheckpointStatus status = 1; -} +message QueryLastCheckpointWithStatusRequest { CheckpointStatus status = 1; } message QueryLastCheckpointWithStatusResponse { RawCheckpoint raw_checkpoint = 1; diff --git a/proto/babylon/checkpointing/tx.proto b/proto/babylon/checkpointing/v1/tx.proto similarity index 83% rename from proto/babylon/checkpointing/tx.proto rename to proto/babylon/checkpointing/v1/tx.proto index a6c89b28a..47345c5f7 100644 --- a/proto/babylon/checkpointing/tx.proto +++ b/proto/babylon/checkpointing/v1/tx.proto @@ -2,8 +2,8 @@ syntax = "proto3"; package babylon.checkpointing.v1; import "gogoproto/gogo.proto"; -import "babylon/checkpointing/checkpoint.proto"; -import "babylon/checkpointing/bls_key.proto"; +import "babylon/checkpointing/v1/checkpoint.proto"; +import "babylon/checkpointing/v1/bls_key.proto"; import "cosmos/staking/v1beta1/tx.proto"; option go_package = "github.com/babylonchain/babylon/x/checkpointing/types"; @@ -14,7 +14,8 @@ service Msg { rpc AddBlsSig(MsgAddBlsSig) returns (MsgAddBlsSigResponse); // WrappedCreateValidator defines a method for registering a new validator - rpc WrappedCreateValidator(MsgWrappedCreateValidator) returns (MsgWrappedCreateValidatorResponse); + rpc WrappedCreateValidator(MsgWrappedCreateValidator) + returns (MsgWrappedCreateValidatorResponse); } // MsgAddBlsSig defines a message to add a bls signature from a @@ -38,5 +39,6 @@ message MsgWrappedCreateValidator { cosmos.staking.v1beta1.MsgCreateValidator msg_create_validator = 2; } -// MsgWrappedCreateValidatorResponse defines the MsgWrappedCreateValidator response type +// MsgWrappedCreateValidatorResponse defines the MsgWrappedCreateValidator +// response type message MsgWrappedCreateValidatorResponse {} diff --git a/proto/babylon/epoching/v1/epoching.proto b/proto/babylon/epoching/v1/epoching.proto index 4cd3fe688..76309e388 100644 --- a/proto/babylon/epoching/v1/epoching.proto +++ b/proto/babylon/epoching/v1/epoching.proto @@ -13,18 +13,22 @@ message Epoch { uint64 current_epoch_interval = 2; uint64 first_block_height = 3; // last_block_header is the header of the last block in this epoch. - // Babylon needs to remember the last header of each epoch to complete unbonding validators/delegations when a previous epoch's checkpoint is finalised. - // The last_block_header field is nil in the epoch's beginning, and is set upon the end of this epoch. + // Babylon needs to remember the last header of each epoch to complete + // unbonding validators/delegations when a previous epoch's checkpoint is + // finalised. The last_block_header field is nil in the epoch's beginning, and + // is set upon the end of this epoch. tendermint.types.Header last_block_header = 4; // app_hash_root is the Merkle root of all AppHashs in this epoch // It will be used for proving a block is in an epoch bytes app_hash_root = 5; // sealer_header is the 2nd header of the next epoch - // This validator set has generated a BLS multisig on `last_commit_hash` of the sealer header + // This validator set has generated a BLS multisig on `last_commit_hash` of + // the sealer header tendermint.types.Header sealer_header = 6; } -// QueuedMessage is a message that can change the validator set and is delayed to the epoch boundary +// QueuedMessage is a message that can change the validator set and is delayed +// to the epoch boundary message QueuedMessage { // tx_id is the ID of the tx that contains the message bytes tx_id = 1; @@ -33,8 +37,9 @@ message QueuedMessage { // block_height is the height when this msg is submitted to Babylon uint64 block_height = 3; // block_time is the timestamp when this msg is submitted to Babylon - google.protobuf.Timestamp block_time = 4 [(gogoproto.stdtime) = true]; - // msg is the actual message that is sent by a user and is queued by the epoching module + google.protobuf.Timestamp block_time = 4 [ (gogoproto.stdtime) = true ]; + // msg is the actual message that is sent by a user and is queued by the + // epoching module oneof msg { cosmos.staking.v1beta1.MsgCreateValidator msg_create_validator = 5; cosmos.staking.v1beta1.MsgDelegate msg_delegate = 6; @@ -60,7 +65,7 @@ enum BondState { message ValStateUpdate { BondState state = 1; uint64 block_height = 2; - google.protobuf.Timestamp block_time = 3 [(gogoproto.stdtime) = true]; + google.protobuf.Timestamp block_time = 3 [ (gogoproto.stdtime) = true ]; } message ValidatorLifecycle { @@ -72,7 +77,7 @@ message DelegationStateUpdate { BondState state = 1; string val_addr = 2; uint64 block_height = 3; - google.protobuf.Timestamp block_time = 4 [(gogoproto.stdtime) = true]; + google.protobuf.Timestamp block_time = 4 [ (gogoproto.stdtime) = true ]; } message DelegationLifecycle { diff --git a/proto/babylon/epoching/v1/events.proto b/proto/babylon/epoching/v1/events.proto index f2e96eb60..6ca29a659 100644 --- a/proto/babylon/epoching/v1/events.proto +++ b/proto/babylon/epoching/v1/events.proto @@ -5,53 +5,49 @@ import "gogoproto/gogo.proto"; option go_package = "github.com/babylonchain/babylon/x/epoching/types"; -message EventBeginEpoch { - uint64 epoch_number = 1; -} +message EventBeginEpoch { uint64 epoch_number = 1; } -message EventEndEpoch { - uint64 epoch_number = 1; -} +message EventEndEpoch { uint64 epoch_number = 1; } message EventHandleQueuedMsg { - string original_event_type = 1; - uint64 epoch_number = 2; - uint64 height = 3; - bytes tx_id = 4; - bytes msg_id = 5; - repeated bytes original_attributes = 6 [ - (gogoproto.customtype) = "github.com/tendermint/tendermint/abci/types.EventAttribute" - ]; - string error = 7; + string original_event_type = 1; + uint64 epoch_number = 2; + uint64 height = 3; + bytes tx_id = 4; + bytes msg_id = 5; + repeated bytes original_attributes = 6 + [ (gogoproto.customtype) = + "github.com/tendermint/tendermint/abci/types.EventAttribute" ]; + string error = 7; } message EventSlashThreshold { - int64 slashed_voting_power = 1; - int64 total_voting_power = 2; - repeated bytes slashed_validators = 3; + int64 slashed_voting_power = 1; + int64 total_voting_power = 2; + repeated bytes slashed_validators = 3; } message EventWrappedDelegate { - string delegator_address = 1; - string validator_address = 2; - uint64 amount = 3; - string denom = 4; - uint64 epoch_boundary = 5; + string delegator_address = 1; + string validator_address = 2; + uint64 amount = 3; + string denom = 4; + uint64 epoch_boundary = 5; } message EventWrappedUndelegate { - string delegator_address = 1; - string validator_address = 2; - uint64 amount = 3; - string denom = 4; - uint64 epoch_boundary = 5; + string delegator_address = 1; + string validator_address = 2; + uint64 amount = 3; + string denom = 4; + uint64 epoch_boundary = 5; } message EventWrappedBeginRedelegate { - string delegator_address = 1; - string source_validator_address = 2; - string destination_validator_address = 3; - uint64 amount = 4; - string denom = 5; - uint64 epoch_boundary = 6; + string delegator_address = 1; + string source_validator_address = 2; + string destination_validator_address = 3; + uint64 amount = 4; + string denom = 5; + uint64 epoch_boundary = 6; } diff --git a/proto/babylon/epoching/v1/genesis.proto b/proto/babylon/epoching/v1/genesis.proto index 7f7a99177..eea522cba 100644 --- a/proto/babylon/epoching/v1/genesis.proto +++ b/proto/babylon/epoching/v1/genesis.proto @@ -7,6 +7,4 @@ import "babylon/epoching/v1/params.proto"; option go_package = "github.com/babylonchain/babylon/x/epoching/types"; // GenesisState defines the epoching module's genesis state. -message GenesisState { - Params params = 1 [ (gogoproto.nullable) = false ]; -} +message GenesisState { Params params = 1 [ (gogoproto.nullable) = false ]; } diff --git a/proto/babylon/epoching/v1/params.proto b/proto/babylon/epoching/v1/params.proto index 9da17151d..a9ce9a531 100644 --- a/proto/babylon/epoching/v1/params.proto +++ b/proto/babylon/epoching/v1/params.proto @@ -7,8 +7,9 @@ option go_package = "github.com/babylonchain/babylon/x/epoching/types"; // Params defines the parameters for the module. message Params { - option (gogoproto.equal) = true; + option (gogoproto.equal) = true; // epoch_interval is the number of consecutive blocks to form an epoch - uint64 epoch_interval = 1 [ (gogoproto.moretags) = "yaml:\"epoch_interval\"" ]; + uint64 epoch_interval = 1 + [ (gogoproto.moretags) = "yaml:\"epoch_interval\"" ]; } diff --git a/proto/babylon/epoching/v1/query.proto b/proto/babylon/epoching/v1/query.proto index 7a8f01d87..f24f8a162 100644 --- a/proto/babylon/epoching/v1/query.proto +++ b/proto/babylon/epoching/v1/query.proto @@ -21,41 +21,51 @@ service Query { option (google.api.http).get = "/babylon/epoching/v1/epochs/{epoch_num=*}"; } - // EpochsInfo queries the metadata of epochs in a given range, depending on the - // parameters in the pagination request. Th main use case will be querying the - // latest epochs in time order. + // EpochsInfo queries the metadata of epochs in a given range, depending on + // the parameters in the pagination request. Th main use case will be querying + // the latest epochs in time order. rpc EpochsInfo(QueryEpochsInfoRequest) returns (QueryEpochsInfoResponse) { option (google.api.http).get = "/babylon/epoching/v1/epochs"; } // CurrentEpoch queries the current epoch - rpc CurrentEpoch(QueryCurrentEpochRequest) returns (QueryCurrentEpochResponse) { + rpc CurrentEpoch(QueryCurrentEpochRequest) + returns (QueryCurrentEpochResponse) { option (google.api.http).get = "/babylon/epoching/v1/current_epoch"; } // EpochMsgs queries the messages of a given epoch rpc EpochMsgs(QueryEpochMsgsRequest) returns (QueryEpochMsgsResponse) { - option (google.api.http).get = "/babylon/epoching/v1/epochs/{epoch_num=*}/messages"; + option (google.api.http).get = + "/babylon/epoching/v1/epochs/{epoch_num=*}/messages"; } - // LatestEpochMsgs queries the messages within a given number of most recent epochs - rpc LatestEpochMsgs(QueryLatestEpochMsgsRequest) returns (QueryLatestEpochMsgsResponse) { - option (google.api.http).get = "/babylon/epoching/v1/epochs:latest/messages"; + // LatestEpochMsgs queries the messages within a given number of most recent + // epochs + rpc LatestEpochMsgs(QueryLatestEpochMsgsRequest) + returns (QueryLatestEpochMsgsResponse) { + option (google.api.http).get = + "/babylon/epoching/v1/epochs:latest/messages"; } // ValidatorLifecycle queries the lifecycle of a given validator - rpc ValidatorLifecycle(QueryValidatorLifecycleRequest) returns (QueryValidatorLifecycleResponse) { - option (google.api.http).get = "/babylon/epoching/v1/validator_lifecycle/{val_addr}"; + rpc ValidatorLifecycle(QueryValidatorLifecycleRequest) + returns (QueryValidatorLifecycleResponse) { + option (google.api.http).get = + "/babylon/epoching/v1/validator_lifecycle/{val_addr}"; } // DelegationLifecycle queries the lifecycle of a given delegation - rpc DelegationLifecycle(QueryDelegationLifecycleRequest) returns (QueryDelegationLifecycleResponse) { - option (google.api.http).get = "/babylon/epoching/v1/delegation_lifecycle/{del_addr}"; + rpc DelegationLifecycle(QueryDelegationLifecycleRequest) + returns (QueryDelegationLifecycleResponse) { + option (google.api.http).get = + "/babylon/epoching/v1/delegation_lifecycle/{del_addr}"; } // EpochValSet queries the validator set of a given epoch rpc EpochValSet(QueryEpochValSetRequest) returns (QueryEpochValSetResponse) { - option (google.api.http).get = "/babylon/epoching/v1/epochs/{epoch_num=*}/validator_set"; + option (google.api.http).get = + "/babylon/epoching/v1/epochs/{epoch_num=*}/validator_set"; } } @@ -68,13 +78,9 @@ message QueryParamsResponse { babylon.epoching.v1.Params params = 1 [ (gogoproto.nullable) = false ]; } -message QueryEpochInfoRequest { - uint64 epoch_num = 1; -} +message QueryEpochInfoRequest { uint64 epoch_num = 1; } -message QueryEpochInfoResponse { - babylon.epoching.v1.Epoch epoch = 1; -} +message QueryEpochInfoResponse { babylon.epoching.v1.Epoch epoch = 1; } message QueryEpochsInfoRequest { // pagination defines whether to have the pagination in the request @@ -83,16 +89,18 @@ message QueryEpochsInfoRequest { message QueryEpochsInfoResponse { repeated babylon.epoching.v1.Epoch epochs = 1; - + // pagination defines the pagination in the response cosmos.base.query.v1beta1.PageResponse pagination = 2; } -// QueryCurrentEpochRequest is the request type for the Query/CurrentEpoch RPC method +// QueryCurrentEpochRequest is the request type for the Query/CurrentEpoch RPC +// method message QueryCurrentEpochRequest {} -// QueryCurrentEpochResponse is the response type for the Query/CurrentEpoch RPC method -message QueryCurrentEpochResponse { +// QueryCurrentEpochResponse is the response type for the Query/CurrentEpoch RPC +// method +message QueryCurrentEpochResponse { // current_epoch is the current epoch number uint64 current_epoch = 1; // epoch_boundary is the height of this epoch's last block @@ -108,7 +116,8 @@ message QueryEpochMsgsRequest { cosmos.base.query.v1beta1.PageRequest pagination = 2; } -// QueryEpochMsgsResponse is the response type for the Query/EpochMsgs RPC method +// QueryEpochMsgsResponse is the response type for the Query/EpochMsgs RPC +// method message QueryEpochMsgsResponse { // msgs is the list of messages queued in the current epoch repeated babylon.epoching.v1.QueuedMessage msgs = 1; @@ -116,8 +125,9 @@ message QueryEpochMsgsResponse { cosmos.base.query.v1beta1.PageResponse pagination = 2; } -// QueryLatestEpochMsgsRequest is the request type for the Query/LatestEpochMsgs RPC method -// it returns epoch msgs within epoch [max(1, end_epoch-epoch_count+1), end_epoch] +// QueryLatestEpochMsgsRequest is the request type for the Query/LatestEpochMsgs +// RPC method it returns epoch msgs within epoch [max(1, +// end_epoch-epoch_count+1), end_epoch] message QueryLatestEpochMsgsRequest { // end_epoch is the number of the last epoch to query uint64 end_epoch = 1; @@ -127,7 +137,8 @@ message QueryLatestEpochMsgsRequest { cosmos.base.query.v1beta1.PageRequest pagination = 3; } -// QueryLatestEpochMsgsResponse is the response type for the Query/LatestEpochMsgs RPC method +// QueryLatestEpochMsgsResponse is the response type for the +// Query/LatestEpochMsgs RPC method message QueryLatestEpochMsgsResponse { // epoch_msg_map is a list of QueuedMessageList // each QueuedMessageList has a field identifying the epoch number @@ -136,21 +147,13 @@ message QueryLatestEpochMsgsResponse { cosmos.base.query.v1beta1.PageResponse pagination = 2; } -message QueryValidatorLifecycleRequest { - string val_addr = 1; -} +message QueryValidatorLifecycleRequest { string val_addr = 1; } -message QueryValidatorLifecycleResponse { - ValidatorLifecycle val_life = 1; -} +message QueryValidatorLifecycleResponse { ValidatorLifecycle val_life = 1; } -message QueryDelegationLifecycleRequest { - string del_addr = 1; -} +message QueryDelegationLifecycleRequest { string del_addr = 1; } -message QueryDelegationLifecycleResponse { - DelegationLifecycle del_life = 1; -} +message QueryDelegationLifecycleResponse { DelegationLifecycle del_life = 1; } message QueryEpochValSetRequest { uint64 epoch_num = 1; diff --git a/proto/babylon/epoching/v1/tx.proto b/proto/babylon/epoching/v1/tx.proto index d998f0ef4..d3f2cb4ad 100644 --- a/proto/babylon/epoching/v1/tx.proto +++ b/proto/babylon/epoching/v1/tx.proto @@ -1,7 +1,6 @@ syntax = "proto3"; package babylon.epoching.v1; -import "google/protobuf/any.proto"; import "gogoproto/gogo.proto"; import "cosmos/staking/v1beta1/tx.proto"; @@ -9,36 +8,41 @@ option go_package = "github.com/babylonchain/babylon/x/epoching/types"; // Msg defines the Msg service. service Msg { - // WrappedDelegate defines a method for performing a delegation of coins from a delegator to a validator. + // WrappedDelegate defines a method for performing a delegation of coins from + // a delegator to a validator. rpc WrappedDelegate(MsgWrappedDelegate) returns (MsgWrappedDelegateResponse); - // WrappedUndelegate defines a method for performing an undelegation from a delegate and a validator. - rpc WrappedUndelegate(MsgWrappedUndelegate) returns (MsgWrappedUndelegateResponse); + // WrappedUndelegate defines a method for performing an undelegation from a + // delegate and a validator. + rpc WrappedUndelegate(MsgWrappedUndelegate) + returns (MsgWrappedUndelegateResponse); - // WrappedBeginRedelegate defines a method for performing a redelegation of coins from a delegator and source validator to a destination validator. - rpc WrappedBeginRedelegate(MsgWrappedBeginRedelegate) returns (MsgWrappedBeginRedelegateResponse); + // WrappedBeginRedelegate defines a method for performing a redelegation of + // coins from a delegator and source validator to a destination validator. + rpc WrappedBeginRedelegate(MsgWrappedBeginRedelegate) + returns (MsgWrappedBeginRedelegateResponse); } message MsgWrappedDelegate { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; + option (gogoproto.equal) = false; + option (gogoproto.goproto_getters) = false; - cosmos.staking.v1beta1.MsgDelegate msg = 1; + cosmos.staking.v1beta1.MsgDelegate msg = 1; } message MsgWrappedDelegateResponse {} message MsgWrappedUndelegate { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; + option (gogoproto.equal) = false; + option (gogoproto.goproto_getters) = false; - cosmos.staking.v1beta1.MsgUndelegate msg = 1; + cosmos.staking.v1beta1.MsgUndelegate msg = 1; } message MsgWrappedUndelegateResponse {} message MsgWrappedBeginRedelegate { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; + option (gogoproto.equal) = false; + option (gogoproto.goproto_getters) = false; - cosmos.staking.v1beta1.MsgBeginRedelegate msg = 1; + cosmos.staking.v1beta1.MsgBeginRedelegate msg = 1; } message MsgWrappedBeginRedelegateResponse {} diff --git a/proto/babylon/monitor/genesis.proto b/proto/babylon/monitor/v1/genesis.proto similarity index 87% rename from proto/babylon/monitor/genesis.proto rename to proto/babylon/monitor/v1/genesis.proto index fb79098d0..82df413d7 100644 --- a/proto/babylon/monitor/genesis.proto +++ b/proto/babylon/monitor/v1/genesis.proto @@ -2,7 +2,7 @@ syntax = "proto3"; package babylon.monitor.v1; import "gogoproto/gogo.proto"; -import "babylon/monitor/params.proto"; +import "babylon/monitor/v1/params.proto"; option go_package = "github.com/babylonchain/babylon/x/monitor/types"; diff --git a/proto/babylon/monitor/params.proto b/proto/babylon/monitor/v1/params.proto similarity index 75% rename from proto/babylon/monitor/params.proto rename to proto/babylon/monitor/v1/params.proto index 9ffe19c63..50b3bdc21 100644 --- a/proto/babylon/monitor/params.proto +++ b/proto/babylon/monitor/v1/params.proto @@ -6,6 +6,4 @@ import "gogoproto/gogo.proto"; option go_package = "github.com/babylonchain/babylon/x/monitor/types"; // Params defines the parameters for the module. -message Params { - option (gogoproto.equal) = true; -} +message Params { option (gogoproto.equal) = true; } diff --git a/proto/babylon/monitor/query.proto b/proto/babylon/monitor/v1/query.proto similarity index 74% rename from proto/babylon/monitor/query.proto rename to proto/babylon/monitor/v1/query.proto index ae2128f31..c7e0014d2 100644 --- a/proto/babylon/monitor/query.proto +++ b/proto/babylon/monitor/v1/query.proto @@ -3,8 +3,7 @@ package babylon.monitor.v1; import "gogoproto/gogo.proto"; import "google/api/annotations.proto"; -import "cosmos/base/query/v1beta1/pagination.proto"; -import "babylon/monitor/params.proto"; +import "babylon/monitor/v1/params.proto"; option go_package = "github.com/babylonchain/babylon/x/monitor/types"; @@ -15,14 +14,19 @@ service Query { option (google.api.http).get = "/babylon/monitor/v1/params"; } - // EndedEpochBtcHeight returns the BTC light client height at provided epoch finish - rpc EndedEpochBtcHeight(QueryEndedEpochBtcHeightRequest) returns (QueryEndedEpochBtcHeightResponse) { + // EndedEpochBtcHeight returns the BTC light client height at provided epoch + // finish + rpc EndedEpochBtcHeight(QueryEndedEpochBtcHeightRequest) + returns (QueryEndedEpochBtcHeightResponse) { option (google.api.http).get = "/babylon/monitor/v1/epochs/{epoch_num}"; } - // ReportedCheckpointBtcHeight returns the BTC light client height at which the checkpoint with the given hash is reported back to Babylon - rpc ReportedCheckpointBtcHeight(QueryReportedCheckpointBtcHeightRequest) returns (QueryReportedCheckpointBtcHeightResponse) { - option (google.api.http).get = "/babylon/monitor/v1/checkpoints/{ckpt_hash}"; + // ReportedCheckpointBtcHeight returns the BTC light client height at which + // the checkpoint with the given hash is reported back to Babylon + rpc ReportedCheckpointBtcHeight(QueryReportedCheckpointBtcHeightRequest) + returns (QueryReportedCheckpointBtcHeightResponse) { + option (google.api.http).get = + "/babylon/monitor/v1/checkpoints/{ckpt_hash}"; } } @@ -35,9 +39,7 @@ message QueryParamsResponse { Params params = 1 [ (gogoproto.nullable) = false ]; } -message QueryEndedEpochBtcHeightRequest { - uint64 epoch_num = 1; -} +message QueryEndedEpochBtcHeightRequest { uint64 epoch_num = 1; } message QueryEndedEpochBtcHeightResponse { // height of btc light client when epoch ended diff --git a/proto/babylon/zoneconcierge/genesis.proto b/proto/babylon/zoneconcierge/v1/genesis.proto similarity index 87% rename from proto/babylon/zoneconcierge/genesis.proto rename to proto/babylon/zoneconcierge/v1/genesis.proto index 8acfe6ca3..fa55fc58d 100644 --- a/proto/babylon/zoneconcierge/genesis.proto +++ b/proto/babylon/zoneconcierge/v1/genesis.proto @@ -2,7 +2,7 @@ syntax = "proto3"; package babylon.zoneconcierge.v1; import "gogoproto/gogo.proto"; -import "babylon/zoneconcierge/params.proto"; +import "babylon/zoneconcierge/v1/params.proto"; option go_package = "github.com/babylonchain/babylon/x/zoneconcierge/types"; diff --git a/proto/babylon/zoneconcierge/packet.proto b/proto/babylon/zoneconcierge/v1/packet.proto similarity index 100% rename from proto/babylon/zoneconcierge/packet.proto rename to proto/babylon/zoneconcierge/v1/packet.proto diff --git a/proto/babylon/zoneconcierge/params.proto b/proto/babylon/zoneconcierge/v1/params.proto similarity index 75% rename from proto/babylon/zoneconcierge/params.proto rename to proto/babylon/zoneconcierge/v1/params.proto index a633f0d8d..e843f3ba3 100644 --- a/proto/babylon/zoneconcierge/params.proto +++ b/proto/babylon/zoneconcierge/v1/params.proto @@ -6,7 +6,4 @@ import "gogoproto/gogo.proto"; option go_package = "github.com/babylonchain/babylon/x/zoneconcierge/types"; // Params defines the parameters for the module. -message Params { - option (gogoproto.goproto_stringer) = false; - -} +message Params { option (gogoproto.goproto_stringer) = false; } diff --git a/proto/babylon/zoneconcierge/query.proto b/proto/babylon/zoneconcierge/v1/query.proto similarity index 74% rename from proto/babylon/zoneconcierge/query.proto rename to proto/babylon/zoneconcierge/v1/query.proto index 92d755eb6..a9f99ec3b 100644 --- a/proto/babylon/zoneconcierge/query.proto +++ b/proto/babylon/zoneconcierge/v1/query.proto @@ -4,13 +4,11 @@ package babylon.zoneconcierge.v1; import "gogoproto/gogo.proto"; import "google/api/annotations.proto"; import "cosmos/base/query/v1beta1/pagination.proto"; -import "babylon/btccheckpoint/tx.proto"; -import "babylon/btccheckpoint/btccheckpoint.proto"; -import "babylon/checkpointing/query.proto"; -import "babylon/checkpointing/checkpoint.proto"; +import "babylon/btccheckpoint/v1/btccheckpoint.proto"; +import "babylon/checkpointing/v1/checkpoint.proto"; import "babylon/epoching/v1/epoching.proto"; -import "babylon/zoneconcierge/params.proto"; -import "babylon/zoneconcierge/zoneconcierge.proto"; +import "babylon/zoneconcierge/v1/params.proto"; +import "babylon/zoneconcierge/v1/zoneconcierge.proto"; option go_package = "github.com/babylonchain/babylon/x/zoneconcierge/types"; @@ -22,7 +20,8 @@ service Query { } // Header queries the CZ header and fork headers at a given height. rpc Header(QueryHeaderRequest) returns (QueryHeaderResponse) { - option (google.api.http).get = "/babylon/zoneconcierge/v1/chain_info/{chain_id}/header/{height}"; + option (google.api.http).get = + "/babylon/zoneconcierge/v1/chain_info/{chain_id}/header/{height}"; } // ChainList queries the list of chains that checkpoint to Babylon rpc ChainList(QueryChainListRequest) returns (QueryChainListResponse) { @@ -30,27 +29,42 @@ service Query { } // ChainInfo queries the latest info of a chain in Babylon's view rpc ChainInfo(QueryChainInfoRequest) returns (QueryChainInfoResponse) { - option (google.api.http).get = "/babylon/zoneconcierge/v1/chain_info/{chain_id}"; + option (google.api.http).get = + "/babylon/zoneconcierge/v1/chain_info/{chain_id}"; } - // EpochChainInfo queries the latest info of a chain in a given epoch of Babylon's view - rpc EpochChainInfo(QueryEpochChainInfoRequest) returns (QueryEpochChainInfoResponse) { - option (google.api.http).get = "/babylon/zoneconcierge/v1/chain_info/{chain_id}/epochs/{epoch_num}"; + // EpochChainInfo queries the latest info of a chain in a given epoch of + // Babylon's view + rpc EpochChainInfo(QueryEpochChainInfoRequest) + returns (QueryEpochChainInfoResponse) { + option (google.api.http).get = + "/babylon/zoneconcierge/v1/chain_info/{chain_id}/epochs/{epoch_num}"; } - // ListHeaders queries the headers of a chain in Babylon's view, with pagination support + // ListHeaders queries the headers of a chain in Babylon's view, with + // pagination support rpc ListHeaders(QueryListHeadersRequest) returns (QueryListHeadersResponse) { - option (google.api.http).get = "/babylon/zoneconcierge/v1/headers/{chain_id}"; + option (google.api.http).get = + "/babylon/zoneconcierge/v1/headers/{chain_id}"; } - // ListEpochHeaders queries the headers of a chain timestamped in a given epoch of Babylon, with pagination support - rpc ListEpochHeaders(QueryListEpochHeadersRequest) returns (QueryListEpochHeadersResponse) { - option (google.api.http).get = "/babylon/zoneconcierge/v1/headers/{chain_id}/epochs/{epoch_num}"; + // ListEpochHeaders queries the headers of a chain timestamped in a given + // epoch of Babylon, with pagination support + rpc ListEpochHeaders(QueryListEpochHeadersRequest) + returns (QueryListEpochHeadersResponse) { + option (google.api.http).get = + "/babylon/zoneconcierge/v1/headers/{chain_id}/epochs/{epoch_num}"; } // FinalizedChainInfo queries the BTC-finalised info of a chain, with proofs - rpc FinalizedChainInfo(QueryFinalizedChainInfoRequest) returns (QueryFinalizedChainInfoResponse) { - option (google.api.http).get = "/babylon/zoneconcierge/v1/finalized_chain_info/{chain_id}"; + rpc FinalizedChainInfo(QueryFinalizedChainInfoRequest) + returns (QueryFinalizedChainInfoResponse) { + option (google.api.http).get = + "/babylon/zoneconcierge/v1/finalized_chain_info/{chain_id}"; } - // FinalizedChainInfoUntilHeight queries the BTC-finalised info no later than the provided CZ height, with proofs - rpc FinalizedChainInfoUntilHeight(QueryFinalizedChainInfoUntilHeightRequest) returns (QueryFinalizedChainInfoUntilHeightResponse) { - option (google.api.http).get = "/babylon/zoneconcierge/v1/finalized_chain_info/{chain_id}/height/{height}"; + // FinalizedChainInfoUntilHeight queries the BTC-finalised info no later than + // the provided CZ height, with proofs + rpc FinalizedChainInfoUntilHeight(QueryFinalizedChainInfoUntilHeightRequest) + returns (QueryFinalizedChainInfoUntilHeightResponse) { + option (google.api.http).get = + "/babylon/zoneconcierge/v1/finalized_chain_info/{chain_id}/height/" + "{height}"; } } @@ -60,7 +74,7 @@ message QueryParamsRequest {} // QueryParamsResponse is response type for the Query/Params RPC method. message QueryParamsResponse { // params holds all the parameters of this module. - Params params = 1 [(gogoproto.nullable) = false]; + Params params = 1 [ (gogoproto.nullable) = false ]; } // QueryHeaderRequest is request type for the Query/Header RPC method. @@ -90,9 +104,7 @@ message QueryChainListResponse { } // QueryChainInfoRequest is request type for the Query/ChainInfo RPC method. -message QueryChainInfoRequest { - string chain_id = 1; -} +message QueryChainInfoRequest { string chain_id = 1; } // QueryChainInfoResponse is response type for the Query/ChainInfo RPC method. message QueryChainInfoResponse { @@ -100,13 +112,15 @@ message QueryChainInfoResponse { babylon.zoneconcierge.v1.ChainInfo chain_info = 1; } -// QueryEpochChainInfoRequest is request type for the Query/EpochChainInfo RPC method. +// QueryEpochChainInfoRequest is request type for the Query/EpochChainInfo RPC +// method. message QueryEpochChainInfoRequest { uint64 epoch_num = 1; string chain_id = 2; } -// QueryEpochChainInfoResponse is response type for the Query/EpochChainInfo RPC method. +// QueryEpochChainInfoResponse is response type for the Query/EpochChainInfo RPC +// method. message QueryEpochChainInfoResponse { // chain_info is the info of the CZ babylon.zoneconcierge.v1.ChainInfo chain_info = 1; @@ -119,7 +133,8 @@ message QueryListHeadersRequest { cosmos.base.query.v1beta1.PageRequest pagination = 2; } -// QueryListHeadersResponse is response type for the Query/ListHeaders RPC method. +// QueryListHeadersResponse is response type for the Query/ListHeaders RPC +// method. message QueryListHeadersResponse { // headers is the list of headers repeated babylon.zoneconcierge.v1.IndexedHeader headers = 1; @@ -127,19 +142,22 @@ message QueryListHeadersResponse { cosmos.base.query.v1beta1.PageResponse pagination = 2; } -// QueryListEpochHeadersRequest is request type for the Query/ListEpochHeaders RPC method. +// QueryListEpochHeadersRequest is request type for the Query/ListEpochHeaders +// RPC method. message QueryListEpochHeadersRequest { uint64 epoch_num = 1; string chain_id = 2; } -// QueryListEpochHeadersResponse is response type for the Query/ListEpochHeaders RPC method. +// QueryListEpochHeadersResponse is response type for the Query/ListEpochHeaders +// RPC method. message QueryListEpochHeadersResponse { // headers is the list of headers repeated babylon.zoneconcierge.v1.IndexedHeader headers = 1; } -// QueryFinalizedChainInfoRequest is request type for the Query/FinalizedChainInfo RPC method. +// QueryFinalizedChainInfoRequest is request type for the +// Query/FinalizedChainInfo RPC method. message QueryFinalizedChainInfoRequest { // chain_id is the ID of the CZ string chain_id = 1; @@ -147,7 +165,8 @@ message QueryFinalizedChainInfoRequest { bool prove = 2; } -// QueryFinalizedChainInfoResponse is response type for the Query/FinalizedChainInfo RPC method. +// QueryFinalizedChainInfoResponse is response type for the +// Query/FinalizedChainInfo RPC method. message QueryFinalizedChainInfoResponse { // finalized_chain_info is the info of the CZ babylon.zoneconcierge.v1.ChainInfo finalized_chain_info = 1; @@ -156,34 +175,39 @@ message QueryFinalizedChainInfoResponse { babylon.epoching.v1.Epoch epoch_info = 2; // raw_checkpoint is the raw checkpoint of this epoch babylon.checkpointing.v1.RawCheckpoint raw_checkpoint = 3; - // btc_submission_key is position of two BTC txs that include the raw checkpoint of this epoch + // btc_submission_key is position of two BTC txs that include the raw + // checkpoint of this epoch babylon.btccheckpoint.v1.SubmissionKey btc_submission_key = 4; // proof is the proof that the chain info is finalized babylon.zoneconcierge.v1.ProofFinalizedChainInfo proof = 5; } -// QueryFinalizedChainInfoUntilHeightRequest is request type for the Query/FinalizedChainInfoUntilHeight RPC method. +// QueryFinalizedChainInfoUntilHeightRequest is request type for the +// Query/FinalizedChainInfoUntilHeight RPC method. message QueryFinalizedChainInfoUntilHeightRequest { // chain_id is the ID of the CZ string chain_id = 1; // height is the height of the CZ chain - // such that the returned finalised chain info will be no later than this height + // such that the returned finalised chain info will be no later than this + // height uint64 height = 2; // prove indicates whether the querier wants to get proofs of this timestamp bool prove = 3; } -// QueryFinalizedChainInfoUntilHeightResponse is response type for the Query/FinalizedChainInfoUntilHeight RPC method. +// QueryFinalizedChainInfoUntilHeightResponse is response type for the +// Query/FinalizedChainInfoUntilHeight RPC method. message QueryFinalizedChainInfoUntilHeightResponse { // finalized_chain_info is the info of the CZ babylon.zoneconcierge.v1.ChainInfo finalized_chain_info = 1; - + // epoch_info is the metadata of the last BTC-finalised epoch babylon.epoching.v1.Epoch epoch_info = 2; // raw_checkpoint is the raw checkpoint of this epoch babylon.checkpointing.v1.RawCheckpoint raw_checkpoint = 3; - // btc_submission_key is position of two BTC txs that include the raw checkpoint of this epoch + // btc_submission_key is position of two BTC txs that include the raw + // checkpoint of this epoch babylon.btccheckpoint.v1.SubmissionKey btc_submission_key = 4; // proof is the proof that the chain info is finalized diff --git a/proto/babylon/zoneconcierge/tx.proto b/proto/babylon/zoneconcierge/v1/tx.proto similarity index 100% rename from proto/babylon/zoneconcierge/tx.proto rename to proto/babylon/zoneconcierge/v1/tx.proto diff --git a/proto/babylon/zoneconcierge/zoneconcierge.proto b/proto/babylon/zoneconcierge/v1/zoneconcierge.proto similarity index 75% rename from proto/babylon/zoneconcierge/zoneconcierge.proto rename to proto/babylon/zoneconcierge/v1/zoneconcierge.proto index 07f219530..ef52447ff 100644 --- a/proto/babylon/zoneconcierge/zoneconcierge.proto +++ b/proto/babylon/zoneconcierge/v1/zoneconcierge.proto @@ -3,10 +3,8 @@ package babylon.zoneconcierge.v1; import "tendermint/types/types.proto"; import "tendermint/crypto/proof.proto"; -import "babylon/btccheckpoint/btccheckpoint.proto"; -import "babylon/checkpointing/bls_key.proto"; -import "babylon/checkpointing/query.proto"; -import "babylon/checkpointing/checkpoint.proto"; +import "babylon/btccheckpoint/v1/btccheckpoint.proto"; +import "babylon/checkpointing/v1/bls_key.proto"; option go_package = "github.com/babylonchain/babylon/x/zoneconcierge/types"; @@ -19,12 +17,14 @@ message IndexedHeader { // height is the height of this header on CZ ledger // (hash, height) jointly provides the position of the header on CZ ledger uint64 height = 3; - // babylon_header is the header of the babylon block that includes this CZ header + // babylon_header is the header of the babylon block that includes this CZ + // header tendermint.types.Header babylon_header = 4; // epoch is the epoch number of this header on Babylon ledger uint64 babylon_epoch = 5; // babylon_tx_hash is the hash of the tx that includes this header - // (babylon_block_height, babylon_tx_hash) jointly provides the position of the header on Babylon ledger + // (babylon_block_height, babylon_tx_hash) jointly provides the position of + // the header on Babylon ledger bytes babylon_tx_hash = 6; } @@ -36,11 +36,12 @@ message IndexedHeader { // \ -- D2 // ``` // Then the fork will be {[D1, D2]} where each item is in struct `IndexedBlock`. -// -// Note that each `IndexedHeader` in the fork should have a valid quorum certificate. -// Such forks exist since Babylon considers CZs might have dishonest majority. -// Also note that the IBC-Go implementation will only consider the first header in a fork valid, since -// the subsequent headers cannot be verified without knowing the validator set in the previous header. +// +// Note that each `IndexedHeader` in the fork should have a valid quorum +// certificate. Such forks exist since Babylon considers CZs might have +// dishonest majority. Also note that the IBC-Go implementation will only +// consider the first header in a fork valid, since the subsequent headers +// cannot be verified without knowing the validator set in the previous header. message Forks { // blocks is the list of non-canonical indexed headers at the same height repeated IndexedHeader headers = 3; @@ -52,43 +53,54 @@ message ChainInfo { string chain_id = 1; // latest_header is the latest header in CZ's canonical chain IndexedHeader latest_header = 2; - // latest_forks is the latest forks, formed as a series of IndexedHeader (from low to high) + // latest_forks is the latest forks, formed as a series of IndexedHeader (from + // low to high) Forks latest_forks = 3; - // timestamped_headers_count is the number of timestamped headers in CZ's canonical chain + // timestamped_headers_count is the number of timestamped headers in CZ's + // canonical chain uint64 timestamped_headers_count = 4; } -// ProofEpochSealed is the proof that an epoch is sealed by the sealer header, i.e., the 2nd header of the next epoch -// With the access of metadata +// ProofEpochSealed is the proof that an epoch is sealed by the sealer header, +// i.e., the 2nd header of the next epoch With the access of metadata // - Metadata of this epoch, which includes the sealer header // - Raw checkpoint of this epoch // The verifier can perform the following verification rules: // - The raw checkpoint's `last_commit_hash` is same as in the sealer header -// - More than 1/3 (in voting power) validators in the validator set of this epoch have signed `last_commit_hash` of the sealer header +// - More than 1/3 (in voting power) validators in the validator set of this +// epoch have signed `last_commit_hash` of the sealer header // - The epoch medatata is committed to the `app_hash` of the sealer header // - The validator set is committed to the `app_hash` of the sealer header message ProofEpochSealed { // validator_set is the validator set of the sealed epoch - // This validator set has generated a BLS multisig on `last_commit_hash` of the sealer header + // This validator set has generated a BLS multisig on `last_commit_hash` of + // the sealer header repeated babylon.checkpointing.v1.ValidatorWithBlsKey validator_set = 1; - // proof_epoch_info is the Merkle proof that the epoch's metadata is committed to `app_hash` of the sealer header + // proof_epoch_info is the Merkle proof that the epoch's metadata is committed + // to `app_hash` of the sealer header tendermint.crypto.ProofOps proof_epoch_info = 2; - // proof_epoch_info is the Merkle proof that the epoch's validator set is committed to `app_hash` of the sealer header + // proof_epoch_info is the Merkle proof that the epoch's validator set is + // committed to `app_hash` of the sealer header tendermint.crypto.ProofOps proof_epoch_val_set = 3; } -// ProofFinalizedChainInfo is a set of proofs that attest a chain info is BTC-finalised +// ProofFinalizedChainInfo is a set of proofs that attest a chain info is +// BTC-finalised message ProofFinalizedChainInfo { /* - The following fields include proofs that attest the chain info is BTC-finalised + The following fields include proofs that attest the chain info is + BTC-finalised */ - // proof_tx_in_block is the proof that tx that carries the header is included in a certain Babylon block + // proof_tx_in_block is the proof that tx that carries the header is included + // in a certain Babylon block tendermint.types.TxProof proof_tx_in_block = 4; - // proof_header_in_epoch is the proof that the Babylon header is in a certain epoch + // proof_header_in_epoch is the proof that the Babylon header is in a certain + // epoch tendermint.crypto.Proof proof_header_in_epoch = 5; // proof_epoch_sealed is the proof that the epoch is sealed babylon.zoneconcierge.v1.ProofEpochSealed proof_epoch_sealed = 6; - // proof_epoch_submitted is the proof that the epoch's checkpoint is included in BTC ledger - // It is the two TransactionInfo in the best (i.e., earliest) checkpoint submission + // proof_epoch_submitted is the proof that the epoch's checkpoint is included + // in BTC ledger It is the two TransactionInfo in the best (i.e., earliest) + // checkpoint submission repeated babylon.btccheckpoint.v1.TransactionInfo proof_epoch_submitted = 7; } diff --git a/proto/buf.lock b/proto/buf.lock index 0563220f5..044437664 100644 --- a/proto/buf.lock +++ b/proto/buf.lock @@ -12,7 +12,7 @@ deps: - remote: buf.build owner: cosmos repository: gogo-proto - commit: bee5511075b7499da6178d9e4aaa628b + commit: 34d970b699f84aa382f3c29773a60836 - remote: buf.build owner: googleapis repository: googleapis diff --git a/proto/buf.yaml b/proto/buf.yaml index 619e81262..92349ddcc 100644 --- a/proto/buf.yaml +++ b/proto/buf.yaml @@ -1,9 +1,11 @@ version: v1 name: buf.build/babylon/babylond deps: + # TODO: update sdk buf dependency when v0.47.0 is tagged and pushed to BSR + # see: (https://github.com/cosmos/cosmos-sdk/tree/main/proto#sdk-x-buf) - buf.build/cosmos/cosmos-sdk:8cb30a2c4de74dc9bd8d260b1e75e176 - buf.build/cosmos/cosmos-proto:1935555c206d4afb9e94615dfd0fad31 - - buf.build/cosmos/gogo-proto:bee5511075b7499da6178d9e4aaa628b + - buf.build/cosmos/gogo-proto:a14993478f40695898ed8a86931094b6656e8a5d - buf.build/googleapis/googleapis:8d7204855ec14631a499bd7393ce1970 breaking: use: @@ -19,3 +21,11 @@ lint: - SERVICE_SUFFIX - PACKAGE_VERSION_SUFFIX - RPC_REQUEST_STANDARD_NAME + - ENUM_VALUE_PREFIX + - ENUM_ZERO_VALUE_SUFFIX + # TODO Decide which comments we would like to enfore by linter + - COMMENT_MESSAGE + - COMMENT_ENUM_VALUE + - COMMENT_ENUM + - COMMENT_RPC + - COMMENT_ONEOF diff --git a/proto/scripts/protocgen.sh b/proto/scripts/protocgen.sh index 84e793d13..df3710663 100755 --- a/proto/scripts/protocgen.sh +++ b/proto/scripts/protocgen.sh @@ -2,11 +2,6 @@ set -eo pipefail -# get protoc executions -go get github.com/regen-network/cosmos-proto/protoc-gen-gocosmos@latest 2>/dev/null -# get cosmos sdk from github -go get github.com/cosmos/cosmos-sdk@v0.46.6 2>/dev/null - cd proto proto_dirs=$(find ./babylon -path -prune -o -name '*.proto' -print0 | xargs -0 -n1 dirname | sort | uniq) diff --git a/test/e2e/initialization/config.go b/test/e2e/initialization/config.go index 77b69f11d..33484726a 100644 --- a/test/e2e/initialization/config.go +++ b/test/e2e/initialization/config.go @@ -21,7 +21,7 @@ import ( "github.com/cosmos/cosmos-sdk/x/genutil" genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types" staketypes "github.com/cosmos/cosmos-sdk/x/staking/types" - "github.com/gogo/protobuf/proto" + "github.com/cosmos/gogoproto/proto" tmjson "github.com/tendermint/tendermint/libs/json" "github.com/babylonchain/babylon/test/e2e/util" diff --git a/x/btccheckpoint/types/btccheckpoint.pb.go b/x/btccheckpoint/types/btccheckpoint.pb.go index 18ecc0022..76b796c38 100644 --- a/x/btccheckpoint/types/btccheckpoint.pb.go +++ b/x/btccheckpoint/types/btccheckpoint.pb.go @@ -1,13 +1,13 @@ // Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: babylon/btccheckpoint/btccheckpoint.proto +// source: babylon/btccheckpoint/v1/btccheckpoint.proto package types import ( fmt "fmt" github_com_babylonchain_babylon_types "github.com/babylonchain/babylon/types" + _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/cosmos/gogoproto/proto" - _ "github.com/gogo/protobuf/gogoproto" io "io" math "math" math_bits "math/bits" @@ -55,7 +55,7 @@ func (x BtcStatus) String() string { } func (BtcStatus) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_da8b9af3dbd18a36, []int{0} + return fileDescriptor_e096cac78d49b0a6, []int{0} } // Consider we have a Merkle tree with following structure: @@ -96,7 +96,7 @@ func (m *BTCSpvProof) Reset() { *m = BTCSpvProof{} } func (m *BTCSpvProof) String() string { return proto.CompactTextString(m) } func (*BTCSpvProof) ProtoMessage() {} func (*BTCSpvProof) Descriptor() ([]byte, []int) { - return fileDescriptor_da8b9af3dbd18a36, []int{0} + return fileDescriptor_e096cac78d49b0a6, []int{0} } func (m *BTCSpvProof) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -157,7 +157,7 @@ func (m *TransactionKey) Reset() { *m = TransactionKey{} } func (m *TransactionKey) String() string { return proto.CompactTextString(m) } func (*TransactionKey) ProtoMessage() {} func (*TransactionKey) Descriptor() ([]byte, []int) { - return fileDescriptor_da8b9af3dbd18a36, []int{1} + return fileDescriptor_e096cac78d49b0a6, []int{1} } func (m *TransactionKey) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -195,12 +195,11 @@ func (m *TransactionKey) GetIndex() uint32 { // Checkpoint can be composed from multiple transactions, so to identify whole // submission we need list of transaction keys. -// Each submission can generally be identified by this list of (txIdx, blockHash) -// tuples. -// Note: this could possibly be optimized as if transactions were in one block -// they would have the same block hash and different indexes, but each blockhash -// is only 33 (1 byte for prefix encoding and 32 byte hash), so there should -// be other strong arguments for this optimization +// Each submission can generally be identified by this list of (txIdx, +// blockHash) tuples. Note: this could possibly be optimized as if transactions +// were in one block they would have the same block hash and different indexes, +// but each blockhash is only 33 (1 byte for prefix encoding and 32 byte hash), +// so there should be other strong arguments for this optimization type SubmissionKey struct { Key []*TransactionKey `protobuf:"bytes,1,rep,name=key,proto3" json:"key,omitempty"` } @@ -209,7 +208,7 @@ func (m *SubmissionKey) Reset() { *m = SubmissionKey{} } func (m *SubmissionKey) String() string { return proto.CompactTextString(m) } func (*SubmissionKey) ProtoMessage() {} func (*SubmissionKey) Descriptor() ([]byte, []int) { - return fileDescriptor_da8b9af3dbd18a36, []int{2} + return fileDescriptor_e096cac78d49b0a6, []int{2} } func (m *SubmissionKey) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -245,7 +244,8 @@ func (m *SubmissionKey) GetKey() []*TransactionKey { return nil } -// TransactionInfo is the info of a tx that contains Babylon checkpoint, including +// TransactionInfo is the info of a tx that contains Babylon checkpoint, +// including // - the position of the tx on BTC blockchain // - the full tx content // - the Merkle proof that this tx is on the above position @@ -269,7 +269,7 @@ func (m *TransactionInfo) Reset() { *m = TransactionInfo{} } func (m *TransactionInfo) String() string { return proto.CompactTextString(m) } func (*TransactionInfo) ProtoMessage() {} func (*TransactionInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_da8b9af3dbd18a36, []int{3} + return fileDescriptor_e096cac78d49b0a6, []int{3} } func (m *TransactionInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -320,16 +320,17 @@ func (m *TransactionInfo) GetProof() []byte { } // TODO: Determine if we should keep any block number or depth info. -// On one hand it may be usefull to determine if block is stable or not, on other -// depth/block number info, without context (i.e info about chain) is pretty useless -// and blockshash in enough to retrieve is from lightclient +// On one hand it may be usefull to determine if block is stable or not, on +// other depth/block number info, without context (i.e info about chain) is +// pretty useless and blockshash in enough to retrieve is from lightclient type SubmissionData struct { // address of the submitter and reporter VigilanteAddresses *CheckpointAddresses `protobuf:"bytes,1,opt,name=vigilante_addresses,json=vigilanteAddresses,proto3" json:"vigilante_addresses,omitempty"` // txs_info is the two `TransactionInfo`s corresponding to the submission // It is used for // - recovering address of sender of btc transction to payup the reward. - // - allowing the ZoneConcierge module to prove the checkpoint is submitted to BTC + // - allowing the ZoneConcierge module to prove the checkpoint is submitted to + // BTC TxsInfo []*TransactionInfo `protobuf:"bytes,2,rep,name=txs_info,json=txsInfo,proto3" json:"txs_info,omitempty"` Epoch uint64 `protobuf:"varint,3,opt,name=epoch,proto3" json:"epoch,omitempty"` } @@ -338,7 +339,7 @@ func (m *SubmissionData) Reset() { *m = SubmissionData{} } func (m *SubmissionData) String() string { return proto.CompactTextString(m) } func (*SubmissionData) ProtoMessage() {} func (*SubmissionData) Descriptor() ([]byte, []int) { - return fileDescriptor_da8b9af3dbd18a36, []int{4} + return fileDescriptor_e096cac78d49b0a6, []int{4} } func (m *SubmissionData) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -389,7 +390,8 @@ func (m *SubmissionData) GetEpoch() uint64 { } // Data stored in db and indexed by epoch number -// TODO: Add btc blockheight at epooch end, when adding hadnling of epoching callbacks +// TODO: Add btc blockheight at epooch end, when adding hadnling of epoching +// callbacks type EpochData struct { // List of all received checkpoints during this epoch, sorted by order of // submission. @@ -402,7 +404,7 @@ func (m *EpochData) Reset() { *m = EpochData{} } func (m *EpochData) String() string { return proto.CompactTextString(m) } func (*EpochData) ProtoMessage() {} func (*EpochData) Descriptor() ([]byte, []int) { - return fileDescriptor_da8b9af3dbd18a36, []int{5} + return fileDescriptor_e096cac78d49b0a6, []int{5} } func (m *EpochData) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -458,7 +460,7 @@ func (m *CheckpointAddresses) Reset() { *m = CheckpointAddresses{} } func (m *CheckpointAddresses) String() string { return proto.CompactTextString(m) } func (*CheckpointAddresses) ProtoMessage() {} func (*CheckpointAddresses) Descriptor() ([]byte, []int) { - return fileDescriptor_da8b9af3dbd18a36, []int{6} + return fileDescriptor_e096cac78d49b0a6, []int{6} } func (m *CheckpointAddresses) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -518,7 +520,7 @@ func (m *BTCCheckpointInfo) Reset() { *m = BTCCheckpointInfo{} } func (m *BTCCheckpointInfo) String() string { return proto.CompactTextString(m) } func (*BTCCheckpointInfo) ProtoMessage() {} func (*BTCCheckpointInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_da8b9af3dbd18a36, []int{7} + return fileDescriptor_e096cac78d49b0a6, []int{7} } func (m *BTCCheckpointInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -588,61 +590,61 @@ func init() { } func init() { - proto.RegisterFile("babylon/btccheckpoint/btccheckpoint.proto", fileDescriptor_da8b9af3dbd18a36) -} - -var fileDescriptor_da8b9af3dbd18a36 = []byte{ - // 785 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x55, 0xbf, 0x6f, 0xfa, 0x46, - 0x14, 0xc7, 0x40, 0xd2, 0x70, 0x10, 0x92, 0x1e, 0x84, 0xba, 0xa8, 0x22, 0xc4, 0x1d, 0x42, 0x2a, - 0x15, 0xd4, 0xb4, 0x95, 0x92, 0xb6, 0x4b, 0x0c, 0x44, 0x41, 0x49, 0x20, 0x32, 0xce, 0x92, 0x21, - 0x96, 0x6d, 0x0e, 0x7c, 0xc2, 0xf8, 0x90, 0xef, 0x88, 0xa0, 0x6b, 0x55, 0xa9, 0xea, 0x54, 0x75, - 0xef, 0xd4, 0xb1, 0xff, 0x48, 0x87, 0x0e, 0x19, 0xab, 0x0c, 0x51, 0x95, 0xfc, 0x19, 0x5d, 0x2a, - 0x9f, 0xcd, 0xcf, 0x80, 0xfa, 0x45, 0xfa, 0x6e, 0xbc, 0xf7, 0x3e, 0xef, 0xc7, 0xe7, 0xf3, 0xde, - 0x61, 0x70, 0x64, 0xe8, 0xc6, 0xc8, 0x26, 0x4e, 0xc9, 0x60, 0xa6, 0x69, 0x21, 0xb3, 0xdb, 0x27, - 0xd8, 0x61, 0xf3, 0x56, 0xb1, 0xef, 0x12, 0x46, 0xa0, 0x18, 0x40, 0x8b, 0xf3, 0xc1, 0x87, 0x2f, - 0xb2, 0xe9, 0x0e, 0xe9, 0x10, 0x0e, 0x2a, 0x79, 0xbf, 0x7c, 0xbc, 0xf4, 0xaf, 0x00, 0xe2, 0xb2, - 0x5a, 0x6e, 0xf6, 0x1f, 0x6e, 0x5c, 0x42, 0xda, 0xf0, 0x10, 0xec, 0x18, 0xcc, 0xd4, 0x98, 0xab, - 0x3b, 0x54, 0x37, 0x19, 0x26, 0x8e, 0x28, 0xe4, 0x85, 0x42, 0x42, 0x49, 0x1a, 0xcc, 0x54, 0xa7, - 0x5e, 0x78, 0x0c, 0xf6, 0x16, 0x80, 0x1a, 0x76, 0x5a, 0x68, 0x28, 0x86, 0xf3, 0x42, 0x61, 0x5b, - 0x49, 0xcd, 0xc3, 0x6b, 0x5e, 0x08, 0x1e, 0x80, 0x44, 0x0f, 0xb9, 0x5d, 0x1b, 0x69, 0x0e, 0x69, - 0x21, 0x2a, 0x46, 0x78, 0xe5, 0xb8, 0xef, 0xab, 0x7b, 0x2e, 0x68, 0x83, 0x3d, 0x93, 0x38, 0x6d, - 0xec, 0xf6, 0xb0, 0xd3, 0xd1, 0xbc, 0x0e, 0x16, 0xd2, 0x5b, 0xc8, 0x15, 0xa3, 0x1e, 0x56, 0x3e, - 0x79, 0x7a, 0xde, 0xff, 0xaa, 0x83, 0x99, 0x35, 0x30, 0x8a, 0x26, 0xe9, 0x95, 0x02, 0xb6, 0xa6, - 0xa5, 0x63, 0x67, 0x6c, 0x94, 0xd8, 0xa8, 0x8f, 0x68, 0x51, 0x56, 0xcb, 0x17, 0x3c, 0x55, 0x1e, - 0x31, 0x44, 0x95, 0xd4, 0xb4, 0xac, 0xcc, 0x4c, 0x3f, 0x22, 0x0d, 0x41, 0x72, 0x66, 0xc8, 0x4b, - 0x34, 0x82, 0x69, 0xb0, 0xe1, 0xd3, 0x10, 0x38, 0x0d, 0xdf, 0x80, 0x37, 0x20, 0x6a, 0xe9, 0xd4, - 0xe2, 0xdc, 0x12, 0xf2, 0x77, 0x4f, 0xcf, 0xfb, 0x27, 0x6b, 0x0e, 0x71, 0xa1, 0x53, 0xcb, 0x1f, - 0x84, 0x57, 0x92, 0x2e, 0xc1, 0x76, 0x73, 0x60, 0xf4, 0x30, 0xa5, 0x41, 0xe3, 0x6f, 0x40, 0xa4, - 0x8b, 0x46, 0xa2, 0x90, 0x8f, 0x14, 0xe2, 0xc7, 0x85, 0xe2, 0xaa, 0x35, 0x16, 0xe7, 0xe7, 0x55, - 0xbc, 0x24, 0xe9, 0x47, 0x01, 0xec, 0xcc, 0x89, 0xdd, 0x26, 0xd3, 0x7a, 0xc2, 0xda, 0xf5, 0x60, - 0x1e, 0xc4, 0x67, 0x0f, 0x20, 0xec, 0xaf, 0x69, 0xc6, 0xe5, 0xc9, 0xd4, 0xf7, 0xee, 0x25, 0x58, - 0xa1, 0x6f, 0x48, 0x7f, 0x09, 0x20, 0x39, 0x65, 0x55, 0xd1, 0x99, 0x0e, 0xef, 0x41, 0xea, 0x01, - 0x77, 0xb0, 0xad, 0x3b, 0x0c, 0x69, 0x7a, 0xab, 0xe5, 0x22, 0x4a, 0x11, 0x0d, 0xc6, 0xfa, 0x7c, - 0xf5, 0x58, 0xe5, 0x89, 0x75, 0x36, 0x4e, 0x52, 0xe0, 0xa4, 0xd2, 0xc4, 0x07, 0x2b, 0x60, 0x8b, - 0x0d, 0xa9, 0x86, 0x9d, 0x36, 0x11, 0xc3, 0x5c, 0xbb, 0xa3, 0x77, 0xe2, 0xea, 0x69, 0xa4, 0x7c, - 0xc0, 0x86, 0x94, 0x8b, 0x95, 0x06, 0x1b, 0xa8, 0x4f, 0x4c, 0x8b, 0xd3, 0x89, 0x2a, 0xbe, 0x21, - 0xfd, 0x20, 0x80, 0x58, 0xd5, 0xfb, 0xc5, 0x99, 0x9c, 0xce, 0x2e, 0xe8, 0x70, 0x75, 0x93, 0xb9, - 0xb5, 0xfa, 0x7a, 0x7e, 0x0b, 0x36, 0x29, 0xd3, 0xd9, 0x80, 0x72, 0x29, 0x93, 0xc7, 0x9f, 0xae, - 0xce, 0x96, 0x99, 0xd9, 0xe4, 0x50, 0x25, 0x48, 0x91, 0x1a, 0x20, 0xb5, 0x44, 0x0c, 0xf8, 0x09, - 0x88, 0x51, 0xaf, 0x13, 0x63, 0xc8, 0x0d, 0x9e, 0xe8, 0xd4, 0x01, 0xb3, 0x60, 0xcb, 0x45, 0x7d, - 0xe2, 0x7a, 0x41, 0x7f, 0x7d, 0x13, 0x5b, 0xfa, 0x23, 0x02, 0x3e, 0x94, 0xd5, 0xf2, 0xb4, 0x28, - 0x97, 0xe0, 0x00, 0x24, 0x38, 0x6b, 0xcd, 0x19, 0xf4, 0x8c, 0xa0, 0x64, 0x54, 0x89, 0x73, 0x5f, - 0x9d, 0xbb, 0xe0, 0x29, 0xf8, 0x18, 0xe9, 0xae, 0x8d, 0x11, 0x65, 0xfc, 0x65, 0x1a, 0x36, 0x31, - 0xbb, 0x63, 0x7c, 0x98, 0xe3, 0x33, 0x63, 0x80, 0xcc, 0x4c, 0xd9, 0x0b, 0x07, 0xa9, 0x14, 0x7c, - 0xb4, 0x24, 0x95, 0xbf, 0xa9, 0xc8, 0x7b, 0x78, 0x53, 0xe9, 0xc5, 0xb6, 0x5e, 0x08, 0xde, 0x83, - 0xcc, 0x92, 0xa6, 0x6c, 0x48, 0xc5, 0xe8, 0xba, 0x97, 0x92, 0x5a, 0x6c, 0xa0, 0x0e, 0x29, 0x34, - 0x41, 0xe6, 0xcd, 0x6d, 0x6b, 0x36, 0xa6, 0x4c, 0xdc, 0xe0, 0xf5, 0xd7, 0x3c, 0xef, 0xf4, 0xe2, - 0x79, 0x5f, 0x61, 0xca, 0x3e, 0xfb, 0x55, 0x00, 0xb1, 0xc9, 0x51, 0xc0, 0x23, 0x90, 0xa9, 0xde, - 0x34, 0xca, 0x17, 0x5a, 0x53, 0x3d, 0x53, 0x6f, 0x9b, 0x5a, 0xf3, 0x56, 0xbe, 0xae, 0xa9, 0x6a, - 0xb5, 0xb2, 0x1b, 0xca, 0x6e, 0xff, 0xfc, 0x5b, 0x3e, 0xd6, 0x0c, 0x4e, 0xa0, 0xf5, 0x06, 0x5a, - 0x6e, 0xd4, 0xcf, 0x6b, 0xca, 0x75, 0xb5, 0xb2, 0x2b, 0xf8, 0xd0, 0xb2, 0xff, 0x87, 0xb8, 0x04, - 0x7a, 0x5e, 0xab, 0x9f, 0x5d, 0xd5, 0xee, 0xaa, 0x95, 0xdd, 0xb0, 0x0f, 0x3d, 0xc7, 0x8e, 0x6e, - 0xe3, 0xef, 0x51, 0x2b, 0x1b, 0xfd, 0xe9, 0xf7, 0x5c, 0x48, 0x6e, 0xfc, 0xf9, 0x92, 0x13, 0x1e, - 0x5f, 0x72, 0xc2, 0x3f, 0x2f, 0x39, 0xe1, 0x97, 0xd7, 0x5c, 0xe8, 0xf1, 0x35, 0x17, 0xfa, 0xfb, - 0x35, 0x17, 0xba, 0xfb, 0xfa, 0xff, 0x76, 0x38, 0x5c, 0xf8, 0x88, 0xf1, 0x9d, 0x1a, 0x9b, 0xfc, - 0x6b, 0xf4, 0xe5, 0x7f, 0x01, 0x00, 0x00, 0xff, 0xff, 0xbe, 0x10, 0x77, 0xf8, 0xea, 0x06, 0x00, - 0x00, + proto.RegisterFile("babylon/btccheckpoint/v1/btccheckpoint.proto", fileDescriptor_e096cac78d49b0a6) +} + +var fileDescriptor_e096cac78d49b0a6 = []byte{ + // 788 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x55, 0x4d, 0x6f, 0x32, 0x55, + 0x14, 0x66, 0x80, 0xbe, 0xbe, 0x5c, 0x28, 0x6f, 0xbd, 0x50, 0x1c, 0x89, 0xa1, 0x74, 0x5c, 0x94, + 0x1a, 0x85, 0xb4, 0x6a, 0xd2, 0xaa, 0x9b, 0x0e, 0xd0, 0x94, 0xb4, 0x85, 0x66, 0x98, 0x6e, 0xba, + 0xe8, 0x64, 0x66, 0xb8, 0x30, 0x37, 0x0c, 0x73, 0xc9, 0xdc, 0x0b, 0x01, 0xb7, 0xc6, 0xc4, 0xb8, + 0x32, 0xee, 0x5d, 0xb9, 0xf4, 0x8f, 0xb8, 0x70, 0xd1, 0xa5, 0xe9, 0xa2, 0x31, 0xed, 0xcf, 0x70, + 0x63, 0xe6, 0xce, 0xf0, 0x59, 0x88, 0x92, 0xb8, 0xe3, 0x9c, 0xf3, 0x9c, 0x8f, 0xe7, 0x39, 0xe7, + 0x32, 0xe0, 0x53, 0x43, 0x37, 0xc6, 0x36, 0x71, 0x4a, 0x06, 0x33, 0x4d, 0x0b, 0x99, 0xdd, 0x3e, + 0xc1, 0x0e, 0x2b, 0x0d, 0x8f, 0x16, 0x1d, 0xc5, 0xbe, 0x4b, 0x18, 0x81, 0x62, 0x80, 0x2e, 0x2e, + 0x06, 0x87, 0x47, 0xd9, 0x74, 0x87, 0x74, 0x08, 0x07, 0x95, 0xbc, 0x5f, 0x3e, 0x5e, 0xfa, 0x5b, + 0x00, 0x71, 0x59, 0x2d, 0x37, 0xfb, 0xc3, 0x1b, 0x97, 0x90, 0x36, 0x3c, 0x00, 0xef, 0x0c, 0x66, + 0x6a, 0xcc, 0xd5, 0x1d, 0xaa, 0x9b, 0x0c, 0x13, 0x47, 0x14, 0xf2, 0x42, 0x21, 0xa1, 0x24, 0x0d, + 0x66, 0xaa, 0x33, 0x2f, 0x3c, 0x06, 0xbb, 0x4b, 0x40, 0x0d, 0x3b, 0x2d, 0x34, 0x12, 0xc3, 0x79, + 0xa1, 0xb0, 0xad, 0xa4, 0x16, 0xe1, 0x35, 0x2f, 0x04, 0xf7, 0x41, 0xa2, 0x87, 0xdc, 0xae, 0x8d, + 0x34, 0x87, 0xb4, 0x10, 0x15, 0x23, 0xbc, 0x72, 0xdc, 0xf7, 0xd5, 0x3d, 0x17, 0xb4, 0xc1, 0xae, + 0x49, 0x9c, 0x36, 0x76, 0x7b, 0xd8, 0xe9, 0x68, 0x5e, 0x07, 0x0b, 0xe9, 0x2d, 0xe4, 0x8a, 0x51, + 0x0f, 0x2b, 0x9f, 0x3c, 0x3e, 0xed, 0x7d, 0xd1, 0xc1, 0xcc, 0x1a, 0x18, 0x45, 0x93, 0xf4, 0x4a, + 0x01, 0x5b, 0xd3, 0xd2, 0xb1, 0x33, 0x31, 0x4a, 0x6c, 0xdc, 0x47, 0xb4, 0x28, 0xab, 0xe5, 0x0b, + 0x9e, 0x2a, 0x8f, 0x19, 0xa2, 0x4a, 0x6a, 0x56, 0x56, 0x66, 0xa6, 0x1f, 0x91, 0x46, 0x20, 0x39, + 0x37, 0xe4, 0x25, 0x1a, 0xc3, 0x34, 0xd8, 0xf2, 0x69, 0x08, 0x9c, 0x86, 0x6f, 0xc0, 0x1b, 0x10, + 0xb5, 0x74, 0x6a, 0x71, 0x6e, 0x09, 0xf9, 0x9b, 0xc7, 0xa7, 0xbd, 0x93, 0x0d, 0x87, 0xb8, 0xd0, + 0xa9, 0xe5, 0x0f, 0xc2, 0x2b, 0x49, 0x97, 0x60, 0xbb, 0x39, 0x30, 0x7a, 0x98, 0xd2, 0xa0, 0xf1, + 0x57, 0x20, 0xd2, 0x45, 0x63, 0x51, 0xc8, 0x47, 0x0a, 0xf1, 0xe3, 0x42, 0x71, 0xdd, 0x1a, 0x8b, + 0x8b, 0xf3, 0x2a, 0x5e, 0x92, 0xf4, 0xbd, 0x00, 0xde, 0x2d, 0x88, 0xdd, 0x26, 0xb3, 0x7a, 0xc2, + 0xc6, 0xf5, 0x60, 0x1e, 0xc4, 0xe7, 0x0f, 0x20, 0xec, 0xaf, 0x69, 0xce, 0xe5, 0xc9, 0xd4, 0xf7, + 0xee, 0x25, 0x58, 0xa1, 0x6f, 0x48, 0x7f, 0x08, 0x20, 0x39, 0x63, 0x55, 0xd1, 0x99, 0x0e, 0xef, + 0x41, 0x6a, 0x88, 0x3b, 0xd8, 0xd6, 0x1d, 0x86, 0x34, 0xbd, 0xd5, 0x72, 0x11, 0xa5, 0x88, 0x06, + 0x63, 0x7d, 0xb6, 0x7e, 0xac, 0xf2, 0xd4, 0x3a, 0x9b, 0x24, 0x29, 0x70, 0x5a, 0x69, 0xea, 0x83, + 0x15, 0xf0, 0x96, 0x8d, 0xa8, 0x86, 0x9d, 0x36, 0x11, 0xc3, 0x5c, 0xbb, 0xc3, 0xff, 0xc4, 0xd5, + 0xd3, 0x48, 0x79, 0x8f, 0x8d, 0x28, 0x17, 0x2b, 0x0d, 0xb6, 0x50, 0x9f, 0x98, 0x16, 0xa7, 0x13, + 0x55, 0x7c, 0x43, 0xfa, 0x4e, 0x00, 0xb1, 0xaa, 0xf7, 0x8b, 0x33, 0x39, 0x9d, 0x5f, 0xd0, 0xc1, + 0xfa, 0x26, 0x0b, 0x6b, 0xf5, 0xf5, 0xfc, 0x1a, 0xbc, 0xa1, 0x4c, 0x67, 0x03, 0xca, 0xa5, 0x4c, + 0x1e, 0x7f, 0xbc, 0x3e, 0x5b, 0x66, 0x66, 0x93, 0x43, 0x95, 0x20, 0x45, 0x6a, 0x80, 0xd4, 0x0a, + 0x31, 0xe0, 0x47, 0x20, 0x46, 0xbd, 0x4e, 0x8c, 0x21, 0x37, 0x78, 0xa2, 0x33, 0x07, 0xcc, 0x82, + 0xb7, 0x2e, 0xea, 0x13, 0xd7, 0x0b, 0xfa, 0xeb, 0x9b, 0xda, 0xd2, 0x6f, 0x11, 0xf0, 0xbe, 0xac, + 0x96, 0x67, 0x45, 0xb9, 0x04, 0xfb, 0x20, 0xc1, 0x59, 0x6b, 0xce, 0xa0, 0x67, 0x04, 0x25, 0xa3, + 0x4a, 0x9c, 0xfb, 0xea, 0xdc, 0x05, 0x4f, 0xc1, 0x87, 0x48, 0x77, 0x6d, 0x8c, 0x28, 0xe3, 0x2f, + 0xd3, 0xb0, 0x89, 0xd9, 0x9d, 0xe0, 0xc3, 0x1c, 0x9f, 0x99, 0x00, 0x64, 0x66, 0xca, 0x5e, 0x38, + 0x48, 0xa5, 0xe0, 0x83, 0x15, 0xa9, 0xfc, 0x4d, 0x45, 0xfe, 0x87, 0x37, 0x95, 0x5e, 0x6e, 0xeb, + 0x85, 0xe0, 0x3d, 0xc8, 0xac, 0x68, 0xca, 0x46, 0x54, 0x8c, 0x6e, 0x7a, 0x29, 0xa9, 0xe5, 0x06, + 0xea, 0x88, 0x42, 0x13, 0x64, 0x5e, 0xdd, 0xb6, 0x66, 0x63, 0xca, 0xc4, 0x2d, 0x5e, 0x7f, 0xc3, + 0xf3, 0x4e, 0x2f, 0x9f, 0xf7, 0x15, 0xa6, 0xec, 0x93, 0x9f, 0x05, 0x10, 0x9b, 0x1e, 0x05, 0x3c, + 0x04, 0x99, 0xea, 0x4d, 0xa3, 0x7c, 0xa1, 0x35, 0xd5, 0x33, 0xf5, 0xb6, 0xa9, 0x35, 0x6f, 0xe5, + 0xeb, 0x9a, 0xaa, 0x56, 0x2b, 0x3b, 0xa1, 0xec, 0xf6, 0x8f, 0xbf, 0xe4, 0x63, 0xcd, 0xe0, 0x04, + 0x5a, 0xaf, 0xa0, 0xe5, 0x46, 0xfd, 0xbc, 0xa6, 0x5c, 0x57, 0x2b, 0x3b, 0x82, 0x0f, 0x2d, 0xfb, + 0x7f, 0x88, 0x2b, 0xa0, 0xe7, 0xb5, 0xfa, 0xd9, 0x55, 0xed, 0xae, 0x5a, 0xd9, 0x09, 0xfb, 0xd0, + 0x73, 0xec, 0xe8, 0x36, 0xfe, 0x16, 0xb5, 0xb2, 0xd1, 0x1f, 0x7e, 0xcd, 0x85, 0xe4, 0xc6, 0xef, + 0xcf, 0x39, 0xe1, 0xe1, 0x39, 0x27, 0xfc, 0xf5, 0x9c, 0x13, 0x7e, 0x7a, 0xc9, 0x85, 0x1e, 0x5e, + 0x72, 0xa1, 0x3f, 0x5f, 0x72, 0xa1, 0xbb, 0x2f, 0xff, 0x6d, 0x87, 0xa3, 0xa5, 0xef, 0x18, 0xdf, + 0xa9, 0xf1, 0x86, 0x7f, 0x8d, 0x3e, 0xff, 0x27, 0x00, 0x00, 0xff, 0xff, 0xdc, 0xaf, 0x2a, 0x70, + 0xed, 0x06, 0x00, 0x00, } func (m *BTCSpvProof) Marshal() (dAtA []byte, err error) { diff --git a/x/btccheckpoint/types/genesis.pb.go b/x/btccheckpoint/types/genesis.pb.go index fece0d8be..a99ce5d8d 100644 --- a/x/btccheckpoint/types/genesis.pb.go +++ b/x/btccheckpoint/types/genesis.pb.go @@ -1,12 +1,12 @@ // Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: babylon/btccheckpoint/genesis.proto +// source: babylon/btccheckpoint/v1/genesis.proto package types import ( fmt "fmt" + _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/cosmos/gogoproto/proto" - _ "github.com/gogo/protobuf/gogoproto" io "io" math "math" math_bits "math/bits" @@ -32,7 +32,7 @@ func (m *GenesisState) Reset() { *m = GenesisState{} } func (m *GenesisState) String() string { return proto.CompactTextString(m) } func (*GenesisState) ProtoMessage() {} func (*GenesisState) Descriptor() ([]byte, []int) { - return fileDescriptor_bf9801ce688057b7, []int{0} + return fileDescriptor_9776220697c13f63, []int{0} } func (m *GenesisState) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -73,24 +73,24 @@ func init() { } func init() { - proto.RegisterFile("babylon/btccheckpoint/genesis.proto", fileDescriptor_bf9801ce688057b7) + proto.RegisterFile("babylon/btccheckpoint/v1/genesis.proto", fileDescriptor_9776220697c13f63) } -var fileDescriptor_bf9801ce688057b7 = []byte{ - // 202 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x4e, 0x4a, 0x4c, 0xaa, +var fileDescriptor_9776220697c13f63 = []byte{ + // 205 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x4b, 0x4a, 0x4c, 0xaa, 0xcc, 0xc9, 0xcf, 0xd3, 0x4f, 0x2a, 0x49, 0x4e, 0xce, 0x48, 0x4d, 0xce, 0x2e, 0xc8, 0xcf, 0xcc, - 0x2b, 0xd1, 0x4f, 0x4f, 0xcd, 0x4b, 0x2d, 0xce, 0x2c, 0xd6, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, - 0x92, 0x80, 0x2a, 0xd2, 0x43, 0x51, 0xa4, 0x57, 0x66, 0x28, 0x25, 0x92, 0x9e, 0x9f, 0x9e, 0x0f, - 0x56, 0xa4, 0x0f, 0x62, 0x41, 0xd4, 0x4b, 0x29, 0x61, 0x37, 0xb4, 0x20, 0xb1, 0x28, 0x31, 0x17, - 0x6a, 0xa6, 0x92, 0x1f, 0x17, 0x8f, 0x3b, 0xc4, 0x92, 0xe0, 0x92, 0xc4, 0x92, 0x54, 0x21, 0x3b, - 0x2e, 0x36, 0x88, 0xbc, 0x04, 0xa3, 0x02, 0xa3, 0x06, 0xb7, 0x91, 0x82, 0x1e, 0x2e, 0x4b, 0xf5, - 0x02, 0xc0, 0xea, 0x9c, 0x58, 0x4e, 0xdc, 0x93, 0x67, 0x08, 0x82, 0xea, 0x72, 0xf2, 0x3f, 0xf1, - 0x48, 0x8e, 0xf1, 0xc2, 0x23, 0x39, 0xc6, 0x07, 0x8f, 0xe4, 0x18, 0x27, 0x3c, 0x96, 0x63, 0xb8, - 0xf0, 0x58, 0x8e, 0xe1, 0xc6, 0x63, 0x39, 0x86, 0x28, 0xd3, 0xf4, 0xcc, 0x92, 0x8c, 0xd2, 0x24, - 0xbd, 0xe4, 0xfc, 0x5c, 0x7d, 0xa8, 0x99, 0xc9, 0x19, 0x89, 0x99, 0x79, 0x30, 0x8e, 0x7e, 0x05, - 0x9a, 0x3b, 0x4b, 0x2a, 0x0b, 0x52, 0x8b, 0x93, 0xd8, 0xc0, 0xee, 0x34, 0x06, 0x04, 0x00, 0x00, - 0xff, 0xff, 0x8b, 0xb4, 0x95, 0x7a, 0x22, 0x01, 0x00, 0x00, + 0x2b, 0xd1, 0x2f, 0x33, 0xd4, 0x4f, 0x4f, 0xcd, 0x4b, 0x2d, 0xce, 0x2c, 0xd6, 0x2b, 0x28, 0xca, + 0x2f, 0xc9, 0x17, 0x92, 0x80, 0xaa, 0xd3, 0x43, 0x51, 0xa7, 0x57, 0x66, 0x28, 0x25, 0x92, 0x9e, + 0x9f, 0x9e, 0x0f, 0x56, 0xa4, 0x0f, 0x62, 0x41, 0xd4, 0x4b, 0xa9, 0xe2, 0x34, 0xb7, 0x20, 0xb1, + 0x28, 0x31, 0x17, 0x6a, 0xac, 0x92, 0x1f, 0x17, 0x8f, 0x3b, 0xc4, 0x9e, 0xe0, 0x92, 0xc4, 0x92, + 0x54, 0x21, 0x3b, 0x2e, 0x36, 0x88, 0xbc, 0x04, 0xa3, 0x02, 0xa3, 0x06, 0xb7, 0x91, 0x82, 0x1e, + 0x2e, 0x7b, 0xf5, 0x02, 0xc0, 0xea, 0x9c, 0x58, 0x4e, 0xdc, 0x93, 0x67, 0x08, 0x82, 0xea, 0x72, + 0xf2, 0x3f, 0xf1, 0x48, 0x8e, 0xf1, 0xc2, 0x23, 0x39, 0xc6, 0x07, 0x8f, 0xe4, 0x18, 0x27, 0x3c, + 0x96, 0x63, 0xb8, 0xf0, 0x58, 0x8e, 0xe1, 0xc6, 0x63, 0x39, 0x86, 0x28, 0xd3, 0xf4, 0xcc, 0x92, + 0x8c, 0xd2, 0x24, 0xbd, 0xe4, 0xfc, 0x5c, 0x7d, 0xa8, 0x99, 0xc9, 0x19, 0x89, 0x99, 0x79, 0x30, + 0x8e, 0x7e, 0x05, 0x9a, 0x53, 0x4b, 0x2a, 0x0b, 0x52, 0x8b, 0x93, 0xd8, 0xc0, 0xee, 0x34, 0x06, + 0x04, 0x00, 0x00, 0xff, 0xff, 0x60, 0x50, 0x97, 0x1e, 0x28, 0x01, 0x00, 0x00, } func (m *GenesisState) Marshal() (dAtA []byte, err error) { diff --git a/x/btccheckpoint/types/params.pb.go b/x/btccheckpoint/types/params.pb.go index a252b4f89..a71c4b449 100644 --- a/x/btccheckpoint/types/params.pb.go +++ b/x/btccheckpoint/types/params.pb.go @@ -1,12 +1,12 @@ // Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: babylon/btccheckpoint/params.proto +// source: babylon/btccheckpoint/v1/params.proto package types import ( fmt "fmt" + _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/cosmos/gogoproto/proto" - _ "github.com/gogo/protobuf/gogoproto" io "io" math "math" math_bits "math/bits" @@ -29,11 +29,12 @@ type Params struct { // A block is considered irreversible only when it is at least k-deep in BTC // (k in research paper) BtcConfirmationDepth uint64 `protobuf:"varint,1,opt,name=btc_confirmation_depth,json=btcConfirmationDepth,proto3" json:"btc_confirmation_depth,omitempty" yaml:"btc_confirmation_depth"` - // checkpoint_finalization_timeout is the maximum time window (measured in BTC blocks) between a checkpoint + // checkpoint_finalization_timeout is the maximum time window (measured in BTC + // blocks) between a checkpoint // - being submitted to BTC, and // - being reported back to BBN - // If a checkpoint has not been reported back within w BTC blocks, then BBN has dishonest majority and is stalling checkpoints - // (w in research paper) + // If a checkpoint has not been reported back within w BTC blocks, then BBN + // has dishonest majority and is stalling checkpoints (w in research paper) CheckpointFinalizationTimeout uint64 `protobuf:"varint,2,opt,name=checkpoint_finalization_timeout,json=checkpointFinalizationTimeout,proto3" json:"checkpoint_finalization_timeout,omitempty" yaml:"checkpoint_finalization_timeout"` } @@ -41,7 +42,7 @@ func (m *Params) Reset() { *m = Params{} } func (m *Params) String() string { return proto.CompactTextString(m) } func (*Params) ProtoMessage() {} func (*Params) Descriptor() ([]byte, []int) { - return fileDescriptor_4beca7ec42c8d1bd, []int{0} + return fileDescriptor_5445a19005ae983c, []int{0} } func (m *Params) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -89,28 +90,28 @@ func init() { } func init() { - proto.RegisterFile("babylon/btccheckpoint/params.proto", fileDescriptor_4beca7ec42c8d1bd) + proto.RegisterFile("babylon/btccheckpoint/v1/params.proto", fileDescriptor_5445a19005ae983c) } -var fileDescriptor_4beca7ec42c8d1bd = []byte{ - // 268 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x4a, 0x4a, 0x4c, 0xaa, +var fileDescriptor_5445a19005ae983c = []byte{ + // 271 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x4d, 0x4a, 0x4c, 0xaa, 0xcc, 0xc9, 0xcf, 0xd3, 0x4f, 0x2a, 0x49, 0x4e, 0xce, 0x48, 0x4d, 0xce, 0x2e, 0xc8, 0xcf, 0xcc, - 0x2b, 0xd1, 0x2f, 0x48, 0x2c, 0x4a, 0xcc, 0x2d, 0xd6, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x92, - 0x80, 0xaa, 0xd1, 0x43, 0x51, 0xa3, 0x57, 0x66, 0x28, 0x25, 0x92, 0x9e, 0x9f, 0x9e, 0x0f, 0x56, - 0xa4, 0x0f, 0x62, 0x41, 0xd4, 0x2b, 0xdd, 0x66, 0xe4, 0x62, 0x0b, 0x00, 0x1b, 0x20, 0x14, 0xce, - 0x25, 0x96, 0x54, 0x92, 0x1c, 0x9f, 0x9c, 0x9f, 0x97, 0x96, 0x59, 0x94, 0x9b, 0x58, 0x92, 0x99, - 0x9f, 0x17, 0x9f, 0x92, 0x5a, 0x50, 0x92, 0x21, 0xc1, 0xa8, 0xc0, 0xa8, 0xc1, 0xe2, 0xa4, 0xf8, - 0xe9, 0x9e, 0xbc, 0x6c, 0x65, 0x62, 0x6e, 0x8e, 0x95, 0x12, 0x76, 0x75, 0x4a, 0x41, 0x22, 0x49, - 0x25, 0xc9, 0xce, 0x48, 0xe2, 0x2e, 0x20, 0x61, 0xa1, 0x22, 0x2e, 0x79, 0x84, 0x53, 0xe2, 0xd3, - 0x32, 0xf3, 0x12, 0x73, 0x32, 0xab, 0x20, 0xfa, 0x4a, 0x32, 0x73, 0x53, 0xf3, 0x4b, 0x4b, 0x24, - 0x98, 0xc0, 0x36, 0x68, 0x7d, 0xba, 0x27, 0xaf, 0x06, 0xb1, 0x81, 0x80, 0x06, 0xa5, 0x20, 0x59, - 0x84, 0x0a, 0x37, 0x24, 0x05, 0x21, 0x10, 0x79, 0x2b, 0x96, 0x17, 0x0b, 0xe4, 0x19, 0x9d, 0xfc, - 0x4f, 0x3c, 0x92, 0x63, 0xbc, 0xf0, 0x48, 0x8e, 0xf1, 0xc1, 0x23, 0x39, 0xc6, 0x09, 0x8f, 0xe5, - 0x18, 0x2e, 0x3c, 0x96, 0x63, 0xb8, 0xf1, 0x58, 0x8e, 0x21, 0xca, 0x34, 0x3d, 0xb3, 0x24, 0xa3, - 0x34, 0x49, 0x2f, 0x39, 0x3f, 0x57, 0x1f, 0x1a, 0x64, 0xc9, 0x19, 0x89, 0x99, 0x79, 0x30, 0x8e, - 0x7e, 0x05, 0x5a, 0x28, 0x97, 0x54, 0x16, 0xa4, 0x16, 0x27, 0xb1, 0x81, 0x43, 0xcd, 0x18, 0x10, - 0x00, 0x00, 0xff, 0xff, 0xd8, 0x05, 0x8f, 0x44, 0x8b, 0x01, 0x00, 0x00, + 0x2b, 0xd1, 0x2f, 0x33, 0xd4, 0x2f, 0x48, 0x2c, 0x4a, 0xcc, 0x2d, 0xd6, 0x2b, 0x28, 0xca, 0x2f, + 0xc9, 0x17, 0x92, 0x80, 0x2a, 0xd3, 0x43, 0x51, 0xa6, 0x57, 0x66, 0x28, 0x25, 0x92, 0x9e, 0x9f, + 0x9e, 0x0f, 0x56, 0xa4, 0x0f, 0x62, 0x41, 0xd4, 0x2b, 0xdd, 0x66, 0xe4, 0x62, 0x0b, 0x00, 0x1b, + 0x20, 0x14, 0xce, 0x25, 0x96, 0x54, 0x92, 0x1c, 0x9f, 0x9c, 0x9f, 0x97, 0x96, 0x59, 0x94, 0x9b, + 0x58, 0x92, 0x99, 0x9f, 0x17, 0x9f, 0x92, 0x5a, 0x50, 0x92, 0x21, 0xc1, 0xa8, 0xc0, 0xa8, 0xc1, + 0xe2, 0xa4, 0xf8, 0xe9, 0x9e, 0xbc, 0x6c, 0x65, 0x62, 0x6e, 0x8e, 0x95, 0x12, 0x76, 0x75, 0x4a, + 0x41, 0x22, 0x49, 0x25, 0xc9, 0xce, 0x48, 0xe2, 0x2e, 0x20, 0x61, 0xa1, 0x22, 0x2e, 0x79, 0x84, + 0x53, 0xe2, 0xd3, 0x32, 0xf3, 0x12, 0x73, 0x32, 0xab, 0x20, 0xfa, 0x4a, 0x32, 0x73, 0x53, 0xf3, + 0x4b, 0x4b, 0x24, 0x98, 0xc0, 0x36, 0x68, 0x7d, 0xba, 0x27, 0xaf, 0x06, 0xb1, 0x81, 0x80, 0x06, + 0xa5, 0x20, 0x59, 0x84, 0x0a, 0x37, 0x24, 0x05, 0x21, 0x10, 0x79, 0x2b, 0x96, 0x17, 0x0b, 0xe4, + 0x19, 0x9d, 0xfc, 0x4f, 0x3c, 0x92, 0x63, 0xbc, 0xf0, 0x48, 0x8e, 0xf1, 0xc1, 0x23, 0x39, 0xc6, + 0x09, 0x8f, 0xe5, 0x18, 0x2e, 0x3c, 0x96, 0x63, 0xb8, 0xf1, 0x58, 0x8e, 0x21, 0xca, 0x34, 0x3d, + 0xb3, 0x24, 0xa3, 0x34, 0x49, 0x2f, 0x39, 0x3f, 0x57, 0x1f, 0x1a, 0x64, 0xc9, 0x19, 0x89, 0x99, + 0x79, 0x30, 0x8e, 0x7e, 0x05, 0x5a, 0x40, 0x97, 0x54, 0x16, 0xa4, 0x16, 0x27, 0xb1, 0x81, 0x43, + 0xcd, 0x18, 0x10, 0x00, 0x00, 0xff, 0xff, 0x67, 0xe2, 0x30, 0x84, 0x8e, 0x01, 0x00, 0x00, } func (this *Params) Equal(that interface{}) bool { diff --git a/x/btccheckpoint/types/query.pb.go b/x/btccheckpoint/types/query.pb.go index b18473692..c953afc7c 100644 --- a/x/btccheckpoint/types/query.pb.go +++ b/x/btccheckpoint/types/query.pb.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: babylon/btccheckpoint/query.proto +// source: babylon/btccheckpoint/v1/query.proto package types @@ -7,9 +7,9 @@ import ( context "context" fmt "fmt" query "github.com/cosmos/cosmos-sdk/types/query" + _ "github.com/cosmos/gogoproto/gogoproto" grpc1 "github.com/cosmos/gogoproto/grpc" proto "github.com/cosmos/gogoproto/proto" - _ "github.com/gogo/protobuf/gogoproto" _ "google.golang.org/genproto/googleapis/api/annotations" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" @@ -38,7 +38,7 @@ func (m *QueryParamsRequest) Reset() { *m = QueryParamsRequest{} } func (m *QueryParamsRequest) String() string { return proto.CompactTextString(m) } func (*QueryParamsRequest) ProtoMessage() {} func (*QueryParamsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_009c1165ec392ace, []int{0} + return fileDescriptor_6b9a2f46ada7d854, []int{0} } func (m *QueryParamsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -77,7 +77,7 @@ func (m *QueryParamsResponse) Reset() { *m = QueryParamsResponse{} } func (m *QueryParamsResponse) String() string { return proto.CompactTextString(m) } func (*QueryParamsResponse) ProtoMessage() {} func (*QueryParamsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_009c1165ec392ace, []int{1} + return fileDescriptor_6b9a2f46ada7d854, []int{1} } func (m *QueryParamsResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -114,7 +114,8 @@ func (m *QueryParamsResponse) GetParams() Params { } type QueryBtcCheckpointInfoRequest struct { - // Number of epoch for which the earliest checkpointing btc height is requested + // Number of epoch for which the earliest checkpointing btc height is + // requested EpochNum uint64 `protobuf:"varint,1,opt,name=epoch_num,json=epochNum,proto3" json:"epoch_num,omitempty"` } @@ -122,7 +123,7 @@ func (m *QueryBtcCheckpointInfoRequest) Reset() { *m = QueryBtcCheckpoin func (m *QueryBtcCheckpointInfoRequest) String() string { return proto.CompactTextString(m) } func (*QueryBtcCheckpointInfoRequest) ProtoMessage() {} func (*QueryBtcCheckpointInfoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_009c1165ec392ace, []int{2} + return fileDescriptor_6b9a2f46ada7d854, []int{2} } func (m *QueryBtcCheckpointInfoRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -158,7 +159,8 @@ func (m *QueryBtcCheckpointInfoRequest) GetEpochNum() uint64 { return 0 } -// QueryBtcCheckpointInfoResponse is response type for the Query/BtcCheckpointInfo RPC method +// QueryBtcCheckpointInfoResponse is response type for the +// Query/BtcCheckpointInfo RPC method type QueryBtcCheckpointInfoResponse struct { Info *BTCCheckpointInfo `protobuf:"bytes,1,opt,name=info,proto3" json:"info,omitempty"` } @@ -167,7 +169,7 @@ func (m *QueryBtcCheckpointInfoResponse) Reset() { *m = QueryBtcCheckpoi func (m *QueryBtcCheckpointInfoResponse) String() string { return proto.CompactTextString(m) } func (*QueryBtcCheckpointInfoResponse) ProtoMessage() {} func (*QueryBtcCheckpointInfoResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_009c1165ec392ace, []int{3} + return fileDescriptor_6b9a2f46ada7d854, []int{3} } func (m *QueryBtcCheckpointInfoResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -203,7 +205,8 @@ func (m *QueryBtcCheckpointInfoResponse) GetInfo() *BTCCheckpointInfo { return nil } -// QueryBtcCheckpointsInfoRequest is request type for the Query/BtcCheckpointsInfo RPC method +// QueryBtcCheckpointsInfoRequest is request type for the +// Query/BtcCheckpointsInfo RPC method type QueryBtcCheckpointsInfoRequest struct { // pagination defines whether to have the pagination in the request Pagination *query.PageRequest `protobuf:"bytes,1,opt,name=pagination,proto3" json:"pagination,omitempty"` @@ -213,7 +216,7 @@ func (m *QueryBtcCheckpointsInfoRequest) Reset() { *m = QueryBtcCheckpoi func (m *QueryBtcCheckpointsInfoRequest) String() string { return proto.CompactTextString(m) } func (*QueryBtcCheckpointsInfoRequest) ProtoMessage() {} func (*QueryBtcCheckpointsInfoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_009c1165ec392ace, []int{4} + return fileDescriptor_6b9a2f46ada7d854, []int{4} } func (m *QueryBtcCheckpointsInfoRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -249,7 +252,8 @@ func (m *QueryBtcCheckpointsInfoRequest) GetPagination() *query.PageRequest { return nil } -// QueryBtcCheckpointsInfoResponse is response type for the Query/BtcCheckpointsInfo RPC method +// QueryBtcCheckpointsInfoResponse is response type for the +// Query/BtcCheckpointsInfo RPC method type QueryBtcCheckpointsInfoResponse struct { InfoList []*BTCCheckpointInfo `protobuf:"bytes,1,rep,name=info_list,json=infoList,proto3" json:"info_list,omitempty"` // pagination defines the pagination in the response @@ -260,7 +264,7 @@ func (m *QueryBtcCheckpointsInfoResponse) Reset() { *m = QueryBtcCheckpo func (m *QueryBtcCheckpointsInfoResponse) String() string { return proto.CompactTextString(m) } func (*QueryBtcCheckpointsInfoResponse) ProtoMessage() {} func (*QueryBtcCheckpointsInfoResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_009c1165ec392ace, []int{5} + return fileDescriptor_6b9a2f46ada7d854, []int{5} } func (m *QueryBtcCheckpointsInfoResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -313,7 +317,7 @@ func (m *QueryEpochSubmissionsRequest) Reset() { *m = QueryEpochSubmissi func (m *QueryEpochSubmissionsRequest) String() string { return proto.CompactTextString(m) } func (*QueryEpochSubmissionsRequest) ProtoMessage() {} func (*QueryEpochSubmissionsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_009c1165ec392ace, []int{6} + return fileDescriptor_6b9a2f46ada7d854, []int{6} } func (m *QueryEpochSubmissionsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -366,7 +370,7 @@ func (m *QueryEpochSubmissionsResponse) Reset() { *m = QueryEpochSubmiss func (m *QueryEpochSubmissionsResponse) String() string { return proto.CompactTextString(m) } func (*QueryEpochSubmissionsResponse) ProtoMessage() {} func (*QueryEpochSubmissionsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_009c1165ec392ace, []int{7} + return fileDescriptor_6b9a2f46ada7d854, []int{7} } func (m *QueryEpochSubmissionsResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -420,49 +424,51 @@ func init() { proto.RegisterType((*QueryEpochSubmissionsResponse)(nil), "babylon.btccheckpoint.v1.QueryEpochSubmissionsResponse") } -func init() { proto.RegisterFile("babylon/btccheckpoint/query.proto", fileDescriptor_009c1165ec392ace) } - -var fileDescriptor_009c1165ec392ace = []byte{ - // 623 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x95, 0x3d, 0x6f, 0xd3, 0x40, - 0x1c, 0xc6, 0x73, 0x21, 0x8d, 0xda, 0x63, 0x81, 0xa3, 0x43, 0x70, 0x8b, 0x9b, 0x5a, 0x82, 0x94, - 0x97, 0xda, 0x4a, 0x2b, 0x28, 0x15, 0x08, 0xa4, 0x54, 0xbc, 0x09, 0x04, 0x25, 0xc0, 0xc2, 0x52, - 0x9d, 0xad, 0xab, 0x63, 0x35, 0xbe, 0x73, 0x73, 0xe7, 0x88, 0x08, 0xb1, 0xc0, 0x07, 0x00, 0x89, - 0xcf, 0xc0, 0xc6, 0x08, 0x2b, 0x12, 0x5b, 0xc7, 0x4a, 0x2c, 0x4c, 0x08, 0x25, 0x7c, 0x10, 0xe4, - 0xf3, 0x35, 0x89, 0x93, 0x58, 0x49, 0xaa, 0x6e, 0x95, 0xfb, 0x3c, 0xff, 0xe7, 0xe7, 0xff, 0x8b, - 0x03, 0x97, 0x6d, 0x6c, 0xb7, 0xea, 0x8c, 0x5a, 0xb6, 0x70, 0x9c, 0x1a, 0x71, 0xf6, 0x02, 0xe6, - 0x51, 0x61, 0xed, 0x87, 0xa4, 0xd1, 0x32, 0x83, 0x06, 0x13, 0x0c, 0x15, 0x94, 0xc4, 0x4c, 0x48, - 0xcc, 0x66, 0x59, 0x9b, 0x77, 0x99, 0xcb, 0xa4, 0xc8, 0x8a, 0xfe, 0x8a, 0xf5, 0xda, 0xa2, 0xcb, - 0x98, 0x5b, 0x27, 0x16, 0x0e, 0x3c, 0x0b, 0x53, 0xca, 0x04, 0x16, 0x1e, 0xa3, 0x5c, 0xfd, 0xf7, - 0x8a, 0xc3, 0xb8, 0xcf, 0xb8, 0x65, 0x63, 0x4e, 0xe2, 0x18, 0xab, 0x59, 0xb6, 0x89, 0xc0, 0x65, - 0x2b, 0xc0, 0xae, 0x47, 0xa5, 0x58, 0x69, 0x8d, 0xd1, 0x70, 0x01, 0x6e, 0x60, 0xff, 0xa8, 0xde, - 0xe5, 0xd1, 0x9a, 0x24, 0xab, 0x94, 0x1a, 0xf3, 0x10, 0x3d, 0x8f, 0x02, 0xb7, 0xa5, 0xbf, 0x4a, - 0xf6, 0x43, 0xc2, 0x85, 0xf1, 0x0a, 0x9e, 0x4b, 0x3c, 0xe5, 0x01, 0xa3, 0x9c, 0xa0, 0x3b, 0x30, - 0x1f, 0xe7, 0x14, 0x40, 0x11, 0xac, 0x9c, 0x5e, 0x2b, 0x9a, 0x69, 0x6d, 0x30, 0x63, 0x67, 0x25, - 0x77, 0xf0, 0x67, 0x29, 0x53, 0x55, 0x2e, 0xe3, 0x36, 0xbc, 0x20, 0xcb, 0x56, 0x84, 0xb3, 0xd5, - 0x55, 0x3f, 0xa2, 0xbb, 0x4c, 0xe5, 0xa2, 0x05, 0x38, 0x47, 0x02, 0xe6, 0xd4, 0x76, 0x68, 0xe8, - 0xcb, 0x8c, 0x5c, 0x75, 0x56, 0x3e, 0x78, 0x1a, 0xfa, 0x06, 0x86, 0x7a, 0x9a, 0x5b, 0xf1, 0xdd, - 0x85, 0x39, 0x8f, 0xee, 0x32, 0x45, 0x77, 0x35, 0x9d, 0xae, 0xf2, 0x72, 0x6b, 0xa0, 0x84, 0x34, - 0x1a, 0xb5, 0x51, 0x11, 0xbc, 0x9f, 0xf0, 0x3e, 0x84, 0xbd, 0x91, 0xa8, 0xa0, 0x4b, 0x66, 0x3c, - 0x3f, 0x33, 0x9a, 0x9f, 0x19, 0xaf, 0x89, 0x9a, 0x9f, 0xb9, 0x8d, 0x5d, 0xa2, 0xbc, 0xd5, 0x3e, - 0xa7, 0xf1, 0x0d, 0xc0, 0xa5, 0xd4, 0x28, 0xf5, 0x3a, 0x0f, 0xe1, 0x5c, 0x44, 0xb5, 0x53, 0xf7, - 0xb8, 0x28, 0x80, 0xe2, 0xa9, 0x69, 0xdf, 0x69, 0x36, 0x72, 0x3f, 0xf1, 0xb8, 0x40, 0x0f, 0x12, - 0xd4, 0x59, 0x49, 0x5d, 0x1a, 0x4b, 0x1d, 0x63, 0x24, 0xb0, 0x3f, 0x00, 0xb8, 0x28, 0xb1, 0xef, - 0x45, 0x53, 0x79, 0x11, 0xda, 0xbe, 0xc7, 0x79, 0xb4, 0xc9, 0x93, 0x4c, 0x70, 0xa0, 0x79, 0xd9, - 0x63, 0x37, 0xef, 0x0b, 0x50, 0x8b, 0x34, 0x4c, 0xa1, 0x5a, 0x77, 0x0b, 0xe6, 0xf6, 0x48, 0x8b, - 0xab, 0xae, 0x95, 0xd2, 0xbb, 0xd6, 0x33, 0x3f, 0x26, 0xad, 0xaa, 0x34, 0x9d, 0x58, 0xb7, 0xd6, - 0x7e, 0xce, 0xc0, 0x19, 0xc9, 0x89, 0x3e, 0x02, 0x98, 0x8f, 0x4f, 0x02, 0x5d, 0x4b, 0x87, 0x19, - 0xbe, 0x44, 0x6d, 0x75, 0x42, 0x75, 0x9c, 0x6e, 0xac, 0xbc, 0xff, 0xf5, 0xef, 0x73, 0xd6, 0x40, - 0x45, 0x6b, 0xf4, 0x27, 0xa0, 0x59, 0x56, 0x5f, 0x0a, 0xf4, 0x1d, 0xc0, 0xb3, 0x43, 0x97, 0x84, - 0x36, 0xc6, 0xc4, 0xa5, 0x5d, 0xae, 0x76, 0x73, 0x7a, 0xa3, 0x42, 0x5e, 0x95, 0xc8, 0x25, 0x74, - 0x31, 0x1d, 0xf9, 0x6d, 0x77, 0xa5, 0xde, 0xa1, 0xaf, 0x00, 0xa2, 0xe1, 0x9b, 0x41, 0x53, 0xe5, - 0xf7, 0x5f, 0xb4, 0xb6, 0x79, 0x0c, 0xa7, 0x42, 0x5f, 0x96, 0xe8, 0x0b, 0xe8, 0x7c, 0x2a, 0x3a, - 0xfa, 0x01, 0xe0, 0x99, 0xc1, 0x2d, 0x45, 0x37, 0xc6, 0x44, 0xa6, 0x1c, 0x97, 0xb6, 0x31, 0xb5, - 0x4f, 0x81, 0x6e, 0x4a, 0xd0, 0x75, 0x54, 0x9e, 0xa8, 0xc7, 0x16, 0xef, 0x95, 0xa8, 0x3c, 0x3b, - 0x68, 0xeb, 0xe0, 0xb0, 0xad, 0x83, 0xbf, 0x6d, 0x1d, 0x7c, 0xea, 0xe8, 0x99, 0xc3, 0x8e, 0x9e, - 0xf9, 0xdd, 0xd1, 0x33, 0xaf, 0xaf, 0xbb, 0x9e, 0xa8, 0x85, 0xb6, 0xe9, 0x30, 0xff, 0xa8, 0xac, - 0x53, 0xc3, 0x1e, 0xed, 0x66, 0xbc, 0x19, 0x48, 0x11, 0xad, 0x80, 0x70, 0x3b, 0x2f, 0x7f, 0x78, - 0xd6, 0xff, 0x07, 0x00, 0x00, 0xff, 0xff, 0x85, 0x8a, 0x90, 0xbc, 0x66, 0x07, 0x00, 0x00, +func init() { + proto.RegisterFile("babylon/btccheckpoint/v1/query.proto", fileDescriptor_6b9a2f46ada7d854) +} + +var fileDescriptor_6b9a2f46ada7d854 = []byte{ + // 621 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x95, 0x4d, 0x6b, 0x13, 0x4f, + 0x1c, 0xc7, 0x33, 0xf9, 0xa7, 0xa1, 0x9d, 0xff, 0x45, 0xc7, 0x1e, 0xe2, 0xb6, 0x6e, 0xe3, 0x62, + 0x4d, 0xd1, 0x76, 0x97, 0xb4, 0x68, 0x2d, 0x8a, 0x42, 0x8a, 0x4f, 0x28, 0x5a, 0xa3, 0x5e, 0xbc, + 0x94, 0xd9, 0x65, 0xba, 0x59, 0x9a, 0x9d, 0xd9, 0x66, 0x66, 0x83, 0x41, 0xbc, 0xe8, 0x0b, 0x50, + 0xf0, 0x35, 0x78, 0xf3, 0xa8, 0x57, 0xc1, 0x5b, 0x8f, 0x05, 0x2f, 0x9e, 0x44, 0x12, 0x5f, 0x88, + 0xec, 0xec, 0x34, 0x8f, 0x0e, 0x49, 0x8a, 0xb7, 0xb0, 0xf9, 0x7e, 0x7f, 0xdf, 0xcf, 0xfe, 0x1e, + 0x12, 0x78, 0xc1, 0xc5, 0x6e, 0xab, 0xce, 0xa8, 0xe3, 0x0a, 0xcf, 0xab, 0x11, 0x6f, 0x3f, 0x62, + 0x01, 0x15, 0x4e, 0xb3, 0xec, 0x1c, 0xc4, 0xa4, 0xd1, 0xb2, 0xa3, 0x06, 0x13, 0x0c, 0x15, 0x94, + 0xca, 0x1e, 0x50, 0xd9, 0xcd, 0xb2, 0x31, 0xef, 0x33, 0x9f, 0x49, 0x91, 0x93, 0x7c, 0x4a, 0xf5, + 0xc6, 0xa2, 0xcf, 0x98, 0x5f, 0x27, 0x0e, 0x8e, 0x02, 0x07, 0x53, 0xca, 0x04, 0x16, 0x01, 0xa3, + 0x5c, 0x7d, 0x7b, 0xc9, 0x63, 0x3c, 0x64, 0xdc, 0x71, 0x31, 0x27, 0x69, 0x8c, 0xd3, 0x2c, 0xbb, + 0x44, 0xe0, 0xb2, 0x13, 0x61, 0x3f, 0xa0, 0x52, 0xac, 0xb4, 0xcb, 0x5a, 0xbe, 0x08, 0x37, 0x70, + 0x78, 0x5c, 0x72, 0x55, 0x2b, 0x1b, 0x24, 0x96, 0x6a, 0x6b, 0x1e, 0xa2, 0x27, 0x49, 0xec, 0x8e, + 0x2c, 0x51, 0x25, 0x07, 0x31, 0xe1, 0xc2, 0x7a, 0x0e, 0xcf, 0x0c, 0x3c, 0xe5, 0x11, 0xa3, 0x9c, + 0xa0, 0x9b, 0x30, 0x9f, 0x46, 0x15, 0x40, 0x11, 0xac, 0xfc, 0xbf, 0x5e, 0xb4, 0x75, 0xcd, 0xb0, + 0x53, 0x67, 0x25, 0x77, 0xf8, 0x73, 0x29, 0x53, 0x55, 0x2e, 0xeb, 0x06, 0x3c, 0x27, 0xcb, 0x56, + 0x84, 0xb7, 0xdd, 0x55, 0xdf, 0xa7, 0x7b, 0x4c, 0xe5, 0xa2, 0x05, 0x38, 0x47, 0x22, 0xe6, 0xd5, + 0x76, 0x69, 0x1c, 0xca, 0x8c, 0x5c, 0x75, 0x56, 0x3e, 0x78, 0x14, 0x87, 0x16, 0x86, 0xa6, 0xce, + 0xad, 0xf8, 0x6e, 0xc1, 0x5c, 0x40, 0xf7, 0x98, 0xa2, 0xbb, 0xac, 0xa7, 0xab, 0x3c, 0xdb, 0x1e, + 0x2a, 0x21, 0x8d, 0x56, 0xed, 0x6f, 0x11, 0xbc, 0x9f, 0xf0, 0x0e, 0x84, 0xbd, 0xc1, 0xa8, 0xa0, + 0x8b, 0x76, 0x3a, 0x45, 0x3b, 0x99, 0xa2, 0x9d, 0x2e, 0x8b, 0x9a, 0xa2, 0xbd, 0x83, 0x7d, 0xa2, + 0xbc, 0xd5, 0x3e, 0xa7, 0xf5, 0x19, 0xc0, 0x25, 0x6d, 0x94, 0x7a, 0x9d, 0x7b, 0x70, 0x2e, 0xa1, + 0xda, 0xad, 0x07, 0x5c, 0x14, 0x40, 0xf1, 0xbf, 0x69, 0xdf, 0x69, 0x36, 0x71, 0x3f, 0x0c, 0xb8, + 0x40, 0x77, 0x07, 0xa8, 0xb3, 0x92, 0xba, 0x34, 0x96, 0x3a, 0xc5, 0x18, 0xc0, 0x7e, 0x0b, 0xe0, + 0xa2, 0xc4, 0xbe, 0x9d, 0x4c, 0xe5, 0x69, 0xec, 0x86, 0x01, 0xe7, 0xc9, 0x3e, 0x4f, 0x32, 0xc1, + 0xa1, 0xe6, 0x65, 0x4f, 0xdc, 0xbc, 0x8f, 0x40, 0x2d, 0xd2, 0x28, 0x85, 0x6a, 0xdd, 0x75, 0x98, + 0xdb, 0x27, 0x2d, 0xae, 0xba, 0x56, 0xd2, 0x77, 0xad, 0x67, 0x7e, 0x40, 0x5a, 0x55, 0x69, 0xfa, + 0x67, 0xdd, 0x5a, 0xff, 0x36, 0x03, 0x67, 0x24, 0x27, 0x7a, 0x07, 0x60, 0x3e, 0x3d, 0x09, 0xb4, + 0xaa, 0x87, 0x19, 0xbd, 0x44, 0x63, 0x6d, 0x42, 0x75, 0x9a, 0x6e, 0xad, 0xbc, 0xf9, 0xfe, 0xfb, + 0x43, 0xd6, 0x42, 0x45, 0x67, 0xcc, 0x8f, 0x05, 0xfa, 0x02, 0xe0, 0xe9, 0x91, 0x4b, 0x42, 0x9b, + 0x63, 0xe2, 0x74, 0x97, 0x6b, 0x5c, 0x9b, 0xde, 0xa8, 0x90, 0xd7, 0x24, 0x72, 0x09, 0x2d, 0xeb, + 0x91, 0x5f, 0x75, 0x57, 0xea, 0x35, 0xfa, 0x04, 0x20, 0x1a, 0xbd, 0x19, 0x34, 0x55, 0x7e, 0xff, + 0x45, 0x1b, 0x5b, 0x27, 0x70, 0x2a, 0xf4, 0xf3, 0x12, 0x7d, 0x01, 0x9d, 0xd5, 0xa2, 0xa3, 0xaf, + 0x00, 0x9e, 0x1a, 0xde, 0x52, 0x74, 0x75, 0x4c, 0xa4, 0xe6, 0xb8, 0x8c, 0xcd, 0xa9, 0x7d, 0x0a, + 0x74, 0x4b, 0x82, 0x6e, 0xa0, 0xf2, 0x44, 0x3d, 0x76, 0x78, 0xaf, 0x44, 0xe5, 0xf1, 0x61, 0xdb, + 0x04, 0x47, 0x6d, 0x13, 0xfc, 0x6a, 0x9b, 0xe0, 0x7d, 0xc7, 0xcc, 0x1c, 0x75, 0xcc, 0xcc, 0x8f, + 0x8e, 0x99, 0x79, 0x71, 0xc5, 0x0f, 0x44, 0x2d, 0x76, 0x6d, 0x8f, 0x85, 0xc7, 0x65, 0xbd, 0x1a, + 0x0e, 0x68, 0x37, 0xe3, 0xe5, 0x50, 0x8a, 0x68, 0x45, 0x84, 0xbb, 0x79, 0xf9, 0xc7, 0xb3, 0xf1, + 0x27, 0x00, 0x00, 0xff, 0xff, 0x19, 0x16, 0x59, 0xdc, 0x6f, 0x07, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -656,7 +662,7 @@ var _Query_serviceDesc = grpc.ServiceDesc{ }, }, Streams: []grpc.StreamDesc{}, - Metadata: "babylon/btccheckpoint/query.proto", + Metadata: "babylon/btccheckpoint/v1/query.proto", } func (m *QueryParamsRequest) Marshal() (dAtA []byte, err error) { diff --git a/x/btccheckpoint/types/query.pb.gw.go b/x/btccheckpoint/types/query.pb.gw.go index 06ee42575..87a078f9e 100644 --- a/x/btccheckpoint/types/query.pb.gw.go +++ b/x/btccheckpoint/types/query.pb.gw.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. -// source: babylon/btccheckpoint/query.proto +// source: babylon/btccheckpoint/v1/query.proto /* Package types is a reverse proxy. diff --git a/x/btccheckpoint/types/tx.pb.go b/x/btccheckpoint/types/tx.pb.go index 9c74fe5e1..fc27edf80 100644 --- a/x/btccheckpoint/types/tx.pb.go +++ b/x/btccheckpoint/types/tx.pb.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: babylon/btccheckpoint/tx.proto +// source: babylon/btccheckpoint/v1/tx.proto package types @@ -8,7 +8,6 @@ import ( fmt "fmt" grpc1 "github.com/cosmos/gogoproto/grpc" proto "github.com/cosmos/gogoproto/proto" - _ "github.com/gogo/protobuf/gogoproto" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" @@ -37,7 +36,7 @@ func (m *MsgInsertBTCSpvProof) Reset() { *m = MsgInsertBTCSpvProof{} } func (m *MsgInsertBTCSpvProof) String() string { return proto.CompactTextString(m) } func (*MsgInsertBTCSpvProof) ProtoMessage() {} func (*MsgInsertBTCSpvProof) Descriptor() ([]byte, []int) { - return fileDescriptor_aeec89810b39ea83, []int{0} + return fileDescriptor_69a562325f8b35c5, []int{0} } func (m *MsgInsertBTCSpvProof) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -87,7 +86,7 @@ func (m *MsgInsertBTCSpvProofResponse) Reset() { *m = MsgInsertBTCSpvPro func (m *MsgInsertBTCSpvProofResponse) String() string { return proto.CompactTextString(m) } func (*MsgInsertBTCSpvProofResponse) ProtoMessage() {} func (*MsgInsertBTCSpvProofResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_aeec89810b39ea83, []int{1} + return fileDescriptor_69a562325f8b35c5, []int{1} } func (m *MsgInsertBTCSpvProofResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -121,27 +120,26 @@ func init() { proto.RegisterType((*MsgInsertBTCSpvProofResponse)(nil), "babylon.btccheckpoint.v1.MsgInsertBTCSpvProofResponse") } -func init() { proto.RegisterFile("babylon/btccheckpoint/tx.proto", fileDescriptor_aeec89810b39ea83) } +func init() { proto.RegisterFile("babylon/btccheckpoint/v1/tx.proto", fileDescriptor_69a562325f8b35c5) } -var fileDescriptor_aeec89810b39ea83 = []byte{ - // 263 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4b, 0x4a, 0x4c, 0xaa, +var fileDescriptor_69a562325f8b35c5 = []byte{ + // 255 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x4c, 0x4a, 0x4c, 0xaa, 0xcc, 0xc9, 0xcf, 0xd3, 0x4f, 0x2a, 0x49, 0x4e, 0xce, 0x48, 0x4d, 0xce, 0x2e, 0xc8, 0xcf, 0xcc, - 0x2b, 0xd1, 0x2f, 0xa9, 0xd0, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x92, 0x80, 0xca, 0xeb, 0xa1, - 0xc8, 0xeb, 0x95, 0x19, 0x4a, 0x89, 0xa4, 0xe7, 0xa7, 0xe7, 0x83, 0x15, 0xe9, 0x83, 0x58, 0x10, - 0xf5, 0x52, 0x9a, 0xd8, 0xcd, 0x43, 0xd5, 0x0d, 0x56, 0xaa, 0x54, 0xcc, 0x25, 0xe2, 0x5b, 0x9c, - 0xee, 0x99, 0x57, 0x9c, 0x5a, 0x54, 0xe2, 0x14, 0xe2, 0x1c, 0x5c, 0x50, 0x16, 0x50, 0x94, 0x9f, - 0x9f, 0x26, 0x24, 0xc3, 0xc5, 0x59, 0x5c, 0x9a, 0x94, 0x9b, 0x59, 0x52, 0x92, 0x5a, 0x24, 0xc1, - 0xa8, 0xc0, 0xa8, 0xc1, 0x19, 0x84, 0x10, 0x10, 0xb2, 0xe5, 0x62, 0x2b, 0x00, 0x29, 0x2b, 0x96, - 0x60, 0x52, 0x60, 0xd6, 0xe0, 0x36, 0x52, 0xd5, 0xc3, 0xe5, 0x42, 0x3d, 0x24, 0x43, 0x83, 0xa0, - 0x9a, 0x94, 0xe4, 0xb8, 0x64, 0xb0, 0x59, 0x1a, 0x94, 0x5a, 0x5c, 0x90, 0x9f, 0x57, 0x9c, 0x6a, - 0xd4, 0xc4, 0xc8, 0xc5, 0xec, 0x5b, 0x9c, 0x2e, 0x54, 0xcd, 0x25, 0x88, 0xe9, 0x32, 0x3d, 0xdc, - 0x76, 0x61, 0x33, 0x54, 0xca, 0x8c, 0x34, 0xf5, 0x30, 0x47, 0x38, 0xf9, 0x9f, 0x78, 0x24, 0xc7, - 0x78, 0xe1, 0x91, 0x1c, 0xe3, 0x83, 0x47, 0x72, 0x8c, 0x13, 0x1e, 0xcb, 0x31, 0x5c, 0x78, 0x2c, - 0xc7, 0x70, 0xe3, 0xb1, 0x1c, 0x43, 0x94, 0x69, 0x7a, 0x66, 0x49, 0x46, 0x69, 0x92, 0x5e, 0x72, - 0x7e, 0xae, 0x3e, 0xd4, 0xec, 0xe4, 0x8c, 0xc4, 0xcc, 0x3c, 0x18, 0x47, 0xbf, 0x02, 0x3d, 0x22, - 0x2b, 0x0b, 0x52, 0x8b, 0x93, 0xd8, 0xc0, 0x21, 0x6e, 0x0c, 0x08, 0x00, 0x00, 0xff, 0xff, 0xc2, - 0x5a, 0x56, 0xbd, 0xee, 0x01, 0x00, 0x00, + 0x2b, 0xd1, 0x2f, 0x33, 0xd4, 0x2f, 0xa9, 0xd0, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x92, 0x80, + 0x2a, 0xd1, 0x43, 0x51, 0xa2, 0x57, 0x66, 0x28, 0xa5, 0x83, 0x53, 0x33, 0xaa, 0x52, 0xb0, 0x39, + 0x4a, 0xc5, 0x5c, 0x22, 0xbe, 0xc5, 0xe9, 0x9e, 0x79, 0xc5, 0xa9, 0x45, 0x25, 0x4e, 0x21, 0xce, + 0xc1, 0x05, 0x65, 0x01, 0x45, 0xf9, 0xf9, 0x69, 0x42, 0x32, 0x5c, 0x9c, 0xc5, 0xa5, 0x49, 0xb9, + 0x99, 0x25, 0x25, 0xa9, 0x45, 0x12, 0x8c, 0x0a, 0x8c, 0x1a, 0x9c, 0x41, 0x08, 0x01, 0x21, 0x5b, + 0x2e, 0xb6, 0x02, 0x90, 0xb2, 0x62, 0x09, 0x26, 0x05, 0x66, 0x0d, 0x6e, 0x23, 0x55, 0x3d, 0x5c, + 0xce, 0xd1, 0x43, 0x32, 0x34, 0x08, 0xaa, 0x49, 0x49, 0x8e, 0x4b, 0x06, 0x9b, 0xa5, 0x41, 0xa9, + 0xc5, 0x05, 0xf9, 0x79, 0xc5, 0xa9, 0x46, 0x4d, 0x8c, 0x5c, 0xcc, 0xbe, 0xc5, 0xe9, 0x42, 0xd5, + 0x5c, 0x82, 0x98, 0x2e, 0xd3, 0xc3, 0x6d, 0x17, 0x36, 0x43, 0xa5, 0xcc, 0x48, 0x53, 0x0f, 0x73, + 0x84, 0x93, 0xff, 0x89, 0x47, 0x72, 0x8c, 0x17, 0x1e, 0xc9, 0x31, 0x3e, 0x78, 0x24, 0xc7, 0x38, + 0xe1, 0xb1, 0x1c, 0xc3, 0x85, 0xc7, 0x72, 0x0c, 0x37, 0x1e, 0xcb, 0x31, 0x44, 0x99, 0xa6, 0x67, + 0x96, 0x64, 0x94, 0x26, 0xe9, 0x25, 0xe7, 0xe7, 0xea, 0x43, 0xcd, 0x4e, 0xce, 0x48, 0xcc, 0xcc, + 0x83, 0x71, 0xf4, 0x2b, 0xd0, 0xc2, 0xbe, 0xa4, 0xb2, 0x20, 0xb5, 0x38, 0x89, 0x0d, 0x1c, 0xe2, + 0xc6, 0x80, 0x00, 0x00, 0x00, 0xff, 0xff, 0x8a, 0x0e, 0xae, 0xdc, 0xde, 0x01, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -221,7 +219,7 @@ var _Msg_serviceDesc = grpc.ServiceDesc{ }, }, Streams: []grpc.StreamDesc{}, - Metadata: "babylon/btccheckpoint/tx.proto", + Metadata: "babylon/btccheckpoint/v1/tx.proto", } func (m *MsgInsertBTCSpvProof) Marshal() (dAtA []byte, err error) { diff --git a/x/btclightclient/types/btclightclient.pb.go b/x/btclightclient/types/btclightclient.pb.go index 1387c7ff2..df500a079 100644 --- a/x/btclightclient/types/btclightclient.pb.go +++ b/x/btclightclient/types/btclightclient.pb.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: babylon/btclightclient/btclightclient.proto +// source: babylon/btclightclient/v1/btclightclient.proto package types @@ -7,8 +7,8 @@ import ( fmt "fmt" github_com_babylonchain_babylon_types "github.com/babylonchain/babylon/types" github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" + _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/cosmos/gogoproto/proto" - _ "github.com/gogo/protobuf/gogoproto" io "io" math "math" math_bits "math/bits" @@ -36,7 +36,7 @@ func (m *BTCHeaderInfo) Reset() { *m = BTCHeaderInfo{} } func (m *BTCHeaderInfo) String() string { return proto.CompactTextString(m) } func (*BTCHeaderInfo) ProtoMessage() {} func (*BTCHeaderInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_3313d955a6cadef2, []int{0} + return fileDescriptor_84bf438d909b681d, []int{0} } func (m *BTCHeaderInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -77,29 +77,29 @@ func init() { } func init() { - proto.RegisterFile("babylon/btclightclient/btclightclient.proto", fileDescriptor_3313d955a6cadef2) + proto.RegisterFile("babylon/btclightclient/v1/btclightclient.proto", fileDescriptor_84bf438d909b681d) } -var fileDescriptor_3313d955a6cadef2 = []byte{ - // 276 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xd2, 0x4e, 0x4a, 0x4c, 0xaa, +var fileDescriptor_84bf438d909b681d = []byte{ + // 279 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xd2, 0x4b, 0x4a, 0x4c, 0xaa, 0xcc, 0xc9, 0xcf, 0xd3, 0x4f, 0x2a, 0x49, 0xce, 0xc9, 0x4c, 0xcf, 0x00, 0x91, 0xa9, 0x79, 0x25, - 0x68, 0x5c, 0xbd, 0x82, 0xa2, 0xfc, 0x92, 0x7c, 0x21, 0x49, 0xa8, 0x62, 0x3d, 0x34, 0xd9, 0x32, - 0x43, 0x29, 0x91, 0xf4, 0xfc, 0xf4, 0x7c, 0xb0, 0x2a, 0x7d, 0x10, 0x0b, 0xa2, 0x41, 0xa9, 0x87, - 0x89, 0x8b, 0xd7, 0x29, 0xc4, 0xd9, 0x23, 0x35, 0x31, 0x25, 0xb5, 0xc8, 0x33, 0x2f, 0x2d, 0x5f, - 0x28, 0x80, 0x8b, 0x2d, 0x03, 0xcc, 0x93, 0x60, 0x54, 0x60, 0xd4, 0xe0, 0x71, 0xb2, 0xb8, 0x75, - 0x4f, 0xde, 0x24, 0x3d, 0xb3, 0x24, 0xa3, 0x34, 0x49, 0x2f, 0x39, 0x3f, 0x57, 0x1f, 0x6a, 0x43, - 0x72, 0x46, 0x62, 0x66, 0x1e, 0x8c, 0xa3, 0x5f, 0x52, 0x59, 0x90, 0x5a, 0xac, 0x07, 0x37, 0xc8, - 0xa9, 0xb2, 0x24, 0xb5, 0x38, 0x08, 0x6a, 0x8e, 0x50, 0x00, 0x17, 0x4b, 0x46, 0x62, 0x71, 0x86, - 0x04, 0x13, 0xd8, 0x3c, 0x9b, 0x5b, 0xf7, 0xe4, 0x2d, 0x48, 0x34, 0xcf, 0x23, 0xb1, 0x38, 0x03, - 0x62, 0x26, 0xd8, 0x24, 0x21, 0x31, 0x90, 0x1b, 0x41, 0xde, 0x93, 0x60, 0x56, 0x60, 0xd4, 0x60, - 0x09, 0x82, 0xf2, 0x84, 0xec, 0xb9, 0x58, 0xca, 0xf3, 0x8b, 0xb2, 0x25, 0x58, 0xc0, 0x36, 0x69, - 0xdf, 0xba, 0x27, 0xaf, 0x8e, 0x64, 0x53, 0x72, 0x7e, 0x71, 0x6e, 0x7e, 0x31, 0x94, 0xd2, 0x2d, - 0x4e, 0xc9, 0x86, 0x5a, 0x13, 0x9a, 0x99, 0x57, 0x12, 0x04, 0xd6, 0xe8, 0x14, 0x70, 0xe2, 0x91, - 0x1c, 0xe3, 0x85, 0x47, 0x72, 0x8c, 0x0f, 0x1e, 0xc9, 0x31, 0x4e, 0x78, 0x2c, 0xc7, 0x70, 0xe1, - 0xb1, 0x1c, 0xc3, 0x8d, 0xc7, 0x72, 0x0c, 0x51, 0x66, 0x84, 0x9c, 0x5c, 0x81, 0x1e, 0x41, 0x60, - 0xc3, 0x93, 0xd8, 0xc0, 0xe1, 0x6c, 0x0c, 0x08, 0x00, 0x00, 0xff, 0xff, 0x41, 0x6a, 0x8d, 0xae, - 0xc7, 0x01, 0x00, 0x00, + 0xfa, 0x65, 0x86, 0x68, 0x22, 0x7a, 0x05, 0x45, 0xf9, 0x25, 0xf9, 0x42, 0x92, 0x50, 0xf5, 0x7a, + 0x68, 0xb2, 0x65, 0x86, 0x52, 0x22, 0xe9, 0xf9, 0xe9, 0xf9, 0x60, 0x55, 0xfa, 0x20, 0x16, 0x44, + 0x83, 0x52, 0x0f, 0x13, 0x17, 0xaf, 0x53, 0x88, 0xb3, 0x47, 0x6a, 0x62, 0x4a, 0x6a, 0x91, 0x67, + 0x5e, 0x5a, 0xbe, 0x50, 0x00, 0x17, 0x5b, 0x06, 0x98, 0x27, 0xc1, 0xa8, 0xc0, 0xa8, 0xc1, 0xe3, + 0x64, 0x71, 0xeb, 0x9e, 0xbc, 0x49, 0x7a, 0x66, 0x49, 0x46, 0x69, 0x92, 0x5e, 0x72, 0x7e, 0xae, + 0x3e, 0xd4, 0x86, 0xe4, 0x8c, 0xc4, 0xcc, 0x3c, 0x18, 0x47, 0xbf, 0xa4, 0xb2, 0x20, 0xb5, 0x58, + 0x0f, 0x6e, 0x90, 0x53, 0x65, 0x49, 0x6a, 0x71, 0x10, 0xd4, 0x1c, 0xa1, 0x00, 0x2e, 0x96, 0x8c, + 0xc4, 0xe2, 0x0c, 0x09, 0x26, 0xb0, 0x79, 0x36, 0xb7, 0xee, 0xc9, 0x5b, 0x90, 0x68, 0x9e, 0x47, + 0x62, 0x71, 0x06, 0xc4, 0x4c, 0xb0, 0x49, 0x42, 0x62, 0x20, 0x37, 0x82, 0xbc, 0x27, 0xc1, 0xac, + 0xc0, 0xa8, 0xc1, 0x12, 0x04, 0xe5, 0x09, 0xd9, 0x73, 0xb1, 0x94, 0xe7, 0x17, 0x65, 0x4b, 0xb0, + 0x80, 0x6d, 0xd2, 0xbe, 0x75, 0x4f, 0x5e, 0x1d, 0xc9, 0xa6, 0xe4, 0xfc, 0xe2, 0xdc, 0xfc, 0x62, + 0x28, 0xa5, 0x5b, 0x9c, 0x92, 0x0d, 0xb5, 0x26, 0x34, 0x33, 0xaf, 0x24, 0x08, 0xac, 0xd1, 0x29, + 0xe0, 0xc4, 0x23, 0x39, 0xc6, 0x0b, 0x8f, 0xe4, 0x18, 0x1f, 0x3c, 0x92, 0x63, 0x9c, 0xf0, 0x58, + 0x8e, 0xe1, 0xc2, 0x63, 0x39, 0x86, 0x1b, 0x8f, 0xe5, 0x18, 0xa2, 0xcc, 0x08, 0x39, 0xb9, 0x02, + 0x3d, 0x8e, 0xc0, 0x86, 0x27, 0xb1, 0x81, 0xc3, 0xd9, 0x18, 0x10, 0x00, 0x00, 0xff, 0xff, 0x8a, + 0x8d, 0x9c, 0x25, 0xca, 0x01, 0x00, 0x00, } func (m *BTCHeaderInfo) Marshal() (dAtA []byte, err error) { diff --git a/x/btclightclient/types/event.pb.go b/x/btclightclient/types/event.pb.go index e46d944ce..71f8fcda3 100644 --- a/x/btclightclient/types/event.pb.go +++ b/x/btclightclient/types/event.pb.go @@ -1,12 +1,11 @@ // Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: babylon/btclightclient/event.proto +// source: babylon/btclightclient/v1/event.proto package types import ( fmt "fmt" proto "github.com/cosmos/gogoproto/proto" - _ "github.com/gogo/protobuf/gogoproto" io "io" math "math" math_bits "math/bits" @@ -35,7 +34,7 @@ func (m *EventBTCRollBack) Reset() { *m = EventBTCRollBack{} } func (m *EventBTCRollBack) String() string { return proto.CompactTextString(m) } func (*EventBTCRollBack) ProtoMessage() {} func (*EventBTCRollBack) Descriptor() ([]byte, []int) { - return fileDescriptor_dbeb7d7d6407e7ec, []int{0} + return fileDescriptor_519f2d655b639c5a, []int{0} } func (m *EventBTCRollBack) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -83,7 +82,7 @@ func (m *EventBTCRollForward) Reset() { *m = EventBTCRollForward{} } func (m *EventBTCRollForward) String() string { return proto.CompactTextString(m) } func (*EventBTCRollForward) ProtoMessage() {} func (*EventBTCRollForward) Descriptor() ([]byte, []int) { - return fileDescriptor_dbeb7d7d6407e7ec, []int{1} + return fileDescriptor_519f2d655b639c5a, []int{1} } func (m *EventBTCRollForward) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -130,7 +129,7 @@ func (m *EventBTCHeaderInserted) Reset() { *m = EventBTCHeaderInserted{} func (m *EventBTCHeaderInserted) String() string { return proto.CompactTextString(m) } func (*EventBTCHeaderInserted) ProtoMessage() {} func (*EventBTCHeaderInserted) Descriptor() ([]byte, []int) { - return fileDescriptor_dbeb7d7d6407e7ec, []int{2} + return fileDescriptor_519f2d655b639c5a, []int{2} } func (m *EventBTCHeaderInserted) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -173,26 +172,26 @@ func init() { } func init() { - proto.RegisterFile("babylon/btclightclient/event.proto", fileDescriptor_dbeb7d7d6407e7ec) + proto.RegisterFile("babylon/btclightclient/v1/event.proto", fileDescriptor_519f2d655b639c5a) } -var fileDescriptor_dbeb7d7d6407e7ec = []byte{ - // 237 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x4a, 0x4a, 0x4c, 0xaa, +var fileDescriptor_519f2d655b639c5a = []byte{ + // 228 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x4d, 0x4a, 0x4c, 0xaa, 0xcc, 0xc9, 0xcf, 0xd3, 0x4f, 0x2a, 0x49, 0xce, 0xc9, 0x4c, 0xcf, 0x00, 0x91, 0xa9, 0x79, 0x25, - 0xfa, 0xa9, 0x65, 0xa9, 0x79, 0x25, 0x7a, 0x05, 0x45, 0xf9, 0x25, 0xf9, 0x42, 0x92, 0x50, 0x35, - 0x7a, 0xa8, 0x6a, 0xf4, 0xca, 0x0c, 0xa5, 0x44, 0xd2, 0xf3, 0xd3, 0xf3, 0xc1, 0xaa, 0xf4, 0x41, - 0x2c, 0x88, 0x06, 0x29, 0x6d, 0x1c, 0x86, 0xa2, 0xe9, 0x07, 0x2b, 0x56, 0x0a, 0xe1, 0x12, 0x70, - 0x05, 0x59, 0xe6, 0x14, 0xe2, 0x1c, 0x94, 0x9f, 0x93, 0xe3, 0x94, 0x98, 0x9c, 0x2d, 0xe4, 0xc0, - 0xc5, 0x96, 0x91, 0x9a, 0x98, 0x92, 0x5a, 0x24, 0xc1, 0xa8, 0xc0, 0xa8, 0xc1, 0x6d, 0xa4, 0xa1, - 0x87, 0xd3, 0x09, 0x7a, 0x4e, 0x21, 0xce, 0x1e, 0x60, 0xb5, 0x9e, 0x79, 0x69, 0xf9, 0x41, 0x50, - 0x7d, 0x4a, 0xe1, 0x5c, 0xc2, 0xc8, 0xa6, 0xba, 0xe5, 0x17, 0x95, 0x27, 0x16, 0xa5, 0x50, 0xc1, - 0xe0, 0x28, 0x2e, 0x31, 0x98, 0xc1, 0x30, 0xd9, 0xe2, 0xd4, 0xa2, 0x92, 0x54, 0x2a, 0x98, 0xed, - 0x14, 0x70, 0xe2, 0x91, 0x1c, 0xe3, 0x85, 0x47, 0x72, 0x8c, 0x0f, 0x1e, 0xc9, 0x31, 0x4e, 0x78, - 0x2c, 0xc7, 0x70, 0xe1, 0xb1, 0x1c, 0xc3, 0x8d, 0xc7, 0x72, 0x0c, 0x51, 0x66, 0xe9, 0x99, 0x25, - 0x19, 0xa5, 0x49, 0x7a, 0xc9, 0xf9, 0xb9, 0xfa, 0x50, 0x53, 0x93, 0x33, 0x12, 0x33, 0xf3, 0x60, - 0x1c, 0xfd, 0x0a, 0xf4, 0xb0, 0x2e, 0xa9, 0x2c, 0x48, 0x2d, 0x4e, 0x62, 0x03, 0x87, 0xb1, 0x31, - 0x20, 0x00, 0x00, 0xff, 0xff, 0x90, 0xd1, 0x66, 0xcc, 0xe7, 0x01, 0x00, 0x00, + 0xfa, 0x65, 0x86, 0xfa, 0xa9, 0x65, 0xa9, 0x79, 0x25, 0x7a, 0x05, 0x45, 0xf9, 0x25, 0xf9, 0x42, + 0x92, 0x50, 0x65, 0x7a, 0xa8, 0xca, 0xf4, 0xca, 0x0c, 0xa5, 0xf4, 0x70, 0x9b, 0x80, 0xa6, 0x18, + 0x6c, 0x94, 0x52, 0x08, 0x97, 0x80, 0x2b, 0xc8, 0x64, 0xa7, 0x10, 0xe7, 0xa0, 0xfc, 0x9c, 0x1c, + 0xa7, 0xc4, 0xe4, 0x6c, 0x21, 0x07, 0x2e, 0xb6, 0x8c, 0xd4, 0xc4, 0x94, 0xd4, 0x22, 0x09, 0x46, + 0x05, 0x46, 0x0d, 0x6e, 0x23, 0x0d, 0x3d, 0x9c, 0xf6, 0xe9, 0x39, 0x85, 0x38, 0x7b, 0x80, 0xd5, + 0x7a, 0xe6, 0xa5, 0xe5, 0x07, 0x41, 0xf5, 0x29, 0x85, 0x73, 0x09, 0x23, 0x9b, 0xea, 0x96, 0x5f, + 0x54, 0x9e, 0x58, 0x94, 0x42, 0x05, 0x83, 0xa3, 0xb8, 0xc4, 0x60, 0x06, 0xc3, 0x64, 0x8b, 0x53, + 0x8b, 0x4a, 0x52, 0xa9, 0x60, 0xb6, 0x53, 0xc0, 0x89, 0x47, 0x72, 0x8c, 0x17, 0x1e, 0xc9, 0x31, + 0x3e, 0x78, 0x24, 0xc7, 0x38, 0xe1, 0xb1, 0x1c, 0xc3, 0x85, 0xc7, 0x72, 0x0c, 0x37, 0x1e, 0xcb, + 0x31, 0x44, 0x99, 0xa5, 0x67, 0x96, 0x64, 0x94, 0x26, 0xe9, 0x25, 0xe7, 0xe7, 0xea, 0x43, 0x4d, + 0x4d, 0xce, 0x48, 0xcc, 0xcc, 0x83, 0x71, 0xf4, 0x2b, 0xd0, 0x83, 0xbb, 0xa4, 0xb2, 0x20, 0xb5, + 0x38, 0x89, 0x0d, 0x1c, 0xc6, 0xc6, 0x80, 0x00, 0x00, 0x00, 0xff, 0xff, 0x16, 0x0b, 0x33, 0xea, + 0xd7, 0x01, 0x00, 0x00, } func (m *EventBTCRollBack) Marshal() (dAtA []byte, err error) { diff --git a/x/btclightclient/types/genesis.pb.go b/x/btclightclient/types/genesis.pb.go index 983656c97..4371feddc 100644 --- a/x/btclightclient/types/genesis.pb.go +++ b/x/btclightclient/types/genesis.pb.go @@ -1,12 +1,12 @@ // Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: babylon/btclightclient/genesis.proto +// source: babylon/btclightclient/v1/genesis.proto package types import ( fmt "fmt" + _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/cosmos/gogoproto/proto" - _ "github.com/gogo/protobuf/gogoproto" io "io" math "math" math_bits "math/bits" @@ -33,7 +33,7 @@ func (m *GenesisState) Reset() { *m = GenesisState{} } func (m *GenesisState) String() string { return proto.CompactTextString(m) } func (*GenesisState) ProtoMessage() {} func (*GenesisState) Descriptor() ([]byte, []int) { - return fileDescriptor_723ed9409b965050, []int{0} + return fileDescriptor_4f95902e4096217a, []int{0} } func (m *GenesisState) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -81,28 +81,28 @@ func init() { } func init() { - proto.RegisterFile("babylon/btclightclient/genesis.proto", fileDescriptor_723ed9409b965050) + proto.RegisterFile("babylon/btclightclient/v1/genesis.proto", fileDescriptor_4f95902e4096217a) } -var fileDescriptor_723ed9409b965050 = []byte{ - // 258 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x49, 0x4a, 0x4c, 0xaa, +var fileDescriptor_4f95902e4096217a = []byte{ + // 261 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x4f, 0x4a, 0x4c, 0xaa, 0xcc, 0xc9, 0xcf, 0xd3, 0x4f, 0x2a, 0x49, 0xce, 0xc9, 0x4c, 0xcf, 0x00, 0x91, 0xa9, 0x79, 0x25, - 0xfa, 0xe9, 0xa9, 0x79, 0xa9, 0xc5, 0x99, 0xc5, 0x7a, 0x05, 0x45, 0xf9, 0x25, 0xf9, 0x42, 0x92, - 0x50, 0x55, 0x7a, 0xa8, 0xaa, 0xf4, 0xca, 0x0c, 0xa5, 0x44, 0xd2, 0xf3, 0xd3, 0xf3, 0xc1, 0xaa, - 0xf4, 0x41, 0x2c, 0x88, 0x06, 0x29, 0x65, 0x1c, 0xc6, 0x16, 0x24, 0x16, 0x25, 0xe6, 0x42, 0x4d, - 0x95, 0xd2, 0xc6, 0xa1, 0x08, 0xcd, 0x12, 0xb0, 0x62, 0xa5, 0xe5, 0x8c, 0x5c, 0x3c, 0xee, 0x10, - 0x47, 0x05, 0x97, 0x24, 0x96, 0xa4, 0x0a, 0xd9, 0x73, 0xb1, 0x41, 0x4c, 0x93, 0x60, 0x54, 0x60, - 0xd4, 0xe0, 0x36, 0x52, 0xd4, 0xc3, 0xe9, 0x48, 0xbd, 0x00, 0xb0, 0x42, 0x27, 0x96, 0x13, 0xf7, - 0xe4, 0x19, 0x82, 0xa0, 0xda, 0x84, 0xc2, 0xb8, 0xf8, 0x93, 0x12, 0x8b, 0x53, 0xe3, 0x93, 0x4a, - 0x92, 0xe3, 0x33, 0x52, 0x13, 0x53, 0x52, 0x8b, 0x24, 0x98, 0xc0, 0x26, 0x69, 0xe0, 0x31, 0xc9, - 0x29, 0xc4, 0xd9, 0x03, 0xac, 0xd6, 0x33, 0x2f, 0x2d, 0x1f, 0x6a, 0x20, 0x2f, 0xc8, 0x18, 0xa7, - 0x92, 0x64, 0x88, 0x84, 0x53, 0xc0, 0x89, 0x47, 0x72, 0x8c, 0x17, 0x1e, 0xc9, 0x31, 0x3e, 0x78, - 0x24, 0xc7, 0x38, 0xe1, 0xb1, 0x1c, 0xc3, 0x85, 0xc7, 0x72, 0x0c, 0x37, 0x1e, 0xcb, 0x31, 0x44, - 0x99, 0xa5, 0x67, 0x96, 0x64, 0x94, 0x26, 0xe9, 0x25, 0xe7, 0xe7, 0xea, 0x43, 0xad, 0x48, 0xce, - 0x48, 0xcc, 0xcc, 0x83, 0x71, 0xf4, 0x2b, 0xd0, 0x83, 0xa2, 0xa4, 0xb2, 0x20, 0xb5, 0x38, 0x89, - 0x0d, 0x1c, 0x04, 0xc6, 0x80, 0x00, 0x00, 0x00, 0xff, 0xff, 0x20, 0xd6, 0xaf, 0x9a, 0xad, 0x01, - 0x00, 0x00, + 0xfa, 0x65, 0x86, 0xfa, 0xe9, 0xa9, 0x79, 0xa9, 0xc5, 0x99, 0xc5, 0x7a, 0x05, 0x45, 0xf9, 0x25, + 0xf9, 0x42, 0x92, 0x50, 0x85, 0x7a, 0xa8, 0x0a, 0xf5, 0xca, 0x0c, 0xa5, 0x44, 0xd2, 0xf3, 0xd3, + 0xf3, 0xc1, 0xaa, 0xf4, 0x41, 0x2c, 0x88, 0x06, 0x29, 0x35, 0xdc, 0x26, 0x17, 0x24, 0x16, 0x25, + 0xe6, 0x42, 0x0d, 0x96, 0xd2, 0xc3, 0xad, 0x0e, 0xcd, 0x2a, 0xb0, 0x7a, 0xa5, 0xe5, 0x8c, 0x5c, + 0x3c, 0xee, 0x10, 0xa7, 0x05, 0x97, 0x24, 0x96, 0xa4, 0x0a, 0xd9, 0x73, 0xb1, 0x41, 0x0c, 0x94, + 0x60, 0x54, 0x60, 0xd4, 0xe0, 0x36, 0x52, 0xd4, 0xc3, 0xe9, 0x54, 0xbd, 0x00, 0xb0, 0x42, 0x27, + 0x96, 0x13, 0xf7, 0xe4, 0x19, 0x82, 0xa0, 0xda, 0x84, 0xc2, 0xb8, 0xf8, 0x93, 0x12, 0x8b, 0x53, + 0xe3, 0x93, 0x4a, 0x92, 0xe3, 0x33, 0x52, 0x13, 0x53, 0x52, 0x8b, 0x24, 0x98, 0xc0, 0x26, 0x69, + 0xe0, 0x31, 0xc9, 0x29, 0xc4, 0xd9, 0x03, 0xac, 0xd6, 0x33, 0x2f, 0x2d, 0x1f, 0x6a, 0x20, 0x2f, + 0xc8, 0x18, 0xa7, 0x92, 0x64, 0x88, 0x84, 0x53, 0xc0, 0x89, 0x47, 0x72, 0x8c, 0x17, 0x1e, 0xc9, + 0x31, 0x3e, 0x78, 0x24, 0xc7, 0x38, 0xe1, 0xb1, 0x1c, 0xc3, 0x85, 0xc7, 0x72, 0x0c, 0x37, 0x1e, + 0xcb, 0x31, 0x44, 0x99, 0xa5, 0x67, 0x96, 0x64, 0x94, 0x26, 0xe9, 0x25, 0xe7, 0xe7, 0xea, 0x43, + 0xad, 0x48, 0xce, 0x48, 0xcc, 0xcc, 0x83, 0x71, 0xf4, 0x2b, 0xd0, 0x43, 0xa3, 0xa4, 0xb2, 0x20, + 0xb5, 0x38, 0x89, 0x0d, 0x1c, 0x04, 0xc6, 0x80, 0x00, 0x00, 0x00, 0xff, 0xff, 0x47, 0x62, 0x55, + 0x1c, 0xb6, 0x01, 0x00, 0x00, } func (m *GenesisState) Marshal() (dAtA []byte, err error) { diff --git a/x/btclightclient/types/params.pb.go b/x/btclightclient/types/params.pb.go index 2d1a03ea7..86a66a2cc 100644 --- a/x/btclightclient/types/params.pb.go +++ b/x/btclightclient/types/params.pb.go @@ -1,12 +1,12 @@ // Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: babylon/btclightclient/params.proto +// source: babylon/btclightclient/v1/params.proto package types import ( fmt "fmt" + _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/cosmos/gogoproto/proto" - _ "github.com/gogo/protobuf/gogoproto" io "io" math "math" math_bits "math/bits" @@ -30,7 +30,7 @@ type Params struct { func (m *Params) Reset() { *m = Params{} } func (*Params) ProtoMessage() {} func (*Params) Descriptor() ([]byte, []int) { - return fileDescriptor_a02d211bdb249bb3, []int{0} + return fileDescriptor_1e4c5f7a17079e1f, []int{0} } func (m *Params) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -64,21 +64,22 @@ func init() { } func init() { - proto.RegisterFile("babylon/btclightclient/params.proto", fileDescriptor_a02d211bdb249bb3) + proto.RegisterFile("babylon/btclightclient/v1/params.proto", fileDescriptor_1e4c5f7a17079e1f) } -var fileDescriptor_a02d211bdb249bb3 = []byte{ - // 159 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x4e, 0x4a, 0x4c, 0xaa, +var fileDescriptor_1e4c5f7a17079e1f = []byte{ + // 162 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x4b, 0x4a, 0x4c, 0xaa, 0xcc, 0xc9, 0xcf, 0xd3, 0x4f, 0x2a, 0x49, 0xce, 0xc9, 0x4c, 0xcf, 0x00, 0x91, 0xa9, 0x79, 0x25, - 0xfa, 0x05, 0x89, 0x45, 0x89, 0xb9, 0xc5, 0x7a, 0x05, 0x45, 0xf9, 0x25, 0xf9, 0x42, 0x92, 0x50, - 0x45, 0x7a, 0xa8, 0x8a, 0xf4, 0xca, 0x0c, 0xa5, 0x44, 0xd2, 0xf3, 0xd3, 0xf3, 0xc1, 0xaa, 0xf4, - 0x41, 0x2c, 0x88, 0x06, 0x25, 0x3e, 0x2e, 0xb6, 0x00, 0xb0, 0x01, 0x56, 0x2c, 0x33, 0x16, 0xc8, - 0x33, 0x38, 0x05, 0x9c, 0x78, 0x24, 0xc7, 0x78, 0xe1, 0x91, 0x1c, 0xe3, 0x83, 0x47, 0x72, 0x8c, - 0x13, 0x1e, 0xcb, 0x31, 0x5c, 0x78, 0x2c, 0xc7, 0x70, 0xe3, 0xb1, 0x1c, 0x43, 0x94, 0x59, 0x7a, - 0x66, 0x49, 0x46, 0x69, 0x92, 0x5e, 0x72, 0x7e, 0xae, 0x3e, 0xd4, 0x96, 0xe4, 0x8c, 0xc4, 0xcc, - 0x3c, 0x18, 0x47, 0xbf, 0x02, 0xdd, 0x65, 0x25, 0x95, 0x05, 0xa9, 0xc5, 0x49, 0x6c, 0x60, 0x8b, - 0x8c, 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0x89, 0x16, 0x8f, 0x17, 0xc0, 0x00, 0x00, 0x00, + 0xfa, 0x65, 0x86, 0xfa, 0x05, 0x89, 0x45, 0x89, 0xb9, 0xc5, 0x7a, 0x05, 0x45, 0xf9, 0x25, 0xf9, + 0x42, 0x92, 0x50, 0x75, 0x7a, 0xa8, 0xea, 0xf4, 0xca, 0x0c, 0xa5, 0x44, 0xd2, 0xf3, 0xd3, 0xf3, + 0xc1, 0xaa, 0xf4, 0x41, 0x2c, 0x88, 0x06, 0x25, 0x3e, 0x2e, 0xb6, 0x00, 0xb0, 0x01, 0x56, 0x2c, + 0x33, 0x16, 0xc8, 0x33, 0x38, 0x05, 0x9c, 0x78, 0x24, 0xc7, 0x78, 0xe1, 0x91, 0x1c, 0xe3, 0x83, + 0x47, 0x72, 0x8c, 0x13, 0x1e, 0xcb, 0x31, 0x5c, 0x78, 0x2c, 0xc7, 0x70, 0xe3, 0xb1, 0x1c, 0x43, + 0x94, 0x59, 0x7a, 0x66, 0x49, 0x46, 0x69, 0x92, 0x5e, 0x72, 0x7e, 0xae, 0x3e, 0xd4, 0x96, 0xe4, + 0x8c, 0xc4, 0xcc, 0x3c, 0x18, 0x47, 0xbf, 0x02, 0xdd, 0x71, 0x25, 0x95, 0x05, 0xa9, 0xc5, 0x49, + 0x6c, 0x60, 0x8b, 0x8c, 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0xfe, 0x03, 0x9b, 0x66, 0xc3, 0x00, + 0x00, 0x00, } func (m *Params) Marshal() (dAtA []byte, err error) { diff --git a/x/btclightclient/types/query.pb.go b/x/btclightclient/types/query.pb.go index 6f8ef6cf0..6e10d98cf 100644 --- a/x/btclightclient/types/query.pb.go +++ b/x/btclightclient/types/query.pb.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: babylon/btclightclient/query.proto +// source: babylon/btclightclient/v1/query.proto package types @@ -8,9 +8,9 @@ import ( fmt "fmt" github_com_babylonchain_babylon_types "github.com/babylonchain/babylon/types" query "github.com/cosmos/cosmos-sdk/types/query" + _ "github.com/cosmos/gogoproto/gogoproto" grpc1 "github.com/cosmos/gogoproto/grpc" proto "github.com/cosmos/gogoproto/proto" - _ "github.com/gogo/protobuf/gogoproto" _ "google.golang.org/genproto/googleapis/api/annotations" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" @@ -39,7 +39,7 @@ func (m *QueryParamsRequest) Reset() { *m = QueryParamsRequest{} } func (m *QueryParamsRequest) String() string { return proto.CompactTextString(m) } func (*QueryParamsRequest) ProtoMessage() {} func (*QueryParamsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_6293be71fb7ba6c4, []int{0} + return fileDescriptor_3961270631e52721, []int{0} } func (m *QueryParamsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -78,7 +78,7 @@ func (m *QueryParamsResponse) Reset() { *m = QueryParamsResponse{} } func (m *QueryParamsResponse) String() string { return proto.CompactTextString(m) } func (*QueryParamsResponse) ProtoMessage() {} func (*QueryParamsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_6293be71fb7ba6c4, []int{1} + return fileDescriptor_3961270631e52721, []int{1} } func (m *QueryParamsResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -124,7 +124,7 @@ func (m *QueryHashesRequest) Reset() { *m = QueryHashesRequest{} } func (m *QueryHashesRequest) String() string { return proto.CompactTextString(m) } func (*QueryHashesRequest) ProtoMessage() {} func (*QueryHashesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_6293be71fb7ba6c4, []int{2} + return fileDescriptor_3961270631e52721, []int{2} } func (m *QueryHashesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -170,7 +170,7 @@ func (m *QueryHashesResponse) Reset() { *m = QueryHashesResponse{} } func (m *QueryHashesResponse) String() string { return proto.CompactTextString(m) } func (*QueryHashesResponse) ProtoMessage() {} func (*QueryHashesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_6293be71fb7ba6c4, []int{3} + return fileDescriptor_3961270631e52721, []int{3} } func (m *QueryHashesResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -216,7 +216,7 @@ func (m *QueryContainsRequest) Reset() { *m = QueryContainsRequest{} } func (m *QueryContainsRequest) String() string { return proto.CompactTextString(m) } func (*QueryContainsRequest) ProtoMessage() {} func (*QueryContainsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_6293be71fb7ba6c4, []int{4} + return fileDescriptor_3961270631e52721, []int{4} } func (m *QueryContainsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -254,7 +254,7 @@ func (m *QueryContainsResponse) Reset() { *m = QueryContainsResponse{} } func (m *QueryContainsResponse) String() string { return proto.CompactTextString(m) } func (*QueryContainsResponse) ProtoMessage() {} func (*QueryContainsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_6293be71fb7ba6c4, []int{5} + return fileDescriptor_3961270631e52721, []int{5} } func (m *QueryContainsResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -290,8 +290,8 @@ func (m *QueryContainsResponse) GetContains() bool { return false } -// QueryContainsRequest is request type for the temporary Query/ContainsBytes RPC method. -// It involves checking whether a hash is maintained by the module. +// QueryContainsRequest is request type for the temporary Query/ContainsBytes +// RPC method. It involves checking whether a hash is maintained by the module. type QueryContainsBytesRequest struct { Hash []byte `protobuf:"bytes,1,opt,name=hash,proto3" json:"hash,omitempty"` } @@ -300,7 +300,7 @@ func (m *QueryContainsBytesRequest) Reset() { *m = QueryContainsBytesReq func (m *QueryContainsBytesRequest) String() string { return proto.CompactTextString(m) } func (*QueryContainsBytesRequest) ProtoMessage() {} func (*QueryContainsBytesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_6293be71fb7ba6c4, []int{6} + return fileDescriptor_3961270631e52721, []int{6} } func (m *QueryContainsBytesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -336,7 +336,8 @@ func (m *QueryContainsBytesRequest) GetHash() []byte { return nil } -// QueryContainsResponse is response type for the temporary Query/ContainsBytes RPC method. +// QueryContainsResponse is response type for the temporary Query/ContainsBytes +// RPC method. type QueryContainsBytesResponse struct { Contains bool `protobuf:"varint,1,opt,name=contains,proto3" json:"contains,omitempty"` } @@ -345,7 +346,7 @@ func (m *QueryContainsBytesResponse) Reset() { *m = QueryContainsBytesRe func (m *QueryContainsBytesResponse) String() string { return proto.CompactTextString(m) } func (*QueryContainsBytesResponse) ProtoMessage() {} func (*QueryContainsBytesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_6293be71fb7ba6c4, []int{7} + return fileDescriptor_3961270631e52721, []int{7} } func (m *QueryContainsBytesResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -391,7 +392,7 @@ func (m *QueryMainChainRequest) Reset() { *m = QueryMainChainRequest{} } func (m *QueryMainChainRequest) String() string { return proto.CompactTextString(m) } func (*QueryMainChainRequest) ProtoMessage() {} func (*QueryMainChainRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_6293be71fb7ba6c4, []int{8} + return fileDescriptor_3961270631e52721, []int{8} } func (m *QueryMainChainRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -437,7 +438,7 @@ func (m *QueryMainChainResponse) Reset() { *m = QueryMainChainResponse{} func (m *QueryMainChainResponse) String() string { return proto.CompactTextString(m) } func (*QueryMainChainResponse) ProtoMessage() {} func (*QueryMainChainResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_6293be71fb7ba6c4, []int{9} + return fileDescriptor_3961270631e52721, []int{9} } func (m *QueryMainChainResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -487,7 +488,7 @@ func (m *QueryTipRequest) Reset() { *m = QueryTipRequest{} } func (m *QueryTipRequest) String() string { return proto.CompactTextString(m) } func (*QueryTipRequest) ProtoMessage() {} func (*QueryTipRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_6293be71fb7ba6c4, []int{10} + return fileDescriptor_3961270631e52721, []int{10} } func (m *QueryTipRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -524,7 +525,7 @@ func (m *QueryTipResponse) Reset() { *m = QueryTipResponse{} } func (m *QueryTipResponse) String() string { return proto.CompactTextString(m) } func (*QueryTipResponse) ProtoMessage() {} func (*QueryTipResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_6293be71fb7ba6c4, []int{11} + return fileDescriptor_3961270631e52721, []int{11} } func (m *QueryTipResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -567,7 +568,7 @@ func (m *QueryBaseHeaderRequest) Reset() { *m = QueryBaseHeaderRequest{} func (m *QueryBaseHeaderRequest) String() string { return proto.CompactTextString(m) } func (*QueryBaseHeaderRequest) ProtoMessage() {} func (*QueryBaseHeaderRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_6293be71fb7ba6c4, []int{12} + return fileDescriptor_3961270631e52721, []int{12} } func (m *QueryBaseHeaderRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -604,7 +605,7 @@ func (m *QueryBaseHeaderResponse) Reset() { *m = QueryBaseHeaderResponse func (m *QueryBaseHeaderResponse) String() string { return proto.CompactTextString(m) } func (*QueryBaseHeaderResponse) ProtoMessage() {} func (*QueryBaseHeaderResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_6293be71fb7ba6c4, []int{13} + return fileDescriptor_3961270631e52721, []int{13} } func (m *QueryBaseHeaderResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -658,59 +659,59 @@ func init() { } func init() { - proto.RegisterFile("babylon/btclightclient/query.proto", fileDescriptor_6293be71fb7ba6c4) -} - -var fileDescriptor_6293be71fb7ba6c4 = []byte{ - // 757 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x96, 0xc1, 0x4f, 0x13, 0x4f, - 0x14, 0xc7, 0x3b, 0xc0, 0xaf, 0xbf, 0xfa, 0xd0, 0xa8, 0x23, 0x2a, 0x6c, 0x4c, 0x81, 0x45, 0xa0, - 0x82, 0xec, 0xd2, 0xa2, 0x86, 0x83, 0x89, 0xa6, 0x24, 0x8a, 0x07, 0x93, 0xda, 0x34, 0x1e, 0xd4, - 0xc4, 0x4c, 0xeb, 0xb8, 0xbb, 0x09, 0xdd, 0x59, 0xba, 0x0b, 0xb1, 0x57, 0x0f, 0x9e, 0x8d, 0xde, - 0x3c, 0x78, 0x30, 0xf1, 0xea, 0xc9, 0x3f, 0x82, 0x93, 0x21, 0xf1, 0x62, 0x3c, 0x10, 0x03, 0xfe, - 0x21, 0x66, 0x67, 0xde, 0xb6, 0x6c, 0xb1, 0xdd, 0x25, 0x72, 0x21, 0xec, 0xec, 0x7b, 0xef, 0xfb, - 0x99, 0x6f, 0x66, 0xbe, 0x5b, 0xd0, 0xeb, 0xac, 0xde, 0xde, 0x10, 0xae, 0x59, 0x0f, 0x1a, 0x1b, - 0x8e, 0x65, 0x87, 0x7f, 0xb9, 0x1b, 0x98, 0x9b, 0x5b, 0xbc, 0xd5, 0x36, 0xbc, 0x96, 0x08, 0x04, - 0x9d, 0xc0, 0x1a, 0x23, 0x5e, 0x63, 0x6c, 0x17, 0xb5, 0x31, 0x4b, 0x58, 0x42, 0x56, 0x99, 0xe1, - 0x7f, 0xaa, 0x41, 0xbb, 0x62, 0x09, 0x61, 0x6d, 0x70, 0x93, 0x79, 0x8e, 0xc9, 0x5c, 0x57, 0x04, - 0x2c, 0x70, 0x84, 0xeb, 0xe3, 0xdb, 0x85, 0x86, 0xf0, 0x9b, 0xc2, 0x37, 0xeb, 0xcc, 0xe7, 0x4a, - 0xc7, 0xdc, 0x2e, 0xd6, 0x79, 0xc0, 0x8a, 0xa6, 0xc7, 0x2c, 0xc7, 0x95, 0xc5, 0x58, 0x3b, 0xd3, - 0x07, 0xcf, 0x63, 0x2d, 0xd6, 0x8c, 0x06, 0x2e, 0xf6, 0x29, 0xea, 0xc1, 0x95, 0xc5, 0xfa, 0x18, - 0xd0, 0x47, 0xa1, 0x66, 0x45, 0x4e, 0xa8, 0xf2, 0xcd, 0x2d, 0xee, 0x07, 0xfa, 0x63, 0xb8, 0x10, - 0x5b, 0xf5, 0x3d, 0xe1, 0xfa, 0x9c, 0xde, 0x81, 0xac, 0x52, 0x1a, 0x27, 0x53, 0xa4, 0x30, 0x5a, - 0x9a, 0x36, 0xfa, 0x5a, 0x61, 0xa8, 0xd6, 0xf2, 0xc8, 0xce, 0xde, 0x64, 0xa6, 0x8a, 0x6d, 0xfa, - 0x33, 0x54, 0x5b, 0x67, 0xbe, 0xcd, 0x23, 0x35, 0x7a, 0x0f, 0xa0, 0xbb, 0x53, 0x1c, 0x3d, 0x67, - 0x28, 0x5b, 0x8c, 0xd0, 0x16, 0x43, 0xd9, 0x8f, 0xb6, 0x18, 0x15, 0x66, 0x71, 0xec, 0xad, 0x1e, - 0xea, 0xd4, 0xbf, 0x12, 0xc4, 0x8e, 0xc6, 0x23, 0x76, 0x0d, 0xb2, 0xb6, 0x5c, 0x19, 0x27, 0x53, - 0xc3, 0x85, 0xd3, 0xe5, 0xdb, 0x3f, 0xf7, 0x26, 0x57, 0x2d, 0x27, 0xb0, 0xb7, 0xea, 0x46, 0x43, - 0x34, 0x4d, 0xdc, 0x44, 0xc3, 0x66, 0x8e, 0x1b, 0x3d, 0x98, 0x41, 0xdb, 0xe3, 0xbe, 0x51, 0xae, - 0xad, 0xad, 0x73, 0xf6, 0x82, 0xb7, 0xc2, 0x91, 0xe5, 0x76, 0xc0, 0xfd, 0x2a, 0xce, 0xa2, 0xf7, - 0x63, 0xd4, 0x43, 0x92, 0x7a, 0x3e, 0x91, 0x5a, 0x21, 0xc5, 0xb0, 0x6d, 0x18, 0x93, 0xd4, 0x6b, - 0xc2, 0x0d, 0x98, 0xe3, 0x76, 0x6c, 0xa9, 0xc0, 0x48, 0x28, 0x25, 0x0d, 0xf9, 0x57, 0x68, 0x39, - 0x49, 0x5f, 0x81, 0x8b, 0x3d, 0x4a, 0xe8, 0x90, 0x06, 0xb9, 0x06, 0xae, 0x49, 0xb9, 0x5c, 0xb5, - 0xf3, 0xac, 0x9b, 0x30, 0x11, 0x6b, 0x52, 0x03, 0x91, 0x91, 0x1e, 0x66, 0x44, 0x95, 0x55, 0xd0, - 0xfe, 0xd6, 0x90, 0x42, 0xea, 0x39, 0xf2, 0x3d, 0x64, 0x8e, 0xbb, 0x16, 0x6e, 0xec, 0xa4, 0x4f, - 0xc8, 0x67, 0x02, 0x97, 0x7a, 0x15, 0x90, 0xab, 0x0c, 0xff, 0xdb, 0xd2, 0x34, 0x75, 0x4a, 0x46, - 0x4b, 0x85, 0x01, 0x87, 0xbb, 0xe3, 0xf0, 0x03, 0xf7, 0xa5, 0xa8, 0x46, 0x8d, 0x27, 0x77, 0x24, - 0xce, 0xc3, 0x59, 0x89, 0x59, 0x73, 0xbc, 0xe8, 0x4a, 0xd6, 0xe0, 0x5c, 0x77, 0x09, 0x99, 0xef, - 0x42, 0x56, 0x49, 0xa3, 0x25, 0xe9, 0x91, 0xb1, 0x4f, 0x1f, 0x47, 0x3f, 0xca, 0xcc, 0xe7, 0xea, - 0x75, 0xa4, 0xf7, 0x14, 0x2e, 0x1f, 0x79, 0x73, 0x52, 0xb2, 0xa5, 0x6f, 0x39, 0xf8, 0x4f, 0x4e, - 0xa7, 0xef, 0x08, 0x64, 0x55, 0x54, 0xd0, 0xa5, 0x01, 0x63, 0x8e, 0x66, 0x94, 0x66, 0xa4, 0x2d, - 0x57, 0xd4, 0xfa, 0xb5, 0xd7, 0xdf, 0x7f, 0xbf, 0x1f, 0x9a, 0xa1, 0xd3, 0x66, 0x9f, 0x7c, 0xdc, - 0x2e, 0x62, 0x8e, 0x4a, 0x28, 0x95, 0x21, 0xc9, 0x50, 0xb1, 0x28, 0x4b, 0x86, 0x8a, 0x47, 0x53, - 0x2a, 0x28, 0xcc, 0x9b, 0x0f, 0x04, 0x72, 0xd1, 0x95, 0xa2, 0x66, 0x92, 0x4e, 0x4f, 0x98, 0x68, - 0xcb, 0xe9, 0x1b, 0x10, 0x6d, 0x51, 0xa2, 0xcd, 0xd2, 0x99, 0x01, 0x68, 0xd1, 0xcd, 0xa5, 0x5f, - 0x08, 0x9c, 0x89, 0xdd, 0x77, 0x7a, 0x23, 0xad, 0xe0, 0xe1, 0x3c, 0xd1, 0x6e, 0x1e, 0xb3, 0x0b, - 0x59, 0x97, 0x25, 0xeb, 0x02, 0x2d, 0xa4, 0x60, 0x55, 0x78, 0x1f, 0x09, 0x9c, 0xea, 0x84, 0x00, - 0x4d, 0x74, 0xa7, 0x37, 0x91, 0xb4, 0xe2, 0x31, 0x3a, 0x10, 0xf2, 0xba, 0x84, 0x9c, 0xa3, 0x57, - 0x07, 0x40, 0x36, 0x99, 0xa3, 0x22, 0x9d, 0xbe, 0x21, 0x30, 0x5c, 0x73, 0x3c, 0xba, 0x90, 0x24, - 0xd4, 0xcd, 0x08, 0x6d, 0x31, 0x55, 0x2d, 0xe2, 0xcc, 0x49, 0x9c, 0x29, 0x9a, 0x1f, 0x80, 0x13, - 0x38, 0x1e, 0xfd, 0x44, 0x00, 0xba, 0x21, 0x40, 0x13, 0x37, 0x7e, 0x24, 0x4a, 0xb4, 0xd2, 0x71, - 0x5a, 0x90, 0x6e, 0x49, 0xd2, 0xcd, 0xd3, 0xd9, 0x01, 0x74, 0x61, 0xa2, 0xaa, 0x40, 0x29, 0x57, - 0x76, 0xf6, 0xf3, 0x64, 0x77, 0x3f, 0x4f, 0x7e, 0xed, 0xe7, 0xc9, 0xdb, 0x83, 0x7c, 0x66, 0xf7, - 0x20, 0x9f, 0xf9, 0x71, 0x90, 0xcf, 0x3c, 0xb9, 0x95, 0xf4, 0xcd, 0x7c, 0xd5, 0x3b, 0x59, 0x7e, - 0x44, 0xeb, 0x59, 0xf9, 0xfb, 0x68, 0xe5, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x2b, 0x69, 0xef, - 0x32, 0x12, 0x0a, 0x00, 0x00, + proto.RegisterFile("babylon/btclightclient/v1/query.proto", fileDescriptor_3961270631e52721) +} + +var fileDescriptor_3961270631e52721 = []byte{ + // 755 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x96, 0x41, 0x4f, 0xd4, 0x4e, + 0x18, 0xc6, 0x77, 0x80, 0xff, 0xfe, 0xd7, 0x41, 0xa3, 0x8e, 0xa8, 0xd0, 0x98, 0x05, 0x8a, 0x2c, + 0x2b, 0x48, 0x87, 0x5d, 0xd4, 0x70, 0x30, 0xd1, 0x94, 0x44, 0xf1, 0x60, 0xb2, 0x6e, 0x36, 0x1e, + 0xd4, 0xc4, 0x4c, 0xd7, 0xb1, 0x6d, 0xc2, 0x76, 0xca, 0xb6, 0x10, 0xf7, 0xea, 0xc1, 0xb3, 0xd1, + 0x9b, 0x07, 0x0f, 0x26, 0x5e, 0x3d, 0xf9, 0x21, 0x38, 0x19, 0x12, 0x2f, 0xc6, 0x03, 0x31, 0xe0, + 0x07, 0x31, 0x9d, 0x79, 0xbb, 0x4b, 0x17, 0xd9, 0x96, 0xc8, 0x85, 0xd0, 0xe9, 0xfb, 0xbc, 0xcf, + 0x6f, 0x5e, 0x66, 0x9e, 0x82, 0x67, 0x2d, 0x66, 0x75, 0xd6, 0x85, 0x47, 0xad, 0xb0, 0xb9, 0xee, + 0xda, 0x4e, 0xf4, 0x93, 0x7b, 0x21, 0xdd, 0xaa, 0xd0, 0x8d, 0x4d, 0xde, 0xee, 0x18, 0x7e, 0x5b, + 0x84, 0x82, 0x4c, 0x40, 0x99, 0x91, 0x2c, 0x33, 0xb6, 0x2a, 0xda, 0x98, 0x2d, 0x6c, 0x21, 0xab, + 0x68, 0xf4, 0x9b, 0x12, 0x68, 0x57, 0x6c, 0x21, 0xec, 0x75, 0x4e, 0x99, 0xef, 0x52, 0xe6, 0x79, + 0x22, 0x64, 0xa1, 0x2b, 0xbc, 0x00, 0xde, 0xce, 0x37, 0x45, 0xd0, 0x12, 0x01, 0xb5, 0x58, 0xc0, + 0x95, 0x0f, 0xdd, 0xaa, 0x58, 0x3c, 0x64, 0x15, 0xea, 0x33, 0xdb, 0xf5, 0x64, 0x31, 0xd4, 0x96, + 0x8e, 0x26, 0xf4, 0x59, 0x9b, 0xb5, 0xe2, 0x9e, 0xc6, 0xd1, 0x75, 0x7d, 0xd0, 0xb2, 0x5e, 0x1f, + 0xc3, 0xe4, 0x51, 0xe4, 0x5c, 0x93, 0x4d, 0xea, 0x7c, 0x63, 0x93, 0x07, 0xa1, 0xfe, 0x18, 0x5f, + 0x48, 0xac, 0x06, 0xbe, 0xf0, 0x02, 0x4e, 0xee, 0xe0, 0xbc, 0x32, 0x1b, 0x47, 0x53, 0xa8, 0x3c, + 0x5a, 0x9d, 0x36, 0x8e, 0x1c, 0x88, 0xa1, 0xa4, 0xe6, 0xc8, 0xf6, 0xee, 0x64, 0xae, 0x0e, 0x32, + 0xfd, 0x19, 0xb8, 0xad, 0xb1, 0xc0, 0xe1, 0xb1, 0x1b, 0xb9, 0x87, 0x71, 0x6f, 0xbf, 0xd0, 0xba, + 0x64, 0xa8, 0xe1, 0x18, 0xd1, 0x70, 0x0c, 0xf5, 0x47, 0x80, 0xe1, 0x18, 0x35, 0x66, 0x73, 0xd0, + 0xd6, 0x0f, 0x28, 0xf5, 0xaf, 0x08, 0xb0, 0xe3, 0xf6, 0x80, 0xdd, 0xc0, 0x79, 0x47, 0xae, 0x8c, + 0xa3, 0xa9, 0xe1, 0xf2, 0x69, 0xf3, 0xf6, 0xcf, 0xdd, 0xc9, 0x15, 0xdb, 0x0d, 0x9d, 0x4d, 0xcb, + 0x68, 0x8a, 0x16, 0x85, 0x4d, 0x34, 0x1d, 0xe6, 0x7a, 0xf1, 0x03, 0x0d, 0x3b, 0x3e, 0x0f, 0x0c, + 0xb3, 0xb1, 0xba, 0xc6, 0xd9, 0x0b, 0xde, 0x8e, 0x5a, 0x9a, 0x9d, 0x90, 0x07, 0x75, 0xe8, 0x45, + 0xee, 0x27, 0xa8, 0x87, 0x24, 0xf5, 0x5c, 0x2a, 0xb5, 0x42, 0x4a, 0x60, 0x3b, 0x78, 0x4c, 0x52, + 0xaf, 0x0a, 0x2f, 0x64, 0xae, 0xd7, 0x1d, 0x4b, 0x0d, 0x8f, 0x44, 0x56, 0x72, 0x20, 0xff, 0x0a, + 0x2d, 0x3b, 0xe9, 0xcb, 0xf8, 0x62, 0x9f, 0x13, 0x4c, 0x48, 0xc3, 0x85, 0x26, 0xac, 0x49, 0xbb, + 0x42, 0xbd, 0xfb, 0xac, 0x53, 0x3c, 0x91, 0x10, 0xa9, 0x86, 0xc0, 0x48, 0x0e, 0x32, 0x82, 0xcb, + 0x0a, 0xd6, 0xfe, 0x26, 0xc8, 0x60, 0xf5, 0x1c, 0xf8, 0x1e, 0x32, 0xd7, 0x5b, 0x8d, 0x36, 0x76, + 0xd2, 0x27, 0xe4, 0x33, 0xc2, 0x97, 0xfa, 0x1d, 0x80, 0xcb, 0xc4, 0xff, 0x3b, 0x72, 0x68, 0xea, + 0x94, 0x8c, 0x56, 0xcb, 0x03, 0x0e, 0x77, 0x77, 0xc2, 0x0f, 0xbc, 0x97, 0xa2, 0x1e, 0x0b, 0x4f, + 0xee, 0x48, 0x9c, 0xc7, 0x67, 0x25, 0x66, 0xc3, 0xf5, 0xe3, 0x2b, 0xd9, 0xc0, 0xe7, 0x7a, 0x4b, + 0xc0, 0x7c, 0x17, 0xe7, 0x95, 0x35, 0x8c, 0x24, 0x3b, 0x32, 0xe8, 0xf4, 0x71, 0x98, 0x87, 0xc9, + 0x02, 0xae, 0x5e, 0xc7, 0x7e, 0x4f, 0xf1, 0xe5, 0x43, 0x6f, 0x4e, 0xca, 0xb6, 0xfa, 0xad, 0x80, + 0xff, 0x93, 0xdd, 0xc9, 0x3b, 0x84, 0xf3, 0x2a, 0x2a, 0xc8, 0xe2, 0x80, 0x36, 0x87, 0x33, 0x4a, + 0x33, 0xb2, 0x96, 0x2b, 0x6a, 0xfd, 0xda, 0xeb, 0xef, 0xbf, 0xdf, 0x0f, 0xcd, 0x90, 0x69, 0x9a, + 0x16, 0xa5, 0x12, 0x4a, 0x65, 0x48, 0x3a, 0x54, 0x22, 0xca, 0xd2, 0xa1, 0x92, 0xd1, 0x94, 0x09, + 0x0a, 0xf2, 0xe6, 0x03, 0xc2, 0x85, 0xf8, 0x4a, 0x11, 0x9a, 0xe6, 0xd3, 0x17, 0x26, 0xda, 0x52, + 0x76, 0x01, 0xa0, 0x2d, 0x48, 0xb4, 0x59, 0x32, 0x33, 0x00, 0x2d, 0xbe, 0xb9, 0xe4, 0x0b, 0xc2, + 0x67, 0x12, 0xf7, 0x9d, 0xdc, 0xc8, 0x6a, 0x78, 0x30, 0x4f, 0xb4, 0x9b, 0xc7, 0x54, 0x01, 0xeb, + 0x92, 0x64, 0x9d, 0x27, 0xe5, 0x0c, 0xac, 0x0a, 0xef, 0x23, 0xc2, 0xa7, 0xba, 0x21, 0x40, 0x52, + 0xa7, 0xd3, 0x9f, 0x48, 0x5a, 0xe5, 0x18, 0x0a, 0x80, 0xbc, 0x2e, 0x21, 0x4b, 0xe4, 0xea, 0x00, + 0xc8, 0x16, 0x73, 0x55, 0xa4, 0x93, 0x37, 0x08, 0x0f, 0x37, 0x5c, 0x9f, 0xcc, 0xa7, 0x19, 0xf5, + 0x32, 0x42, 0x5b, 0xc8, 0x54, 0x0b, 0x38, 0x25, 0x89, 0x33, 0x45, 0x8a, 0x03, 0x70, 0x42, 0xd7, + 0x27, 0x9f, 0x10, 0xc6, 0xbd, 0x10, 0x20, 0xa9, 0x1b, 0x3f, 0x14, 0x25, 0x5a, 0xf5, 0x38, 0x12, + 0xa0, 0x5b, 0x94, 0x74, 0x73, 0x64, 0x76, 0x00, 0x5d, 0x94, 0xa8, 0x2a, 0x50, 0xcc, 0xda, 0xf6, + 0x5e, 0x11, 0xed, 0xec, 0x15, 0xd1, 0xaf, 0xbd, 0x22, 0x7a, 0xbb, 0x5f, 0xcc, 0xed, 0xec, 0x17, + 0x73, 0x3f, 0xf6, 0x8b, 0xb9, 0x27, 0xb7, 0xd2, 0xbe, 0x99, 0xaf, 0xfa, 0x3b, 0xcb, 0x8f, 0xa8, + 0x95, 0x97, 0xff, 0x1f, 0x2d, 0xff, 0x09, 0x00, 0x00, 0xff, 0xff, 0x01, 0x5c, 0xdf, 0x45, 0x1b, + 0x0a, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -1024,7 +1025,7 @@ var _Query_serviceDesc = grpc.ServiceDesc{ }, }, Streams: []grpc.StreamDesc{}, - Metadata: "babylon/btclightclient/query.proto", + Metadata: "babylon/btclightclient/v1/query.proto", } func (m *QueryParamsRequest) Marshal() (dAtA []byte, err error) { diff --git a/x/btclightclient/types/query.pb.gw.go b/x/btclightclient/types/query.pb.gw.go index 5e200d278..d7d5dab4c 100644 --- a/x/btclightclient/types/query.pb.gw.go +++ b/x/btclightclient/types/query.pb.gw.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. -// source: babylon/btclightclient/query.proto +// source: babylon/btclightclient/v1/query.proto /* Package types is a reverse proxy. diff --git a/x/btclightclient/types/tx.pb.go b/x/btclightclient/types/tx.pb.go index bac2d0b83..6dd599807 100644 --- a/x/btclightclient/types/tx.pb.go +++ b/x/btclightclient/types/tx.pb.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: babylon/btclightclient/tx.proto +// source: babylon/btclightclient/v1/tx.proto package types @@ -7,9 +7,9 @@ import ( context "context" fmt "fmt" github_com_babylonchain_babylon_types "github.com/babylonchain/babylon/types" + _ "github.com/cosmos/gogoproto/gogoproto" grpc1 "github.com/cosmos/gogoproto/grpc" proto "github.com/cosmos/gogoproto/proto" - _ "github.com/gogo/protobuf/gogoproto" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" @@ -39,7 +39,7 @@ func (m *MsgInsertHeader) Reset() { *m = MsgInsertHeader{} } func (m *MsgInsertHeader) String() string { return proto.CompactTextString(m) } func (*MsgInsertHeader) ProtoMessage() {} func (*MsgInsertHeader) Descriptor() ([]byte, []int) { - return fileDescriptor_84e67479ce863198, []int{0} + return fileDescriptor_5f638eee60234021, []int{0} } func (m *MsgInsertHeader) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -82,7 +82,7 @@ func (m *MsgInsertHeaderResponse) Reset() { *m = MsgInsertHeaderResponse func (m *MsgInsertHeaderResponse) String() string { return proto.CompactTextString(m) } func (*MsgInsertHeaderResponse) ProtoMessage() {} func (*MsgInsertHeaderResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_84e67479ce863198, []int{1} + return fileDescriptor_5f638eee60234021, []int{1} } func (m *MsgInsertHeaderResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -116,27 +116,29 @@ func init() { proto.RegisterType((*MsgInsertHeaderResponse)(nil), "babylon.btclightclient.v1.MsgInsertHeaderResponse") } -func init() { proto.RegisterFile("babylon/btclightclient/tx.proto", fileDescriptor_84e67479ce863198) } +func init() { + proto.RegisterFile("babylon/btclightclient/v1/tx.proto", fileDescriptor_5f638eee60234021) +} -var fileDescriptor_84e67479ce863198 = []byte{ - // 270 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4f, 0x4a, 0x4c, 0xaa, +var fileDescriptor_5f638eee60234021 = []byte{ + // 265 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x4a, 0x4a, 0x4c, 0xaa, 0xcc, 0xc9, 0xcf, 0xd3, 0x4f, 0x2a, 0x49, 0xce, 0xc9, 0x4c, 0xcf, 0x00, 0x91, 0xa9, 0x79, 0x25, - 0xfa, 0x25, 0x15, 0x7a, 0x05, 0x45, 0xf9, 0x25, 0xf9, 0x42, 0x92, 0x50, 0x05, 0x7a, 0xa8, 0x0a, - 0xf4, 0xca, 0x0c, 0xa5, 0x44, 0xd2, 0xf3, 0xd3, 0xf3, 0xc1, 0xaa, 0xf4, 0x41, 0x2c, 0x88, 0x06, - 0x29, 0x6d, 0x1c, 0x26, 0xa2, 0xe9, 0x07, 0x2b, 0x56, 0xaa, 0xe6, 0xe2, 0xf7, 0x2d, 0x4e, 0xf7, - 0xcc, 0x2b, 0x4e, 0x2d, 0x2a, 0xf1, 0x48, 0x4d, 0x4c, 0x49, 0x2d, 0x12, 0x12, 0xe3, 0x62, 0x2b, - 0xce, 0x4c, 0xcf, 0x4b, 0x2d, 0x92, 0x60, 0x54, 0x60, 0xd4, 0xe0, 0x0c, 0x82, 0xf2, 0x84, 0x02, - 0xb8, 0xd8, 0x32, 0xc0, 0x2a, 0x24, 0x98, 0x14, 0x18, 0x35, 0x78, 0x9c, 0x2c, 0x6e, 0xdd, 0x93, - 0x37, 0x49, 0xcf, 0x2c, 0xc9, 0x28, 0x4d, 0xd2, 0x4b, 0xce, 0xcf, 0xd5, 0x87, 0x5a, 0x9b, 0x9c, - 0x91, 0x98, 0x99, 0x07, 0xe3, 0xe8, 0x97, 0x54, 0x16, 0xa4, 0x16, 0xeb, 0x39, 0x85, 0x38, 0x43, - 0x0c, 0x77, 0xaa, 0x2c, 0x49, 0x2d, 0x0e, 0x82, 0x9a, 0xa3, 0x24, 0xc9, 0x25, 0x8e, 0x66, 0x79, - 0x50, 0x6a, 0x71, 0x41, 0x7e, 0x5e, 0x71, 0xaa, 0x51, 0x39, 0x17, 0xb3, 0x6f, 0x71, 0xba, 0x50, - 0x01, 0x17, 0x0f, 0x8a, 0xdb, 0xb4, 0xf4, 0x70, 0x86, 0x86, 0x1e, 0x9a, 0x51, 0x52, 0x46, 0xc4, - 0xab, 0x85, 0x59, 0xab, 0xc4, 0xe0, 0x14, 0x70, 0xe2, 0x91, 0x1c, 0xe3, 0x85, 0x47, 0x72, 0x8c, - 0x0f, 0x1e, 0xc9, 0x31, 0x4e, 0x78, 0x2c, 0xc7, 0x70, 0xe1, 0xb1, 0x1c, 0xc3, 0x8d, 0xc7, 0x72, - 0x0c, 0x51, 0x66, 0x84, 0xfc, 0x5a, 0x81, 0x11, 0x87, 0x20, 0xcf, 0x27, 0xb1, 0x81, 0x43, 0xda, - 0x18, 0x10, 0x00, 0x00, 0xff, 0xff, 0x26, 0xac, 0x10, 0xa6, 0xea, 0x01, 0x00, 0x00, + 0xfa, 0x65, 0x86, 0xfa, 0x25, 0x15, 0x7a, 0x05, 0x45, 0xf9, 0x25, 0xf9, 0x42, 0x92, 0x50, 0x35, + 0x7a, 0xa8, 0x6a, 0xf4, 0xca, 0x0c, 0xa5, 0x44, 0xd2, 0xf3, 0xd3, 0xf3, 0xc1, 0xaa, 0xf4, 0x41, + 0x2c, 0x88, 0x06, 0xa5, 0x6a, 0x2e, 0x7e, 0xdf, 0xe2, 0x74, 0xcf, 0xbc, 0xe2, 0xd4, 0xa2, 0x12, + 0x8f, 0xd4, 0xc4, 0x94, 0xd4, 0x22, 0x21, 0x31, 0x2e, 0xb6, 0xe2, 0xcc, 0xf4, 0xbc, 0xd4, 0x22, + 0x09, 0x46, 0x05, 0x46, 0x0d, 0xce, 0x20, 0x28, 0x4f, 0x28, 0x80, 0x8b, 0x2d, 0x03, 0xac, 0x42, + 0x82, 0x49, 0x81, 0x51, 0x83, 0xc7, 0xc9, 0xe2, 0xd6, 0x3d, 0x79, 0x93, 0xf4, 0xcc, 0x92, 0x8c, + 0xd2, 0x24, 0xbd, 0xe4, 0xfc, 0x5c, 0x7d, 0xa8, 0xd5, 0xc9, 0x19, 0x89, 0x99, 0x79, 0x30, 0x8e, + 0x7e, 0x49, 0x65, 0x41, 0x6a, 0xb1, 0x9e, 0x53, 0x88, 0x33, 0xc4, 0x70, 0xa7, 0xca, 0x92, 0xd4, + 0xe2, 0x20, 0xa8, 0x39, 0x4a, 0x92, 0x5c, 0xe2, 0x68, 0x96, 0x07, 0xa5, 0x16, 0x17, 0xe4, 0xe7, + 0x15, 0xa7, 0x1a, 0x95, 0x73, 0x31, 0xfb, 0x16, 0xa7, 0x0b, 0x15, 0x70, 0xf1, 0xa0, 0xb8, 0x4d, + 0x4b, 0x0f, 0xa7, 0x07, 0xf5, 0xd0, 0x8c, 0x92, 0x32, 0x22, 0x5e, 0x2d, 0xcc, 0x5a, 0x25, 0x06, + 0xa7, 0x80, 0x13, 0x8f, 0xe4, 0x18, 0x2f, 0x3c, 0x92, 0x63, 0x7c, 0xf0, 0x48, 0x8e, 0x71, 0xc2, + 0x63, 0x39, 0x86, 0x0b, 0x8f, 0xe5, 0x18, 0x6e, 0x3c, 0x96, 0x63, 0x88, 0x32, 0x23, 0xe4, 0xd7, + 0x0a, 0xf4, 0x98, 0x01, 0x7b, 0x3e, 0x89, 0x0d, 0x1c, 0xd2, 0xc6, 0x80, 0x00, 0x00, 0x00, 0xff, + 0xff, 0x26, 0x30, 0x43, 0x4d, 0xc0, 0x01, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -216,7 +218,7 @@ var _Msg_serviceDesc = grpc.ServiceDesc{ }, }, Streams: []grpc.StreamDesc{}, - Metadata: "babylon/btclightclient/tx.proto", + Metadata: "babylon/btclightclient/v1/tx.proto", } func (m *MsgInsertHeader) Marshal() (dAtA []byte, err error) { diff --git a/x/checkpointing/client/cli/tx_test.go b/x/checkpointing/client/cli/tx_test.go index bb3ca58ad..0ca11aca2 100644 --- a/x/checkpointing/client/cli/tx_test.go +++ b/x/checkpointing/client/cli/tx_test.go @@ -13,7 +13,7 @@ import ( "github.com/cosmos/cosmos-sdk/testutil/mock" "github.com/golang/mock/gomock" - "github.com/gogo/protobuf/proto" + "github.com/cosmos/gogoproto/proto" "github.com/stretchr/testify/suite" "github.com/cosmos/cosmos-sdk/client" diff --git a/x/checkpointing/types/bls_key.pb.go b/x/checkpointing/types/bls_key.pb.go index a15fdd132..d42efd40d 100644 --- a/x/checkpointing/types/bls_key.pb.go +++ b/x/checkpointing/types/bls_key.pb.go @@ -1,13 +1,13 @@ // Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: babylon/checkpointing/bls_key.proto +// source: babylon/checkpointing/v1/bls_key.proto package types import ( fmt "fmt" github_com_babylonchain_babylon_crypto_bls12381 "github.com/babylonchain/babylon/crypto/bls12381" + _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/cosmos/gogoproto/proto" - _ "github.com/gogo/protobuf/gogoproto" io "io" math "math" math_bits "math/bits" @@ -36,7 +36,7 @@ func (m *BlsKey) Reset() { *m = BlsKey{} } func (m *BlsKey) String() string { return proto.CompactTextString(m) } func (*BlsKey) ProtoMessage() {} func (*BlsKey) Descriptor() ([]byte, []int) { - return fileDescriptor_a7e926461cc70111, []int{0} + return fileDescriptor_3a8c0d37ce63f038, []int{0} } func (m *BlsKey) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -72,11 +72,14 @@ func (m *BlsKey) GetPop() *ProofOfPossession { return nil } -// ProofOfPossession defines proof for the ownership of Ed25519 and BLS private keys +// ProofOfPossession defines proof for the ownership of Ed25519 and BLS private +// keys type ProofOfPossession struct { - // ed25519_sig is used for verification, ed25519_sig = sign(key = Ed25519_sk, data = BLS_pk) + // ed25519_sig is used for verification, ed25519_sig = sign(key = Ed25519_sk, + // data = BLS_pk) Ed25519Sig []byte `protobuf:"bytes,2,opt,name=ed25519_sig,json=ed25519Sig,proto3" json:"ed25519_sig,omitempty"` - // bls_sig is the result of PoP, bls_sig = sign(key = BLS_sk, data = ed25519_sig) + // bls_sig is the result of PoP, bls_sig = sign(key = BLS_sk, data = + // ed25519_sig) BlsSig *github_com_babylonchain_babylon_crypto_bls12381.Signature `protobuf:"bytes,3,opt,name=bls_sig,json=blsSig,proto3,customtype=github.com/babylonchain/babylon/crypto/bls12381.Signature" json:"bls_sig,omitempty"` } @@ -84,7 +87,7 @@ func (m *ProofOfPossession) Reset() { *m = ProofOfPossession{} } func (m *ProofOfPossession) String() string { return proto.CompactTextString(m) } func (*ProofOfPossession) ProtoMessage() {} func (*ProofOfPossession) Descriptor() ([]byte, []int) { - return fileDescriptor_a7e926461cc70111, []int{1} + return fileDescriptor_3a8c0d37ce63f038, []int{1} } func (m *ProofOfPossession) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -129,7 +132,7 @@ func (m *ValidatorWithBlsKeySet) Reset() { *m = ValidatorWithBlsKeySet{} func (m *ValidatorWithBlsKeySet) String() string { return proto.CompactTextString(m) } func (*ValidatorWithBlsKeySet) ProtoMessage() {} func (*ValidatorWithBlsKeySet) Descriptor() ([]byte, []int) { - return fileDescriptor_a7e926461cc70111, []int{2} + return fileDescriptor_3a8c0d37ce63f038, []int{2} } func (m *ValidatorWithBlsKeySet) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -165,7 +168,8 @@ func (m *ValidatorWithBlsKeySet) GetValSet() []*ValidatorWithBlsKey { return nil } -// ValidatorWithBlsKey couples validator address, voting power, and its bls public key +// ValidatorWithBlsKey couples validator address, voting power, and its bls +// public key type ValidatorWithBlsKey struct { ValidatorAddress string `protobuf:"bytes,1,opt,name=validator_address,json=validatorAddress,proto3" json:"validator_address,omitempty"` BlsPubKey []byte `protobuf:"bytes,2,opt,name=bls_pub_key,json=blsPubKey,proto3" json:"bls_pub_key,omitempty"` @@ -176,7 +180,7 @@ func (m *ValidatorWithBlsKey) Reset() { *m = ValidatorWithBlsKey{} } func (m *ValidatorWithBlsKey) String() string { return proto.CompactTextString(m) } func (*ValidatorWithBlsKey) ProtoMessage() {} func (*ValidatorWithBlsKey) Descriptor() ([]byte, []int) { - return fileDescriptor_a7e926461cc70111, []int{3} + return fileDescriptor_3a8c0d37ce63f038, []int{3} } func (m *ValidatorWithBlsKey) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -234,38 +238,39 @@ func init() { } func init() { - proto.RegisterFile("babylon/checkpointing/bls_key.proto", fileDescriptor_a7e926461cc70111) + proto.RegisterFile("babylon/checkpointing/v1/bls_key.proto", fileDescriptor_3a8c0d37ce63f038) } -var fileDescriptor_a7e926461cc70111 = []byte{ - // 430 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x52, 0x31, 0x6f, 0xd3, 0x40, - 0x18, 0xcd, 0x11, 0xe4, 0xaa, 0xe7, 0x0e, 0xd4, 0x20, 0x64, 0x31, 0xb8, 0x21, 0x2c, 0x91, 0x2a, - 0x6c, 0x25, 0x55, 0x24, 0x3a, 0x74, 0x20, 0x03, 0x4b, 0x87, 0x5a, 0x67, 0x51, 0x24, 0x16, 0x73, - 0xe7, 0x5c, 0x2f, 0xa7, 0x1c, 0xfe, 0x4e, 0xbe, 0xb3, 0xc1, 0x3f, 0x80, 0x8d, 0x81, 0x5f, 0xc0, - 0xef, 0x61, 0xec, 0x88, 0x18, 0x10, 0x4a, 0xfe, 0x08, 0xba, 0x38, 0x44, 0x02, 0x5a, 0x21, 0xb1, - 0x59, 0xef, 0x3d, 0x3f, 0xbd, 0xf7, 0xee, 0xc3, 0x4f, 0x18, 0x65, 0xad, 0x82, 0x32, 0x29, 0x16, - 0xbc, 0x58, 0x6a, 0x90, 0xa5, 0x95, 0xa5, 0x48, 0x98, 0x32, 0xf9, 0x92, 0xb7, 0xb1, 0xae, 0xc0, - 0x42, 0x10, 0x6e, 0x45, 0xf1, 0x6f, 0xa2, 0xb8, 0x19, 0x3f, 0x7a, 0x20, 0x40, 0xc0, 0x46, 0x94, - 0xb8, 0xaf, 0x4e, 0x3f, 0xfc, 0x8c, 0xb0, 0x37, 0x53, 0xe6, 0x9c, 0xb7, 0xc1, 0x4b, 0xec, 0xe9, - 0x9a, 0x2d, 0x79, 0x1b, 0xde, 0x19, 0xa0, 0xd1, 0xc1, 0xec, 0xec, 0xdb, 0xf7, 0xa3, 0x53, 0x21, - 0xed, 0xa2, 0x66, 0x71, 0x01, 0x6f, 0x93, 0xad, 0x73, 0xb1, 0xa0, 0xb2, 0x4c, 0x76, 0x59, 0xaa, - 0x56, 0x5b, 0x70, 0x21, 0xc6, 0x93, 0x93, 0x67, 0xe3, 0x38, 0xad, 0x99, 0x92, 0xc5, 0x39, 0x6f, - 0xc9, 0xd6, 0x2c, 0x38, 0xc3, 0x7d, 0x0d, 0x3a, 0xec, 0x0f, 0xd0, 0xc8, 0x9f, 0x1c, 0xc7, 0xb7, - 0xe5, 0x8b, 0xd3, 0x0a, 0xe0, 0xea, 0xe2, 0x2a, 0x05, 0x63, 0xb8, 0x31, 0x12, 0x4a, 0xe2, 0xfe, - 0x1b, 0x7e, 0x44, 0xf8, 0xf0, 0x2f, 0x2a, 0x38, 0xc2, 0x3e, 0x9f, 0x4f, 0xa6, 0xd3, 0xf1, 0x69, - 0x6e, 0xa4, 0xe8, 0x02, 0x13, 0xbc, 0x85, 0x32, 0x29, 0x82, 0x4b, 0xbc, 0xe7, 0x86, 0x71, 0x64, - 0xff, 0xff, 0xdb, 0x64, 0x52, 0x94, 0xd4, 0xd6, 0x15, 0x27, 0x1e, 0x53, 0x26, 0x93, 0x62, 0xf8, - 0x06, 0x3f, 0xbc, 0xa4, 0x4a, 0xce, 0xa9, 0x85, 0xea, 0x95, 0xb4, 0x8b, 0x6e, 0xbb, 0x8c, 0xdb, - 0xe0, 0x05, 0xde, 0x6b, 0xa8, 0xca, 0x0d, 0xb7, 0x21, 0x1a, 0xf4, 0x47, 0xfe, 0xe4, 0xe9, 0xed, - 0x5d, 0x6f, 0xb0, 0x20, 0x5e, 0x43, 0x55, 0xc6, 0xed, 0xf0, 0x03, 0xc2, 0xf7, 0x6f, 0xe0, 0x83, - 0x63, 0x7c, 0xd8, 0xfc, 0x82, 0x73, 0x3a, 0x9f, 0x57, 0xdc, 0x98, 0x10, 0x0d, 0xd0, 0x68, 0x9f, - 0xdc, 0xdb, 0x11, 0xcf, 0x3b, 0x3c, 0x88, 0xb0, 0xef, 0xea, 0xeb, 0x9a, 0xe5, 0xbb, 0x07, 0x25, - 0xfb, 0x4c, 0x99, 0xb4, 0x66, 0xce, 0xec, 0x31, 0x3e, 0x68, 0xc0, 0xa5, 0xc9, 0x35, 0xbc, 0xe3, - 0xd5, 0x66, 0xa3, 0xbb, 0xc4, 0xef, 0xb0, 0xd4, 0x41, 0xb3, 0x8b, 0x2f, 0xab, 0x08, 0x5d, 0xaf, - 0x22, 0xf4, 0x63, 0x15, 0xa1, 0x4f, 0xeb, 0xa8, 0x77, 0xbd, 0x8e, 0x7a, 0x5f, 0xd7, 0x51, 0xef, - 0xf5, 0xf4, 0x5f, 0x33, 0xbe, 0xff, 0xe3, 0x44, 0x6d, 0xab, 0xb9, 0x61, 0xde, 0xe6, 0xe2, 0x4e, - 0x7e, 0x06, 0x00, 0x00, 0xff, 0xff, 0xe5, 0xcd, 0xcb, 0x00, 0xc8, 0x02, 0x00, 0x00, +var fileDescriptor_3a8c0d37ce63f038 = []byte{ + // 433 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x52, 0x41, 0x6b, 0xd4, 0x40, + 0x18, 0xdd, 0x71, 0x25, 0xa5, 0x93, 0x1e, 0x6c, 0x14, 0x09, 0x1e, 0xd2, 0x75, 0x0f, 0xb2, 0x50, + 0x4c, 0xc8, 0x96, 0x05, 0x7b, 0xe8, 0xc1, 0x3d, 0x78, 0xe9, 0xa1, 0x21, 0xc1, 0x0a, 0x5e, 0xe2, + 0x4c, 0x76, 0x3a, 0x3b, 0xec, 0x98, 0x6f, 0xc8, 0x4c, 0xa2, 0xf9, 0x01, 0xde, 0x3c, 0xf8, 0x0b, + 0xfc, 0x3d, 0x1e, 0x7b, 0x14, 0x0f, 0x22, 0xbb, 0x7f, 0x44, 0x66, 0x13, 0x17, 0xd4, 0x16, 0xc1, + 0x5b, 0x78, 0xef, 0xe5, 0xf1, 0xde, 0x9b, 0x0f, 0x3f, 0xa1, 0x84, 0xb6, 0x12, 0xca, 0xa8, 0x58, + 0xb2, 0x62, 0xa5, 0x40, 0x94, 0x46, 0x94, 0x3c, 0x6a, 0xe2, 0x88, 0x4a, 0x9d, 0xaf, 0x58, 0x1b, + 0xaa, 0x0a, 0x0c, 0x78, 0x7e, 0xaf, 0x0b, 0x7f, 0xd3, 0x85, 0x4d, 0xfc, 0xe8, 0x01, 0x07, 0x0e, + 0x5b, 0x51, 0x64, 0xbf, 0x3a, 0xfd, 0xf8, 0x33, 0xc2, 0xce, 0x5c, 0xea, 0x73, 0xd6, 0x7a, 0x2f, + 0xb1, 0xa3, 0x6a, 0xba, 0x62, 0xad, 0x7f, 0x67, 0x84, 0x26, 0x07, 0xf3, 0xb3, 0x6f, 0xdf, 0x8f, + 0x4e, 0xb9, 0x30, 0xcb, 0x9a, 0x86, 0x05, 0xbc, 0x8d, 0x7a, 0xe7, 0x62, 0x49, 0x44, 0x19, 0xed, + 0xe2, 0x54, 0xad, 0x32, 0x60, 0x43, 0xc4, 0xd3, 0x93, 0x67, 0x71, 0x98, 0xd4, 0x54, 0x8a, 0xe2, + 0x9c, 0xb5, 0x69, 0x6f, 0xe6, 0x9d, 0xe1, 0xa1, 0x02, 0xe5, 0x0f, 0x47, 0x68, 0xe2, 0x4e, 0x8f, + 0xc3, 0xdb, 0xf2, 0x85, 0x49, 0x05, 0x70, 0x75, 0x71, 0x95, 0x80, 0xd6, 0x4c, 0x6b, 0x01, 0x65, + 0x6a, 0xff, 0x1b, 0x7f, 0x44, 0xf8, 0xf0, 0x2f, 0xca, 0x3b, 0xc2, 0x2e, 0x5b, 0x4c, 0x67, 0xb3, + 0xf8, 0x34, 0xd7, 0x82, 0x77, 0x81, 0x53, 0xdc, 0x43, 0x99, 0xe0, 0xde, 0x25, 0xde, 0xb3, 0xc3, + 0x58, 0x72, 0xf8, 0xff, 0x6d, 0x32, 0xc1, 0x4b, 0x62, 0xea, 0x8a, 0xa5, 0x0e, 0x95, 0x3a, 0x13, + 0x7c, 0xfc, 0x06, 0x3f, 0xbc, 0x24, 0x52, 0x2c, 0x88, 0x81, 0xea, 0x95, 0x30, 0xcb, 0x6e, 0xbb, + 0x8c, 0x19, 0xef, 0x05, 0xde, 0x6b, 0x88, 0xcc, 0x35, 0x33, 0x3e, 0x1a, 0x0d, 0x27, 0xee, 0xf4, + 0xe9, 0xed, 0x5d, 0x6f, 0xb0, 0x48, 0x9d, 0x86, 0xc8, 0x8c, 0x99, 0xf1, 0x07, 0x84, 0xef, 0xdf, + 0xc0, 0x7b, 0xc7, 0xf8, 0xb0, 0xf9, 0x05, 0xe7, 0x64, 0xb1, 0xa8, 0x98, 0xd6, 0x3e, 0x1a, 0xa1, + 0xc9, 0x7e, 0x7a, 0x6f, 0x47, 0x3c, 0xef, 0x70, 0x2f, 0xc0, 0xae, 0xad, 0xaf, 0x6a, 0x9a, 0xef, + 0x1e, 0x34, 0xdd, 0xa7, 0x52, 0x27, 0x35, 0xb5, 0x66, 0x8f, 0xf1, 0x41, 0x03, 0x36, 0x4d, 0xae, + 0xe0, 0x1d, 0xab, 0xb6, 0x1b, 0xdd, 0x4d, 0xdd, 0x0e, 0x4b, 0x2c, 0x34, 0xbf, 0xf8, 0xb2, 0x0e, + 0xd0, 0xf5, 0x3a, 0x40, 0x3f, 0xd6, 0x01, 0xfa, 0xb4, 0x09, 0x06, 0xd7, 0x9b, 0x60, 0xf0, 0x75, + 0x13, 0x0c, 0x5e, 0xcf, 0xfe, 0x35, 0xe3, 0xfb, 0x3f, 0xae, 0xd4, 0xb4, 0x8a, 0x69, 0xea, 0x6c, + 0x2f, 0xee, 0xe4, 0x67, 0x00, 0x00, 0x00, 0xff, 0xff, 0xb8, 0x90, 0xb1, 0x5b, 0xcb, 0x02, 0x00, + 0x00, } func (m *BlsKey) Marshal() (dAtA []byte, err error) { diff --git a/x/checkpointing/types/checkpoint.pb.go b/x/checkpointing/types/checkpoint.pb.go index bb51a3529..51b473cc0 100644 --- a/x/checkpointing/types/checkpoint.pb.go +++ b/x/checkpointing/types/checkpoint.pb.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: babylon/checkpointing/checkpoint.proto +// source: babylon/checkpointing/v1/checkpoint.proto package types @@ -7,10 +7,9 @@ import ( bytes "bytes" fmt "fmt" github_com_babylonchain_babylon_crypto_bls12381 "github.com/babylonchain/babylon/crypto/bls12381" - _ "github.com/cosmos/cosmos-proto" + _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/cosmos/gogoproto/proto" github_com_cosmos_gogoproto_types "github.com/cosmos/gogoproto/types" - _ "github.com/gogo/protobuf/gogoproto" _ "google.golang.org/protobuf/types/known/timestamppb" io "io" math "math" @@ -67,18 +66,20 @@ func (x CheckpointStatus) String() string { } func (CheckpointStatus) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_63ff05f0a47b36f7, []int{0} + return fileDescriptor_73996df9c6aabde4, []int{0} } // RawCheckpoint wraps the BLS multi sig with meta data type RawCheckpoint struct { // epoch_num defines the epoch number the raw checkpoint is for EpochNum uint64 `protobuf:"varint,1,opt,name=epoch_num,json=epochNum,proto3" json:"epoch_num,omitempty"` - // last_commit_hash defines the 'LastCommitHash' that individual BLS sigs are signed on + // last_commit_hash defines the 'LastCommitHash' that individual BLS sigs are + // signed on LastCommitHash *LastCommitHash `protobuf:"bytes,2,opt,name=last_commit_hash,json=lastCommitHash,proto3,customtype=LastCommitHash" json:"last_commit_hash,omitempty"` // bitmap defines the bitmap that indicates the signers of the BLS multi sig Bitmap []byte `protobuf:"bytes,3,opt,name=bitmap,proto3" json:"bitmap,omitempty"` - // bls_multi_sig defines the multi sig that is aggregated from individual BLS sigs + // bls_multi_sig defines the multi sig that is aggregated from individual BLS + // sigs BlsMultiSig *github_com_babylonchain_babylon_crypto_bls12381.Signature `protobuf:"bytes,4,opt,name=bls_multi_sig,json=blsMultiSig,proto3,customtype=github.com/babylonchain/babylon/crypto/bls12381.Signature" json:"bls_multi_sig,omitempty"` } @@ -86,7 +87,7 @@ func (m *RawCheckpoint) Reset() { *m = RawCheckpoint{} } func (m *RawCheckpoint) String() string { return proto.CompactTextString(m) } func (*RawCheckpoint) ProtoMessage() {} func (*RawCheckpoint) Descriptor() ([]byte, []int) { - return fileDescriptor_63ff05f0a47b36f7, []int{0} + return fileDescriptor_73996df9c6aabde4, []int{0} } func (m *RawCheckpoint) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -138,8 +139,9 @@ type RawCheckpointWithMeta struct { BlsAggrPk *github_com_babylonchain_babylon_crypto_bls12381.PublicKey `protobuf:"bytes,3,opt,name=bls_aggr_pk,json=blsAggrPk,proto3,customtype=github.com/babylonchain/babylon/crypto/bls12381.PublicKey" json:"bls_aggr_pk,omitempty"` // power_sum defines the accumulated voting power for the checkpoint PowerSum uint64 `protobuf:"varint,4,opt,name=power_sum,json=powerSum,proto3" json:"power_sum,omitempty"` - // lifecycle defines the lifecycle of this checkpoint, i.e., each state transition and - // the time (in both timestamp and block height) of this transition. + // lifecycle defines the lifecycle of this checkpoint, i.e., each state + // transition and the time (in both timestamp and block height) of this + // transition. Lifecycle []*CheckpointStateUpdate `protobuf:"bytes,5,rep,name=lifecycle,proto3" json:"lifecycle,omitempty"` } @@ -147,7 +149,7 @@ func (m *RawCheckpointWithMeta) Reset() { *m = RawCheckpointWithMeta{} } func (m *RawCheckpointWithMeta) String() string { return proto.CompactTextString(m) } func (*RawCheckpointWithMeta) ProtoMessage() {} func (*RawCheckpointWithMeta) Descriptor() ([]byte, []int) { - return fileDescriptor_63ff05f0a47b36f7, []int{1} + return fileDescriptor_73996df9c6aabde4, []int{1} } func (m *RawCheckpointWithMeta) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -207,9 +209,11 @@ func (m *RawCheckpointWithMeta) GetLifecycle() []*CheckpointStateUpdate { type CheckpointStateUpdate struct { // state defines the event of a state transition towards this state State CheckpointStatus `protobuf:"varint,1,opt,name=state,proto3,enum=babylon.checkpointing.v1.CheckpointStatus" json:"state,omitempty"` - // block_height is the height of the Babylon block that triggers the state update + // block_height is the height of the Babylon block that triggers the state + // update BlockHeight uint64 `protobuf:"varint,2,opt,name=block_height,json=blockHeight,proto3" json:"block_height,omitempty"` - // block_time is the timestamp in the Babylon block that triggers the state update + // block_time is the timestamp in the Babylon block that triggers the state + // update BlockTime *time.Time `protobuf:"bytes,3,opt,name=block_time,json=blockTime,proto3,stdtime" json:"block_time,omitempty"` } @@ -217,7 +221,7 @@ func (m *CheckpointStateUpdate) Reset() { *m = CheckpointStateUpdate{} } func (m *CheckpointStateUpdate) String() string { return proto.CompactTextString(m) } func (*CheckpointStateUpdate) ProtoMessage() {} func (*CheckpointStateUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_63ff05f0a47b36f7, []int{2} + return fileDescriptor_73996df9c6aabde4, []int{2} } func (m *CheckpointStateUpdate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -274,9 +278,10 @@ type BlsSig struct { // last_commit_hash defines the 'LastCommitHash' that the BLS sig is signed on LastCommitHash *LastCommitHash `protobuf:"bytes,2,opt,name=last_commit_hash,json=lastCommitHash,proto3,customtype=LastCommitHash" json:"last_commit_hash,omitempty"` BlsSig *github_com_babylonchain_babylon_crypto_bls12381.Signature `protobuf:"bytes,3,opt,name=bls_sig,json=blsSig,proto3,customtype=github.com/babylonchain/babylon/crypto/bls12381.Signature" json:"bls_sig,omitempty"` - // can't find cosmos_proto.scalar when compiling due to cosmos v0.45.4 does not support scalar - // string signer_address = 4 [(cosmos_proto.scalar) = "cosmos.AddressString"]; - // the signer_address defines the address of the signer + // can't find cosmos_proto.scalar when compiling due to cosmos v0.45.4 does + // not support scalar string signer_address = 4 [(cosmos_proto.scalar) = + // "cosmos.AddressString"]; the signer_address defines the address of the + // signer SignerAddress string `protobuf:"bytes,4,opt,name=signer_address,json=signerAddress,proto3" json:"signer_address,omitempty"` } @@ -284,7 +289,7 @@ func (m *BlsSig) Reset() { *m = BlsSig{} } func (m *BlsSig) String() string { return proto.CompactTextString(m) } func (*BlsSig) ProtoMessage() {} func (*BlsSig) Descriptor() ([]byte, []int) { - return fileDescriptor_63ff05f0a47b36f7, []int{3} + return fileDescriptor_73996df9c6aabde4, []int{3} } func (m *BlsSig) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -336,60 +341,59 @@ func init() { } func init() { - proto.RegisterFile("babylon/checkpointing/checkpoint.proto", fileDescriptor_63ff05f0a47b36f7) + proto.RegisterFile("babylon/checkpointing/v1/checkpoint.proto", fileDescriptor_73996df9c6aabde4) } -var fileDescriptor_63ff05f0a47b36f7 = []byte{ - // 773 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x94, 0xdb, 0x8e, 0xdb, 0x44, - 0x18, 0xc7, 0xe3, 0x5d, 0x37, 0x34, 0xb3, 0x07, 0x59, 0x23, 0x16, 0x85, 0x20, 0x25, 0x61, 0x25, - 0x20, 0xea, 0x85, 0xad, 0x4d, 0x85, 0xc4, 0x51, 0xe0, 0x1c, 0x96, 0x46, 0x4d, 0xd2, 0x95, 0x9d, - 0x80, 0x54, 0x09, 0x59, 0xe3, 0xc9, 0xec, 0x78, 0x94, 0xb1, 0xc7, 0xf2, 0x8c, 0x29, 0xe1, 0x09, - 0xd0, 0x5e, 0xf5, 0x05, 0x56, 0x42, 0xe2, 0x51, 0xb8, 0xe1, 0xb2, 0x97, 0xa8, 0x17, 0x05, 0xed, - 0xde, 0x14, 0x78, 0x09, 0xe4, 0x71, 0x7a, 0x48, 0xcb, 0x8a, 0x83, 0xe0, 0x2e, 0xdf, 0xdf, 0xff, - 0xff, 0xc4, 0xdf, 0xef, 0x9b, 0xcf, 0xe0, 0xed, 0x10, 0x85, 0x2b, 0x2e, 0x12, 0x07, 0x47, 0x04, - 0x2f, 0x53, 0xc1, 0x12, 0xc5, 0x12, 0xfa, 0x5c, 0x65, 0xa7, 0x99, 0x50, 0x02, 0xd6, 0xd7, 0x3e, - 0x7b, 0xc3, 0x67, 0x7f, 0x75, 0xd4, 0x68, 0x51, 0x21, 0x28, 0x27, 0x8e, 0xf6, 0x85, 0xf9, 0xa9, - 0xa3, 0x58, 0x4c, 0xa4, 0x42, 0x71, 0x5a, 0x46, 0x1b, 0xaf, 0x63, 0x21, 0x63, 0x21, 0x03, 0x5d, - 0x39, 0x65, 0xb1, 0x7e, 0xf4, 0x2a, 0x15, 0x54, 0x94, 0x7a, 0xf1, 0xab, 0x54, 0x0f, 0x7f, 0x37, - 0xc0, 0x9e, 0x87, 0xee, 0xf5, 0x9f, 0xfe, 0x13, 0x7c, 0x03, 0xd4, 0x48, 0x2a, 0x70, 0x14, 0x24, - 0x79, 0x5c, 0x37, 0xda, 0x46, 0xc7, 0xf4, 0xae, 0x6b, 0x61, 0x9a, 0xc7, 0xf0, 0x23, 0x60, 0x71, - 0x24, 0x55, 0x80, 0x45, 0x1c, 0x33, 0x15, 0x44, 0x48, 0x46, 0xf5, 0xad, 0xb6, 0xd1, 0xd9, 0xed, - 0xc1, 0x87, 0x8f, 0x5a, 0xfb, 0x63, 0x24, 0x55, 0x5f, 0x3f, 0xba, 0x85, 0x64, 0xe4, 0xed, 0xf3, - 0x8d, 0x1a, 0xbe, 0x06, 0xaa, 0x21, 0x53, 0x31, 0x4a, 0xeb, 0xdb, 0x45, 0xc6, 0x5b, 0x57, 0x10, - 0x81, 0xbd, 0x90, 0xcb, 0x20, 0xce, 0xb9, 0x62, 0x81, 0x64, 0xb4, 0x6e, 0xea, 0x23, 0x3f, 0x7e, - 0xf8, 0xa8, 0xf5, 0x3e, 0x65, 0x2a, 0xca, 0x43, 0x1b, 0x8b, 0xd8, 0x59, 0x63, 0xc1, 0x11, 0x62, - 0x89, 0xf3, 0x94, 0x65, 0xb6, 0x4a, 0x95, 0x70, 0x42, 0x2e, 0x8f, 0xba, 0x37, 0xdf, 0x3b, 0xb2, - 0x7d, 0x46, 0x13, 0xa4, 0xf2, 0x8c, 0x78, 0x3b, 0x21, 0x97, 0x93, 0xe2, 0x48, 0x9f, 0xd1, 0x0f, - 0xcc, 0xc7, 0xdf, 0xb5, 0x8c, 0xc3, 0x5f, 0xb7, 0xc0, 0xc1, 0x46, 0xb7, 0x5f, 0x30, 0x15, 0x4d, - 0x88, 0x42, 0xf0, 0x43, 0x60, 0xe2, 0x65, 0xaa, 0x74, 0xc3, 0x3b, 0xdd, 0x77, 0xec, 0xab, 0x46, - 0x60, 0x6f, 0xc4, 0x3d, 0x1d, 0x82, 0x3d, 0x50, 0x95, 0x0a, 0xa9, 0x5c, 0x6a, 0x16, 0xfb, 0xdd, - 0x1b, 0x57, 0xc7, 0x9f, 0x65, 0x7d, 0x9d, 0xf0, 0xd6, 0x49, 0xf8, 0x25, 0x28, 0xde, 0x37, 0x40, - 0x94, 0x66, 0x41, 0xba, 0x2c, 0x01, 0xfd, 0x3b, 0x02, 0x27, 0x79, 0xc8, 0x19, 0xbe, 0x4d, 0x56, - 0x5e, 0x2d, 0xe4, 0xd2, 0xa5, 0x34, 0x3b, 0x59, 0x16, 0x53, 0x4d, 0xc5, 0x3d, 0x92, 0x05, 0x32, - 0x8f, 0x35, 0x5e, 0xd3, 0xbb, 0xae, 0x05, 0x3f, 0x8f, 0xe1, 0x04, 0xd4, 0x38, 0x3b, 0x25, 0x78, - 0x85, 0x39, 0xa9, 0x5f, 0x6b, 0x6f, 0x77, 0x76, 0xba, 0xce, 0xdf, 0x6d, 0x81, 0xcc, 0xd3, 0x05, - 0x52, 0xc4, 0x7b, 0x76, 0xc2, 0x9a, 0xf5, 0x0f, 0x06, 0x38, 0xf8, 0x53, 0x2b, 0xfc, 0x14, 0x5c, - 0x2b, 0x9a, 0x26, 0x1a, 0xf6, 0x3f, 0xa3, 0x55, 0x06, 0xe1, 0x9b, 0x60, 0x37, 0xe4, 0x02, 0x2f, - 0x83, 0x88, 0x30, 0x1a, 0x29, 0x8d, 0xdd, 0x2c, 0x06, 0x2e, 0xf0, 0xf2, 0x96, 0x96, 0xe0, 0x27, - 0x00, 0x94, 0x96, 0x62, 0x45, 0x34, 0xce, 0x9d, 0x6e, 0xc3, 0x2e, 0xf7, 0xc7, 0x7e, 0xb2, 0x3f, - 0xf6, 0xec, 0xc9, 0xfe, 0xf4, 0xcc, 0xfb, 0x3f, 0xb7, 0x8c, 0x82, 0x98, 0xc0, 0xcb, 0x42, 0x5d, - 0x77, 0xf1, 0xd8, 0x00, 0xd5, 0x1e, 0x97, 0x3e, 0xa3, 0xff, 0xe7, 0x62, 0x7c, 0x0e, 0x5e, 0x29, - 0x86, 0x5f, 0x5c, 0xfd, 0xed, 0xff, 0xe2, 0xea, 0x57, 0xc3, 0xf2, 0x95, 0xdf, 0x02, 0xfb, 0x92, - 0xd1, 0x84, 0x64, 0x01, 0x5a, 0x2c, 0x32, 0x22, 0xa5, 0x1e, 0x7d, 0xcd, 0xdb, 0x2b, 0x55, 0xb7, - 0x14, 0x75, 0xab, 0x95, 0x1b, 0xbf, 0x19, 0xc0, 0x7a, 0x11, 0x38, 0xb4, 0x41, 0xbd, 0x7f, 0xfb, - 0x64, 0x16, 0xf8, 0x33, 0x77, 0x36, 0xf7, 0x03, 0xb7, 0xdf, 0x9f, 0x4f, 0xe6, 0x63, 0x77, 0x36, - 0x9a, 0x7e, 0x66, 0x55, 0x1a, 0xd6, 0xd9, 0x79, 0x7b, 0xd7, 0xc5, 0x38, 0x8f, 0x73, 0x8e, 0x8a, - 0xa1, 0xc1, 0x43, 0x00, 0x9f, 0xf7, 0xfb, 0x43, 0x77, 0x3c, 0x1c, 0x58, 0x46, 0x03, 0x9c, 0x9d, - 0xb7, 0xab, 0x3e, 0x41, 0x9c, 0x2c, 0x60, 0x07, 0x1c, 0x6c, 0x78, 0xe6, 0xbd, 0xc9, 0x68, 0x36, - 0x1b, 0x0e, 0xac, 0xad, 0xc6, 0xde, 0xd9, 0x79, 0xbb, 0xe6, 0xe7, 0x61, 0xcc, 0x94, 0x7a, 0xd9, - 0xd9, 0xbf, 0x33, 0x3d, 0x1e, 0x79, 0x93, 0xe1, 0xc0, 0xda, 0x2e, 0x9d, 0x7d, 0x91, 0x9c, 0xb2, - 0x2c, 0x7e, 0xd9, 0x79, 0x3c, 0x9a, 0xba, 0xe3, 0xd1, 0xdd, 0xe1, 0xc0, 0x32, 0x4b, 0xe7, 0x31, - 0x4b, 0x10, 0x67, 0xdf, 0x90, 0x45, 0xc3, 0xfc, 0xf6, 0xfb, 0x66, 0xa5, 0x77, 0xe7, 0xc7, 0x8b, - 0xa6, 0xf1, 0xe0, 0xa2, 0x69, 0xfc, 0x72, 0xd1, 0x34, 0xee, 0x5f, 0x36, 0x2b, 0x0f, 0x2e, 0x9b, - 0x95, 0x9f, 0x2e, 0x9b, 0x95, 0xbb, 0xef, 0xfe, 0x15, 0xf6, 0xaf, 0x5f, 0xf8, 0x7e, 0xab, 0x55, - 0x4a, 0x64, 0x58, 0xd5, 0x77, 0xea, 0xe6, 0x1f, 0x01, 0x00, 0x00, 0xff, 0xff, 0xf4, 0xd0, 0xbc, - 0xe5, 0xe5, 0x05, 0x00, 0x00, +var fileDescriptor_73996df9c6aabde4 = []byte{ + // 764 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x94, 0x4d, 0x8b, 0xdb, 0x46, + 0x18, 0xc7, 0xad, 0x5d, 0xc5, 0x8d, 0xc7, 0x6b, 0x23, 0x86, 0x6e, 0x31, 0x2e, 0xd8, 0xee, 0x42, + 0xa9, 0x9b, 0x83, 0x84, 0x1d, 0x0a, 0x7d, 0xa5, 0x95, 0x5f, 0xb6, 0x31, 0xb1, 0x9d, 0x45, 0xb2, + 0x5b, 0x08, 0x14, 0x31, 0x92, 0x67, 0x47, 0x83, 0x47, 0x1a, 0xa1, 0x19, 0x25, 0x75, 0x3f, 0x41, + 0xd9, 0x53, 0xbe, 0xc0, 0x42, 0xa1, 0x1f, 0xa5, 0x97, 0x1e, 0x73, 0x2c, 0x39, 0xa4, 0x65, 0xf7, + 0x92, 0xb6, 0x5f, 0xa2, 0x68, 0xe4, 0xbc, 0x38, 0xe9, 0xd2, 0x17, 0xda, 0x9b, 0xe6, 0xef, 0xff, + 0xff, 0x61, 0x9e, 0xdf, 0x33, 0x8f, 0xc1, 0xbb, 0x3e, 0xf2, 0x37, 0x8c, 0xc7, 0x56, 0x10, 0xe2, + 0x60, 0x9d, 0x70, 0x1a, 0x4b, 0x1a, 0x13, 0xeb, 0x5e, 0xef, 0x05, 0xc1, 0x4c, 0x52, 0x2e, 0x39, + 0x6c, 0x6c, 0xad, 0xe6, 0x8e, 0xd5, 0xbc, 0xd7, 0x6b, 0xb6, 0x09, 0xe7, 0x84, 0x61, 0x4b, 0xf9, + 0xfc, 0xec, 0xd4, 0x92, 0x34, 0xc2, 0x42, 0xa2, 0x28, 0x29, 0xa2, 0xcd, 0xd7, 0x09, 0x27, 0x5c, + 0x7d, 0x5a, 0xf9, 0x57, 0xa1, 0x1e, 0xfd, 0xae, 0x81, 0x9a, 0x83, 0xee, 0x0f, 0x9f, 0x95, 0x83, + 0x6f, 0x82, 0x0a, 0x4e, 0x78, 0x10, 0x7a, 0x71, 0x16, 0x35, 0xb4, 0x8e, 0xd6, 0xd5, 0x9d, 0xeb, + 0x4a, 0x98, 0x67, 0x11, 0xfc, 0x18, 0x18, 0x0c, 0x09, 0xe9, 0x05, 0x3c, 0x8a, 0xa8, 0xf4, 0x42, + 0x24, 0xc2, 0xc6, 0x5e, 0x47, 0xeb, 0x1e, 0x0c, 0xe0, 0xa3, 0xc7, 0xed, 0xfa, 0x14, 0x09, 0x39, + 0x54, 0x3f, 0xdd, 0x42, 0x22, 0x74, 0xea, 0x6c, 0xe7, 0x0c, 0xdf, 0x00, 0x65, 0x9f, 0xca, 0x08, + 0x25, 0x8d, 0xfd, 0x3c, 0xe3, 0x6c, 0x4f, 0x10, 0x81, 0x9a, 0xcf, 0x84, 0x17, 0x65, 0x4c, 0x52, + 0x4f, 0x50, 0xd2, 0xd0, 0x55, 0xc9, 0x4f, 0x1e, 0x3d, 0x6e, 0x7f, 0x40, 0xa8, 0x0c, 0x33, 0xdf, + 0x0c, 0x78, 0x64, 0x6d, 0x7b, 0x0f, 0x42, 0x44, 0x63, 0xeb, 0x19, 0xb3, 0x74, 0x93, 0x48, 0x6e, + 0xf9, 0x4c, 0xf4, 0xfa, 0x37, 0xdf, 0xef, 0x99, 0x2e, 0x25, 0x31, 0x92, 0x59, 0x8a, 0x9d, 0xaa, + 0xcf, 0xc4, 0x2c, 0x2f, 0xe9, 0x52, 0xf2, 0xa1, 0xfe, 0xe4, 0xbb, 0xb6, 0x76, 0xf4, 0xeb, 0x1e, + 0x38, 0xdc, 0xe9, 0xf6, 0x4b, 0x2a, 0xc3, 0x19, 0x96, 0x08, 0x7e, 0x04, 0xf4, 0x60, 0x9d, 0x48, + 0xd5, 0x70, 0xb5, 0xff, 0x8e, 0x79, 0x15, 0x67, 0x73, 0x27, 0xee, 0xa8, 0x10, 0x1c, 0x80, 0xb2, + 0x90, 0x48, 0x66, 0x42, 0xb1, 0xa8, 0xf7, 0x6f, 0x5c, 0x1d, 0x7f, 0x9e, 0x75, 0x55, 0xc2, 0xd9, + 0x26, 0xe1, 0x57, 0x20, 0xbf, 0xaf, 0x87, 0x08, 0x49, 0xbd, 0x64, 0x5d, 0x00, 0xfa, 0x77, 0x04, + 0x4e, 0x32, 0x9f, 0xd1, 0xe0, 0x36, 0xde, 0x38, 0x15, 0x9f, 0x09, 0x9b, 0x90, 0xf4, 0x64, 0x9d, + 0x4f, 0x35, 0xe1, 0xf7, 0x71, 0xea, 0x89, 0x2c, 0x52, 0x78, 0x75, 0xe7, 0xba, 0x12, 0xdc, 0x2c, + 0x82, 0x33, 0x50, 0x61, 0xf4, 0x14, 0x07, 0x9b, 0x80, 0xe1, 0xc6, 0xb5, 0xce, 0x7e, 0xb7, 0xda, + 0xb7, 0xfe, 0x6e, 0x0b, 0x78, 0x99, 0xac, 0x90, 0xc4, 0xce, 0xf3, 0x0a, 0x5b, 0xd6, 0x3f, 0x68, + 0xe0, 0xf0, 0x4f, 0xad, 0xf0, 0x33, 0x70, 0x2d, 0x6f, 0x1a, 0x2b, 0xd8, 0xff, 0x8c, 0x56, 0x11, + 0x84, 0x6f, 0x81, 0x03, 0x9f, 0xf1, 0x60, 0xed, 0x85, 0x98, 0x92, 0x50, 0x2a, 0xec, 0x7a, 0x3e, + 0x70, 0x1e, 0xac, 0x6f, 0x29, 0x09, 0x7e, 0x0a, 0x40, 0x61, 0xc9, 0xf7, 0x40, 0xe1, 0xac, 0xf6, + 0x9b, 0x66, 0xb1, 0x24, 0xe6, 0xd3, 0x25, 0x31, 0x17, 0x4f, 0x97, 0x64, 0xa0, 0x3f, 0xf8, 0xb9, + 0xad, 0xe5, 0xc4, 0x78, 0xb0, 0xce, 0xd5, 0x6d, 0x17, 0x4f, 0x34, 0x50, 0x1e, 0x30, 0xe1, 0x52, + 0xf2, 0x7f, 0x2e, 0xc6, 0x17, 0xe0, 0xb5, 0x7c, 0xf8, 0xf9, 0xd3, 0xdf, 0xff, 0x2f, 0x9e, 0x7e, + 0xd9, 0x2f, 0xae, 0xfc, 0x36, 0xa8, 0x0b, 0x4a, 0x62, 0x9c, 0x7a, 0x68, 0xb5, 0x4a, 0xb1, 0x10, + 0x6a, 0xf4, 0x15, 0xa7, 0x56, 0xa8, 0x76, 0x21, 0xaa, 0x56, 0x4b, 0x37, 0x7e, 0xd3, 0x80, 0xf1, + 0x32, 0x70, 0x68, 0x82, 0xc6, 0xf0, 0xf6, 0xc9, 0xc2, 0x73, 0x17, 0xf6, 0x62, 0xe9, 0x7a, 0xf6, + 0x70, 0xb8, 0x9c, 0x2d, 0xa7, 0xf6, 0x62, 0x32, 0xff, 0xdc, 0x28, 0x35, 0x8d, 0xb3, 0xf3, 0xce, + 0x81, 0x1d, 0x04, 0x59, 0x94, 0x31, 0x94, 0x0f, 0x0d, 0x1e, 0x01, 0xf8, 0xa2, 0xdf, 0x1d, 0xdb, + 0xd3, 0xf1, 0xc8, 0xd0, 0x9a, 0xe0, 0xec, 0xbc, 0x53, 0x76, 0x31, 0x62, 0x78, 0x05, 0xbb, 0xe0, + 0x70, 0xc7, 0xb3, 0x1c, 0xcc, 0x26, 0x8b, 0xc5, 0x78, 0x64, 0xec, 0x35, 0x6b, 0x67, 0xe7, 0x9d, + 0x8a, 0x9b, 0xf9, 0x11, 0x95, 0xf2, 0x55, 0xe7, 0xf0, 0xce, 0xfc, 0x78, 0xe2, 0xcc, 0xc6, 0x23, + 0x63, 0xbf, 0x70, 0x0e, 0x79, 0x7c, 0x4a, 0xd3, 0xe8, 0x55, 0xe7, 0xf1, 0x64, 0x6e, 0x4f, 0x27, + 0x77, 0xc7, 0x23, 0x43, 0x2f, 0x9c, 0xc7, 0x34, 0x46, 0x8c, 0x7e, 0x83, 0x57, 0x4d, 0xfd, 0xdb, + 0xef, 0x5b, 0xa5, 0xc1, 0x9d, 0x1f, 0x2f, 0x5a, 0xda, 0xc3, 0x8b, 0x96, 0xf6, 0xcb, 0x45, 0x4b, + 0x7b, 0x70, 0xd9, 0x2a, 0x3d, 0xbc, 0x6c, 0x95, 0x7e, 0xba, 0x6c, 0x95, 0xee, 0xbe, 0xf7, 0x57, + 0xd8, 0xbf, 0x7e, 0xe9, 0x7f, 0x5a, 0x6e, 0x12, 0x2c, 0xfc, 0xb2, 0x7a, 0x53, 0x37, 0xff, 0x08, + 0x00, 0x00, 0xff, 0xff, 0xad, 0xde, 0x97, 0x7b, 0xcd, 0x05, 0x00, 0x00, } func (this *RawCheckpoint) Equal(that interface{}) bool { diff --git a/x/checkpointing/types/events.pb.go b/x/checkpointing/types/events.pb.go index 1b528fb41..0ff869053 100644 --- a/x/checkpointing/types/events.pb.go +++ b/x/checkpointing/types/events.pb.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: babylon/checkpointing/events.proto +// source: babylon/checkpointing/v1/events.proto package types @@ -30,7 +30,7 @@ func (m *EventCheckpointAccumulating) Reset() { *m = EventCheckpointAccu func (m *EventCheckpointAccumulating) String() string { return proto.CompactTextString(m) } func (*EventCheckpointAccumulating) ProtoMessage() {} func (*EventCheckpointAccumulating) Descriptor() ([]byte, []int) { - return fileDescriptor_9d41a0fa2283f67f, []int{0} + return fileDescriptor_950b7bd81c59f78a, []int{0} } func (m *EventCheckpointAccumulating) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -74,7 +74,7 @@ func (m *EventCheckpointSealed) Reset() { *m = EventCheckpointSealed{} } func (m *EventCheckpointSealed) String() string { return proto.CompactTextString(m) } func (*EventCheckpointSealed) ProtoMessage() {} func (*EventCheckpointSealed) Descriptor() ([]byte, []int) { - return fileDescriptor_9d41a0fa2283f67f, []int{1} + return fileDescriptor_950b7bd81c59f78a, []int{1} } func (m *EventCheckpointSealed) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -118,7 +118,7 @@ func (m *EventCheckpointSubmitted) Reset() { *m = EventCheckpointSubmitt func (m *EventCheckpointSubmitted) String() string { return proto.CompactTextString(m) } func (*EventCheckpointSubmitted) ProtoMessage() {} func (*EventCheckpointSubmitted) Descriptor() ([]byte, []int) { - return fileDescriptor_9d41a0fa2283f67f, []int{2} + return fileDescriptor_950b7bd81c59f78a, []int{2} } func (m *EventCheckpointSubmitted) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -162,7 +162,7 @@ func (m *EventCheckpointConfirmed) Reset() { *m = EventCheckpointConfirm func (m *EventCheckpointConfirmed) String() string { return proto.CompactTextString(m) } func (*EventCheckpointConfirmed) ProtoMessage() {} func (*EventCheckpointConfirmed) Descriptor() ([]byte, []int) { - return fileDescriptor_9d41a0fa2283f67f, []int{3} + return fileDescriptor_950b7bd81c59f78a, []int{3} } func (m *EventCheckpointConfirmed) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -206,7 +206,7 @@ func (m *EventCheckpointFinalized) Reset() { *m = EventCheckpointFinaliz func (m *EventCheckpointFinalized) String() string { return proto.CompactTextString(m) } func (*EventCheckpointFinalized) ProtoMessage() {} func (*EventCheckpointFinalized) Descriptor() ([]byte, []int) { - return fileDescriptor_9d41a0fa2283f67f, []int{4} + return fileDescriptor_950b7bd81c59f78a, []int{4} } func (m *EventCheckpointFinalized) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -250,7 +250,7 @@ func (m *EventCheckpointForgotten) Reset() { *m = EventCheckpointForgott func (m *EventCheckpointForgotten) String() string { return proto.CompactTextString(m) } func (*EventCheckpointForgotten) ProtoMessage() {} func (*EventCheckpointForgotten) Descriptor() ([]byte, []int) { - return fileDescriptor_9d41a0fa2283f67f, []int{5} + return fileDescriptor_950b7bd81c59f78a, []int{5} } func (m *EventCheckpointForgotten) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -295,7 +295,7 @@ func (m *EventConflictingCheckpoint) Reset() { *m = EventConflictingChec func (m *EventConflictingCheckpoint) String() string { return proto.CompactTextString(m) } func (*EventConflictingCheckpoint) ProtoMessage() {} func (*EventConflictingCheckpoint) Descriptor() ([]byte, []int) { - return fileDescriptor_9d41a0fa2283f67f, []int{6} + return fileDescriptor_950b7bd81c59f78a, []int{6} } func (m *EventConflictingCheckpoint) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -349,31 +349,31 @@ func init() { } func init() { - proto.RegisterFile("babylon/checkpointing/events.proto", fileDescriptor_9d41a0fa2283f67f) + proto.RegisterFile("babylon/checkpointing/v1/events.proto", fileDescriptor_950b7bd81c59f78a) } -var fileDescriptor_9d41a0fa2283f67f = []byte{ - // 310 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x4a, 0x4a, 0x4c, 0xaa, +var fileDescriptor_950b7bd81c59f78a = []byte{ + // 314 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x4d, 0x4a, 0x4c, 0xaa, 0xcc, 0xc9, 0xcf, 0xd3, 0x4f, 0xce, 0x48, 0x4d, 0xce, 0x2e, 0xc8, 0xcf, 0xcc, 0x2b, 0xc9, 0xcc, - 0x4b, 0xd7, 0x4f, 0x2d, 0x4b, 0xcd, 0x2b, 0x29, 0xd6, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x92, - 0x80, 0xaa, 0xd1, 0x43, 0x51, 0xa3, 0x57, 0x66, 0x28, 0xa5, 0x86, 0x5d, 0x37, 0x82, 0x07, 0x31, - 0x41, 0x29, 0x8f, 0x4b, 0xda, 0x15, 0x64, 0xa2, 0x33, 0x5c, 0xc2, 0x31, 0x39, 0xb9, 0x34, 0xb7, - 0x34, 0x27, 0x11, 0xa4, 0x5e, 0xc8, 0x9f, 0x8b, 0x0b, 0xa1, 0x45, 0x82, 0x51, 0x81, 0x51, 0x83, - 0xdb, 0x48, 0x5f, 0x0f, 0x97, 0xad, 0x7a, 0x41, 0x89, 0xe5, 0x08, 0x83, 0xc2, 0x33, 0x4b, 0x32, - 0x7c, 0x53, 0x4b, 0x12, 0x83, 0x90, 0x8c, 0x50, 0xca, 0xe0, 0x12, 0x45, 0xb3, 0x2f, 0x38, 0x35, - 0x31, 0x27, 0x35, 0x85, 0xfa, 0x36, 0x65, 0x73, 0x49, 0xa0, 0xdb, 0x54, 0x9a, 0x94, 0x9b, 0x59, - 0x52, 0x42, 0x1f, 0xcb, 0x9c, 0xf3, 0xf3, 0xd2, 0x32, 0x8b, 0x72, 0xe9, 0x63, 0x99, 0x5b, 0x66, - 0x5e, 0x62, 0x4e, 0x66, 0x15, 0x9d, 0x2c, 0xcb, 0x2f, 0x4a, 0xcf, 0x2f, 0x29, 0x49, 0xcd, 0xa3, - 0xbe, 0x65, 0x37, 0x18, 0xb9, 0xa4, 0x20, 0xb6, 0xe5, 0xe7, 0xa5, 0xe5, 0x64, 0x26, 0x83, 0x74, - 0x22, 0xb4, 0x08, 0xc5, 0x71, 0x89, 0x25, 0x23, 0x24, 0xe2, 0x31, 0xec, 0x56, 0x27, 0xd2, 0xee, - 0x20, 0xd1, 0x64, 0xac, 0xe6, 0x47, 0x71, 0x09, 0xe4, 0xe4, 0x27, 0x27, 0xe6, 0x20, 0x9b, 0xcc, - 0x44, 0x9e, 0xaf, 0xf8, 0xc1, 0x06, 0x21, 0x24, 0x9c, 0xfc, 0x4f, 0x3c, 0x92, 0x63, 0xbc, 0xf0, - 0x48, 0x8e, 0xf1, 0xc1, 0x23, 0x39, 0xc6, 0x09, 0x8f, 0xe5, 0x18, 0x2e, 0x3c, 0x96, 0x63, 0xb8, - 0xf1, 0x58, 0x8e, 0x21, 0xca, 0x34, 0x3d, 0xb3, 0x24, 0xa3, 0x34, 0x49, 0x2f, 0x39, 0x3f, 0x57, - 0x1f, 0x6a, 0x4b, 0x72, 0x46, 0x62, 0x66, 0x1e, 0x8c, 0xa3, 0x5f, 0x81, 0x96, 0x89, 0x4b, 0x2a, - 0x0b, 0x52, 0x8b, 0x93, 0xd8, 0xc0, 0x19, 0xd8, 0x18, 0x10, 0x00, 0x00, 0xff, 0xff, 0x28, 0x52, - 0x61, 0xb1, 0x28, 0x04, 0x00, 0x00, + 0x4b, 0xd7, 0x2f, 0x33, 0xd4, 0x4f, 0x2d, 0x4b, 0xcd, 0x2b, 0x29, 0xd6, 0x2b, 0x28, 0xca, 0x2f, + 0xc9, 0x17, 0x92, 0x80, 0x2a, 0xd3, 0x43, 0x51, 0xa6, 0x57, 0x66, 0x28, 0xa5, 0x89, 0xd3, 0x00, + 0x84, 0x00, 0xc4, 0x10, 0xa5, 0x3c, 0x2e, 0x69, 0x57, 0x90, 0xa1, 0xce, 0x70, 0x09, 0xc7, 0xe4, + 0xe4, 0xd2, 0xdc, 0xd2, 0x9c, 0x44, 0x90, 0x16, 0x21, 0x7f, 0x2e, 0x2e, 0x84, 0x16, 0x09, 0x46, + 0x05, 0x46, 0x0d, 0x6e, 0x23, 0x7d, 0x3d, 0x5c, 0x16, 0xeb, 0x05, 0x25, 0x96, 0x23, 0x0c, 0x0a, + 0xcf, 0x2c, 0xc9, 0xf0, 0x4d, 0x2d, 0x49, 0x0c, 0x42, 0x32, 0x42, 0x29, 0x83, 0x4b, 0x14, 0xcd, + 0xbe, 0xe0, 0xd4, 0xc4, 0x9c, 0xd4, 0x14, 0xea, 0xdb, 0x94, 0xcd, 0x25, 0x81, 0x6e, 0x53, 0x69, + 0x52, 0x6e, 0x66, 0x49, 0x09, 0x7d, 0x2c, 0x73, 0xce, 0xcf, 0x4b, 0xcb, 0x2c, 0xca, 0xa5, 0x8f, + 0x65, 0x6e, 0x99, 0x79, 0x89, 0x39, 0x99, 0x55, 0x74, 0xb2, 0x2c, 0xbf, 0x28, 0x3d, 0xbf, 0xa4, + 0x24, 0x35, 0x8f, 0xfa, 0x96, 0xdd, 0x60, 0xe4, 0x92, 0x82, 0xd8, 0x96, 0x9f, 0x97, 0x96, 0x93, + 0x99, 0x0c, 0xd2, 0x89, 0xd0, 0x22, 0x14, 0xc7, 0x25, 0x96, 0x8c, 0x90, 0x88, 0xc7, 0xb0, 0x5b, + 0x9d, 0x48, 0xbb, 0x83, 0x44, 0x93, 0xb1, 0x9a, 0x1f, 0xc5, 0x25, 0x90, 0x93, 0x9f, 0x9c, 0x98, + 0x83, 0x6c, 0x32, 0x13, 0x79, 0xbe, 0xe2, 0x07, 0x1b, 0x84, 0x90, 0x70, 0xf2, 0x3f, 0xf1, 0x48, + 0x8e, 0xf1, 0xc2, 0x23, 0x39, 0xc6, 0x07, 0x8f, 0xe4, 0x18, 0x27, 0x3c, 0x96, 0x63, 0xb8, 0xf0, + 0x58, 0x8e, 0xe1, 0xc6, 0x63, 0x39, 0x86, 0x28, 0xd3, 0xf4, 0xcc, 0x92, 0x8c, 0xd2, 0x24, 0xbd, + 0xe4, 0xfc, 0x5c, 0x7d, 0xa8, 0x2d, 0xc9, 0x19, 0x89, 0x99, 0x79, 0x30, 0x8e, 0x7e, 0x05, 0x5a, + 0x3e, 0x2e, 0xa9, 0x2c, 0x48, 0x2d, 0x4e, 0x62, 0x03, 0x67, 0x60, 0x63, 0x40, 0x00, 0x00, 0x00, + 0xff, 0xff, 0x47, 0xbc, 0x3a, 0x24, 0x2e, 0x04, 0x00, 0x00, } func (m *EventCheckpointAccumulating) Marshal() (dAtA []byte, err error) { diff --git a/x/checkpointing/types/genesis.pb.go b/x/checkpointing/types/genesis.pb.go index 2e7a03129..79e9934cb 100644 --- a/x/checkpointing/types/genesis.pb.go +++ b/x/checkpointing/types/genesis.pb.go @@ -1,14 +1,13 @@ // Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: babylon/checkpointing/genesis.proto +// source: babylon/checkpointing/v1/genesis.proto package types import ( fmt "fmt" - _ "github.com/cosmos/cosmos-proto" ed25519 "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" + _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/cosmos/gogoproto/proto" - _ "github.com/gogo/protobuf/gogoproto" io "io" math "math" math_bits "math/bits" @@ -36,7 +35,7 @@ func (m *GenesisState) Reset() { *m = GenesisState{} } func (m *GenesisState) String() string { return proto.CompactTextString(m) } func (*GenesisState) ProtoMessage() {} func (*GenesisState) Descriptor() ([]byte, []int) { - return fileDescriptor_cdd0fb065da1de51, []int{0} + return fileDescriptor_bf2c524ebc9800de, []int{0} } func (m *GenesisState) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -92,7 +91,7 @@ func (m *GenesisKey) Reset() { *m = GenesisKey{} } func (m *GenesisKey) String() string { return proto.CompactTextString(m) } func (*GenesisKey) ProtoMessage() {} func (*GenesisKey) Descriptor() ([]byte, []int) { - return fileDescriptor_cdd0fb065da1de51, []int{1} + return fileDescriptor_bf2c524ebc9800de, []int{1} } func (m *GenesisKey) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -148,35 +147,35 @@ func init() { } func init() { - proto.RegisterFile("babylon/checkpointing/genesis.proto", fileDescriptor_cdd0fb065da1de51) + proto.RegisterFile("babylon/checkpointing/v1/genesis.proto", fileDescriptor_bf2c524ebc9800de) } -var fileDescriptor_cdd0fb065da1de51 = []byte{ - // 372 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x91, 0xc1, 0x4a, 0xc3, 0x30, - 0x18, 0xc7, 0xdb, 0x4d, 0x26, 0xcb, 0x76, 0xd0, 0xe2, 0xa1, 0x0e, 0xac, 0x65, 0x7a, 0x18, 0x08, - 0x09, 0x9b, 0xec, 0x30, 0x10, 0xc1, 0x5d, 0x76, 0xf0, 0xe0, 0x98, 0x37, 0x2f, 0x25, 0x69, 0x43, - 0x57, 0xd6, 0x35, 0xa5, 0xc9, 0x8a, 0x7d, 0x0b, 0x6f, 0xbe, 0x87, 0x4f, 0xb1, 0xe3, 0x8e, 0x9e, - 0x44, 0xb6, 0x17, 0x91, 0x26, 0xd9, 0x44, 0x71, 0x78, 0x6a, 0xf2, 0xe5, 0xf7, 0xff, 0xbe, 0xef, - 0xdf, 0x3f, 0xb8, 0x20, 0x98, 0x14, 0x31, 0x4b, 0x90, 0x3f, 0xa5, 0xfe, 0x2c, 0x65, 0x51, 0x22, - 0xa2, 0x24, 0x44, 0x21, 0x4d, 0x28, 0x8f, 0x38, 0x4c, 0x33, 0x26, 0x98, 0x65, 0x6b, 0x08, 0xfe, - 0x80, 0x60, 0xde, 0x6d, 0x9d, 0xfa, 0x8c, 0xcf, 0x19, 0xf7, 0x24, 0x87, 0xd4, 0x45, 0x89, 0x5a, - 0x27, 0x21, 0x0b, 0x99, 0xaa, 0x97, 0x27, 0x5d, 0x75, 0x15, 0x83, 0xfc, 0xac, 0x48, 0x05, 0x43, - 0x34, 0xe8, 0xf5, 0xfb, 0xdd, 0x01, 0x9a, 0xd1, 0x62, 0xab, 0x6b, 0xff, 0xbd, 0x51, 0x8a, 0x33, - 0x3c, 0xdf, 0x32, 0x7b, 0xb6, 0x26, 0x31, 0xf7, 0x66, 0xb4, 0x50, 0x50, 0xfb, 0xd5, 0x04, 0xcd, - 0x91, 0xf2, 0xf1, 0x28, 0xb0, 0xa0, 0xd6, 0x2d, 0xa8, 0xa9, 0x2e, 0xb6, 0xe9, 0x9a, 0x9d, 0x46, - 0xcf, 0x85, 0xfb, 0x7c, 0xc1, 0xb1, 0xe4, 0x86, 0x07, 0xcb, 0x8f, 0x73, 0x63, 0xa2, 0x55, 0xd6, - 0x08, 0x34, 0xf5, 0x7f, 0x29, 0xa7, 0x70, 0xbb, 0xe2, 0x56, 0x3b, 0x8d, 0xde, 0xe5, 0xfe, 0x2e, - 0x7a, 0xfa, 0x3d, 0x2d, 0x26, 0x8d, 0x70, 0x77, 0xe6, 0xed, 0x37, 0x13, 0x80, 0xef, 0x37, 0xeb, - 0x0a, 0x1c, 0xe7, 0x38, 0x8e, 0x02, 0x2c, 0x58, 0xe6, 0xe1, 0x20, 0xc8, 0x28, 0x57, 0x2b, 0xd6, - 0x27, 0x47, 0xbb, 0x87, 0x3b, 0x55, 0xb7, 0x06, 0xe0, 0x50, 0xdb, 0xb4, 0x2b, 0xff, 0xb9, 0x18, - 0xc6, 0x72, 0x76, 0x8d, 0xc8, 0xaf, 0x75, 0x03, 0x40, 0x8e, 0x63, 0x2f, 0x5d, 0x90, 0x52, 0x5d, - 0x95, 0xea, 0x33, 0xa8, 0x43, 0x53, 0x81, 0x40, 0x1d, 0x08, 0x1c, 0x2f, 0x48, 0x29, 0xad, 0xe7, - 0x38, 0x1e, 0x4b, 0x7e, 0xf8, 0xb0, 0x5c, 0x3b, 0xe6, 0x6a, 0xed, 0x98, 0x9f, 0x6b, 0xc7, 0x7c, - 0xd9, 0x38, 0xc6, 0x6a, 0xe3, 0x18, 0xef, 0x1b, 0xc7, 0x78, 0xea, 0x87, 0x91, 0x98, 0x2e, 0x08, - 0xf4, 0xd9, 0x1c, 0xe9, 0x5d, 0xfc, 0x29, 0x8e, 0x92, 0xed, 0x05, 0x3d, 0xff, 0xca, 0x49, 0x14, - 0x29, 0xe5, 0xa4, 0x26, 0x63, 0xba, 0xfe, 0x0a, 0x00, 0x00, 0xff, 0xff, 0x5d, 0xd1, 0xac, 0x82, - 0x83, 0x02, 0x00, 0x00, +var fileDescriptor_bf2c524ebc9800de = []byte{ + // 370 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x91, 0xc1, 0x6a, 0xea, 0x40, + 0x18, 0x85, 0x33, 0x7a, 0xf1, 0xe2, 0xe8, 0xe2, 0xde, 0x70, 0x17, 0x41, 0xb8, 0x69, 0x90, 0xb6, + 0x08, 0x85, 0x19, 0xb4, 0xb8, 0x10, 0x4a, 0xa1, 0x6e, 0x5c, 0x74, 0x51, 0xb1, 0xbb, 0x6e, 0x64, + 0x26, 0x19, 0x62, 0x30, 0x66, 0x42, 0x66, 0x0c, 0xcd, 0x5b, 0x74, 0xd7, 0xf7, 0xe8, 0x53, 0xb8, + 0x74, 0xd9, 0x55, 0x29, 0xfa, 0x22, 0x25, 0x33, 0xa3, 0xa5, 0x85, 0xd0, 0x55, 0x26, 0x99, 0xef, + 0xfc, 0xe7, 0xfc, 0x39, 0xf0, 0x9c, 0x12, 0x5a, 0xc4, 0x3c, 0xc1, 0xfe, 0x82, 0xf9, 0xcb, 0x94, + 0x47, 0x89, 0x8c, 0x92, 0x10, 0xe7, 0x7d, 0x1c, 0xb2, 0x84, 0x89, 0x48, 0xa0, 0x34, 0xe3, 0x92, + 0xdb, 0x8e, 0xe1, 0xd0, 0x17, 0x0e, 0xe5, 0xfd, 0xce, 0xbf, 0x90, 0x87, 0x5c, 0x41, 0xb8, 0x3c, + 0x69, 0xbe, 0xe3, 0xf9, 0x5c, 0xac, 0xb8, 0xc0, 0x7e, 0x56, 0xa4, 0x92, 0x63, 0x16, 0x0c, 0x86, + 0xc3, 0xfe, 0x08, 0x2f, 0x59, 0x61, 0x26, 0x76, 0xce, 0x2a, 0x9d, 0x53, 0x92, 0x91, 0xd5, 0x01, + 0xab, 0x0e, 0x48, 0x63, 0x31, 0x5f, 0xb2, 0x42, 0x73, 0xdd, 0x67, 0x00, 0xdb, 0x13, 0x1d, 0xf9, + 0x5e, 0x12, 0xc9, 0xec, 0x6b, 0xd8, 0xd0, 0x83, 0x1c, 0xe0, 0x81, 0x5e, 0x6b, 0xe0, 0xa1, 0xaa, + 0x15, 0xd0, 0x54, 0x71, 0xe3, 0x5f, 0x9b, 0xb7, 0x13, 0x6b, 0x66, 0x54, 0xf6, 0x04, 0xb6, 0xcd, + 0x2f, 0x28, 0x5d, 0x84, 0x53, 0xf3, 0xea, 0xbd, 0xd6, 0xe0, 0xb4, 0x7a, 0x8a, 0x71, 0xbf, 0x65, + 0xc5, 0xac, 0x15, 0x1e, 0xcf, 0xa2, 0xfb, 0x02, 0x20, 0xfc, 0xbc, 0xb3, 0x2f, 0xe0, 0xdf, 0x9c, + 0xc4, 0x51, 0x40, 0x24, 0xcf, 0xe6, 0x24, 0x08, 0x32, 0x26, 0x74, 0xc4, 0xe6, 0xec, 0xcf, 0xf1, + 0xe2, 0x46, 0x7f, 0xb7, 0x47, 0xf0, 0xb7, 0x59, 0xd3, 0xa9, 0xfd, 0xb4, 0xc5, 0x38, 0x56, 0xde, + 0x0d, 0xaa, 0x9e, 0xf6, 0x15, 0x84, 0x39, 0x89, 0xe7, 0xe9, 0x9a, 0x96, 0xea, 0xba, 0x52, 0xff, + 0x47, 0xba, 0x16, 0xa4, 0x6b, 0x41, 0xa6, 0x16, 0x34, 0x5d, 0xd3, 0x52, 0xda, 0xcc, 0x49, 0x3c, + 0x55, 0xfc, 0xf8, 0x6e, 0xb3, 0x73, 0xc1, 0x76, 0xe7, 0x82, 0xf7, 0x9d, 0x0b, 0x9e, 0xf6, 0xae, + 0xb5, 0xdd, 0xbb, 0xd6, 0xeb, 0xde, 0xb5, 0x1e, 0x86, 0x61, 0x24, 0x17, 0x6b, 0x8a, 0x7c, 0xbe, + 0xc2, 0x26, 0x8b, 0xbf, 0x20, 0x51, 0x72, 0x78, 0xc1, 0x8f, 0xdf, 0xaa, 0x92, 0x45, 0xca, 0x04, + 0x6d, 0xa8, 0x9a, 0x2e, 0x3f, 0x02, 0x00, 0x00, 0xff, 0xff, 0x75, 0x9e, 0x6b, 0xd7, 0x71, 0x02, + 0x00, 0x00, } func (m *GenesisState) Marshal() (dAtA []byte, err error) { diff --git a/x/checkpointing/types/params.pb.go b/x/checkpointing/types/params.pb.go index 28fb03baa..1be8611d6 100644 --- a/x/checkpointing/types/params.pb.go +++ b/x/checkpointing/types/params.pb.go @@ -1,12 +1,12 @@ // Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: babylon/checkpointing/params.proto +// source: babylon/checkpointing/v1/params.proto package types import ( fmt "fmt" + _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/cosmos/gogoproto/proto" - _ "github.com/gogo/protobuf/gogoproto" io "io" math "math" math_bits "math/bits" @@ -30,7 +30,7 @@ type Params struct { func (m *Params) Reset() { *m = Params{} } func (*Params) ProtoMessage() {} func (*Params) Descriptor() ([]byte, []int) { - return fileDescriptor_3587fe7b22c0f5bb, []int{0} + return fileDescriptor_e909869559c0a3ee, []int{0} } func (m *Params) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -64,21 +64,22 @@ func init() { } func init() { - proto.RegisterFile("babylon/checkpointing/params.proto", fileDescriptor_3587fe7b22c0f5bb) + proto.RegisterFile("babylon/checkpointing/v1/params.proto", fileDescriptor_e909869559c0a3ee) } -var fileDescriptor_3587fe7b22c0f5bb = []byte{ - // 160 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x4a, 0x4a, 0x4c, 0xaa, +var fileDescriptor_e909869559c0a3ee = []byte{ + // 163 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x4d, 0x4a, 0x4c, 0xaa, 0xcc, 0xc9, 0xcf, 0xd3, 0x4f, 0xce, 0x48, 0x4d, 0xce, 0x2e, 0xc8, 0xcf, 0xcc, 0x2b, 0xc9, 0xcc, - 0x4b, 0xd7, 0x2f, 0x48, 0x2c, 0x4a, 0xcc, 0x2d, 0xd6, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x92, - 0x80, 0xaa, 0xd1, 0x43, 0x51, 0xa3, 0x57, 0x66, 0x28, 0x25, 0x92, 0x9e, 0x9f, 0x9e, 0x0f, 0x56, - 0xa4, 0x0f, 0x62, 0x41, 0xd4, 0x2b, 0xf1, 0x71, 0xb1, 0x05, 0x80, 0xf5, 0x5b, 0xb1, 0xcc, 0x58, - 0x20, 0xcf, 0xe0, 0xe4, 0x7f, 0xe2, 0x91, 0x1c, 0xe3, 0x85, 0x47, 0x72, 0x8c, 0x0f, 0x1e, 0xc9, - 0x31, 0x4e, 0x78, 0x2c, 0xc7, 0x70, 0xe1, 0xb1, 0x1c, 0xc3, 0x8d, 0xc7, 0x72, 0x0c, 0x51, 0xa6, - 0xe9, 0x99, 0x25, 0x19, 0xa5, 0x49, 0x7a, 0xc9, 0xf9, 0xb9, 0xfa, 0x50, 0x4b, 0x92, 0x33, 0x12, - 0x33, 0xf3, 0x60, 0x1c, 0xfd, 0x0a, 0x34, 0x77, 0x95, 0x54, 0x16, 0xa4, 0x16, 0x27, 0xb1, 0x81, - 0xed, 0x31, 0x06, 0x04, 0x00, 0x00, 0xff, 0xff, 0x15, 0x10, 0xfe, 0xa5, 0xbd, 0x00, 0x00, 0x00, + 0x4b, 0xd7, 0x2f, 0x33, 0xd4, 0x2f, 0x48, 0x2c, 0x4a, 0xcc, 0x2d, 0xd6, 0x2b, 0x28, 0xca, 0x2f, + 0xc9, 0x17, 0x92, 0x80, 0x2a, 0xd3, 0x43, 0x51, 0xa6, 0x57, 0x66, 0x28, 0x25, 0x92, 0x9e, 0x9f, + 0x9e, 0x0f, 0x56, 0xa4, 0x0f, 0x62, 0x41, 0xd4, 0x2b, 0xf1, 0x71, 0xb1, 0x05, 0x80, 0xf5, 0x5b, + 0xb1, 0xcc, 0x58, 0x20, 0xcf, 0xe0, 0xe4, 0x7f, 0xe2, 0x91, 0x1c, 0xe3, 0x85, 0x47, 0x72, 0x8c, + 0x0f, 0x1e, 0xc9, 0x31, 0x4e, 0x78, 0x2c, 0xc7, 0x70, 0xe1, 0xb1, 0x1c, 0xc3, 0x8d, 0xc7, 0x72, + 0x0c, 0x51, 0xa6, 0xe9, 0x99, 0x25, 0x19, 0xa5, 0x49, 0x7a, 0xc9, 0xf9, 0xb9, 0xfa, 0x50, 0x4b, + 0x92, 0x33, 0x12, 0x33, 0xf3, 0x60, 0x1c, 0xfd, 0x0a, 0x34, 0xa7, 0x95, 0x54, 0x16, 0xa4, 0x16, + 0x27, 0xb1, 0x81, 0xed, 0x31, 0x06, 0x04, 0x00, 0x00, 0xff, 0xff, 0x2d, 0x69, 0xd9, 0x00, 0xc0, + 0x00, 0x00, 0x00, } func (m *Params) Marshal() (dAtA []byte, err error) { diff --git a/x/checkpointing/types/query.pb.go b/x/checkpointing/types/query.pb.go index 0422e9637..fdab80cde 100644 --- a/x/checkpointing/types/query.pb.go +++ b/x/checkpointing/types/query.pb.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: babylon/checkpointing/query.proto +// source: babylon/checkpointing/v1/query.proto package types @@ -7,9 +7,9 @@ import ( context "context" fmt "fmt" query "github.com/cosmos/cosmos-sdk/types/query" + _ "github.com/cosmos/gogoproto/gogoproto" grpc1 "github.com/cosmos/gogoproto/grpc" proto "github.com/cosmos/gogoproto/proto" - _ "github.com/gogo/protobuf/gogoproto" _ "google.golang.org/genproto/googleapis/api/annotations" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" @@ -30,8 +30,8 @@ var _ = math.Inf // proto package needs to be updated. const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package -// QueryRawCheckpointListRequest is the request type for the Query/RawCheckpoints -// RPC method. +// QueryRawCheckpointListRequest is the request type for the +// Query/RawCheckpoints RPC method. type QueryRawCheckpointListRequest struct { // status defines the status of the raw checkpoints of the query Status CheckpointStatus `protobuf:"varint,1,opt,name=status,proto3,enum=babylon.checkpointing.v1.CheckpointStatus" json:"status,omitempty"` @@ -43,7 +43,7 @@ func (m *QueryRawCheckpointListRequest) Reset() { *m = QueryRawCheckpoin func (m *QueryRawCheckpointListRequest) String() string { return proto.CompactTextString(m) } func (*QueryRawCheckpointListRequest) ProtoMessage() {} func (*QueryRawCheckpointListRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_a0fdb8f0f85bb51e, []int{0} + return fileDescriptor_113f1ca5c3c2ca44, []int{0} } func (m *QueryRawCheckpointListRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -86,8 +86,8 @@ func (m *QueryRawCheckpointListRequest) GetPagination() *query.PageRequest { return nil } -// QueryRawCheckpointListResponse is the response type for the Query/RawCheckpoints -// RPC method. +// QueryRawCheckpointListResponse is the response type for the +// Query/RawCheckpoints RPC method. type QueryRawCheckpointListResponse struct { // the order is going from the newest to oldest based on the epoch number RawCheckpoints []*RawCheckpointWithMeta `protobuf:"bytes,1,rep,name=raw_checkpoints,json=rawCheckpoints,proto3" json:"raw_checkpoints,omitempty"` @@ -99,7 +99,7 @@ func (m *QueryRawCheckpointListResponse) Reset() { *m = QueryRawCheckpoi func (m *QueryRawCheckpointListResponse) String() string { return proto.CompactTextString(m) } func (*QueryRawCheckpointListResponse) ProtoMessage() {} func (*QueryRawCheckpointListResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_a0fdb8f0f85bb51e, []int{1} + return fileDescriptor_113f1ca5c3c2ca44, []int{1} } func (m *QueryRawCheckpointListResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -153,7 +153,7 @@ func (m *QueryRawCheckpointRequest) Reset() { *m = QueryRawCheckpointReq func (m *QueryRawCheckpointRequest) String() string { return proto.CompactTextString(m) } func (*QueryRawCheckpointRequest) ProtoMessage() {} func (*QueryRawCheckpointRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_a0fdb8f0f85bb51e, []int{2} + return fileDescriptor_113f1ca5c3c2ca44, []int{2} } func (m *QueryRawCheckpointRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -199,7 +199,7 @@ func (m *QueryRawCheckpointResponse) Reset() { *m = QueryRawCheckpointRe func (m *QueryRawCheckpointResponse) String() string { return proto.CompactTextString(m) } func (*QueryRawCheckpointResponse) ProtoMessage() {} func (*QueryRawCheckpointResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_a0fdb8f0f85bb51e, []int{3} + return fileDescriptor_113f1ca5c3c2ca44, []int{3} } func (m *QueryRawCheckpointResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -248,7 +248,7 @@ func (m *QueryBlsPublicKeyListRequest) Reset() { *m = QueryBlsPublicKeyL func (m *QueryBlsPublicKeyListRequest) String() string { return proto.CompactTextString(m) } func (*QueryBlsPublicKeyListRequest) ProtoMessage() {} func (*QueryBlsPublicKeyListRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_a0fdb8f0f85bb51e, []int{4} + return fileDescriptor_113f1ca5c3c2ca44, []int{4} } func (m *QueryBlsPublicKeyListRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -291,8 +291,8 @@ func (m *QueryBlsPublicKeyListRequest) GetPagination() *query.PageRequest { return nil } -// QueryBlsPublicKeyListResponse is the response type for the Query/BlsPublicKeys -// RPC method. +// QueryBlsPublicKeyListResponse is the response type for the +// Query/BlsPublicKeys RPC method. type QueryBlsPublicKeyListResponse struct { ValidatorWithBlsKeys []*ValidatorWithBlsKey `protobuf:"bytes,1,rep,name=validator_with_bls_keys,json=validatorWithBlsKeys,proto3" json:"validator_with_bls_keys,omitempty"` // pagination defines the pagination in the response. @@ -303,7 +303,7 @@ func (m *QueryBlsPublicKeyListResponse) Reset() { *m = QueryBlsPublicKey func (m *QueryBlsPublicKeyListResponse) String() string { return proto.CompactTextString(m) } func (*QueryBlsPublicKeyListResponse) ProtoMessage() {} func (*QueryBlsPublicKeyListResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_a0fdb8f0f85bb51e, []int{5} + return fileDescriptor_113f1ca5c3c2ca44, []int{5} } func (m *QueryBlsPublicKeyListResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -356,7 +356,7 @@ func (m *QueryEpochStatusRequest) Reset() { *m = QueryEpochStatusRequest func (m *QueryEpochStatusRequest) String() string { return proto.CompactTextString(m) } func (*QueryEpochStatusRequest) ProtoMessage() {} func (*QueryEpochStatusRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_a0fdb8f0f85bb51e, []int{6} + return fileDescriptor_113f1ca5c3c2ca44, []int{6} } func (m *QueryEpochStatusRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -402,7 +402,7 @@ func (m *QueryEpochStatusResponse) Reset() { *m = QueryEpochStatusRespon func (m *QueryEpochStatusResponse) String() string { return proto.CompactTextString(m) } func (*QueryEpochStatusResponse) ProtoMessage() {} func (*QueryEpochStatusResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_a0fdb8f0f85bb51e, []int{7} + return fileDescriptor_113f1ca5c3c2ca44, []int{7} } func (m *QueryEpochStatusResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -438,10 +438,11 @@ func (m *QueryEpochStatusResponse) GetStatus() CheckpointStatus { return Accumulating } -// QueryRecentEpochStatusCountRequest is the request type for the Query/EpochStatusCount -// RPC method. +// QueryRecentEpochStatusCountRequest is the request type for the +// Query/EpochStatusCount RPC method. type QueryRecentEpochStatusCountRequest struct { - // epoch_count is the number of the most recent epochs to include in the aggregation + // epoch_count is the number of the most recent epochs to include in the + // aggregation EpochCount uint64 `protobuf:"varint,1,opt,name=epoch_count,json=epochCount,proto3" json:"epoch_count,omitempty"` } @@ -449,7 +450,7 @@ func (m *QueryRecentEpochStatusCountRequest) Reset() { *m = QueryRecentE func (m *QueryRecentEpochStatusCountRequest) String() string { return proto.CompactTextString(m) } func (*QueryRecentEpochStatusCountRequest) ProtoMessage() {} func (*QueryRecentEpochStatusCountRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_a0fdb8f0f85bb51e, []int{8} + return fileDescriptor_113f1ca5c3c2ca44, []int{8} } func (m *QueryRecentEpochStatusCountRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -485,8 +486,8 @@ func (m *QueryRecentEpochStatusCountRequest) GetEpochCount() uint64 { return 0 } -// QueryRecentEpochStatusCountResponse is the response type for the Query/EpochStatusCount -// RPC method. +// QueryRecentEpochStatusCountResponse is the response type for the +// Query/EpochStatusCount RPC method. type QueryRecentEpochStatusCountResponse struct { TipEpoch uint64 `protobuf:"varint,1,opt,name=tip_epoch,json=tipEpoch,proto3" json:"tip_epoch,omitempty"` EpochCount uint64 `protobuf:"varint,2,opt,name=epoch_count,json=epochCount,proto3" json:"epoch_count,omitempty"` @@ -497,7 +498,7 @@ func (m *QueryRecentEpochStatusCountResponse) Reset() { *m = QueryRecent func (m *QueryRecentEpochStatusCountResponse) String() string { return proto.CompactTextString(m) } func (*QueryRecentEpochStatusCountResponse) ProtoMessage() {} func (*QueryRecentEpochStatusCountResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_a0fdb8f0f85bb51e, []int{9} + return fileDescriptor_113f1ca5c3c2ca44, []int{9} } func (m *QueryRecentEpochStatusCountResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -555,7 +556,7 @@ func (m *QueryLastCheckpointWithStatusRequest) Reset() { *m = QueryLastC func (m *QueryLastCheckpointWithStatusRequest) String() string { return proto.CompactTextString(m) } func (*QueryLastCheckpointWithStatusRequest) ProtoMessage() {} func (*QueryLastCheckpointWithStatusRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_a0fdb8f0f85bb51e, []int{10} + return fileDescriptor_113f1ca5c3c2ca44, []int{10} } func (m *QueryLastCheckpointWithStatusRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -599,7 +600,7 @@ func (m *QueryLastCheckpointWithStatusResponse) Reset() { *m = QueryLast func (m *QueryLastCheckpointWithStatusResponse) String() string { return proto.CompactTextString(m) } func (*QueryLastCheckpointWithStatusResponse) ProtoMessage() {} func (*QueryLastCheckpointWithStatusResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_a0fdb8f0f85bb51e, []int{11} + return fileDescriptor_113f1ca5c3c2ca44, []int{11} } func (m *QueryLastCheckpointWithStatusResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -643,7 +644,7 @@ func (m *QueryParamsRequest) Reset() { *m = QueryParamsRequest{} } func (m *QueryParamsRequest) String() string { return proto.CompactTextString(m) } func (*QueryParamsRequest) ProtoMessage() {} func (*QueryParamsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_a0fdb8f0f85bb51e, []int{12} + return fileDescriptor_113f1ca5c3c2ca44, []int{12} } func (m *QueryParamsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -682,7 +683,7 @@ func (m *QueryParamsResponse) Reset() { *m = QueryParamsResponse{} } func (m *QueryParamsResponse) String() string { return proto.CompactTextString(m) } func (*QueryParamsResponse) ProtoMessage() {} func (*QueryParamsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_a0fdb8f0f85bb51e, []int{13} + return fileDescriptor_113f1ca5c3c2ca44, []int{13} } func (m *QueryParamsResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -736,71 +737,73 @@ func init() { proto.RegisterType((*QueryParamsResponse)(nil), "babylon.checkpointing.v1.QueryParamsResponse") } -func init() { proto.RegisterFile("babylon/checkpointing/query.proto", fileDescriptor_a0fdb8f0f85bb51e) } - -var fileDescriptor_a0fdb8f0f85bb51e = []byte{ - // 974 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x57, 0x5f, 0x6f, 0xdb, 0x54, - 0x14, 0xaf, 0xd3, 0xad, 0xa2, 0x27, 0xac, 0x94, 0x4b, 0xc5, 0x82, 0x37, 0xb2, 0xe2, 0xc1, 0x56, - 0x4d, 0xd4, 0x56, 0xd2, 0xbf, 0x2a, 0x5b, 0x91, 0x32, 0x15, 0x1e, 0x36, 0x4a, 0x31, 0x62, 0x20, - 0x1e, 0x88, 0x6e, 0xbc, 0xab, 0xc4, 0xd4, 0xf1, 0x75, 0x73, 0xaf, 0x53, 0xa2, 0x69, 0x2f, 0xf0, - 0x01, 0x40, 0x42, 0xe2, 0x4b, 0xf0, 0xc4, 0x1b, 0x6f, 0x48, 0xf0, 0xb2, 0x07, 0x84, 0x26, 0xf1, - 0x82, 0x84, 0x84, 0x50, 0xcb, 0x07, 0x41, 0xbe, 0xf7, 0xba, 0x89, 0x9d, 0x78, 0x4e, 0xba, 0xbc, - 0xd9, 0xc7, 0xe7, 0x77, 0xce, 0xef, 0x77, 0xee, 0xb9, 0xe7, 0x24, 0xf0, 0x46, 0x03, 0x37, 0x7a, - 0x1e, 0xf5, 0x2d, 0xa7, 0x45, 0x9c, 0xc3, 0x80, 0xba, 0x3e, 0x77, 0xfd, 0xa6, 0x75, 0x14, 0x92, - 0x4e, 0xcf, 0x0c, 0x3a, 0x94, 0x53, 0x54, 0x52, 0x2e, 0x66, 0xc2, 0xc5, 0xec, 0x56, 0xf4, 0xeb, - 0xa3, 0xc1, 0x0d, 0x8f, 0xd5, 0x0f, 0x89, 0x82, 0xeb, 0xb7, 0x1c, 0xca, 0xda, 0x94, 0x59, 0x0d, - 0xcc, 0x88, 0x8c, 0x6b, 0x75, 0x2b, 0x0d, 0xc2, 0x71, 0xc5, 0x0a, 0x70, 0xd3, 0xf5, 0x31, 0x77, - 0xa9, 0xaf, 0x7c, 0x97, 0x9a, 0xb4, 0x49, 0xc5, 0xa3, 0x15, 0x3d, 0x29, 0xeb, 0xd5, 0x26, 0xa5, - 0x4d, 0x8f, 0x58, 0x38, 0x70, 0x2d, 0xec, 0xfb, 0x94, 0x0b, 0x08, 0x53, 0x5f, 0x8d, 0xd1, 0x24, - 0x02, 0xdc, 0xc1, 0xed, 0xd8, 0xe7, 0xc6, 0x68, 0x9f, 0xfe, 0x9b, 0xf4, 0x33, 0x7e, 0xd4, 0xe0, - 0xf5, 0x8f, 0x22, 0x8a, 0x36, 0x3e, 0xbe, 0x7b, 0xf6, 0xf1, 0xbe, 0xcb, 0xb8, 0x4d, 0x8e, 0x42, - 0xc2, 0x38, 0xaa, 0xc1, 0x1c, 0xe3, 0x98, 0x87, 0xac, 0xa4, 0x2d, 0x6b, 0x2b, 0x0b, 0xd5, 0x5b, - 0x66, 0x56, 0x75, 0xcc, 0x7e, 0x80, 0x8f, 0x05, 0xc2, 0x56, 0x48, 0xf4, 0x1e, 0x40, 0x5f, 0x79, - 0xa9, 0xb0, 0xac, 0xad, 0x14, 0xab, 0x37, 0x4c, 0x59, 0x26, 0x33, 0x2a, 0x93, 0x29, 0xcb, 0xaf, - 0xca, 0x64, 0x1e, 0xe0, 0x26, 0x51, 0xf9, 0xed, 0x01, 0xa4, 0xf1, 0x9b, 0x06, 0xe5, 0x2c, 0xb6, - 0x2c, 0xa0, 0x3e, 0x23, 0xe8, 0x33, 0x78, 0xa9, 0x83, 0x8f, 0xeb, 0x7d, 0x6e, 0x11, 0xef, 0xd9, - 0x95, 0x62, 0xd5, 0xca, 0xe6, 0x9d, 0x88, 0xf6, 0xa9, 0xcb, 0x5b, 0x1f, 0x10, 0x8e, 0xed, 0x85, - 0xce, 0xa0, 0x99, 0xa1, 0xf7, 0x47, 0x88, 0xb8, 0x99, 0x2b, 0x42, 0xd2, 0x4a, 0xa8, 0xd8, 0x86, - 0xd7, 0x86, 0x45, 0xc4, 0xe5, 0xbe, 0x02, 0xf3, 0x24, 0xa0, 0x4e, 0xab, 0xee, 0x87, 0x6d, 0x51, - 0xf1, 0x0b, 0xf6, 0x0b, 0xc2, 0xb0, 0x1f, 0xb6, 0x0d, 0x0e, 0xfa, 0x28, 0xa4, 0x92, 0xfe, 0x00, - 0x16, 0x92, 0xd2, 0x05, 0xfe, 0x1c, 0xca, 0x2f, 0x25, 0x94, 0x1b, 0xdf, 0x68, 0x70, 0x55, 0xa4, - 0xad, 0x79, 0xec, 0x20, 0x6c, 0x78, 0xae, 0x73, 0x8f, 0xf4, 0x06, 0x5b, 0xe4, 0x59, 0x9c, 0xa7, - 0x76, 0xf6, 0x7f, 0xc4, 0x9d, 0x3a, 0xcc, 0x42, 0xe9, 0x7f, 0x08, 0x97, 0xbb, 0xd8, 0x73, 0x1f, - 0x62, 0x4e, 0x3b, 0xf5, 0x63, 0x97, 0xb7, 0xea, 0xea, 0x5e, 0xc6, 0x2d, 0xb0, 0x9a, 0x5d, 0x88, - 0x07, 0x31, 0x30, 0x2a, 0x42, 0xcd, 0x63, 0xf7, 0x48, 0xcf, 0x5e, 0xea, 0x0e, 0x1b, 0xa7, 0xd8, - 0x06, 0x9b, 0x70, 0x59, 0xe8, 0xd9, 0x8b, 0x2a, 0xa5, 0x2e, 0xcc, 0x38, 0x4d, 0xf0, 0x05, 0x94, - 0x86, 0x71, 0xaa, 0x04, 0x53, 0xb8, 0xac, 0xc6, 0x1e, 0x18, 0xb2, 0xc9, 0x88, 0x43, 0x7c, 0x3e, - 0x90, 0xe5, 0x2e, 0x0d, 0xfb, 0x7d, 0x7a, 0x0d, 0x8a, 0x92, 0xa2, 0x13, 0x59, 0x15, 0x49, 0x10, - 0x26, 0xe1, 0x67, 0xfc, 0x50, 0x80, 0xeb, 0xcf, 0x8c, 0xa3, 0x28, 0x5f, 0x81, 0x79, 0xee, 0x06, - 0x75, 0x81, 0x8c, 0xb5, 0x72, 0x37, 0x10, 0xfe, 0xe9, 0x2c, 0x85, 0x74, 0x16, 0x74, 0x04, 0x2f, - 0x4a, 0xda, 0xca, 0x63, 0x56, 0x1c, 0xf4, 0x7e, 0xb6, 0xec, 0x31, 0x28, 0x99, 0x03, 0xb6, 0x3d, - 0x9f, 0x77, 0x7a, 0x76, 0x91, 0xf5, 0x2d, 0xfa, 0x2e, 0x2c, 0xa6, 0x1d, 0xd0, 0x22, 0xcc, 0x1e, - 0x92, 0x9e, 0xa0, 0x3f, 0x6f, 0x47, 0x8f, 0x68, 0x09, 0x2e, 0x76, 0xb1, 0x17, 0x12, 0xc5, 0x59, - 0xbe, 0xec, 0x14, 0xb6, 0x35, 0xe3, 0x4b, 0x78, 0x53, 0x90, 0xb8, 0x8f, 0x19, 0x4f, 0x5e, 0xbe, - 0x64, 0x13, 0x4c, 0xe3, 0x2c, 0x8f, 0xe1, 0xad, 0x9c, 0x5c, 0xea, 0x14, 0xf6, 0x33, 0x66, 0xc7, - 0xcd, 0x31, 0x67, 0x47, 0x7a, 0x66, 0x2c, 0x01, 0x12, 0x89, 0x0f, 0xc4, 0x52, 0x52, 0x92, 0x8c, - 0x4f, 0xe0, 0x95, 0x84, 0x55, 0x25, 0xdf, 0x85, 0x39, 0xb9, 0xbc, 0x54, 0xd2, 0xe5, 0xec, 0xa4, - 0x12, 0x59, 0xbb, 0xf0, 0xe4, 0x9f, 0x6b, 0x33, 0xb6, 0x42, 0x55, 0x7f, 0x01, 0xb8, 0x28, 0xe2, - 0xa2, 0x5f, 0x35, 0x78, 0x79, 0x68, 0x37, 0xa0, 0xad, 0xbc, 0x76, 0xc8, 0xd8, 0x7d, 0xfa, 0xf6, - 0xe4, 0x40, 0x29, 0xc9, 0xd8, 0xf9, 0xfa, 0xcf, 0xff, 0xbe, 0x2f, 0xac, 0xa3, 0xaa, 0x35, 0x7a, - 0x11, 0x77, 0x2b, 0x56, 0x6a, 0x4d, 0x59, 0x8f, 0xe4, 0x99, 0x3d, 0x46, 0x3f, 0x6b, 0x70, 0x29, - 0x11, 0x19, 0xad, 0x4d, 0xc2, 0x23, 0x26, 0xbf, 0x3e, 0x19, 0x48, 0x11, 0xbf, 0x2d, 0x88, 0x6f, - 0xa2, 0xf5, 0x71, 0x89, 0x5b, 0x8f, 0xce, 0x46, 0xd5, 0xe3, 0xa8, 0xfe, 0x8b, 0xe9, 0xf9, 0x8c, - 0x36, 0x73, 0x88, 0x64, 0xac, 0x15, 0x7d, 0x6b, 0x62, 0x9c, 0xd2, 0x70, 0x47, 0x68, 0xd8, 0x42, - 0x1b, 0xd9, 0x1a, 0xa2, 0xcd, 0x10, 0x08, 0xb0, 0x58, 0x10, 0x09, 0x11, 0x3f, 0x69, 0x50, 0x1c, - 0x98, 0x0d, 0xa8, 0x92, 0xc3, 0x63, 0x78, 0x80, 0xeb, 0xd5, 0x49, 0x20, 0x8a, 0xf5, 0x3b, 0x82, - 0xf5, 0x06, 0x5a, 0xcb, 0x66, 0x2d, 0x48, 0x26, 0xc8, 0x5a, 0xea, 0x17, 0xd6, 0xef, 0x1a, 0xbc, - 0x3a, 0x7a, 0xaa, 0xa1, 0xdb, 0xe7, 0x1c, 0x86, 0x52, 0xc9, 0x9d, 0xe7, 0x1a, 0xa5, 0xc6, 0x86, - 0x10, 0x65, 0xa1, 0xd5, 0x3c, 0x51, 0x3b, 0x83, 0x63, 0x1c, 0xfd, 0xad, 0x41, 0x29, 0x6b, 0x66, - 0xa1, 0xdd, 0x1c, 0x4a, 0x39, 0x83, 0x55, 0x7f, 0xf7, 0xdc, 0x78, 0x25, 0x6a, 0x57, 0x88, 0xda, - 0x46, 0x9b, 0xd9, 0xa2, 0x3c, 0xcc, 0x78, 0x3d, 0x7d, 0x51, 0xe2, 0x0b, 0xfe, 0xad, 0x06, 0x73, - 0x72, 0x90, 0xa1, 0xb7, 0x73, 0xb8, 0x24, 0xe6, 0xa7, 0xbe, 0x3a, 0xa6, 0xb7, 0xe2, 0xb9, 0x22, - 0x78, 0x1a, 0x68, 0x39, 0x9b, 0xa7, 0x9c, 0xa0, 0xb5, 0x0f, 0x9f, 0x9c, 0x94, 0xb5, 0xa7, 0x27, - 0x65, 0xed, 0xdf, 0x93, 0xb2, 0xf6, 0xdd, 0x69, 0x79, 0xe6, 0xe9, 0x69, 0x79, 0xe6, 0xaf, 0xd3, - 0xf2, 0xcc, 0xe7, 0x1b, 0x4d, 0x97, 0xb7, 0xc2, 0x86, 0xe9, 0xd0, 0x76, 0x1c, 0xc5, 0x69, 0x61, - 0xd7, 0x3f, 0x0b, 0xf9, 0x55, 0x2a, 0x28, 0xef, 0x05, 0x84, 0x35, 0xe6, 0xc4, 0xdf, 0x8b, 0xb5, - 0xff, 0x03, 0x00, 0x00, 0xff, 0xff, 0x28, 0x98, 0x2f, 0x2c, 0x6e, 0x0d, 0x00, 0x00, +func init() { + proto.RegisterFile("babylon/checkpointing/v1/query.proto", fileDescriptor_113f1ca5c3c2ca44) +} + +var fileDescriptor_113f1ca5c3c2ca44 = []byte{ + // 972 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x57, 0x4f, 0x6f, 0xe3, 0x44, + 0x14, 0xaf, 0xd3, 0xdd, 0x8a, 0xbe, 0xb0, 0xa5, 0x0c, 0x15, 0x1b, 0xbc, 0x4b, 0xb6, 0x32, 0xfb, + 0xa7, 0xac, 0xa8, 0x47, 0x49, 0xff, 0xaa, 0xec, 0x16, 0x29, 0xab, 0xc2, 0x61, 0x97, 0x52, 0x8c, + 0x58, 0x10, 0x07, 0xa2, 0x89, 0x77, 0x94, 0x98, 0x3a, 0x1e, 0x37, 0x33, 0x4e, 0x89, 0x56, 0x7b, + 0x81, 0x0f, 0x00, 0x12, 0x12, 0x5f, 0x82, 0x13, 0x37, 0x6e, 0x48, 0x70, 0xd9, 0x03, 0x42, 0x95, + 0xb8, 0x20, 0x21, 0x21, 0xd4, 0xf2, 0x41, 0x90, 0xc7, 0xe3, 0x26, 0x76, 0xea, 0x3a, 0x29, 0xb9, + 0x39, 0x2f, 0xef, 0xf7, 0xde, 0xef, 0xf7, 0xe6, 0xcd, 0x7b, 0x36, 0xdc, 0x6c, 0x90, 0x46, 0xcf, + 0x65, 0x1e, 0xb6, 0x5b, 0xd4, 0xde, 0xf7, 0x99, 0xe3, 0x09, 0xc7, 0x6b, 0xe2, 0x6e, 0x05, 0x1f, + 0x04, 0xb4, 0xd3, 0x33, 0xfd, 0x0e, 0x13, 0x0c, 0x95, 0x94, 0x97, 0x99, 0xf0, 0x32, 0xbb, 0x15, + 0xfd, 0x76, 0x26, 0xbe, 0xe1, 0xf2, 0xfa, 0x3e, 0x55, 0x11, 0xf4, 0xbb, 0x36, 0xe3, 0x6d, 0xc6, + 0x71, 0x83, 0x70, 0x1a, 0x85, 0xc6, 0xdd, 0x4a, 0x83, 0x0a, 0x52, 0xc1, 0x3e, 0x69, 0x3a, 0x1e, + 0x11, 0x0e, 0xf3, 0x94, 0xef, 0x42, 0x93, 0x35, 0x99, 0x7c, 0xc4, 0xe1, 0x93, 0xb2, 0x5e, 0x6f, + 0x32, 0xd6, 0x74, 0x29, 0x26, 0xbe, 0x83, 0x89, 0xe7, 0x31, 0x21, 0x21, 0x5c, 0xfd, 0x7b, 0x2b, + 0x93, 0x87, 0x4f, 0x3a, 0xa4, 0x1d, 0xbb, 0xbd, 0x99, 0xe9, 0xd6, 0x37, 0x44, 0xae, 0xc6, 0x0f, + 0x1a, 0xbc, 0xfe, 0x61, 0x48, 0xd4, 0x22, 0x87, 0x0f, 0x4e, 0xff, 0x7c, 0xe4, 0x70, 0x61, 0xd1, + 0x83, 0x80, 0x72, 0x81, 0x6a, 0x30, 0xc3, 0x05, 0x11, 0x01, 0x2f, 0x69, 0x8b, 0xda, 0xd2, 0x5c, + 0xf5, 0xae, 0x99, 0x55, 0x26, 0xb3, 0x1f, 0xe0, 0x23, 0x89, 0xb0, 0x14, 0x12, 0xbd, 0x0b, 0xd0, + 0xd7, 0x5f, 0x2a, 0x2c, 0x6a, 0x4b, 0xc5, 0xea, 0x6d, 0x33, 0x2a, 0x96, 0x19, 0x16, 0xcb, 0x8c, + 0xce, 0x41, 0x15, 0xcb, 0xdc, 0x23, 0x4d, 0xaa, 0xf2, 0x5b, 0x03, 0x48, 0xe3, 0x57, 0x0d, 0xca, + 0x59, 0x6c, 0xb9, 0xcf, 0x3c, 0x4e, 0xd1, 0xa7, 0xf0, 0x52, 0x87, 0x1c, 0xd6, 0xfb, 0xdc, 0x42, + 0xde, 0xd3, 0x4b, 0xc5, 0x2a, 0xce, 0xe6, 0x9d, 0x88, 0xf6, 0x89, 0x23, 0x5a, 0xef, 0x53, 0x41, + 0xac, 0xb9, 0xce, 0xa0, 0x99, 0xa3, 0xf7, 0xce, 0x10, 0x71, 0x27, 0x57, 0x44, 0x44, 0x2b, 0xa1, + 0x62, 0x13, 0x5e, 0x1b, 0x16, 0x11, 0x97, 0xfb, 0x1a, 0xcc, 0x52, 0x9f, 0xd9, 0xad, 0xba, 0x17, + 0xb4, 0x65, 0xc5, 0x2f, 0x59, 0x2f, 0x48, 0xc3, 0x6e, 0xd0, 0x36, 0x04, 0xe8, 0x67, 0x21, 0x95, + 0xf4, 0xc7, 0x30, 0x97, 0x94, 0x2e, 0xf1, 0x17, 0x50, 0x7e, 0x25, 0xa1, 0xdc, 0xf8, 0x5a, 0x83, + 0xeb, 0x32, 0x6d, 0xcd, 0xe5, 0x7b, 0x41, 0xc3, 0x75, 0xec, 0x87, 0xb4, 0x37, 0xd8, 0x22, 0xe7, + 0x71, 0x9e, 0xd8, 0xd9, 0xff, 0x1e, 0x77, 0xea, 0x30, 0x0b, 0xa5, 0xff, 0x09, 0x5c, 0xed, 0x12, + 0xd7, 0x79, 0x42, 0x04, 0xeb, 0xd4, 0x0f, 0x1d, 0xd1, 0xaa, 0xab, 0xdb, 0x19, 0xb7, 0xc0, 0x72, + 0x76, 0x21, 0x1e, 0xc7, 0xc0, 0xb0, 0x08, 0x35, 0x97, 0x3f, 0xa4, 0x3d, 0x6b, 0xa1, 0x3b, 0x6c, + 0x9c, 0x60, 0x1b, 0xac, 0xc3, 0x55, 0xa9, 0x67, 0x27, 0xac, 0x94, 0xba, 0x30, 0xa3, 0x34, 0xc1, + 0xe7, 0x50, 0x1a, 0xc6, 0xa9, 0x12, 0x4c, 0xe0, 0xb2, 0x1a, 0x3b, 0x60, 0x44, 0x4d, 0x46, 0x6d, + 0xea, 0x89, 0x81, 0x2c, 0x0f, 0x58, 0xd0, 0xef, 0xd3, 0x1b, 0x50, 0x8c, 0x28, 0xda, 0xa1, 0x55, + 0x91, 0x04, 0x69, 0x92, 0x7e, 0xc6, 0xf7, 0x05, 0x78, 0xe3, 0xdc, 0x38, 0x8a, 0xf2, 0x35, 0x98, + 0x15, 0x8e, 0x5f, 0x97, 0xc8, 0x58, 0xab, 0x70, 0x7c, 0xe9, 0x9f, 0xce, 0x52, 0x48, 0x67, 0x41, + 0x07, 0xf0, 0x62, 0x44, 0x5b, 0x79, 0x4c, 0xcb, 0x83, 0xde, 0xcd, 0x96, 0x3d, 0x02, 0x25, 0x73, + 0xc0, 0xb6, 0xe3, 0x89, 0x4e, 0xcf, 0x2a, 0xf2, 0xbe, 0x45, 0xdf, 0x86, 0xf9, 0xb4, 0x03, 0x9a, + 0x87, 0xe9, 0x7d, 0xda, 0x93, 0xf4, 0x67, 0xad, 0xf0, 0x11, 0x2d, 0xc0, 0xe5, 0x2e, 0x71, 0x03, + 0xaa, 0x38, 0x47, 0x3f, 0xb6, 0x0a, 0x9b, 0x9a, 0xf1, 0x05, 0xdc, 0x94, 0x24, 0x1e, 0x11, 0x2e, + 0x92, 0x97, 0x2f, 0xd9, 0x04, 0x93, 0x38, 0xcb, 0x43, 0xb8, 0x95, 0x93, 0x4b, 0x9d, 0xc2, 0x6e, + 0xc6, 0xec, 0xb8, 0x33, 0xe2, 0xec, 0x48, 0xcf, 0x8c, 0x05, 0x40, 0x32, 0xf1, 0x9e, 0xdc, 0x4b, + 0x4a, 0x92, 0xf1, 0x31, 0xbc, 0x92, 0xb0, 0xaa, 0xe4, 0xdb, 0x30, 0x13, 0xed, 0x2f, 0x95, 0x74, + 0x31, 0x3b, 0x69, 0x84, 0xac, 0x5d, 0x7a, 0xfe, 0xf7, 0x8d, 0x29, 0x4b, 0xa1, 0xaa, 0x3f, 0x03, + 0x5c, 0x96, 0x71, 0xd1, 0x2f, 0x1a, 0xbc, 0x3c, 0xb4, 0x1b, 0xd0, 0x46, 0x5e, 0x3b, 0x64, 0xec, + 0x3e, 0x7d, 0x73, 0x7c, 0x60, 0x24, 0xc9, 0xd8, 0xfa, 0xea, 0x8f, 0x7f, 0xbf, 0x2b, 0xac, 0xa2, + 0x2a, 0xce, 0xdc, 0xc5, 0xa9, 0x35, 0x85, 0x9f, 0x46, 0x67, 0xf6, 0x0c, 0xfd, 0xa4, 0xc1, 0x95, + 0x44, 0x64, 0xb4, 0x32, 0x0e, 0x8f, 0x98, 0xfc, 0xea, 0x78, 0x20, 0x45, 0xfc, 0x9e, 0x24, 0xbe, + 0x8e, 0x56, 0x47, 0x25, 0x8e, 0x9f, 0x9e, 0x8e, 0xaa, 0x67, 0x61, 0xfd, 0xe7, 0xd3, 0xf3, 0x19, + 0xad, 0xe7, 0x10, 0xc9, 0x58, 0x2b, 0xfa, 0xc6, 0xd8, 0x38, 0xa5, 0xe1, 0xbe, 0xd4, 0xb0, 0x81, + 0xd6, 0xf0, 0xb9, 0xef, 0x6d, 0xbe, 0x04, 0xcb, 0x05, 0x91, 0x10, 0xf1, 0xa3, 0x06, 0xc5, 0x81, + 0xd9, 0x80, 0x2a, 0x39, 0x3c, 0x86, 0x07, 0xb8, 0x5e, 0x1d, 0x07, 0xa2, 0x58, 0xbf, 0x2d, 0x59, + 0xaf, 0xa1, 0x95, 0x6c, 0xd6, 0x92, 0x64, 0x82, 0x2c, 0x56, 0x6f, 0x58, 0xbf, 0x69, 0xf0, 0xea, + 0xd9, 0x53, 0x0d, 0xdd, 0xbb, 0xe0, 0x30, 0x8c, 0x94, 0xdc, 0xff, 0x5f, 0xa3, 0xd4, 0x58, 0x93, + 0xa2, 0x30, 0x5a, 0xce, 0x13, 0xb5, 0x35, 0x38, 0xc6, 0xd1, 0x5f, 0x1a, 0x94, 0xb2, 0x66, 0x16, + 0xda, 0xce, 0xa1, 0x94, 0x33, 0x58, 0xf5, 0x77, 0x2e, 0x8c, 0x57, 0xa2, 0xb6, 0xa5, 0xa8, 0x4d, + 0xb4, 0x9e, 0x2d, 0xca, 0x25, 0x5c, 0xd4, 0xd3, 0x17, 0x25, 0xbe, 0xe0, 0xdf, 0x68, 0x30, 0x13, + 0x0d, 0x32, 0xf4, 0x56, 0x0e, 0x97, 0xc4, 0xfc, 0xd4, 0x97, 0x47, 0xf4, 0x56, 0x3c, 0x97, 0x24, + 0x4f, 0x03, 0x2d, 0xe2, 0x9c, 0xef, 0x86, 0xda, 0x07, 0xcf, 0x8f, 0xcb, 0xda, 0xd1, 0x71, 0x59, + 0xfb, 0xe7, 0xb8, 0xac, 0x7d, 0x7b, 0x52, 0x9e, 0x3a, 0x3a, 0x29, 0x4f, 0xfd, 0x79, 0x52, 0x9e, + 0xfa, 0x6c, 0xad, 0xe9, 0x88, 0x56, 0xd0, 0x30, 0x6d, 0xd6, 0x8e, 0xa3, 0xd8, 0x2d, 0xe2, 0x78, + 0xa7, 0x21, 0xbf, 0x4c, 0x05, 0x15, 0x3d, 0x9f, 0xf2, 0xc6, 0x8c, 0xfc, 0xbc, 0x58, 0xf9, 0x2f, + 0x00, 0x00, 0xff, 0xff, 0xa9, 0xb4, 0x09, 0x9c, 0x7a, 0x0d, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -819,13 +822,16 @@ type QueryClient interface { RawCheckpointList(ctx context.Context, in *QueryRawCheckpointListRequest, opts ...grpc.CallOption) (*QueryRawCheckpointListResponse, error) // RawCheckpoint queries a checkpoints at a given epoch number. RawCheckpoint(ctx context.Context, in *QueryRawCheckpointRequest, opts ...grpc.CallOption) (*QueryRawCheckpointResponse, error) - // BlsPublicKeyList queries a list of bls public keys of the validators at a given epoch number. + // BlsPublicKeyList queries a list of bls public keys of the validators at a + // given epoch number. BlsPublicKeyList(ctx context.Context, in *QueryBlsPublicKeyListRequest, opts ...grpc.CallOption) (*QueryBlsPublicKeyListResponse, error) // EpochStatus queries the status of the checkpoint at a given epoch EpochStatus(ctx context.Context, in *QueryEpochStatusRequest, opts ...grpc.CallOption) (*QueryEpochStatusResponse, error) - // RecentEpochStatusCount queries the number of epochs with each status in recent epochs + // RecentEpochStatusCount queries the number of epochs with each status in + // recent epochs RecentEpochStatusCount(ctx context.Context, in *QueryRecentEpochStatusCountRequest, opts ...grpc.CallOption) (*QueryRecentEpochStatusCountResponse, error) - // LastCheckpointWithStatus queries the last checkpoint with a given status or a more matured status + // LastCheckpointWithStatus queries the last checkpoint with a given status or + // a more matured status LastCheckpointWithStatus(ctx context.Context, in *QueryLastCheckpointWithStatusRequest, opts ...grpc.CallOption) (*QueryLastCheckpointWithStatusResponse, error) // Parameters queries the parameters of the module. Params(ctx context.Context, in *QueryParamsRequest, opts ...grpc.CallOption) (*QueryParamsResponse, error) @@ -908,13 +914,16 @@ type QueryServer interface { RawCheckpointList(context.Context, *QueryRawCheckpointListRequest) (*QueryRawCheckpointListResponse, error) // RawCheckpoint queries a checkpoints at a given epoch number. RawCheckpoint(context.Context, *QueryRawCheckpointRequest) (*QueryRawCheckpointResponse, error) - // BlsPublicKeyList queries a list of bls public keys of the validators at a given epoch number. + // BlsPublicKeyList queries a list of bls public keys of the validators at a + // given epoch number. BlsPublicKeyList(context.Context, *QueryBlsPublicKeyListRequest) (*QueryBlsPublicKeyListResponse, error) // EpochStatus queries the status of the checkpoint at a given epoch EpochStatus(context.Context, *QueryEpochStatusRequest) (*QueryEpochStatusResponse, error) - // RecentEpochStatusCount queries the number of epochs with each status in recent epochs + // RecentEpochStatusCount queries the number of epochs with each status in + // recent epochs RecentEpochStatusCount(context.Context, *QueryRecentEpochStatusCountRequest) (*QueryRecentEpochStatusCountResponse, error) - // LastCheckpointWithStatus queries the last checkpoint with a given status or a more matured status + // LastCheckpointWithStatus queries the last checkpoint with a given status or + // a more matured status LastCheckpointWithStatus(context.Context, *QueryLastCheckpointWithStatusRequest) (*QueryLastCheckpointWithStatusResponse, error) // Parameters queries the parameters of the module. Params(context.Context, *QueryParamsRequest) (*QueryParamsResponse, error) @@ -1110,7 +1119,7 @@ var _Query_serviceDesc = grpc.ServiceDesc{ }, }, Streams: []grpc.StreamDesc{}, - Metadata: "babylon/checkpointing/query.proto", + Metadata: "babylon/checkpointing/v1/query.proto", } func (m *QueryRawCheckpointListRequest) Marshal() (dAtA []byte, err error) { diff --git a/x/checkpointing/types/query.pb.gw.go b/x/checkpointing/types/query.pb.gw.go index 833886136..54079eedb 100644 --- a/x/checkpointing/types/query.pb.gw.go +++ b/x/checkpointing/types/query.pb.gw.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. -// source: babylon/checkpointing/query.proto +// source: babylon/checkpointing/v1/query.proto /* Package types is a reverse proxy. diff --git a/x/checkpointing/types/tx.pb.go b/x/checkpointing/types/tx.pb.go index edbceef5b..05dc31f9b 100644 --- a/x/checkpointing/types/tx.pb.go +++ b/x/checkpointing/types/tx.pb.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: babylon/checkpointing/tx.proto +// source: babylon/checkpointing/v1/tx.proto package types @@ -7,9 +7,9 @@ import ( context "context" fmt "fmt" types "github.com/cosmos/cosmos-sdk/x/staking/types" + _ "github.com/cosmos/gogoproto/gogoproto" grpc1 "github.com/cosmos/gogoproto/grpc" proto "github.com/cosmos/gogoproto/proto" - _ "github.com/gogo/protobuf/gogoproto" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" @@ -39,7 +39,7 @@ func (m *MsgAddBlsSig) Reset() { *m = MsgAddBlsSig{} } func (m *MsgAddBlsSig) String() string { return proto.CompactTextString(m) } func (*MsgAddBlsSig) ProtoMessage() {} func (*MsgAddBlsSig) Descriptor() ([]byte, []int) { - return fileDescriptor_24b023a97b92daa6, []int{0} + return fileDescriptor_6b16c54750152c21, []int{0} } func (m *MsgAddBlsSig) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -76,7 +76,7 @@ func (m *MsgAddBlsSigResponse) Reset() { *m = MsgAddBlsSigResponse{} } func (m *MsgAddBlsSigResponse) String() string { return proto.CompactTextString(m) } func (*MsgAddBlsSigResponse) ProtoMessage() {} func (*MsgAddBlsSigResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_24b023a97b92daa6, []int{1} + return fileDescriptor_6b16c54750152c21, []int{1} } func (m *MsgAddBlsSigResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -115,7 +115,7 @@ func (m *MsgWrappedCreateValidator) Reset() { *m = MsgWrappedCreateValid func (m *MsgWrappedCreateValidator) String() string { return proto.CompactTextString(m) } func (*MsgWrappedCreateValidator) ProtoMessage() {} func (*MsgWrappedCreateValidator) Descriptor() ([]byte, []int) { - return fileDescriptor_24b023a97b92daa6, []int{2} + return fileDescriptor_6b16c54750152c21, []int{2} } func (m *MsgWrappedCreateValidator) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -144,7 +144,8 @@ func (m *MsgWrappedCreateValidator) XXX_DiscardUnknown() { var xxx_messageInfo_MsgWrappedCreateValidator proto.InternalMessageInfo -// MsgWrappedCreateValidatorResponse defines the MsgWrappedCreateValidator response type +// MsgWrappedCreateValidatorResponse defines the MsgWrappedCreateValidator +// response type type MsgWrappedCreateValidatorResponse struct { } @@ -152,7 +153,7 @@ func (m *MsgWrappedCreateValidatorResponse) Reset() { *m = MsgWrappedCre func (m *MsgWrappedCreateValidatorResponse) String() string { return proto.CompactTextString(m) } func (*MsgWrappedCreateValidatorResponse) ProtoMessage() {} func (*MsgWrappedCreateValidatorResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_24b023a97b92daa6, []int{3} + return fileDescriptor_6b16c54750152c21, []int{3} } func (m *MsgWrappedCreateValidatorResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -188,35 +189,35 @@ func init() { proto.RegisterType((*MsgWrappedCreateValidatorResponse)(nil), "babylon.checkpointing.v1.MsgWrappedCreateValidatorResponse") } -func init() { proto.RegisterFile("babylon/checkpointing/tx.proto", fileDescriptor_24b023a97b92daa6) } +func init() { proto.RegisterFile("babylon/checkpointing/v1/tx.proto", fileDescriptor_6b16c54750152c21) } -var fileDescriptor_24b023a97b92daa6 = []byte{ +var fileDescriptor_6b16c54750152c21 = []byte{ // 399 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4b, 0x4a, 0x4c, 0xaa, - 0xcc, 0xc9, 0xcf, 0xd3, 0x4f, 0xce, 0x48, 0x4d, 0xce, 0x2e, 0xc8, 0xcf, 0xcc, 0x2b, 0xc9, 0xcc, - 0x4b, 0xd7, 0x2f, 0xa9, 0xd0, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x92, 0x80, 0xca, 0xeb, 0xa1, - 0xc8, 0xeb, 0x95, 0x19, 0x4a, 0x89, 0xa4, 0xe7, 0xa7, 0xe7, 0x83, 0x15, 0xe9, 0x83, 0x58, 0x10, - 0xf5, 0x52, 0x6a, 0xd8, 0xcd, 0x43, 0xf0, 0xa0, 0xea, 0x94, 0xb1, 0xab, 0x4b, 0xca, 0x29, 0x8e, - 0xcf, 0x4e, 0xad, 0x84, 0x2a, 0x92, 0x4f, 0xce, 0x2f, 0xce, 0xcd, 0x2f, 0xd6, 0x2f, 0x2e, 0x49, - 0xcc, 0x06, 0xc9, 0x96, 0x19, 0x26, 0xa5, 0x96, 0x24, 0x1a, 0xc2, 0x5d, 0xa7, 0x14, 0xcc, 0xc5, - 0xe3, 0x5b, 0x9c, 0xee, 0x98, 0x92, 0xe2, 0x94, 0x53, 0x1c, 0x9c, 0x99, 0x2e, 0x64, 0xc9, 0xc5, - 0x0e, 0x32, 0xa1, 0x38, 0x33, 0x5d, 0x82, 0x51, 0x81, 0x51, 0x83, 0xdb, 0x48, 0x41, 0x0f, 0x97, - 0xfb, 0xf5, 0x20, 0x5a, 0x82, 0xd8, 0x92, 0xc0, 0xb4, 0x15, 0x47, 0xc7, 0x02, 0x79, 0x86, 0x17, - 0x0b, 0xe4, 0x19, 0x94, 0xc4, 0xb8, 0x44, 0x90, 0x0d, 0x0d, 0x4a, 0x2d, 0x2e, 0xc8, 0xcf, 0x2b, - 0x4e, 0x55, 0xda, 0xce, 0xc8, 0x25, 0xe9, 0x5b, 0x9c, 0x1e, 0x5e, 0x94, 0x58, 0x50, 0x90, 0x9a, - 0xe2, 0x5c, 0x94, 0x9a, 0x58, 0x92, 0x1a, 0x96, 0x98, 0x93, 0x99, 0x92, 0x58, 0x92, 0x5f, 0x24, - 0x64, 0xc4, 0xc5, 0x9c, 0x9d, 0x5a, 0x49, 0x94, 0xb5, 0xde, 0xa9, 0x95, 0x41, 0x20, 0xc5, 0x42, - 0x31, 0x5c, 0x22, 0xb9, 0xc5, 0xe9, 0xf1, 0xc9, 0x60, 0xa3, 0xe2, 0xcb, 0x60, 0x66, 0x49, 0x30, - 0x81, 0x0d, 0xd1, 0xd2, 0x83, 0x78, 0x5f, 0x0f, 0xea, 0x7d, 0x3d, 0xa8, 0xf7, 0xf5, 0x7c, 0x8b, - 0xd3, 0xd1, 0x6c, 0x0f, 0x12, 0xca, 0xc5, 0x10, 0x43, 0xf2, 0x91, 0x32, 0x97, 0x22, 0x4e, 0x87, - 0xc3, 0xbc, 0x67, 0xf4, 0x9d, 0x91, 0x8b, 0xd9, 0xb7, 0x38, 0x5d, 0x28, 0x99, 0x8b, 0x13, 0x11, - 0xa0, 0x6a, 0xb8, 0x3d, 0x82, 0x1c, 0x46, 0x52, 0x7a, 0xc4, 0xa9, 0x83, 0x59, 0x26, 0xd4, 0xc5, - 0xc8, 0x25, 0x86, 0x23, 0x20, 0x8d, 0xf1, 0x1a, 0x85, 0x5d, 0x93, 0x94, 0x35, 0x19, 0x9a, 0x60, - 0x8e, 0x71, 0xf2, 0x3f, 0xf1, 0x48, 0x8e, 0xf1, 0xc2, 0x23, 0x39, 0xc6, 0x07, 0x8f, 0xe4, 0x18, - 0x27, 0x3c, 0x96, 0x63, 0xb8, 0xf0, 0x58, 0x8e, 0xe1, 0xc6, 0x63, 0x39, 0x86, 0x28, 0xd3, 0xf4, - 0xcc, 0x92, 0x8c, 0xd2, 0x24, 0xbd, 0xe4, 0xfc, 0x5c, 0x7d, 0xa8, 0x05, 0xc9, 0x19, 0x89, 0x99, - 0x79, 0x30, 0x8e, 0x7e, 0x05, 0x7a, 0xbe, 0xa9, 0x2c, 0x48, 0x2d, 0x4e, 0x62, 0x03, 0xa7, 0x4e, - 0x63, 0x40, 0x00, 0x00, 0x00, 0xff, 0xff, 0x0a, 0xe9, 0x81, 0x51, 0x5d, 0x03, 0x00, 0x00, + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x92, 0xcd, 0x4a, 0xeb, 0x40, + 0x14, 0xc7, 0x33, 0xb7, 0xd0, 0x7b, 0xef, 0xdc, 0xbb, 0x0a, 0xa5, 0xd4, 0x2c, 0xd2, 0x0f, 0xa1, + 0xa8, 0x8b, 0x09, 0x6d, 0x71, 0xa1, 0xae, 0xac, 0x4b, 0x09, 0x42, 0x0a, 0x0a, 0x22, 0x94, 0x49, + 0x32, 0x4c, 0x43, 0x3e, 0x26, 0x64, 0xc6, 0xd2, 0xbc, 0x81, 0xb8, 0xf2, 0x11, 0xfa, 0x16, 0xbe, + 0x82, 0xcb, 0x2e, 0x5d, 0x4a, 0xbb, 0xf1, 0x0d, 0xdc, 0x4a, 0xf3, 0x41, 0x6b, 0x35, 0x52, 0x5c, + 0x25, 0x73, 0xf8, 0x9d, 0xff, 0xff, 0xfc, 0x0f, 0x07, 0x36, 0x4d, 0x6c, 0xc6, 0x1e, 0x0b, 0x34, + 0x6b, 0x44, 0x2c, 0x37, 0x64, 0x4e, 0x20, 0x9c, 0x80, 0x6a, 0xe3, 0x8e, 0x26, 0x26, 0x28, 0x8c, + 0x98, 0x60, 0x72, 0x2d, 0x43, 0xd0, 0x07, 0x04, 0x8d, 0x3b, 0x4a, 0x85, 0x32, 0xca, 0x12, 0x48, + 0x5b, 0xfe, 0xa5, 0xbc, 0xb2, 0x5f, 0x28, 0xb9, 0x2a, 0x64, 0x68, 0xbb, 0x10, 0x35, 0x3d, 0x3e, + 0x74, 0x49, 0x9c, 0x71, 0x75, 0x8b, 0x71, 0x9f, 0x71, 0x8d, 0x0b, 0xec, 0xa6, 0x80, 0x49, 0x04, + 0x5e, 0xcd, 0xd8, 0x1a, 0xc0, 0xff, 0x3a, 0xa7, 0xa7, 0xb6, 0xdd, 0xf7, 0xf8, 0xc0, 0xa1, 0xf2, + 0x11, 0xfc, 0xbd, 0x54, 0xe0, 0x0e, 0xad, 0x81, 0x06, 0xd8, 0xfb, 0xd7, 0x6d, 0xa0, 0xa2, 0x14, + 0x28, 0x6d, 0x31, 0xca, 0x66, 0xf2, 0x3d, 0xfe, 0x73, 0x37, 0xad, 0x4b, 0xaf, 0xd3, 0xba, 0xd4, + 0xaa, 0xc2, 0xca, 0xba, 0xa8, 0x41, 0x78, 0xc8, 0x02, 0x4e, 0x5a, 0x8f, 0x00, 0xee, 0xe8, 0x9c, + 0x5e, 0x45, 0x38, 0x0c, 0x89, 0x7d, 0x16, 0x11, 0x2c, 0xc8, 0x25, 0xf6, 0x1c, 0x1b, 0x0b, 0x16, + 0xc9, 0x5d, 0x58, 0x72, 0x49, 0xbc, 0x95, 0xed, 0x39, 0x89, 0x8d, 0x25, 0x2c, 0xdf, 0xc0, 0x8a, + 0xcf, 0xe9, 0xd0, 0x4a, 0xa4, 0x86, 0xe3, 0x5c, 0xab, 0xf6, 0x2b, 0x11, 0x39, 0x40, 0x69, 0x7c, + 0x94, 0xc5, 0x47, 0x59, 0x7c, 0xa4, 0x73, 0xba, 0xe1, 0x6e, 0xc8, 0xfe, 0xa7, 0xda, 0x5a, 0xa2, + 0x5d, 0xd8, 0x2c, 0x1c, 0x3c, 0x8f, 0xd7, 0x7d, 0x03, 0xb0, 0xa4, 0x73, 0x2a, 0x5b, 0xf0, 0xef, + 0x6a, 0xa1, 0xed, 0xe2, 0x20, 0xeb, 0x3b, 0x52, 0xd0, 0x76, 0x5c, 0x6e, 0x26, 0xdf, 0x03, 0x58, + 0x2d, 0x58, 0x64, 0xef, 0x5b, 0xa9, 0xaf, 0x9b, 0x94, 0x93, 0x1f, 0x34, 0xe5, 0xc3, 0xf4, 0x2f, + 0x9e, 0xe6, 0x2a, 0x98, 0xcd, 0x55, 0xf0, 0x32, 0x57, 0xc1, 0xc3, 0x42, 0x95, 0x66, 0x0b, 0x55, + 0x7a, 0x5e, 0xa8, 0xd2, 0xf5, 0x21, 0x75, 0xc4, 0xe8, 0xd6, 0x44, 0x16, 0xf3, 0xb5, 0xcc, 0xc0, + 0x1a, 0x61, 0x27, 0xc8, 0x1f, 0xda, 0x64, 0xe3, 0x84, 0x45, 0x1c, 0x12, 0x6e, 0x96, 0x93, 0xeb, + 0xec, 0xbd, 0x07, 0x00, 0x00, 0xff, 0xff, 0x57, 0x8a, 0x2d, 0x96, 0x66, 0x03, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -336,7 +337,7 @@ var _Msg_serviceDesc = grpc.ServiceDesc{ }, }, Streams: []grpc.StreamDesc{}, - Metadata: "babylon/checkpointing/tx.proto", + Metadata: "babylon/checkpointing/v1/tx.proto", } func (m *MsgAddBlsSig) Marshal() (dAtA []byte, err error) { diff --git a/x/epoching/types/epoching.pb.go b/x/epoching/types/epoching.pb.go index 2b726e3d1..d93700ad7 100644 --- a/x/epoching/types/epoching.pb.go +++ b/x/epoching/types/epoching.pb.go @@ -6,9 +6,9 @@ package types import ( fmt "fmt" types1 "github.com/cosmos/cosmos-sdk/x/staking/types" + _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/cosmos/gogoproto/proto" github_com_cosmos_gogoproto_types "github.com/cosmos/gogoproto/types" - _ "github.com/gogo/protobuf/gogoproto" types "github.com/tendermint/tendermint/proto/tendermint/types" _ "google.golang.org/protobuf/types/known/timestamppb" io "io" @@ -68,14 +68,17 @@ type Epoch struct { CurrentEpochInterval uint64 `protobuf:"varint,2,opt,name=current_epoch_interval,json=currentEpochInterval,proto3" json:"current_epoch_interval,omitempty"` FirstBlockHeight uint64 `protobuf:"varint,3,opt,name=first_block_height,json=firstBlockHeight,proto3" json:"first_block_height,omitempty"` // last_block_header is the header of the last block in this epoch. - // Babylon needs to remember the last header of each epoch to complete unbonding validators/delegations when a previous epoch's checkpoint is finalised. - // The last_block_header field is nil in the epoch's beginning, and is set upon the end of this epoch. + // Babylon needs to remember the last header of each epoch to complete + // unbonding validators/delegations when a previous epoch's checkpoint is + // finalised. The last_block_header field is nil in the epoch's beginning, and + // is set upon the end of this epoch. LastBlockHeader *types.Header `protobuf:"bytes,4,opt,name=last_block_header,json=lastBlockHeader,proto3" json:"last_block_header,omitempty"` // app_hash_root is the Merkle root of all AppHashs in this epoch // It will be used for proving a block is in an epoch AppHashRoot []byte `protobuf:"bytes,5,opt,name=app_hash_root,json=appHashRoot,proto3" json:"app_hash_root,omitempty"` // sealer_header is the 2nd header of the next epoch - // This validator set has generated a BLS multisig on `last_commit_hash` of the sealer header + // This validator set has generated a BLS multisig on `last_commit_hash` of + // the sealer header SealerHeader *types.Header `protobuf:"bytes,6,opt,name=sealer_header,json=sealerHeader,proto3" json:"sealer_header,omitempty"` } @@ -154,7 +157,8 @@ func (m *Epoch) GetSealerHeader() *types.Header { return nil } -// QueuedMessage is a message that can change the validator set and is delayed to the epoch boundary +// QueuedMessage is a message that can change the validator set and is delayed +// to the epoch boundary type QueuedMessage struct { // tx_id is the ID of the tx that contains the message TxId []byte `protobuf:"bytes,1,opt,name=tx_id,json=txId,proto3" json:"tx_id,omitempty"` @@ -164,7 +168,8 @@ type QueuedMessage struct { BlockHeight uint64 `protobuf:"varint,3,opt,name=block_height,json=blockHeight,proto3" json:"block_height,omitempty"` // block_time is the timestamp when this msg is submitted to Babylon BlockTime *time.Time `protobuf:"bytes,4,opt,name=block_time,json=blockTime,proto3,stdtime" json:"block_time,omitempty"` - // msg is the actual message that is sent by a user and is queued by the epoching module + // msg is the actual message that is sent by a user and is queued by the + // epoching module // // Types that are valid to be assigned to Msg: // *QueuedMessage_MsgCreateValidator diff --git a/x/epoching/types/events.pb.go b/x/epoching/types/events.pb.go index 2b9187465..c4ad6a5da 100644 --- a/x/epoching/types/events.pb.go +++ b/x/epoching/types/events.pb.go @@ -5,8 +5,8 @@ package types import ( fmt "fmt" + _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/cosmos/gogoproto/proto" - _ "github.com/gogo/protobuf/gogoproto" github_com_tendermint_tendermint_abci_types "github.com/tendermint/tendermint/abci/types" io "io" math "math" diff --git a/x/epoching/types/genesis.pb.go b/x/epoching/types/genesis.pb.go index 82dadbfdf..77f300cdf 100644 --- a/x/epoching/types/genesis.pb.go +++ b/x/epoching/types/genesis.pb.go @@ -5,8 +5,8 @@ package types import ( fmt "fmt" + _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/cosmos/gogoproto/proto" - _ "github.com/gogo/protobuf/gogoproto" io "io" math "math" math_bits "math/bits" diff --git a/x/epoching/types/message.pb.go b/x/epoching/types/message.pb.go deleted file mode 100644 index df65ac6b0..000000000 --- a/x/epoching/types/message.pb.go +++ /dev/null @@ -1,264 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: babylon/epoching/v1/message.proto - -package types - -import ( - fmt "fmt" - _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" - io "io" - math "math" - math_bits "math/bits" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package - -type Message struct { -} - -func (m *Message) Reset() { *m = Message{} } -func (m *Message) String() string { return proto.CompactTextString(m) } -func (*Message) ProtoMessage() {} -func (*Message) Descriptor() ([]byte, []int) { - return fileDescriptor_4ca8d3a37382d890, []int{0} -} -func (m *Message) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Message) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Message.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 *Message) XXX_Merge(src proto.Message) { - xxx_messageInfo_Message.Merge(m, src) -} -func (m *Message) XXX_Size() int { - return m.Size() -} -func (m *Message) XXX_DiscardUnknown() { - xxx_messageInfo_Message.DiscardUnknown(m) -} - -var xxx_messageInfo_Message proto.InternalMessageInfo - -func init() { - proto.RegisterType((*Message)(nil), "babylon.epoching.v1.Message") -} - -func init() { proto.RegisterFile("babylon/epoching/v1/message.proto", fileDescriptor_4ca8d3a37382d890) } - -var fileDescriptor_4ca8d3a37382d890 = []byte{ - // 152 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x4c, 0x4a, 0x4c, 0xaa, - 0xcc, 0xc9, 0xcf, 0xd3, 0x4f, 0x2d, 0xc8, 0x4f, 0xce, 0xc8, 0xcc, 0x4b, 0xd7, 0x2f, 0x33, 0xd4, - 0xcf, 0x4d, 0x2d, 0x2e, 0x4e, 0x4c, 0x4f, 0xd5, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x12, 0x86, - 0x2a, 0xd1, 0x83, 0x29, 0xd1, 0x2b, 0x33, 0x94, 0x12, 0x49, 0xcf, 0x4f, 0xcf, 0x07, 0xcb, 0xeb, - 0x83, 0x58, 0x10, 0xa5, 0x4a, 0x9c, 0x5c, 0xec, 0xbe, 0x10, 0xbd, 0x4e, 0x5e, 0x27, 0x1e, 0xc9, - 0x31, 0x5e, 0x78, 0x24, 0xc7, 0xf8, 0xe0, 0x91, 0x1c, 0xe3, 0x84, 0xc7, 0x72, 0x0c, 0x17, 0x1e, - 0xcb, 0x31, 0xdc, 0x78, 0x2c, 0xc7, 0x10, 0x65, 0x90, 0x9e, 0x59, 0x92, 0x51, 0x9a, 0xa4, 0x97, - 0x9c, 0x9f, 0xab, 0x0f, 0x35, 0x3a, 0x39, 0x23, 0x31, 0x33, 0x0f, 0xc6, 0xd1, 0xaf, 0x40, 0x38, - 0xa6, 0xa4, 0xb2, 0x20, 0xb5, 0x38, 0x89, 0x0d, 0x6c, 0xba, 0x31, 0x20, 0x00, 0x00, 0xff, 0xff, - 0x23, 0x19, 0xba, 0x5b, 0xad, 0x00, 0x00, 0x00, -} - -func (m *Message) 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 *Message) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Message) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - return len(dAtA) - i, nil -} - -func encodeVarintMessage(dAtA []byte, offset int, v uint64) int { - offset -= sovMessage(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func (m *Message) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - return n -} - -func sovMessage(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozMessage(x uint64) (n int) { - return sovMessage(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (m *Message) 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 ErrIntOverflowMessage - } - 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: Message: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Message: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipMessage(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthMessage - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func skipMessage(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - depth := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowMessage - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - wireType := int(wire & 0x7) - switch wireType { - case 0: - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowMessage - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - case 1: - iNdEx += 8 - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowMessage - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if length < 0 { - return 0, ErrInvalidLengthMessage - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupMessage - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthMessage - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthMessage = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowMessage = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupMessage = fmt.Errorf("proto: unexpected end of group") -) diff --git a/x/epoching/types/params.pb.go b/x/epoching/types/params.pb.go index 213c6cb4b..21ae0f84b 100644 --- a/x/epoching/types/params.pb.go +++ b/x/epoching/types/params.pb.go @@ -5,8 +5,8 @@ package types import ( fmt "fmt" + _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/cosmos/gogoproto/proto" - _ "github.com/gogo/protobuf/gogoproto" io "io" math "math" math_bits "math/bits" diff --git a/x/epoching/types/query.pb.go b/x/epoching/types/query.pb.go index 42e332ba5..d8788aa2f 100644 --- a/x/epoching/types/query.pb.go +++ b/x/epoching/types/query.pb.go @@ -7,9 +7,9 @@ import ( context "context" fmt "fmt" query "github.com/cosmos/cosmos-sdk/types/query" + _ "github.com/cosmos/gogoproto/gogoproto" grpc1 "github.com/cosmos/gogoproto/grpc" proto "github.com/cosmos/gogoproto/proto" - _ "github.com/gogo/protobuf/gogoproto" _ "google.golang.org/genproto/googleapis/api/annotations" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" @@ -299,7 +299,8 @@ func (m *QueryEpochsInfoResponse) GetPagination() *query.PageResponse { return nil } -// QueryCurrentEpochRequest is the request type for the Query/CurrentEpoch RPC method +// QueryCurrentEpochRequest is the request type for the Query/CurrentEpoch RPC +// method type QueryCurrentEpochRequest struct { } @@ -336,7 +337,8 @@ func (m *QueryCurrentEpochRequest) XXX_DiscardUnknown() { var xxx_messageInfo_QueryCurrentEpochRequest proto.InternalMessageInfo -// QueryCurrentEpochResponse is the response type for the Query/CurrentEpoch RPC method +// QueryCurrentEpochResponse is the response type for the Query/CurrentEpoch RPC +// method type QueryCurrentEpochResponse struct { // current_epoch is the current epoch number CurrentEpoch uint64 `protobuf:"varint,1,opt,name=current_epoch,json=currentEpoch,proto3" json:"current_epoch,omitempty"` @@ -446,7 +448,8 @@ func (m *QueryEpochMsgsRequest) GetPagination() *query.PageRequest { return nil } -// QueryEpochMsgsResponse is the response type for the Query/EpochMsgs RPC method +// QueryEpochMsgsResponse is the response type for the Query/EpochMsgs RPC +// method type QueryEpochMsgsResponse struct { // msgs is the list of messages queued in the current epoch Msgs []*QueuedMessage `protobuf:"bytes,1,rep,name=msgs,proto3" json:"msgs,omitempty"` @@ -501,8 +504,9 @@ func (m *QueryEpochMsgsResponse) GetPagination() *query.PageResponse { return nil } -// QueryLatestEpochMsgsRequest is the request type for the Query/LatestEpochMsgs RPC method -// it returns epoch msgs within epoch [max(1, end_epoch-epoch_count+1), end_epoch] +// QueryLatestEpochMsgsRequest is the request type for the Query/LatestEpochMsgs +// RPC method it returns epoch msgs within epoch [max(1, +// end_epoch-epoch_count+1), end_epoch] type QueryLatestEpochMsgsRequest struct { // end_epoch is the number of the last epoch to query EndEpoch uint64 `protobuf:"varint,1,opt,name=end_epoch,json=endEpoch,proto3" json:"end_epoch,omitempty"` @@ -565,7 +569,8 @@ func (m *QueryLatestEpochMsgsRequest) GetPagination() *query.PageRequest { return nil } -// QueryLatestEpochMsgsResponse is the response type for the Query/LatestEpochMsgs RPC method +// QueryLatestEpochMsgsResponse is the response type for the +// Query/LatestEpochMsgs RPC method type QueryLatestEpochMsgsResponse struct { // epoch_msg_map is a list of QueuedMessageList // each QueuedMessageList has a field identifying the epoch number @@ -1018,15 +1023,16 @@ type QueryClient interface { Params(ctx context.Context, in *QueryParamsRequest, opts ...grpc.CallOption) (*QueryParamsResponse, error) // EpochInfo queries the information of a given epoch EpochInfo(ctx context.Context, in *QueryEpochInfoRequest, opts ...grpc.CallOption) (*QueryEpochInfoResponse, error) - // EpochsInfo queries the metadata of epochs in a given range, depending on the - // parameters in the pagination request. Th main use case will be querying the - // latest epochs in time order. + // EpochsInfo queries the metadata of epochs in a given range, depending on + // the parameters in the pagination request. Th main use case will be querying + // the latest epochs in time order. EpochsInfo(ctx context.Context, in *QueryEpochsInfoRequest, opts ...grpc.CallOption) (*QueryEpochsInfoResponse, error) // CurrentEpoch queries the current epoch CurrentEpoch(ctx context.Context, in *QueryCurrentEpochRequest, opts ...grpc.CallOption) (*QueryCurrentEpochResponse, error) // EpochMsgs queries the messages of a given epoch EpochMsgs(ctx context.Context, in *QueryEpochMsgsRequest, opts ...grpc.CallOption) (*QueryEpochMsgsResponse, error) - // LatestEpochMsgs queries the messages within a given number of most recent epochs + // LatestEpochMsgs queries the messages within a given number of most recent + // epochs LatestEpochMsgs(ctx context.Context, in *QueryLatestEpochMsgsRequest, opts ...grpc.CallOption) (*QueryLatestEpochMsgsResponse, error) // ValidatorLifecycle queries the lifecycle of a given validator ValidatorLifecycle(ctx context.Context, in *QueryValidatorLifecycleRequest, opts ...grpc.CallOption) (*QueryValidatorLifecycleResponse, error) @@ -1131,15 +1137,16 @@ type QueryServer interface { Params(context.Context, *QueryParamsRequest) (*QueryParamsResponse, error) // EpochInfo queries the information of a given epoch EpochInfo(context.Context, *QueryEpochInfoRequest) (*QueryEpochInfoResponse, error) - // EpochsInfo queries the metadata of epochs in a given range, depending on the - // parameters in the pagination request. Th main use case will be querying the - // latest epochs in time order. + // EpochsInfo queries the metadata of epochs in a given range, depending on + // the parameters in the pagination request. Th main use case will be querying + // the latest epochs in time order. EpochsInfo(context.Context, *QueryEpochsInfoRequest) (*QueryEpochsInfoResponse, error) // CurrentEpoch queries the current epoch CurrentEpoch(context.Context, *QueryCurrentEpochRequest) (*QueryCurrentEpochResponse, error) // EpochMsgs queries the messages of a given epoch EpochMsgs(context.Context, *QueryEpochMsgsRequest) (*QueryEpochMsgsResponse, error) - // LatestEpochMsgs queries the messages within a given number of most recent epochs + // LatestEpochMsgs queries the messages within a given number of most recent + // epochs LatestEpochMsgs(context.Context, *QueryLatestEpochMsgsRequest) (*QueryLatestEpochMsgsResponse, error) // ValidatorLifecycle queries the lifecycle of a given validator ValidatorLifecycle(context.Context, *QueryValidatorLifecycleRequest) (*QueryValidatorLifecycleResponse, error) diff --git a/x/epoching/types/tx.pb.go b/x/epoching/types/tx.pb.go index f1357370a..35ea70810 100644 --- a/x/epoching/types/tx.pb.go +++ b/x/epoching/types/tx.pb.go @@ -6,11 +6,10 @@ package types import ( context "context" fmt "fmt" - _ "github.com/cosmos/cosmos-sdk/codec/types" types "github.com/cosmos/cosmos-sdk/x/staking/types" + _ "github.com/cosmos/gogoproto/gogoproto" grpc1 "github.com/cosmos/gogoproto/grpc" proto "github.com/cosmos/gogoproto/proto" - _ "github.com/gogo/protobuf/gogoproto" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" @@ -261,31 +260,31 @@ func init() { func init() { proto.RegisterFile("babylon/epoching/v1/tx.proto", fileDescriptor_a5fc8fed8f4e58b6) } var fileDescriptor_a5fc8fed8f4e58b6 = []byte{ - // 384 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x93, 0x4d, 0x4b, 0x02, 0x41, - 0x18, 0xc7, 0x77, 0x13, 0x22, 0xa6, 0x43, 0xb4, 0x49, 0xe4, 0x22, 0x63, 0x29, 0xd1, 0xcb, 0x61, - 0x26, 0x8d, 0x0a, 0xa2, 0x93, 0x74, 0x0a, 0xbc, 0x08, 0x12, 0x75, 0x9b, 0x5d, 0xa7, 0x71, 0x51, - 0x67, 0x36, 0x67, 0x14, 0xbd, 0x75, 0xec, 0xd8, 0x47, 0xf0, 0xe3, 0x74, 0xf4, 0xd8, 0x31, 0xf4, - 0xe2, 0xc7, 0x08, 0x75, 0xc7, 0x95, 0xf5, 0xb5, 0xdb, 0xec, 0x3e, 0xff, 0xe7, 0xf7, 0x7b, 0x78, - 0x86, 0x01, 0x49, 0x87, 0x38, 0x9d, 0x9a, 0xe0, 0x98, 0xfa, 0xc2, 0xad, 0x78, 0x9c, 0xe1, 0x56, - 0x16, 0xab, 0x36, 0xf2, 0x1b, 0x42, 0x09, 0xeb, 0x20, 0xa8, 0x22, 0x5d, 0x45, 0xad, 0xac, 0x9d, - 0x60, 0x42, 0xb0, 0x1a, 0xc5, 0xe3, 0x88, 0xd3, 0x7c, 0xc3, 0x84, 0x77, 0x26, 0x79, 0x3b, 0xce, - 0x04, 0x13, 0xe3, 0x23, 0x1e, 0x9d, 0x82, 0xbf, 0x29, 0x57, 0xc8, 0xba, 0x90, 0x58, 0x2a, 0x52, - 0x9d, 0x18, 0x1c, 0xaa, 0x48, 0xa8, 0x49, 0x97, 0x80, 0x55, 0x90, 0xec, 0xb9, 0x41, 0x7c, 0x9f, - 0x96, 0x1f, 0x69, 0x8d, 0x32, 0xa2, 0xa8, 0x75, 0x03, 0x62, 0x75, 0xc9, 0x8e, 0xcc, 0x63, 0xf3, - 0x7c, 0x37, 0x97, 0x41, 0x13, 0x08, 0x0a, 0x20, 0x28, 0x80, 0xa0, 0x82, 0x64, 0xba, 0xa3, 0x38, - 0xca, 0xdf, 0xef, 0x7c, 0x76, 0x53, 0xc6, 0xb0, 0x9b, 0x32, 0xd2, 0x49, 0x60, 0xcf, 0x63, 0x8b, - 0x54, 0xfa, 0x82, 0x4b, 0x9a, 0x7e, 0x01, 0xf1, 0xb0, 0x5a, 0xe2, 0x65, 0xad, 0xbd, 0x9b, 0xd5, - 0x9e, 0xae, 0xd0, 0x86, 0x3d, 0x51, 0x31, 0x04, 0xc9, 0x45, 0xe8, 0xa9, 0xda, 0x05, 0x89, 0xb0, - 0x9e, 0xa7, 0xcc, 0xe3, 0x45, 0x3a, 0xf5, 0x3f, 0xcc, 0xfa, 0x2f, 0x57, 0xf8, 0x23, 0x8d, 0xd1, - 0x21, 0x32, 0xe0, 0x64, 0xa9, 0x44, 0x4f, 0x92, 0x1b, 0x6e, 0x81, 0x58, 0x41, 0x32, 0xab, 0x0a, - 0xf6, 0xa2, 0xeb, 0x3f, 0x43, 0x0b, 0x2e, 0x1f, 0xcd, 0x2f, 0xd4, 0xc6, 0x1b, 0x06, 0xb5, 0xd4, - 0x7a, 0x07, 0xfb, 0xf3, 0x6b, 0xbf, 0x58, 0x43, 0x09, 0xa3, 0x76, 0x76, 0xe3, 0xe8, 0x54, 0xf9, - 0x61, 0x82, 0xc3, 0x25, 0xfb, 0x46, 0x6b, 0x68, 0x91, 0xbc, 0x7d, 0xfb, 0xbf, 0xbc, 0x1e, 0x21, - 0xff, 0xf4, 0xdd, 0x87, 0x66, 0xaf, 0x0f, 0xcd, 0xdf, 0x3e, 0x34, 0xbf, 0x06, 0xd0, 0xe8, 0x0d, - 0xa0, 0xf1, 0x33, 0x80, 0xc6, 0xeb, 0x15, 0xf3, 0x54, 0xa5, 0xe9, 0x20, 0x57, 0xd4, 0x71, 0xc0, - 0x76, 0x2b, 0xc4, 0xe3, 0xfa, 0x03, 0xb7, 0xc3, 0xd7, 0xa9, 0x3a, 0x3e, 0x95, 0xce, 0xf6, 0xf8, - 0xdd, 0x5c, 0xff, 0x05, 0x00, 0x00, 0xff, 0xff, 0x73, 0xc6, 0x83, 0x42, 0xbe, 0x03, 0x00, 0x00, + // 370 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x93, 0x4f, 0x4b, 0x3a, 0x41, + 0x18, 0xc7, 0x77, 0x7f, 0xc2, 0x8f, 0x78, 0x3a, 0x44, 0x9b, 0x44, 0x2d, 0x32, 0x96, 0x12, 0xfd, + 0x39, 0xcc, 0xa4, 0x51, 0x41, 0x74, 0x92, 0x4e, 0x81, 0x17, 0x41, 0xa2, 0x6e, 0xbb, 0xeb, 0x30, + 0x2e, 0xea, 0xce, 0xe6, 0x4c, 0xa2, 0xb7, 0x8e, 0x1d, 0x7b, 0x09, 0xbe, 0x9c, 0x8e, 0x1e, 0x3b, + 0x86, 0x5e, 0x7c, 0x19, 0xa1, 0xee, 0x38, 0xb2, 0xfe, 0xed, 0xa6, 0x7c, 0xbf, 0xcf, 0xe7, 0xf3, + 0xf0, 0x2c, 0x03, 0x29, 0xd7, 0x71, 0x3b, 0x75, 0x1e, 0x10, 0x1a, 0x72, 0xaf, 0xea, 0x07, 0x8c, + 0xb4, 0x72, 0x44, 0xb6, 0x71, 0xd8, 0xe4, 0x92, 0x5b, 0x7b, 0x51, 0x8a, 0x55, 0x8a, 0x5b, 0x39, + 0x3b, 0xc9, 0x38, 0xe3, 0xe3, 0x9c, 0x8c, 0x7e, 0x4d, 0xaa, 0x76, 0xda, 0xe3, 0xa2, 0xc1, 0x05, + 0x11, 0xd2, 0xa9, 0x4d, 0x30, 0x2e, 0x95, 0x8e, 0x66, 0x65, 0xca, 0x60, 0x15, 0x05, 0x7b, 0x6a, + 0x3a, 0x61, 0x48, 0x2b, 0x0f, 0xb4, 0x4e, 0x99, 0x23, 0xa9, 0x75, 0x0d, 0x89, 0x86, 0x60, 0x07, + 0xe6, 0x91, 0x79, 0xb6, 0x9d, 0xcf, 0xe2, 0x09, 0x04, 0x47, 0x10, 0x1c, 0x41, 0x70, 0x51, 0x30, + 0x35, 0x51, 0x1a, 0xf5, 0xef, 0xb6, 0x3e, 0xba, 0x69, 0x63, 0xd8, 0x4d, 0x1b, 0x99, 0x14, 0xd8, + 0xf3, 0xd8, 0x12, 0x15, 0x21, 0x0f, 0x04, 0xcd, 0x3c, 0x43, 0x52, 0xa7, 0xe5, 0xa0, 0xa2, 0xb4, + 0xb7, 0xb3, 0xda, 0x93, 0x15, 0x5a, 0x3d, 0x13, 0x17, 0x23, 0x48, 0x2d, 0x42, 0x4f, 0xd5, 0x1e, + 0x1c, 0xea, 0xbc, 0x40, 0x99, 0x1f, 0x94, 0xe8, 0xd4, 0x7f, 0x3f, 0xeb, 0xbf, 0x58, 0xe1, 0x8f, + 0x0d, 0xc6, 0x97, 0xc8, 0xc2, 0xf1, 0x52, 0x89, 0xda, 0x24, 0x3f, 0xfc, 0x07, 0x89, 0xa2, 0x60, + 0x56, 0x0d, 0x76, 0xe2, 0xe7, 0x3f, 0xc5, 0x0b, 0xbe, 0x30, 0x9e, 0x3f, 0xa8, 0x4d, 0x36, 0x2c, + 0x2a, 0xa9, 0xf5, 0x0a, 0xbb, 0xf3, 0x67, 0x3f, 0x5f, 0x43, 0xd1, 0x55, 0x3b, 0xb7, 0x71, 0x75, + 0xaa, 0x7c, 0x37, 0x61, 0x7f, 0xc9, 0xbd, 0xf1, 0x1a, 0x5a, 0xac, 0x6f, 0xdf, 0xfc, 0xad, 0xaf, + 0x56, 0x28, 0x3c, 0x7e, 0xf5, 0x91, 0xd9, 0xeb, 0x23, 0xf3, 0xa7, 0x8f, 0xcc, 0xcf, 0x01, 0x32, + 0x7a, 0x03, 0x64, 0x7c, 0x0f, 0x90, 0xf1, 0x72, 0xc9, 0x7c, 0x59, 0x7d, 0x73, 0xb1, 0xc7, 0x1b, + 0x24, 0x62, 0x7b, 0x55, 0xc7, 0x0f, 0xd4, 0x1f, 0xd2, 0xd6, 0x4f, 0x50, 0x76, 0x42, 0x2a, 0xdc, + 0xff, 0xe3, 0x77, 0x73, 0xf5, 0x1b, 0x00, 0x00, 0xff, 0xff, 0x97, 0xc6, 0x4a, 0xb3, 0xa3, 0x03, + 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -300,11 +299,14 @@ const _ = grpc.SupportPackageIsVersion4 // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. type MsgClient interface { - // WrappedDelegate defines a method for performing a delegation of coins from a delegator to a validator. + // WrappedDelegate defines a method for performing a delegation of coins from + // a delegator to a validator. WrappedDelegate(ctx context.Context, in *MsgWrappedDelegate, opts ...grpc.CallOption) (*MsgWrappedDelegateResponse, error) - // WrappedUndelegate defines a method for performing an undelegation from a delegate and a validator. + // WrappedUndelegate defines a method for performing an undelegation from a + // delegate and a validator. WrappedUndelegate(ctx context.Context, in *MsgWrappedUndelegate, opts ...grpc.CallOption) (*MsgWrappedUndelegateResponse, error) - // WrappedBeginRedelegate defines a method for performing a redelegation of coins from a delegator and source validator to a destination validator. + // WrappedBeginRedelegate defines a method for performing a redelegation of + // coins from a delegator and source validator to a destination validator. WrappedBeginRedelegate(ctx context.Context, in *MsgWrappedBeginRedelegate, opts ...grpc.CallOption) (*MsgWrappedBeginRedelegateResponse, error) } @@ -345,11 +347,14 @@ func (c *msgClient) WrappedBeginRedelegate(ctx context.Context, in *MsgWrappedBe // MsgServer is the server API for Msg service. type MsgServer interface { - // WrappedDelegate defines a method for performing a delegation of coins from a delegator to a validator. + // WrappedDelegate defines a method for performing a delegation of coins from + // a delegator to a validator. WrappedDelegate(context.Context, *MsgWrappedDelegate) (*MsgWrappedDelegateResponse, error) - // WrappedUndelegate defines a method for performing an undelegation from a delegate and a validator. + // WrappedUndelegate defines a method for performing an undelegation from a + // delegate and a validator. WrappedUndelegate(context.Context, *MsgWrappedUndelegate) (*MsgWrappedUndelegateResponse, error) - // WrappedBeginRedelegate defines a method for performing a redelegation of coins from a delegator and source validator to a destination validator. + // WrappedBeginRedelegate defines a method for performing a redelegation of + // coins from a delegator and source validator to a destination validator. WrappedBeginRedelegate(context.Context, *MsgWrappedBeginRedelegate) (*MsgWrappedBeginRedelegateResponse, error) } diff --git a/x/monitor/types/genesis.pb.go b/x/monitor/types/genesis.pb.go index a7223c78e..20091b911 100644 --- a/x/monitor/types/genesis.pb.go +++ b/x/monitor/types/genesis.pb.go @@ -1,12 +1,12 @@ // Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: babylon/monitor/genesis.proto +// source: babylon/monitor/v1/genesis.proto package types import ( fmt "fmt" + _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/cosmos/gogoproto/proto" - _ "github.com/gogo/protobuf/gogoproto" io "io" math "math" math_bits "math/bits" @@ -32,7 +32,7 @@ func (m *GenesisState) Reset() { *m = GenesisState{} } func (m *GenesisState) String() string { return proto.CompactTextString(m) } func (*GenesisState) ProtoMessage() {} func (*GenesisState) Descriptor() ([]byte, []int) { - return fileDescriptor_98b2aa1b23cbbe77, []int{0} + return fileDescriptor_fb844fd916189e7b, []int{0} } func (m *GenesisState) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -72,23 +72,23 @@ func init() { proto.RegisterType((*GenesisState)(nil), "babylon.monitor.v1.GenesisState") } -func init() { proto.RegisterFile("babylon/monitor/genesis.proto", fileDescriptor_98b2aa1b23cbbe77) } +func init() { proto.RegisterFile("babylon/monitor/v1/genesis.proto", fileDescriptor_fb844fd916189e7b) } -var fileDescriptor_98b2aa1b23cbbe77 = []byte{ - // 195 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4d, 0x4a, 0x4c, 0xaa, - 0xcc, 0xc9, 0xcf, 0xd3, 0xcf, 0xcd, 0xcf, 0xcb, 0x2c, 0xc9, 0x2f, 0xd2, 0x4f, 0x4f, 0xcd, 0x4b, - 0x2d, 0xce, 0x2c, 0xd6, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x12, 0x82, 0x4a, 0xeb, 0x41, 0xa5, - 0xf5, 0xca, 0x0c, 0xa5, 0x44, 0xd2, 0xf3, 0xd3, 0xf3, 0xc1, 0xd2, 0xfa, 0x20, 0x16, 0x44, 0xa5, - 0x94, 0x0c, 0xba, 0x41, 0x05, 0x89, 0x45, 0x89, 0xb9, 0x50, 0x73, 0x94, 0x3c, 0xb8, 0x78, 0xdc, - 0x21, 0x06, 0x07, 0x97, 0x24, 0x96, 0xa4, 0x0a, 0x59, 0x70, 0xb1, 0x41, 0xe4, 0x25, 0x18, 0x15, - 0x18, 0x35, 0xb8, 0x8d, 0xa4, 0xf4, 0x30, 0x2d, 0xd2, 0x0b, 0x00, 0xab, 0x70, 0x62, 0x39, 0x71, - 0x4f, 0x9e, 0x21, 0x08, 0xaa, 0xde, 0xc9, 0xf3, 0xc4, 0x23, 0x39, 0xc6, 0x0b, 0x8f, 0xe4, 0x18, - 0x1f, 0x3c, 0x92, 0x63, 0x9c, 0xf0, 0x58, 0x8e, 0xe1, 0xc2, 0x63, 0x39, 0x86, 0x1b, 0x8f, 0xe5, - 0x18, 0xa2, 0xf4, 0xd3, 0x33, 0x4b, 0x32, 0x4a, 0x93, 0xf4, 0x92, 0xf3, 0x73, 0xf5, 0xa1, 0xa6, - 0x25, 0x67, 0x24, 0x66, 0xe6, 0xc1, 0x38, 0xfa, 0x15, 0x70, 0xb7, 0x95, 0x54, 0x16, 0xa4, 0x16, - 0x27, 0xb1, 0x81, 0xdd, 0x66, 0x0c, 0x08, 0x00, 0x00, 0xff, 0xff, 0x87, 0x54, 0x4d, 0xde, 0x04, - 0x01, 0x00, 0x00, +var fileDescriptor_fb844fd916189e7b = []byte{ + // 199 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x48, 0x4a, 0x4c, 0xaa, + 0xcc, 0xc9, 0xcf, 0xd3, 0xcf, 0xcd, 0xcf, 0xcb, 0x2c, 0xc9, 0x2f, 0xd2, 0x2f, 0x33, 0xd4, 0x4f, + 0x4f, 0xcd, 0x4b, 0x2d, 0xce, 0x2c, 0xd6, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x12, 0x82, 0xaa, + 0xd0, 0x83, 0xaa, 0xd0, 0x2b, 0x33, 0x94, 0x12, 0x49, 0xcf, 0x4f, 0xcf, 0x07, 0x4b, 0xeb, 0x83, + 0x58, 0x10, 0x95, 0x52, 0xf2, 0x58, 0xcc, 0x2a, 0x48, 0x2c, 0x4a, 0xcc, 0x85, 0x1a, 0xa5, 0xe4, + 0xc1, 0xc5, 0xe3, 0x0e, 0x31, 0x3b, 0xb8, 0x24, 0xb1, 0x24, 0x55, 0xc8, 0x82, 0x8b, 0x0d, 0x22, + 0x2f, 0xc1, 0xa8, 0xc0, 0xa8, 0xc1, 0x6d, 0x24, 0xa5, 0x87, 0x69, 0x97, 0x5e, 0x00, 0x58, 0x85, + 0x13, 0xcb, 0x89, 0x7b, 0xf2, 0x0c, 0x41, 0x50, 0xf5, 0x4e, 0x9e, 0x27, 0x1e, 0xc9, 0x31, 0x5e, + 0x78, 0x24, 0xc7, 0xf8, 0xe0, 0x91, 0x1c, 0xe3, 0x84, 0xc7, 0x72, 0x0c, 0x17, 0x1e, 0xcb, 0x31, + 0xdc, 0x78, 0x2c, 0xc7, 0x10, 0xa5, 0x9f, 0x9e, 0x59, 0x92, 0x51, 0x9a, 0xa4, 0x97, 0x9c, 0x9f, + 0xab, 0x0f, 0x35, 0x2d, 0x39, 0x23, 0x31, 0x33, 0x0f, 0xc6, 0xd1, 0xaf, 0x80, 0x3b, 0xaf, 0xa4, + 0xb2, 0x20, 0xb5, 0x38, 0x89, 0x0d, 0xec, 0x36, 0x63, 0x40, 0x00, 0x00, 0x00, 0xff, 0xff, 0x0f, + 0x47, 0x83, 0xe5, 0x0a, 0x01, 0x00, 0x00, } func (m *GenesisState) Marshal() (dAtA []byte, err error) { diff --git a/x/monitor/types/params.pb.go b/x/monitor/types/params.pb.go index 24b569b44..8a9be2724 100644 --- a/x/monitor/types/params.pb.go +++ b/x/monitor/types/params.pb.go @@ -1,12 +1,12 @@ // Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: babylon/monitor/params.proto +// source: babylon/monitor/v1/params.proto package types import ( fmt "fmt" + _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/cosmos/gogoproto/proto" - _ "github.com/gogo/protobuf/gogoproto" io "io" math "math" math_bits "math/bits" @@ -31,7 +31,7 @@ func (m *Params) Reset() { *m = Params{} } func (m *Params) String() string { return proto.CompactTextString(m) } func (*Params) ProtoMessage() {} func (*Params) Descriptor() ([]byte, []int) { - return fileDescriptor_122b02f3f9b23cbe, []int{0} + return fileDescriptor_03a7a0bed09bba40, []int{0} } func (m *Params) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -64,20 +64,20 @@ func init() { proto.RegisterType((*Params)(nil), "babylon.monitor.v1.Params") } -func init() { proto.RegisterFile("babylon/monitor/params.proto", fileDescriptor_122b02f3f9b23cbe) } +func init() { proto.RegisterFile("babylon/monitor/v1/params.proto", fileDescriptor_03a7a0bed09bba40) } -var fileDescriptor_122b02f3f9b23cbe = []byte{ - // 153 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x49, 0x4a, 0x4c, 0xaa, - 0xcc, 0xc9, 0xcf, 0xd3, 0xcf, 0xcd, 0xcf, 0xcb, 0x2c, 0xc9, 0x2f, 0xd2, 0x2f, 0x48, 0x2c, 0x4a, - 0xcc, 0x2d, 0xd6, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x12, 0x82, 0xca, 0xea, 0x41, 0x65, 0xf5, - 0xca, 0x0c, 0xa5, 0x44, 0xd2, 0xf3, 0xd3, 0xf3, 0xc1, 0xd2, 0xfa, 0x20, 0x16, 0x44, 0xa5, 0x12, - 0x1f, 0x17, 0x5b, 0x00, 0x58, 0xa7, 0x15, 0xcb, 0x8b, 0x05, 0xf2, 0x8c, 0x4e, 0x9e, 0x27, 0x1e, - 0xc9, 0x31, 0x5e, 0x78, 0x24, 0xc7, 0xf8, 0xe0, 0x91, 0x1c, 0xe3, 0x84, 0xc7, 0x72, 0x0c, 0x17, - 0x1e, 0xcb, 0x31, 0xdc, 0x78, 0x2c, 0xc7, 0x10, 0xa5, 0x9f, 0x9e, 0x59, 0x92, 0x51, 0x9a, 0xa4, - 0x97, 0x9c, 0x9f, 0xab, 0x0f, 0x35, 0x3e, 0x39, 0x23, 0x31, 0x33, 0x0f, 0xc6, 0xd1, 0xaf, 0x80, - 0xbb, 0xa5, 0xa4, 0xb2, 0x20, 0xb5, 0x38, 0x89, 0x0d, 0x6c, 0x83, 0x31, 0x20, 0x00, 0x00, 0xff, - 0xff, 0x3f, 0x70, 0x61, 0xbe, 0xab, 0x00, 0x00, 0x00, +var fileDescriptor_03a7a0bed09bba40 = []byte{ + // 157 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4f, 0x4a, 0x4c, 0xaa, + 0xcc, 0xc9, 0xcf, 0xd3, 0xcf, 0xcd, 0xcf, 0xcb, 0x2c, 0xc9, 0x2f, 0xd2, 0x2f, 0x33, 0xd4, 0x2f, + 0x48, 0x2c, 0x4a, 0xcc, 0x2d, 0xd6, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x12, 0x82, 0x2a, 0xd0, + 0x83, 0x2a, 0xd0, 0x2b, 0x33, 0x94, 0x12, 0x49, 0xcf, 0x4f, 0xcf, 0x07, 0x4b, 0xeb, 0x83, 0x58, + 0x10, 0x95, 0x4a, 0x7c, 0x5c, 0x6c, 0x01, 0x60, 0x9d, 0x56, 0x2c, 0x2f, 0x16, 0xc8, 0x33, 0x3a, + 0x79, 0x9e, 0x78, 0x24, 0xc7, 0x78, 0xe1, 0x91, 0x1c, 0xe3, 0x83, 0x47, 0x72, 0x8c, 0x13, 0x1e, + 0xcb, 0x31, 0x5c, 0x78, 0x2c, 0xc7, 0x70, 0xe3, 0xb1, 0x1c, 0x43, 0x94, 0x7e, 0x7a, 0x66, 0x49, + 0x46, 0x69, 0x92, 0x5e, 0x72, 0x7e, 0xae, 0x3e, 0xd4, 0xf8, 0xe4, 0x8c, 0xc4, 0xcc, 0x3c, 0x18, + 0x47, 0xbf, 0x02, 0xee, 0x9c, 0x92, 0xca, 0x82, 0xd4, 0xe2, 0x24, 0x36, 0xb0, 0x0d, 0xc6, 0x80, + 0x00, 0x00, 0x00, 0xff, 0xff, 0x3d, 0x82, 0x82, 0x51, 0xae, 0x00, 0x00, 0x00, } func (this *Params) Equal(that interface{}) bool { diff --git a/x/monitor/types/query.pb.go b/x/monitor/types/query.pb.go index a6beaaef6..dd345b0c7 100644 --- a/x/monitor/types/query.pb.go +++ b/x/monitor/types/query.pb.go @@ -1,15 +1,14 @@ // Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: babylon/monitor/query.proto +// source: babylon/monitor/v1/query.proto package types import ( context "context" fmt "fmt" - _ "github.com/cosmos/cosmos-sdk/types/query" + _ "github.com/cosmos/gogoproto/gogoproto" grpc1 "github.com/cosmos/gogoproto/grpc" proto "github.com/cosmos/gogoproto/proto" - _ "github.com/gogo/protobuf/gogoproto" _ "google.golang.org/genproto/googleapis/api/annotations" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" @@ -38,7 +37,7 @@ func (m *QueryParamsRequest) Reset() { *m = QueryParamsRequest{} } func (m *QueryParamsRequest) String() string { return proto.CompactTextString(m) } func (*QueryParamsRequest) ProtoMessage() {} func (*QueryParamsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_3b70877a7534d1c4, []int{0} + return fileDescriptor_a8aafb034c55a8f2, []int{0} } func (m *QueryParamsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -77,7 +76,7 @@ func (m *QueryParamsResponse) Reset() { *m = QueryParamsResponse{} } func (m *QueryParamsResponse) String() string { return proto.CompactTextString(m) } func (*QueryParamsResponse) ProtoMessage() {} func (*QueryParamsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_3b70877a7534d1c4, []int{1} + return fileDescriptor_a8aafb034c55a8f2, []int{1} } func (m *QueryParamsResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -121,7 +120,7 @@ func (m *QueryEndedEpochBtcHeightRequest) Reset() { *m = QueryEndedEpoch func (m *QueryEndedEpochBtcHeightRequest) String() string { return proto.CompactTextString(m) } func (*QueryEndedEpochBtcHeightRequest) ProtoMessage() {} func (*QueryEndedEpochBtcHeightRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_3b70877a7534d1c4, []int{2} + return fileDescriptor_a8aafb034c55a8f2, []int{2} } func (m *QueryEndedEpochBtcHeightRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -166,7 +165,7 @@ func (m *QueryEndedEpochBtcHeightResponse) Reset() { *m = QueryEndedEpoc func (m *QueryEndedEpochBtcHeightResponse) String() string { return proto.CompactTextString(m) } func (*QueryEndedEpochBtcHeightResponse) ProtoMessage() {} func (*QueryEndedEpochBtcHeightResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_3b70877a7534d1c4, []int{3} + return fileDescriptor_a8aafb034c55a8f2, []int{3} } func (m *QueryEndedEpochBtcHeightResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -213,7 +212,7 @@ func (m *QueryReportedCheckpointBtcHeightRequest) Reset() { func (m *QueryReportedCheckpointBtcHeightRequest) String() string { return proto.CompactTextString(m) } func (*QueryReportedCheckpointBtcHeightRequest) ProtoMessage() {} func (*QueryReportedCheckpointBtcHeightRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_3b70877a7534d1c4, []int{4} + return fileDescriptor_a8aafb034c55a8f2, []int{4} } func (m *QueryReportedCheckpointBtcHeightRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -260,7 +259,7 @@ func (m *QueryReportedCheckpointBtcHeightResponse) Reset() { func (m *QueryReportedCheckpointBtcHeightResponse) String() string { return proto.CompactTextString(m) } func (*QueryReportedCheckpointBtcHeightResponse) ProtoMessage() {} func (*QueryReportedCheckpointBtcHeightResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_3b70877a7534d1c4, []int{5} + return fileDescriptor_a8aafb034c55a8f2, []int{5} } func (m *QueryReportedCheckpointBtcHeightResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -305,43 +304,41 @@ func init() { proto.RegisterType((*QueryReportedCheckpointBtcHeightResponse)(nil), "babylon.monitor.v1.QueryReportedCheckpointBtcHeightResponse") } -func init() { proto.RegisterFile("babylon/monitor/query.proto", fileDescriptor_3b70877a7534d1c4) } - -var fileDescriptor_3b70877a7534d1c4 = []byte{ - // 515 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x54, 0x4f, 0x6b, 0xd4, 0x4e, - 0x18, 0xde, 0xfc, 0xd8, 0xdf, 0xd2, 0x8e, 0xb7, 0xe9, 0x82, 0x92, 0x2d, 0x69, 0xc9, 0xa1, 0x5d, - 0x14, 0x33, 0x6c, 0x57, 0x41, 0x50, 0x3c, 0x6c, 0xa9, 0x54, 0x10, 0xff, 0xe4, 0xa6, 0x97, 0x30, - 0x99, 0x1d, 0x92, 0xa1, 0x9b, 0x99, 0x69, 0x66, 0xb2, 0xb8, 0x94, 0xbd, 0x78, 0xf3, 0x26, 0xf8, - 0x45, 0xfc, 0x18, 0xbd, 0x08, 0x05, 0x2f, 0x9e, 0x44, 0x76, 0xfd, 0x20, 0x92, 0xc9, 0x34, 0x60, - 0x9b, 0x75, 0x51, 0x6f, 0xc9, 0xfb, 0xbc, 0xcf, 0xf3, 0x3e, 0x6f, 0xde, 0x87, 0x80, 0x5e, 0x8c, - 0xe3, 0xd9, 0x44, 0x70, 0x94, 0x09, 0xce, 0xb4, 0xc8, 0xd1, 0x69, 0x41, 0xf3, 0x59, 0x20, 0x73, - 0xa1, 0x05, 0x84, 0x16, 0x0c, 0x2c, 0x18, 0x4c, 0x07, 0x6e, 0x37, 0x11, 0x89, 0x30, 0x30, 0x2a, - 0x9f, 0xaa, 0x4e, 0x77, 0x3b, 0x11, 0x22, 0x99, 0x50, 0x84, 0x25, 0x43, 0x98, 0x73, 0xa1, 0xb1, - 0x66, 0x82, 0x2b, 0x8b, 0xde, 0x26, 0x42, 0x65, 0x42, 0xa1, 0x18, 0x2b, 0x5a, 0x0d, 0x40, 0xd3, - 0x41, 0x4c, 0x35, 0x1e, 0x20, 0x89, 0x13, 0xc6, 0x4d, 0xf3, 0xa5, 0xd2, 0x55, 0x43, 0x12, 0xe7, - 0x38, 0xb3, 0x4a, 0x7e, 0x17, 0xc0, 0x57, 0x25, 0xff, 0xa5, 0x29, 0x86, 0xf4, 0xb4, 0xa0, 0x4a, - 0xfb, 0x2f, 0xc0, 0xd6, 0x2f, 0x55, 0x25, 0x05, 0x57, 0x14, 0x3e, 0x00, 0x9d, 0x8a, 0x7c, 0xcb, - 0xd9, 0x75, 0xfa, 0x37, 0x0e, 0xdc, 0xe0, 0xfa, 0x3e, 0x41, 0xc5, 0x19, 0xb5, 0xcf, 0xbf, 0xed, - 0xb4, 0x42, 0xdb, 0xef, 0x3f, 0x06, 0x3b, 0x46, 0xf0, 0x88, 0x8f, 0xe9, 0xf8, 0x48, 0x0a, 0x92, - 0x8e, 0x34, 0x39, 0xa6, 0x2c, 0x49, 0xb5, 0x9d, 0x09, 0x7b, 0x60, 0x93, 0x96, 0x40, 0xc4, 0x8b, - 0xcc, 0xe8, 0xb7, 0xc3, 0x0d, 0x53, 0x78, 0x5e, 0x64, 0xfe, 0x6b, 0xb0, 0xbb, 0x9a, 0x6f, 0xdd, - 0xdd, 0x07, 0x37, 0x63, 0x4d, 0xa2, 0x49, 0x59, 0x8c, 0xc8, 0x84, 0x51, 0xae, 0xa3, 0xd4, 0xb4, - 0x58, 0xb9, 0x6e, 0xac, 0xc9, 0xb3, 0xf2, 0xfd, 0xd0, 0x80, 0x15, 0xdd, 0x7f, 0x02, 0xf6, 0x8d, - 0x74, 0x48, 0xa5, 0xc8, 0x35, 0x1d, 0x1f, 0xa6, 0x94, 0x9c, 0x48, 0xc1, 0xb8, 0x6e, 0xb2, 0x48, - 0x4e, 0xa4, 0x8e, 0x52, 0xac, 0x52, 0xa3, 0xb9, 0x19, 0x6e, 0x94, 0x85, 0x63, 0xac, 0x52, 0x1f, - 0x83, 0xfe, 0x7a, 0x9d, 0x7f, 0xb2, 0x7a, 0xf0, 0xbe, 0x0d, 0xfe, 0x37, 0x33, 0xe0, 0x1c, 0x74, - 0xaa, 0xef, 0x0c, 0xf7, 0x9a, 0x6e, 0x70, 0xfd, 0xa4, 0xee, 0xfe, 0xda, 0xbe, 0xca, 0x9b, 0xef, - 0xbf, 0xfb, 0xf2, 0xe3, 0xe3, 0x7f, 0xdb, 0xd0, 0x45, 0x57, 0x83, 0x33, 0x1d, 0xd8, 0xec, 0xc0, - 0x4f, 0x0e, 0xd8, 0x6a, 0x38, 0x05, 0x1c, 0xae, 0x1c, 0xb2, 0xfa, 0xf0, 0xee, 0xbd, 0x3f, 0x23, - 0x59, 0x9b, 0x81, 0xb1, 0xd9, 0x87, 0x7b, 0x4d, 0x36, 0x4d, 0x6e, 0x14, 0x3a, 0xab, 0x03, 0x35, - 0x87, 0x9f, 0x1d, 0xd0, 0xfb, 0xcd, 0x69, 0xe0, 0xc3, 0x95, 0x2e, 0xd6, 0x07, 0xc3, 0x7d, 0xf4, - 0x77, 0x64, 0xbb, 0xca, 0xd0, 0xac, 0x72, 0x17, 0xde, 0x69, 0x5a, 0x85, 0xd4, 0x44, 0x85, 0xce, - 0xea, 0xf4, 0xcd, 0x47, 0x4f, 0xcf, 0x17, 0x9e, 0x73, 0xb1, 0xf0, 0x9c, 0xef, 0x0b, 0xcf, 0xf9, - 0xb0, 0xf4, 0x5a, 0x17, 0x4b, 0xaf, 0xf5, 0x75, 0xe9, 0xb5, 0xde, 0xa0, 0x84, 0xe9, 0xb4, 0x88, - 0x03, 0x22, 0xb2, 0x4b, 0x41, 0x92, 0x62, 0xc6, 0x6b, 0xf5, 0xb7, 0xb5, 0xbe, 0x9e, 0x49, 0xaa, - 0xe2, 0x8e, 0xf9, 0x15, 0x0c, 0x7f, 0x06, 0x00, 0x00, 0xff, 0xff, 0x7b, 0x8a, 0xb1, 0xb8, 0xbb, - 0x04, 0x00, 0x00, +func init() { proto.RegisterFile("babylon/monitor/v1/query.proto", fileDescriptor_a8aafb034c55a8f2) } + +var fileDescriptor_a8aafb034c55a8f2 = []byte{ + // 488 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x54, 0xcf, 0x6b, 0xd4, 0x40, + 0x14, 0xde, 0xc8, 0xba, 0xb4, 0xe3, 0x6d, 0xba, 0xa0, 0xa4, 0x25, 0x5b, 0x72, 0x68, 0x17, 0xc4, + 0x0c, 0xed, 0x2a, 0x08, 0x8a, 0x87, 0x2d, 0x95, 0x0a, 0xe2, 0x8f, 0xdc, 0xf4, 0x12, 0x26, 0xb3, + 0x43, 0x26, 0x74, 0x33, 0x33, 0xcd, 0x4c, 0x8a, 0x4b, 0xd9, 0x8b, 0x37, 0x6f, 0x82, 0xff, 0x88, + 0x7f, 0x46, 0x2f, 0x42, 0xc1, 0x8b, 0x27, 0x91, 0x5d, 0xff, 0x10, 0xc9, 0x64, 0x0c, 0xc8, 0x26, + 0x2e, 0xda, 0x5b, 0xf2, 0xbe, 0xf7, 0x7d, 0xef, 0x7b, 0x79, 0x1f, 0x01, 0x5e, 0x8c, 0xe3, 0xd9, + 0x54, 0x70, 0x94, 0x09, 0x9e, 0x6a, 0x91, 0xa3, 0xf3, 0x03, 0x74, 0x56, 0xd0, 0x7c, 0x16, 0xc8, + 0x5c, 0x68, 0x01, 0xa1, 0xc5, 0x03, 0x8b, 0x07, 0xe7, 0x07, 0x6e, 0x3f, 0x11, 0x89, 0x30, 0x30, + 0x2a, 0x9f, 0xaa, 0x4e, 0x77, 0x27, 0x11, 0x22, 0x99, 0x52, 0x84, 0x65, 0x8a, 0x30, 0xe7, 0x42, + 0x63, 0x9d, 0x0a, 0xae, 0x2c, 0x3a, 0x68, 0x98, 0x23, 0x71, 0x8e, 0x33, 0xdb, 0xe0, 0xf7, 0x01, + 0x7c, 0x5d, 0xce, 0x7d, 0x65, 0x8a, 0x21, 0x3d, 0x2b, 0xa8, 0xd2, 0xfe, 0x4b, 0xb0, 0xf5, 0x47, + 0x55, 0x49, 0xc1, 0x15, 0x85, 0x0f, 0x41, 0xaf, 0x22, 0xdf, 0x71, 0x76, 0x9d, 0xe1, 0xad, 0x43, + 0x37, 0x58, 0xb5, 0x19, 0x54, 0x9c, 0x71, 0xf7, 0xf2, 0xfb, 0xa0, 0x13, 0xda, 0x7e, 0xff, 0x09, + 0x18, 0x18, 0xc1, 0x63, 0x3e, 0xa1, 0x93, 0x63, 0x29, 0x08, 0x1b, 0x6b, 0x72, 0x42, 0xd3, 0x84, + 0x69, 0x3b, 0x13, 0x6e, 0x83, 0x4d, 0x5a, 0x02, 0x11, 0x2f, 0x32, 0xa3, 0xdf, 0x0d, 0x37, 0x4c, + 0xe1, 0x45, 0x91, 0xf9, 0x6f, 0xc0, 0x6e, 0x3b, 0xdf, 0xba, 0x7b, 0x00, 0x6e, 0xc7, 0x9a, 0x44, + 0xd3, 0xb2, 0x18, 0x91, 0x69, 0x4a, 0xb9, 0x8e, 0x98, 0x69, 0xb1, 0x72, 0xfd, 0x58, 0x93, 0xe7, + 0xe5, 0xfb, 0x91, 0x01, 0x2b, 0xba, 0xff, 0x14, 0xec, 0x1b, 0xe9, 0x90, 0x4a, 0x91, 0x6b, 0x3a, + 0x39, 0x62, 0x94, 0x9c, 0x4a, 0x91, 0x72, 0xdd, 0x64, 0x91, 0x9c, 0x4a, 0x1d, 0x31, 0xac, 0x98, + 0xd1, 0xdc, 0x0c, 0x37, 0xca, 0xc2, 0x09, 0x56, 0xcc, 0xc7, 0x60, 0xb8, 0x5e, 0xe7, 0x5a, 0x56, + 0x0f, 0x3f, 0x74, 0xc1, 0x4d, 0x33, 0x03, 0xce, 0x41, 0xaf, 0xfa, 0xce, 0x70, 0xaf, 0xe9, 0x06, + 0xab, 0x27, 0x75, 0xf7, 0xd7, 0xf6, 0x55, 0xde, 0x7c, 0xff, 0xfd, 0xd7, 0x9f, 0x9f, 0x6e, 0xec, + 0x40, 0x17, 0xb5, 0x66, 0x07, 0x7e, 0x76, 0xc0, 0x56, 0xc3, 0x29, 0xe0, 0xa8, 0x75, 0x48, 0xfb, + 0xe1, 0xdd, 0xfb, 0xff, 0x46, 0xb2, 0x36, 0x03, 0x63, 0x73, 0x08, 0xf7, 0x9a, 0x6c, 0x9a, 0xdc, + 0x28, 0x74, 0x51, 0x07, 0x6a, 0x0e, 0xbf, 0x38, 0x60, 0xfb, 0x2f, 0xa7, 0x81, 0x8f, 0x5a, 0x5d, + 0xac, 0x0f, 0x86, 0xfb, 0xf8, 0xff, 0xc8, 0x76, 0x95, 0x91, 0x59, 0xe5, 0x1e, 0xbc, 0xdb, 0xb4, + 0x0a, 0xa9, 0x89, 0x0a, 0x5d, 0xd4, 0xe9, 0x9b, 0x8f, 0x9f, 0x5d, 0x2e, 0x3c, 0xe7, 0x6a, 0xe1, + 0x39, 0x3f, 0x16, 0x9e, 0xf3, 0x71, 0xe9, 0x75, 0xae, 0x96, 0x5e, 0xe7, 0xdb, 0xd2, 0xeb, 0xbc, + 0x45, 0x49, 0xaa, 0x59, 0x11, 0x07, 0x44, 0x64, 0xbf, 0x05, 0x09, 0xc3, 0x29, 0xaf, 0xd5, 0xdf, + 0xd5, 0xfa, 0x7a, 0x26, 0xa9, 0x8a, 0x7b, 0xe6, 0x57, 0x30, 0xfa, 0x15, 0x00, 0x00, 0xff, 0xff, + 0x06, 0x10, 0xa8, 0x48, 0x95, 0x04, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -358,9 +355,11 @@ const _ = grpc.SupportPackageIsVersion4 type QueryClient interface { // Parameters queries the parameters of the module. Params(ctx context.Context, in *QueryParamsRequest, opts ...grpc.CallOption) (*QueryParamsResponse, error) - // EndedEpochBtcHeight returns the BTC light client height at provided epoch finish + // EndedEpochBtcHeight returns the BTC light client height at provided epoch + // finish EndedEpochBtcHeight(ctx context.Context, in *QueryEndedEpochBtcHeightRequest, opts ...grpc.CallOption) (*QueryEndedEpochBtcHeightResponse, error) - // ReportedCheckpointBtcHeight returns the BTC light client height at which the checkpoint with the given hash is reported back to Babylon + // ReportedCheckpointBtcHeight returns the BTC light client height at which + // the checkpoint with the given hash is reported back to Babylon ReportedCheckpointBtcHeight(ctx context.Context, in *QueryReportedCheckpointBtcHeightRequest, opts ...grpc.CallOption) (*QueryReportedCheckpointBtcHeightResponse, error) } @@ -403,9 +402,11 @@ func (c *queryClient) ReportedCheckpointBtcHeight(ctx context.Context, in *Query type QueryServer interface { // Parameters queries the parameters of the module. Params(context.Context, *QueryParamsRequest) (*QueryParamsResponse, error) - // EndedEpochBtcHeight returns the BTC light client height at provided epoch finish + // EndedEpochBtcHeight returns the BTC light client height at provided epoch + // finish EndedEpochBtcHeight(context.Context, *QueryEndedEpochBtcHeightRequest) (*QueryEndedEpochBtcHeightResponse, error) - // ReportedCheckpointBtcHeight returns the BTC light client height at which the checkpoint with the given hash is reported back to Babylon + // ReportedCheckpointBtcHeight returns the BTC light client height at which + // the checkpoint with the given hash is reported back to Babylon ReportedCheckpointBtcHeight(context.Context, *QueryReportedCheckpointBtcHeightRequest) (*QueryReportedCheckpointBtcHeightResponse, error) } @@ -499,7 +500,7 @@ var _Query_serviceDesc = grpc.ServiceDesc{ }, }, Streams: []grpc.StreamDesc{}, - Metadata: "babylon/monitor/query.proto", + Metadata: "babylon/monitor/v1/query.proto", } func (m *QueryParamsRequest) Marshal() (dAtA []byte, err error) { diff --git a/x/monitor/types/query.pb.gw.go b/x/monitor/types/query.pb.gw.go index a750169ed..a2399aa23 100644 --- a/x/monitor/types/query.pb.gw.go +++ b/x/monitor/types/query.pb.gw.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. -// source: babylon/monitor/query.proto +// source: babylon/monitor/v1/query.proto /* Package types is a reverse proxy. diff --git a/x/zoneconcierge/types/genesis.pb.go b/x/zoneconcierge/types/genesis.pb.go index 7ac822bdd..8a2451224 100644 --- a/x/zoneconcierge/types/genesis.pb.go +++ b/x/zoneconcierge/types/genesis.pb.go @@ -1,12 +1,12 @@ // Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: babylon/zoneconcierge/genesis.proto +// source: babylon/zoneconcierge/v1/genesis.proto package types import ( fmt "fmt" + _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/cosmos/gogoproto/proto" - _ "github.com/gogo/protobuf/gogoproto" io "io" math "math" math_bits "math/bits" @@ -33,7 +33,7 @@ func (m *GenesisState) Reset() { *m = GenesisState{} } func (m *GenesisState) String() string { return proto.CompactTextString(m) } func (*GenesisState) ProtoMessage() {} func (*GenesisState) Descriptor() ([]byte, []int) { - return fileDescriptor_d7b9195ea3db0fdd, []int{0} + return fileDescriptor_56f290ad7c2c7dc7, []int{0} } func (m *GenesisState) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -81,26 +81,26 @@ func init() { } func init() { - proto.RegisterFile("babylon/zoneconcierge/genesis.proto", fileDescriptor_d7b9195ea3db0fdd) + proto.RegisterFile("babylon/zoneconcierge/v1/genesis.proto", fileDescriptor_56f290ad7c2c7dc7) } -var fileDescriptor_d7b9195ea3db0fdd = []byte{ - // 225 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x4e, 0x4a, 0x4c, 0xaa, +var fileDescriptor_56f290ad7c2c7dc7 = []byte{ + // 228 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x4b, 0x4a, 0x4c, 0xaa, 0xcc, 0xc9, 0xcf, 0xd3, 0xaf, 0xca, 0xcf, 0x4b, 0x4d, 0xce, 0xcf, 0x4b, 0xce, 0x4c, 0x2d, 0x4a, - 0x4f, 0xd5, 0x4f, 0x4f, 0xcd, 0x4b, 0x2d, 0xce, 0x2c, 0xd6, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, - 0x92, 0x80, 0x2a, 0xd2, 0x43, 0x51, 0xa4, 0x57, 0x66, 0x28, 0x25, 0x92, 0x9e, 0x9f, 0x9e, 0x0f, - 0x56, 0xa4, 0x0f, 0x62, 0x41, 0xd4, 0x4b, 0x29, 0x61, 0x37, 0xb4, 0x20, 0xb1, 0x28, 0x31, 0x17, - 0x6a, 0xa6, 0x52, 0x3a, 0x17, 0x8f, 0x3b, 0xc4, 0x92, 0xe0, 0x92, 0xc4, 0x92, 0x54, 0x21, 0x3b, - 0x2e, 0x36, 0x88, 0xbc, 0x04, 0xa3, 0x02, 0xa3, 0x06, 0xb7, 0x91, 0x82, 0x1e, 0x2e, 0x4b, 0xf5, - 0x02, 0xc0, 0xea, 0x9c, 0x58, 0x4e, 0xdc, 0x93, 0x67, 0x08, 0x82, 0xea, 0x12, 0x12, 0xe7, 0x62, - 0x2f, 0xc8, 0x2f, 0x2a, 0x89, 0xcf, 0x4c, 0x91, 0x60, 0x52, 0x60, 0xd4, 0xe0, 0x0c, 0x62, 0x03, - 0x71, 0x3d, 0x53, 0x9c, 0xfc, 0x4f, 0x3c, 0x92, 0x63, 0xbc, 0xf0, 0x48, 0x8e, 0xf1, 0xc1, 0x23, - 0x39, 0xc6, 0x09, 0x8f, 0xe5, 0x18, 0x2e, 0x3c, 0x96, 0x63, 0xb8, 0xf1, 0x58, 0x8e, 0x21, 0xca, - 0x34, 0x3d, 0xb3, 0x24, 0xa3, 0x34, 0x49, 0x2f, 0x39, 0x3f, 0x57, 0x1f, 0x6a, 0x59, 0x72, 0x46, - 0x62, 0x66, 0x1e, 0x8c, 0xa3, 0x5f, 0x81, 0xe6, 0x81, 0x92, 0xca, 0x82, 0xd4, 0xe2, 0x24, 0x36, - 0xb0, 0x07, 0x8c, 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0xc4, 0xfa, 0x5c, 0xd5, 0x3b, 0x01, 0x00, - 0x00, + 0x4f, 0xd5, 0x2f, 0x33, 0xd4, 0x4f, 0x4f, 0xcd, 0x4b, 0x2d, 0xce, 0x2c, 0xd6, 0x2b, 0x28, 0xca, + 0x2f, 0xc9, 0x17, 0x92, 0x80, 0xaa, 0xd3, 0x43, 0x51, 0xa7, 0x57, 0x66, 0x28, 0x25, 0x92, 0x9e, + 0x9f, 0x9e, 0x0f, 0x56, 0xa4, 0x0f, 0x62, 0x41, 0xd4, 0x4b, 0xa9, 0xe2, 0x34, 0xb7, 0x20, 0xb1, + 0x28, 0x31, 0x17, 0x6a, 0xac, 0x52, 0x3a, 0x17, 0x8f, 0x3b, 0xc4, 0x9e, 0xe0, 0x92, 0xc4, 0x92, + 0x54, 0x21, 0x3b, 0x2e, 0x36, 0x88, 0xbc, 0x04, 0xa3, 0x02, 0xa3, 0x06, 0xb7, 0x91, 0x82, 0x1e, + 0x2e, 0x7b, 0xf5, 0x02, 0xc0, 0xea, 0x9c, 0x58, 0x4e, 0xdc, 0x93, 0x67, 0x08, 0x82, 0xea, 0x12, + 0x12, 0xe7, 0x62, 0x2f, 0xc8, 0x2f, 0x2a, 0x89, 0xcf, 0x4c, 0x91, 0x60, 0x52, 0x60, 0xd4, 0xe0, + 0x0c, 0x62, 0x03, 0x71, 0x3d, 0x53, 0x9c, 0xfc, 0x4f, 0x3c, 0x92, 0x63, 0xbc, 0xf0, 0x48, 0x8e, + 0xf1, 0xc1, 0x23, 0x39, 0xc6, 0x09, 0x8f, 0xe5, 0x18, 0x2e, 0x3c, 0x96, 0x63, 0xb8, 0xf1, 0x58, + 0x8e, 0x21, 0xca, 0x34, 0x3d, 0xb3, 0x24, 0xa3, 0x34, 0x49, 0x2f, 0x39, 0x3f, 0x57, 0x1f, 0x6a, + 0x59, 0x72, 0x46, 0x62, 0x66, 0x1e, 0x8c, 0xa3, 0x5f, 0x81, 0xe6, 0x87, 0x92, 0xca, 0x82, 0xd4, + 0xe2, 0x24, 0x36, 0xb0, 0x07, 0x8c, 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0xed, 0x60, 0x3d, 0x7d, + 0x41, 0x01, 0x00, 0x00, } func (m *GenesisState) Marshal() (dAtA []byte, err error) { diff --git a/x/zoneconcierge/types/packet.pb.go b/x/zoneconcierge/types/packet.pb.go index a6dff3387..54e720aa4 100644 --- a/x/zoneconcierge/types/packet.pb.go +++ b/x/zoneconcierge/types/packet.pb.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: babylon/zoneconcierge/packet.proto +// source: babylon/zoneconcierge/v1/packet.proto package types @@ -33,7 +33,7 @@ func (m *ZoneconciergePacketData) Reset() { *m = ZoneconciergePacketData func (m *ZoneconciergePacketData) String() string { return proto.CompactTextString(m) } func (*ZoneconciergePacketData) ProtoMessage() {} func (*ZoneconciergePacketData) Descriptor() ([]byte, []int) { - return fileDescriptor_40e046ee0bdbe2bf, []int{0} + return fileDescriptor_be12e124c5c4fdb9, []int{0} } func (m *ZoneconciergePacketData) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -103,7 +103,7 @@ func (m *Heartbeat) Reset() { *m = Heartbeat{} } func (m *Heartbeat) String() string { return proto.CompactTextString(m) } func (*Heartbeat) ProtoMessage() {} func (*Heartbeat) Descriptor() ([]byte, []int) { - return fileDescriptor_40e046ee0bdbe2bf, []int{1} + return fileDescriptor_be12e124c5c4fdb9, []int{1} } func (m *Heartbeat) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -145,24 +145,25 @@ func init() { } func init() { - proto.RegisterFile("babylon/zoneconcierge/packet.proto", fileDescriptor_40e046ee0bdbe2bf) + proto.RegisterFile("babylon/zoneconcierge/v1/packet.proto", fileDescriptor_be12e124c5c4fdb9) } -var fileDescriptor_40e046ee0bdbe2bf = []byte{ - // 206 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x4a, 0x4a, 0x4c, 0xaa, +var fileDescriptor_be12e124c5c4fdb9 = []byte{ + // 209 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x4d, 0x4a, 0x4c, 0xaa, 0xcc, 0xc9, 0xcf, 0xd3, 0xaf, 0xca, 0xcf, 0x4b, 0x4d, 0xce, 0xcf, 0x4b, 0xce, 0x4c, 0x2d, 0x4a, - 0x4f, 0xd5, 0x2f, 0x48, 0x4c, 0xce, 0x4e, 0x2d, 0xd1, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x92, - 0x80, 0xaa, 0xd1, 0x43, 0x51, 0xa3, 0x57, 0x66, 0xa8, 0x94, 0xc5, 0x25, 0x1e, 0x85, 0x2c, 0x16, - 0x00, 0xd6, 0xe6, 0x92, 0x58, 0x92, 0x28, 0xe4, 0xca, 0xc5, 0x95, 0x91, 0x9a, 0x58, 0x54, 0x92, - 0x04, 0x22, 0x24, 0x18, 0x15, 0x18, 0x35, 0xb8, 0x8d, 0x94, 0xf5, 0x70, 0x99, 0xa4, 0xe7, 0x01, - 0x55, 0x5b, 0xe2, 0xc1, 0x10, 0x84, 0xa4, 0xd1, 0x89, 0x83, 0x8b, 0x0d, 0xe2, 0x16, 0x25, 0x59, - 0x2e, 0x4e, 0xb8, 0x22, 0x21, 0x01, 0x2e, 0xe6, 0xdc, 0xe2, 0x74, 0xb0, 0xb1, 0x9c, 0x41, 0x20, - 0xa6, 0x93, 0xff, 0x89, 0x47, 0x72, 0x8c, 0x17, 0x1e, 0xc9, 0x31, 0x3e, 0x78, 0x24, 0xc7, 0x38, - 0xe1, 0xb1, 0x1c, 0xc3, 0x85, 0xc7, 0x72, 0x0c, 0x37, 0x1e, 0xcb, 0x31, 0x44, 0x99, 0xa6, 0x67, - 0x96, 0x64, 0x94, 0x26, 0xe9, 0x25, 0xe7, 0xe7, 0xea, 0x43, 0xed, 0x4f, 0xce, 0x48, 0xcc, 0xcc, - 0x83, 0x71, 0xf4, 0x2b, 0xd0, 0x3c, 0x5f, 0x52, 0x59, 0x90, 0x5a, 0x9c, 0xc4, 0x06, 0xf6, 0xbc, - 0x31, 0x20, 0x00, 0x00, 0xff, 0xff, 0xbf, 0xc2, 0x16, 0x4a, 0x22, 0x01, 0x00, 0x00, + 0x4f, 0xd5, 0x2f, 0x33, 0xd4, 0x2f, 0x48, 0x4c, 0xce, 0x4e, 0x2d, 0xd1, 0x2b, 0x28, 0xca, 0x2f, + 0xc9, 0x17, 0x92, 0x80, 0x2a, 0xd3, 0x43, 0x51, 0xa6, 0x57, 0x66, 0xa8, 0x94, 0xc5, 0x25, 0x1e, + 0x85, 0x2c, 0x16, 0x00, 0xd6, 0xe6, 0x92, 0x58, 0x92, 0x28, 0xe4, 0xca, 0xc5, 0x95, 0x91, 0x9a, + 0x58, 0x54, 0x92, 0x04, 0x22, 0x24, 0x18, 0x15, 0x18, 0x35, 0xb8, 0x8d, 0x94, 0xf5, 0x70, 0x99, + 0xa4, 0xe7, 0x01, 0x55, 0x5b, 0xe2, 0xc1, 0x10, 0x84, 0xa4, 0xd1, 0x89, 0x83, 0x8b, 0x0d, 0xe2, + 0x16, 0x25, 0x59, 0x2e, 0x4e, 0xb8, 0x22, 0x21, 0x01, 0x2e, 0xe6, 0xdc, 0xe2, 0x74, 0xb0, 0xb1, + 0x9c, 0x41, 0x20, 0xa6, 0x93, 0xff, 0x89, 0x47, 0x72, 0x8c, 0x17, 0x1e, 0xc9, 0x31, 0x3e, 0x78, + 0x24, 0xc7, 0x38, 0xe1, 0xb1, 0x1c, 0xc3, 0x85, 0xc7, 0x72, 0x0c, 0x37, 0x1e, 0xcb, 0x31, 0x44, + 0x99, 0xa6, 0x67, 0x96, 0x64, 0x94, 0x26, 0xe9, 0x25, 0xe7, 0xe7, 0xea, 0x43, 0xed, 0x4f, 0xce, + 0x48, 0xcc, 0xcc, 0x83, 0x71, 0xf4, 0x2b, 0xd0, 0xfc, 0x5f, 0x52, 0x59, 0x90, 0x5a, 0x9c, 0xc4, + 0x06, 0xf6, 0xbc, 0x31, 0x20, 0x00, 0x00, 0xff, 0xff, 0xe0, 0xc6, 0x63, 0x3e, 0x25, 0x01, 0x00, + 0x00, } func (m *ZoneconciergePacketData) Marshal() (dAtA []byte, err error) { diff --git a/x/zoneconcierge/types/params.pb.go b/x/zoneconcierge/types/params.pb.go index 127da2d72..a7f83a9fe 100644 --- a/x/zoneconcierge/types/params.pb.go +++ b/x/zoneconcierge/types/params.pb.go @@ -1,12 +1,12 @@ // Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: babylon/zoneconcierge/params.proto +// source: babylon/zoneconcierge/v1/params.proto package types import ( fmt "fmt" + _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/cosmos/gogoproto/proto" - _ "github.com/gogo/protobuf/gogoproto" io "io" math "math" math_bits "math/bits" @@ -30,7 +30,7 @@ type Params struct { func (m *Params) Reset() { *m = Params{} } func (*Params) ProtoMessage() {} func (*Params) Descriptor() ([]byte, []int) { - return fileDescriptor_3c5b947078cec19b, []int{0} + return fileDescriptor_c0696c936eb15fe4, []int{0} } func (m *Params) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -64,21 +64,22 @@ func init() { } func init() { - proto.RegisterFile("babylon/zoneconcierge/params.proto", fileDescriptor_3c5b947078cec19b) + proto.RegisterFile("babylon/zoneconcierge/v1/params.proto", fileDescriptor_c0696c936eb15fe4) } -var fileDescriptor_3c5b947078cec19b = []byte{ - // 160 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x4a, 0x4a, 0x4c, 0xaa, +var fileDescriptor_c0696c936eb15fe4 = []byte{ + // 163 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x4d, 0x4a, 0x4c, 0xaa, 0xcc, 0xc9, 0xcf, 0xd3, 0xaf, 0xca, 0xcf, 0x4b, 0x4d, 0xce, 0xcf, 0x4b, 0xce, 0x4c, 0x2d, 0x4a, - 0x4f, 0xd5, 0x2f, 0x48, 0x2c, 0x4a, 0xcc, 0x2d, 0xd6, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x92, - 0x80, 0xaa, 0xd1, 0x43, 0x51, 0xa3, 0x57, 0x66, 0x28, 0x25, 0x92, 0x9e, 0x9f, 0x9e, 0x0f, 0x56, - 0xa4, 0x0f, 0x62, 0x41, 0xd4, 0x2b, 0xf1, 0x71, 0xb1, 0x05, 0x80, 0xf5, 0x5b, 0xb1, 0xcc, 0x58, - 0x20, 0xcf, 0xe0, 0xe4, 0x7f, 0xe2, 0x91, 0x1c, 0xe3, 0x85, 0x47, 0x72, 0x8c, 0x0f, 0x1e, 0xc9, - 0x31, 0x4e, 0x78, 0x2c, 0xc7, 0x70, 0xe1, 0xb1, 0x1c, 0xc3, 0x8d, 0xc7, 0x72, 0x0c, 0x51, 0xa6, - 0xe9, 0x99, 0x25, 0x19, 0xa5, 0x49, 0x7a, 0xc9, 0xf9, 0xb9, 0xfa, 0x50, 0x4b, 0x92, 0x33, 0x12, - 0x33, 0xf3, 0x60, 0x1c, 0xfd, 0x0a, 0x34, 0x77, 0x95, 0x54, 0x16, 0xa4, 0x16, 0x27, 0xb1, 0x81, - 0xed, 0x31, 0x06, 0x04, 0x00, 0x00, 0xff, 0xff, 0x43, 0xb4, 0x76, 0x93, 0xbd, 0x00, 0x00, 0x00, + 0x4f, 0xd5, 0x2f, 0x33, 0xd4, 0x2f, 0x48, 0x2c, 0x4a, 0xcc, 0x2d, 0xd6, 0x2b, 0x28, 0xca, 0x2f, + 0xc9, 0x17, 0x92, 0x80, 0x2a, 0xd3, 0x43, 0x51, 0xa6, 0x57, 0x66, 0x28, 0x25, 0x92, 0x9e, 0x9f, + 0x9e, 0x0f, 0x56, 0xa4, 0x0f, 0x62, 0x41, 0xd4, 0x2b, 0xf1, 0x71, 0xb1, 0x05, 0x80, 0xf5, 0x5b, + 0xb1, 0xcc, 0x58, 0x20, 0xcf, 0xe0, 0xe4, 0x7f, 0xe2, 0x91, 0x1c, 0xe3, 0x85, 0x47, 0x72, 0x8c, + 0x0f, 0x1e, 0xc9, 0x31, 0x4e, 0x78, 0x2c, 0xc7, 0x70, 0xe1, 0xb1, 0x1c, 0xc3, 0x8d, 0xc7, 0x72, + 0x0c, 0x51, 0xa6, 0xe9, 0x99, 0x25, 0x19, 0xa5, 0x49, 0x7a, 0xc9, 0xf9, 0xb9, 0xfa, 0x50, 0x4b, + 0x92, 0x33, 0x12, 0x33, 0xf3, 0x60, 0x1c, 0xfd, 0x0a, 0x34, 0xa7, 0x95, 0x54, 0x16, 0xa4, 0x16, + 0x27, 0xb1, 0x81, 0xed, 0x31, 0x06, 0x04, 0x00, 0x00, 0xff, 0xff, 0x7f, 0x50, 0xb4, 0xe9, 0xc0, + 0x00, 0x00, 0x00, } func (m *Params) Marshal() (dAtA []byte, err error) { diff --git a/x/zoneconcierge/types/query.pb.go b/x/zoneconcierge/types/query.pb.go index b447c13e8..5676408d9 100644 --- a/x/zoneconcierge/types/query.pb.go +++ b/x/zoneconcierge/types/query.pb.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: babylon/zoneconcierge/query.proto +// source: babylon/zoneconcierge/v1/query.proto package types @@ -10,9 +10,9 @@ import ( types1 "github.com/babylonchain/babylon/x/checkpointing/types" types "github.com/babylonchain/babylon/x/epoching/types" query "github.com/cosmos/cosmos-sdk/types/query" + _ "github.com/cosmos/gogoproto/gogoproto" grpc1 "github.com/cosmos/gogoproto/grpc" proto "github.com/cosmos/gogoproto/proto" - _ "github.com/gogo/protobuf/gogoproto" _ "google.golang.org/genproto/googleapis/api/annotations" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" @@ -41,7 +41,7 @@ func (m *QueryParamsRequest) Reset() { *m = QueryParamsRequest{} } func (m *QueryParamsRequest) String() string { return proto.CompactTextString(m) } func (*QueryParamsRequest) ProtoMessage() {} func (*QueryParamsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2caab7ee15063236, []int{0} + return fileDescriptor_cd665af90102da38, []int{0} } func (m *QueryParamsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -80,7 +80,7 @@ func (m *QueryParamsResponse) Reset() { *m = QueryParamsResponse{} } func (m *QueryParamsResponse) String() string { return proto.CompactTextString(m) } func (*QueryParamsResponse) ProtoMessage() {} func (*QueryParamsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_2caab7ee15063236, []int{1} + return fileDescriptor_cd665af90102da38, []int{1} } func (m *QueryParamsResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -126,7 +126,7 @@ func (m *QueryHeaderRequest) Reset() { *m = QueryHeaderRequest{} } func (m *QueryHeaderRequest) String() string { return proto.CompactTextString(m) } func (*QueryHeaderRequest) ProtoMessage() {} func (*QueryHeaderRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2caab7ee15063236, []int{2} + return fileDescriptor_cd665af90102da38, []int{2} } func (m *QueryHeaderRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -179,7 +179,7 @@ func (m *QueryHeaderResponse) Reset() { *m = QueryHeaderResponse{} } func (m *QueryHeaderResponse) String() string { return proto.CompactTextString(m) } func (*QueryHeaderResponse) ProtoMessage() {} func (*QueryHeaderResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_2caab7ee15063236, []int{3} + return fileDescriptor_cd665af90102da38, []int{3} } func (m *QueryHeaderResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -232,7 +232,7 @@ func (m *QueryChainListRequest) Reset() { *m = QueryChainListRequest{} } func (m *QueryChainListRequest) String() string { return proto.CompactTextString(m) } func (*QueryChainListRequest) ProtoMessage() {} func (*QueryChainListRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2caab7ee15063236, []int{4} + return fileDescriptor_cd665af90102da38, []int{4} } func (m *QueryChainListRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -280,7 +280,7 @@ func (m *QueryChainListResponse) Reset() { *m = QueryChainListResponse{} func (m *QueryChainListResponse) String() string { return proto.CompactTextString(m) } func (*QueryChainListResponse) ProtoMessage() {} func (*QueryChainListResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_2caab7ee15063236, []int{5} + return fileDescriptor_cd665af90102da38, []int{5} } func (m *QueryChainListResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -332,7 +332,7 @@ func (m *QueryChainInfoRequest) Reset() { *m = QueryChainInfoRequest{} } func (m *QueryChainInfoRequest) String() string { return proto.CompactTextString(m) } func (*QueryChainInfoRequest) ProtoMessage() {} func (*QueryChainInfoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2caab7ee15063236, []int{6} + return fileDescriptor_cd665af90102da38, []int{6} } func (m *QueryChainInfoRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -378,7 +378,7 @@ func (m *QueryChainInfoResponse) Reset() { *m = QueryChainInfoResponse{} func (m *QueryChainInfoResponse) String() string { return proto.CompactTextString(m) } func (*QueryChainInfoResponse) ProtoMessage() {} func (*QueryChainInfoResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_2caab7ee15063236, []int{7} + return fileDescriptor_cd665af90102da38, []int{7} } func (m *QueryChainInfoResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -414,7 +414,8 @@ func (m *QueryChainInfoResponse) GetChainInfo() *ChainInfo { return nil } -// QueryEpochChainInfoRequest is request type for the Query/EpochChainInfo RPC method. +// QueryEpochChainInfoRequest is request type for the Query/EpochChainInfo RPC +// method. type QueryEpochChainInfoRequest struct { EpochNum uint64 `protobuf:"varint,1,opt,name=epoch_num,json=epochNum,proto3" json:"epoch_num,omitempty"` ChainId string `protobuf:"bytes,2,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` @@ -424,7 +425,7 @@ func (m *QueryEpochChainInfoRequest) Reset() { *m = QueryEpochChainInfoR func (m *QueryEpochChainInfoRequest) String() string { return proto.CompactTextString(m) } func (*QueryEpochChainInfoRequest) ProtoMessage() {} func (*QueryEpochChainInfoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2caab7ee15063236, []int{8} + return fileDescriptor_cd665af90102da38, []int{8} } func (m *QueryEpochChainInfoRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -467,7 +468,8 @@ func (m *QueryEpochChainInfoRequest) GetChainId() string { return "" } -// QueryEpochChainInfoResponse is response type for the Query/EpochChainInfo RPC method. +// QueryEpochChainInfoResponse is response type for the Query/EpochChainInfo RPC +// method. type QueryEpochChainInfoResponse struct { // chain_info is the info of the CZ ChainInfo *ChainInfo `protobuf:"bytes,1,opt,name=chain_info,json=chainInfo,proto3" json:"chain_info,omitempty"` @@ -477,7 +479,7 @@ func (m *QueryEpochChainInfoResponse) Reset() { *m = QueryEpochChainInfo func (m *QueryEpochChainInfoResponse) String() string { return proto.CompactTextString(m) } func (*QueryEpochChainInfoResponse) ProtoMessage() {} func (*QueryEpochChainInfoResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_2caab7ee15063236, []int{9} + return fileDescriptor_cd665af90102da38, []int{9} } func (m *QueryEpochChainInfoResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -524,7 +526,7 @@ func (m *QueryListHeadersRequest) Reset() { *m = QueryListHeadersRequest func (m *QueryListHeadersRequest) String() string { return proto.CompactTextString(m) } func (*QueryListHeadersRequest) ProtoMessage() {} func (*QueryListHeadersRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2caab7ee15063236, []int{10} + return fileDescriptor_cd665af90102da38, []int{10} } func (m *QueryListHeadersRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -567,7 +569,8 @@ func (m *QueryListHeadersRequest) GetPagination() *query.PageRequest { return nil } -// QueryListHeadersResponse is response type for the Query/ListHeaders RPC method. +// QueryListHeadersResponse is response type for the Query/ListHeaders RPC +// method. type QueryListHeadersResponse struct { // headers is the list of headers Headers []*IndexedHeader `protobuf:"bytes,1,rep,name=headers,proto3" json:"headers,omitempty"` @@ -579,7 +582,7 @@ func (m *QueryListHeadersResponse) Reset() { *m = QueryListHeadersRespon func (m *QueryListHeadersResponse) String() string { return proto.CompactTextString(m) } func (*QueryListHeadersResponse) ProtoMessage() {} func (*QueryListHeadersResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_2caab7ee15063236, []int{11} + return fileDescriptor_cd665af90102da38, []int{11} } func (m *QueryListHeadersResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -622,7 +625,8 @@ func (m *QueryListHeadersResponse) GetPagination() *query.PageResponse { return nil } -// QueryListEpochHeadersRequest is request type for the Query/ListEpochHeaders RPC method. +// QueryListEpochHeadersRequest is request type for the Query/ListEpochHeaders +// RPC method. type QueryListEpochHeadersRequest struct { EpochNum uint64 `protobuf:"varint,1,opt,name=epoch_num,json=epochNum,proto3" json:"epoch_num,omitempty"` ChainId string `protobuf:"bytes,2,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` @@ -632,7 +636,7 @@ func (m *QueryListEpochHeadersRequest) Reset() { *m = QueryListEpochHead func (m *QueryListEpochHeadersRequest) String() string { return proto.CompactTextString(m) } func (*QueryListEpochHeadersRequest) ProtoMessage() {} func (*QueryListEpochHeadersRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2caab7ee15063236, []int{12} + return fileDescriptor_cd665af90102da38, []int{12} } func (m *QueryListEpochHeadersRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -675,7 +679,8 @@ func (m *QueryListEpochHeadersRequest) GetChainId() string { return "" } -// QueryListEpochHeadersResponse is response type for the Query/ListEpochHeaders RPC method. +// QueryListEpochHeadersResponse is response type for the Query/ListEpochHeaders +// RPC method. type QueryListEpochHeadersResponse struct { // headers is the list of headers Headers []*IndexedHeader `protobuf:"bytes,1,rep,name=headers,proto3" json:"headers,omitempty"` @@ -685,7 +690,7 @@ func (m *QueryListEpochHeadersResponse) Reset() { *m = QueryListEpochHea func (m *QueryListEpochHeadersResponse) String() string { return proto.CompactTextString(m) } func (*QueryListEpochHeadersResponse) ProtoMessage() {} func (*QueryListEpochHeadersResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_2caab7ee15063236, []int{13} + return fileDescriptor_cd665af90102da38, []int{13} } func (m *QueryListEpochHeadersResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -721,7 +726,8 @@ func (m *QueryListEpochHeadersResponse) GetHeaders() []*IndexedHeader { return nil } -// QueryFinalizedChainInfoRequest is request type for the Query/FinalizedChainInfo RPC method. +// QueryFinalizedChainInfoRequest is request type for the +// Query/FinalizedChainInfo RPC method. type QueryFinalizedChainInfoRequest struct { // chain_id is the ID of the CZ ChainId string `protobuf:"bytes,1,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` @@ -733,7 +739,7 @@ func (m *QueryFinalizedChainInfoRequest) Reset() { *m = QueryFinalizedCh func (m *QueryFinalizedChainInfoRequest) String() string { return proto.CompactTextString(m) } func (*QueryFinalizedChainInfoRequest) ProtoMessage() {} func (*QueryFinalizedChainInfoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2caab7ee15063236, []int{14} + return fileDescriptor_cd665af90102da38, []int{14} } func (m *QueryFinalizedChainInfoRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -776,7 +782,8 @@ func (m *QueryFinalizedChainInfoRequest) GetProve() bool { return false } -// QueryFinalizedChainInfoResponse is response type for the Query/FinalizedChainInfo RPC method. +// QueryFinalizedChainInfoResponse is response type for the +// Query/FinalizedChainInfo RPC method. type QueryFinalizedChainInfoResponse struct { // finalized_chain_info is the info of the CZ FinalizedChainInfo *ChainInfo `protobuf:"bytes,1,opt,name=finalized_chain_info,json=finalizedChainInfo,proto3" json:"finalized_chain_info,omitempty"` @@ -784,7 +791,8 @@ type QueryFinalizedChainInfoResponse struct { EpochInfo *types.Epoch `protobuf:"bytes,2,opt,name=epoch_info,json=epochInfo,proto3" json:"epoch_info,omitempty"` // raw_checkpoint is the raw checkpoint of this epoch RawCheckpoint *types1.RawCheckpoint `protobuf:"bytes,3,opt,name=raw_checkpoint,json=rawCheckpoint,proto3" json:"raw_checkpoint,omitempty"` - // btc_submission_key is position of two BTC txs that include the raw checkpoint of this epoch + // btc_submission_key is position of two BTC txs that include the raw + // checkpoint of this epoch BtcSubmissionKey *types2.SubmissionKey `protobuf:"bytes,4,opt,name=btc_submission_key,json=btcSubmissionKey,proto3" json:"btc_submission_key,omitempty"` // proof is the proof that the chain info is finalized Proof *ProofFinalizedChainInfo `protobuf:"bytes,5,opt,name=proof,proto3" json:"proof,omitempty"` @@ -794,7 +802,7 @@ func (m *QueryFinalizedChainInfoResponse) Reset() { *m = QueryFinalizedC func (m *QueryFinalizedChainInfoResponse) String() string { return proto.CompactTextString(m) } func (*QueryFinalizedChainInfoResponse) ProtoMessage() {} func (*QueryFinalizedChainInfoResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_2caab7ee15063236, []int{15} + return fileDescriptor_cd665af90102da38, []int{15} } func (m *QueryFinalizedChainInfoResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -858,12 +866,14 @@ func (m *QueryFinalizedChainInfoResponse) GetProof() *ProofFinalizedChainInfo { return nil } -// QueryFinalizedChainInfoUntilHeightRequest is request type for the Query/FinalizedChainInfoUntilHeight RPC method. +// QueryFinalizedChainInfoUntilHeightRequest is request type for the +// Query/FinalizedChainInfoUntilHeight RPC method. type QueryFinalizedChainInfoUntilHeightRequest struct { // chain_id is the ID of the CZ ChainId string `protobuf:"bytes,1,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` // height is the height of the CZ chain - // such that the returned finalised chain info will be no later than this height + // such that the returned finalised chain info will be no later than this + // height Height uint64 `protobuf:"varint,2,opt,name=height,proto3" json:"height,omitempty"` // prove indicates whether the querier wants to get proofs of this timestamp Prove bool `protobuf:"varint,3,opt,name=prove,proto3" json:"prove,omitempty"` @@ -877,7 +887,7 @@ func (m *QueryFinalizedChainInfoUntilHeightRequest) String() string { } func (*QueryFinalizedChainInfoUntilHeightRequest) ProtoMessage() {} func (*QueryFinalizedChainInfoUntilHeightRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2caab7ee15063236, []int{16} + return fileDescriptor_cd665af90102da38, []int{16} } func (m *QueryFinalizedChainInfoUntilHeightRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -927,7 +937,8 @@ func (m *QueryFinalizedChainInfoUntilHeightRequest) GetProve() bool { return false } -// QueryFinalizedChainInfoUntilHeightResponse is response type for the Query/FinalizedChainInfoUntilHeight RPC method. +// QueryFinalizedChainInfoUntilHeightResponse is response type for the +// Query/FinalizedChainInfoUntilHeight RPC method. type QueryFinalizedChainInfoUntilHeightResponse struct { // finalized_chain_info is the info of the CZ FinalizedChainInfo *ChainInfo `protobuf:"bytes,1,opt,name=finalized_chain_info,json=finalizedChainInfo,proto3" json:"finalized_chain_info,omitempty"` @@ -935,7 +946,8 @@ type QueryFinalizedChainInfoUntilHeightResponse struct { EpochInfo *types.Epoch `protobuf:"bytes,2,opt,name=epoch_info,json=epochInfo,proto3" json:"epoch_info,omitempty"` // raw_checkpoint is the raw checkpoint of this epoch RawCheckpoint *types1.RawCheckpoint `protobuf:"bytes,3,opt,name=raw_checkpoint,json=rawCheckpoint,proto3" json:"raw_checkpoint,omitempty"` - // btc_submission_key is position of two BTC txs that include the raw checkpoint of this epoch + // btc_submission_key is position of two BTC txs that include the raw + // checkpoint of this epoch BtcSubmissionKey *types2.SubmissionKey `protobuf:"bytes,4,opt,name=btc_submission_key,json=btcSubmissionKey,proto3" json:"btc_submission_key,omitempty"` // proof is the proof that the chain info is finalized Proof *ProofFinalizedChainInfo `protobuf:"bytes,5,opt,name=proof,proto3" json:"proof,omitempty"` @@ -949,7 +961,7 @@ func (m *QueryFinalizedChainInfoUntilHeightResponse) String() string { } func (*QueryFinalizedChainInfoUntilHeightResponse) ProtoMessage() {} func (*QueryFinalizedChainInfoUntilHeightResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_2caab7ee15063236, []int{17} + return fileDescriptor_cd665af90102da38, []int{17} } func (m *QueryFinalizedChainInfoUntilHeightResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1034,83 +1046,84 @@ func init() { proto.RegisterType((*QueryFinalizedChainInfoUntilHeightResponse)(nil), "babylon.zoneconcierge.v1.QueryFinalizedChainInfoUntilHeightResponse") } -func init() { proto.RegisterFile("babylon/zoneconcierge/query.proto", fileDescriptor_2caab7ee15063236) } - -var fileDescriptor_2caab7ee15063236 = []byte{ - // 1155 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x58, 0x4f, 0x6f, 0xdc, 0x44, - 0x14, 0x8f, 0xf3, 0xaf, 0xc9, 0x0b, 0xad, 0xaa, 0x21, 0x94, 0xc5, 0x69, 0x37, 0xc1, 0x48, 0x25, - 0xad, 0x8a, 0x8d, 0x97, 0x96, 0x12, 0x21, 0x51, 0x65, 0x53, 0x92, 0x86, 0xa2, 0xd2, 0x18, 0xc2, - 0x01, 0x21, 0xad, 0x6c, 0xef, 0xac, 0xd7, 0x4a, 0xd6, 0xb3, 0xf5, 0x78, 0xb7, 0xd9, 0x86, 0x70, - 0xe0, 0x0b, 0x80, 0xc4, 0x05, 0x71, 0x45, 0x2a, 0x12, 0x87, 0x7e, 0x8e, 0x22, 0xf5, 0x50, 0x89, - 0x0b, 0x27, 0x84, 0x12, 0xbe, 0x06, 0x12, 0xf2, 0xcc, 0xd8, 0x6b, 0xef, 0xda, 0xdd, 0x3f, 0xe4, - 0xc0, 0x81, 0xdb, 0x8e, 0xe7, 0xbd, 0xdf, 0xfb, 0xbd, 0x7f, 0xf3, 0x9e, 0x16, 0x5e, 0xb7, 0x4c, - 0xab, 0xb3, 0x4f, 0x3c, 0xed, 0x11, 0xf1, 0xb0, 0x4d, 0x3c, 0xdb, 0xc5, 0xbe, 0x83, 0xb5, 0x07, - 0x2d, 0xec, 0x77, 0xd4, 0xa6, 0x4f, 0x02, 0x82, 0x0a, 0x42, 0x44, 0x4d, 0x89, 0xa8, 0x6d, 0x5d, - 0x5e, 0x74, 0x88, 0x43, 0x98, 0x90, 0x16, 0xfe, 0xe2, 0xf2, 0xf2, 0x45, 0x87, 0x10, 0x67, 0x1f, - 0x6b, 0x66, 0xd3, 0xd5, 0x4c, 0xcf, 0x23, 0x81, 0x19, 0xb8, 0xc4, 0xa3, 0xe2, 0xf6, 0xaa, 0x4d, - 0x68, 0x83, 0x50, 0xcd, 0x32, 0xa9, 0x30, 0xa3, 0xb5, 0x75, 0x0b, 0x07, 0xa6, 0xae, 0x35, 0x4d, - 0xc7, 0xf5, 0x98, 0xb0, 0x90, 0x2d, 0x46, 0xe4, 0xac, 0xc0, 0xb6, 0xeb, 0xd8, 0xde, 0x6b, 0x12, - 0xd7, 0x0b, 0xb4, 0xe0, 0x40, 0xdc, 0x5f, 0xc9, 0xbe, 0x4f, 0x9d, 0x84, 0x68, 0xec, 0x67, 0xf7, - 0xc6, 0xf5, 0x9c, 0xa4, 0x9f, 0xf2, 0xe5, 0x6c, 0x91, 0x3e, 0x28, 0x25, 0x92, 0xc3, 0x4d, 0x62, - 0xd7, 0x43, 0x91, 0xb6, 0x1e, 0xff, 0xee, 0x95, 0x49, 0x87, 0xb5, 0x69, 0xfa, 0x66, 0x83, 0xf6, - 0xb2, 0x4f, 0xcb, 0xa4, 0xa3, 0xcc, 0x44, 0x95, 0x45, 0x40, 0x3b, 0x21, 0xd3, 0xfb, 0x4c, 0xdf, - 0xc0, 0x0f, 0x5a, 0x98, 0x06, 0xca, 0x2e, 0xbc, 0x9c, 0xfa, 0x4a, 0x9b, 0xc4, 0xa3, 0x18, 0x7d, - 0x00, 0xb3, 0xdc, 0x4e, 0x41, 0x5a, 0x91, 0x56, 0x17, 0x4a, 0x2b, 0x6a, 0x5e, 0x02, 0x55, 0xae, - 0x59, 0x9e, 0x7e, 0xfa, 0xc7, 0xf2, 0x84, 0x21, 0xb4, 0x94, 0x2d, 0x61, 0xec, 0x0e, 0x36, 0xab, - 0xd8, 0x17, 0xc6, 0xd0, 0x6b, 0x30, 0x67, 0xd7, 0x4d, 0xd7, 0xab, 0xb8, 0x55, 0x86, 0x3b, 0x6f, - 0x9c, 0x61, 0xe7, 0xed, 0x2a, 0xba, 0x00, 0xb3, 0x75, 0xec, 0x3a, 0xf5, 0xa0, 0x30, 0xb9, 0x22, - 0xad, 0x4e, 0x1b, 0xe2, 0xa4, 0xfc, 0x28, 0x09, 0x82, 0x11, 0x92, 0x20, 0x78, 0x2b, 0x94, 0x0f, - 0xbf, 0x08, 0x82, 0x6f, 0xe6, 0x13, 0xdc, 0xf6, 0xaa, 0xf8, 0x00, 0x57, 0x05, 0x80, 0x50, 0x43, - 0x65, 0x78, 0xa9, 0x46, 0xfc, 0xbd, 0x0a, 0x3f, 0x52, 0x66, 0x76, 0xa1, 0xb4, 0x9c, 0x0f, 0xb3, - 0x49, 0xfc, 0x3d, 0x6a, 0x2c, 0x84, 0x4a, 0x1c, 0x8a, 0x2a, 0x15, 0x78, 0x85, 0x71, 0xdb, 0x08, - 0x9d, 0xf8, 0xd8, 0xa5, 0x41, 0xe4, 0xe8, 0x26, 0x40, 0xb7, 0x10, 0x05, 0xc3, 0xcb, 0x2a, 0xaf, - 0x5a, 0x35, 0xac, 0x5a, 0x95, 0x17, 0x8d, 0xa8, 0x5a, 0xf5, 0xbe, 0xe9, 0x60, 0xa1, 0x6b, 0x24, - 0x34, 0x95, 0xaf, 0xe1, 0x42, 0xaf, 0x01, 0xe1, 0xff, 0x12, 0xcc, 0x47, 0xa1, 0x0c, 0x73, 0x34, - 0xb5, 0x3a, 0x6f, 0xcc, 0x89, 0x58, 0x52, 0xb4, 0x95, 0x32, 0x3f, 0x29, 0x02, 0x34, 0xc8, 0x3c, - 0x47, 0x4e, 0xd9, 0x2f, 0x25, 0x1d, 0xdc, 0xf6, 0x6a, 0x64, 0x70, 0x26, 0x95, 0x2f, 0x93, 0x9c, - 0xb9, 0x8e, 0xe0, 0x5c, 0x06, 0x10, 0x4a, 0x5e, 0x8d, 0x88, 0xa8, 0xbc, 0x91, 0x1f, 0xf0, 0x2e, - 0x00, 0x77, 0x35, 0xfc, 0xa9, 0x7c, 0x06, 0x32, 0x43, 0xff, 0x30, 0xec, 0x95, 0x3e, 0x5a, 0x4b, - 0x30, 0xcf, 0x9a, 0xa8, 0xe2, 0xb5, 0x1a, 0xcc, 0xc0, 0xb4, 0x31, 0xc7, 0x3e, 0xdc, 0x6b, 0x35, - 0x52, 0x9c, 0x27, 0xd3, 0x9c, 0x4d, 0x58, 0xca, 0x44, 0x3d, 0x45, 0xe2, 0x5f, 0xc1, 0xab, 0xcc, - 0x44, 0x98, 0x45, 0x51, 0x3f, 0x43, 0xb4, 0xc5, 0x66, 0x46, 0x26, 0xc7, 0x29, 0xa4, 0xc7, 0x12, - 0x14, 0xfa, 0xcd, 0x0b, 0xf7, 0xd6, 0xe1, 0x4c, 0xd4, 0x05, 0x61, 0x25, 0x8d, 0xd0, 0x4c, 0x91, - 0xde, 0xe9, 0x55, 0xdc, 0xe7, 0x70, 0x31, 0xe6, 0xc9, 0xb2, 0xd1, 0x13, 0xab, 0x71, 0x33, 0x6c, - 0xc1, 0xa5, 0x1c, 0xdc, 0x53, 0x0b, 0x82, 0xb2, 0x03, 0x45, 0x66, 0x63, 0xd3, 0xf5, 0xcc, 0x7d, - 0xf7, 0x11, 0xae, 0x8e, 0xd0, 0x36, 0x68, 0x11, 0x66, 0x9a, 0x3e, 0x69, 0x63, 0x46, 0x7c, 0xce, - 0xe0, 0x07, 0xe5, 0xa7, 0x29, 0x58, 0xce, 0xc5, 0x14, 0xcc, 0x77, 0x61, 0xb1, 0x16, 0xdd, 0x56, - 0xc6, 0xab, 0x53, 0x54, 0xeb, 0x83, 0x47, 0x6b, 0x00, 0x3c, 0xd2, 0x0c, 0x8c, 0xa7, 0x54, 0x8e, - 0xc1, 0xe2, 0x59, 0xd5, 0xd6, 0x55, 0x16, 0x4f, 0x83, 0xe7, 0x85, 0xa9, 0xde, 0x83, 0x73, 0xbe, - 0xf9, 0xb0, 0xd2, 0x9d, 0x7a, 0x85, 0xa9, 0x9e, 0x47, 0x3a, 0x35, 0x1e, 0x43, 0x0c, 0xc3, 0x7c, - 0xb8, 0x11, 0x7f, 0x33, 0xce, 0xfa, 0xc9, 0x23, 0xda, 0x05, 0x64, 0x05, 0x76, 0x85, 0xb6, 0xac, - 0x86, 0x4b, 0xa9, 0x4b, 0xbc, 0xca, 0x1e, 0xee, 0x14, 0xa6, 0x7b, 0x30, 0xd3, 0x23, 0xbb, 0xad, - 0xab, 0x9f, 0xc6, 0xf2, 0x77, 0x71, 0xc7, 0x38, 0x6f, 0x05, 0x76, 0xea, 0x0b, 0xda, 0x62, 0x21, - 0x27, 0xb5, 0xc2, 0x0c, 0x43, 0xd2, 0x5f, 0x30, 0xe3, 0x42, 0xb1, 0x8c, 0x14, 0x70, 0x7d, 0x25, - 0x80, 0x2b, 0x39, 0x49, 0xda, 0xf5, 0x02, 0x77, 0xff, 0x0e, 0x1b, 0x65, 0xe3, 0x0f, 0xc1, 0x6e, - 0x6d, 0x4c, 0x25, 0x6b, 0xe3, 0xc9, 0x14, 0x5c, 0x1d, 0xc6, 0xec, 0xff, 0x65, 0xf2, 0xdf, 0x28, - 0x93, 0xd2, 0xe3, 0xb3, 0x30, 0xc3, 0x12, 0x86, 0xbe, 0x95, 0x60, 0x96, 0xef, 0x4d, 0xe8, 0x5a, - 0x3e, 0x5c, 0xff, 0xba, 0x26, 0xbf, 0x35, 0xa4, 0x34, 0xcf, 0xb9, 0xb2, 0xfa, 0xcd, 0x6f, 0x7f, - 0x7d, 0x3f, 0xa9, 0xa0, 0x15, 0x2d, 0x7b, 0x4f, 0x6c, 0xeb, 0x62, 0x9d, 0x44, 0x4f, 0x24, 0x98, - 0xe5, 0xef, 0xd9, 0x40, 0x46, 0xa9, 0x9d, 0x6e, 0x20, 0xa3, 0xf4, 0xde, 0xa6, 0x6c, 0x31, 0x46, - 0xeb, 0xe8, 0x56, 0x3e, 0xa3, 0x6e, 0x6d, 0x6a, 0x87, 0x51, 0xa7, 0x1c, 0x69, 0xfc, 0x91, 0xd5, - 0x0e, 0x79, 0x4b, 0x1c, 0xa1, 0x1f, 0x24, 0x98, 0x8f, 0xd7, 0x22, 0xa4, 0x0d, 0x60, 0xd1, 0xbb, - 0xa1, 0xc9, 0x6f, 0x0f, 0xaf, 0x30, 0x7c, 0x2c, 0x19, 0x5b, 0x8a, 0x7e, 0x8e, 0xa8, 0xb1, 0x2a, - 0x1f, 0x8a, 0x5a, 0x62, 0x48, 0x0c, 0x47, 0x2d, 0x39, 0x01, 0x94, 0x9b, 0x8c, 0x9a, 0x8e, 0xb4, - 0x11, 0x83, 0x8a, 0x7e, 0x95, 0xe0, 0x5c, 0x7a, 0xe7, 0x41, 0xd7, 0x07, 0x58, 0xcf, 0x5c, 0xbc, - 0xe4, 0x1b, 0x23, 0x6a, 0x09, 0xe2, 0x1f, 0x31, 0xe2, 0xb7, 0x51, 0x79, 0xd4, 0x6a, 0x60, 0x8f, - 0x08, 0xd5, 0x0e, 0xe3, 0x5d, 0xe0, 0x08, 0xfd, 0x22, 0xc1, 0x42, 0x62, 0xbb, 0x41, 0xfa, 0x00, - 0x4a, 0xfd, 0x8b, 0x98, 0x5c, 0x1a, 0x45, 0x45, 0xb8, 0x70, 0x9d, 0xb9, 0xa0, 0xa2, 0x6b, 0xf9, - 0x2e, 0x88, 0xfd, 0x20, 0x19, 0xf8, 0x67, 0x12, 0x9c, 0xef, 0x5d, 0x45, 0xd0, 0xbb, 0x43, 0x98, - 0xcf, 0xd8, 0x89, 0xe4, 0x9b, 0x23, 0xeb, 0x0d, 0xdf, 0x8c, 0xfd, 0xdc, 0xb3, 0x62, 0xff, 0x4c, - 0x02, 0xd4, 0xff, 0xee, 0xa1, 0xf7, 0x06, 0x10, 0xcb, 0x5d, 0x94, 0xe4, 0xb5, 0x31, 0x34, 0x85, - 0x53, 0xeb, 0xcc, 0xa9, 0xf7, 0xd1, 0x5a, 0xbe, 0x53, 0x59, 0x73, 0x30, 0x99, 0x9d, 0xbf, 0x25, - 0xb8, 0xf4, 0xc2, 0xa1, 0x8a, 0x36, 0x46, 0xe6, 0xd7, 0xbf, 0x09, 0xc8, 0xb7, 0xff, 0x1d, 0x88, - 0xf0, 0x77, 0x87, 0xf9, 0x7b, 0x17, 0x6d, 0x8f, 0xed, 0xaf, 0xc6, 0xdf, 0xd4, 0xf8, 0x6d, 0x2d, - 0x7f, 0xf2, 0xf4, 0xb8, 0x28, 0x3d, 0x3f, 0x2e, 0x4a, 0x7f, 0x1e, 0x17, 0xa5, 0xef, 0x4e, 0x8a, - 0x13, 0xcf, 0x4f, 0x8a, 0x13, 0xbf, 0x9f, 0x14, 0x27, 0xbe, 0xb8, 0xe1, 0xb8, 0x41, 0xbd, 0x65, - 0xa9, 0x36, 0x69, 0x44, 0xe6, 0x18, 0x4c, 0x6c, 0xfb, 0xa0, 0xc7, 0x7a, 0xd0, 0x69, 0x62, 0x6a, - 0xcd, 0xb2, 0xbf, 0x20, 0xde, 0xf9, 0x27, 0x00, 0x00, 0xff, 0xff, 0x1f, 0xf5, 0xc1, 0xb9, 0x2a, - 0x12, 0x00, 0x00, +func init() { + proto.RegisterFile("babylon/zoneconcierge/v1/query.proto", fileDescriptor_cd665af90102da38) +} + +var fileDescriptor_cd665af90102da38 = []byte{ + // 1145 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x58, 0x5f, 0x6f, 0xdb, 0x54, + 0x14, 0xaf, 0xfb, 0x27, 0x6b, 0x4e, 0xd9, 0x34, 0x5d, 0xca, 0x08, 0xee, 0x96, 0x56, 0xe6, 0x5f, + 0x37, 0x15, 0x9b, 0x84, 0x8d, 0x51, 0x21, 0x31, 0x35, 0x1d, 0xed, 0xca, 0xd0, 0x58, 0x0d, 0xe5, + 0x01, 0x21, 0x45, 0xb6, 0x73, 0xe3, 0x58, 0x6d, 0x7c, 0x33, 0x5f, 0x27, 0x5b, 0x56, 0xca, 0x03, + 0x5f, 0x00, 0x24, 0x5e, 0x10, 0xaf, 0x48, 0x43, 0xe2, 0x61, 0x9f, 0x63, 0x48, 0x7b, 0x98, 0xc4, + 0x0b, 0x4f, 0x08, 0xb5, 0x7c, 0x0d, 0x24, 0xe4, 0x7b, 0xaf, 0x13, 0x3b, 0x8e, 0x17, 0x27, 0xf4, + 0x81, 0x07, 0xde, 0x72, 0xaf, 0xcf, 0xf9, 0x9d, 0xdf, 0xf9, 0x77, 0xcf, 0x51, 0xe0, 0x35, 0xd3, + 0x30, 0xbb, 0x07, 0xc4, 0xd5, 0x1e, 0x12, 0x17, 0x5b, 0xc4, 0xb5, 0x1c, 0xec, 0xd9, 0x58, 0xeb, + 0x94, 0xb4, 0x7b, 0x6d, 0xec, 0x75, 0xd5, 0x96, 0x47, 0x7c, 0x82, 0x0a, 0x42, 0x4a, 0x8d, 0x49, + 0xa9, 0x9d, 0x92, 0xbc, 0x68, 0x13, 0x9b, 0x30, 0x21, 0x2d, 0xf8, 0xc5, 0xe5, 0xe5, 0x8b, 0x36, + 0x21, 0xf6, 0x01, 0xd6, 0x8c, 0x96, 0xa3, 0x19, 0xae, 0x4b, 0x7c, 0xc3, 0x77, 0x88, 0x4b, 0xc5, + 0xd7, 0x2b, 0x16, 0xa1, 0x4d, 0x42, 0x35, 0xd3, 0xa0, 0x98, 0x9b, 0xd1, 0x3a, 0x25, 0x13, 0xfb, + 0x46, 0x49, 0x6b, 0x19, 0xb6, 0xe3, 0x32, 0x61, 0x21, 0xbb, 0x16, 0xf2, 0x33, 0x7d, 0xcb, 0x6a, + 0x60, 0x6b, 0xbf, 0x45, 0x1c, 0xd7, 0x0f, 0xf8, 0xc5, 0x2e, 0x84, 0xf4, 0xe5, 0x50, 0xba, 0xff, + 0xc5, 0x71, 0xed, 0x40, 0x3a, 0x21, 0xaa, 0x84, 0xa2, 0xb8, 0x45, 0xac, 0x86, 0x90, 0x0a, 0x7f, + 0x0b, 0x99, 0xd7, 0x53, 0x83, 0xd3, 0x32, 0x3c, 0xa3, 0x49, 0x07, 0x39, 0x26, 0xc4, 0xe2, 0xe1, + 0x62, 0xd2, 0xca, 0x22, 0xa0, 0xdd, 0xc0, 0xe7, 0xbb, 0x0c, 0x42, 0xc7, 0xf7, 0xda, 0x98, 0xfa, + 0xca, 0x1e, 0xbc, 0x18, 0xbb, 0xa5, 0x2d, 0xe2, 0x52, 0x8c, 0x3e, 0x80, 0x1c, 0x37, 0x55, 0x90, + 0x56, 0xa4, 0xd5, 0x85, 0xf2, 0x8a, 0x9a, 0x96, 0x09, 0x95, 0x6b, 0x56, 0x66, 0x9f, 0xfc, 0xb1, + 0x3c, 0xa5, 0x0b, 0x2d, 0x65, 0x5b, 0x18, 0xbb, 0x85, 0x8d, 0x1a, 0xf6, 0x84, 0x31, 0xf4, 0x0a, + 0xcc, 0x5b, 0x0d, 0xc3, 0x71, 0xab, 0x4e, 0x8d, 0xe1, 0xe6, 0xf5, 0x33, 0xec, 0xbc, 0x53, 0x43, + 0x17, 0x20, 0xd7, 0xc0, 0x8e, 0xdd, 0xf0, 0x0b, 0xd3, 0x2b, 0xd2, 0xea, 0xac, 0x2e, 0x4e, 0xca, + 0x8f, 0x92, 0x20, 0x18, 0x22, 0x09, 0x82, 0x37, 0x02, 0xf9, 0xe0, 0x46, 0x10, 0x7c, 0x33, 0x9d, + 0xe0, 0x8e, 0x5b, 0xc3, 0x0f, 0x70, 0x4d, 0x00, 0x08, 0x35, 0x54, 0x81, 0x17, 0xea, 0xc4, 0xdb, + 0xaf, 0xf2, 0x23, 0x65, 0x66, 0x17, 0xca, 0xcb, 0xe9, 0x30, 0x5b, 0xc4, 0xdb, 0xa7, 0xfa, 0x42, + 0xa0, 0xc4, 0xa1, 0xa8, 0x52, 0x85, 0x97, 0x18, 0xb7, 0xcd, 0xc0, 0x89, 0x8f, 0x1d, 0xea, 0x87, + 0x8e, 0x6e, 0x01, 0xf4, 0x2b, 0x4a, 0x30, 0x7c, 0x43, 0xe5, 0xe5, 0xa7, 0x06, 0xe5, 0xa7, 0xf2, + 0x2a, 0x17, 0xe5, 0xa7, 0xde, 0x35, 0x6c, 0x2c, 0x74, 0xf5, 0x88, 0xa6, 0xf2, 0x35, 0x5c, 0x18, + 0x34, 0x20, 0xfc, 0x5f, 0x82, 0x7c, 0x18, 0xca, 0x20, 0x47, 0x33, 0xab, 0x79, 0x7d, 0x5e, 0xc4, + 0x92, 0xa2, 0xed, 0x98, 0xf9, 0x69, 0x11, 0xa0, 0x51, 0xe6, 0x39, 0x72, 0xcc, 0x7e, 0x39, 0xea, + 0xe0, 0x8e, 0x5b, 0x27, 0xa3, 0x33, 0xa9, 0x7c, 0x19, 0xe5, 0xcc, 0x75, 0x04, 0xe7, 0x0a, 0x80, + 0x50, 0x72, 0xeb, 0x44, 0x44, 0xe5, 0xd5, 0xf4, 0x80, 0xf7, 0x01, 0xb8, 0xab, 0xc1, 0x4f, 0xe5, + 0x33, 0x90, 0x19, 0xfa, 0x87, 0x41, 0xc7, 0x24, 0x68, 0x2d, 0x41, 0x9e, 0xb5, 0x52, 0xd5, 0x6d, + 0x37, 0x99, 0x81, 0x59, 0x7d, 0x9e, 0x5d, 0xdc, 0x69, 0x37, 0x63, 0x9c, 0xa7, 0xe3, 0x9c, 0x0d, + 0x58, 0x1a, 0x8a, 0x7a, 0x8a, 0xc4, 0xbf, 0x82, 0x97, 0x99, 0x89, 0x20, 0x8b, 0xa2, 0x7e, 0x32, + 0xb4, 0xc5, 0xd6, 0x90, 0x4c, 0x4e, 0x52, 0x48, 0x8f, 0x24, 0x28, 0x24, 0xcd, 0x0b, 0xf7, 0x36, + 0xe0, 0x4c, 0xd8, 0x05, 0x41, 0x25, 0x8d, 0xd1, 0x4c, 0xa1, 0xde, 0xe9, 0x55, 0xdc, 0xe7, 0x70, + 0xb1, 0xc7, 0x93, 0x65, 0x63, 0x20, 0x56, 0x93, 0x66, 0xd8, 0x84, 0x4b, 0x29, 0xb8, 0xa7, 0x16, + 0x04, 0x65, 0x17, 0x8a, 0xcc, 0xc6, 0x96, 0xe3, 0x1a, 0x07, 0xce, 0x43, 0x5c, 0x1b, 0xa3, 0x6d, + 0xd0, 0x22, 0xcc, 0xb5, 0x3c, 0xd2, 0xc1, 0x8c, 0xf8, 0xbc, 0xce, 0x0f, 0xca, 0x4f, 0x33, 0xb0, + 0x9c, 0x8a, 0x29, 0x98, 0xef, 0xc1, 0x62, 0x3d, 0xfc, 0x5a, 0x9d, 0xac, 0x4e, 0x51, 0x3d, 0x01, + 0x8f, 0xd6, 0x01, 0x78, 0xa4, 0x19, 0x18, 0x4f, 0xa9, 0xdc, 0x03, 0xeb, 0x4d, 0xac, 0x4e, 0x49, + 0x65, 0xf1, 0xd4, 0x79, 0x5e, 0x98, 0xea, 0x1d, 0x38, 0xe7, 0x19, 0xf7, 0xab, 0xfd, 0xd9, 0x57, + 0x98, 0x19, 0x78, 0xa4, 0x63, 0x73, 0x32, 0xc0, 0xd0, 0x8d, 0xfb, 0x9b, 0xbd, 0x3b, 0xfd, 0xac, + 0x17, 0x3d, 0xa2, 0x3d, 0x40, 0xa6, 0x6f, 0x55, 0x69, 0xdb, 0x6c, 0x3a, 0x94, 0x3a, 0xc4, 0xad, + 0xee, 0xe3, 0x6e, 0x61, 0x76, 0x00, 0x33, 0x3e, 0x98, 0x3b, 0x25, 0xf5, 0xd3, 0x9e, 0xfc, 0x6d, + 0xdc, 0xd5, 0xcf, 0x9b, 0xbe, 0x15, 0xbb, 0x41, 0xdb, 0x2c, 0xe4, 0xa4, 0x5e, 0x98, 0x63, 0x48, + 0xa5, 0xe7, 0xcc, 0xb8, 0x40, 0x6c, 0x48, 0x0a, 0xb8, 0xbe, 0xe2, 0xc3, 0xe5, 0x94, 0x24, 0xed, + 0xb9, 0xbe, 0x73, 0x70, 0x8b, 0x8d, 0xb2, 0xc9, 0x87, 0x60, 0xbf, 0x36, 0x66, 0xa2, 0xb5, 0xf1, + 0x78, 0x06, 0xae, 0x64, 0x31, 0xfb, 0x7f, 0x99, 0xfc, 0x37, 0xca, 0xa4, 0xfc, 0xe8, 0x2c, 0xcc, + 0xb1, 0x84, 0xa1, 0x6f, 0x25, 0xc8, 0xf1, 0xbd, 0x09, 0xad, 0xa5, 0xc3, 0x25, 0xd7, 0x35, 0xf9, + 0xad, 0x8c, 0xd2, 0x3c, 0xe7, 0xca, 0xea, 0x37, 0xbf, 0xfd, 0xf5, 0xfd, 0xb4, 0x82, 0x56, 0xb4, + 0x11, 0x1b, 0x25, 0x7a, 0x2c, 0x41, 0x8e, 0xbf, 0x67, 0x23, 0x19, 0xc5, 0x76, 0xba, 0x91, 0x8c, + 0xe2, 0x7b, 0x9b, 0xb2, 0xcd, 0x18, 0x6d, 0xa0, 0x1b, 0xe9, 0x8c, 0xfa, 0xb5, 0xa9, 0x1d, 0x86, + 0x9d, 0x72, 0xa4, 0xf1, 0x47, 0x56, 0x3b, 0xe4, 0x2d, 0x71, 0x84, 0x7e, 0x90, 0x20, 0xdf, 0x5b, + 0x8b, 0x90, 0x36, 0x82, 0xc5, 0xe0, 0x86, 0x26, 0xbf, 0x9d, 0x5d, 0x21, 0x7b, 0x2c, 0x19, 0x5b, + 0x8a, 0x7e, 0x0e, 0xa9, 0xb1, 0x2a, 0xcf, 0x44, 0x2d, 0x32, 0x24, 0xb2, 0x51, 0x8b, 0x4e, 0x00, + 0xe5, 0x3a, 0xa3, 0x56, 0x42, 0xda, 0x98, 0x41, 0x45, 0xbf, 0x4a, 0x70, 0x2e, 0xbe, 0xf3, 0xa0, + 0xab, 0x23, 0xac, 0x0f, 0x5d, 0xbc, 0xe4, 0x6b, 0x63, 0x6a, 0x09, 0xe2, 0x1f, 0x31, 0xe2, 0x37, + 0x51, 0x65, 0xdc, 0x6a, 0x60, 0x8f, 0x08, 0xd5, 0x0e, 0x7b, 0xbb, 0xc0, 0x11, 0xfa, 0x45, 0x82, + 0x85, 0xc8, 0x76, 0x83, 0x4a, 0x23, 0x28, 0x25, 0x17, 0x31, 0xb9, 0x3c, 0x8e, 0x8a, 0x70, 0xe1, + 0x2a, 0x73, 0x41, 0x45, 0x6b, 0xe9, 0x2e, 0x88, 0xfd, 0x20, 0x1a, 0xf8, 0xa7, 0x12, 0x9c, 0x1f, + 0x5c, 0x45, 0xd0, 0xbb, 0x19, 0xcc, 0x0f, 0xd9, 0x89, 0xe4, 0xeb, 0x63, 0xeb, 0x65, 0x6f, 0xc6, + 0x24, 0xf7, 0x61, 0xb1, 0x7f, 0x2a, 0x01, 0x4a, 0xbe, 0x7b, 0xe8, 0xbd, 0x11, 0xc4, 0x52, 0x17, + 0x25, 0x79, 0x7d, 0x02, 0x4d, 0xe1, 0xd4, 0x06, 0x73, 0xea, 0x7d, 0xb4, 0x9e, 0xee, 0xd4, 0xb0, + 0x39, 0x18, 0xcd, 0xce, 0xdf, 0x12, 0x5c, 0x7a, 0xee, 0x50, 0x45, 0x9b, 0x63, 0xf3, 0x4b, 0x6e, + 0x02, 0xf2, 0xcd, 0x7f, 0x07, 0x22, 0xfc, 0xdd, 0x65, 0xfe, 0xde, 0x46, 0x3b, 0x13, 0xfb, 0xab, + 0xf1, 0x37, 0xb5, 0xf7, 0xb6, 0x56, 0x3e, 0x79, 0x72, 0x5c, 0x94, 0x9e, 0x1d, 0x17, 0xa5, 0x3f, + 0x8f, 0x8b, 0xd2, 0x77, 0x27, 0xc5, 0xa9, 0x67, 0x27, 0xc5, 0xa9, 0xdf, 0x4f, 0x8a, 0x53, 0x5f, + 0x5c, 0xb3, 0x1d, 0xbf, 0xd1, 0x36, 0x55, 0x8b, 0x34, 0x43, 0x73, 0x0c, 0xa6, 0x67, 0xfb, 0xc1, + 0x80, 0x75, 0xbf, 0xdb, 0xc2, 0xd4, 0xcc, 0xb1, 0xbf, 0x20, 0xde, 0xf9, 0x27, 0x00, 0x00, 0xff, + 0xff, 0xc0, 0x78, 0x46, 0x86, 0xf6, 0x11, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -1133,15 +1146,19 @@ type QueryClient interface { ChainList(ctx context.Context, in *QueryChainListRequest, opts ...grpc.CallOption) (*QueryChainListResponse, error) // ChainInfo queries the latest info of a chain in Babylon's view ChainInfo(ctx context.Context, in *QueryChainInfoRequest, opts ...grpc.CallOption) (*QueryChainInfoResponse, error) - // EpochChainInfo queries the latest info of a chain in a given epoch of Babylon's view + // EpochChainInfo queries the latest info of a chain in a given epoch of + // Babylon's view EpochChainInfo(ctx context.Context, in *QueryEpochChainInfoRequest, opts ...grpc.CallOption) (*QueryEpochChainInfoResponse, error) - // ListHeaders queries the headers of a chain in Babylon's view, with pagination support + // ListHeaders queries the headers of a chain in Babylon's view, with + // pagination support ListHeaders(ctx context.Context, in *QueryListHeadersRequest, opts ...grpc.CallOption) (*QueryListHeadersResponse, error) - // ListEpochHeaders queries the headers of a chain timestamped in a given epoch of Babylon, with pagination support + // ListEpochHeaders queries the headers of a chain timestamped in a given + // epoch of Babylon, with pagination support ListEpochHeaders(ctx context.Context, in *QueryListEpochHeadersRequest, opts ...grpc.CallOption) (*QueryListEpochHeadersResponse, error) // FinalizedChainInfo queries the BTC-finalised info of a chain, with proofs FinalizedChainInfo(ctx context.Context, in *QueryFinalizedChainInfoRequest, opts ...grpc.CallOption) (*QueryFinalizedChainInfoResponse, error) - // FinalizedChainInfoUntilHeight queries the BTC-finalised info no later than the provided CZ height, with proofs + // FinalizedChainInfoUntilHeight queries the BTC-finalised info no later than + // the provided CZ height, with proofs FinalizedChainInfoUntilHeight(ctx context.Context, in *QueryFinalizedChainInfoUntilHeightRequest, opts ...grpc.CallOption) (*QueryFinalizedChainInfoUntilHeightResponse, error) } @@ -1244,15 +1261,19 @@ type QueryServer interface { ChainList(context.Context, *QueryChainListRequest) (*QueryChainListResponse, error) // ChainInfo queries the latest info of a chain in Babylon's view ChainInfo(context.Context, *QueryChainInfoRequest) (*QueryChainInfoResponse, error) - // EpochChainInfo queries the latest info of a chain in a given epoch of Babylon's view + // EpochChainInfo queries the latest info of a chain in a given epoch of + // Babylon's view EpochChainInfo(context.Context, *QueryEpochChainInfoRequest) (*QueryEpochChainInfoResponse, error) - // ListHeaders queries the headers of a chain in Babylon's view, with pagination support + // ListHeaders queries the headers of a chain in Babylon's view, with + // pagination support ListHeaders(context.Context, *QueryListHeadersRequest) (*QueryListHeadersResponse, error) - // ListEpochHeaders queries the headers of a chain timestamped in a given epoch of Babylon, with pagination support + // ListEpochHeaders queries the headers of a chain timestamped in a given + // epoch of Babylon, with pagination support ListEpochHeaders(context.Context, *QueryListEpochHeadersRequest) (*QueryListEpochHeadersResponse, error) // FinalizedChainInfo queries the BTC-finalised info of a chain, with proofs FinalizedChainInfo(context.Context, *QueryFinalizedChainInfoRequest) (*QueryFinalizedChainInfoResponse, error) - // FinalizedChainInfoUntilHeight queries the BTC-finalised info no later than the provided CZ height, with proofs + // FinalizedChainInfoUntilHeight queries the BTC-finalised info no later than + // the provided CZ height, with proofs FinalizedChainInfoUntilHeight(context.Context, *QueryFinalizedChainInfoUntilHeightRequest) (*QueryFinalizedChainInfoUntilHeightResponse, error) } @@ -1496,7 +1517,7 @@ var _Query_serviceDesc = grpc.ServiceDesc{ }, }, Streams: []grpc.StreamDesc{}, - Metadata: "babylon/zoneconcierge/query.proto", + Metadata: "babylon/zoneconcierge/v1/query.proto", } func (m *QueryParamsRequest) Marshal() (dAtA []byte, err error) { diff --git a/x/zoneconcierge/types/query.pb.gw.go b/x/zoneconcierge/types/query.pb.gw.go index 4a9974981..fedaaec08 100644 --- a/x/zoneconcierge/types/query.pb.gw.go +++ b/x/zoneconcierge/types/query.pb.gw.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. -// source: babylon/zoneconcierge/query.proto +// source: babylon/zoneconcierge/v1/query.proto /* Package types is a reverse proxy. diff --git a/x/zoneconcierge/types/tx.pb.go b/x/zoneconcierge/types/tx.pb.go index 5f5f02dab..2c52ff6b3 100644 --- a/x/zoneconcierge/types/tx.pb.go +++ b/x/zoneconcierge/types/tx.pb.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: babylon/zoneconcierge/tx.proto +// source: babylon/zoneconcierge/v1/tx.proto package types @@ -23,19 +23,19 @@ var _ = math.Inf // proto package needs to be updated. const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package -func init() { proto.RegisterFile("babylon/zoneconcierge/tx.proto", fileDescriptor_8e6a138445b0c506) } +func init() { proto.RegisterFile("babylon/zoneconcierge/v1/tx.proto", fileDescriptor_35e2112d987e4e18) } -var fileDescriptor_8e6a138445b0c506 = []byte{ - // 136 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4b, 0x4a, 0x4c, 0xaa, +var fileDescriptor_35e2112d987e4e18 = []byte{ + // 140 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x4c, 0x4a, 0x4c, 0xaa, 0xcc, 0xc9, 0xcf, 0xd3, 0xaf, 0xca, 0xcf, 0x4b, 0x4d, 0xce, 0xcf, 0x4b, 0xce, 0x4c, 0x2d, 0x4a, - 0x4f, 0xd5, 0x2f, 0xa9, 0xd0, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x92, 0x80, 0xca, 0xeb, 0xa1, - 0xc8, 0xeb, 0x95, 0x19, 0x1a, 0xb1, 0x72, 0x31, 0xfb, 0x16, 0xa7, 0x3b, 0xf9, 0x9f, 0x78, 0x24, - 0xc7, 0x78, 0xe1, 0x91, 0x1c, 0xe3, 0x83, 0x47, 0x72, 0x8c, 0x13, 0x1e, 0xcb, 0x31, 0x5c, 0x78, - 0x2c, 0xc7, 0x70, 0xe3, 0xb1, 0x1c, 0x43, 0x94, 0x69, 0x7a, 0x66, 0x49, 0x46, 0x69, 0x92, 0x5e, - 0x72, 0x7e, 0xae, 0x3e, 0xd4, 0x94, 0xe4, 0x8c, 0xc4, 0xcc, 0x3c, 0x18, 0x47, 0xbf, 0x02, 0xdd, - 0xd2, 0xca, 0x82, 0xd4, 0xe2, 0x24, 0x36, 0xb0, 0xc5, 0xc6, 0x80, 0x00, 0x00, 0x00, 0xff, 0xff, - 0x52, 0x2a, 0x1c, 0x1f, 0x9a, 0x00, 0x00, 0x00, + 0x4f, 0xd5, 0x2f, 0x33, 0xd4, 0x2f, 0xa9, 0xd0, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x92, 0x80, + 0x2a, 0xd1, 0x43, 0x51, 0xa2, 0x57, 0x66, 0x68, 0xc4, 0xca, 0xc5, 0xec, 0x5b, 0x9c, 0xee, 0xe4, + 0x7f, 0xe2, 0x91, 0x1c, 0xe3, 0x85, 0x47, 0x72, 0x8c, 0x0f, 0x1e, 0xc9, 0x31, 0x4e, 0x78, 0x2c, + 0xc7, 0x70, 0xe1, 0xb1, 0x1c, 0xc3, 0x8d, 0xc7, 0x72, 0x0c, 0x51, 0xa6, 0xe9, 0x99, 0x25, 0x19, + 0xa5, 0x49, 0x7a, 0xc9, 0xf9, 0xb9, 0xfa, 0x50, 0x53, 0x92, 0x33, 0x12, 0x33, 0xf3, 0x60, 0x1c, + 0xfd, 0x0a, 0x34, 0x7b, 0x4b, 0x2a, 0x0b, 0x52, 0x8b, 0x93, 0xd8, 0xc0, 0x16, 0x1b, 0x03, 0x02, + 0x00, 0x00, 0xff, 0xff, 0xd3, 0x96, 0xa5, 0xaf, 0x9d, 0x00, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -77,5 +77,5 @@ var _Msg_serviceDesc = grpc.ServiceDesc{ HandlerType: (*MsgServer)(nil), Methods: []grpc.MethodDesc{}, Streams: []grpc.StreamDesc{}, - Metadata: "babylon/zoneconcierge/tx.proto", + Metadata: "babylon/zoneconcierge/v1/tx.proto", } diff --git a/x/zoneconcierge/types/zoneconcierge.pb.go b/x/zoneconcierge/types/zoneconcierge.pb.go index 9992d6de1..2466ccda5 100644 --- a/x/zoneconcierge/types/zoneconcierge.pb.go +++ b/x/zoneconcierge/types/zoneconcierge.pb.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: babylon/zoneconcierge/zoneconcierge.proto +// source: babylon/zoneconcierge/v1/zoneconcierge.proto package types @@ -35,12 +35,14 @@ type IndexedHeader struct { // height is the height of this header on CZ ledger // (hash, height) jointly provides the position of the header on CZ ledger Height uint64 `protobuf:"varint,3,opt,name=height,proto3" json:"height,omitempty"` - // babylon_header is the header of the babylon block that includes this CZ header + // babylon_header is the header of the babylon block that includes this CZ + // header BabylonHeader *types.Header `protobuf:"bytes,4,opt,name=babylon_header,json=babylonHeader,proto3" json:"babylon_header,omitempty"` // epoch is the epoch number of this header on Babylon ledger BabylonEpoch uint64 `protobuf:"varint,5,opt,name=babylon_epoch,json=babylonEpoch,proto3" json:"babylon_epoch,omitempty"` // babylon_tx_hash is the hash of the tx that includes this header - // (babylon_block_height, babylon_tx_hash) jointly provides the position of the header on Babylon ledger + // (babylon_block_height, babylon_tx_hash) jointly provides the position of + // the header on Babylon ledger BabylonTxHash []byte `protobuf:"bytes,6,opt,name=babylon_tx_hash,json=babylonTxHash,proto3" json:"babylon_tx_hash,omitempty"` } @@ -48,7 +50,7 @@ func (m *IndexedHeader) Reset() { *m = IndexedHeader{} } func (m *IndexedHeader) String() string { return proto.CompactTextString(m) } func (*IndexedHeader) ProtoMessage() {} func (*IndexedHeader) Descriptor() ([]byte, []int) { - return fileDescriptor_c76d28ce8dde4532, []int{0} + return fileDescriptor_ab886e1868e5c5cd, []int{0} } func (m *IndexedHeader) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -130,10 +132,11 @@ func (m *IndexedHeader) GetBabylonTxHash() []byte { // ``` // Then the fork will be {[D1, D2]} where each item is in struct `IndexedBlock`. // -// Note that each `IndexedHeader` in the fork should have a valid quorum certificate. -// Such forks exist since Babylon considers CZs might have dishonest majority. -// Also note that the IBC-Go implementation will only consider the first header in a fork valid, since -// the subsequent headers cannot be verified without knowing the validator set in the previous header. +// Note that each `IndexedHeader` in the fork should have a valid quorum +// certificate. Such forks exist since Babylon considers CZs might have +// dishonest majority. Also note that the IBC-Go implementation will only +// consider the first header in a fork valid, since the subsequent headers +// cannot be verified without knowing the validator set in the previous header. type Forks struct { // blocks is the list of non-canonical indexed headers at the same height Headers []*IndexedHeader `protobuf:"bytes,3,rep,name=headers,proto3" json:"headers,omitempty"` @@ -143,7 +146,7 @@ func (m *Forks) Reset() { *m = Forks{} } func (m *Forks) String() string { return proto.CompactTextString(m) } func (*Forks) ProtoMessage() {} func (*Forks) Descriptor() ([]byte, []int) { - return fileDescriptor_c76d28ce8dde4532, []int{1} + return fileDescriptor_ab886e1868e5c5cd, []int{1} } func (m *Forks) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -185,9 +188,11 @@ type ChainInfo struct { ChainId string `protobuf:"bytes,1,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` // latest_header is the latest header in CZ's canonical chain LatestHeader *IndexedHeader `protobuf:"bytes,2,opt,name=latest_header,json=latestHeader,proto3" json:"latest_header,omitempty"` - // latest_forks is the latest forks, formed as a series of IndexedHeader (from low to high) + // latest_forks is the latest forks, formed as a series of IndexedHeader (from + // low to high) LatestForks *Forks `protobuf:"bytes,3,opt,name=latest_forks,json=latestForks,proto3" json:"latest_forks,omitempty"` - // timestamped_headers_count is the number of timestamped headers in CZ's canonical chain + // timestamped_headers_count is the number of timestamped headers in CZ's + // canonical chain TimestampedHeadersCount uint64 `protobuf:"varint,4,opt,name=timestamped_headers_count,json=timestampedHeadersCount,proto3" json:"timestamped_headers_count,omitempty"` } @@ -195,7 +200,7 @@ func (m *ChainInfo) Reset() { *m = ChainInfo{} } func (m *ChainInfo) String() string { return proto.CompactTextString(m) } func (*ChainInfo) ProtoMessage() {} func (*ChainInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_c76d28ce8dde4532, []int{2} + return fileDescriptor_ab886e1868e5c5cd, []int{2} } func (m *ChainInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -252,22 +257,26 @@ func (m *ChainInfo) GetTimestampedHeadersCount() uint64 { return 0 } -// ProofEpochSealed is the proof that an epoch is sealed by the sealer header, i.e., the 2nd header of the next epoch -// With the access of metadata +// ProofEpochSealed is the proof that an epoch is sealed by the sealer header, +// i.e., the 2nd header of the next epoch With the access of metadata // - Metadata of this epoch, which includes the sealer header // - Raw checkpoint of this epoch // The verifier can perform the following verification rules: // - The raw checkpoint's `last_commit_hash` is same as in the sealer header -// - More than 1/3 (in voting power) validators in the validator set of this epoch have signed `last_commit_hash` of the sealer header +// - More than 1/3 (in voting power) validators in the validator set of this +// epoch have signed `last_commit_hash` of the sealer header // - The epoch medatata is committed to the `app_hash` of the sealer header // - The validator set is committed to the `app_hash` of the sealer header type ProofEpochSealed struct { // validator_set is the validator set of the sealed epoch - // This validator set has generated a BLS multisig on `last_commit_hash` of the sealer header + // This validator set has generated a BLS multisig on `last_commit_hash` of + // the sealer header ValidatorSet []*types1.ValidatorWithBlsKey `protobuf:"bytes,1,rep,name=validator_set,json=validatorSet,proto3" json:"validator_set,omitempty"` - // proof_epoch_info is the Merkle proof that the epoch's metadata is committed to `app_hash` of the sealer header + // proof_epoch_info is the Merkle proof that the epoch's metadata is committed + // to `app_hash` of the sealer header ProofEpochInfo *crypto.ProofOps `protobuf:"bytes,2,opt,name=proof_epoch_info,json=proofEpochInfo,proto3" json:"proof_epoch_info,omitempty"` - // proof_epoch_info is the Merkle proof that the epoch's validator set is committed to `app_hash` of the sealer header + // proof_epoch_info is the Merkle proof that the epoch's validator set is + // committed to `app_hash` of the sealer header ProofEpochValSet *crypto.ProofOps `protobuf:"bytes,3,opt,name=proof_epoch_val_set,json=proofEpochValSet,proto3" json:"proof_epoch_val_set,omitempty"` } @@ -275,7 +284,7 @@ func (m *ProofEpochSealed) Reset() { *m = ProofEpochSealed{} } func (m *ProofEpochSealed) String() string { return proto.CompactTextString(m) } func (*ProofEpochSealed) ProtoMessage() {} func (*ProofEpochSealed) Descriptor() ([]byte, []int) { - return fileDescriptor_c76d28ce8dde4532, []int{3} + return fileDescriptor_ab886e1868e5c5cd, []int{3} } func (m *ProofEpochSealed) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -325,16 +334,20 @@ func (m *ProofEpochSealed) GetProofEpochValSet() *crypto.ProofOps { return nil } -// ProofFinalizedChainInfo is a set of proofs that attest a chain info is BTC-finalised +// ProofFinalizedChainInfo is a set of proofs that attest a chain info is +// BTC-finalised type ProofFinalizedChainInfo struct { - // proof_tx_in_block is the proof that tx that carries the header is included in a certain Babylon block + // proof_tx_in_block is the proof that tx that carries the header is included + // in a certain Babylon block ProofTxInBlock *types.TxProof `protobuf:"bytes,4,opt,name=proof_tx_in_block,json=proofTxInBlock,proto3" json:"proof_tx_in_block,omitempty"` - // proof_header_in_epoch is the proof that the Babylon header is in a certain epoch + // proof_header_in_epoch is the proof that the Babylon header is in a certain + // epoch ProofHeaderInEpoch *crypto.Proof `protobuf:"bytes,5,opt,name=proof_header_in_epoch,json=proofHeaderInEpoch,proto3" json:"proof_header_in_epoch,omitempty"` // proof_epoch_sealed is the proof that the epoch is sealed ProofEpochSealed *ProofEpochSealed `protobuf:"bytes,6,opt,name=proof_epoch_sealed,json=proofEpochSealed,proto3" json:"proof_epoch_sealed,omitempty"` - // proof_epoch_submitted is the proof that the epoch's checkpoint is included in BTC ledger - // It is the two TransactionInfo in the best (i.e., earliest) checkpoint submission + // proof_epoch_submitted is the proof that the epoch's checkpoint is included + // in BTC ledger It is the two TransactionInfo in the best (i.e., earliest) + // checkpoint submission ProofEpochSubmitted []*types2.TransactionInfo `protobuf:"bytes,7,rep,name=proof_epoch_submitted,json=proofEpochSubmitted,proto3" json:"proof_epoch_submitted,omitempty"` } @@ -342,7 +355,7 @@ func (m *ProofFinalizedChainInfo) Reset() { *m = ProofFinalizedChainInfo func (m *ProofFinalizedChainInfo) String() string { return proto.CompactTextString(m) } func (*ProofFinalizedChainInfo) ProtoMessage() {} func (*ProofFinalizedChainInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_c76d28ce8dde4532, []int{4} + return fileDescriptor_ab886e1868e5c5cd, []int{4} } func (m *ProofFinalizedChainInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -408,56 +421,56 @@ func init() { } func init() { - proto.RegisterFile("babylon/zoneconcierge/zoneconcierge.proto", fileDescriptor_c76d28ce8dde4532) -} - -var fileDescriptor_c76d28ce8dde4532 = []byte{ - // 719 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x54, 0x51, 0x6f, 0xd3, 0x3c, - 0x14, 0x5d, 0xd6, 0x6e, 0xfb, 0xe6, 0xb6, 0xfb, 0x46, 0x26, 0x58, 0x36, 0xa0, 0x94, 0x4e, 0x1a, - 0x1d, 0x12, 0xa9, 0x56, 0xc4, 0x0b, 0x2f, 0x88, 0x8e, 0x4d, 0xeb, 0x86, 0x34, 0x94, 0x55, 0x03, - 0x21, 0xa1, 0xc8, 0x49, 0xdc, 0xc6, 0x6a, 0x6a, 0x87, 0xd8, 0xad, 0xd2, 0xfd, 0x0a, 0x7e, 0x16, - 0x8f, 0x7b, 0xe4, 0x11, 0x6d, 0xf0, 0x0f, 0x78, 0xe1, 0x0d, 0xc5, 0x76, 0xda, 0xb4, 0x6c, 0xc0, - 0x4b, 0x55, 0xe7, 0x9e, 0x7b, 0xee, 0xf1, 0xb9, 0xf7, 0x1a, 0xec, 0x38, 0xd0, 0x19, 0x05, 0x94, - 0xd4, 0xcf, 0x29, 0x41, 0x2e, 0x25, 0x2e, 0x46, 0x51, 0x17, 0x4d, 0x9f, 0xcc, 0x30, 0xa2, 0x9c, - 0xea, 0x86, 0x82, 0x9a, 0xd3, 0xc1, 0xe1, 0xee, 0xe6, 0x3d, 0x8e, 0x88, 0x87, 0xa2, 0x3e, 0x26, - 0xbc, 0xce, 0x47, 0x21, 0x62, 0xf2, 0x57, 0xe6, 0x6d, 0xde, 0xcf, 0x44, 0xdd, 0x68, 0x14, 0x72, - 0x5a, 0x0f, 0x23, 0x4a, 0x3b, 0x2a, 0x3c, 0x56, 0xe0, 0x70, 0xd7, 0xf5, 0x91, 0xdb, 0x0b, 0x69, - 0x82, 0x9c, 0x3a, 0x29, 0xe8, 0x56, 0x0a, 0x9d, 0x44, 0x30, 0xe9, 0xd6, 0x9d, 0x80, 0xd9, 0x3d, - 0x34, 0x52, 0xa0, 0x87, 0xd7, 0x83, 0x3e, 0x0e, 0x50, 0x94, 0x42, 0xb6, 0xaf, 0x87, 0xcc, 0xd6, - 0xab, 0x7e, 0xd3, 0x40, 0xa9, 0x45, 0x3c, 0x14, 0x23, 0xef, 0x10, 0x41, 0x0f, 0x45, 0xfa, 0x06, - 0xf8, 0xcf, 0xf5, 0x21, 0x26, 0x36, 0xf6, 0x0c, 0xad, 0xa2, 0xd5, 0x96, 0xad, 0x25, 0x71, 0x6e, - 0x79, 0xba, 0x0e, 0xf2, 0x3e, 0x64, 0xbe, 0x31, 0x5f, 0xd1, 0x6a, 0x45, 0x4b, 0xfc, 0xd7, 0xef, - 0x80, 0x45, 0x1f, 0xe1, 0xae, 0xcf, 0x8d, 0x5c, 0x45, 0xab, 0xe5, 0x2d, 0x75, 0xd2, 0x5f, 0x80, - 0x15, 0x25, 0xc1, 0xf6, 0x05, 0xb1, 0x91, 0xaf, 0x68, 0xb5, 0x42, 0xc3, 0x30, 0x27, 0x5e, 0x99, - 0xd2, 0x43, 0x59, 0xd8, 0x2a, 0x29, 0xbc, 0xd2, 0xb1, 0x05, 0xd2, 0x0f, 0x36, 0x0a, 0xa9, 0xeb, - 0x1b, 0x0b, 0x82, 0xbf, 0xa8, 0x3e, 0xee, 0x27, 0xdf, 0xf4, 0x6d, 0xf0, 0x7f, 0x0a, 0xe2, 0xb1, - 0x2d, 0xc4, 0x2d, 0x0a, 0x71, 0x69, 0x6e, 0x3b, 0x3e, 0x84, 0xcc, 0xaf, 0x1e, 0x81, 0x85, 0x03, - 0x1a, 0xf5, 0x98, 0xfe, 0x12, 0x2c, 0x49, 0x39, 0xcc, 0xc8, 0x55, 0x72, 0xb5, 0x42, 0xe3, 0x91, - 0x79, 0x53, 0xcf, 0xcd, 0x29, 0x5f, 0xac, 0x34, 0xaf, 0xfa, 0x43, 0x03, 0xcb, 0x7b, 0xc2, 0x11, - 0xd2, 0xa1, 0x7f, 0xb2, 0xeb, 0x35, 0x28, 0x05, 0x90, 0x23, 0xc6, 0x53, 0x07, 0xe6, 0x85, 0x03, - 0xff, 0x5c, 0xb1, 0x28, 0xb3, 0x95, 0x1f, 0x4d, 0xa0, 0xce, 0x76, 0x27, 0xb9, 0x89, 0xb0, 0xbb, - 0xd0, 0x78, 0x70, 0x33, 0x99, 0xb8, 0xb0, 0x55, 0x90, 0x49, 0xf2, 0xf6, 0xcf, 0xc1, 0x06, 0xc7, - 0x7d, 0xc4, 0x38, 0xec, 0x87, 0xc8, 0x53, 0xb2, 0x98, 0xed, 0xd2, 0x01, 0xe1, 0xa2, 0x3f, 0x79, - 0x6b, 0x3d, 0x03, 0x90, 0x95, 0xd9, 0x5e, 0x12, 0xae, 0xfe, 0xd4, 0xc0, 0xea, 0x9b, 0x64, 0xa8, - 0x85, 0xf3, 0xa7, 0x08, 0x06, 0xc8, 0xd3, 0x2d, 0x50, 0x1a, 0xc2, 0x00, 0x7b, 0x90, 0xd3, 0xc8, - 0x66, 0x88, 0x1b, 0x9a, 0x30, 0xf5, 0xc9, 0x58, 0xd5, 0xd4, 0xf8, 0x25, 0xaa, 0xce, 0x52, 0xf8, - 0x5b, 0xcc, 0xfd, 0x66, 0xc0, 0x8e, 0xd1, 0xc8, 0x2a, 0x8e, 0x39, 0x4e, 0x11, 0xd7, 0xf7, 0xc1, - 0xaa, 0x58, 0x1e, 0xd9, 0x76, 0x1b, 0x93, 0x0e, 0x55, 0xce, 0xdd, 0xcd, 0xce, 0x8e, 0xdc, 0x33, - 0x53, 0x48, 0x3a, 0x09, 0x99, 0xb5, 0x12, 0x8e, 0xc5, 0x89, 0xc6, 0x1c, 0x81, 0xb5, 0x2c, 0xcd, - 0x10, 0x06, 0x42, 0x60, 0xee, 0xef, 0x4c, 0xab, 0x13, 0xa6, 0x33, 0x18, 0x9c, 0x22, 0x5e, 0xfd, - 0x3e, 0x0f, 0xd6, 0x45, 0xf8, 0x00, 0x13, 0x18, 0xe0, 0x73, 0xe4, 0x4d, 0x06, 0xe0, 0x15, 0xb8, - 0x25, 0xeb, 0xf0, 0xd8, 0xc6, 0xc4, 0x76, 0x02, 0xea, 0xf6, 0xd4, 0xac, 0x6f, 0xfc, 0x3e, 0xeb, - 0xed, 0x58, 0xf0, 0x28, 0xb5, 0xed, 0xb8, 0x45, 0x9a, 0x49, 0x82, 0x7e, 0x0c, 0x6e, 0x4b, 0x16, - 0xd9, 0x93, 0x84, 0x69, 0x32, 0xf5, 0x33, 0x5b, 0x93, 0xd5, 0x6b, 0xe9, 0x22, 0x4d, 0x76, 0xaa, - 0xa5, 0xb6, 0xe2, 0x1d, 0xd0, 0xb3, 0x57, 0x67, 0xa2, 0x57, 0x62, 0x31, 0x0a, 0x8d, 0xc7, 0x37, - 0x0f, 0xcc, 0x6c, 0x77, 0xb3, 0x46, 0xa8, 0x7e, 0x7f, 0x48, 0x65, 0x2a, 0xe6, 0x81, 0xd3, 0xc7, - 0x9c, 0x23, 0xcf, 0x58, 0x12, 0x7d, 0xdf, 0x19, 0x93, 0x4f, 0xbf, 0x6d, 0xc3, 0x5d, 0xb3, 0x1d, - 0x41, 0xc2, 0xa0, 0xcb, 0x31, 0x15, 0xb6, 0x59, 0x6b, 0x19, 0xee, 0x94, 0xa5, 0x79, 0xf2, 0xf9, - 0xb2, 0xac, 0x5d, 0x5c, 0x96, 0xb5, 0xaf, 0x97, 0x65, 0xed, 0xd3, 0x55, 0x79, 0xee, 0xe2, 0xaa, - 0x3c, 0xf7, 0xe5, 0xaa, 0x3c, 0xf7, 0xfe, 0x59, 0x17, 0x73, 0x7f, 0xe0, 0x98, 0x2e, 0xed, 0xd7, - 0x55, 0x0d, 0xb1, 0x66, 0xe9, 0xa1, 0x1e, 0xcf, 0x3c, 0xef, 0xc2, 0x6e, 0x67, 0x51, 0xbc, 0x72, - 0x4f, 0x7f, 0x05, 0x00, 0x00, 0xff, 0xff, 0x91, 0x2a, 0x68, 0xc0, 0x04, 0x06, 0x00, 0x00, + proto.RegisterFile("babylon/zoneconcierge/v1/zoneconcierge.proto", fileDescriptor_ab886e1868e5c5cd) +} + +var fileDescriptor_ab886e1868e5c5cd = []byte{ + // 710 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x54, 0x41, 0x6f, 0xd3, 0x4a, + 0x10, 0xae, 0x9b, 0xb4, 0x7d, 0xdd, 0x24, 0x7d, 0x7d, 0xae, 0x1e, 0x75, 0x0b, 0x84, 0x28, 0x48, + 0x25, 0x20, 0x70, 0x94, 0x20, 0x2e, 0x5c, 0x10, 0x29, 0xad, 0x9a, 0x16, 0xa9, 0xc8, 0x8d, 0x0a, + 0x42, 0x42, 0xd6, 0xc6, 0xde, 0xc4, 0xab, 0x38, 0xbb, 0x96, 0x77, 0x1b, 0x25, 0xfd, 0x15, 0xfc, + 0x2c, 0x8e, 0x3d, 0x72, 0x44, 0x2d, 0xfc, 0x03, 0x2e, 0xdc, 0x90, 0x67, 0xd7, 0x89, 0x53, 0x54, + 0xe0, 0x12, 0x65, 0x77, 0x66, 0xbe, 0xfd, 0xe6, 0xfb, 0x66, 0x8c, 0x1e, 0x77, 0x71, 0x77, 0x12, + 0x72, 0x56, 0x3f, 0xe7, 0x8c, 0x78, 0x9c, 0x79, 0x94, 0xc4, 0x7d, 0x52, 0x1f, 0x35, 0xe6, 0x2f, + 0xec, 0x28, 0xe6, 0x92, 0x9b, 0x96, 0xce, 0xb6, 0xe7, 0x83, 0xa3, 0xc6, 0xf6, 0x1d, 0x49, 0x98, + 0x4f, 0xe2, 0x21, 0x65, 0xb2, 0x2e, 0x27, 0x11, 0x11, 0xea, 0x57, 0xd5, 0x6d, 0xdf, 0xcd, 0x44, + 0xbd, 0x78, 0x12, 0x49, 0x5e, 0x8f, 0x62, 0xce, 0x7b, 0x3a, 0x3c, 0x25, 0xd1, 0x95, 0x9e, 0x17, + 0x10, 0x6f, 0x10, 0xf1, 0x24, 0x73, 0xd4, 0x98, 0xbf, 0xd0, 0xd9, 0x3b, 0x69, 0xf6, 0x2c, 0x42, + 0x59, 0x1f, 0xb2, 0x43, 0xe1, 0x0e, 0xc8, 0x44, 0xe5, 0x55, 0xbf, 0x1a, 0xa8, 0xd4, 0x66, 0x3e, + 0x19, 0x13, 0xff, 0x80, 0x60, 0x9f, 0xc4, 0xe6, 0x16, 0xfa, 0xc7, 0x0b, 0x30, 0x65, 0x2e, 0xf5, + 0x2d, 0xa3, 0x62, 0xd4, 0x56, 0x9d, 0x15, 0x38, 0xb7, 0x7d, 0xd3, 0x44, 0xf9, 0x00, 0x8b, 0xc0, + 0x5a, 0xac, 0x18, 0xb5, 0xa2, 0x03, 0xff, 0xcd, 0x5b, 0x68, 0x39, 0x20, 0xb4, 0x1f, 0x48, 0x2b, + 0x57, 0x31, 0x6a, 0x79, 0x47, 0x9f, 0xcc, 0x17, 0x68, 0x4d, 0x53, 0x70, 0x03, 0x00, 0xb6, 0xf2, + 0x15, 0xa3, 0x56, 0x68, 0x5a, 0xf6, 0xac, 0x4d, 0x5b, 0xb5, 0xaf, 0x1e, 0x76, 0x4a, 0x3a, 0x5f, + 0xf3, 0xb8, 0x8f, 0xd2, 0x0b, 0x97, 0x44, 0xdc, 0x0b, 0xac, 0x25, 0xc0, 0x2f, 0xea, 0xcb, 0xbd, + 0xe4, 0xce, 0xdc, 0x41, 0xff, 0xa6, 0x49, 0x72, 0xec, 0x02, 0xb9, 0x65, 0x20, 0x97, 0xd6, 0x76, + 0xc6, 0x07, 0x58, 0x04, 0xd5, 0x43, 0xb4, 0xb4, 0xcf, 0xe3, 0x81, 0x30, 0x5f, 0xa2, 0x15, 0x45, + 0x47, 0x58, 0xb9, 0x4a, 0xae, 0x56, 0x68, 0x3e, 0xb0, 0x6f, 0xb2, 0xcb, 0x9e, 0xd3, 0xc5, 0x49, + 0xeb, 0xaa, 0xdf, 0x0d, 0xb4, 0xba, 0x0b, 0x8a, 0xb0, 0x1e, 0xff, 0x9d, 0x5c, 0xaf, 0x51, 0x29, + 0xc4, 0x92, 0x08, 0x99, 0x2a, 0xb0, 0x08, 0x0a, 0xfc, 0xf5, 0x8b, 0x45, 0x55, 0xad, 0xf5, 0x68, + 0x21, 0x7d, 0x76, 0x7b, 0x49, 0x27, 0x20, 0x77, 0xa1, 0x79, 0xef, 0x66, 0x30, 0x68, 0xd8, 0x29, + 0xa8, 0x22, 0xd5, 0xfd, 0x73, 0xb4, 0x25, 0xe9, 0x90, 0x08, 0x89, 0x87, 0x11, 0xf1, 0x35, 0x2d, + 0xe1, 0x7a, 0xfc, 0x8c, 0x49, 0xf0, 0x27, 0xef, 0x6c, 0x66, 0x12, 0xd4, 0xcb, 0x62, 0x37, 0x09, + 0x57, 0x7f, 0x18, 0x68, 0xfd, 0x4d, 0x32, 0x8f, 0xa0, 0xfc, 0x09, 0xc1, 0x21, 0xf1, 0x4d, 0x07, + 0x95, 0x46, 0x38, 0xa4, 0x3e, 0x96, 0x3c, 0x76, 0x05, 0x91, 0x96, 0x01, 0xa2, 0x3e, 0x99, 0xb2, + 0x9a, 0x1b, 0xbf, 0x84, 0xd5, 0x69, 0x9a, 0xfe, 0x96, 0xca, 0xa0, 0x15, 0x8a, 0x23, 0x32, 0x71, + 0x8a, 0x53, 0x8c, 0x13, 0x22, 0xcd, 0x3d, 0xb4, 0x0e, 0x73, 0xaf, 0x6c, 0x77, 0x29, 0xeb, 0x71, + 0xad, 0xdc, 0xed, 0xec, 0xec, 0xa8, 0x15, 0xb1, 0x81, 0xd2, 0x71, 0x24, 0x9c, 0xb5, 0x68, 0x4a, + 0x0e, 0x8c, 0x39, 0x44, 0x1b, 0x59, 0x98, 0x11, 0x0e, 0x81, 0x60, 0xee, 0xcf, 0x48, 0xeb, 0x33, + 0xa4, 0x53, 0x1c, 0x9e, 0x10, 0x59, 0xfd, 0xb6, 0x88, 0x36, 0x21, 0xbc, 0x4f, 0x19, 0x0e, 0xe9, + 0x39, 0xf1, 0x67, 0x03, 0xf0, 0x0a, 0xfd, 0xa7, 0xde, 0x91, 0x63, 0x97, 0x32, 0xb7, 0x1b, 0x72, + 0x6f, 0xa0, 0x67, 0x7d, 0xeb, 0xd7, 0x59, 0xef, 0x8c, 0x01, 0x47, 0xb3, 0xed, 0x8c, 0xdb, 0xac, + 0x95, 0x14, 0x98, 0x47, 0xe8, 0x7f, 0x85, 0xa2, 0x3c, 0x49, 0x90, 0x66, 0x53, 0x7f, 0x6d, 0x6b, + 0xb2, 0x7c, 0x1d, 0x13, 0xca, 0x94, 0x53, 0x6d, 0xbd, 0x15, 0xef, 0x90, 0x99, 0x6d, 0x5d, 0x80, + 0x57, 0xb0, 0x18, 0x85, 0xe6, 0xa3, 0x9b, 0x07, 0xe6, 0xba, 0xbb, 0x59, 0x21, 0xb4, 0xdf, 0x1f, + 0x52, 0x9a, 0x1a, 0xf9, 0xac, 0x3b, 0xa4, 0x52, 0x12, 0xdf, 0x5a, 0x01, 0xdf, 0x1f, 0x4e, 0xc1, + 0xe7, 0xbf, 0x49, 0xa3, 0x86, 0xdd, 0x89, 0x31, 0x13, 0xd8, 0x93, 0x94, 0x83, 0x6c, 0xce, 0x46, + 0x06, 0x3b, 0x45, 0x69, 0x1d, 0x7f, 0xba, 0x2c, 0x1b, 0x17, 0x97, 0x65, 0xe3, 0xcb, 0x65, 0xd9, + 0xf8, 0x78, 0x55, 0x5e, 0xb8, 0xb8, 0x2a, 0x2f, 0x7c, 0xbe, 0x2a, 0x2f, 0xbc, 0x7f, 0xd6, 0xa7, + 0x32, 0x38, 0xeb, 0xda, 0x1e, 0x1f, 0xd6, 0xf5, 0x1b, 0xb0, 0x66, 0xe9, 0xa1, 0x3e, 0xbe, 0xf6, + 0x71, 0x06, 0xb9, 0xbb, 0xcb, 0xf0, 0x95, 0x7b, 0xfa, 0x33, 0x00, 0x00, 0xff, 0xff, 0xff, 0x75, + 0xe0, 0xb7, 0xc2, 0x05, 0x00, 0x00, } func (m *IndexedHeader) Marshal() (dAtA []byte, err error) { From 3b103d2fe2a17f4aac15d84d18320ba666220a88 Mon Sep 17 00:00:00 2001 From: KonradStaniec Date: Thu, 9 Mar 2023 09:35:43 +0100 Subject: [PATCH 13/59] Migrate to comet bft (#323) * Migrate to comet bft --- app/app.go | 11 +- app/app_test.go | 6 +- app/export.go | 2 +- app/test_helpers.go | 14 +- app/types.go | 2 +- app/utils.go | 4 +- cmd/babylond/cmd/add_gen_bls.go | 2 +- cmd/babylond/cmd/add_gen_bls_test.go | 8 +- cmd/babylond/cmd/create_bls_key.go | 4 +- cmd/babylond/cmd/flags.go | 2 +- cmd/babylond/cmd/genaccounts_test.go | 2 +- cmd/babylond/cmd/genbls.go | 4 +- cmd/babylond/cmd/genbls_test.go | 4 +- cmd/babylond/cmd/genesis.go | 2 +- cmd/babylond/cmd/root.go | 8 +- cmd/babylond/cmd/testnet.go | 8 +- cmd/babylond/cmd/testnet_test.go | 2 +- cmd/babylond/cmd/validate_genesis.go | 2 +- cmd/babylond/cmd/validate_genesis_test.go | 8 +- crypto/bls12381/bls.go | 2 +- go.mod | 114 ++-- go.sum | 593 ++++++++++++++---- privval/file.go | 20 +- privval/types.go | 2 +- proto/babylon/epoching/v1/epoching.proto | 2 +- proto/babylon/epoching/v1/events.proto | 2 +- proto/buf.lock | 2 +- proto/buf.yaml | 2 +- simapp/sim_bench_test.go | 2 +- simapp/sim_test.go | 8 +- simapp/state.go | 4 +- simapp/utils.go | 6 +- test/e2e/configurer/chain/chain.go | 2 +- test/e2e/configurer/chain/node.go | 4 +- test/e2e/configurer/chain/queries.go | 2 +- test/e2e/initialization/config.go | 2 +- test/e2e/initialization/node.go | 10 +- test/utils.go | 2 +- testutil/datagen/genesiskey.go | 2 +- testutil/datagen/init_val.go | 8 +- testutil/datagen/priv_validator.go | 6 +- testutil/datagen/tendermint.go | 2 +- testutil/keeper/btccheckpoint.go | 6 +- testutil/keeper/btclightclient.go | 6 +- testutil/keeper/checkpointing.go | 6 +- testutil/keeper/epoching.go | 6 +- testutil/keeper/zoneconcierge.go | 10 +- types/retry/log.go | 2 +- x/btccheckpoint/abci.go | 2 +- x/btccheckpoint/genesis_test.go | 2 +- x/btccheckpoint/keeper/keeper.go | 2 +- x/btccheckpoint/module.go | 2 +- x/btclightclient/keeper/keeper.go | 2 +- x/btclightclient/module.go | 2 +- x/checkpointing/abci.go | 2 +- x/checkpointing/client/cli/tx_test.go | 16 +- x/checkpointing/client/cli/utils.go | 10 +- x/checkpointing/genesis_test.go | 4 +- x/checkpointing/keeper/keeper.go | 2 +- x/checkpointing/keeper/msg_server_test.go | 2 +- x/checkpointing/module.go | 2 +- x/checkpointing/testckpt/helper.go | 2 +- x/checkpointing/types/genesis.go | 2 +- x/checkpointing/types/pop.go | 2 +- x/checkpointing/types/pop_test.go | 2 +- x/checkpointing/types/utils.go | 2 +- x/epoching/abci.go | 12 +- x/epoching/genesis_test.go | 2 +- x/epoching/keeper/apphash_chain.go | 4 +- x/epoching/keeper/epochs.go | 2 +- x/epoching/keeper/keeper.go | 2 +- x/epoching/keeper/modified_staking.go | 2 +- x/epoching/keeper/msg_server.go | 4 +- x/epoching/module.go | 2 +- x/epoching/testepoching/helper.go | 4 +- x/epoching/testepoching/tm.go | 4 +- x/epoching/testepoching/validator.go | 2 +- x/epoching/types/epoching.go | 4 +- x/epoching/types/epoching.pb.go | 2 +- x/epoching/types/events.pb.go | 98 +-- x/epoching/types/expected_keepers.go | 2 +- x/epoching/types/genesis_test.go | 2 +- x/monitor/genesis_test.go | 2 +- x/monitor/keeper/keeper.go | 2 +- x/monitor/module.go | 2 +- x/zoneconcierge/abci.go | 2 +- x/zoneconcierge/keeper/grpc_query_test.go | 6 +- x/zoneconcierge/keeper/keeper.go | 2 +- .../keeper/proof_block_in_epoch.go | 4 +- x/zoneconcierge/keeper/proof_epoch_sealed.go | 2 +- x/zoneconcierge/keeper/proof_tx_in_block.go | 4 +- x/zoneconcierge/keeper/query_kvstore.go | 6 +- x/zoneconcierge/module.go | 2 +- x/zoneconcierge/module_test.go | 6 +- x/zoneconcierge/types/expected_keepers.go | 4 +- x/zoneconcierge/types/mocked_keepers.go | 4 +- x/zoneconcierge/types/zoneconcierge.pb.go | 4 +- 97 files changed, 765 insertions(+), 425 deletions(-) diff --git a/app/app.go b/app/app.go index 03b4886e3..6f23ee0cd 100644 --- a/app/app.go +++ b/app/app.go @@ -20,14 +20,14 @@ import ( ibcclient "github.com/cosmos/ibc-go/v7/modules/core/02-client" ibcclienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" + dbm "github.com/cometbft/cometbft-db" + abci "github.com/cometbft/cometbft/abci/types" + "github.com/cometbft/cometbft/libs/log" + tmos "github.com/cometbft/cometbft/libs/os" ibcclientclient "github.com/cosmos/ibc-go/v7/modules/core/02-client/client" "github.com/gorilla/mux" "github.com/rakyll/statik/fs" "github.com/spf13/cast" - abci "github.com/tendermint/tendermint/abci/types" - "github.com/tendermint/tendermint/libs/log" - tmos "github.com/tendermint/tendermint/libs/os" - dbm "github.com/tendermint/tm-db" errorsmod "cosmossdk.io/errors" "github.com/cosmos/cosmos-sdk/baseapp" @@ -103,7 +103,6 @@ import ( storetypes "github.com/cosmos/cosmos-sdk/store/types" govclient "github.com/cosmos/cosmos-sdk/x/gov/client" - govv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" govv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" "github.com/babylonchain/babylon/x/btccheckpoint" @@ -948,7 +947,7 @@ func initParamsKeeper(appCodec codec.BinaryCodec, legacyAmino *codec.LegacyAmino paramsKeeper.Subspace(minttypes.ModuleName) paramsKeeper.Subspace(distrtypes.ModuleName) paramsKeeper.Subspace(slashingtypes.ModuleName) - paramsKeeper.Subspace(govtypes.ModuleName).WithKeyTable(govv1.ParamKeyTable()) + paramsKeeper.Subspace(govtypes.ModuleName) paramsKeeper.Subspace(crisistypes.ModuleName) // Babylon modules paramsKeeper.Subspace(epochingtypes.ModuleName) diff --git a/app/app_test.go b/app/app_test.go index 8c6a9a827..9433d960b 100644 --- a/app/app_test.go +++ b/app/app_test.go @@ -5,12 +5,12 @@ import ( "os" "testing" + dbm "github.com/cometbft/cometbft-db" + "github.com/cometbft/cometbft/libs/log" + tmproto "github.com/cometbft/cometbft/proto/tendermint/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" "github.com/stretchr/testify/require" - "github.com/tendermint/tendermint/libs/log" - tmproto "github.com/tendermint/tendermint/proto/tendermint/types" - dbm "github.com/tendermint/tm-db" ) func TestBabylonBlockedAddrs(t *testing.T) { diff --git a/app/export.go b/app/export.go index c85c4133e..ada8411d7 100644 --- a/app/export.go +++ b/app/export.go @@ -4,7 +4,7 @@ import ( "encoding/json" "log" - tmproto "github.com/tendermint/tendermint/proto/tendermint/types" + tmproto "github.com/cometbft/cometbft/proto/tendermint/types" servertypes "github.com/cosmos/cosmos-sdk/server/types" sdk "github.com/cosmos/cosmos-sdk/types" diff --git a/app/test_helpers.go b/app/test_helpers.go index b56678112..ef9251f54 100644 --- a/app/test_helpers.go +++ b/app/test_helpers.go @@ -11,9 +11,9 @@ import ( "time" "cosmossdk.io/math" - tmconfig "github.com/tendermint/tendermint/config" + tmconfig "github.com/cometbft/cometbft/config" - tmjson "github.com/tendermint/tendermint/libs/json" + tmjson "github.com/cometbft/cometbft/libs/json" "github.com/babylonchain/babylon/testutil/datagen" @@ -22,6 +22,11 @@ import ( appparams "github.com/babylonchain/babylon/app/params" txformat "github.com/babylonchain/babylon/btctxformatter" bbn "github.com/babylonchain/babylon/types" + dbm "github.com/cometbft/cometbft-db" + abci "github.com/cometbft/cometbft/abci/types" + "github.com/cometbft/cometbft/libs/log" + tmproto "github.com/cometbft/cometbft/proto/tendermint/types" + tmtypes "github.com/cometbft/cometbft/types" bam "github.com/cosmos/cosmos-sdk/baseapp" "github.com/cosmos/cosmos-sdk/client" codectypes "github.com/cosmos/cosmos-sdk/codec/types" @@ -40,11 +45,6 @@ import ( minttypes "github.com/cosmos/cosmos-sdk/x/mint/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/stretchr/testify/require" - abci "github.com/tendermint/tendermint/abci/types" - "github.com/tendermint/tendermint/libs/log" - tmproto "github.com/tendermint/tendermint/proto/tendermint/types" - tmtypes "github.com/tendermint/tendermint/types" - dbm "github.com/tendermint/tm-db" ) // SetupOptions defines arguments that are passed into `Simapp` constructor. diff --git a/app/types.go b/app/types.go index 2f880bc65..fc631ccdc 100644 --- a/app/types.go +++ b/app/types.go @@ -1,7 +1,7 @@ package app import ( - abci "github.com/tendermint/tendermint/abci/types" + abci "github.com/cometbft/cometbft/abci/types" "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/server/types" diff --git a/app/utils.go b/app/utils.go index 2d11432bd..435160090 100644 --- a/app/utils.go +++ b/app/utils.go @@ -9,12 +9,12 @@ import ( "github.com/cosmos/cosmos-sdk/crypto/keyring" + tmconfig "github.com/cometbft/cometbft/config" + tmos "github.com/cometbft/cometbft/libs/os" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/config" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/auth/types" - tmconfig "github.com/tendermint/tendermint/config" - tmos "github.com/tendermint/tendermint/libs/os" appparams "github.com/babylonchain/babylon/app/params" "github.com/babylonchain/babylon/privval" diff --git a/cmd/babylond/cmd/add_gen_bls.go b/cmd/babylond/cmd/add_gen_bls.go index dbbadb5fe..f4af2c504 100644 --- a/cmd/babylond/cmd/add_gen_bls.go +++ b/cmd/babylond/cmd/add_gen_bls.go @@ -5,13 +5,13 @@ import ( "errors" "fmt" + tmos "github.com/cometbft/cometbft/libs/os" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/server" "github.com/cosmos/cosmos-sdk/x/genutil" genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/spf13/cobra" - tmos "github.com/tendermint/tendermint/libs/os" "github.com/babylonchain/babylon/x/checkpointing/types" ) diff --git a/cmd/babylond/cmd/add_gen_bls_test.go b/cmd/babylond/cmd/add_gen_bls_test.go index 1bbb7b811..0bb59cfb7 100644 --- a/cmd/babylond/cmd/add_gen_bls_test.go +++ b/cmd/babylond/cmd/add_gen_bls_test.go @@ -9,6 +9,10 @@ import ( "github.com/cosmos/cosmos-sdk/server/config" "github.com/cosmos/cosmos-sdk/x/genutil" + tmconfig "github.com/cometbft/cometbft/config" + tmjson "github.com/cometbft/cometbft/libs/json" + "github.com/cometbft/cometbft/libs/log" + "github.com/cometbft/cometbft/libs/tempfile" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" "github.com/cosmos/cosmos-sdk/server" @@ -17,10 +21,6 @@ import ( genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types" "github.com/spf13/viper" "github.com/stretchr/testify/require" - tmconfig "github.com/tendermint/tendermint/config" - tmjson "github.com/tendermint/tendermint/libs/json" - "github.com/tendermint/tendermint/libs/log" - "github.com/tendermint/tendermint/libs/tempfile" "github.com/babylonchain/babylon/app" "github.com/babylonchain/babylon/cmd/babylond/cmd" diff --git a/cmd/babylond/cmd/create_bls_key.go b/cmd/babylond/cmd/create_bls_key.go index efad6e2f9..2d2430e2c 100644 --- a/cmd/babylond/cmd/create_bls_key.go +++ b/cmd/babylond/cmd/create_bls_key.go @@ -7,11 +7,11 @@ import ( appparams "github.com/babylonchain/babylon/app/params" "github.com/babylonchain/babylon/crypto/bls12381" "github.com/babylonchain/babylon/privval" + tmconfig "github.com/cometbft/cometbft/config" + tmos "github.com/cometbft/cometbft/libs/os" "github.com/cosmos/cosmos-sdk/client/flags" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/spf13/cobra" - tmconfig "github.com/tendermint/tendermint/config" - tmos "github.com/tendermint/tendermint/libs/os" "path/filepath" "strings" ) diff --git a/cmd/babylond/cmd/flags.go b/cmd/babylond/cmd/flags.go index 28cfd9de9..f7166bee2 100644 --- a/cmd/babylond/cmd/flags.go +++ b/cmd/babylond/cmd/flags.go @@ -1,9 +1,9 @@ package cmd import ( + tmrand "github.com/cometbft/cometbft/libs/rand" "github.com/cosmos/cosmos-sdk/client/flags" "github.com/spf13/cobra" - tmrand "github.com/tendermint/tendermint/libs/rand" "time" ) diff --git a/cmd/babylond/cmd/genaccounts_test.go b/cmd/babylond/cmd/genaccounts_test.go index 803df1f55..3f18a76be 100644 --- a/cmd/babylond/cmd/genaccounts_test.go +++ b/cmd/babylond/cmd/genaccounts_test.go @@ -9,9 +9,9 @@ import ( "github.com/cosmos/cosmos-sdk/crypto/keyring" sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cometbft/cometbft/libs/log" "github.com/spf13/viper" "github.com/stretchr/testify/require" - "github.com/tendermint/tendermint/libs/log" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" diff --git a/cmd/babylond/cmd/genbls.go b/cmd/babylond/cmd/genbls.go index 4fb1d0dc8..5534cd60b 100644 --- a/cmd/babylond/cmd/genbls.go +++ b/cmd/babylond/cmd/genbls.go @@ -7,10 +7,10 @@ import ( "github.com/babylonchain/babylon/app" "github.com/babylonchain/babylon/privval" + tmconfig "github.com/cometbft/cometbft/config" + tmos "github.com/cometbft/cometbft/libs/os" "github.com/cosmos/cosmos-sdk/client/flags" "github.com/spf13/cobra" - tmconfig "github.com/tendermint/tendermint/config" - tmos "github.com/tendermint/tendermint/libs/os" ) func GenBlsCmd() *cobra.Command { diff --git a/cmd/babylond/cmd/genbls_test.go b/cmd/babylond/cmd/genbls_test.go index 5f7379a55..bf9abc7c4 100644 --- a/cmd/babylond/cmd/genbls_test.go +++ b/cmd/babylond/cmd/genbls_test.go @@ -7,6 +7,8 @@ import ( "path/filepath" "testing" + tmconfig "github.com/cometbft/cometbft/config" + "github.com/cometbft/cometbft/libs/log" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" "github.com/cosmos/cosmos-sdk/crypto/hd" @@ -17,8 +19,6 @@ import ( genutiltest "github.com/cosmos/cosmos-sdk/x/genutil/client/testutil" "github.com/spf13/viper" "github.com/stretchr/testify/require" - tmconfig "github.com/tendermint/tendermint/config" - "github.com/tendermint/tendermint/libs/log" "github.com/babylonchain/babylon/app" "github.com/babylonchain/babylon/cmd/babylond/cmd" diff --git a/cmd/babylond/cmd/genesis.go b/cmd/babylond/cmd/genesis.go index abc626f4d..5cc3b8045 100644 --- a/cmd/babylond/cmd/genesis.go +++ b/cmd/babylond/cmd/genesis.go @@ -11,6 +11,7 @@ import ( btclightclienttypes "github.com/babylonchain/babylon/x/btclightclient/types" checkpointingtypes "github.com/babylonchain/babylon/x/checkpointing/types" epochingtypes "github.com/babylonchain/babylon/x/epoching/types" + "github.com/cometbft/cometbft/types" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" cdctypes "github.com/cosmos/cosmos-sdk/codec/types" @@ -28,7 +29,6 @@ import ( minttypes "github.com/cosmos/cosmos-sdk/x/mint/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/spf13/cobra" - "github.com/tendermint/tendermint/types" ) func PrepareGenesisCmd(defaultNodeHome string, mbm module.BasicManager) *cobra.Command { diff --git a/cmd/babylond/cmd/root.go b/cmd/babylond/cmd/root.go index 51f18ef94..57c22fdd1 100644 --- a/cmd/babylond/cmd/root.go +++ b/cmd/babylond/cmd/root.go @@ -7,6 +7,10 @@ import ( "path/filepath" rosettaCmd "cosmossdk.io/tools/rosetta/cmd" + dbm "github.com/cometbft/cometbft-db" + tmcfg "github.com/cometbft/cometbft/config" + tmcli "github.com/cometbft/cometbft/libs/cli" + "github.com/cometbft/cometbft/libs/log" "github.com/cosmos/cosmos-sdk/baseapp" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/config" @@ -30,10 +34,6 @@ import ( genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types" "github.com/spf13/cast" "github.com/spf13/cobra" - tmcfg "github.com/tendermint/tendermint/config" - tmcli "github.com/tendermint/tendermint/libs/cli" - "github.com/tendermint/tendermint/libs/log" - dbm "github.com/tendermint/tm-db" "github.com/babylonchain/babylon/app" "github.com/babylonchain/babylon/app/params" diff --git a/cmd/babylond/cmd/testnet.go b/cmd/babylond/cmd/testnet.go index c33286519..9ccd20016 100644 --- a/cmd/babylond/cmd/testnet.go +++ b/cmd/babylond/cmd/testnet.go @@ -24,11 +24,11 @@ import ( checkpointingtypes "github.com/babylonchain/babylon/x/checkpointing/types" "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" + tmconfig "github.com/cometbft/cometbft/config" + tmos "github.com/cometbft/cometbft/libs/os" + "github.com/cometbft/cometbft/types" + tmtime "github.com/cometbft/cometbft/types/time" "github.com/spf13/cobra" - tmconfig "github.com/tendermint/tendermint/config" - tmos "github.com/tendermint/tendermint/libs/os" - "github.com/tendermint/tendermint/types" - tmtime "github.com/tendermint/tendermint/types/time" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" diff --git a/cmd/babylond/cmd/testnet_test.go b/cmd/babylond/cmd/testnet_test.go index 1fc62f834..82215080b 100644 --- a/cmd/babylond/cmd/testnet_test.go +++ b/cmd/babylond/cmd/testnet_test.go @@ -5,6 +5,7 @@ import ( "fmt" "testing" + "github.com/cometbft/cometbft/libs/log" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" "github.com/cosmos/cosmos-sdk/server" @@ -13,7 +14,6 @@ import ( genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types" "github.com/spf13/viper" "github.com/stretchr/testify/require" - "github.com/tendermint/tendermint/libs/log" "github.com/babylonchain/babylon/app" ) diff --git a/cmd/babylond/cmd/validate_genesis.go b/cmd/babylond/cmd/validate_genesis.go index 522a5d97b..d17818bd3 100644 --- a/cmd/babylond/cmd/validate_genesis.go +++ b/cmd/babylond/cmd/validate_genesis.go @@ -7,12 +7,12 @@ import ( "github.com/spf13/cobra" + tmtypes "github.com/cometbft/cometbft/types" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/server" "github.com/cosmos/cosmos-sdk/types/module" genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - tmtypes "github.com/tendermint/tendermint/types" "github.com/babylonchain/babylon/x/checkpointing/types" ) diff --git a/cmd/babylond/cmd/validate_genesis_test.go b/cmd/babylond/cmd/validate_genesis_test.go index 27470aa74..5406591d9 100644 --- a/cmd/babylond/cmd/validate_genesis_test.go +++ b/cmd/babylond/cmd/validate_genesis_test.go @@ -6,23 +6,23 @@ import ( "fmt" "testing" + "github.com/cosmos/cosmos-sdk/x/genutil" "github.com/spf13/viper" "github.com/stretchr/testify/require" - "github.com/cosmos/cosmos-sdk/x/genutil" "github.com/babylonchain/babylon/app" "github.com/babylonchain/babylon/cmd/babylond/cmd" "github.com/babylonchain/babylon/x/checkpointing/types" + tmjson "github.com/cometbft/cometbft/libs/json" + "github.com/cometbft/cometbft/libs/log" + tmtypes "github.com/cometbft/cometbft/types" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" "github.com/cosmos/cosmos-sdk/server" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" genutiltest "github.com/cosmos/cosmos-sdk/x/genutil/client/testutil" genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types" - tmjson "github.com/tendermint/tendermint/libs/json" - "github.com/tendermint/tendermint/libs/log" - tmtypes "github.com/tendermint/tendermint/types" ) func TestCheckCorrespondence(t *testing.T) { diff --git a/crypto/bls12381/bls.go b/crypto/bls12381/bls.go index 02ce9b3c8..114db2af3 100644 --- a/crypto/bls12381/bls.go +++ b/crypto/bls12381/bls.go @@ -2,9 +2,9 @@ package bls12381 import ( "crypto/rand" + tmcrypto "github.com/cometbft/cometbft/crypto" "github.com/pkg/errors" blst "github.com/supranational/blst/bindings/go" - tmcrypto "github.com/tendermint/tendermint/crypto" "io" ) diff --git a/go.mod b/go.mod index 4bf7b86d4..2018e06d5 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,9 @@ module github.com/babylonchain/babylon require ( github.com/btcsuite/btcd v0.23.4 - github.com/cosmos/cosmos-sdk v0.47.0-rc2 + github.com/cometbft/cometbft v0.37.0 + github.com/cometbft/cometbft-db v0.7.0 + github.com/cosmos/cosmos-sdk v0.47.0-rc3 github.com/golang/protobuf v1.5.2 github.com/gorilla/mux v1.8.0 github.com/grpc-ecosystem/grpc-gateway v1.16.0 @@ -13,33 +15,31 @@ require ( github.com/spf13/cast v1.5.0 github.com/spf13/cobra v1.6.1 github.com/spf13/viper v1.15.0 - github.com/stretchr/testify v1.8.1 + github.com/stretchr/testify v1.8.2 github.com/supranational/blst v0.3.8 - google.golang.org/genproto v0.0.0-20221227171554-f9683d7f8bef - google.golang.org/grpc v1.52.3 + google.golang.org/genproto v0.0.0-20230216225411-c8e22ba71e44 + google.golang.org/grpc v1.53.0 gopkg.in/yaml.v2 v2.4.0 ) require ( - cosmossdk.io/api v0.2.6 + cosmossdk.io/api v0.3.1 cosmossdk.io/errors v1.0.0-beta.7 - cosmossdk.io/math v1.0.0-beta.4 - cosmossdk.io/tools/rosetta v0.2.0 + cosmossdk.io/math v1.0.0-beta.6.0.20230216172121-959ce49135e4 + cosmossdk.io/tools/rosetta v0.2.1 github.com/boljen/go-bitmap v0.0.0-20151001105940-23cd2fb0ce7d github.com/btcsuite/btcd/btcutil v1.1.2 github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 - github.com/cosmos/gogoproto v1.4.4 + github.com/cosmos/gogoproto v1.4.6 github.com/cosmos/ibc-go/v7 v7.0.0-rc0 github.com/golang/mock v1.6.0 github.com/jinzhu/copier v0.3.5 github.com/ory/dockertest/v3 v3.9.1 - github.com/tendermint/tendermint v0.37.0-rc2 - github.com/tendermint/tm-db v0.6.7 - google.golang.org/protobuf v1.28.2-0.20220831092852-f930b1dc76e8 + google.golang.org/protobuf v1.28.2-0.20230208135220-49eaa78c6c9c ) require ( - filippo.io/edwards25519 v1.0.0-rc.1 // indirect + filippo.io/edwards25519 v1.0.0 // indirect github.com/99designs/keyring v1.2.1 // indirect github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d // indirect github.com/armon/go-metrics v0.4.1 @@ -47,23 +47,23 @@ require ( github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 // indirect github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f // indirect github.com/cespare/xxhash v1.1.0 // indirect - github.com/cespare/xxhash/v2 v2.1.2 // indirect + github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/confio/ics23/go v0.9.0 // indirect github.com/cosmos/btcutil v1.0.5 // indirect github.com/cosmos/go-bip39 v1.0.0 - github.com/cosmos/iavl v0.19.5-rc.1 // indirect + github.com/cosmos/iavl v0.20.0-alpha4 // indirect github.com/cosmos/ledger-cosmos-go v0.12.1 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f // indirect github.com/dgraph-io/badger/v2 v2.2007.4 // indirect github.com/dgraph-io/ristretto v0.1.1 // indirect github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 // indirect - github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac // indirect + github.com/dustin/go-humanize v1.0.1 // indirect github.com/dvsekhvalnov/jose2go v1.5.0 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/go-kit/kit v0.12.0 // indirect github.com/go-kit/log v0.2.1 // indirect - github.com/go-logfmt/logfmt v0.5.1 // indirect + github.com/go-logfmt/logfmt v0.6.0 // indirect github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect github.com/golang/snappy v0.0.4 // indirect github.com/google/btree v1.1.2 // indirect @@ -77,40 +77,39 @@ require ( github.com/hashicorp/go-immutable-radix v1.3.1 // indirect github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d // indirect github.com/hashicorp/hcl v1.0.0 // indirect - github.com/hdevalence/ed25519consensus v0.0.0-20220222234857-c00d1f31bab3 // indirect + github.com/hdevalence/ed25519consensus v0.1.0 // indirect github.com/improbable-eng/grpc-web v0.15.0 // indirect - github.com/inconshreveable/mousetrap v1.0.1 // indirect + github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jmhodges/levigo v1.0.0 // indirect github.com/keybase/go-keychain v0.0.0-20190712205309-48d3d31d256d // indirect - github.com/klauspost/compress v1.15.12 // indirect + github.com/klauspost/compress v1.15.15 // indirect github.com/lib/pq v1.10.7 // indirect github.com/libp2p/go-buffer-pool v0.1.0 // indirect github.com/magiconair/properties v1.8.7 // indirect - github.com/mattn/go-isatty v0.0.16 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect + github.com/mattn/go-isatty v0.0.17 // indirect + github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0 // indirect github.com/minio/highwayhash v1.0.2 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/mtibben/percent v0.2.1 // indirect - github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5 // indirect + github.com/petermattis/goid v0.0.0-20221215004737-a150e88a970d // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/prometheus/client_golang v1.14.0 // indirect github.com/prometheus/client_model v0.3.0 // indirect - github.com/prometheus/common v0.37.0 // indirect - github.com/prometheus/procfs v0.8.0 // indirect + github.com/prometheus/common v0.40.0 // indirect + github.com/prometheus/procfs v0.9.0 // indirect github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect - github.com/rs/cors v1.8.2 // indirect - github.com/rs/zerolog v1.28.0 // indirect + github.com/rs/cors v1.8.3 // indirect github.com/sasha-s/go-deadlock v0.3.1 // indirect github.com/spf13/afero v1.9.3 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/spf13/pflag v1.0.5 github.com/subosito/gotenv v1.4.2 // indirect - github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 // indirect + github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect github.com/tendermint/go-amino v0.16.0 // indirect github.com/zondax/hid v0.9.1 // indirect go.etcd.io/bbolt v1.3.6 // indirect - golang.org/x/crypto v0.5.0 // indirect + golang.org/x/crypto v0.6.0 // indirect golang.org/x/sys v0.5.0 // indirect golang.org/x/term v0.5.0 // indirect golang.org/x/text v0.7.0 // indirect @@ -119,29 +118,29 @@ require ( ) require ( - cloud.google.com/go v0.105.0 // indirect - cloud.google.com/go/compute v1.14.0 // indirect + cloud.google.com/go v0.110.0 // indirect + cloud.google.com/go/compute v1.18.0 // indirect cloud.google.com/go/compute/metadata v0.2.3 // indirect - cloud.google.com/go/iam v0.8.0 // indirect - cloud.google.com/go/storage v1.27.0 // indirect - cosmossdk.io/core v0.3.2 // indirect + cloud.google.com/go/iam v0.12.0 // indirect + cloud.google.com/go/storage v1.29.0 // indirect + cosmossdk.io/core v0.5.1 // indirect cosmossdk.io/depinject v1.0.0-alpha.3 // indirect github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect github.com/Microsoft/go-winio v0.6.0 // indirect github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 // indirect - github.com/aws/aws-sdk-go v1.40.45 // indirect + github.com/aws/aws-sdk-go v1.44.203 // indirect github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect github.com/cenkalti/backoff/v4 v4.2.0 // indirect - github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e // indirect + github.com/chzyer/readline v1.5.1 // indirect github.com/cockroachdb/apd/v2 v2.0.2 // indirect + github.com/coinbase/rosetta-sdk-go/types v1.0.0 // indirect github.com/containerd/continuity v0.3.0 // indirect - github.com/cosmos/cosmos-proto v1.0.0-beta.1 // indirect + github.com/cosmos/cosmos-proto v1.0.0-beta.2 // indirect github.com/cosmos/gogogateway v1.2.0 // indirect - github.com/cosmos/gorocksdb v1.2.0 // indirect github.com/cosmos/ics23/go v0.9.1-0.20221207100636-b1abd8678aab // indirect - github.com/cosmos/rosetta-sdk-go v0.9.0 // indirect - github.com/creachadair/taskgroup v0.3.2 // indirect + github.com/cosmos/rosetta-sdk-go v0.10.0 // indirect + github.com/creachadair/taskgroup v0.4.2 // indirect github.com/danieljoos/wincred v1.1.2 // indirect github.com/decred/dcrd/crypto/blake256 v1.0.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect @@ -150,50 +149,52 @@ require ( github.com/docker/go-connections v0.4.0 // indirect github.com/docker/go-units v0.5.0 // indirect github.com/felixge/httpsnoop v1.0.2 // indirect - github.com/gofrs/uuid v4.3.0+incompatible // indirect - github.com/gogo/googleapis v1.4.1-0.20201022092350-68b0159b7869 // indirect + github.com/gogo/googleapis v1.4.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/glog v1.0.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/google/go-cmp v0.5.9 // indirect github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect github.com/google/uuid v1.3.0 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.2.1 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.2.3 // indirect github.com/googleapis/gax-go/v2 v2.7.0 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect - github.com/hashicorp/go-getter v1.6.2 // indirect + github.com/hashicorp/go-getter v1.7.0 // indirect github.com/hashicorp/go-safetemp v1.0.0 // indirect github.com/hashicorp/go-version v1.6.0 // indirect github.com/huandu/skiplist v1.2.0 // indirect github.com/imdario/mergo v0.3.13 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect github.com/manifoldco/promptui v0.9.0 // indirect - github.com/mattn/go-colorable v0.1.13 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect - github.com/mitchellh/go-testing-interface v1.0.0 // indirect + github.com/mitchellh/go-testing-interface v1.14.1 // indirect github.com/moby/term v0.0.0-20221120202655-abb19827d345 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.1.0-rc2 // indirect github.com/opencontainers/runc v1.1.4 // indirect github.com/pelletier/go-toml/v2 v2.0.6 // indirect github.com/sirupsen/logrus v1.9.0 // indirect - github.com/tidwall/btree v1.5.2 // indirect - github.com/ulikunitz/xz v0.5.8 // indirect + github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c // indirect + github.com/tidwall/btree v1.6.0 // indirect + github.com/ulikunitz/xz v0.5.11 // indirect github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect github.com/xeipuuv/gojsonschema v1.2.0 // indirect - github.com/zondax/ledger-go v0.14.0 // indirect + github.com/zondax/ledger-go v0.14.1 // indirect go.opencensus.io v0.24.0 // indirect - golang.org/x/exp v0.0.0-20221019170559-20944726eadf // indirect - golang.org/x/mod v0.7.0 // indirect + golang.org/x/exp v0.0.0-20230213192124-5e25df0256eb // indirect + golang.org/x/mod v0.8.0 // indirect golang.org/x/net v0.7.0 // indirect - golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783 // indirect - golang.org/x/tools v0.4.0 // indirect + golang.org/x/oauth2 v0.5.0 // indirect + golang.org/x/tools v0.6.0 // indirect golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect - google.golang.org/api v0.107.0 // indirect + google.golang.org/api v0.110.0 // indirect google.golang.org/appengine v1.6.7 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - pgregory.net/rapid v0.5.3 // indirect + pgregory.net/rapid v0.5.5 // indirect sigs.k8s.io/yaml v1.3.0 // indirect ) @@ -202,9 +203,12 @@ replace ( // slay the dragonberry github.com/confio/ics23/go => github.com/cosmos/cosmos-sdk/ics23/go v0.8.0 - github.com/cosmos/ibc-go/v7 => github.com/babylonchain/ibc-go/v7 v7.0.0-20230222123128-9fc81e93ac35 + github.com/cosmos/ibc-go/v7 => github.com/babylonchain/ibc-go/v7 v7.0.0-20230308120348-6dd688ac57a6 // Fix upstream GHSA-h395-qcrw-5vmq vulnerability. // TODO Remove it: https://github.com/cosmos/cosmos-sdk/issues/10409 github.com/gin-gonic/gin => github.com/gin-gonic/gin v1.7.0 + + // Downgraded to stable version see: https://github.com/cosmos/cosmos-sdk/pull/14952 + github.com/syndtr/goleveldb => github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 ) diff --git a/go.sum b/go.sum index d0371dd54..9502eb04b 100644 --- a/go.sum +++ b/go.sum @@ -17,50 +17,192 @@ cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHOb cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= -cloud.google.com/go v0.105.0 h1:DNtEKRBAAzeS4KyIory52wWHuClNaXJ5x1F7xa4q+5Y= -cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFOKM= +cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= +cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= +cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= +cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= +cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= +cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= +cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= +cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= +cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= +cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= +cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= +cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= +cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= +cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= +cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= +cloud.google.com/go v0.110.0 h1:Zc8gqp3+a9/Eyph2KDmcGaPtbKRIoqq4YTlL4NMD0Ys= +cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= +cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= +cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= +cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= +cloud.google.com/go/analytics v0.12.0/go.mod h1:gkfj9h6XRf9+TS4bmuhPEShsh3hH8PAZzm/41OOhQd4= +cloud.google.com/go/area120 v0.5.0/go.mod h1:DE/n4mp+iqVyvxHN41Vf1CR602GiHQjFPusMFW6bGR4= +cloud.google.com/go/area120 v0.6.0/go.mod h1:39yFJqWVgm0UZqWTOdqkLhjoC7uFfgXRC8g/ZegeAh0= +cloud.google.com/go/artifactregistry v1.6.0/go.mod h1:IYt0oBPSAGYj/kprzsBjZ/4LnG/zOcHyFHjWPCi6SAQ= +cloud.google.com/go/artifactregistry v1.7.0/go.mod h1:mqTOFOnGZx8EtSqK/ZWcsm/4U8B77rbcLP6ruDU2Ixk= +cloud.google.com/go/asset v1.5.0/go.mod h1:5mfs8UvcM5wHhqtSv8J1CtxxaQq3AdBxxQi2jGW/K4o= +cloud.google.com/go/asset v1.7.0/go.mod h1:YbENsRK4+xTiL+Ofoj5Ckf+O17kJtgp3Y3nn4uzZz5s= +cloud.google.com/go/asset v1.8.0/go.mod h1:mUNGKhiqIdbr8X7KNayoYvyc4HbbFO9URsjbytpUaW0= +cloud.google.com/go/assuredworkloads v1.5.0/go.mod h1:n8HOZ6pff6re5KYfBXcFvSViQjDwxFkAkmUFffJRbbY= +cloud.google.com/go/assuredworkloads v1.6.0/go.mod h1:yo2YOk37Yc89Rsd5QMVECvjaMKymF9OP+QXWlKXUkXw= +cloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVoYoxeLBoj4XkKYscNI= +cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0= +cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/compute v1.14.0 h1:hfm2+FfxVmnRlh6LpB7cg1ZNU+5edAHmW679JePztk0= -cloud.google.com/go/compute v1.14.0/go.mod h1:YfLtxrj9sU4Yxv+sXzZkyPjEyPBZfXHUvjxega5vAdo= +cloud.google.com/go/bigquery v1.42.0/go.mod h1:8dRTJxhtG+vwBKzE5OseQn/hiydoQN3EedCaOdYmxRA= +cloud.google.com/go/billing v1.4.0/go.mod h1:g9IdKBEFlItS8bTtlrZdVLWSSdSyFUZKXNS02zKMOZY= +cloud.google.com/go/billing v1.5.0/go.mod h1:mztb1tBc3QekhjSgmpf/CV4LzWXLzCArwpLmP2Gm88s= +cloud.google.com/go/binaryauthorization v1.1.0/go.mod h1:xwnoWu3Y84jbuHa0zd526MJYmtnVXn0syOjaJgy4+dM= +cloud.google.com/go/binaryauthorization v1.2.0/go.mod h1:86WKkJHtRcv5ViNABtYMhhNWRrD1Vpi//uKEy7aYEfI= +cloud.google.com/go/cloudtasks v1.5.0/go.mod h1:fD92REy1x5woxkKEkLdvavGnPJGEn8Uic9nWuLzqCpY= +cloud.google.com/go/cloudtasks v1.6.0/go.mod h1:C6Io+sxuke9/KNRkbQpihnW93SWDU3uXt92nu85HkYI= +cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= +cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= +cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= +cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= +cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= +cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= +cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU= +cloud.google.com/go/compute v1.18.0 h1:FEigFqoDbys2cvFkZ9Fjq4gnHBP55anJ0yQyau2f9oY= +cloud.google.com/go/compute v1.18.0/go.mod h1:1X7yHxec2Ga+Ss6jPyjxRxpu2uu7PLgsOVXvgU0yacs= cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= +cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= +cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4= +cloud.google.com/go/datacatalog v1.3.0/go.mod h1:g9svFY6tuR+j+hrTw3J2dNcmI0dzmSiyOzm8kpLq0a0= +cloud.google.com/go/datacatalog v1.5.0/go.mod h1:M7GPLNQeLfWqeIm3iuiruhPzkt65+Bx8dAKvScX8jvs= +cloud.google.com/go/datacatalog v1.6.0/go.mod h1:+aEyF8JKg+uXcIdAmmaMUmZ3q1b/lKLtXCmXdnc0lbc= +cloud.google.com/go/dataflow v0.6.0/go.mod h1:9QwV89cGoxjjSR9/r7eFDqqjtvbKxAK2BaYU6PVk9UM= +cloud.google.com/go/dataflow v0.7.0/go.mod h1:PX526vb4ijFMesO1o202EaUmouZKBpjHsTlCtB4parQ= +cloud.google.com/go/dataform v0.3.0/go.mod h1:cj8uNliRlHpa6L3yVhDOBrUXH+BPAO1+KFMQQNSThKo= +cloud.google.com/go/dataform v0.4.0/go.mod h1:fwV6Y4Ty2yIFL89huYlEkwUPtS7YZinZbzzj5S9FzCE= +cloud.google.com/go/datalabeling v0.5.0/go.mod h1:TGcJ0G2NzcsXSE/97yWjIZO0bXj0KbVlINXMG9ud42I= +cloud.google.com/go/datalabeling v0.6.0/go.mod h1:WqdISuk/+WIGeMkpw/1q7bK/tFEZxsrFJOJdY2bXvTQ= +cloud.google.com/go/dataqna v0.5.0/go.mod h1:90Hyk596ft3zUQ8NkFfvICSIfHFh1Bc7C4cK3vbhkeo= +cloud.google.com/go/dataqna v0.6.0/go.mod h1:1lqNpM7rqNLVgWBJyk5NF6Uen2PHym0jtVJonplVsDA= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/iam v0.8.0 h1:E2osAkZzxI/+8pZcxVLcDtAQx/u+hZXVryUaYQ5O0Kk= -cloud.google.com/go/iam v0.8.0/go.mod h1:lga0/y3iH6CX7sYqypWJ33hf7kkfXJag67naqGESjkE= +cloud.google.com/go/datastream v1.2.0/go.mod h1:i/uTP8/fZwgATHS/XFu0TcNUhuA0twZxxQ3EyCUQMwo= +cloud.google.com/go/datastream v1.3.0/go.mod h1:cqlOX8xlyYF/uxhiKn6Hbv6WjwPPuI9W2M9SAXwaLLQ= +cloud.google.com/go/dialogflow v1.15.0/go.mod h1:HbHDWs33WOGJgn6rfzBW1Kv807BE3O1+xGbn59zZWI4= +cloud.google.com/go/dialogflow v1.16.1/go.mod h1:po6LlzGfK+smoSmTBnbkIZY2w8ffjz/RcGSS+sh1el0= +cloud.google.com/go/dialogflow v1.17.0/go.mod h1:YNP09C/kXA1aZdBgC/VtXX74G/TKn7XVCcVumTflA+8= +cloud.google.com/go/documentai v1.7.0/go.mod h1:lJvftZB5NRiFSX4moiye1SMxHx0Bc3x1+p9e/RfXYiU= +cloud.google.com/go/documentai v1.8.0/go.mod h1:xGHNEB7CtsnySCNrCFdCyyMz44RhFEEX2Q7UD0c5IhU= +cloud.google.com/go/domains v0.6.0/go.mod h1:T9Rz3GasrpYk6mEGHh4rymIhjlnIuB4ofT1wTxDeT4Y= +cloud.google.com/go/domains v0.7.0/go.mod h1:PtZeqS1xjnXuRPKE/88Iru/LdfoRyEHYA9nFQf4UKpg= +cloud.google.com/go/edgecontainer v0.1.0/go.mod h1:WgkZ9tp10bFxqO8BLPqv2LlfmQF1X8lZqwW4r1BTajk= +cloud.google.com/go/edgecontainer v0.2.0/go.mod h1:RTmLijy+lGpQ7BXuTDa4C4ssxyXT34NIuHIgKuP4s5w= +cloud.google.com/go/functions v1.6.0/go.mod h1:3H1UA3qiIPRWD7PeZKLvHZ9SaQhR26XIJcC0A5GbvAk= +cloud.google.com/go/functions v1.7.0/go.mod h1:+d+QBcWM+RsrgZfV9xo6KfA1GlzJfxcfZcRPEhDDfzg= +cloud.google.com/go/gaming v1.5.0/go.mod h1:ol7rGcxP/qHTRQE/RO4bxkXq+Fix0j6D4LFPzYTIrDM= +cloud.google.com/go/gaming v1.6.0/go.mod h1:YMU1GEvA39Qt3zWGyAVA9bpYz/yAhTvaQ1t2sK4KPUA= +cloud.google.com/go/gkeconnect v0.5.0/go.mod h1:c5lsNAg5EwAy7fkqX/+goqFsU1Da/jQFqArp+wGNr/o= +cloud.google.com/go/gkeconnect v0.6.0/go.mod h1:Mln67KyU/sHJEBY8kFZ0xTeyPtzbq9StAVvEULYK16A= +cloud.google.com/go/gkehub v0.9.0/go.mod h1:WYHN6WG8w9bXU0hqNxt8rm5uxnk8IH+lPY9J2TV7BK0= +cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y977wO+hBH0= +cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= +cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= +cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc= +cloud.google.com/go/iam v0.12.0 h1:DRtTY29b75ciH6Ov1PHb4/iat2CLCvrOm40Q0a6DFpE= +cloud.google.com/go/iam v0.12.0/go.mod h1:knyHGviacl11zrtZUoDuYpDgLjvr28sLQaG0YB2GYAY= +cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= +cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= +cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8= +cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08= cloud.google.com/go/longrunning v0.3.0 h1:NjljC+FYPV3uh5/OwWT6pVU+doBqMg2x/rZlE+CamDs= +cloud.google.com/go/mediatranslation v0.5.0/go.mod h1:jGPUhGTybqsPQn91pNXw0xVHfuJ3leR1wj37oU3y1f4= +cloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w= +cloud.google.com/go/memcache v1.4.0/go.mod h1:rTOfiGZtJX1AaFUrOgsMHX5kAzaTQ8azHiuDoTPzNsE= +cloud.google.com/go/memcache v1.5.0/go.mod h1:dk3fCK7dVo0cUU2c36jKb4VqKPS22BTkf81Xq617aWM= +cloud.google.com/go/metastore v1.5.0/go.mod h1:2ZNrDcQwghfdtCwJ33nM0+GrBGlVuh8rakL3vdPY3XY= +cloud.google.com/go/metastore v1.6.0/go.mod h1:6cyQTls8CWXzk45G55x57DVQ9gWg7RiH65+YgPsNh9s= +cloud.google.com/go/networkconnectivity v1.4.0/go.mod h1:nOl7YL8odKyAOtzNX73/M5/mGZgqqMeryi6UPZTk/rA= +cloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o= +cloud.google.com/go/networksecurity v0.5.0/go.mod h1:xS6fOCoqpVC5zx15Z/MqkfDwH4+m/61A3ODiDV1xmiQ= +cloud.google.com/go/networksecurity v0.6.0/go.mod h1:Q5fjhTr9WMI5mbpRYEbiexTzROf7ZbDzvzCrNl14nyU= +cloud.google.com/go/notebooks v1.2.0/go.mod h1:9+wtppMfVPUeJ8fIWPOq1UnATHISkGXGqTkxeieQ6UY= +cloud.google.com/go/notebooks v1.3.0/go.mod h1:bFR5lj07DtCPC7YAAJ//vHskFBxA5JzYlH68kXVdk34= +cloud.google.com/go/osconfig v1.7.0/go.mod h1:oVHeCeZELfJP7XLxcBGTMBvRO+1nQ5tFG9VQTmYS2Fs= +cloud.google.com/go/osconfig v1.8.0/go.mod h1:EQqZLu5w5XA7eKizepumcvWx+m8mJUhEwiPqWiZeEdg= +cloud.google.com/go/oslogin v1.4.0/go.mod h1:YdgMXWRaElXz/lDk1Na6Fh5orF7gvmJ0FGLIs9LId4E= +cloud.google.com/go/oslogin v1.5.0/go.mod h1:D260Qj11W2qx/HVF29zBg+0fd6YCSjSqLUkY/qEenQU= +cloud.google.com/go/phishingprotection v0.5.0/go.mod h1:Y3HZknsK9bc9dMi+oE8Bim0lczMU6hrX0UpADuMefr0= +cloud.google.com/go/phishingprotection v0.6.0/go.mod h1:9Y3LBLgy0kDTcYET8ZH3bq/7qni15yVUoAxiFxnlSUA= +cloud.google.com/go/privatecatalog v0.5.0/go.mod h1:XgosMUvvPyxDjAVNDYxJ7wBW8//hLDDYmnsNcMGq1K0= +cloud.google.com/go/privatecatalog v0.6.0/go.mod h1:i/fbkZR0hLN29eEWiiwue8Pb+GforiEIBnV9yrRUOKI= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4= +cloud.google.com/go/recaptchaenterprise/v2 v2.1.0/go.mod h1:w9yVqajwroDNTfGuhmOjPDN//rZGySaf6PtFVcSCa7o= +cloud.google.com/go/recaptchaenterprise/v2 v2.2.0/go.mod h1:/Zu5jisWGeERrd5HnlS3EUGb/D335f9k51B/FVil0jk= +cloud.google.com/go/recaptchaenterprise/v2 v2.3.0/go.mod h1:O9LwGCjrhGHBQET5CA7dd5NwwNQUErSgEDit1DLNTdo= +cloud.google.com/go/recommendationengine v0.5.0/go.mod h1:E5756pJcVFeVgaQv3WNpImkFP8a+RptV6dDLGPILjvg= +cloud.google.com/go/recommendationengine v0.6.0/go.mod h1:08mq2umu9oIqc7tDy8sx+MNJdLG0fUi3vaSVbztHgJ4= +cloud.google.com/go/recommender v1.5.0/go.mod h1:jdoeiBIVrJe9gQjwd759ecLJbxCDED4A6p+mqoqDvTg= +cloud.google.com/go/recommender v1.6.0/go.mod h1:+yETpm25mcoiECKh9DEScGzIRyDKpZ0cEhWGo+8bo+c= +cloud.google.com/go/redis v1.7.0/go.mod h1:V3x5Jq1jzUcg+UNsRvdmsfuFnit1cfe3Z/PGyq/lm4Y= +cloud.google.com/go/redis v1.8.0/go.mod h1:Fm2szCDavWzBk2cDKxrkmWBqoCiL1+Ctwq7EyqBCA/A= +cloud.google.com/go/retail v1.8.0/go.mod h1:QblKS8waDmNUhghY2TI9O3JLlFk8jybHeV4BF19FrE4= +cloud.google.com/go/retail v1.9.0/go.mod h1:g6jb6mKuCS1QKnH/dpu7isX253absFl6iE92nHwlBUY= +cloud.google.com/go/scheduler v1.4.0/go.mod h1:drcJBmxF3aqZJRhmkHQ9b3uSSpQoltBPGPxGAWROx6s= +cloud.google.com/go/scheduler v1.5.0/go.mod h1:ri073ym49NW3AfT6DZi21vLZrG07GXr5p3H1KxN5QlI= +cloud.google.com/go/secretmanager v1.6.0/go.mod h1:awVa/OXF6IiyaU1wQ34inzQNc4ISIDIrId8qE5QGgKA= +cloud.google.com/go/security v1.5.0/go.mod h1:lgxGdyOKKjHL4YG3/YwIL2zLqMFCKs0UbQwgyZmfJl4= +cloud.google.com/go/security v1.7.0/go.mod h1:mZklORHl6Bg7CNnnjLH//0UlAlaXqiG7Lb9PsPXLfD0= +cloud.google.com/go/security v1.8.0/go.mod h1:hAQOwgmaHhztFhiQ41CjDODdWP0+AE1B3sX4OFlq+GU= +cloud.google.com/go/securitycenter v1.13.0/go.mod h1:cv5qNAqjY84FCN6Y9z28WlkKXyWsgLO832YiWwkCWcU= +cloud.google.com/go/securitycenter v1.14.0/go.mod h1:gZLAhtyKv85n52XYWt6RmeBdydyxfPeTrpToDPw4Auc= +cloud.google.com/go/servicedirectory v1.4.0/go.mod h1:gH1MUaZCgtP7qQiI+F+A+OpeKF/HQWgtAddhTbhL2bs= +cloud.google.com/go/servicedirectory v1.5.0/go.mod h1:QMKFL0NUySbpZJ1UZs3oFAmdvVxhhxB6eJ/Vlp73dfg= +cloud.google.com/go/speech v1.6.0/go.mod h1:79tcr4FHCimOp56lwC01xnt/WPJZc4v3gzyT7FoBkCM= +cloud.google.com/go/speech v1.7.0/go.mod h1:KptqL+BAQIhMsj1kOP2la5DSEEerPDuOP/2mmkhHhZQ= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= -cloud.google.com/go/storage v1.27.0 h1:YOO045NZI9RKfCj1c5A/ZtuuENUc8OAW+gHdGnDgyMQ= +cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= +cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc= cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= -cosmossdk.io/api v0.2.6 h1:AoNwaLLapcLsphhMK6+o0kZl+D6MMUaHVqSdwinASGU= -cosmossdk.io/api v0.2.6/go.mod h1:u/d+GAxil0nWpl1XnQL8nkziQDIWuBDhv8VnDm/s6dI= -cosmossdk.io/core v0.3.2 h1:KlQIufpJHJvOs7YLGTZsZcCo1WlkencDXepsr8STKZQ= -cosmossdk.io/core v0.3.2/go.mod h1:CO7vbe+evrBvHc0setFHL/u7nlY7HJGzdRSBkT/sirc= +cloud.google.com/go/storage v1.29.0 h1:6weCgzRvMg7lzuUurI4697AqIRPU1SvzHhynwpW31jI= +cloud.google.com/go/storage v1.29.0/go.mod h1:4puEjyTKnku6gfKoTfNOU/W+a9JyuVNxjpS5GBrB8h4= +cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw= +cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g= +cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU= +cloud.google.com/go/videointelligence v1.7.0/go.mod h1:k8pI/1wAhjznARtVT9U1llUaFNPh7muw8QyOUpavru4= +cloud.google.com/go/vision v1.2.0/go.mod h1:SmNwgObm5DpFBme2xpyOyasvBc1aPdjvMk2bBk0tKD0= +cloud.google.com/go/vision/v2 v2.2.0/go.mod h1:uCdV4PpN1S0jyCyq8sIM42v2Y6zOLkZs+4R9LrGYwFo= +cloud.google.com/go/vision/v2 v2.3.0/go.mod h1:UO61abBx9QRMFkNBbf1D8B1LXdS2cGiiCRx0vSpZoUo= +cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xXZmFiHmGE= +cloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg= +cloud.google.com/go/workflows v1.6.0/go.mod h1:6t9F5h/unJz41YqfBmqSASJSXccBLtD1Vwf+KmJENM0= +cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M= +cosmossdk.io/api v0.3.1 h1:NNiOclKRR0AOlO4KIqeaG6PS6kswOMhHD0ir0SscNXE= +cosmossdk.io/api v0.3.1/go.mod h1:DfHfMkiNA2Uhy8fj0JJlOCYOBp4eWUUJ1te5zBGNyIw= +cosmossdk.io/core v0.5.1 h1:vQVtFrIYOQJDV3f7rw4pjjVqc1id4+mE0L9hHP66pyI= +cosmossdk.io/core v0.5.1/go.mod h1:KZtwHCLjcFuo0nmDc24Xy6CRNEL9Vl/MeimQ2aC7NLE= cosmossdk.io/depinject v1.0.0-alpha.3 h1:6evFIgj//Y3w09bqOUOzEpFj5tsxBqdc5CfkO7z+zfw= cosmossdk.io/depinject v1.0.0-alpha.3/go.mod h1:eRbcdQ7MRpIPEM5YUJh8k97nxHpYbc3sMUnEtt8HPWU= cosmossdk.io/errors v1.0.0-beta.7 h1:gypHW76pTQGVnHKo6QBkb4yFOJjC+sUGRc5Al3Odj1w= cosmossdk.io/errors v1.0.0-beta.7/go.mod h1:mz6FQMJRku4bY7aqS/Gwfcmr/ue91roMEKAmDUDpBfE= -cosmossdk.io/math v1.0.0-beta.4 h1:JtKedVLGzA0vv84xjYmZ75RKG35Kf2WwcFu8IjRkIIw= -cosmossdk.io/math v1.0.0-beta.4/go.mod h1:An0MllWJY6PxibUpnwGk8jOm+a/qIxlKmL5Zyp9NnaM= -cosmossdk.io/tools/rosetta v0.2.0 h1:Ae499UiZ9yPNCXvjOBO/R9I1pksCJfxoqWauEZgA/gs= -cosmossdk.io/tools/rosetta v0.2.0/go.mod h1:3mn8QuE2wLUdTi77/gbDXdFqXZdBdiBJhgAWUTSXPv8= +cosmossdk.io/math v1.0.0-beta.6.0.20230216172121-959ce49135e4 h1:/jnzJ9zFsL7qkV8LCQ1JH3dYHh2EsKZ3k8Mr6AqqiOA= +cosmossdk.io/math v1.0.0-beta.6.0.20230216172121-959ce49135e4/go.mod h1:gUVtWwIzfSXqcOT+lBVz2jyjfua8DoBdzRsIyaUAT/8= +cosmossdk.io/tools/rosetta v0.2.1 h1:ddOMatOH+pbxWbrGJKRAawdBkPYLfKXutK9IETnjYxw= +cosmossdk.io/tools/rosetta v0.2.1/go.mod h1:Pqdc1FdvkNV3LcNIkYWt2RQY6IP1ge6YWZk8MhhO9Hw= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -filippo.io/edwards25519 v1.0.0-rc.1 h1:m0VOOB23frXZvAOK44usCgLWvtsxIoMCTBGJZlpmGfU= -filippo.io/edwards25519 v1.0.0-rc.1/go.mod h1:N1IkdkCkiLB6tki+MYJoSx2JTY9NUlxZE7eHn5EwJns= +filippo.io/edwards25519 v1.0.0 h1:0wAIcmJUqRdI8IJ/3eGi5/HwXZWPujYXXlkrQogz0Ek= +filippo.io/edwards25519 v1.0.0/go.mod h1:N1IkdkCkiLB6tki+MYJoSx2JTY9NUlxZE7eHn5EwJns= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= @@ -99,13 +241,13 @@ github.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+ github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= -github.com/aws/aws-sdk-go v1.15.78/go.mod h1:E3/ieXAlvM0XWO57iftYVDLLvQ824smPP3ATZkfNZeM= github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.40.45 h1:QN1nsY27ssD/JmW4s83qmSb+uL6DG4GmCDzjmJB4xUI= -github.com/aws/aws-sdk-go v1.40.45/go.mod h1:585smgzpB/KqRA+K3y/NL/oYRqQvpNJYvLm+LY1U59Q= +github.com/aws/aws-sdk-go v1.44.122/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= +github.com/aws/aws-sdk-go v1.44.203 h1:pcsP805b9acL3wUqa4JR2vg1k2wnItkDYNvfmcy6F+U= +github.com/aws/aws-sdk-go v1.44.203/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= -github.com/babylonchain/ibc-go/v7 v7.0.0-20230222123128-9fc81e93ac35 h1:RzddJDVLAmhKK4BXAOMDgms0bkG+l+HkWWDgsxFIP4k= -github.com/babylonchain/ibc-go/v7 v7.0.0-20230222123128-9fc81e93ac35/go.mod h1:cD4Mltu+wH/FRXKaUP3tf0K/CzVoBp9e0r4x8OLUuSo= +github.com/babylonchain/ibc-go/v7 v7.0.0-20230308120348-6dd688ac57a6 h1:0A0nig5Xm4Yjh8RjswgtMQzEW66qsxrKtvPiSiBRcnw= +github.com/babylonchain/ibc-go/v7 v7.0.0-20230308120348-6dd688ac57a6/go.mod h1:wpKGb+lqAnxwThgS3LoCPgDEFNAPVX+1YIQCAJcePcM= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= @@ -153,16 +295,19 @@ github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= -github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= +github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/checkpoint-restore/go-criu/v5 v5.3.0/go.mod h1:E/eQpaFtUKGOOSEBZgmKAcn+zUUwWxqcaKZlF54wK8E= github.com/cheggaaa/pb v1.0.27/go.mod h1:pQciLPpbU0oxA0h+VJYYLxO+XeDQb5pZijXscXHm81s= -github.com/chzyer/logex v1.1.10 h1:Swpa1K6QvQznwJRcfTfQJmTE72DqScAa40E+fbHEXEE= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e h1:fY5BOSpyZCqRo5OhCuC+XN+r/bBCmeuuJtjz+bCNIf8= +github.com/chzyer/logex v1.2.1 h1:XHDu3E6q+gdHgsdTPH6ImJMIp436vR6MPtH8gP05QzM= +github.com/chzyer/logex v1.2.1/go.mod h1:JLbx6lG2kDbNRFnfkgvh4eRJRPX1QCoOIWomwysCBrQ= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1 h1:q763qf9huN11kDQavWsoZXJNW3xEE4JJyHa5Q25/sd8= +github.com/chzyer/readline v1.5.1 h1:upd/6fQk4src78LMRzh5vItIt361/o4uq553V8B5sGI= +github.com/chzyer/readline v1.5.1/go.mod h1:Eh+b79XXUwfKfcPLepksvw2tcLE/Ct21YObkaSkeBlk= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/chzyer/test v1.0.0 h1:p3BQDXSxOhOG0P9z6/hGnII4LGiEPOYBhs8asl/fC04= +github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38GC8= github.com/cilium/ebpf v0.7.0/go.mod h1:/oI2+1shJiTGAMgl6/RgJr36Eo1jzrRcAWbcXO2usCA= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= @@ -172,6 +317,7 @@ github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGX github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= @@ -181,6 +327,12 @@ github.com/cockroachdb/apd/v2 v2.0.2/go.mod h1:DDxRlzC2lo3/vSlmSoS7JkqbbrARPuFOG github.com/cockroachdb/apd/v3 v3.1.0 h1:MK3Ow7LH0W8zkd5GMKA1PvS9qG3bWFI95WaVNfyZJ/w= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= +github.com/coinbase/rosetta-sdk-go/types v1.0.0 h1:jpVIwLcPoOeCR6o1tU+Xv7r5bMONNbHU7MuEHboiFuA= +github.com/coinbase/rosetta-sdk-go/types v1.0.0/go.mod h1:eq7W2TMRH22GTW0N0beDnN931DW0/WOI1R2sdHNHG4c= +github.com/cometbft/cometbft v0.37.0 h1:M005vBaSaugvYYmNZwJOopynQSjwLoDTwflnQ/I/eYk= +github.com/cometbft/cometbft v0.37.0/go.mod h1:Y2MMMN//O5K4YKd8ze4r9jmk4Y7h0ajqILXbH5JQFVs= +github.com/cometbft/cometbft-db v0.7.0 h1:uBjbrBx4QzU0zOEnU8KxoDl18dMNgDh+zZRUE0ucsbo= +github.com/cometbft/cometbft-db v0.7.0/go.mod h1:yiKJIm2WKrt6x8Cyxtq9YTEcIMPcEe4XPxhgX59Fzf0= github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= github.com/containerd/continuity v0.3.0 h1:nisirsYROK15TAMVukJOUyGJjz4BNQJBVsNvAXZJ/eg= github.com/containerd/continuity v0.3.0/go.mod h1:wJEAIwKOm/pBZuBd0JmeTvnLquTB1Ag8espWhkykbPM= @@ -189,14 +341,13 @@ github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8Nz github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/coreos/go-systemd/v22 v22.3.3-0.20220203105225-a9a7ef127534/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cosmos/btcutil v1.0.5 h1:t+ZFcX77LpKtDBhjucvnOH8C2l2ioGsBNEQ3jef8xFk= github.com/cosmos/btcutil v1.0.5/go.mod h1:IyB7iuqZMJlthe2tkIFL33xPyzbFYP0XVdS8P5lUPis= -github.com/cosmos/cosmos-proto v1.0.0-beta.1 h1:iDL5qh++NoXxG8hSy93FdYJut4XfgbShIocllGaXx/0= -github.com/cosmos/cosmos-proto v1.0.0-beta.1/go.mod h1:8k2GNZghi5sDRFw/scPL8gMSowT1vDA+5ouxL8GjaUE= -github.com/cosmos/cosmos-sdk v0.47.0-rc2 h1:BwQC41zQXG/pN9DdLaWzYJrC911St5lYOQIoW4Hf5wQ= -github.com/cosmos/cosmos-sdk v0.47.0-rc2/go.mod h1:e0ZEpY/nhVoXAkijdHPdFOJNOXCddfvyFrFLp2QmCCY= +github.com/cosmos/cosmos-proto v1.0.0-beta.2 h1:X3OKvWgK9Gsejo0F1qs5l8Qn6xJV/AzgIWR2wZ8Nua8= +github.com/cosmos/cosmos-proto v1.0.0-beta.2/go.mod h1:+XRCLJ14pr5HFEHIUcn51IKXD1Fy3rkEQqt4WqmN4V0= +github.com/cosmos/cosmos-sdk v0.47.0-rc3 h1:MMun/+mMpzise9d85csTp+kGkhLCkjJLwLK0urp0Bcs= +github.com/cosmos/cosmos-sdk v0.47.0-rc3/go.mod h1:GlXjIIIsIZAD5CPqm7FHtr3v5/anE9eXWDjSWdNmznw= github.com/cosmos/cosmos-sdk/ics23/go v0.8.0 h1:iKclrn3YEOwk4jQHT2ulgzuXyxmzmPczUalMwW4XH9k= github.com/cosmos/cosmos-sdk/ics23/go v0.8.0/go.mod h1:2a4dBq88TUoqoWAU5eu0lGvpFP3wWDPgdHPargtyw30= github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d/go.mod h1:tSxLoYXyBmiFeKpvmq4dzayMdCjCnu8uqmCysIGBT2Y= @@ -205,25 +356,23 @@ github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4x github.com/cosmos/gogogateway v1.2.0 h1:Ae/OivNhp8DqBi/sh2A8a1D0y638GpL3tkmLQAiKxTE= github.com/cosmos/gogogateway v1.2.0/go.mod h1:iQpLkGWxYcnCdz5iAdLcRBSw3h7NXeOkZ4GUkT+tbFI= github.com/cosmos/gogoproto v1.4.2/go.mod h1:cLxOsn1ljAHSV527CHOtaIP91kK6cCrZETRBrkzItWU= -github.com/cosmos/gogoproto v1.4.4 h1:nVAsgLlAf5jeN0fV7hRlkZvf768zU+dy4pG+hxc2P34= -github.com/cosmos/gogoproto v1.4.4/go.mod h1:/yl6/nLwsZcZ2JY3OrqjRqvqCG9InUMcXRfRjQiF9DU= -github.com/cosmos/gorocksdb v1.2.0 h1:d0l3jJG8M4hBouIZq0mDUHZ+zjOx044J3nGRskwTb4Y= -github.com/cosmos/gorocksdb v1.2.0/go.mod h1:aaKvKItm514hKfNJpUJXnnOWeBnk2GL4+Qw9NHizILw= -github.com/cosmos/iavl v0.19.5-rc.1 h1:4PjF2PdScyPbN1WbXpiQU21YtyonnrMU31xN74g8Rkg= -github.com/cosmos/iavl v0.19.5-rc.1/go.mod h1:X9PKD3J0iFxdmgNLa7b2LYWdsGd90ToV5cAONApkEPw= +github.com/cosmos/gogoproto v1.4.6 h1:Ee7z15dWJaGlgM2rWrK8N2IX7PQcuccu8oG68jp5RL4= +github.com/cosmos/gogoproto v1.4.6/go.mod h1:VS/ASYmPgv6zkPKLjR9EB91lwbLHOzaGCirmKKhncfI= +github.com/cosmos/iavl v0.20.0-alpha4 h1:49SZoxNwah5nqbVE1da8BAhenC7HMSVOTZ0XKVhZpOE= +github.com/cosmos/iavl v0.20.0-alpha4/go.mod h1:WO7FyvaZJoH65+HFOsDir7xU9FWk2w9cHXNW1XHcl7A= github.com/cosmos/ics23/go v0.9.1-0.20221207100636-b1abd8678aab h1:I9ialKTQo7248V827Bba4OuKPmk+FPzmTVHsLXaIJWw= github.com/cosmos/ics23/go v0.9.1-0.20221207100636-b1abd8678aab/go.mod h1:2CwqasX5dSD7Hbp/9b6lhK6BwoBDCBldx7gPKRukR60= github.com/cosmos/keyring v1.1.7-0.20210622111912-ef00f8ac3d76 h1:DdzS1m6o/pCqeZ8VOAit/gyATedRgjvkVI+UCrLpyuU= github.com/cosmos/keyring v1.1.7-0.20210622111912-ef00f8ac3d76/go.mod h1:0mkLWIoZuQ7uBoospo5Q9zIpqq6rYCPJDSUdeCJvPM8= github.com/cosmos/ledger-cosmos-go v0.12.1 h1:sMBxza5p/rNK/06nBSNmsI/WDqI0pVJFVNihy1Y984w= github.com/cosmos/ledger-cosmos-go v0.12.1/go.mod h1:dhO6kj+Y+AHIOgAe4L9HL/6NDdyyth4q238I9yFpD2g= -github.com/cosmos/rosetta-sdk-go v0.9.0 h1:3mj2naR+GUhUXabtb96WWSsPFZDCYkdtp6r0jffgugg= -github.com/cosmos/rosetta-sdk-go v0.9.0/go.mod h1:2v41yXL25xxAXrczVSnbDHcQH9CgildruDlGQGKW/JU= +github.com/cosmos/rosetta-sdk-go v0.10.0 h1:E5RhTruuoA7KTIXUcMicL76cffyeoyvNybzUGSKFTcM= +github.com/cosmos/rosetta-sdk-go v0.10.0/go.mod h1:SImAZkb96YbwvoRkzSMQB6noNJXFgWl/ENIznEoYQI4= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/creachadair/taskgroup v0.3.2 h1:zlfutDS+5XG40AOxcHDSThxKzns8Tnr9jnr6VqkYlkM= -github.com/creachadair/taskgroup v0.3.2/go.mod h1:wieWwecHVzsidg2CsUnFinW1faVN4+kq+TDlRJQ0Wbk= +github.com/creachadair/taskgroup v0.4.2 h1:jsBLdAJE42asreGss2xZGZ8fJra7WtwnHWeJFxv2Li8= +github.com/creachadair/taskgroup v0.4.2/go.mod h1:qiXUOSrbwAY3u0JPGTzObbE3yf9hcXHDKBZ2ZjpCbgM= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.11 h1:07n33Z8lZxZ2qwegKbObQohDhXDQxiMMz1NOUGYlesw= github.com/cucumber/common/gherkin/go/v22 v22.0.0 h1:4K8NqptbvdOrjL9DEea6HFjSpbdT9+Q5kgLpmmsHYl0= @@ -264,8 +413,8 @@ github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4 github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac h1:opbrjaN/L8gg6Xh5D04Tem+8xVcz6ajZlGCs49mQgyg= -github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/dvsekhvalnov/jose2go v0.0.0-20200901110807-248326c1351b/go.mod h1:7BvyPhdbLxMXIYTFPLsyJRFMsKmOZnQmzh6Gb+uquuM= github.com/dvsekhvalnov/jose2go v1.5.0 h1:3j8ya4Z4kMCwT5nXIKFSV84YS+HdqSSO0VsTQxaLAeM= github.com/dvsekhvalnov/jose2go v1.5.0/go.mod h1:QsHjhyTlD/lAVqn/NSbVZmSCGeDehTB/mPZadG+mhXU= @@ -279,6 +428,8 @@ github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.m github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= @@ -311,22 +462,20 @@ github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2 github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= github.com/go-kit/kit v0.12.0 h1:e4o3o3IsBfAKQh5Qbbiqyfu97Ku7jrO/JbohvztANh4= github.com/go-kit/kit v0.12.0/go.mod h1:lHd+EkCZPIwYItmGDDRdhinkzX2A1sj+M9biaEaizzs= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU= github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-logfmt/logfmt v0.5.1 h1:otpy5pqBCBZ1ng9RQ0dPu4PN7ba75Y/aA+UpowDyNVA= -github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= +github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= +github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q= github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no= github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= -github.com/go-playground/validator/v10 v10.4.1 h1:pH2c5ADXtd66mxoE0Zm9SUhxE20r7aM3F26W0hOn+GE= github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= +github.com/go-playground/validator/v10 v10.11.1 h1:prmOlTVv+YjZjmRmNSF3VmspqJIxJWXmqUsHwfTRRkQ= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= @@ -341,10 +490,10 @@ github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2/go.mod h1:bBOAhwG1umN6 github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godbus/dbus/v5 v5.0.6/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/uuid v4.3.0+incompatible h1:CaSVZxm5B+7o45rtab4jC2G37WGYX1zQfuU2i6DSvnc= -github.com/gofrs/uuid v4.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= -github.com/gogo/googleapis v1.4.1-0.20201022092350-68b0159b7869 h1:kRpU4zq+Pzh4feET49aEWPOzwQy3U2SsbZEQ7QEcif0= github.com/gogo/googleapis v1.4.1-0.20201022092350-68b0159b7869/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= +github.com/gogo/googleapis v1.4.1 h1:1Yx4Myt7BxzvUr5ldGSbwYiZG6t9wGBZ+8/fX3Wvtq0= +github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= @@ -367,6 +516,7 @@ github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -385,6 +535,7 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= @@ -407,6 +558,8 @@ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= +github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= @@ -416,7 +569,8 @@ github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPg github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.2.1 h1:d8MncMlErDFTwQGBK1xhv026j9kqhvw1Qv9IbWT1VLQ= +github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/martian/v3 v3.3.2 h1:IqNFLAmvJOgVlpdEBiQbDc2EwKW77amAycfTuWKdfvw= github.com/google/orderedcode v0.0.1 h1:UzfcAexk9Vhv8+9pNOgRu41f16lHq725vPwnSeiG/Us= github.com/google/orderedcode v0.0.1/go.mod h1:iVyU4/qPKHY5h/wSd6rZZCDcLJNxiWO6dvsYES2Sb20= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= @@ -429,6 +583,11 @@ github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= @@ -436,12 +595,23 @@ github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+ github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.2.1 h1:RY7tHKZcRlk788d5WSo/e83gOyyy742E8GSs771ySpg= -github.com/googleapis/enterprise-certificate-proxy v0.2.1/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= +github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= +github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= +github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= +github.com/googleapis/enterprise-certificate-proxy v0.2.3 h1:yk9/cqRKtT9wXZSsRH9aurXEpJX+U6FLtpYTdC3R06k= +github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= +github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= +github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= +github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= +github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= +github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= +github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= github.com/googleapis/gax-go/v2 v2.7.0 h1:IcsPKeInNvYi7eqSaDjiZqDDKu5rsmunY0Y1YupQSSQ= github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= +github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= @@ -477,8 +647,8 @@ github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtng github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hashicorp/go-getter v1.6.2 h1:7jX7xcB+uVCliddZgeKyNxv0xoT7qL5KDtH7rU4IqIk= -github.com/hashicorp/go-getter v1.6.2/go.mod h1:IZCrswsZPeWv9IkVnLElzRU/gz/QPi6pZHn4tv6vbwA= +github.com/hashicorp/go-getter v1.7.0 h1:bzrYP+qu/gMrL1au7/aDvkoOVGUJpeKBgbqRHACAFDY= +github.com/hashicorp/go-getter v1.7.0/go.mod h1:W7TalhMmbPmsSMdNjD0ZskARur/9GJ17cfHTRtXV744= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= @@ -493,7 +663,6 @@ github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdv github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.1 h1:fv1ep09latC32wFoVwnqcnKJGnMSdBanPczbHAYm1BE= github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-version v1.1.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek= github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= @@ -508,8 +677,8 @@ github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hdevalence/ed25519consensus v0.0.0-20220222234857-c00d1f31bab3 h1:aSVUgRRRtOrZOC1fYmY9gV0e9z/Iu+xNVSASWjsuyGU= -github.com/hdevalence/ed25519consensus v0.0.0-20220222234857-c00d1f31bab3/go.mod h1:5PC6ZNPde8bBqU/ewGZig35+UIZtw9Ytxez8/q5ZyFE= +github.com/hdevalence/ed25519consensus v0.1.0 h1:jtBwzzcHuTmFrQN6xQZn6CQEO/V9f7HsjsjeEZ6auqU= +github.com/hdevalence/ed25519consensus v0.1.0/go.mod h1:w3BHWjwJbFU29IRHL1Iqkw3sus+7FctEyM4RqDxYNzo= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huandu/go-assert v1.1.5 h1:fjemmA7sSfYHJD7CUqs9qTwwfdNAx7/j2/ZlHXzNB3c= github.com/huandu/go-assert v1.1.5/go.mod h1:yOLvuqZwmcHIC5rIzrBhT7D3Q9c3GFnd0JrPVhn/06U= @@ -523,15 +692,15 @@ github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK github.com/improbable-eng/grpc-web v0.15.0 h1:BN+7z6uNXZ1tQGcNAuaU1YjsLTApzkjt2tzCixLaUPQ= github.com/improbable-eng/grpc-web v0.15.0/go.mod h1:1sy9HKV4Jt9aEs9JSnkWlRJPuPtwNr0l57L4f878wP8= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/inconshreveable/mousetrap v1.0.1 h1:U3uMjPSQEBMNp1lFxmllqCPM6P5u/Xq7Pgzkat/bFNc= github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jhump/protoreflect v1.12.1-0.20220721211354-060cc04fc18b h1:izTof8BKh/nE1wrKOrloNA5q4odOarjf+Xpe+4qow98= github.com/jinzhu/copier v0.3.5 h1:GlvfUwHk62RokgqVNvYsku0TATCF7bAHVwEXoBh3iJg= github.com/jinzhu/copier v0.3.5/go.mod h1:DfbEm0FYsaqBcKcFuvmOZb218JkPGtvSHsKg8S8hyyg= -github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= @@ -547,7 +716,6 @@ github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/u github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= @@ -563,18 +731,18 @@ github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.11.2/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= -github.com/klauspost/compress v1.15.12 h1:YClS/PImqYbn+UILDnqxQCZ3RehC9N318SU3kElDUEM= -github.com/klauspost/compress v1.15.12/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= +github.com/klauspost/compress v1.15.11/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= +github.com/klauspost/compress v1.15.15 h1:EF27CXIuDsYJ6mmvtBRlEuB2UVOqHG1tAXgZ7yIO+lw= +github.com/klauspost/compress v1.15.15/go.mod h1:ZcK2JAFqKOpnBlxcLsJzYfrS9X1akm9fHZNnD9+Vo/4= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -593,20 +761,16 @@ github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3v github.com/manifoldco/promptui v0.9.0 h1:3V4HzJk1TtXW1MTZMP7mdlwbBpIinw3HztaIlYthEiA= github.com/manifoldco/promptui v0.9.0/go.mod h1:ka04sppxSGFAtxX0qhlYQjISsg9mR4GWtQEhdbn6Pgg= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= -github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= +github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= +github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/mimoo/StrobeGo v0.0.0-20181016162300-f8f6d4d2b643/go.mod h1:43+3pMjjKimDBf5Kr4ZFNGbLql1zKkbImw+fZbw3geM= github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0 h1:QRUSJEgZn2Snx0EmT/QLXibWjSUDjKWvXIT19NBVp94= @@ -617,8 +781,9 @@ github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceT github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v1.0.0 h1:fzU/JVNcaqHQEcVFAKeR41fkiLdIPrefOvVG1VZ96U0= github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/go-testing-interface v1.14.1 h1:jrgshOhYAUVNMAJiKbEu7EqAwgJJ2JqpQmpLJOu07cU= +github.com/mitchellh/go-testing-interface v1.14.1/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8= github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= @@ -650,8 +815,8 @@ github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxzi github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= @@ -694,8 +859,9 @@ github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/9 github.com/pelletier/go-toml/v2 v2.0.6 h1:nrzqCb7j9cDFj2coyLNLaZuJTLjWjlaz6nvTvIwycIU= github.com/pelletier/go-toml/v2 v2.0.6/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek= github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= -github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5 h1:q2e307iGHPdTGp0hoxKjt1H5pDo6utceo3dQVK3I5XQ= github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5/go.mod h1:jvVRKCrJTQWu0XVbaOlby/2lO20uSCHEMzzplHXte1o= +github.com/petermattis/goid v0.0.0-20221215004737-a150e88a970d h1:htwtWgtQo8YS6JFWWi2DNgY0RwSGJ1ruMoxY6CUUclk= +github.com/petermattis/goid v0.0.0-20221215004737-a150e88a970d/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4= github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -713,8 +879,6 @@ github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5Fsn github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw= github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= @@ -731,20 +895,16 @@ github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt2 github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= -github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.37.0 h1:ccBbHCgIiT9uSoFY0vX8H3zsNR5eLt17/RQLUvn8pXE= -github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= +github.com/prometheus/common v0.40.0 h1:Afz7EVRqGg2Mqqf4JuF9vdvp1pi220m55Pi9T2JnO4Q= +github.com/prometheus/common v0.40.0/go.mod h1:L65ZJPSmfn/UBWLQIHV7dBrKFidB/wPlF1y5TlSt9OE= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.3.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo= -github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= +github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI= +github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY= github.com/rakyll/statik v0.1.7 h1:OF3QCZUuyPxuGEP7B4ypUa7sB/iHtqOTDYZXGM8KOdQ= github.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= @@ -754,13 +914,10 @@ github.com/regen-network/gocuke v0.6.2 h1:pHviZ0kKAq2U2hN2q3smKNxct6hS0mGByFMHGn github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.8.1 h1:geMPLpDpQOgVyCg5z5GoRwLHepNdb71NXb67XFkP+Eg= +github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= -github.com/rs/cors v1.8.2 h1:KCooALfAYGs415Cwu5ABvv9n9509fSiG5SQJn/AQo4U= -github.com/rs/cors v1.8.2/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= -github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -github.com/rs/zerolog v1.28.0 h1:MirSo27VyNi7RJYP3078AA1+Cyzd2GB66qy3aUHvsWY= -github.com/rs/zerolog v1.28.0/go.mod h1:NILgTygv/Uej1ra5XxGf82ZFSLk58MFGAUS2o6usyD0= +github.com/rs/cors v1.8.3 h1:O+qNyWn7Z+F9M0ILBHgMVPuB1xTOucVd5gtaYyXBpRo= +github.com/rs/cors v1.8.3/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= @@ -822,8 +979,9 @@ github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= +github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= github.com/supranational/blst v0.3.8 h1:glwLF4oBRSJOTr05lRBgNwGQST0ndP2wg29fSeTRKCY= @@ -831,14 +989,12 @@ github.com/supranational/blst v0.3.8/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/ github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= +github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c h1:g+WoO5jjkqGAzHWCjJB1zZfXPIAaDpzXIEJ0eS6B5Ok= +github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c/go.mod h1:ahpPrc7HpcfEWDQRZEmnXMzHY03mLDYMCxeDzy46i+8= github.com/tendermint/go-amino v0.16.0 h1:GyhmgQKvqF82e2oZeuMSp9JTN0N09emoSZlb2lyGa2E= github.com/tendermint/go-amino v0.16.0/go.mod h1:TQU0M1i/ImAo+tYpZi73AU3V/dKeCoMC9Sphe2ZwGME= -github.com/tendermint/tendermint v0.37.0-rc2 h1:2n1em+jfbhSv6QnBj8F6KHCpbIzZCB8KgcjidJUQNlY= -github.com/tendermint/tendermint v0.37.0-rc2/go.mod h1:uYQO9DRNPeZROa9X3hJOZpYcVREDC2/HST+EiU5g2+A= -github.com/tendermint/tm-db v0.6.7 h1:fE00Cbl0jayAoqlExN6oyQJ7fR/ZtoVOmvPJ//+shu8= -github.com/tendermint/tm-db v0.6.7/go.mod h1:byQDzFkZV1syXr/ReXS808NxA2xvyuuVgXOJ/088L6I= -github.com/tidwall/btree v1.5.2 h1:5eA83Gfki799V3d3bJo9sWk+yL2LRoTEah3O/SA6/8w= -github.com/tidwall/btree v1.5.2/go.mod h1:twD9XRA5jj9VUQGELzDO4HPQTNJsoWWfYEL+EUQ2cKY= +github.com/tidwall/btree v1.6.0 h1:LDZfKfQIBHGHWSwckhXI0RPSXzlo+KYdjK7FWSqOzzg= +github.com/tidwall/btree v1.6.0/go.mod h1:twD9XRA5jj9VUQGELzDO4HPQTNJsoWWfYEL+EUQ2cKY= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= @@ -846,8 +1002,9 @@ github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVM github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/ulikunitz/xz v0.5.8 h1:ERv8V6GKqVi23rgu5cj9pVfVzJbOqAY2Ntl88O6c2nQ= -github.com/ulikunitz/xz v0.5.8/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= +github.com/ulikunitz/xz v0.5.10/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= +github.com/ulikunitz/xz v0.5.11 h1:kpFauv27b6ynzBNT/Xy+1k+fK4WswhN/6PN5WhFAGw8= +github.com/ulikunitz/xz v0.5.11/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= @@ -866,10 +1023,11 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/zondax/hid v0.9.1 h1:gQe66rtmyZ8VeGFcOpbuH3r7erYtNEAezCAYu8LdkJo= github.com/zondax/hid v0.9.1/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM= -github.com/zondax/ledger-go v0.14.0 h1:dlMC7aO8Wss1CxBq2I96kZ69Nh1ligzbs8UWOtq/AsA= -github.com/zondax/ledger-go v0.14.0/go.mod h1:fZ3Dqg6qcdXWSOJFKMG8GCTnD7slO/RL2feOQv8K320= +github.com/zondax/ledger-go v0.14.1 h1:Pip65OOl4iJ84WTpA4BKChvOufMhhbxED3BaihoZN4c= +github.com/zondax/ledger-go v0.14.1/go.mod h1:fZ3Dqg6qcdXWSOJFKMG8GCTnD7slO/RL2feOQv8K320= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.6 h1:/ecaJf0sk1l4l6V4awd65v2C3ILy7MSj+s/x1ADCIMU= go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= @@ -882,6 +1040,7 @@ go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= +go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= @@ -906,9 +1065,10 @@ golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.5.0 h1:U/0M97KRkSFvyD/3FSmdP5W5swImpNgle/EHFhOsQPE= -golang.org/x/crypto v0.5.0/go.mod h1:NK/OQwhpMQP3MwtdjgLlYHnH9ebylxKWv3e0fK+mkQU= +golang.org/x/crypto v0.6.0 h1:qfktjS5LUO+fFKeJXZ+ikTRijMmljikvG68fpMMruSc= +golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -920,8 +1080,8 @@ golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= -golang.org/x/exp v0.0.0-20221019170559-20944726eadf h1:nFVjjKDgNY37+ZSYCJmtYf7tOlfQswHqplG2eosjOMg= -golang.org/x/exp v0.0.0-20221019170559-20944726eadf/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE= +golang.org/x/exp v0.0.0-20230213192124-5e25df0256eb h1:PaBZQdo+iSDyHT053FjUCgZQ/9uqVwPOcl7KSWhKn6w= +golang.org/x/exp v0.0.0-20230213192124-5e25df0256eb/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -935,6 +1095,7 @@ golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRu golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= @@ -946,8 +1107,9 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.7.0 h1:LapD9S96VoQRhi/GrNTqeBJFrUjs5UHCAtTlgwA5oZA= -golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -991,13 +1153,24 @@ golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -1009,10 +1182,24 @@ golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783 h1:nt+Q6cXKz4MosCSpnbMtqiQ8Oz0pxTef2B4Vca2lvfk= +golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= +golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= +golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.1.0/go.mod h1:G9FE4dLTsbXUu90h/Pf85g4w1D+SSAgR+q46nJZ8M4A= +golang.org/x/oauth2 v0.5.0 h1:HuArIo48skDwlrvM3sEdHXElYslAMsf3KwRkkW4MC4s= +golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1024,6 +1211,9 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1085,33 +1275,56 @@ golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210819135213-f52c844e1c1c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210906170528-6f6e22806c34/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220315194320-039c03cc5b86/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220517195934-5e4e11fc645e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0 h1:n2a8QNdAb0sZNpU9R1ALUXBbY+w51fCQDN+7EdxNBsY= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1123,6 +1336,7 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1186,12 +1400,20 @@ golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.4.0 h1:7mTAgkunk3fr4GAloyyCasadO6h9zSsQZbwvcaIciV4= -golang.org/x/tools v0.4.0/go.mod h1:UE5sM2OK9E/d67R0ANs2xJizIymRP5gJU295PvKXxjQ= +golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= @@ -1214,8 +1436,37 @@ google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz513 google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.107.0 h1:I2SlFjD8ZWabaIFOfeEDg3pf0BHJDh6iYQ1ic3Yu/UU= -google.golang.org/api v0.107.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= +google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= +google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= +google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= +google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= +google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= +google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= +google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= +google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= +google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= +google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= +google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= +google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= +google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= +google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= +google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= +google.golang.org/api v0.77.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= +google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= +google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg= +google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o= +google.golang.org/api v0.85.0/go.mod h1:AqZf8Ep9uZ2pyTvgL+x0D3Zt0eoT9b5E8fmzfu6FO2g= +google.golang.org/api v0.90.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= +google.golang.org/api v0.93.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= +google.golang.org/api v0.95.0/go.mod h1:eADj+UBuxkh5zlrSntJghuNeg8HwQ1w5lTKkuqaETEI= +google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= +google.golang.org/api v0.110.0 h1:l+rh0KYUooe9JGbGVx71tbFo4SMbMTXK3I3ia2QSEeU= +google.golang.org/api v0.110.0/go.mod h1:7FC4Vvx1Mooxh8C5HWjzZHcavuS2f6pmJpZx60ca7iI= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -1265,10 +1516,76 @@ google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210126160654-44e461bb6506/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= +google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= +google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= google.golang.org/genproto v0.0.0-20220314164441-57ef72a4c106/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= -google.golang.org/genproto v0.0.0-20221227171554-f9683d7f8bef h1:uQ2vjV/sHTsWSqdKeLqmwitzgvjMl7o4IdtHwUDXSJY= -google.golang.org/genproto v0.0.0-20221227171554-f9683d7f8bef/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= +google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220624142145-8cd45d7dbd1f/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220628213854-d9e0b6570c03/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220722212130-b98a9ff5e252/go.mod h1:GkXuJDJ6aQ7lnJcRF+SJVgFdQhypqgl3LB1C9vabdRE= +google.golang.org/genproto v0.0.0-20220801145646-83ce21fca29f/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc= +google.golang.org/genproto v0.0.0-20220815135757-37a418bb8959/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220817144833-d7fd3f11b9b1/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220829144015-23454907ede3/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220829175752-36a9c930ecbf/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220913154956-18f8339a66a5/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220914142337-ca0e39ece12f/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220915135415-7fd63a7952de/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220916172020-2692e8806bfa/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220919141832-68c03719ef51/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220920201722-2b89144ce006/go.mod h1:ht8XFiar2npT/g4vkk7O0WYS1sHOHbdujxbEp7CJWbw= +google.golang.org/genproto v0.0.0-20220926165614-551eb538f295/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= +google.golang.org/genproto v0.0.0-20220926220553-6981cbe3cfce/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= +google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqwhZAwq4wsRUaVG555sVgsNmIjRtO7t/JH29U= +google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= +google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= +google.golang.org/genproto v0.0.0-20221025140454-527a21cfbd71/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= +google.golang.org/genproto v0.0.0-20230216225411-c8e22ba71e44 h1:EfLuoKW5WfkgVdDy7dTK8qSbH37AX5mj/MFh+bGPz14= +google.golang.org/genproto v0.0.0-20230216225411-c8e22ba71e44/go.mod h1:8B0gmkoRebU8ukX6HP+4wrVQUY1+6PkQ44BSyIlflHA= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= @@ -1293,10 +1610,26 @@ google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= +google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.52.3 h1:pf7sOysg4LdgBqduXveGKrcEwbStiK2rtfghdzlUYDQ= -google.golang.org/grpc v1.52.3/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5vorUY= +google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc v1.53.0 h1:LAv2ds7cmFV/XTS3XG1NneeENYrXGmorPxsBbptIjNc= +google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -1310,9 +1643,10 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.28.2-0.20220831092852-f930b1dc76e8 h1:KR8+MyP7/qOlV+8Af01LtjL04bu7on42eVsxT4EyBQk= -google.golang.org/protobuf v1.28.2-0.20220831092852-f930b1dc76e8/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.28.2-0.20230208135220-49eaa78c6c9c h1:gDe3xeLH/W6iv5d9xQBo6IwJbCdVcZRiV8xuix6FJW8= +google.golang.org/protobuf v1.28.2-0.20230208135220-49eaa78c6c9c/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -1345,6 +1679,7 @@ gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools/v3 v3.4.0 h1:ZazjZUfuVeZGLAmlKKuyv3IKP5orXcwtOwDQH6YVr6o= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -1356,8 +1691,8 @@ honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9 honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= nhooyr.io/websocket v1.8.6 h1:s+C3xAMLwGmlI31Nyn/eAehUlZPwfYZu2JXM621Q5/k= nhooyr.io/websocket v1.8.6/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= -pgregory.net/rapid v0.5.3 h1:163N50IHFqr1phZens4FQOdPgfJscR7a562mjQqeo4M= -pgregory.net/rapid v0.5.3/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= +pgregory.net/rapid v0.5.5 h1:jkgx1TjbQPD/feRoK+S/mXw9e1uj6WilpHrXJowi6oA= +pgregory.net/rapid v0.5.5/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/privval/file.go b/privval/file.go index 4fe44893d..05183c218 100644 --- a/privval/file.go +++ b/privval/file.go @@ -8,21 +8,21 @@ import ( "github.com/cosmos/cosmos-sdk/crypto/codec" + tmcrypto "github.com/cometbft/cometbft/crypto" + "github.com/cometbft/cometbft/crypto/ed25519" + tmjson "github.com/cometbft/cometbft/libs/json" + tmos "github.com/cometbft/cometbft/libs/os" + "github.com/cometbft/cometbft/libs/tempfile" + "github.com/cometbft/cometbft/privval" + tmproto "github.com/cometbft/cometbft/proto/tendermint/types" + "github.com/cometbft/cometbft/types" sdk "github.com/cosmos/cosmos-sdk/types" - tmcrypto "github.com/tendermint/tendermint/crypto" - "github.com/tendermint/tendermint/crypto/ed25519" - tmjson "github.com/tendermint/tendermint/libs/json" - tmos "github.com/tendermint/tendermint/libs/os" - "github.com/tendermint/tendermint/libs/tempfile" - "github.com/tendermint/tendermint/privval" - tmproto "github.com/tendermint/tendermint/proto/tendermint/types" - "github.com/tendermint/tendermint/types" "github.com/babylonchain/babylon/crypto/bls12381" checkpointingtypes "github.com/babylonchain/babylon/x/checkpointing/types" ) -// copied from github.com/tendermint/tendermint/privval/file.go" +// copied from github.com/cometbft/cometbft/privval/file.go" // //nolint:unused const ( @@ -32,7 +32,7 @@ const ( stepPrecommit int8 = 3 ) -// copied from github.com/tendermint/tendermint/privval/file.go" +// copied from github.com/cometbft/cometbft/privval/file.go" // //nolint:unused func voteToStep(vote *tmproto.Vote) int8 { diff --git a/privval/types.go b/privval/types.go index 5ae88708c..ceb5334ef 100644 --- a/privval/types.go +++ b/privval/types.go @@ -3,7 +3,7 @@ package privval import ( "errors" - tmcrypto "github.com/tendermint/tendermint/crypto" + tmcrypto "github.com/cometbft/cometbft/crypto" "github.com/babylonchain/babylon/crypto/bls12381" "github.com/babylonchain/babylon/x/checkpointing/types" diff --git a/proto/babylon/epoching/v1/epoching.proto b/proto/babylon/epoching/v1/epoching.proto index 76309e388..8b660bd78 100644 --- a/proto/babylon/epoching/v1/epoching.proto +++ b/proto/babylon/epoching/v1/epoching.proto @@ -90,4 +90,4 @@ message Validator { bytes addr = 1; // power is the validator's voting power int64 power = 2; -} \ No newline at end of file +} diff --git a/proto/babylon/epoching/v1/events.proto b/proto/babylon/epoching/v1/events.proto index 6ca29a659..b3f275fba 100644 --- a/proto/babylon/epoching/v1/events.proto +++ b/proto/babylon/epoching/v1/events.proto @@ -17,7 +17,7 @@ message EventHandleQueuedMsg { bytes msg_id = 5; repeated bytes original_attributes = 6 [ (gogoproto.customtype) = - "github.com/tendermint/tendermint/abci/types.EventAttribute" ]; + "github.com/cometbft/cometbft/abci/types.EventAttribute" ]; string error = 7; } diff --git a/proto/buf.lock b/proto/buf.lock index 044437664..a279b8358 100644 --- a/proto/buf.lock +++ b/proto/buf.lock @@ -8,7 +8,7 @@ deps: - remote: buf.build owner: cosmos repository: cosmos-sdk - commit: 8cb30a2c4de74dc9bd8d260b1e75e176 + commit: 2aa7ff2b23df473a85b7a7fe1884105d - remote: buf.build owner: cosmos repository: gogo-proto diff --git a/proto/buf.yaml b/proto/buf.yaml index 92349ddcc..5788886cf 100644 --- a/proto/buf.yaml +++ b/proto/buf.yaml @@ -3,7 +3,7 @@ name: buf.build/babylon/babylond deps: # TODO: update sdk buf dependency when v0.47.0 is tagged and pushed to BSR # see: (https://github.com/cosmos/cosmos-sdk/tree/main/proto#sdk-x-buf) - - buf.build/cosmos/cosmos-sdk:8cb30a2c4de74dc9bd8d260b1e75e176 + - buf.build/cosmos/cosmos-sdk:2aa7ff2b23df473a85b7a7fe1884105d - buf.build/cosmos/cosmos-proto:1935555c206d4afb9e94615dfd0fad31 - buf.build/cosmos/gogo-proto:a14993478f40695898ed8a86931094b6656e8a5d - buf.build/googleapis/googleapis:8d7204855ec14631a499bd7393ce1970 diff --git a/simapp/sim_bench_test.go b/simapp/sim_bench_test.go index da83006b6..bc15e1328 100644 --- a/simapp/sim_bench_test.go +++ b/simapp/sim_bench_test.go @@ -5,10 +5,10 @@ import ( "os" "testing" + tmproto "github.com/cometbft/cometbft/proto/tendermint/types" "github.com/cosmos/cosmos-sdk/testutil/sims" simtypes "github.com/cosmos/cosmos-sdk/types/simulation" "github.com/cosmos/cosmos-sdk/x/simulation" - tmproto "github.com/tendermint/tendermint/proto/tendermint/types" "github.com/babylonchain/babylon/app" ) diff --git a/simapp/sim_test.go b/simapp/sim_test.go index e1a5a00a7..4d612e684 100644 --- a/simapp/sim_test.go +++ b/simapp/sim_test.go @@ -8,16 +8,17 @@ import ( "testing" simappparams "github.com/babylonchain/babylon/app/params" + dbm "github.com/cometbft/cometbft-db" + "github.com/cometbft/cometbft/libs/log" + tmproto "github.com/cometbft/cometbft/proto/tendermint/types" "github.com/stretchr/testify/require" - "github.com/tendermint/tendermint/libs/log" - tmproto "github.com/tendermint/tendermint/proto/tendermint/types" - dbm "github.com/tendermint/tm-db" storetypes "github.com/cosmos/cosmos-sdk/store/types" "github.com/cosmos/cosmos-sdk/testutil/sims" "github.com/babylonchain/babylon/app" + abci "github.com/cometbft/cometbft/abci/types" "github.com/cosmos/cosmos-sdk/baseapp" "github.com/cosmos/cosmos-sdk/store" sdk "github.com/cosmos/cosmos-sdk/types" @@ -34,7 +35,6 @@ import ( "github.com/cosmos/cosmos-sdk/x/simulation" slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - abci "github.com/tendermint/tendermint/abci/types" btccheckpointtypes "github.com/babylonchain/babylon/x/btccheckpoint/types" btclightclienttypes "github.com/babylonchain/babylon/x/btclightclient/types" diff --git a/simapp/state.go b/simapp/state.go index ff47c4d87..dec564272 100644 --- a/simapp/state.go +++ b/simapp/state.go @@ -11,8 +11,8 @@ import ( sdkmath "cosmossdk.io/math" simappparams "github.com/babylonchain/babylon/app/params" - tmjson "github.com/tendermint/tendermint/libs/json" - tmtypes "github.com/tendermint/tendermint/types" + tmjson "github.com/cometbft/cometbft/libs/json" + tmtypes "github.com/cometbft/cometbft/types" "github.com/babylonchain/babylon/app" diff --git a/simapp/utils.go b/simapp/utils.go index b085f9e95..6efac1755 100644 --- a/simapp/utils.go +++ b/simapp/utils.go @@ -4,10 +4,10 @@ import ( "encoding/json" "os" - "github.com/tendermint/tendermint/libs/log" - dbm "github.com/tendermint/tm-db" - simappparams "github.com/babylonchain/babylon/app/params" "github.com/babylonchain/babylon/app" + simappparams "github.com/babylonchain/babylon/app/params" + dbm "github.com/cometbft/cometbft-db" + "github.com/cometbft/cometbft/libs/log" "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/types/module" diff --git a/test/e2e/configurer/chain/chain.go b/test/e2e/configurer/chain/chain.go index fd0d5d437..f08f8f575 100644 --- a/test/e2e/configurer/chain/chain.go +++ b/test/e2e/configurer/chain/chain.go @@ -5,9 +5,9 @@ import ( "testing" "time" + coretypes "github.com/cometbft/cometbft/rpc/core/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/stretchr/testify/require" - coretypes "github.com/tendermint/tendermint/rpc/core/types" "github.com/babylonchain/babylon/test/e2e/configurer/config" "github.com/babylonchain/babylon/test/e2e/containers" diff --git a/test/e2e/configurer/chain/node.go b/test/e2e/configurer/chain/node.go index 9f133091a..fb1336b43 100644 --- a/test/e2e/configurer/chain/node.go +++ b/test/e2e/configurer/chain/node.go @@ -8,9 +8,9 @@ import ( "testing" "time" + rpchttp "github.com/cometbft/cometbft/rpc/client/http" + coretypes "github.com/cometbft/cometbft/rpc/core/types" "github.com/stretchr/testify/require" - rpchttp "github.com/tendermint/tendermint/rpc/client/http" - coretypes "github.com/tendermint/tendermint/rpc/core/types" "github.com/babylonchain/babylon/test/e2e/containers" "github.com/babylonchain/babylon/test/e2e/initialization" diff --git a/test/e2e/configurer/chain/queries.go b/test/e2e/configurer/chain/queries.go index 3144ca161..438df18aa 100644 --- a/test/e2e/configurer/chain/queries.go +++ b/test/e2e/configurer/chain/queries.go @@ -10,10 +10,10 @@ import ( sdkmath "cosmossdk.io/math" + tmabcitypes "github.com/cometbft/cometbft/abci/types" sdk "github.com/cosmos/cosmos-sdk/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" "github.com/stretchr/testify/require" - tmabcitypes "github.com/tendermint/tendermint/abci/types" "github.com/babylonchain/babylon/test/e2e/util" blc "github.com/babylonchain/babylon/x/btclightclient/types" diff --git a/test/e2e/initialization/config.go b/test/e2e/initialization/config.go index 33484726a..1d420d377 100644 --- a/test/e2e/initialization/config.go +++ b/test/e2e/initialization/config.go @@ -11,6 +11,7 @@ import ( btccheckpointtypes "github.com/babylonchain/babylon/x/btccheckpoint/types" blctypes "github.com/babylonchain/babylon/x/btclightclient/types" checkpointingtypes "github.com/babylonchain/babylon/x/checkpointing/types" + tmjson "github.com/cometbft/cometbft/libs/json" cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" ed25519 "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" "github.com/cosmos/cosmos-sdk/server" @@ -22,7 +23,6 @@ import ( genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types" staketypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/cosmos/gogoproto/proto" - tmjson "github.com/tendermint/tendermint/libs/json" "github.com/babylonchain/babylon/test/e2e/util" ) diff --git a/test/e2e/initialization/node.go b/test/e2e/initialization/node.go index 9a1e1615d..3cb6ebf79 100644 --- a/test/e2e/initialization/node.go +++ b/test/e2e/initialization/node.go @@ -11,6 +11,11 @@ import ( "github.com/babylonchain/babylon/crypto/bls12381" "github.com/babylonchain/babylon/privval" bbn "github.com/babylonchain/babylon/types" + tmconfig "github.com/cometbft/cometbft/config" + tmed25519 "github.com/cometbft/cometbft/crypto/ed25519" + tmos "github.com/cometbft/cometbft/libs/os" + "github.com/cometbft/cometbft/p2p" + tmtypes "github.com/cometbft/cometbft/types" sdkcrypto "github.com/cosmos/cosmos-sdk/crypto" cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" "github.com/cosmos/cosmos-sdk/crypto/hd" @@ -26,11 +31,6 @@ import ( stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/cosmos/go-bip39" "github.com/spf13/viper" - tmconfig "github.com/tendermint/tendermint/config" - tmed25519 "github.com/tendermint/tendermint/crypto/ed25519" - tmos "github.com/tendermint/tendermint/libs/os" - "github.com/tendermint/tendermint/p2p" - tmtypes "github.com/tendermint/tendermint/types" "github.com/babylonchain/babylon/test/e2e/util" diff --git a/test/utils.go b/test/utils.go index 12bfec43b..240593297 100644 --- a/test/utils.go +++ b/test/utils.go @@ -9,12 +9,12 @@ import ( tm "github.com/cosmos/cosmos-sdk/client/grpc/tmservice" "github.com/btcsuite/btcd/wire" + "github.com/cometbft/cometbft/types" "github.com/cosmos/cosmos-sdk/client/tx" "github.com/cosmos/cosmos-sdk/crypto/keyring" ctypes "github.com/cosmos/cosmos-sdk/types" txservice "github.com/cosmos/cosmos-sdk/types/tx" acctypes "github.com/cosmos/cosmos-sdk/x/auth/types" - "github.com/tendermint/tendermint/types" "google.golang.org/grpc" "github.com/babylonchain/babylon/app" diff --git a/testutil/datagen/genesiskey.go b/testutil/datagen/genesiskey.go index 4855ec701..89e2ee6ff 100644 --- a/testutil/datagen/genesiskey.go +++ b/testutil/datagen/genesiskey.go @@ -4,10 +4,10 @@ import ( "github.com/babylonchain/babylon/crypto/bls12381" "github.com/babylonchain/babylon/privval" "github.com/babylonchain/babylon/x/checkpointing/types" + ed255192 "github.com/cometbft/cometbft/crypto/ed25519" "github.com/cosmos/cosmos-sdk/crypto/codec" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" sdk "github.com/cosmos/cosmos-sdk/types" - ed255192 "github.com/tendermint/tendermint/crypto/ed25519" ) func GenerateGenesisKey() *types.GenesisKey { diff --git a/testutil/datagen/init_val.go b/testutil/datagen/init_val.go index 8d59ad425..6b06d2e6e 100644 --- a/testutil/datagen/init_val.go +++ b/testutil/datagen/init_val.go @@ -4,12 +4,12 @@ import ( "fmt" "github.com/babylonchain/babylon/crypto/bls12381" "github.com/babylonchain/babylon/privval" + cfg "github.com/cometbft/cometbft/config" + tmed25519 "github.com/cometbft/cometbft/crypto/ed25519" + tmos "github.com/cometbft/cometbft/libs/os" + "github.com/cometbft/cometbft/p2p" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/go-bip39" - cfg "github.com/tendermint/tendermint/config" - tmed25519 "github.com/tendermint/tendermint/crypto/ed25519" - tmos "github.com/tendermint/tendermint/libs/os" - "github.com/tendermint/tendermint/p2p" "path/filepath" ) diff --git a/testutil/datagen/priv_validator.go b/testutil/datagen/priv_validator.go index d94055b39..42af77a70 100644 --- a/testutil/datagen/priv_validator.go +++ b/testutil/datagen/priv_validator.go @@ -1,9 +1,9 @@ package datagen import ( - "github.com/tendermint/tendermint/crypto" - tmproto "github.com/tendermint/tendermint/proto/tendermint/types" - tmtypes "github.com/tendermint/tendermint/types" + "github.com/cometbft/cometbft/crypto" + tmproto "github.com/cometbft/cometbft/proto/tendermint/types" + tmtypes "github.com/cometbft/cometbft/types" cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" diff --git a/testutil/datagen/tendermint.go b/testutil/datagen/tendermint.go index 9019b24d1..d5eb698bb 100644 --- a/testutil/datagen/tendermint.go +++ b/testutil/datagen/tendermint.go @@ -3,8 +3,8 @@ package datagen import ( "time" + tmproto "github.com/cometbft/cometbft/proto/tendermint/types" ibctmtypes "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" - tmproto "github.com/tendermint/tendermint/proto/tendermint/types" ) func GenRandomTMHeader(chainID string, height uint64) *tmproto.Header { diff --git a/testutil/keeper/btccheckpoint.go b/testutil/keeper/btccheckpoint.go index fd417b225..77af7f8cd 100644 --- a/testutil/keeper/btccheckpoint.go +++ b/testutil/keeper/btccheckpoint.go @@ -8,6 +8,9 @@ import ( txformat "github.com/babylonchain/babylon/btctxformatter" "github.com/babylonchain/babylon/x/btccheckpoint/keeper" btcctypes "github.com/babylonchain/babylon/x/btccheckpoint/types" + tmdb "github.com/cometbft/cometbft-db" + "github.com/cometbft/cometbft/libs/log" + tmproto "github.com/cometbft/cometbft/proto/tendermint/types" "github.com/cosmos/cosmos-sdk/codec" codectypes "github.com/cosmos/cosmos-sdk/codec/types" "github.com/cosmos/cosmos-sdk/store" @@ -15,9 +18,6 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" typesparams "github.com/cosmos/cosmos-sdk/x/params/types" "github.com/stretchr/testify/require" - "github.com/tendermint/tendermint/libs/log" - tmproto "github.com/tendermint/tendermint/proto/tendermint/types" - tmdb "github.com/tendermint/tm-db" ) func NewBTCCheckpointKeeper( diff --git a/testutil/keeper/btclightclient.go b/testutil/keeper/btclightclient.go index e68657b1d..9b6ac15e8 100644 --- a/testutil/keeper/btclightclient.go +++ b/testutil/keeper/btclightclient.go @@ -7,6 +7,9 @@ import ( bbn "github.com/babylonchain/babylon/types" "github.com/babylonchain/babylon/x/btclightclient/keeper" "github.com/babylonchain/babylon/x/btclightclient/types" + tmdb "github.com/cometbft/cometbft-db" + "github.com/cometbft/cometbft/libs/log" + tmproto "github.com/cometbft/cometbft/proto/tendermint/types" "github.com/cosmos/cosmos-sdk/codec" codectypes "github.com/cosmos/cosmos-sdk/codec/types" "github.com/cosmos/cosmos-sdk/store" @@ -14,9 +17,6 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" typesparams "github.com/cosmos/cosmos-sdk/x/params/types" "github.com/stretchr/testify/require" - "github.com/tendermint/tendermint/libs/log" - tmproto "github.com/tendermint/tendermint/proto/tendermint/types" - tmdb "github.com/tendermint/tm-db" ) func BTCLightClientKeeper(t testing.TB) (*keeper.Keeper, sdk.Context) { diff --git a/testutil/keeper/checkpointing.go b/testutil/keeper/checkpointing.go index 2a2ea7c96..35d5461d9 100644 --- a/testutil/keeper/checkpointing.go +++ b/testutil/keeper/checkpointing.go @@ -5,6 +5,9 @@ import ( "github.com/babylonchain/babylon/x/checkpointing/keeper" "github.com/babylonchain/babylon/x/checkpointing/types" + tmdb "github.com/cometbft/cometbft-db" + "github.com/cometbft/cometbft/libs/log" + tmproto "github.com/cometbft/cometbft/proto/tendermint/types" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/codec" codectypes "github.com/cosmos/cosmos-sdk/codec/types" @@ -13,9 +16,6 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" typesparams "github.com/cosmos/cosmos-sdk/x/params/types" "github.com/stretchr/testify/require" - "github.com/tendermint/tendermint/libs/log" - tmproto "github.com/tendermint/tendermint/proto/tendermint/types" - tmdb "github.com/tendermint/tm-db" ) func CheckpointingKeeper(t testing.TB, ek types.EpochingKeeper, signer keeper.BlsSigner, cliCtx client.Context) (*keeper.Keeper, sdk.Context, *codec.ProtoCodec) { diff --git a/testutil/keeper/epoching.go b/testutil/keeper/epoching.go index 91cf13733..a92838d1b 100644 --- a/testutil/keeper/epoching.go +++ b/testutil/keeper/epoching.go @@ -3,6 +3,9 @@ package keeper import ( "testing" + tmdb "github.com/cometbft/cometbft-db" + "github.com/cometbft/cometbft/libs/log" + tmproto "github.com/cometbft/cometbft/proto/tendermint/types" "github.com/cosmos/cosmos-sdk/codec" codectypes "github.com/cosmos/cosmos-sdk/codec/types" "github.com/cosmos/cosmos-sdk/store" @@ -10,9 +13,6 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" typesparams "github.com/cosmos/cosmos-sdk/x/params/types" "github.com/stretchr/testify/require" - "github.com/tendermint/tendermint/libs/log" - tmproto "github.com/tendermint/tendermint/proto/tendermint/types" - tmdb "github.com/tendermint/tm-db" "github.com/babylonchain/babylon/x/epoching/keeper" "github.com/babylonchain/babylon/x/epoching/types" diff --git a/testutil/keeper/zoneconcierge.go b/testutil/keeper/zoneconcierge.go index e894e8f1d..3dde98375 100644 --- a/testutil/keeper/zoneconcierge.go +++ b/testutil/keeper/zoneconcierge.go @@ -5,6 +5,11 @@ import ( "github.com/babylonchain/babylon/x/zoneconcierge/keeper" "github.com/babylonchain/babylon/x/zoneconcierge/types" + tmdb "github.com/cometbft/cometbft-db" + abci "github.com/cometbft/cometbft/abci/types" + "github.com/cometbft/cometbft/libs/log" + tmcrypto "github.com/cometbft/cometbft/proto/tendermint/crypto" + tmproto "github.com/cometbft/cometbft/proto/tendermint/types" "github.com/cosmos/cosmos-sdk/codec" codectypes "github.com/cosmos/cosmos-sdk/codec/types" "github.com/cosmos/cosmos-sdk/store" @@ -16,11 +21,6 @@ import ( channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" ibcexported "github.com/cosmos/ibc-go/v7/modules/core/exported" "github.com/stretchr/testify/require" - abci "github.com/tendermint/tendermint/abci/types" - "github.com/tendermint/tendermint/libs/log" - tmcrypto "github.com/tendermint/tendermint/proto/tendermint/crypto" - tmproto "github.com/tendermint/tendermint/proto/tendermint/types" - tmdb "github.com/tendermint/tm-db" ) // zoneconciergeChannelKeeper is a stub of ChannelKeeper diff --git a/types/retry/log.go b/types/retry/log.go index 9ce022033..55c07f6bf 100644 --- a/types/retry/log.go +++ b/types/retry/log.go @@ -1,7 +1,7 @@ package retry import ( - "github.com/tendermint/tendermint/libs/log" + "github.com/cometbft/cometbft/libs/log" "os" ) diff --git a/x/btccheckpoint/abci.go b/x/btccheckpoint/abci.go index 63851f45c..34136c669 100644 --- a/x/btccheckpoint/abci.go +++ b/x/btccheckpoint/abci.go @@ -2,8 +2,8 @@ package btccheckpoint import ( "github.com/babylonchain/babylon/x/btccheckpoint/keeper" + abci "github.com/cometbft/cometbft/abci/types" sdk "github.com/cosmos/cosmos-sdk/types" - abci "github.com/tendermint/tendermint/abci/types" ) // EndBlocker checks if during block execution btc light client head had been diff --git a/x/btccheckpoint/genesis_test.go b/x/btccheckpoint/genesis_test.go index 61bdb1227..47c4323bb 100644 --- a/x/btccheckpoint/genesis_test.go +++ b/x/btccheckpoint/genesis_test.go @@ -4,8 +4,8 @@ import ( "testing" "github.com/babylonchain/babylon/x/btccheckpoint" + tmproto "github.com/cometbft/cometbft/proto/tendermint/types" "github.com/stretchr/testify/require" - tmproto "github.com/tendermint/tendermint/proto/tendermint/types" simapp "github.com/babylonchain/babylon/app" "github.com/babylonchain/babylon/x/btccheckpoint/types" diff --git a/x/btccheckpoint/keeper/keeper.go b/x/btccheckpoint/keeper/keeper.go index 9301d7523..2461782b0 100644 --- a/x/btccheckpoint/keeper/keeper.go +++ b/x/btccheckpoint/keeper/keeper.go @@ -8,12 +8,12 @@ import ( txformat "github.com/babylonchain/babylon/btctxformatter" bbn "github.com/babylonchain/babylon/types" "github.com/babylonchain/babylon/x/btccheckpoint/types" + "github.com/cometbft/cometbft/libs/log" "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/store/prefix" storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" - "github.com/tendermint/tendermint/libs/log" ) type ( diff --git a/x/btccheckpoint/module.go b/x/btccheckpoint/module.go index c0bffeb15..e0c2f71da 100644 --- a/x/btccheckpoint/module.go +++ b/x/btccheckpoint/module.go @@ -9,7 +9,7 @@ import ( "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/spf13/cobra" - abci "github.com/tendermint/tendermint/abci/types" + abci "github.com/cometbft/cometbft/abci/types" "github.com/babylonchain/babylon/x/btccheckpoint/client/cli" "github.com/babylonchain/babylon/x/btccheckpoint/keeper" diff --git a/x/btclightclient/keeper/keeper.go b/x/btclightclient/keeper/keeper.go index 59792d21d..e2ee21773 100644 --- a/x/btclightclient/keeper/keeper.go +++ b/x/btclightclient/keeper/keeper.go @@ -4,8 +4,8 @@ import ( "fmt" bbn "github.com/babylonchain/babylon/types" + "github.com/cometbft/cometbft/libs/log" storetypes "github.com/cosmos/cosmos-sdk/store/types" - "github.com/tendermint/tendermint/libs/log" "github.com/babylonchain/babylon/x/btclightclient/types" "github.com/cosmos/cosmos-sdk/codec" diff --git a/x/btclightclient/module.go b/x/btclightclient/module.go index 321bc7e23..657f13097 100644 --- a/x/btclightclient/module.go +++ b/x/btclightclient/module.go @@ -9,7 +9,7 @@ import ( "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/spf13/cobra" - abci "github.com/tendermint/tendermint/abci/types" + abci "github.com/cometbft/cometbft/abci/types" "github.com/babylonchain/babylon/x/btclightclient/client/cli" "github.com/babylonchain/babylon/x/btclightclient/keeper" diff --git a/x/checkpointing/abci.go b/x/checkpointing/abci.go index c7348f161..eee07578d 100644 --- a/x/checkpointing/abci.go +++ b/x/checkpointing/abci.go @@ -8,9 +8,9 @@ import ( "github.com/babylonchain/babylon/x/checkpointing/keeper" + abci "github.com/cometbft/cometbft/abci/types" "github.com/cosmos/cosmos-sdk/telemetry" sdk "github.com/cosmos/cosmos-sdk/types" - abci "github.com/tendermint/tendermint/abci/types" ) // BeginBlocker is called at the beginning of every block. diff --git a/x/checkpointing/client/cli/tx_test.go b/x/checkpointing/client/cli/tx_test.go index 0ca11aca2..98452e3bd 100644 --- a/x/checkpointing/client/cli/tx_test.go +++ b/x/checkpointing/client/cli/tx_test.go @@ -22,14 +22,14 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/staking/client/cli" - abci "github.com/tendermint/tendermint/abci/types" - tmconfig "github.com/tendermint/tendermint/config" - tmbytes "github.com/tendermint/tendermint/libs/bytes" - tmos "github.com/tendermint/tendermint/libs/os" - rpcclient "github.com/tendermint/tendermint/rpc/client" - rpcclientmock "github.com/tendermint/tendermint/rpc/client/mock" - coretypes "github.com/tendermint/tendermint/rpc/core/types" - tmtypes "github.com/tendermint/tendermint/types" + abci "github.com/cometbft/cometbft/abci/types" + tmconfig "github.com/cometbft/cometbft/config" + tmbytes "github.com/cometbft/cometbft/libs/bytes" + tmos "github.com/cometbft/cometbft/libs/os" + rpcclient "github.com/cometbft/cometbft/rpc/client" + rpcclientmock "github.com/cometbft/cometbft/rpc/client/mock" + coretypes "github.com/cometbft/cometbft/rpc/core/types" + tmtypes "github.com/cometbft/cometbft/types" "github.com/babylonchain/babylon/app" "github.com/babylonchain/babylon/app/params" diff --git a/x/checkpointing/client/cli/utils.go b/x/checkpointing/client/cli/utils.go index 11fc3996f..6a0f1479e 100644 --- a/x/checkpointing/client/cli/utils.go +++ b/x/checkpointing/client/cli/utils.go @@ -9,6 +9,11 @@ import ( flag "github.com/spf13/pflag" + errorsmod "cosmossdk.io/errors" + "github.com/babylonchain/babylon/privval" + "github.com/babylonchain/babylon/x/checkpointing/types" + tmconfig "github.com/cometbft/cometbft/config" + tmos "github.com/cometbft/cometbft/libs/os" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" "github.com/cosmos/cosmos-sdk/client/tx" @@ -16,11 +21,6 @@ import ( sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" cosmoscli "github.com/cosmos/cosmos-sdk/x/staking/client/cli" staketypes "github.com/cosmos/cosmos-sdk/x/staking/types" - tmconfig "github.com/tendermint/tendermint/config" - tmos "github.com/tendermint/tendermint/libs/os" - errorsmod "cosmossdk.io/errors" - "github.com/babylonchain/babylon/privval" - "github.com/babylonchain/babylon/x/checkpointing/types" ) // copied from https://github.com/cosmos/cosmos-sdk/blob/7167371f87ae641012549922a292050562821dce/x/staking/client/cli/tx.go#L340 diff --git a/x/checkpointing/genesis_test.go b/x/checkpointing/genesis_test.go index 542177053..578f70fc0 100644 --- a/x/checkpointing/genesis_test.go +++ b/x/checkpointing/genesis_test.go @@ -6,15 +6,15 @@ import ( "github.com/babylonchain/babylon/crypto/bls12381" "github.com/babylonchain/babylon/privval" "github.com/babylonchain/babylon/x/checkpointing" + "github.com/cometbft/cometbft/crypto/ed25519" cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" cosmosed "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/stretchr/testify/require" - "github.com/tendermint/tendermint/crypto/ed25519" simapp "github.com/babylonchain/babylon/app" "github.com/babylonchain/babylon/x/checkpointing/types" - tmproto "github.com/tendermint/tendermint/proto/tendermint/types" + tmproto "github.com/cometbft/cometbft/proto/tendermint/types" ) func TestInitGenesis(t *testing.T) { diff --git a/x/checkpointing/keeper/keeper.go b/x/checkpointing/keeper/keeper.go index 768956c3f..153870a34 100644 --- a/x/checkpointing/keeper/keeper.go +++ b/x/checkpointing/keeper/keeper.go @@ -6,12 +6,12 @@ import ( txformat "github.com/babylonchain/babylon/btctxformatter" + "github.com/cometbft/cometbft/libs/log" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/codec" storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" - "github.com/tendermint/tendermint/libs/log" "github.com/babylonchain/babylon/crypto/bls12381" "github.com/babylonchain/babylon/x/checkpointing/types" diff --git a/x/checkpointing/keeper/msg_server_test.go b/x/checkpointing/keeper/msg_server_test.go index 16c1c3690..afe1e648f 100644 --- a/x/checkpointing/keeper/msg_server_test.go +++ b/x/checkpointing/keeper/msg_server_test.go @@ -5,11 +5,11 @@ import ( "testing" "cosmossdk.io/math" + "github.com/cometbft/cometbft/crypto/ed25519" "github.com/cosmos/cosmos-sdk/crypto/codec" sdk "github.com/cosmos/cosmos-sdk/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/stretchr/testify/require" - "github.com/tendermint/tendermint/crypto/ed25519" "github.com/babylonchain/babylon/app" appparams "github.com/babylonchain/babylon/app/params" diff --git a/x/checkpointing/module.go b/x/checkpointing/module.go index afc22ab2a..0b4d25935 100644 --- a/x/checkpointing/module.go +++ b/x/checkpointing/module.go @@ -9,7 +9,7 @@ import ( "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/spf13/cobra" - abci "github.com/tendermint/tendermint/abci/types" + abci "github.com/cometbft/cometbft/abci/types" "github.com/babylonchain/babylon/x/checkpointing/client/cli" "github.com/babylonchain/babylon/x/checkpointing/keeper" diff --git a/x/checkpointing/testckpt/helper.go b/x/checkpointing/testckpt/helper.go index 7f86df85e..4329862dc 100644 --- a/x/checkpointing/testckpt/helper.go +++ b/x/checkpointing/testckpt/helper.go @@ -12,6 +12,7 @@ import ( "github.com/babylonchain/babylon/x/checkpointing/types" "github.com/babylonchain/babylon/x/epoching" epochingkeeper "github.com/babylonchain/babylon/x/epoching/keeper" + tmproto "github.com/cometbft/cometbft/proto/tendermint/types" "github.com/cosmos/cosmos-sdk/baseapp" cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" sdk "github.com/cosmos/cosmos-sdk/types" @@ -19,7 +20,6 @@ import ( stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/stretchr/testify/require" - tmproto "github.com/tendermint/tendermint/proto/tendermint/types" ) // Helper is a structure which wraps the entire app and exposes functionalities for testing the epoching module diff --git a/x/checkpointing/types/genesis.go b/x/checkpointing/types/genesis.go index da816d210..05a40358d 100644 --- a/x/checkpointing/types/genesis.go +++ b/x/checkpointing/types/genesis.go @@ -5,11 +5,11 @@ import ( "errors" "os" + tmjson "github.com/cometbft/cometbft/libs/json" "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" sdk "github.com/cosmos/cosmos-sdk/types" - tmjson "github.com/tendermint/tendermint/libs/json" "github.com/babylonchain/babylon/crypto/bls12381" ) diff --git a/x/checkpointing/types/pop.go b/x/checkpointing/types/pop.go index 65aa6bc96..6e7586157 100644 --- a/x/checkpointing/types/pop.go +++ b/x/checkpointing/types/pop.go @@ -2,8 +2,8 @@ package types import ( "github.com/babylonchain/babylon/crypto/bls12381" + "github.com/cometbft/cometbft/crypto/ed25519" cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" - "github.com/tendermint/tendermint/crypto/ed25519" ) // IsValid verifies the validity of PoP diff --git a/x/checkpointing/types/pop_test.go b/x/checkpointing/types/pop_test.go index 742aec90d..3beeca1aa 100644 --- a/x/checkpointing/types/pop_test.go +++ b/x/checkpointing/types/pop_test.go @@ -3,9 +3,9 @@ package types_test import ( "github.com/babylonchain/babylon/crypto/bls12381" "github.com/babylonchain/babylon/privval" + "github.com/cometbft/cometbft/crypto/ed25519" "github.com/cosmos/cosmos-sdk/crypto/codec" "github.com/stretchr/testify/require" - "github.com/tendermint/tendermint/crypto/ed25519" "testing" ) diff --git a/x/checkpointing/types/utils.go b/x/checkpointing/types/utils.go index 5da396553..54b8b9dfd 100644 --- a/x/checkpointing/types/utils.go +++ b/x/checkpointing/types/utils.go @@ -4,8 +4,8 @@ import ( "bytes" "encoding/hex" + "github.com/cometbft/cometbft/crypto/tmhash" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/tendermint/tendermint/crypto/tmhash" "github.com/babylonchain/babylon/btctxformatter" "github.com/babylonchain/babylon/crypto/bls12381" diff --git a/x/epoching/abci.go b/x/epoching/abci.go index e9e279eb7..a41acd104 100644 --- a/x/epoching/abci.go +++ b/x/epoching/abci.go @@ -7,20 +7,22 @@ import ( "github.com/babylonchain/babylon/x/epoching/keeper" "github.com/babylonchain/babylon/x/epoching/types" + abci "github.com/cometbft/cometbft/abci/types" "github.com/cosmos/cosmos-sdk/telemetry" sdk "github.com/cosmos/cosmos-sdk/types" - abci "github.com/tendermint/tendermint/abci/types" ) // BeginBlocker is called at the beginning of every block. // Upon each BeginBlock, // - record the current AppHash // - if reaching the epoch beginning, then -// - increment epoch number -// - trigger AfterEpochBegins hook -// - emit BeginEpoch event +// - increment epoch number +// - trigger AfterEpochBegins hook +// - emit BeginEpoch event +// // - if reaching the sealer header, i.e., the 2nd header of a non-zero epoch, then -// - record the sealer header for the previous epoch +// - record the sealer header for the previous epoch +// // NOTE: we follow Cosmos SDK's slashing/evidence modules for MVP. No need to modify them at the moment. func BeginBlocker(ctx sdk.Context, k keeper.Keeper, req abci.RequestBeginBlock) { defer telemetry.ModuleMeasureSince(types.ModuleName, time.Now(), telemetry.MetricKeyBeginBlocker) diff --git a/x/epoching/genesis_test.go b/x/epoching/genesis_test.go index d22687614..e7b90c9ed 100644 --- a/x/epoching/genesis_test.go +++ b/x/epoching/genesis_test.go @@ -4,8 +4,8 @@ import ( "testing" "github.com/babylonchain/babylon/x/epoching" + tmproto "github.com/cometbft/cometbft/proto/tendermint/types" "github.com/stretchr/testify/require" - tmproto "github.com/tendermint/tendermint/proto/tendermint/types" simapp "github.com/babylonchain/babylon/app" "github.com/babylonchain/babylon/x/epoching/types" diff --git a/x/epoching/keeper/apphash_chain.go b/x/epoching/keeper/apphash_chain.go index 14f4b3c37..511ebe336 100644 --- a/x/epoching/keeper/apphash_chain.go +++ b/x/epoching/keeper/apphash_chain.go @@ -6,10 +6,10 @@ import ( errorsmod "cosmossdk.io/errors" "github.com/babylonchain/babylon/x/epoching/types" + "github.com/cometbft/cometbft/crypto/merkle" + tmcrypto "github.com/cometbft/cometbft/proto/tendermint/crypto" "github.com/cosmos/cosmos-sdk/store/prefix" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/tendermint/tendermint/crypto/merkle" - tmcrypto "github.com/tendermint/tendermint/proto/tendermint/crypto" ) func (k Keeper) setAppHash(ctx sdk.Context, height uint64, appHash []byte) { diff --git a/x/epoching/keeper/epochs.go b/x/epoching/keeper/epochs.go index 46629065d..7e8cba969 100644 --- a/x/epoching/keeper/epochs.go +++ b/x/epoching/keeper/epochs.go @@ -3,9 +3,9 @@ package keeper import ( errorsmod "cosmossdk.io/errors" "github.com/babylonchain/babylon/x/epoching/types" + "github.com/cometbft/cometbft/crypto/merkle" "github.com/cosmos/cosmos-sdk/store/prefix" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/tendermint/tendermint/crypto/merkle" ) const ( diff --git a/x/epoching/keeper/keeper.go b/x/epoching/keeper/keeper.go index ccd989113..2969364f9 100644 --- a/x/epoching/keeper/keeper.go +++ b/x/epoching/keeper/keeper.go @@ -3,12 +3,12 @@ package keeper import ( "fmt" + "github.com/cometbft/cometbft/libs/log" "github.com/cosmos/cosmos-sdk/baseapp" "github.com/cosmos/cosmos-sdk/codec" storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" - "github.com/tendermint/tendermint/libs/log" "github.com/babylonchain/babylon/x/epoching/types" ) diff --git a/x/epoching/keeper/modified_staking.go b/x/epoching/keeper/modified_staking.go index e07074821..b68b1c22f 100644 --- a/x/epoching/keeper/modified_staking.go +++ b/x/epoching/keeper/modified_staking.go @@ -4,7 +4,7 @@ import ( "fmt" "github.com/babylonchain/babylon/x/epoching/types" - abci "github.com/tendermint/tendermint/abci/types" + abci "github.com/cometbft/cometbft/abci/types" sdk "github.com/cosmos/cosmos-sdk/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" diff --git a/x/epoching/keeper/msg_server.go b/x/epoching/keeper/msg_server.go index b05703f75..64fb4410f 100644 --- a/x/epoching/keeper/msg_server.go +++ b/x/epoching/keeper/msg_server.go @@ -3,12 +3,12 @@ package keeper import ( "context" + errorsmod "cosmossdk.io/errors" "github.com/babylonchain/babylon/x/epoching/types" + "github.com/cometbft/cometbft/crypto/tmhash" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - "github.com/tendermint/tendermint/crypto/tmhash" - errorsmod "cosmossdk.io/errors" ) type msgServer struct { diff --git a/x/epoching/module.go b/x/epoching/module.go index 9b34fdb89..bffbb5081 100644 --- a/x/epoching/module.go +++ b/x/epoching/module.go @@ -9,7 +9,7 @@ import ( "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/spf13/cobra" - abci "github.com/tendermint/tendermint/abci/types" + abci "github.com/cometbft/cometbft/abci/types" "github.com/babylonchain/babylon/x/epoching/client/cli" "github.com/babylonchain/babylon/x/epoching/keeper" diff --git a/x/epoching/testepoching/helper.go b/x/epoching/testepoching/helper.go index 9ce4f0a46..8baa1841b 100644 --- a/x/epoching/testepoching/helper.go +++ b/x/epoching/testepoching/helper.go @@ -11,6 +11,8 @@ import ( appparams "github.com/babylonchain/babylon/app/params" + abci "github.com/cometbft/cometbft/abci/types" + tmproto "github.com/cometbft/cometbft/proto/tendermint/types" "github.com/cosmos/cosmos-sdk/baseapp" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" sdk "github.com/cosmos/cosmos-sdk/types" @@ -18,8 +20,6 @@ import ( banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - abci "github.com/tendermint/tendermint/abci/types" - tmproto "github.com/tendermint/tendermint/proto/tendermint/types" "github.com/babylonchain/babylon/app" "github.com/babylonchain/babylon/x/epoching" diff --git a/x/epoching/testepoching/tm.go b/x/epoching/testepoching/tm.go index 4427b57c1..c7cc83b08 100644 --- a/x/epoching/testepoching/tm.go +++ b/x/epoching/testepoching/tm.go @@ -3,10 +3,10 @@ package testepoching import ( "cosmossdk.io/math" "github.com/babylonchain/babylon/testutil/datagen" + tmcrypto "github.com/cometbft/cometbft/crypto" + tmtypes "github.com/cometbft/cometbft/types" cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - tmcrypto "github.com/tendermint/tendermint/crypto" - tmtypes "github.com/tendermint/tendermint/types" ) // GetTmConsPubKey gets the validator's public key as a tmcrypto.PubKey. diff --git a/x/epoching/testepoching/validator.go b/x/epoching/testepoching/validator.go index 0deb0de29..30400f002 100644 --- a/x/epoching/testepoching/validator.go +++ b/x/epoching/testepoching/validator.go @@ -3,8 +3,8 @@ package testepoching import ( "testing" + "github.com/cometbft/cometbft/crypto/merkle" "github.com/stretchr/testify/require" - "github.com/tendermint/tendermint/crypto/merkle" cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" sdk "github.com/cosmos/cosmos-sdk/types" diff --git a/x/epoching/types/epoching.go b/x/epoching/types/epoching.go index 7c37e18be..bed9745dc 100644 --- a/x/epoching/types/epoching.go +++ b/x/epoching/types/epoching.go @@ -8,9 +8,9 @@ import ( cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" + "github.com/cometbft/cometbft/crypto/tmhash" + tmproto "github.com/cometbft/cometbft/proto/tendermint/types" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/tendermint/tendermint/crypto/tmhash" - tmproto "github.com/tendermint/tendermint/proto/tendermint/types" ) // NewEpoch constructs a new Epoch object diff --git a/x/epoching/types/epoching.pb.go b/x/epoching/types/epoching.pb.go index d93700ad7..a0eae549b 100644 --- a/x/epoching/types/epoching.pb.go +++ b/x/epoching/types/epoching.pb.go @@ -5,11 +5,11 @@ package types import ( fmt "fmt" + types "github.com/cometbft/cometbft/proto/tendermint/types" types1 "github.com/cosmos/cosmos-sdk/x/staking/types" _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/cosmos/gogoproto/proto" github_com_cosmos_gogoproto_types "github.com/cosmos/gogoproto/types" - types "github.com/tendermint/tendermint/proto/tendermint/types" _ "google.golang.org/protobuf/types/known/timestamppb" io "io" math "math" diff --git a/x/epoching/types/events.pb.go b/x/epoching/types/events.pb.go index c4ad6a5da..656b776d3 100644 --- a/x/epoching/types/events.pb.go +++ b/x/epoching/types/events.pb.go @@ -5,9 +5,9 @@ package types import ( fmt "fmt" + github_com_cometbft_cometbft_abci_types "github.com/cometbft/cometbft/abci/types" _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/cosmos/gogoproto/proto" - github_com_tendermint_tendermint_abci_types "github.com/tendermint/tendermint/abci/types" io "io" math "math" math_bits "math/bits" @@ -113,13 +113,13 @@ func (m *EventEndEpoch) GetEpochNumber() uint64 { } type EventHandleQueuedMsg struct { - OriginalEventType string `protobuf:"bytes,1,opt,name=original_event_type,json=originalEventType,proto3" json:"original_event_type,omitempty"` - EpochNumber uint64 `protobuf:"varint,2,opt,name=epoch_number,json=epochNumber,proto3" json:"epoch_number,omitempty"` - Height uint64 `protobuf:"varint,3,opt,name=height,proto3" json:"height,omitempty"` - TxId []byte `protobuf:"bytes,4,opt,name=tx_id,json=txId,proto3" json:"tx_id,omitempty"` - MsgId []byte `protobuf:"bytes,5,opt,name=msg_id,json=msgId,proto3" json:"msg_id,omitempty"` - OriginalAttributes []github_com_tendermint_tendermint_abci_types.EventAttribute `protobuf:"bytes,6,rep,name=original_attributes,json=originalAttributes,proto3,customtype=github.com/tendermint/tendermint/abci/types.EventAttribute" json:"original_attributes,omitempty"` - Error string `protobuf:"bytes,7,opt,name=error,proto3" json:"error,omitempty"` + OriginalEventType string `protobuf:"bytes,1,opt,name=original_event_type,json=originalEventType,proto3" json:"original_event_type,omitempty"` + EpochNumber uint64 `protobuf:"varint,2,opt,name=epoch_number,json=epochNumber,proto3" json:"epoch_number,omitempty"` + Height uint64 `protobuf:"varint,3,opt,name=height,proto3" json:"height,omitempty"` + TxId []byte `protobuf:"bytes,4,opt,name=tx_id,json=txId,proto3" json:"tx_id,omitempty"` + MsgId []byte `protobuf:"bytes,5,opt,name=msg_id,json=msgId,proto3" json:"msg_id,omitempty"` + OriginalAttributes []github_com_cometbft_cometbft_abci_types.EventAttribute `protobuf:"bytes,6,rep,name=original_attributes,json=originalAttributes,proto3,customtype=github.com/cometbft/cometbft/abci/types.EventAttribute" json:"original_attributes,omitempty"` + Error string `protobuf:"bytes,7,opt,name=error,proto3" json:"error,omitempty"` } func (m *EventHandleQueuedMsg) Reset() { *m = EventHandleQueuedMsg{} } @@ -506,46 +506,46 @@ func init() { func init() { proto.RegisterFile("babylon/epoching/v1/events.proto", fileDescriptor_2f0a2c43c7aaeb43) } var fileDescriptor_2f0a2c43c7aaeb43 = []byte{ - // 623 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x54, 0xcf, 0x6a, 0xd4, 0x40, - 0x18, 0x6f, 0xf6, 0x9f, 0x74, 0x6c, 0xb5, 0x9d, 0x5d, 0x97, 0x60, 0x71, 0x5d, 0x17, 0x84, 0x82, - 0xba, 0x69, 0xd5, 0x83, 0x78, 0x10, 0xba, 0x58, 0xb0, 0x82, 0xa2, 0xb1, 0x56, 0xf0, 0x12, 0x26, - 0x3b, 0x1f, 0xc9, 0x40, 0x32, 0x13, 0x66, 0x26, 0x6b, 0xf7, 0x2d, 0x7c, 0x01, 0x6f, 0x3e, 0x82, - 0xaf, 0x20, 0x7a, 0xec, 0x51, 0x3c, 0x88, 0xb4, 0x2f, 0x22, 0x99, 0xfc, 0x31, 0xda, 0xad, 0x88, - 0x37, 0x6f, 0x33, 0xbf, 0x3f, 0xdf, 0xe4, 0xf7, 0x7d, 0x99, 0x41, 0x43, 0x9f, 0xf8, 0xf3, 0x48, - 0x70, 0x07, 0x12, 0x31, 0x0d, 0x19, 0x0f, 0x9c, 0xd9, 0xb6, 0x03, 0x33, 0xe0, 0x5a, 0x8d, 0x13, - 0x29, 0xb4, 0xc0, 0xdd, 0x42, 0x31, 0x2e, 0x15, 0xe3, 0xd9, 0xf6, 0xe5, 0x5e, 0x20, 0x02, 0x61, - 0x78, 0x27, 0x5b, 0xe5, 0xd2, 0xd1, 0x5d, 0x74, 0x71, 0x37, 0xb3, 0x4e, 0x20, 0x60, 0x7c, 0x37, - 0x93, 0xe3, 0x6b, 0x68, 0xc5, 0xf8, 0x3c, 0x9e, 0xc6, 0x3e, 0x48, 0xdb, 0x1a, 0x5a, 0x9b, 0x2d, - 0xf7, 0xbc, 0xc1, 0x9e, 0x1a, 0x68, 0x74, 0x1b, 0xad, 0x1a, 0xd7, 0x2e, 0xa7, 0x7f, 0xed, 0xf9, - 0xd0, 0x40, 0x3d, 0x63, 0x7a, 0x44, 0x38, 0x8d, 0xe0, 0x79, 0x0a, 0x29, 0xd0, 0x27, 0x2a, 0xc0, - 0x63, 0xd4, 0x15, 0x92, 0x05, 0x8c, 0x93, 0xc8, 0x33, 0x31, 0x3c, 0x3d, 0x4f, 0xc0, 0x94, 0x58, - 0x76, 0xd7, 0x4b, 0xca, 0x58, 0xf7, 0xe7, 0x09, 0x9c, 0x3a, 0xab, 0x71, 0xea, 0x2c, 0xdc, 0x47, - 0x9d, 0x10, 0x58, 0x10, 0x6a, 0xbb, 0x69, 0xc8, 0x62, 0x87, 0xbb, 0xa8, 0xad, 0x0f, 0x3d, 0x46, - 0xed, 0xd6, 0xd0, 0xda, 0x5c, 0x71, 0x5b, 0xfa, 0x70, 0x8f, 0xe2, 0x4b, 0xa8, 0x13, 0xab, 0x20, - 0x43, 0xdb, 0x06, 0x6d, 0xc7, 0x2a, 0xd8, 0xa3, 0x58, 0xd4, 0x3e, 0x8b, 0x68, 0x2d, 0x99, 0x9f, - 0x6a, 0x50, 0x76, 0x67, 0xd8, 0xdc, 0x5c, 0x99, 0x3c, 0xf8, 0xfa, 0xed, 0xea, 0xfd, 0x80, 0xe9, - 0x30, 0xf5, 0xc7, 0x53, 0x11, 0x3b, 0x1a, 0x38, 0x05, 0x19, 0x33, 0xae, 0xeb, 0x4b, 0xe2, 0x4f, - 0x99, 0x93, 0x85, 0x51, 0x63, 0xf3, 0xf9, 0x3b, 0x65, 0x19, 0x17, 0x97, 0xa5, 0x2b, 0x48, 0xe1, - 0x1e, 0x6a, 0x83, 0x94, 0x42, 0xda, 0xe7, 0x4c, 0xf2, 0x7c, 0x33, 0x7a, 0x6f, 0xa1, 0xae, 0x31, - 0xbf, 0x88, 0x88, 0x0a, 0xf7, 0x43, 0x09, 0x2a, 0x14, 0x11, 0xc5, 0x5b, 0xa8, 0xa7, 0x32, 0x04, - 0xa8, 0x37, 0x13, 0x9a, 0xf1, 0xc0, 0x4b, 0xc4, 0x9b, 0xa2, 0xf3, 0x4d, 0x17, 0x17, 0xdc, 0x81, - 0xa1, 0x9e, 0x65, 0x0c, 0xbe, 0x89, 0xb0, 0x16, 0x9a, 0x44, 0xbf, 0xea, 0x1b, 0x46, 0xbf, 0x66, - 0x98, 0xba, 0xfa, 0x16, 0xc2, 0x55, 0x7d, 0x12, 0x31, 0x4a, 0xb4, 0x90, 0xca, 0x6e, 0x66, 0xe9, - 0xdd, 0xf5, 0xb2, 0x7a, 0x45, 0x8c, 0x3e, 0x5a, 0xc5, 0x74, 0x5f, 0x49, 0x92, 0x24, 0x40, 0x1f, - 0x42, 0x04, 0x01, 0xd1, 0x80, 0x6f, 0xa0, 0x75, 0x9a, 0xaf, 0x85, 0xf4, 0x08, 0xa5, 0x12, 0x94, - 0x2a, 0x66, 0xbb, 0x56, 0x11, 0x3b, 0x39, 0x9e, 0x89, 0xab, 0xc3, 0x2a, 0x71, 0x23, 0x17, 0x57, - 0x44, 0x29, 0xee, 0xa3, 0x0e, 0x89, 0x45, 0xca, 0xab, 0x21, 0xe7, 0xbb, 0xac, 0x8f, 0x14, 0xb8, - 0x88, 0xcd, 0x90, 0x97, 0xdd, 0x7c, 0x83, 0xaf, 0xa3, 0x0b, 0xf9, 0x5f, 0xe3, 0x8b, 0x94, 0x53, - 0x22, 0xe7, 0x66, 0xda, 0x2d, 0x77, 0xd5, 0xa0, 0x93, 0x02, 0x1c, 0x7d, 0xb2, 0x50, 0xbf, 0x9e, - 0xe3, 0x25, 0xa7, 0xff, 0x69, 0x92, 0x77, 0x0d, 0xb4, 0x51, 0x4f, 0x62, 0x6e, 0xb8, 0x0b, 0xff, - 0x16, 0xe7, 0x1e, 0xb2, 0x95, 0x48, 0xe5, 0x14, 0xbc, 0xb3, 0x52, 0xf5, 0x73, 0xfe, 0xe0, 0xf7, - 0x6c, 0x13, 0x74, 0x85, 0x82, 0xd2, 0x8c, 0x13, 0xcd, 0x04, 0x5f, 0x60, 0x6f, 0x1a, 0xfb, 0x46, - 0x4d, 0x74, 0x70, 0x76, 0x7f, 0x5a, 0x8b, 0xfb, 0xd3, 0xfe, 0x73, 0x7f, 0x3a, 0x0b, 0xfa, 0x33, - 0x79, 0xfc, 0xf9, 0x78, 0x60, 0x1d, 0x1d, 0x0f, 0xac, 0xef, 0xc7, 0x03, 0xeb, 0xed, 0xc9, 0x60, - 0xe9, 0xe8, 0x64, 0xb0, 0xf4, 0xe5, 0x64, 0xb0, 0xf4, 0x7a, 0xab, 0x76, 0xb1, 0x8b, 0x97, 0x74, - 0x1a, 0x12, 0xc6, 0xcb, 0x8d, 0x73, 0xf8, 0xf3, 0xe9, 0x35, 0xb7, 0xdb, 0xef, 0x98, 0xc7, 0xf4, - 0xce, 0x8f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x98, 0x17, 0x1c, 0xc5, 0x9b, 0x05, 0x00, 0x00, + // 624 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x54, 0xdd, 0x6a, 0xd4, 0x4e, + 0x14, 0x6f, 0xf6, 0xeb, 0x4f, 0xe7, 0xdf, 0x6a, 0x3b, 0xbb, 0x2e, 0xc1, 0xe2, 0xba, 0x2e, 0x08, + 0x05, 0x75, 0xd3, 0xaa, 0x88, 0x78, 0xd7, 0xc5, 0x82, 0x15, 0x14, 0x8d, 0xb5, 0x82, 0x37, 0x61, + 0xb2, 0x73, 0x4c, 0x06, 0x93, 0x99, 0x30, 0x33, 0x59, 0xbb, 0x6f, 0xe1, 0x0b, 0x78, 0xe7, 0x03, + 0xf8, 0x12, 0xa2, 0x97, 0xbd, 0x14, 0x2f, 0x44, 0xda, 0x17, 0x91, 0x4c, 0x3e, 0x1a, 0x6d, 0x2b, + 0xe2, 0x9d, 0x77, 0x33, 0xbf, 0x8f, 0x33, 0xf9, 0x9d, 0x93, 0x19, 0x34, 0xf4, 0x89, 0x3f, 0x8f, + 0x04, 0x77, 0x20, 0x11, 0xd3, 0x90, 0xf1, 0xc0, 0x99, 0x6d, 0x3a, 0x30, 0x03, 0xae, 0xd5, 0x38, + 0x91, 0x42, 0x0b, 0xdc, 0x2d, 0x14, 0xe3, 0x52, 0x31, 0x9e, 0x6d, 0x5e, 0xec, 0x05, 0x22, 0x10, + 0x86, 0x77, 0xb2, 0x55, 0x2e, 0x1d, 0xdd, 0x46, 0xe7, 0xb7, 0x33, 0xeb, 0x04, 0x02, 0xc6, 0xb7, + 0x33, 0x39, 0xbe, 0x82, 0x96, 0x8c, 0xcf, 0xe3, 0x69, 0xec, 0x83, 0xb4, 0xad, 0xa1, 0xb5, 0xde, + 0x72, 0xff, 0x37, 0xd8, 0x63, 0x03, 0x8d, 0x6e, 0xa2, 0x65, 0xe3, 0xda, 0xe6, 0xf4, 0x8f, 0x3d, + 0x1f, 0x1a, 0xa8, 0x67, 0x4c, 0x0f, 0x08, 0xa7, 0x11, 0x3c, 0x4d, 0x21, 0x05, 0xfa, 0x48, 0x05, + 0x78, 0x8c, 0xba, 0x42, 0xb2, 0x80, 0x71, 0x12, 0x79, 0x26, 0x86, 0xa7, 0xe7, 0x09, 0x98, 0x12, + 0x8b, 0xee, 0x6a, 0x49, 0x19, 0xeb, 0xee, 0x3c, 0x81, 0x13, 0x67, 0x35, 0x4e, 0x9c, 0x85, 0xfb, + 0xa8, 0x13, 0x02, 0x0b, 0x42, 0x6d, 0x37, 0x0d, 0x59, 0xec, 0x70, 0x17, 0xb5, 0xf5, 0xbe, 0xc7, + 0xa8, 0xdd, 0x1a, 0x5a, 0xeb, 0x4b, 0x6e, 0x4b, 0xef, 0xef, 0x50, 0x7c, 0x01, 0x75, 0x62, 0x15, + 0x64, 0x68, 0xdb, 0xa0, 0xed, 0x58, 0x05, 0x3b, 0x14, 0xbf, 0xae, 0x7d, 0x16, 0xd1, 0x5a, 0x32, + 0x3f, 0xd5, 0xa0, 0xec, 0xce, 0xb0, 0xb9, 0xbe, 0x34, 0xb9, 0xf7, 0xf5, 0xdb, 0xe5, 0x3b, 0x01, + 0xd3, 0x61, 0xea, 0x8f, 0xa7, 0x22, 0x76, 0xa6, 0x22, 0x06, 0xed, 0xbf, 0xd2, 0xc7, 0x0b, 0xe2, + 0x4f, 0x99, 0x93, 0x05, 0x51, 0x63, 0xf3, 0xe9, 0x5b, 0x65, 0x09, 0x17, 0x97, 0x65, 0x2b, 0x48, + 0xe1, 0x1e, 0x6a, 0x83, 0x94, 0x42, 0xda, 0xff, 0x99, 0xd4, 0xf9, 0x66, 0xf4, 0xde, 0x42, 0x5d, + 0x63, 0x7e, 0x16, 0x11, 0x15, 0xee, 0x86, 0x12, 0x54, 0x28, 0x22, 0x8a, 0x37, 0x50, 0x4f, 0x65, + 0x08, 0x50, 0x6f, 0x26, 0x34, 0xe3, 0x81, 0x97, 0x88, 0x37, 0x45, 0xd7, 0x9b, 0x2e, 0x2e, 0xb8, + 0x3d, 0x43, 0x3d, 0xc9, 0x18, 0x7c, 0x1d, 0x61, 0x2d, 0x34, 0x89, 0x7e, 0xd6, 0x37, 0x8c, 0x7e, + 0xc5, 0x30, 0x75, 0xf5, 0x0d, 0x84, 0xab, 0xfa, 0x24, 0x62, 0x94, 0x68, 0x21, 0x95, 0xdd, 0xcc, + 0x92, 0xbb, 0xab, 0x65, 0xf5, 0x8a, 0x18, 0x7d, 0xb4, 0x8a, 0xc9, 0xbe, 0x90, 0x24, 0x49, 0x80, + 0xde, 0x87, 0x08, 0x02, 0xa2, 0x01, 0x5f, 0x43, 0xab, 0x34, 0x5f, 0x0b, 0xe9, 0x11, 0x4a, 0x25, + 0x28, 0x55, 0xcc, 0x75, 0xa5, 0x22, 0xb6, 0x72, 0x3c, 0x13, 0x57, 0x87, 0x55, 0xe2, 0x46, 0x2e, + 0xae, 0x88, 0x52, 0xdc, 0x47, 0x1d, 0x12, 0x8b, 0x94, 0x57, 0x03, 0xce, 0x77, 0x59, 0x1f, 0x29, + 0x70, 0x11, 0x9b, 0x01, 0x2f, 0xba, 0xf9, 0x06, 0x5f, 0x45, 0xe7, 0xf2, 0x3f, 0xc6, 0x17, 0x29, + 0xa7, 0x44, 0xce, 0xcd, 0xa4, 0x5b, 0xee, 0xb2, 0x41, 0x27, 0x05, 0x38, 0xfa, 0x64, 0xa1, 0x7e, + 0x3d, 0xc7, 0x73, 0x4e, 0xff, 0xd1, 0x24, 0xef, 0x1a, 0x68, 0xad, 0x9e, 0xc4, 0xdc, 0x6e, 0x17, + 0xfe, 0x2e, 0xce, 0x5d, 0x64, 0x2b, 0x91, 0xca, 0x29, 0x78, 0x67, 0xa5, 0xea, 0xe7, 0xfc, 0xde, + 0xaf, 0xd9, 0x26, 0xe8, 0x12, 0x05, 0xa5, 0x19, 0x27, 0x9a, 0x09, 0x7e, 0x8a, 0xbd, 0x69, 0xec, + 0x6b, 0x35, 0xd1, 0xde, 0xd9, 0xfd, 0x69, 0x9d, 0xde, 0x9f, 0xf6, 0xef, 0xfb, 0xd3, 0x39, 0xa5, + 0x3f, 0x93, 0x87, 0x9f, 0x0f, 0x07, 0xd6, 0xc1, 0xe1, 0xc0, 0xfa, 0x7e, 0x38, 0xb0, 0xde, 0x1e, + 0x0d, 0x16, 0x0e, 0x8e, 0x06, 0x0b, 0x5f, 0x8e, 0x06, 0x0b, 0x2f, 0x37, 0x6a, 0x97, 0xba, 0x78, + 0x45, 0xa7, 0x21, 0x61, 0xbc, 0xdc, 0x38, 0xfb, 0xc7, 0xcf, 0xae, 0xb9, 0xdd, 0x7e, 0xc7, 0x3c, + 0xa4, 0xb7, 0x7e, 0x04, 0x00, 0x00, 0xff, 0xff, 0x77, 0x37, 0xe9, 0x99, 0x97, 0x05, 0x00, 0x00, } func (m *EventBeginEpoch) Marshal() (dAtA []byte, err error) { @@ -1408,7 +1408,7 @@ func (m *EventHandleQueuedMsg) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - var v github_com_tendermint_tendermint_abci_types.EventAttribute + var v github_com_cometbft_cometbft_abci_types.EventAttribute m.OriginalAttributes = append(m.OriginalAttributes, v) if err := m.OriginalAttributes[len(m.OriginalAttributes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err diff --git a/x/epoching/types/expected_keepers.go b/x/epoching/types/expected_keepers.go index 3e437eba8..17e23b9ab 100644 --- a/x/epoching/types/expected_keepers.go +++ b/x/epoching/types/expected_keepers.go @@ -4,9 +4,9 @@ import ( "time" "cosmossdk.io/math" + abci "github.com/cometbft/cometbft/abci/types" sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - abci "github.com/tendermint/tendermint/abci/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" ) diff --git a/x/epoching/types/genesis_test.go b/x/epoching/types/genesis_test.go index 7f282278d..59038f82c 100644 --- a/x/epoching/types/genesis_test.go +++ b/x/epoching/types/genesis_test.go @@ -7,8 +7,8 @@ import ( "github.com/babylonchain/babylon/testutil/nullify" "github.com/babylonchain/babylon/x/epoching" "github.com/babylonchain/babylon/x/epoching/types" + tmproto "github.com/cometbft/cometbft/proto/tendermint/types" "github.com/stretchr/testify/require" - tmproto "github.com/tendermint/tendermint/proto/tendermint/types" ) func TestGenesis(t *testing.T) { diff --git a/x/monitor/genesis_test.go b/x/monitor/genesis_test.go index a5d8dd915..19f0272e9 100644 --- a/x/monitor/genesis_test.go +++ b/x/monitor/genesis_test.go @@ -4,8 +4,8 @@ import ( "testing" "github.com/babylonchain/babylon/x/monitor" + tmproto "github.com/cometbft/cometbft/proto/tendermint/types" "github.com/stretchr/testify/require" - tmproto "github.com/tendermint/tendermint/proto/tendermint/types" simapp "github.com/babylonchain/babylon/app" "github.com/babylonchain/babylon/x/monitor/types" diff --git a/x/monitor/keeper/keeper.go b/x/monitor/keeper/keeper.go index 308ee45e8..4fd733021 100644 --- a/x/monitor/keeper/keeper.go +++ b/x/monitor/keeper/keeper.go @@ -5,11 +5,11 @@ import ( ckpttypes "github.com/babylonchain/babylon/x/checkpointing/types" "github.com/babylonchain/babylon/x/monitor/types" + "github.com/cometbft/cometbft/libs/log" "github.com/cosmos/cosmos-sdk/codec" storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" - "github.com/tendermint/tendermint/libs/log" ) type ( diff --git a/x/monitor/module.go b/x/monitor/module.go index b0cd1298b..ace8e6269 100644 --- a/x/monitor/module.go +++ b/x/monitor/module.go @@ -9,7 +9,7 @@ import ( "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/spf13/cobra" - abci "github.com/tendermint/tendermint/abci/types" + abci "github.com/cometbft/cometbft/abci/types" "github.com/babylonchain/babylon/x/monitor/client/cli" "github.com/babylonchain/babylon/x/monitor/keeper" diff --git a/x/zoneconcierge/abci.go b/x/zoneconcierge/abci.go index e478d0a0e..365c01ce7 100644 --- a/x/zoneconcierge/abci.go +++ b/x/zoneconcierge/abci.go @@ -5,9 +5,9 @@ import ( "github.com/babylonchain/babylon/x/zoneconcierge/keeper" "github.com/babylonchain/babylon/x/zoneconcierge/types" + abci "github.com/cometbft/cometbft/abci/types" "github.com/cosmos/cosmos-sdk/telemetry" sdk "github.com/cosmos/cosmos-sdk/types" - abci "github.com/tendermint/tendermint/abci/types" ) // BeginBlocker sends a pending packet for every channel upon each new block, diff --git a/x/zoneconcierge/keeper/grpc_query_test.go b/x/zoneconcierge/keeper/grpc_query_test.go index a961a7056..1865159f0 100644 --- a/x/zoneconcierge/keeper/grpc_query_test.go +++ b/x/zoneconcierge/keeper/grpc_query_test.go @@ -9,13 +9,13 @@ import ( btcctypes "github.com/babylonchain/babylon/x/btccheckpoint/types" checkpointingtypes "github.com/babylonchain/babylon/x/checkpointing/types" zctypes "github.com/babylonchain/babylon/x/zoneconcierge/types" + tmcrypto "github.com/cometbft/cometbft/proto/tendermint/crypto" + tmrpctypes "github.com/cometbft/cometbft/rpc/core/types" + tmtypes "github.com/cometbft/cometbft/types" "github.com/cosmos/cosmos-sdk/types/query" ibctmtypes "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" "github.com/golang/mock/gomock" "github.com/stretchr/testify/require" - tmcrypto "github.com/tendermint/tendermint/proto/tendermint/crypto" - tmrpctypes "github.com/tendermint/tendermint/rpc/core/types" - tmtypes "github.com/tendermint/tendermint/types" ) func FuzzChainList(f *testing.F) { diff --git a/x/zoneconcierge/keeper/keeper.go b/x/zoneconcierge/keeper/keeper.go index ef3fe8b5a..fe5c4c7f7 100644 --- a/x/zoneconcierge/keeper/keeper.go +++ b/x/zoneconcierge/keeper/keeper.go @@ -2,6 +2,7 @@ package keeper import ( "github.com/babylonchain/babylon/x/zoneconcierge/types" + "github.com/cometbft/cometbft/libs/log" "github.com/cosmos/cosmos-sdk/codec" storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" @@ -10,7 +11,6 @@ import ( channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" host "github.com/cosmos/ibc-go/v7/modules/core/24-host" ibcexported "github.com/cosmos/ibc-go/v7/modules/core/exported" - "github.com/tendermint/tendermint/libs/log" ) type ( diff --git a/x/zoneconcierge/keeper/proof_block_in_epoch.go b/x/zoneconcierge/keeper/proof_block_in_epoch.go index 6897e8e0a..0cdbabd35 100644 --- a/x/zoneconcierge/keeper/proof_block_in_epoch.go +++ b/x/zoneconcierge/keeper/proof_block_in_epoch.go @@ -3,9 +3,9 @@ package keeper import ( epochingkeeper "github.com/babylonchain/babylon/x/epoching/keeper" epochingtypes "github.com/babylonchain/babylon/x/epoching/types" + tmcrypto "github.com/cometbft/cometbft/proto/tendermint/crypto" + tmproto "github.com/cometbft/cometbft/proto/tendermint/types" sdk "github.com/cosmos/cosmos-sdk/types" - tmcrypto "github.com/tendermint/tendermint/proto/tendermint/crypto" - tmproto "github.com/tendermint/tendermint/proto/tendermint/types" ) func (k Keeper) ProveHeaderInEpoch(ctx sdk.Context, header *tmproto.Header, epoch *epochingtypes.Epoch) (*tmcrypto.Proof, error) { diff --git a/x/zoneconcierge/keeper/proof_epoch_sealed.go b/x/zoneconcierge/keeper/proof_epoch_sealed.go index ac36f372e..b6126f719 100644 --- a/x/zoneconcierge/keeper/proof_epoch_sealed.go +++ b/x/zoneconcierge/keeper/proof_epoch_sealed.go @@ -8,8 +8,8 @@ import ( checkpointingtypes "github.com/babylonchain/babylon/x/checkpointing/types" epochingtypes "github.com/babylonchain/babylon/x/epoching/types" "github.com/babylonchain/babylon/x/zoneconcierge/types" + tmcrypto "github.com/cometbft/cometbft/proto/tendermint/crypto" sdk "github.com/cosmos/cosmos-sdk/types" - tmcrypto "github.com/tendermint/tendermint/proto/tendermint/crypto" ) func getEpochInfoKey(epochNumber uint64) []byte { diff --git a/x/zoneconcierge/keeper/proof_tx_in_block.go b/x/zoneconcierge/keeper/proof_tx_in_block.go index 87c9a8803..89b309926 100644 --- a/x/zoneconcierge/keeper/proof_tx_in_block.go +++ b/x/zoneconcierge/keeper/proof_tx_in_block.go @@ -4,9 +4,9 @@ import ( "crypto/sha256" "fmt" + tmproto "github.com/cometbft/cometbft/proto/tendermint/types" + tmtypes "github.com/cometbft/cometbft/types" sdk "github.com/cosmos/cosmos-sdk/types" - tmproto "github.com/tendermint/tendermint/proto/tendermint/types" - tmtypes "github.com/tendermint/tendermint/types" ) func (k Keeper) ProveTxInBlock(ctx sdk.Context, txHash []byte) (*tmproto.TxProof, error) { diff --git a/x/zoneconcierge/keeper/query_kvstore.go b/x/zoneconcierge/keeper/query_kvstore.go index 3e2eff4a7..cf83a1075 100644 --- a/x/zoneconcierge/keeper/query_kvstore.go +++ b/x/zoneconcierge/keeper/query_kvstore.go @@ -3,10 +3,10 @@ package keeper import ( "fmt" + abci "github.com/cometbft/cometbft/abci/types" + "github.com/cometbft/cometbft/crypto/merkle" + tmcrypto "github.com/cometbft/cometbft/proto/tendermint/crypto" "github.com/cosmos/cosmos-sdk/store/rootmulti" - abci "github.com/tendermint/tendermint/abci/types" - "github.com/tendermint/tendermint/crypto/merkle" - tmcrypto "github.com/tendermint/tendermint/proto/tendermint/crypto" ) // QueryStore queries a KV pair in the KVStore, where diff --git a/x/zoneconcierge/module.go b/x/zoneconcierge/module.go index 333712a53..26ffaf051 100644 --- a/x/zoneconcierge/module.go +++ b/x/zoneconcierge/module.go @@ -8,7 +8,7 @@ import ( "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/spf13/cobra" - abci "github.com/tendermint/tendermint/abci/types" + abci "github.com/cometbft/cometbft/abci/types" "github.com/babylonchain/babylon/x/zoneconcierge/client/cli" "github.com/babylonchain/babylon/x/zoneconcierge/keeper" diff --git a/x/zoneconcierge/module_test.go b/x/zoneconcierge/module_test.go index 9867ecd05..27a531fc7 100644 --- a/x/zoneconcierge/module_test.go +++ b/x/zoneconcierge/module_test.go @@ -7,6 +7,9 @@ import ( "testing" "time" + tmbytes "github.com/cometbft/cometbft/libs/bytes" + tmproto "github.com/cometbft/cometbft/proto/tendermint/types" + tmtypes "github.com/cometbft/cometbft/types" "github.com/cosmos/cosmos-sdk/codec" cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" sdk "github.com/cosmos/cosmos-sdk/types" @@ -21,9 +24,6 @@ import ( ibctestingmock "github.com/cosmos/ibc-go/v7/testing/mock" "github.com/cosmos/ibc-go/v7/testing/simapp" "github.com/stretchr/testify/suite" - tmbytes "github.com/tendermint/tendermint/libs/bytes" - tmproto "github.com/tendermint/tendermint/proto/tendermint/types" - tmtypes "github.com/tendermint/tendermint/types" "github.com/babylonchain/babylon/app" zckeeper "github.com/babylonchain/babylon/x/zoneconcierge/keeper" diff --git a/x/zoneconcierge/types/expected_keepers.go b/x/zoneconcierge/types/expected_keepers.go index 5ecc04428..42d9701b1 100644 --- a/x/zoneconcierge/types/expected_keepers.go +++ b/x/zoneconcierge/types/expected_keepers.go @@ -8,14 +8,14 @@ import ( btcctypes "github.com/babylonchain/babylon/x/btccheckpoint/types" checkpointingtypes "github.com/babylonchain/babylon/x/checkpointing/types" epochingtypes "github.com/babylonchain/babylon/x/epoching/types" + tmcrypto "github.com/cometbft/cometbft/proto/tendermint/crypto" + ctypes "github.com/cometbft/cometbft/rpc/core/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/auth/types" capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types" connectiontypes "github.com/cosmos/ibc-go/v7/modules/core/03-connection/types" channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" ibcexported "github.com/cosmos/ibc-go/v7/modules/core/exported" - tmcrypto "github.com/tendermint/tendermint/proto/tendermint/crypto" - ctypes "github.com/tendermint/tendermint/rpc/core/types" ) // AccountKeeper defines the contract required for account APIs. diff --git a/x/zoneconcierge/types/mocked_keepers.go b/x/zoneconcierge/types/mocked_keepers.go index 90aaeda75..1e3dbed9d 100644 --- a/x/zoneconcierge/types/mocked_keepers.go +++ b/x/zoneconcierge/types/mocked_keepers.go @@ -18,8 +18,8 @@ import ( types6 "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" exported "github.com/cosmos/ibc-go/v7/modules/core/exported" gomock "github.com/golang/mock/gomock" - crypto "github.com/tendermint/tendermint/proto/tendermint/crypto" - coretypes "github.com/tendermint/tendermint/rpc/core/types" + crypto "github.com/cometbft/cometbft/proto/tendermint/crypto" + coretypes "github.com/cometbft/cometbft/rpc/core/types" ) // MockAccountKeeper is a mock of AccountKeeper interface. diff --git a/x/zoneconcierge/types/zoneconcierge.pb.go b/x/zoneconcierge/types/zoneconcierge.pb.go index 2466ccda5..99082b5b2 100644 --- a/x/zoneconcierge/types/zoneconcierge.pb.go +++ b/x/zoneconcierge/types/zoneconcierge.pb.go @@ -7,9 +7,9 @@ import ( fmt "fmt" types2 "github.com/babylonchain/babylon/x/btccheckpoint/types" types1 "github.com/babylonchain/babylon/x/checkpointing/types" + crypto "github.com/cometbft/cometbft/proto/tendermint/crypto" + types "github.com/cometbft/cometbft/proto/tendermint/types" proto "github.com/cosmos/gogoproto/proto" - crypto "github.com/tendermint/tendermint/proto/tendermint/crypto" - types "github.com/tendermint/tendermint/proto/tendermint/types" io "io" math "math" math_bits "math/bits" From 6cbbaae77e8949a2bf02698f37d5f2b612334ec5 Mon Sep 17 00:00:00 2001 From: KonradStaniec Date: Fri, 17 Mar 2023 13:28:37 +0100 Subject: [PATCH 14/59] Bump cosmos-sdk to stable version (#327) --- cmd/babylond/cmd/root.go | 15 ++++++++++ go.mod | 30 ++++++++++---------- go.sum | 60 ++++++++++++++++++++-------------------- proto/buf.lock | 2 +- proto/buf.yaml | 4 +-- 5 files changed, 62 insertions(+), 49 deletions(-) diff --git a/cmd/babylond/cmd/root.go b/cmd/babylond/cmd/root.go index 57c22fdd1..00e76d887 100644 --- a/cmd/babylond/cmd/root.go +++ b/cmd/babylond/cmd/root.go @@ -10,6 +10,8 @@ import ( dbm "github.com/cometbft/cometbft-db" tmcfg "github.com/cometbft/cometbft/config" tmcli "github.com/cometbft/cometbft/libs/cli" + tmtypes "github.com/cometbft/cometbft/types" + "github.com/cometbft/cometbft/libs/log" "github.com/cosmos/cosmos-sdk/baseapp" "github.com/cosmos/cosmos-sdk/client" @@ -235,6 +237,7 @@ type appCreator struct { func (a appCreator) newApp(logger log.Logger, db dbm.DB, traceStore io.Writer, appOpts servertypes.AppOptions) servertypes.Application { var cache sdk.MultiStorePersistentCache + // TODO migrate following option to using server.DefaultBaseappOptions if cast.ToBool(appOpts.Get(server.FlagInterBlockCache)) { cache = store.NewCommitKVStoreCacheManager() } @@ -250,6 +253,17 @@ func (a appCreator) newApp(logger log.Logger, db dbm.DB, traceStore io.Writer, a } homeDir := cast.ToString(appOpts.Get(flags.FlagHome)) + + chainID := cast.ToString(appOpts.Get(flags.FlagChainID)) + if chainID == "" { + // fallback to genesis chain-id + appGenesis, err := tmtypes.GenesisDocFromFile(filepath.Join(homeDir, "config", "genesis.json")) + if err != nil { + panic(err) + } + chainID = appGenesis.ChainID + } + snapshotDir := filepath.Join(homeDir, "data", "snapshots") snapshotDB, err := dbm.NewDB("metadata", server.GetAppDBBackend(appOpts), snapshotDir) @@ -308,6 +322,7 @@ func (a appCreator) newApp(logger log.Logger, db dbm.DB, traceStore io.Writer, a baseapp.SetSnapshot(snapshotStore, snapshotOptions), baseapp.SetIAVLCacheSize(cast.ToInt(appOpts.Get(server.FlagIAVLCacheSize))), baseapp.SetIAVLDisableFastNode(cast.ToBool(appOpts.Get(server.FlagDisableIAVLFastNode))), + baseapp.SetChainID(chainID), ) } diff --git a/go.mod b/go.mod index 2018e06d5..05da22b25 100644 --- a/go.mod +++ b/go.mod @@ -6,8 +6,8 @@ require ( github.com/btcsuite/btcd v0.23.4 github.com/cometbft/cometbft v0.37.0 github.com/cometbft/cometbft-db v0.7.0 - github.com/cosmos/cosmos-sdk v0.47.0-rc3 - github.com/golang/protobuf v1.5.2 + github.com/cosmos/cosmos-sdk v0.47.0 + github.com/golang/protobuf v1.5.3 github.com/gorilla/mux v1.8.0 github.com/grpc-ecosystem/grpc-gateway v1.16.0 github.com/pkg/errors v0.9.1 @@ -25,7 +25,7 @@ require ( require ( cosmossdk.io/api v0.3.1 cosmossdk.io/errors v1.0.0-beta.7 - cosmossdk.io/math v1.0.0-beta.6.0.20230216172121-959ce49135e4 + cosmossdk.io/math v1.0.0-rc.0 cosmossdk.io/tools/rosetta v0.2.1 github.com/boljen/go-bitmap v0.0.0-20151001105940-23cd2fb0ce7d github.com/btcsuite/btcd/btcutil v1.1.2 @@ -35,7 +35,7 @@ require ( github.com/golang/mock v1.6.0 github.com/jinzhu/copier v0.3.5 github.com/ory/dockertest/v3 v3.9.1 - google.golang.org/protobuf v1.28.2-0.20230208135220-49eaa78c6c9c + google.golang.org/protobuf v1.29.1 ) require ( @@ -51,7 +51,7 @@ require ( github.com/confio/ics23/go v0.9.0 // indirect github.com/cosmos/btcutil v1.0.5 // indirect github.com/cosmos/go-bip39 v1.0.0 - github.com/cosmos/iavl v0.20.0-alpha4 // indirect + github.com/cosmos/iavl v0.20.0 // indirect github.com/cosmos/ledger-cosmos-go v0.12.1 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f // indirect @@ -82,7 +82,7 @@ require ( github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jmhodges/levigo v1.0.0 // indirect github.com/keybase/go-keychain v0.0.0-20190712205309-48d3d31d256d // indirect - github.com/klauspost/compress v1.15.15 // indirect + github.com/klauspost/compress v1.16.3 // indirect github.com/lib/pq v1.10.7 // indirect github.com/libp2p/go-buffer-pool v0.1.0 // indirect github.com/magiconair/properties v1.8.7 // indirect @@ -108,11 +108,11 @@ require ( github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect github.com/tendermint/go-amino v0.16.0 // indirect github.com/zondax/hid v0.9.1 // indirect - go.etcd.io/bbolt v1.3.6 // indirect - golang.org/x/crypto v0.6.0 // indirect - golang.org/x/sys v0.5.0 // indirect - golang.org/x/term v0.5.0 // indirect - golang.org/x/text v0.7.0 // indirect + go.etcd.io/bbolt v1.3.7 // indirect + golang.org/x/crypto v0.7.0 // indirect + golang.org/x/sys v0.6.0 // indirect + golang.org/x/term v0.6.0 // indirect + golang.org/x/text v0.8.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect nhooyr.io/websocket v1.8.6 // indirect ) @@ -151,7 +151,7 @@ require ( github.com/felixge/httpsnoop v1.0.2 // indirect github.com/gogo/googleapis v1.4.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/glog v1.0.0 // indirect + github.com/golang/glog v1.1.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/google/go-cmp v0.5.9 // indirect github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect @@ -185,9 +185,9 @@ require ( github.com/xeipuuv/gojsonschema v1.2.0 // indirect github.com/zondax/ledger-go v0.14.1 // indirect go.opencensus.io v0.24.0 // indirect - golang.org/x/exp v0.0.0-20230213192124-5e25df0256eb // indirect + golang.org/x/exp v0.0.0-20230310171629-522b1b587ee0 // indirect golang.org/x/mod v0.8.0 // indirect - golang.org/x/net v0.7.0 // indirect + golang.org/x/net v0.8.0 // indirect golang.org/x/oauth2 v0.5.0 // indirect golang.org/x/tools v0.6.0 // indirect golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect @@ -203,7 +203,7 @@ replace ( // slay the dragonberry github.com/confio/ics23/go => github.com/cosmos/cosmos-sdk/ics23/go v0.8.0 - github.com/cosmos/ibc-go/v7 => github.com/babylonchain/ibc-go/v7 v7.0.0-20230308120348-6dd688ac57a6 + github.com/cosmos/ibc-go/v7 => github.com/babylonchain/ibc-go/v7 v7.0.0-20230317081654-61da7c3b41b6 // Fix upstream GHSA-h395-qcrw-5vmq vulnerability. // TODO Remove it: https://github.com/cosmos/cosmos-sdk/issues/10409 diff --git a/go.sum b/go.sum index 9502eb04b..0afbde3ed 100644 --- a/go.sum +++ b/go.sum @@ -196,8 +196,8 @@ cosmossdk.io/depinject v1.0.0-alpha.3 h1:6evFIgj//Y3w09bqOUOzEpFj5tsxBqdc5CfkO7z cosmossdk.io/depinject v1.0.0-alpha.3/go.mod h1:eRbcdQ7MRpIPEM5YUJh8k97nxHpYbc3sMUnEtt8HPWU= cosmossdk.io/errors v1.0.0-beta.7 h1:gypHW76pTQGVnHKo6QBkb4yFOJjC+sUGRc5Al3Odj1w= cosmossdk.io/errors v1.0.0-beta.7/go.mod h1:mz6FQMJRku4bY7aqS/Gwfcmr/ue91roMEKAmDUDpBfE= -cosmossdk.io/math v1.0.0-beta.6.0.20230216172121-959ce49135e4 h1:/jnzJ9zFsL7qkV8LCQ1JH3dYHh2EsKZ3k8Mr6AqqiOA= -cosmossdk.io/math v1.0.0-beta.6.0.20230216172121-959ce49135e4/go.mod h1:gUVtWwIzfSXqcOT+lBVz2jyjfua8DoBdzRsIyaUAT/8= +cosmossdk.io/math v1.0.0-rc.0 h1:ml46ukocrAAoBpYKMidF0R2tQJ1Uxfns0yH8wqgMAFc= +cosmossdk.io/math v1.0.0-rc.0/go.mod h1:Ygz4wBHrgc7g0N+8+MrnTfS9LLn9aaTGa9hKopuym5k= cosmossdk.io/tools/rosetta v0.2.1 h1:ddOMatOH+pbxWbrGJKRAawdBkPYLfKXutK9IETnjYxw= cosmossdk.io/tools/rosetta v0.2.1/go.mod h1:Pqdc1FdvkNV3LcNIkYWt2RQY6IP1ge6YWZk8MhhO9Hw= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= @@ -246,8 +246,8 @@ github.com/aws/aws-sdk-go v1.44.122/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX github.com/aws/aws-sdk-go v1.44.203 h1:pcsP805b9acL3wUqa4JR2vg1k2wnItkDYNvfmcy6F+U= github.com/aws/aws-sdk-go v1.44.203/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= -github.com/babylonchain/ibc-go/v7 v7.0.0-20230308120348-6dd688ac57a6 h1:0A0nig5Xm4Yjh8RjswgtMQzEW66qsxrKtvPiSiBRcnw= -github.com/babylonchain/ibc-go/v7 v7.0.0-20230308120348-6dd688ac57a6/go.mod h1:wpKGb+lqAnxwThgS3LoCPgDEFNAPVX+1YIQCAJcePcM= +github.com/babylonchain/ibc-go/v7 v7.0.0-20230317081654-61da7c3b41b6 h1:F41qzSK1VF6ZZqu+Xv3U9pHOYbJOSaWrw1iv8LeFsbg= +github.com/babylonchain/ibc-go/v7 v7.0.0-20230317081654-61da7c3b41b6/go.mod h1:BFh8nKWjr5zeR2OZfhkzdgDzj1+KjRn3aJLpwapStj8= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= @@ -346,8 +346,8 @@ github.com/cosmos/btcutil v1.0.5 h1:t+ZFcX77LpKtDBhjucvnOH8C2l2ioGsBNEQ3jef8xFk= github.com/cosmos/btcutil v1.0.5/go.mod h1:IyB7iuqZMJlthe2tkIFL33xPyzbFYP0XVdS8P5lUPis= github.com/cosmos/cosmos-proto v1.0.0-beta.2 h1:X3OKvWgK9Gsejo0F1qs5l8Qn6xJV/AzgIWR2wZ8Nua8= github.com/cosmos/cosmos-proto v1.0.0-beta.2/go.mod h1:+XRCLJ14pr5HFEHIUcn51IKXD1Fy3rkEQqt4WqmN4V0= -github.com/cosmos/cosmos-sdk v0.47.0-rc3 h1:MMun/+mMpzise9d85csTp+kGkhLCkjJLwLK0urp0Bcs= -github.com/cosmos/cosmos-sdk v0.47.0-rc3/go.mod h1:GlXjIIIsIZAD5CPqm7FHtr3v5/anE9eXWDjSWdNmznw= +github.com/cosmos/cosmos-sdk v0.47.0 h1:GKYtBpvjwuDEVix1vdnQpq7PuEOnItuEK0vdAL2cZ5g= +github.com/cosmos/cosmos-sdk v0.47.0/go.mod h1:FTtZbqiHCZ2vun9WrPq6qLQafNKkAuIhLAxzLjr2TiI= github.com/cosmos/cosmos-sdk/ics23/go v0.8.0 h1:iKclrn3YEOwk4jQHT2ulgzuXyxmzmPczUalMwW4XH9k= github.com/cosmos/cosmos-sdk/ics23/go v0.8.0/go.mod h1:2a4dBq88TUoqoWAU5eu0lGvpFP3wWDPgdHPargtyw30= github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d/go.mod h1:tSxLoYXyBmiFeKpvmq4dzayMdCjCnu8uqmCysIGBT2Y= @@ -358,8 +358,8 @@ github.com/cosmos/gogogateway v1.2.0/go.mod h1:iQpLkGWxYcnCdz5iAdLcRBSw3h7NXeOkZ github.com/cosmos/gogoproto v1.4.2/go.mod h1:cLxOsn1ljAHSV527CHOtaIP91kK6cCrZETRBrkzItWU= github.com/cosmos/gogoproto v1.4.6 h1:Ee7z15dWJaGlgM2rWrK8N2IX7PQcuccu8oG68jp5RL4= github.com/cosmos/gogoproto v1.4.6/go.mod h1:VS/ASYmPgv6zkPKLjR9EB91lwbLHOzaGCirmKKhncfI= -github.com/cosmos/iavl v0.20.0-alpha4 h1:49SZoxNwah5nqbVE1da8BAhenC7HMSVOTZ0XKVhZpOE= -github.com/cosmos/iavl v0.20.0-alpha4/go.mod h1:WO7FyvaZJoH65+HFOsDir7xU9FWk2w9cHXNW1XHcl7A= +github.com/cosmos/iavl v0.20.0 h1:fTVznVlepH0KK8NyKq8w+U7c2L6jofa27aFX6YGlm38= +github.com/cosmos/iavl v0.20.0/go.mod h1:WO7FyvaZJoH65+HFOsDir7xU9FWk2w9cHXNW1XHcl7A= github.com/cosmos/ics23/go v0.9.1-0.20221207100636-b1abd8678aab h1:I9ialKTQo7248V827Bba4OuKPmk+FPzmTVHsLXaIJWw= github.com/cosmos/ics23/go v0.9.1-0.20221207100636-b1abd8678aab/go.mod h1:2CwqasX5dSD7Hbp/9b6lhK6BwoBDCBldx7gPKRukR60= github.com/cosmos/keyring v1.1.7-0.20210622111912-ef00f8ac3d76 h1:DdzS1m6o/pCqeZ8VOAit/gyATedRgjvkVI+UCrLpyuU= @@ -501,8 +501,8 @@ github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXP github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.0.0 h1:nfP3RFugxnNRyKgeWd4oI1nYvXpxrx8ck8ZrcizshdQ= -github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= +github.com/golang/glog v1.1.0 h1:/d3pCKDPWNnvIWe0vVUpNP32qc8U3PDVxySP/y360qE= +github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -536,8 +536,9 @@ github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= -github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= @@ -734,8 +735,8 @@ github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYs github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= github.com/klauspost/compress v1.15.11/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= -github.com/klauspost/compress v1.15.15 h1:EF27CXIuDsYJ6mmvtBRlEuB2UVOqHG1tAXgZ7yIO+lw= -github.com/klauspost/compress v1.15.15/go.mod h1:ZcK2JAFqKOpnBlxcLsJzYfrS9X1akm9fHZNnD9+Vo/4= +github.com/klauspost/compress v1.16.3 h1:XuJt9zzcnaz6a16/OU53ZjWp/v7/42WcR5t2a0PcNQY= +github.com/klauspost/compress v1.16.3/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= @@ -1029,8 +1030,8 @@ github.com/zondax/hid v0.9.1/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWp github.com/zondax/ledger-go v0.14.1 h1:Pip65OOl4iJ84WTpA4BKChvOufMhhbxED3BaihoZN4c= github.com/zondax/ledger-go v0.14.1/go.mod h1:fZ3Dqg6qcdXWSOJFKMG8GCTnD7slO/RL2feOQv8K320= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.6 h1:/ecaJf0sk1l4l6V4awd65v2C3ILy7MSj+s/x1ADCIMU= -go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= +go.etcd.io/bbolt v1.3.7 h1:j+zJOnnEjF/kyHlDDgGnVL/AIqIJPq8UoB2GSNfkUfQ= +go.etcd.io/bbolt v1.3.7/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= @@ -1067,8 +1068,8 @@ golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.6.0 h1:qfktjS5LUO+fFKeJXZ+ikTRijMmljikvG68fpMMruSc= -golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= +golang.org/x/crypto v0.7.0 h1:AvwMYaRytfdeVt3u6mLaxYtErKYjxA2OXjJ1HHq6t3A= +golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -1080,8 +1081,8 @@ golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= -golang.org/x/exp v0.0.0-20230213192124-5e25df0256eb h1:PaBZQdo+iSDyHT053FjUCgZQ/9uqVwPOcl7KSWhKn6w= -golang.org/x/exp v0.0.0-20230213192124-5e25df0256eb/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= +golang.org/x/exp v0.0.0-20230310171629-522b1b587ee0 h1:LGJsf5LRplCck6jUCH3dBL2dmycNruWNF5xugkSlfXw= +golang.org/x/exp v0.0.0-20230310171629-522b1b587ee0/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -1171,8 +1172,8 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= -golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= -golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= +golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1268,7 +1269,6 @@ golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1320,13 +1320,13 @@ golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.5.0 h1:n2a8QNdAb0sZNpU9R1ALUXBbY+w51fCQDN+7EdxNBsY= -golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.6.0 h1:clScbb1cHjoCkyRbWwBEUZ5H/tIFu5TAXIqaZD0Gcjw= +golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1337,8 +1337,8 @@ golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68= +golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1645,8 +1645,8 @@ google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.28.2-0.20230208135220-49eaa78c6c9c h1:gDe3xeLH/W6iv5d9xQBo6IwJbCdVcZRiV8xuix6FJW8= -google.golang.org/protobuf v1.28.2-0.20230208135220-49eaa78c6c9c/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.29.1 h1:7QBf+IK2gx70Ap/hDsOmam3GE0v9HicjfEdAxE62UoM= +google.golang.org/protobuf v1.29.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/proto/buf.lock b/proto/buf.lock index a279b8358..baf8c2e97 100644 --- a/proto/buf.lock +++ b/proto/buf.lock @@ -8,7 +8,7 @@ deps: - remote: buf.build owner: cosmos repository: cosmos-sdk - commit: 2aa7ff2b23df473a85b7a7fe1884105d + commit: 954f7b05f38440fc8250134b15adec47 - remote: buf.build owner: cosmos repository: gogo-proto diff --git a/proto/buf.yaml b/proto/buf.yaml index 5788886cf..7bad8beca 100644 --- a/proto/buf.yaml +++ b/proto/buf.yaml @@ -1,9 +1,7 @@ version: v1 name: buf.build/babylon/babylond deps: - # TODO: update sdk buf dependency when v0.47.0 is tagged and pushed to BSR - # see: (https://github.com/cosmos/cosmos-sdk/tree/main/proto#sdk-x-buf) - - buf.build/cosmos/cosmos-sdk:2aa7ff2b23df473a85b7a7fe1884105d + - buf.build/cosmos/cosmos-sdk:v0.47.0 - buf.build/cosmos/cosmos-proto:1935555c206d4afb9e94615dfd0fad31 - buf.build/cosmos/gogo-proto:a14993478f40695898ed8a86931094b6656e8a5d - buf.build/googleapis/googleapis:8d7204855ec14631a499bd7393ce1970 From d66cb05f6e97d806353167d90cb9ef3c26c2b83d Mon Sep 17 00:00:00 2001 From: Filippos Malandrakis <35352222+philmln@users.noreply.github.com> Date: Fri, 17 Mar 2023 15:48:10 +0200 Subject: [PATCH 15/59] CI: Build and push Docker image to ECR (#328) --- .circleci/config.yml | 58 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index 1dc98b5c2..13e8fa794 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -2,6 +2,9 @@ # See: https://circleci.com/docs/2.0/configuration-reference version: 2.1 +orbs: + aws-ecr: circleci/aws-ecr@8.2.1 + # Define a job to be invoked later in a workflow. # See: https://circleci.com/docs/2.0/configuration-reference/#jobs jobs: @@ -51,6 +54,48 @@ jobs: # command: | # make test-e2e + build_docker: + machine: + image: ubuntu-2204:2022.10.1 + resource_class: large + steps: + - checkout + - aws-ecr/build-image: + push-image: false + dockerfile: Dockerfile + path: ./contrib/images/babylond-env/ + build-path: ./ + tag: "$CIRCLE_SHA1,$CIRCLE_TAG" + repo: "babylond" + - run: + name: Save Docker image to export it to workspace + command: | + docker save $(docker image ls --format '{{.Repository}}:{{.Tag}}') > /tmp/babylond.tar + - persist_to_workspace: + root: /tmp + paths: + - babylond.tar + + push_docker: + machine: + image: ubuntu-2204:2022.10.1 + resource_class: large + steps: + - attach_workspace: + at: /tmp + - run: + name: Load Docker image from workspace + command: | + docker load -i /tmp/babylond.tar + - aws-ecr/ecr-login: + aws-access-key-id: AWS_ACCESS_KEY_ID + aws-secret-access-key: AWS_SECRET_ACCESS_KEY + region: "$AWS_REGION" + - aws-ecr/push-image: + registry-id: AWS_ECR_REGISTRY_ID + region: "$AWS_REGION" + repo: "babylond" + tag: "$CIRCLE_SHA1,$CIRCLE_TAG" # Invoke jobs via workflows # See: https://circleci.com/docs/2.0/configuration-reference/#workflows @@ -58,3 +103,16 @@ workflows: build-lint-test: jobs: - build + - build_docker: + filters: + tags: + only: /.*/ + - push_docker: + requires: + - build_docker + filters: + tags: + only: /.*/ + branches: + only: + - main From d16bea8254aad7b471b9e7ee4c139b3282f91588 Mon Sep 17 00:00:00 2001 From: Vitalis Salis Date: Mon, 20 Mar 2023 12:06:31 +0300 Subject: [PATCH 16/59] proto-lint: Add comments to btclightclient and checkpointing proto files (#329) --- proto/babylon/btclightclient/v1/btclightclient.proto | 6 ++++++ proto/babylon/btclightclient/v1/query.proto | 5 +++++ proto/babylon/btclightclient/v1/tx.proto | 3 +++ proto/babylon/checkpointing/v1/checkpoint.proto | 3 ++- proto/babylon/checkpointing/v1/events.proto | 7 +++++++ proto/babylon/checkpointing/v1/genesis.proto | 2 ++ proto/babylon/checkpointing/v1/query.proto | 4 ++++ 7 files changed, 29 insertions(+), 1 deletion(-) diff --git a/proto/babylon/btclightclient/v1/btclightclient.proto b/proto/babylon/btclightclient/v1/btclightclient.proto index 86b3e78f0..3592ade2f 100644 --- a/proto/babylon/btclightclient/v1/btclightclient.proto +++ b/proto/babylon/btclightclient/v1/btclightclient.proto @@ -5,6 +5,12 @@ import "gogoproto/gogo.proto"; option go_package = "github.com/babylonchain/babylon/x/btclightclient/types"; +// BTCHeaderInfo is a structure that contains all relevant information about a BTC header +// - Full header bytes +// - Header hash for easy retrieval +// - Height of the header in the BTC chain +// - Total work spent on the header. This is the sum of the work corresponding to the header Bits field +// and the total work of the header. message BTCHeaderInfo { bytes header = 1 [ (gogoproto.customtype) = diff --git a/proto/babylon/btclightclient/v1/query.proto b/proto/babylon/btclightclient/v1/query.proto index 27cf155c8..8df7a5f71 100644 --- a/proto/babylon/btclightclient/v1/query.proto +++ b/proto/babylon/btclightclient/v1/query.proto @@ -45,6 +45,7 @@ service Query { option (google.api.http).get = "/babylon/btclightclient/v1/tip"; } + // BaseHeader returns the base BTC header of the chain. This header is defined on genesis. rpc BaseHeader(QueryBaseHeaderRequest) returns (QueryBaseHeaderResponse) { option (google.api.http).get = "/babylon/btclightclient/v1/baseheader"; } @@ -104,10 +105,14 @@ message QueryMainChainResponse { cosmos.base.query.v1beta1.PageResponse pagination = 2; } +// QueryTipRequest is the request type for the Query/Tip RPC method. message QueryTipRequest {} +// QueryTipResponse is the response type for the Query/Tip RPC method. message QueryTipResponse { BTCHeaderInfo header = 1; } +// QueryBaseHeaderRequest is the request type for the Query/BaseHeader RPC method. message QueryBaseHeaderRequest {} +// QueryBaseHeaderResponse is the response type for the Query/BaseHeader RPC method. message QueryBaseHeaderResponse { BTCHeaderInfo header = 1; } diff --git a/proto/babylon/btclightclient/v1/tx.proto b/proto/babylon/btclightclient/v1/tx.proto index 4d8605a8f..287d1d2ed 100644 --- a/proto/babylon/btclightclient/v1/tx.proto +++ b/proto/babylon/btclightclient/v1/tx.proto @@ -7,6 +7,7 @@ option go_package = "github.com/babylonchain/babylon/x/btclightclient/types"; // Msg defines the Msg service. service Msg { + // InsertHeader adds a header to the BTC light client chain maintained by Babylon. rpc InsertHeader(MsgInsertHeader) returns (MsgInsertHeaderResponse) {}; } @@ -17,4 +18,6 @@ message MsgInsertHeader { [ (gogoproto.customtype) = "github.com/babylonchain/babylon/types.BTCHeaderBytes" ]; } + +// MsgInsertHeaderResponse defines the response for the InsertHeader transaction message MsgInsertHeaderResponse {} diff --git a/proto/babylon/checkpointing/v1/checkpoint.proto b/proto/babylon/checkpointing/v1/checkpoint.proto index 6f32d186a..909450708 100644 --- a/proto/babylon/checkpointing/v1/checkpoint.proto +++ b/proto/babylon/checkpointing/v1/checkpoint.proto @@ -43,7 +43,7 @@ message RawCheckpointWithMeta { repeated CheckpointStateUpdate lifecycle = 5; } -// CkptStatus is the status of a checkpoint. +// CheckpointStatus is the status of a checkpoint. enum CheckpointStatus { option (gogoproto.goproto_enum_prefix) = false; @@ -60,6 +60,7 @@ enum CheckpointStatus { CKPT_STATUS_FINALIZED = 4 [ (gogoproto.enumvalue_customname) = "Finalized" ]; } +// CheckpointStateUpdate defines a state transition on the checkpoint. message CheckpointStateUpdate { option (gogoproto.equal) = true; diff --git a/proto/babylon/checkpointing/v1/events.proto b/proto/babylon/checkpointing/v1/events.proto index 59712f713..dce0ac995 100644 --- a/proto/babylon/checkpointing/v1/events.proto +++ b/proto/babylon/checkpointing/v1/events.proto @@ -5,18 +5,25 @@ import "babylon/checkpointing/v1/checkpoint.proto"; option go_package = "github.com/babylonchain/babylon/x/checkpointing/types"; +// EventCheckpointAccumulating is emitted when a checkpoint reaches the `Accumulating` state. message EventCheckpointAccumulating { RawCheckpointWithMeta checkpoint = 1; } +// EventCheckpointSealed is emitted when a checkpoint reaches the `Sealed` state. message EventCheckpointSealed { RawCheckpointWithMeta checkpoint = 1; } +// EventCheckpointSubmitted is emitted when a checkpoint reaches the `Submitted` state. message EventCheckpointSubmitted { RawCheckpointWithMeta checkpoint = 1; } +// EventCheckpointConfirmed is emitted when a checkpoint reaches the `Confirmed` state. message EventCheckpointConfirmed { RawCheckpointWithMeta checkpoint = 1; } +// EventCheckpointFinalized is emitted when a checkpoint reaches the `Finalized` state. message EventCheckpointFinalized { RawCheckpointWithMeta checkpoint = 1; } +// EventCheckpointForgotten is emitted when a checkpoint switches to a `Forgotten` state. message EventCheckpointForgotten { RawCheckpointWithMeta checkpoint = 1; } +// EventConflictingCheckpoint is emitted when two conflicting checkpoints are found. message EventConflictingCheckpoint { RawCheckpoint conflicting_checkpoint = 1; RawCheckpointWithMeta local_checkpoint = 2; diff --git a/proto/babylon/checkpointing/v1/genesis.proto b/proto/babylon/checkpointing/v1/genesis.proto index 82c31669f..df394cebf 100644 --- a/proto/babylon/checkpointing/v1/genesis.proto +++ b/proto/babylon/checkpointing/v1/genesis.proto @@ -13,9 +13,11 @@ message GenesisState { // params defines all the paramaters of related to checkpointing Params params = 1 [ (gogoproto.nullable) = false ]; + // genesis_keys defines the public keys for the genesis validators repeated GenesisKey genesis_keys = 2; } +// GenesisKey defines public key information about the genesis validators message GenesisKey { // validator_address is the address corresponding to a validator string validator_address = 1; diff --git a/proto/babylon/checkpointing/v1/query.proto b/proto/babylon/checkpointing/v1/query.proto index 379f049f4..79301f805 100644 --- a/proto/babylon/checkpointing/v1/query.proto +++ b/proto/babylon/checkpointing/v1/query.proto @@ -136,8 +136,12 @@ message QueryRecentEpochStatusCountResponse { map status_count = 3; } +// QueryLastCheckpointWithStatusRequest is the request type for the +// Query/LastCheckpointWithStatus RPC method. message QueryLastCheckpointWithStatusRequest { CheckpointStatus status = 1; } +// QueryLastCheckpointWithStatusResponse is the response type for the +// Query/LastCheckpointWithStatus RPC method. message QueryLastCheckpointWithStatusResponse { RawCheckpoint raw_checkpoint = 1; } From d965ccfe4a1fa5fce93d76b1b0726cc8251f7e82 Mon Sep 17 00:00:00 2001 From: KonradStaniec Date: Mon, 20 Mar 2023 10:53:47 +0100 Subject: [PATCH 17/59] Fix proto linter comments in btccheckpoint and monitor (#330) * Fix proto linter comments in btccheckpoint and monitor modules --- proto/babylon/btccheckpoint/v1/btccheckpoint.proto | 5 +++++ proto/babylon/btccheckpoint/v1/query.proto | 4 ++++ proto/babylon/btccheckpoint/v1/tx.proto | 3 +++ proto/babylon/monitor/v1/query.proto | 8 ++++++++ 4 files changed, 20 insertions(+) diff --git a/proto/babylon/btccheckpoint/v1/btccheckpoint.proto b/proto/babylon/btccheckpoint/v1/btccheckpoint.proto index ca235b5b3..c174a898a 100644 --- a/proto/babylon/btccheckpoint/v1/btccheckpoint.proto +++ b/proto/babylon/btccheckpoint/v1/btccheckpoint.proto @@ -57,6 +57,7 @@ message TransactionKey { // so there should be other strong arguments for this optimization message SubmissionKey { repeated TransactionKey key = 1; } +// BtcStatus is an enum describing the current btc status of the checkpoint enum BtcStatus { option (gogoproto.goproto_enum_prefix) = false; // SUBMITTED Epoch has Submitted btc status if there ever was at least one @@ -119,6 +120,9 @@ message EpochData { BtcStatus status = 2; } +// CheckpointAddresses contains the addresses of the submitter and reporter of a given checkpoint +// submitter is the address of the submitter of the checkpoint to BTC +// reporter is the address of the submitter of the MsgInsertBTCSpvProof message to Babylon message CheckpointAddresses { // TODO: this could probably be better typed // Address of the checkpoint submitter, extracted from the checkpoint itself. @@ -128,6 +132,7 @@ message CheckpointAddresses { bytes reporter = 2; } +// BTCCheckpointInfo contains all checkpoint related data expected in a query response. message BTCCheckpointInfo { // epoch number of this checkpoint uint64 epoch_number = 1; diff --git a/proto/babylon/btccheckpoint/v1/query.proto b/proto/babylon/btccheckpoint/v1/query.proto index b4c4240c8..ac4e75c06 100644 --- a/proto/babylon/btccheckpoint/v1/query.proto +++ b/proto/babylon/btccheckpoint/v1/query.proto @@ -28,6 +28,7 @@ service Query { option (google.api.http).get = "/babylon/btccheckpoint/v1"; } + // EpochSubmissions returns all submissions for a given epoch rpc EpochSubmissions(QueryEpochSubmissionsRequest) returns (QueryEpochSubmissionsResponse) { option (google.api.http).get = @@ -44,6 +45,7 @@ message QueryParamsResponse { Params params = 1 [ (gogoproto.nullable) = false ]; } +// QueryBtcCheckpointInfoRequest defines the query to get the best checkpoint for a given epoch message QueryBtcCheckpointInfoRequest { // Number of epoch for which the earliest checkpointing btc height is // requested @@ -69,6 +71,7 @@ message QueryBtcCheckpointsInfoResponse { cosmos.base.query.v1beta1.PageResponse pagination = 2; } +// QueryEpochSubmissionsRequest defines a request to get all submissions in given epoch message QueryEpochSubmissionsRequest { // Number of epoch for which submissions are requested uint64 epoch_num = 1; @@ -76,6 +79,7 @@ message QueryEpochSubmissionsRequest { cosmos.base.query.v1beta1.PageRequest pagination = 2; } +// QueryEpochSubmissionsResponse defines a response to get all submissions in given epoch (QueryEpochSubmissionsRequest) message QueryEpochSubmissionsResponse { // All submissions saved during an epoch. repeated SubmissionKey keys = 1; diff --git a/proto/babylon/btccheckpoint/v1/tx.proto b/proto/babylon/btccheckpoint/v1/tx.proto index 7d3290fe0..203356e02 100644 --- a/proto/babylon/btccheckpoint/v1/tx.proto +++ b/proto/babylon/btccheckpoint/v1/tx.proto @@ -7,13 +7,16 @@ option go_package = "github.com/babylonchain/babylon/x/btccheckpoint/types"; // Msg defines the Msg service. service Msg { + // InsertBTCSpvProof tries to insert a new checkpoint into the store. rpc InsertBTCSpvProof(MsgInsertBTCSpvProof) returns (MsgInsertBTCSpvProofResponse); } +// MsgInsertBTCSpvProof defines resquest to insert a new checkpoint into the store message MsgInsertBTCSpvProof { string submitter = 1; repeated babylon.btccheckpoint.v1.BTCSpvProof proofs = 2; } +// MsgInsertBTCSpvProofResponse defines the response for the MsgInsertBTCSpvProof message message MsgInsertBTCSpvProofResponse {} diff --git a/proto/babylon/monitor/v1/query.proto b/proto/babylon/monitor/v1/query.proto index c7e0014d2..2c94f4f96 100644 --- a/proto/babylon/monitor/v1/query.proto +++ b/proto/babylon/monitor/v1/query.proto @@ -39,18 +39,26 @@ message QueryParamsResponse { Params params = 1 [ (gogoproto.nullable) = false ]; } +// QueryEndedEpochBtcHeightRequest defines a query type for EndedEpochBtcHeight +// RPC method message QueryEndedEpochBtcHeightRequest { uint64 epoch_num = 1; } +// QueryEndedEpochBtcHeightResponse defines a response type for EndedEpochBtcHeight +// RPC method message QueryEndedEpochBtcHeightResponse { // height of btc light client when epoch ended uint64 btc_light_client_height = 1; } +// QueryReportedCheckpointBtcHeightRequest defines a query type for ReportedCheckpointBtcHeight +// RPC method message QueryReportedCheckpointBtcHeightRequest { // ckpt_hash is hex encoded byte string of the hash of the checkpoint string ckpt_hash = 1; } +// QueryReportedCheckpointBtcHeightResponse defines a response type for ReportedCheckpointBtcHeight +// RPC method message QueryReportedCheckpointBtcHeightResponse { // height of btc light client when checkpoint is reported uint64 btc_light_client_height = 1; From 82ac266cdc745b8b0448deb99a08218b4db44903 Mon Sep 17 00:00:00 2001 From: Runchao Han Date: Tue, 21 Mar 2023 17:56:17 +1100 Subject: [PATCH 18/59] proto: fix proto-linter comments for epoching/zoneconcierge (#331) --- client/docs/swagger-ui/swagger.yaml | 560 ++++++++++++++---- .../btccheckpoint/v1/btccheckpoint.proto | 15 +- proto/babylon/btccheckpoint/v1/query.proto | 9 +- proto/babylon/btccheckpoint/v1/tx.proto | 6 +- .../btclightclient/v1/btclightclient.proto | 6 +- proto/babylon/btclightclient/v1/query.proto | 9 +- proto/babylon/btclightclient/v1/tx.proto | 3 +- proto/babylon/checkpointing/v1/events.proto | 21 +- proto/babylon/epoching/v1/epoching.proto | 17 + proto/babylon/epoching/v1/events.proto | 12 + proto/babylon/epoching/v1/query.proto | 16 + proto/babylon/epoching/v1/tx.proto | 12 + proto/babylon/monitor/v1/query.proto | 12 +- proto/babylon/zoneconcierge/v1/packet.proto | 5 + proto/buf.yaml | 11 +- x/btccheckpoint/types/btccheckpoint.pb.go | 12 +- x/btccheckpoint/types/query.pb.go | 8 + x/btccheckpoint/types/tx.pb.go | 6 + x/btclightclient/types/btclightclient.pb.go | 8 + x/btclightclient/types/query.pb.go | 10 + x/btclightclient/types/tx.pb.go | 5 + x/checkpointing/types/checkpoint.pb.go | 3 +- x/checkpointing/types/events.pb.go | 14 + x/checkpointing/types/genesis.pb.go | 4 +- x/checkpointing/types/query.pb.go | 4 + x/epoching/types/epoching.pb.go | 25 +- x/epoching/types/events.pb.go | 12 + x/epoching/types/query.pb.go | 16 + x/epoching/types/tx.pb.go | 9 + x/monitor/types/query.pb.go | 8 + x/zoneconcierge/types/packet.pb.go | 6 + 31 files changed, 704 insertions(+), 160 deletions(-) diff --git a/client/docs/swagger-ui/swagger.yaml b/client/docs/swagger-ui/swagger.yaml index acc8ec4af..c3c31aa5b 100644 --- a/client/docs/swagger-ui/swagger.yaml +++ b/client/docs/swagger-ui/swagger.yaml @@ -108,17 +108,30 @@ paths: description: >- TODO: this could probably be better typed - Address of the checkpoint submitter, extracted - from the checkpoint itself. + submitter is the address of the checkpoint + submitter to BTC, extracted from + + the checkpoint itself. reporter: type: string format: byte title: >- - Address of the reporter which reported the - submissions, calculated from + reporter is the address of the reporter who + reported the submissions, + + calculated from submission message + MsgInsertBTCSpvProof itself + title: >- + CheckpointAddresses contains the addresses of the + submitter and reporter of a - submission message MsgInsertBTCSpvProof itself + given checkpoint title: list of vigilantes' addresses + description: >- + BTCCheckpointInfo contains all checkpoint related data + expected in a query + + response. pagination: title: pagination defines the pagination in the response type: object @@ -400,17 +413,30 @@ paths: description: >- TODO: this could probably be better typed - Address of the checkpoint submitter, extracted from + submitter is the address of the checkpoint submitter + to BTC, extracted from + the checkpoint itself. reporter: type: string format: byte title: >- - Address of the reporter which reported the - submissions, calculated from + reporter is the address of the reporter who reported + the submissions, + + calculated from submission message + MsgInsertBTCSpvProof itself + title: >- + CheckpointAddresses contains the addresses of the + submitter and reporter of a - submission message MsgInsertBTCSpvProof itself + given checkpoint title: list of vigilantes' addresses + description: >- + BTCCheckpointInfo contains all checkpoint related data + expected in a query + + response. title: |- QueryBtcCheckpointInfoResponse is response type for the Query/BtcCheckpointInfo RPC method @@ -449,6 +475,7 @@ paths: - Query /babylon/btccheckpoint/v1/{epoch_num}/submissions: get: + summary: EpochSubmissions returns all submissions for a given epoch operationId: EpochSubmissions responses: '200': @@ -527,6 +554,11 @@ paths: repeated Bar results = 1; PageResponse page = 2; } + title: >- + QueryEpochSubmissionsResponse defines a response to get all + submissions in + + given epoch (QueryEpochSubmissionsRequest) default: description: An unexpected error response. schema: @@ -616,6 +648,11 @@ paths: - Query /babylon/btclightclient/v1/baseheader: get: + summary: >- + BaseHeader returns the base BTC header of the chain. This header is + defined + + on genesis. operationId: BaseHeader responses: '200': @@ -638,6 +675,22 @@ paths: work: type: string format: byte + description: >- + BTCHeaderInfo is a structure that contains all relevant + information about a + + BTC header + - Full header bytes + - Header hash for easy retrieval + - Height of the header in the BTC chain + - Total work spent on the header. This is the sum of the work corresponding + to the header Bits field + and the total work of the header. + description: >- + QueryBaseHeaderResponse is the response type for the + Query/BaseHeader RPC + + method. default: description: An unexpected error response. schema: @@ -912,6 +965,17 @@ paths: work: type: string format: byte + description: >- + BTCHeaderInfo is a structure that contains all relevant + information about a + + BTC header + - Full header bytes + - Header hash for easy retrieval + - Height of the header in the BTC chain + - Total work spent on the header. This is the sum of the work corresponding + to the header Bits field + and the total work of the header. pagination: type: object properties: @@ -1089,6 +1153,20 @@ paths: work: type: string format: byte + description: >- + BTCHeaderInfo is a structure that contains all relevant + information about a + + BTC header + - Full header bytes + - Header hash for easy retrieval + - Height of the header in the BTC chain + - Total work spent on the header. This is the sum of the work corresponding + to the header Bits field + and the total work of the header. + description: >- + QueryTipResponse is the response type for the Query/Tip RPC + method. default: description: An unexpected error response. schema: @@ -1358,6 +1436,16 @@ paths: - UNBONDED - REMOVED default: CREATED + description: >- + - CREATED: CREATED is when the validator/delegation + has been created + - BONDED: CREATED is when the validator/delegation has become bonded + - UNBONDING: CREATED is when the validator/delegation has become unbonding + - UNBONDED: CREATED is when the validator/delegation has become unbonded + - REMOVED: CREATED is when the validator/delegation has been removed + title: >- + BondState is the bond state of a validator or + delegation val_addr: type: string block_height: @@ -1366,6 +1454,19 @@ paths: block_time: type: string format: date-time + title: >- + DelegationStateUpdate is the message that records a + state update of a + + delegation + title: >- + ValidatorLifecycle is a message that records records the + lifecycle of + + a delegation + title: |- + QueryDelegationLifecycleRequest is the response type for the + Query/DelegationLifecycle RPC method default: description: An unexpected error response. schema: @@ -1775,9 +1876,8 @@ paths: proposer_address: type: string format: byte - description: >- - Header defines the structure of a Tendermint block - header. + description: Header defines the structure of a block header. + title: Epoch is a structure that contains the metadata of an epoch pagination: title: pagination defines the pagination in the response type: object @@ -1807,6 +1907,9 @@ paths: repeated Bar results = 1; PageResponse page = 2; } + title: >- + QueryEpochsInfoResponse is the response type for the + Query/EpochInfos method default: description: An unexpected error response. schema: @@ -2260,7 +2363,11 @@ paths: proposer_address: type: string format: byte - description: Header defines the structure of a Tendermint block header. + description: Header defines the structure of a block header. + title: Epoch is a structure that contains the metadata of an epoch + title: >- + QueryEpochInfoRequest is the response type for the Query/EpochInfo + method default: description: An unexpected error response. schema: @@ -3160,6 +3267,7 @@ paths: type: string format: int64 title: power is the validator's voting power + title: Validator is a message that denotes a validator total_voting_power: type: string format: int64 @@ -3191,6 +3299,11 @@ paths: repeated Bar results = 1; PageResponse page = 2; } + title: >- + QueryEpochValSetRequest is the response type for the + Query/EpochValSet RPC + + method default: description: An unexpected error response. schema: @@ -3851,6 +3964,11 @@ paths: validator set and is delayed to the epoch boundary + title: >- + QueuedMessageList is a message that contains a list of + staking-related + + messages queued for an epoch title: >- epoch_msg_map is a list of QueuedMessageList @@ -4394,12 +4512,33 @@ paths: - UNBONDED - REMOVED default: CREATED + description: >- + - CREATED: CREATED is when the validator/delegation + has been created + - BONDED: CREATED is when the validator/delegation has become bonded + - UNBONDING: CREATED is when the validator/delegation has become unbonding + - UNBONDED: CREATED is when the validator/delegation has become unbonded + - REMOVED: CREATED is when the validator/delegation has been removed + title: >- + BondState is the bond state of a validator or + delegation block_height: type: string format: uint64 block_time: type: string format: date-time + title: >- + ValStateUpdate is a messages that records a state update + of a validator + title: >- + ValidatorLifecycle is a message that records records the + lifecycle of + + a validator + title: |- + QueryValidatorLifecycleResponse is the response type for the + Query/ValidatorLifecycle RPC method default: description: An unexpected error response. schema: @@ -4759,7 +4898,7 @@ paths: - CKPT_STATUS_FINALIZED default: CKPT_STATUS_ACCUMULATING description: |- - CkptStatus is the status of a checkpoint. + CheckpointStatus is the status of a checkpoint. - CKPT_STATUS_ACCUMULATING: ACCUMULATING defines a checkpoint that is awaiting for BLS signatures. - CKPT_STATUS_SEALED: SEALED defines a checkpoint that has accumulated sufficient BLS signatures. @@ -4908,6 +5047,9 @@ paths: sigs title: RawCheckpoint wraps the BLS multi sig with meta data + description: |- + QueryLastCheckpointWithStatusResponse is the response type for the + Query/LastCheckpointWithStatus RPC method. default: description: An unexpected error response. schema: @@ -5038,7 +5180,7 @@ paths: - CKPT_STATUS_FINALIZED default: CKPT_STATUS_ACCUMULATING description: |- - CkptStatus is the status of a checkpoint. + CheckpointStatus is the status of a checkpoint. - CKPT_STATUS_ACCUMULATING: ACCUMULATING defines a checkpoint that is awaiting for BLS signatures. - CKPT_STATUS_SEALED: SEALED defines a checkpoint that has accumulated sufficient BLS signatures. @@ -5071,7 +5213,7 @@ paths: - CKPT_STATUS_FINALIZED default: CKPT_STATUS_ACCUMULATING description: |- - CkptStatus is the status of a checkpoint. + CheckpointStatus is the status of a checkpoint. - CKPT_STATUS_ACCUMULATING: ACCUMULATING defines a checkpoint that is awaiting for BLS signatures. - CKPT_STATUS_SEALED: SEALED defines a checkpoint that has accumulated sufficient BLS signatures. @@ -5097,6 +5239,9 @@ paths: that triggers the state update + description: >- + CheckpointStateUpdate defines a state transition on the + checkpoint. description: >- lifecycle defines the lifecycle of this checkpoint, i.e., each state @@ -5199,7 +5344,7 @@ paths: - CKPT_STATUS_FINALIZED default: CKPT_STATUS_ACCUMULATING description: |- - CkptStatus is the status of a checkpoint. + CheckpointStatus is the status of a checkpoint. - CKPT_STATUS_ACCUMULATING: ACCUMULATING defines a checkpoint that is awaiting for BLS signatures. - CKPT_STATUS_SEALED: SEALED defines a checkpoint that has accumulated sufficient BLS signatures. @@ -5232,7 +5377,7 @@ paths: - CKPT_STATUS_FINALIZED default: CKPT_STATUS_ACCUMULATING description: |- - CkptStatus is the status of a checkpoint. + CheckpointStatus is the status of a checkpoint. - CKPT_STATUS_ACCUMULATING: ACCUMULATING defines a checkpoint that is awaiting for BLS signatures. - CKPT_STATUS_SEALED: SEALED defines a checkpoint that has accumulated sufficient BLS signatures. @@ -5258,6 +5403,9 @@ paths: that triggers the state update + description: >- + CheckpointStateUpdate defines a state transition on + the checkpoint. description: >- lifecycle defines the lifecycle of this checkpoint, i.e., each state @@ -5503,9 +5651,7 @@ paths: proposer_address: type: string format: byte - description: >- - Header defines the structure of a Tendermint block - header. + description: Header defines the structure of a block header. babylon_epoch: type: string format: uint64 @@ -5634,9 +5780,7 @@ paths: proposer_address: type: string format: byte - description: >- - Header defines the structure of a Tendermint - block header. + description: Header defines the structure of a block header. babylon_epoch: type: string format: uint64 @@ -6017,9 +6161,7 @@ paths: proposer_address: type: string format: byte - description: >- - Header defines the structure of a Tendermint block - header. + description: Header defines the structure of a block header. babylon_epoch: type: string format: uint64 @@ -6148,9 +6290,7 @@ paths: proposer_address: type: string format: byte - description: >- - Header defines the structure of a Tendermint - block header. + description: Header defines the structure of a block header. babylon_epoch: type: string format: uint64 @@ -6528,7 +6668,7 @@ paths: proposer_address: type: string format: byte - description: Header defines the structure of a Tendermint block header. + description: Header defines the structure of a block header. babylon_epoch: type: string format: uint64 @@ -6649,9 +6789,7 @@ paths: proposer_address: type: string format: byte - description: >- - Header defines the structure of a Tendermint block - header. + description: Header defines the structure of a block header. babylon_epoch: type: string format: uint64 @@ -7328,9 +7466,7 @@ paths: proposer_address: type: string format: byte - description: >- - Header defines the structure of a Tendermint block - header. + description: Header defines the structure of a block header. babylon_epoch: type: string format: uint64 @@ -7459,9 +7595,7 @@ paths: proposer_address: type: string format: byte - description: >- - Header defines the structure of a Tendermint - block header. + description: Header defines the structure of a block header. babylon_epoch: type: string format: uint64 @@ -7716,7 +7850,7 @@ paths: proposer_address: type: string format: byte - description: Header defines the structure of a Tendermint block header. + description: Header defines the structure of a block header. raw_checkpoint: title: raw_checkpoint is the raw checkpoint of this epoch type: object @@ -8321,9 +8455,7 @@ paths: proposer_address: type: string format: byte - description: >- - Header defines the structure of a Tendermint block - header. + description: Header defines the structure of a block header. babylon_epoch: type: string format: uint64 @@ -8452,9 +8584,7 @@ paths: proposer_address: type: string format: byte - description: >- - Header defines the structure of a Tendermint - block header. + description: Header defines the structure of a block header. babylon_epoch: type: string format: uint64 @@ -8709,7 +8839,7 @@ paths: proposer_address: type: string format: byte - description: Header defines the structure of a Tendermint block header. + description: Header defines the structure of a block header. raw_checkpoint: title: raw_checkpoint is the raw checkpoint of this epoch type: object @@ -9320,9 +9450,7 @@ paths: proposer_address: type: string format: byte - description: >- - Header defines the structure of a Tendermint block - header. + description: Header defines the structure of a block header. babylon_epoch: type: string format: uint64 @@ -9743,9 +9871,7 @@ paths: proposer_address: type: string format: byte - description: >- - Header defines the structure of a Tendermint block - header. + description: Header defines the structure of a block header. babylon_epoch: type: string format: uint64 @@ -10272,17 +10398,27 @@ definitions: description: >- TODO: this could probably be better typed - Address of the checkpoint submitter, extracted from the - checkpoint itself. + submitter is the address of the checkpoint submitter to BTC, + extracted from + + the checkpoint itself. reporter: type: string format: byte title: >- - Address of the reporter which reported the submissions, - calculated from + reporter is the address of the reporter who reported the + submissions, + + calculated from submission message MsgInsertBTCSpvProof itself + title: >- + CheckpointAddresses contains the addresses of the submitter and + reporter of a - submission message MsgInsertBTCSpvProof itself + given checkpoint title: list of vigilantes' addresses + description: |- + BTCCheckpointInfo contains all checkpoint related data expected in a query + response. babylon.btccheckpoint.v1.CheckpointAddresses: type: object properties: @@ -10292,16 +10428,21 @@ definitions: description: >- TODO: this could probably be better typed - Address of the checkpoint submitter, extracted from the checkpoint - itself. + submitter is the address of the checkpoint submitter to BTC, extracted + from + + the checkpoint itself. reporter: type: string format: byte - title: >- - Address of the reporter which reported the submissions, calculated - from + title: |- + reporter is the address of the reporter who reported the submissions, + calculated from submission message MsgInsertBTCSpvProof itself + title: >- + CheckpointAddresses contains the addresses of the submitter and reporter + of a - submission message MsgInsertBTCSpvProof itself + given checkpoint babylon.btccheckpoint.v1.Params: type: object properties: @@ -10426,17 +10567,30 @@ definitions: description: >- TODO: this could probably be better typed - Address of the checkpoint submitter, extracted from the - checkpoint itself. + submitter is the address of the checkpoint submitter to BTC, + extracted from + + the checkpoint itself. reporter: type: string format: byte title: >- - Address of the reporter which reported the submissions, - calculated from + reporter is the address of the reporter who reported the + submissions, - submission message MsgInsertBTCSpvProof itself + calculated from submission message MsgInsertBTCSpvProof + itself + title: >- + CheckpointAddresses contains the addresses of the submitter and + reporter of a + + given checkpoint title: list of vigilantes' addresses + description: >- + BTCCheckpointInfo contains all checkpoint related data expected in a + query + + response. title: |- QueryBtcCheckpointInfoResponse is response type for the Query/BtcCheckpointInfo RPC method @@ -10534,17 +10688,30 @@ definitions: description: >- TODO: this could probably be better typed - Address of the checkpoint submitter, extracted from the - checkpoint itself. + submitter is the address of the checkpoint submitter to + BTC, extracted from + + the checkpoint itself. reporter: type: string format: byte title: >- - Address of the reporter which reported the submissions, - calculated from + reporter is the address of the reporter who reported the + submissions, + + calculated from submission message MsgInsertBTCSpvProof + itself + title: >- + CheckpointAddresses contains the addresses of the submitter + and reporter of a - submission message MsgInsertBTCSpvProof itself + given checkpoint title: list of vigilantes' addresses + description: >- + BTCCheckpointInfo contains all checkpoint related data expected in a + query + + response. pagination: title: pagination defines the pagination in the response type: object @@ -10645,6 +10812,9 @@ definitions: repeated Bar results = 1; PageResponse page = 2; } + title: |- + QueryEpochSubmissionsResponse defines a response to get all submissions in + given epoch (QueryEpochSubmissionsRequest) babylon.btccheckpoint.v1.QueryParamsResponse: type: object properties: @@ -11200,6 +11370,17 @@ definitions: work: type: string format: byte + description: >- + BTCHeaderInfo is a structure that contains all relevant information about + a + + BTC header + - Full header bytes + - Header hash for easy retrieval + - Height of the header in the BTC chain + - Total work spent on the header. This is the sum of the work corresponding + to the header Bits field + and the total work of the header. babylon.btclightclient.v1.Params: type: object description: Params defines the parameters for the module. @@ -11221,6 +11402,20 @@ definitions: work: type: string format: byte + description: >- + BTCHeaderInfo is a structure that contains all relevant information + about a + + BTC header + - Full header bytes + - Header hash for easy retrieval + - Height of the header in the BTC chain + - Total work spent on the header. This is the sum of the work corresponding + to the header Bits field + and the total work of the header. + description: |- + QueryBaseHeaderResponse is the response type for the Query/BaseHeader RPC + method. babylon.btclightclient.v1.QueryContainsBytesResponse: type: object properties: @@ -11292,6 +11487,17 @@ definitions: work: type: string format: byte + description: >- + BTCHeaderInfo is a structure that contains all relevant information + about a + + BTC header + - Full header bytes + - Header hash for easy retrieval + - Height of the header in the BTC chain + - Total work spent on the header. This is the sum of the work corresponding + to the header Bits field + and the total work of the header. pagination: type: object properties: @@ -11346,6 +11552,18 @@ definitions: work: type: string format: byte + description: >- + BTCHeaderInfo is a structure that contains all relevant information + about a + + BTC header + - Full header bytes + - Header hash for easy retrieval + - Height of the header in the BTC chain + - Total work spent on the header. This is the sum of the work corresponding + to the header Bits field + and the total work of the header. + description: QueryTipResponse is the response type for the Query/Tip RPC method. babylon.epoching.v1.BondState: type: string enum: @@ -11355,6 +11573,13 @@ definitions: - UNBONDED - REMOVED default: CREATED + description: |- + - CREATED: CREATED is when the validator/delegation has been created + - BONDED: CREATED is when the validator/delegation has become bonded + - UNBONDING: CREATED is when the validator/delegation has become unbonding + - UNBONDED: CREATED is when the validator/delegation has become unbonded + - REMOVED: CREATED is when the validator/delegation has been removed + title: BondState is the bond state of a validator or delegation babylon.epoching.v1.DelegationLifecycle: type: object properties: @@ -11374,6 +11599,14 @@ definitions: - UNBONDED - REMOVED default: CREATED + description: >- + - CREATED: CREATED is when the validator/delegation has been + created + - BONDED: CREATED is when the validator/delegation has become bonded + - UNBONDING: CREATED is when the validator/delegation has become unbonding + - UNBONDED: CREATED is when the validator/delegation has become unbonded + - REMOVED: CREATED is when the validator/delegation has been removed + title: BondState is the bond state of a validator or delegation val_addr: type: string block_height: @@ -11382,6 +11615,14 @@ definitions: block_time: type: string format: date-time + title: >- + DelegationStateUpdate is the message that records a state update of + a + + delegation + title: |- + ValidatorLifecycle is a message that records records the lifecycle of + a delegation babylon.epoching.v1.DelegationStateUpdate: type: object properties: @@ -11394,6 +11635,13 @@ definitions: - UNBONDED - REMOVED default: CREATED + description: |- + - CREATED: CREATED is when the validator/delegation has been created + - BONDED: CREATED is when the validator/delegation has become bonded + - UNBONDING: CREATED is when the validator/delegation has become unbonding + - UNBONDED: CREATED is when the validator/delegation has become unbonded + - REMOVED: CREATED is when the validator/delegation has been removed + title: BondState is the bond state of a validator or delegation val_addr: type: string block_height: @@ -11402,6 +11650,9 @@ definitions: block_time: type: string format: date-time + title: |- + DelegationStateUpdate is the message that records a state update of a + delegation babylon.epoching.v1.Epoch: type: object properties: @@ -11590,7 +11841,8 @@ definitions: proposer_address: type: string format: byte - description: Header defines the structure of a Tendermint block header. + description: Header defines the structure of a block header. + title: Epoch is a structure that contains the metadata of an epoch babylon.epoching.v1.Params: type: object properties: @@ -11637,6 +11889,14 @@ definitions: - UNBONDED - REMOVED default: CREATED + description: >- + - CREATED: CREATED is when the validator/delegation has been + created + - BONDED: CREATED is when the validator/delegation has become bonded + - UNBONDING: CREATED is when the validator/delegation has become unbonding + - UNBONDED: CREATED is when the validator/delegation has become unbonded + - REMOVED: CREATED is when the validator/delegation has been removed + title: BondState is the bond state of a validator or delegation val_addr: type: string block_height: @@ -11645,6 +11905,17 @@ definitions: block_time: type: string format: date-time + title: >- + DelegationStateUpdate is the message that records a state update + of a + + delegation + title: |- + ValidatorLifecycle is a message that records records the lifecycle of + a delegation + title: |- + QueryDelegationLifecycleRequest is the response type for the + Query/DelegationLifecycle RPC method babylon.epoching.v1.QueryEpochInfoResponse: type: object properties: @@ -11838,7 +12109,9 @@ definitions: proposer_address: type: string format: byte - description: Header defines the structure of a Tendermint block header. + description: Header defines the structure of a block header. + title: Epoch is a structure that contains the metadata of an epoch + title: QueryEpochInfoRequest is the response type for the Query/EpochInfo method babylon.epoching.v1.QueryEpochMsgsResponse: type: object properties: @@ -12253,6 +12526,7 @@ definitions: type: string format: int64 title: power is the validator's voting power + title: Validator is a message that denotes a validator total_voting_power: type: string format: int64 @@ -12282,6 +12556,9 @@ definitions: repeated Bar results = 1; PageResponse page = 2; } + title: |- + QueryEpochValSetRequest is the response type for the Query/EpochValSet RPC + method babylon.epoching.v1.QueryEpochsInfoResponse: type: object properties: @@ -12477,7 +12754,8 @@ definitions: proposer_address: type: string format: byte - description: Header defines the structure of a Tendermint block header. + description: Header defines the structure of a block header. + title: Epoch is a structure that contains the metadata of an epoch pagination: title: pagination defines the pagination in the response type: object @@ -12505,6 +12783,9 @@ definitions: repeated Bar results = 1; PageResponse page = 2; } + title: >- + QueryEpochsInfoResponse is the response type for the Query/EpochInfos + method babylon.epoching.v1.QueryLatestEpochMsgsResponse: type: object properties: @@ -12890,6 +13171,11 @@ definitions: and is delayed to the epoch boundary + title: >- + QueuedMessageList is a message that contains a list of + staking-related + + messages queued for an epoch title: |- epoch_msg_map is a list of QueuedMessageList each QueuedMessageList has a field identifying the epoch number @@ -12958,12 +13244,29 @@ definitions: - UNBONDED - REMOVED default: CREATED + description: >- + - CREATED: CREATED is when the validator/delegation has been + created + - BONDED: CREATED is when the validator/delegation has become bonded + - UNBONDING: CREATED is when the validator/delegation has become unbonding + - UNBONDED: CREATED is when the validator/delegation has become unbonded + - REMOVED: CREATED is when the validator/delegation has been removed + title: BondState is the bond state of a validator or delegation block_height: type: string format: uint64 block_time: type: string format: date-time + title: >- + ValStateUpdate is a messages that records a state update of a + validator + title: |- + ValidatorLifecycle is a message that records records the lifecycle of + a validator + title: |- + QueryValidatorLifecycleResponse is the response type for the + Query/ValidatorLifecycle RPC method babylon.epoching.v1.QueuedMessage: type: object properties: @@ -13677,6 +13980,9 @@ definitions: delayed to the epoch boundary + title: |- + QueuedMessageList is a message that contains a list of staking-related + messages queued for an epoch babylon.epoching.v1.ValStateUpdate: type: object properties: @@ -13689,12 +13995,20 @@ definitions: - UNBONDED - REMOVED default: CREATED + description: |- + - CREATED: CREATED is when the validator/delegation has been created + - BONDED: CREATED is when the validator/delegation has become bonded + - UNBONDING: CREATED is when the validator/delegation has become unbonding + - UNBONDED: CREATED is when the validator/delegation has become unbonded + - REMOVED: CREATED is when the validator/delegation has been removed + title: BondState is the bond state of a validator or delegation block_height: type: string format: uint64 block_time: type: string format: date-time + title: ValStateUpdate is a messages that records a state update of a validator babylon.epoching.v1.Validator: type: object properties: @@ -13706,6 +14020,7 @@ definitions: type: string format: int64 title: power is the validator's voting power + title: Validator is a message that denotes a validator babylon.epoching.v1.ValidatorLifecycle: type: object properties: @@ -13725,12 +14040,26 @@ definitions: - UNBONDED - REMOVED default: CREATED + description: >- + - CREATED: CREATED is when the validator/delegation has been + created + - BONDED: CREATED is when the validator/delegation has become bonded + - UNBONDING: CREATED is when the validator/delegation has become unbonding + - UNBONDED: CREATED is when the validator/delegation has become unbonded + - REMOVED: CREATED is when the validator/delegation has been removed + title: BondState is the bond state of a validator or delegation block_height: type: string format: uint64 block_time: type: string format: date-time + title: >- + ValStateUpdate is a messages that records a state update of a + validator + title: |- + ValidatorLifecycle is a message that records records the lifecycle of + a validator cosmos.base.v1beta1.Coin: type: object properties: @@ -14171,7 +14500,7 @@ definitions: proposer_address: type: string format: byte - description: Header defines the structure of a Tendermint block header. + description: Header defines the structure of a block header. tendermint.types.PartSetHeader: type: object properties: @@ -14212,7 +14541,7 @@ definitions: - CKPT_STATUS_FINALIZED default: CKPT_STATUS_ACCUMULATING description: |- - CkptStatus is the status of a checkpoint. + CheckpointStatus is the status of a checkpoint. - CKPT_STATUS_ACCUMULATING: ACCUMULATING defines a checkpoint that is awaiting for BLS signatures. - CKPT_STATUS_SEALED: SEALED defines a checkpoint that has accumulated sufficient BLS signatures. @@ -14236,6 +14565,7 @@ definitions: state update + description: CheckpointStateUpdate defines a state transition on the checkpoint. babylon.checkpointing.v1.CheckpointStatus: type: string enum: @@ -14246,7 +14576,7 @@ definitions: - CKPT_STATUS_FINALIZED default: CKPT_STATUS_ACCUMULATING description: |- - CkptStatus is the status of a checkpoint. + CheckpointStatus is the status of a checkpoint. - CKPT_STATUS_ACCUMULATING: ACCUMULATING defines a checkpoint that is awaiting for BLS signatures. - CKPT_STATUS_SEALED: SEALED defines a checkpoint that has accumulated sufficient BLS signatures. @@ -14312,7 +14642,7 @@ definitions: - CKPT_STATUS_FINALIZED default: CKPT_STATUS_ACCUMULATING description: |- - CkptStatus is the status of a checkpoint. + CheckpointStatus is the status of a checkpoint. - CKPT_STATUS_ACCUMULATING: ACCUMULATING defines a checkpoint that is awaiting for BLS signatures. - CKPT_STATUS_SEALED: SEALED defines a checkpoint that has accumulated sufficient BLS signatures. @@ -14355,6 +14685,9 @@ definitions: sigs title: RawCheckpoint wraps the BLS multi sig with meta data + description: |- + QueryLastCheckpointWithStatusResponse is the response type for the + Query/LastCheckpointWithStatus RPC method. babylon.checkpointing.v1.QueryParamsResponse: type: object properties: @@ -14410,7 +14743,7 @@ definitions: - CKPT_STATUS_FINALIZED default: CKPT_STATUS_ACCUMULATING description: |- - CkptStatus is the status of a checkpoint. + CheckpointStatus is the status of a checkpoint. - CKPT_STATUS_ACCUMULATING: ACCUMULATING defines a checkpoint that is awaiting for BLS signatures. - CKPT_STATUS_SEALED: SEALED defines a checkpoint that has accumulated sufficient BLS signatures. @@ -14443,7 +14776,7 @@ definitions: - CKPT_STATUS_FINALIZED default: CKPT_STATUS_ACCUMULATING description: |- - CkptStatus is the status of a checkpoint. + CheckpointStatus is the status of a checkpoint. - CKPT_STATUS_ACCUMULATING: ACCUMULATING defines a checkpoint that is awaiting for BLS signatures. - CKPT_STATUS_SEALED: SEALED defines a checkpoint that has accumulated sufficient BLS signatures. @@ -14469,6 +14802,9 @@ definitions: triggers the state update + description: >- + CheckpointStateUpdate defines a state transition on the + checkpoint. description: >- lifecycle defines the lifecycle of this checkpoint, i.e., each state @@ -14547,7 +14883,7 @@ definitions: - CKPT_STATUS_FINALIZED default: CKPT_STATUS_ACCUMULATING description: |- - CkptStatus is the status of a checkpoint. + CheckpointStatus is the status of a checkpoint. - CKPT_STATUS_ACCUMULATING: ACCUMULATING defines a checkpoint that is awaiting for BLS signatures. - CKPT_STATUS_SEALED: SEALED defines a checkpoint that has accumulated sufficient BLS signatures. @@ -14578,7 +14914,7 @@ definitions: - CKPT_STATUS_FINALIZED default: CKPT_STATUS_ACCUMULATING description: |- - CkptStatus is the status of a checkpoint. + CheckpointStatus is the status of a checkpoint. - CKPT_STATUS_ACCUMULATING: ACCUMULATING defines a checkpoint that is awaiting for BLS signatures. - CKPT_STATUS_SEALED: SEALED defines a checkpoint that has accumulated sufficient BLS signatures. @@ -14604,6 +14940,9 @@ definitions: triggers the state update + description: >- + CheckpointStateUpdate defines a state transition on the + checkpoint. description: >- lifecycle defines the lifecycle of this checkpoint, i.e., each state @@ -14708,7 +15047,7 @@ definitions: - CKPT_STATUS_FINALIZED default: CKPT_STATUS_ACCUMULATING description: |- - CkptStatus is the status of a checkpoint. + CheckpointStatus is the status of a checkpoint. - CKPT_STATUS_ACCUMULATING: ACCUMULATING defines a checkpoint that is awaiting for BLS signatures. - CKPT_STATUS_SEALED: SEALED defines a checkpoint that has accumulated sufficient BLS signatures. @@ -14739,7 +15078,7 @@ definitions: - CKPT_STATUS_FINALIZED default: CKPT_STATUS_ACCUMULATING description: |- - CkptStatus is the status of a checkpoint. + CheckpointStatus is the status of a checkpoint. - CKPT_STATUS_ACCUMULATING: ACCUMULATING defines a checkpoint that is awaiting for BLS signatures. - CKPT_STATUS_SEALED: SEALED defines a checkpoint that has accumulated sufficient BLS signatures. @@ -14763,6 +15102,7 @@ definitions: the state update + description: CheckpointStateUpdate defines a state transition on the checkpoint. description: |- lifecycle defines the lifecycle of this checkpoint, i.e., each state transition and the time (in both timestamp and block height) of this @@ -14888,7 +15228,7 @@ definitions: proposer_address: type: string format: byte - description: Header defines the structure of a Tendermint block header. + description: Header defines the structure of a block header. babylon_epoch: type: string format: uint64 @@ -15012,7 +15352,7 @@ definitions: proposer_address: type: string format: byte - description: Header defines the structure of a Tendermint block header. + description: Header defines the structure of a block header. babylon_epoch: type: string format: uint64 @@ -15170,7 +15510,7 @@ definitions: proposer_address: type: string format: byte - description: Header defines the structure of a Tendermint block header. + description: Header defines the structure of a block header. babylon_epoch: type: string format: uint64 @@ -15312,7 +15652,7 @@ definitions: proposer_address: type: string format: byte - description: Header defines the structure of a Tendermint block header. + description: Header defines the structure of a block header. babylon_epoch: type: string format: uint64 @@ -15755,7 +16095,7 @@ definitions: proposer_address: type: string format: byte - description: Header defines the structure of a Tendermint block header. + description: Header defines the structure of a block header. babylon_epoch: type: string format: uint64 @@ -15880,9 +16220,7 @@ definitions: proposer_address: type: string format: byte - description: >- - Header defines the structure of a Tendermint block - header. + description: Header defines the structure of a block header. babylon_epoch: type: string format: uint64 @@ -16092,7 +16430,7 @@ definitions: proposer_address: type: string format: byte - description: Header defines the structure of a Tendermint block header. + description: Header defines the structure of a block header. babylon_epoch: type: string format: uint64 @@ -16217,9 +16555,7 @@ definitions: proposer_address: type: string format: byte - description: >- - Header defines the structure of a Tendermint block - header. + description: Header defines the structure of a block header. babylon_epoch: type: string format: uint64 @@ -16395,7 +16731,7 @@ definitions: proposer_address: type: string format: byte - description: Header defines the structure of a Tendermint block header. + description: Header defines the structure of a block header. babylon_epoch: type: string format: uint64 @@ -16520,9 +16856,7 @@ definitions: proposer_address: type: string format: byte - description: >- - Header defines the structure of a Tendermint block - header. + description: Header defines the structure of a block header. babylon_epoch: type: string format: uint64 @@ -16774,7 +17108,7 @@ definitions: proposer_address: type: string format: byte - description: Header defines the structure of a Tendermint block header. + description: Header defines the structure of a block header. raw_checkpoint: title: raw_checkpoint is the raw checkpoint of this epoch type: object @@ -17158,7 +17492,7 @@ definitions: proposer_address: type: string format: byte - description: Header defines the structure of a Tendermint block header. + description: Header defines the structure of a block header. babylon_epoch: type: string format: uint64 @@ -17283,9 +17617,7 @@ definitions: proposer_address: type: string format: byte - description: >- - Header defines the structure of a Tendermint block - header. + description: Header defines the structure of a block header. babylon_epoch: type: string format: uint64 @@ -17537,7 +17869,7 @@ definitions: proposer_address: type: string format: byte - description: Header defines the structure of a Tendermint block header. + description: Header defines the structure of a block header. raw_checkpoint: title: raw_checkpoint is the raw checkpoint of this epoch type: object @@ -17913,7 +18245,7 @@ definitions: proposer_address: type: string format: byte - description: Header defines the structure of a Tendermint block header. + description: Header defines the structure of a block header. babylon_epoch: type: string format: uint64 @@ -18033,7 +18365,7 @@ definitions: proposer_address: type: string format: byte - description: Header defines the structure of a Tendermint block header. + description: Header defines the structure of a block header. babylon_epoch: type: string format: uint64 @@ -18185,7 +18517,7 @@ definitions: proposer_address: type: string format: byte - description: Header defines the structure of a Tendermint block header. + description: Header defines the structure of a block header. babylon_epoch: type: string format: uint64 @@ -18311,7 +18643,7 @@ definitions: proposer_address: type: string format: byte - description: Header defines the structure of a Tendermint block header. + description: Header defines the structure of a block header. babylon_epoch: type: string format: uint64 diff --git a/proto/babylon/btccheckpoint/v1/btccheckpoint.proto b/proto/babylon/btccheckpoint/v1/btccheckpoint.proto index c174a898a..0aa77fe2e 100644 --- a/proto/babylon/btccheckpoint/v1/btccheckpoint.proto +++ b/proto/babylon/btccheckpoint/v1/btccheckpoint.proto @@ -120,19 +120,20 @@ message EpochData { BtcStatus status = 2; } -// CheckpointAddresses contains the addresses of the submitter and reporter of a given checkpoint -// submitter is the address of the submitter of the checkpoint to BTC -// reporter is the address of the submitter of the MsgInsertBTCSpvProof message to Babylon +// CheckpointAddresses contains the addresses of the submitter and reporter of a +// given checkpoint message CheckpointAddresses { // TODO: this could probably be better typed - // Address of the checkpoint submitter, extracted from the checkpoint itself. + // submitter is the address of the checkpoint submitter to BTC, extracted from + // the checkpoint itself. bytes submitter = 1; - // Address of the reporter which reported the submissions, calculated from - // submission message MsgInsertBTCSpvProof itself + // reporter is the address of the reporter who reported the submissions, + // calculated from submission message MsgInsertBTCSpvProof itself bytes reporter = 2; } -// BTCCheckpointInfo contains all checkpoint related data expected in a query response. +// BTCCheckpointInfo contains all checkpoint related data expected in a query +// response. message BTCCheckpointInfo { // epoch number of this checkpoint uint64 epoch_number = 1; diff --git a/proto/babylon/btccheckpoint/v1/query.proto b/proto/babylon/btccheckpoint/v1/query.proto index ac4e75c06..2c88f8905 100644 --- a/proto/babylon/btccheckpoint/v1/query.proto +++ b/proto/babylon/btccheckpoint/v1/query.proto @@ -45,7 +45,8 @@ message QueryParamsResponse { Params params = 1 [ (gogoproto.nullable) = false ]; } -// QueryBtcCheckpointInfoRequest defines the query to get the best checkpoint for a given epoch +// QueryBtcCheckpointInfoRequest defines the query to get the best checkpoint +// for a given epoch message QueryBtcCheckpointInfoRequest { // Number of epoch for which the earliest checkpointing btc height is // requested @@ -71,7 +72,8 @@ message QueryBtcCheckpointsInfoResponse { cosmos.base.query.v1beta1.PageResponse pagination = 2; } -// QueryEpochSubmissionsRequest defines a request to get all submissions in given epoch +// QueryEpochSubmissionsRequest defines a request to get all submissions in +// given epoch message QueryEpochSubmissionsRequest { // Number of epoch for which submissions are requested uint64 epoch_num = 1; @@ -79,7 +81,8 @@ message QueryEpochSubmissionsRequest { cosmos.base.query.v1beta1.PageRequest pagination = 2; } -// QueryEpochSubmissionsResponse defines a response to get all submissions in given epoch (QueryEpochSubmissionsRequest) +// QueryEpochSubmissionsResponse defines a response to get all submissions in +// given epoch (QueryEpochSubmissionsRequest) message QueryEpochSubmissionsResponse { // All submissions saved during an epoch. repeated SubmissionKey keys = 1; diff --git a/proto/babylon/btccheckpoint/v1/tx.proto b/proto/babylon/btccheckpoint/v1/tx.proto index 203356e02..4a9cc1b11 100644 --- a/proto/babylon/btccheckpoint/v1/tx.proto +++ b/proto/babylon/btccheckpoint/v1/tx.proto @@ -12,11 +12,13 @@ service Msg { returns (MsgInsertBTCSpvProofResponse); } -// MsgInsertBTCSpvProof defines resquest to insert a new checkpoint into the store +// MsgInsertBTCSpvProof defines resquest to insert a new checkpoint into the +// store message MsgInsertBTCSpvProof { string submitter = 1; repeated babylon.btccheckpoint.v1.BTCSpvProof proofs = 2; } -// MsgInsertBTCSpvProofResponse defines the response for the MsgInsertBTCSpvProof message +// MsgInsertBTCSpvProofResponse defines the response for the +// MsgInsertBTCSpvProof message message MsgInsertBTCSpvProofResponse {} diff --git a/proto/babylon/btclightclient/v1/btclightclient.proto b/proto/babylon/btclightclient/v1/btclightclient.proto index 3592ade2f..6c1c400fb 100644 --- a/proto/babylon/btclightclient/v1/btclightclient.proto +++ b/proto/babylon/btclightclient/v1/btclightclient.proto @@ -5,11 +5,13 @@ import "gogoproto/gogo.proto"; option go_package = "github.com/babylonchain/babylon/x/btclightclient/types"; -// BTCHeaderInfo is a structure that contains all relevant information about a BTC header +// BTCHeaderInfo is a structure that contains all relevant information about a +// BTC header // - Full header bytes // - Header hash for easy retrieval // - Height of the header in the BTC chain -// - Total work spent on the header. This is the sum of the work corresponding to the header Bits field +// - Total work spent on the header. This is the sum of the work corresponding +// to the header Bits field // and the total work of the header. message BTCHeaderInfo { bytes header = 1 diff --git a/proto/babylon/btclightclient/v1/query.proto b/proto/babylon/btclightclient/v1/query.proto index 8df7a5f71..095b26781 100644 --- a/proto/babylon/btclightclient/v1/query.proto +++ b/proto/babylon/btclightclient/v1/query.proto @@ -45,7 +45,8 @@ service Query { option (google.api.http).get = "/babylon/btclightclient/v1/tip"; } - // BaseHeader returns the base BTC header of the chain. This header is defined on genesis. + // BaseHeader returns the base BTC header of the chain. This header is defined + // on genesis. rpc BaseHeader(QueryBaseHeaderRequest) returns (QueryBaseHeaderResponse) { option (google.api.http).get = "/babylon/btclightclient/v1/baseheader"; } @@ -111,8 +112,10 @@ message QueryTipRequest {} // QueryTipResponse is the response type for the Query/Tip RPC method. message QueryTipResponse { BTCHeaderInfo header = 1; } -// QueryBaseHeaderRequest is the request type for the Query/BaseHeader RPC method. +// QueryBaseHeaderRequest is the request type for the Query/BaseHeader RPC +// method. message QueryBaseHeaderRequest {} -// QueryBaseHeaderResponse is the response type for the Query/BaseHeader RPC method. +// QueryBaseHeaderResponse is the response type for the Query/BaseHeader RPC +// method. message QueryBaseHeaderResponse { BTCHeaderInfo header = 1; } diff --git a/proto/babylon/btclightclient/v1/tx.proto b/proto/babylon/btclightclient/v1/tx.proto index 287d1d2ed..30127aaee 100644 --- a/proto/babylon/btclightclient/v1/tx.proto +++ b/proto/babylon/btclightclient/v1/tx.proto @@ -7,7 +7,8 @@ option go_package = "github.com/babylonchain/babylon/x/btclightclient/types"; // Msg defines the Msg service. service Msg { - // InsertHeader adds a header to the BTC light client chain maintained by Babylon. + // InsertHeader adds a header to the BTC light client chain maintained by + // Babylon. rpc InsertHeader(MsgInsertHeader) returns (MsgInsertHeaderResponse) {}; } diff --git a/proto/babylon/checkpointing/v1/events.proto b/proto/babylon/checkpointing/v1/events.proto index dce0ac995..4e170c058 100644 --- a/proto/babylon/checkpointing/v1/events.proto +++ b/proto/babylon/checkpointing/v1/events.proto @@ -5,25 +5,32 @@ import "babylon/checkpointing/v1/checkpoint.proto"; option go_package = "github.com/babylonchain/babylon/x/checkpointing/types"; -// EventCheckpointAccumulating is emitted when a checkpoint reaches the `Accumulating` state. +// EventCheckpointAccumulating is emitted when a checkpoint reaches the +// `Accumulating` state. message EventCheckpointAccumulating { RawCheckpointWithMeta checkpoint = 1; } -// EventCheckpointSealed is emitted when a checkpoint reaches the `Sealed` state. +// EventCheckpointSealed is emitted when a checkpoint reaches the `Sealed` +// state. message EventCheckpointSealed { RawCheckpointWithMeta checkpoint = 1; } -// EventCheckpointSubmitted is emitted when a checkpoint reaches the `Submitted` state. +// EventCheckpointSubmitted is emitted when a checkpoint reaches the `Submitted` +// state. message EventCheckpointSubmitted { RawCheckpointWithMeta checkpoint = 1; } -// EventCheckpointConfirmed is emitted when a checkpoint reaches the `Confirmed` state. +// EventCheckpointConfirmed is emitted when a checkpoint reaches the `Confirmed` +// state. message EventCheckpointConfirmed { RawCheckpointWithMeta checkpoint = 1; } -// EventCheckpointFinalized is emitted when a checkpoint reaches the `Finalized` state. +// EventCheckpointFinalized is emitted when a checkpoint reaches the `Finalized` +// state. message EventCheckpointFinalized { RawCheckpointWithMeta checkpoint = 1; } -// EventCheckpointForgotten is emitted when a checkpoint switches to a `Forgotten` state. +// EventCheckpointForgotten is emitted when a checkpoint switches to a +// `Forgotten` state. message EventCheckpointForgotten { RawCheckpointWithMeta checkpoint = 1; } -// EventConflictingCheckpoint is emitted when two conflicting checkpoints are found. +// EventConflictingCheckpoint is emitted when two conflicting checkpoints are +// found. message EventConflictingCheckpoint { RawCheckpoint conflicting_checkpoint = 1; RawCheckpointWithMeta local_checkpoint = 2; diff --git a/proto/babylon/epoching/v1/epoching.proto b/proto/babylon/epoching/v1/epoching.proto index 8b660bd78..9b56c0bca 100644 --- a/proto/babylon/epoching/v1/epoching.proto +++ b/proto/babylon/epoching/v1/epoching.proto @@ -8,6 +8,7 @@ import "cosmos/staking/v1beta1/tx.proto"; option go_package = "github.com/babylonchain/babylon/x/epoching/types"; +// Epoch is a structure that contains the metadata of an epoch message Epoch { uint64 epoch_number = 1; uint64 current_epoch_interval = 2; @@ -49,30 +50,43 @@ message QueuedMessage { } } +// QueuedMessageList is a message that contains a list of staking-related +// messages queued for an epoch message QueuedMessageList { uint64 epoch_number = 1; repeated QueuedMessage msgs = 2; } +// BondState is the bond state of a validator or delegation enum BondState { + // CREATED is when the validator/delegation has been created CREATED = 0; + // CREATED is when the validator/delegation has become bonded BONDED = 1; + // CREATED is when the validator/delegation has become unbonding UNBONDING = 2; + // CREATED is when the validator/delegation has become unbonded UNBONDED = 3; + // CREATED is when the validator/delegation has been removed REMOVED = 4; } +// ValStateUpdate is a messages that records a state update of a validator message ValStateUpdate { BondState state = 1; uint64 block_height = 2; google.protobuf.Timestamp block_time = 3 [ (gogoproto.stdtime) = true ]; } +// ValidatorLifecycle is a message that records records the lifecycle of +// a validator message ValidatorLifecycle { string val_addr = 1; repeated ValStateUpdate val_life = 2; } +// DelegationStateUpdate is the message that records a state update of a +// delegation message DelegationStateUpdate { BondState state = 1; string val_addr = 2; @@ -80,11 +94,14 @@ message DelegationStateUpdate { google.protobuf.Timestamp block_time = 4 [ (gogoproto.stdtime) = true ]; } +// ValidatorLifecycle is a message that records records the lifecycle of +// a delegation message DelegationLifecycle { string del_addr = 1; repeated DelegationStateUpdate del_life = 2; } +// Validator is a message that denotes a validator message Validator { // addr is the validator's address (in sdk.ValAddress) bytes addr = 1; diff --git a/proto/babylon/epoching/v1/events.proto b/proto/babylon/epoching/v1/events.proto index b3f275fba..ec210e2f8 100644 --- a/proto/babylon/epoching/v1/events.proto +++ b/proto/babylon/epoching/v1/events.proto @@ -5,10 +5,14 @@ import "gogoproto/gogo.proto"; option go_package = "github.com/babylonchain/babylon/x/epoching/types"; +// EventBeginEpoch is the event emitted when an epoch has started message EventBeginEpoch { uint64 epoch_number = 1; } +// EventEndEpoch is the event emitted when an epoch has ended message EventEndEpoch { uint64 epoch_number = 1; } +// EventHandleQueuedMsg is the event emitted when a queued message has been +// handled message EventHandleQueuedMsg { string original_event_type = 1; uint64 epoch_number = 2; @@ -21,12 +25,16 @@ message EventHandleQueuedMsg { string error = 7; } +// EventSlashThreshold is the event emitted when a set of validators have been +// slashed message EventSlashThreshold { int64 slashed_voting_power = 1; int64 total_voting_power = 2; repeated bytes slashed_validators = 3; } +// EventWrappedDelegate is the event emitted when a MsgWrappedDelegate has been +// queued message EventWrappedDelegate { string delegator_address = 1; string validator_address = 2; @@ -35,6 +43,8 @@ message EventWrappedDelegate { uint64 epoch_boundary = 5; } +// EventWrappedUndelegate is the event emitted when a MsgWrappedUndelegate has +// been queued message EventWrappedUndelegate { string delegator_address = 1; string validator_address = 2; @@ -43,6 +53,8 @@ message EventWrappedUndelegate { uint64 epoch_boundary = 5; } +// EventWrappedBeginRedelegate is the event emitted when a +// MsgWrappedBeginRedelegate has been queued message EventWrappedBeginRedelegate { string delegator_address = 1; string source_validator_address = 2; diff --git a/proto/babylon/epoching/v1/query.proto b/proto/babylon/epoching/v1/query.proto index f24f8a162..f78acae35 100644 --- a/proto/babylon/epoching/v1/query.proto +++ b/proto/babylon/epoching/v1/query.proto @@ -78,15 +78,19 @@ message QueryParamsResponse { babylon.epoching.v1.Params params = 1 [ (gogoproto.nullable) = false ]; } +// QueryEpochInfoRequest is the request type for the Query/EpochInfo method message QueryEpochInfoRequest { uint64 epoch_num = 1; } +// QueryEpochInfoRequest is the response type for the Query/EpochInfo method message QueryEpochInfoResponse { babylon.epoching.v1.Epoch epoch = 1; } +// QueryEpochInfosRequest is the request type for the Query/EpochInfos method message QueryEpochsInfoRequest { // pagination defines whether to have the pagination in the request cosmos.base.query.v1beta1.PageRequest pagination = 1; } +// QueryEpochsInfoResponse is the response type for the Query/EpochInfos method message QueryEpochsInfoResponse { repeated babylon.epoching.v1.Epoch epochs = 1; @@ -147,19 +151,31 @@ message QueryLatestEpochMsgsResponse { cosmos.base.query.v1beta1.PageResponse pagination = 2; } +// QueryValidatorLifecycleRequest is the request type for the +// Query/ValidatorLifecycle RPC method message QueryValidatorLifecycleRequest { string val_addr = 1; } +// QueryValidatorLifecycleResponse is the response type for the +// Query/ValidatorLifecycle RPC method message QueryValidatorLifecycleResponse { ValidatorLifecycle val_life = 1; } +// QueryDelegationLifecycleRequest is the request type for the +// Query/DelegationLifecycle RPC method message QueryDelegationLifecycleRequest { string del_addr = 1; } +// QueryDelegationLifecycleRequest is the response type for the +// Query/DelegationLifecycle RPC method message QueryDelegationLifecycleResponse { DelegationLifecycle del_life = 1; } +// QueryEpochValSetRequest is the request type for the Query/EpochValSet RPC +// method message QueryEpochValSetRequest { uint64 epoch_num = 1; cosmos.base.query.v1beta1.PageRequest pagination = 2; } +// QueryEpochValSetRequest is the response type for the Query/EpochValSet RPC +// method message QueryEpochValSetResponse { repeated babylon.epoching.v1.Validator validators = 1; int64 total_voting_power = 2; diff --git a/proto/babylon/epoching/v1/tx.proto b/proto/babylon/epoching/v1/tx.proto index d3f2cb4ad..eb644bd5c 100644 --- a/proto/babylon/epoching/v1/tx.proto +++ b/proto/babylon/epoching/v1/tx.proto @@ -23,26 +23,38 @@ service Msg { returns (MsgWrappedBeginRedelegateResponse); } +// MsgWrappedDelegate is the message for delegating stakes message MsgWrappedDelegate { option (gogoproto.equal) = false; option (gogoproto.goproto_getters) = false; cosmos.staking.v1beta1.MsgDelegate msg = 1; } + +// MsgWrappedDelegate is the response to the MsgWrappedDelegate message message MsgWrappedDelegateResponse {} +// MsgWrappedUndelegate is the message for undelegating stakes message MsgWrappedUndelegate { option (gogoproto.equal) = false; option (gogoproto.goproto_getters) = false; cosmos.staking.v1beta1.MsgUndelegate msg = 1; } + +// MsgWrappedUndelegateResponse is the response to the MsgWrappedUndelegate +// message message MsgWrappedUndelegateResponse {} +// MsgWrappedDelegate is the message for moving bonded stakes from a +// validator to another validator message MsgWrappedBeginRedelegate { option (gogoproto.equal) = false; option (gogoproto.goproto_getters) = false; cosmos.staking.v1beta1.MsgBeginRedelegate msg = 1; } + +// MsgWrappedBeginRedelegateResponse is the response to the +// MsgWrappedBeginRedelegate message message MsgWrappedBeginRedelegateResponse {} diff --git a/proto/babylon/monitor/v1/query.proto b/proto/babylon/monitor/v1/query.proto index 2c94f4f96..ec85e2792 100644 --- a/proto/babylon/monitor/v1/query.proto +++ b/proto/babylon/monitor/v1/query.proto @@ -43,22 +43,22 @@ message QueryParamsResponse { // RPC method message QueryEndedEpochBtcHeightRequest { uint64 epoch_num = 1; } -// QueryEndedEpochBtcHeightResponse defines a response type for EndedEpochBtcHeight -// RPC method +// QueryEndedEpochBtcHeightResponse defines a response type for +// EndedEpochBtcHeight RPC method message QueryEndedEpochBtcHeightResponse { // height of btc light client when epoch ended uint64 btc_light_client_height = 1; } -// QueryReportedCheckpointBtcHeightRequest defines a query type for ReportedCheckpointBtcHeight -// RPC method +// QueryReportedCheckpointBtcHeightRequest defines a query type for +// ReportedCheckpointBtcHeight RPC method message QueryReportedCheckpointBtcHeightRequest { // ckpt_hash is hex encoded byte string of the hash of the checkpoint string ckpt_hash = 1; } -// QueryReportedCheckpointBtcHeightResponse defines a response type for ReportedCheckpointBtcHeight -// RPC method +// QueryReportedCheckpointBtcHeightResponse defines a response type for +// ReportedCheckpointBtcHeight RPC method message QueryReportedCheckpointBtcHeightResponse { // height of btc light client when checkpoint is reported uint64 btc_light_client_height = 1; diff --git a/proto/babylon/zoneconcierge/v1/packet.proto b/proto/babylon/zoneconcierge/v1/packet.proto index 8ce8bb28f..a330e0141 100644 --- a/proto/babylon/zoneconcierge/v1/packet.proto +++ b/proto/babylon/zoneconcierge/v1/packet.proto @@ -3,8 +3,13 @@ package babylon.zoneconcierge.v1; option go_package = "github.com/babylonchain/babylon/x/zoneconcierge/types"; +// ZoneconciergePacketData is the message that defines the IBC packets of +// ZoneConcierge message ZoneconciergePacketData { + // packet is the actual message carried in the IBC packet oneof packet { Heartbeat heartbeart = 1; } } +// Heartbeat is a heartbeat message that can be carried in IBC packets of +// ZoneConcierge message Heartbeat { string msg = 1; } diff --git a/proto/buf.yaml b/proto/buf.yaml index 7bad8beca..dc5409427 100644 --- a/proto/buf.yaml +++ b/proto/buf.yaml @@ -13,6 +13,11 @@ lint: - DEFAULT - COMMENTS - FILE_LOWER_SNAKE_CASE + - COMMENT_MESSAGE + - COMMENT_ENUM_VALUE + - COMMENT_ENUM + - COMMENT_RPC + - COMMENT_ONEOF except: - UNARY_RPC - COMMENT_FIELD @@ -21,9 +26,3 @@ lint: - RPC_REQUEST_STANDARD_NAME - ENUM_VALUE_PREFIX - ENUM_ZERO_VALUE_SUFFIX - # TODO Decide which comments we would like to enfore by linter - - COMMENT_MESSAGE - - COMMENT_ENUM_VALUE - - COMMENT_ENUM - - COMMENT_RPC - - COMMENT_ONEOF diff --git a/x/btccheckpoint/types/btccheckpoint.pb.go b/x/btccheckpoint/types/btccheckpoint.pb.go index 76b796c38..f779bda7f 100644 --- a/x/btccheckpoint/types/btccheckpoint.pb.go +++ b/x/btccheckpoint/types/btccheckpoint.pb.go @@ -24,6 +24,7 @@ var _ = math.Inf // proto package needs to be updated. const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package +// BtcStatus is an enum describing the current btc status of the checkpoint type BtcStatus int32 const ( @@ -447,12 +448,15 @@ func (m *EpochData) GetStatus() BtcStatus { return Submitted } +// CheckpointAddresses contains the addresses of the submitter and reporter of a +// given checkpoint type CheckpointAddresses struct { // TODO: this could probably be better typed - // Address of the checkpoint submitter, extracted from the checkpoint itself. + // submitter is the address of the checkpoint submitter to BTC, extracted from + // the checkpoint itself. Submitter []byte `protobuf:"bytes,1,opt,name=submitter,proto3" json:"submitter,omitempty"` - // Address of the reporter which reported the submissions, calculated from - // submission message MsgInsertBTCSpvProof itself + // reporter is the address of the reporter who reported the submissions, + // calculated from submission message MsgInsertBTCSpvProof itself Reporter []byte `protobuf:"bytes,2,opt,name=reporter,proto3" json:"reporter,omitempty"` } @@ -503,6 +507,8 @@ func (m *CheckpointAddresses) GetReporter() []byte { return nil } +// BTCCheckpointInfo contains all checkpoint related data expected in a query +// response. type BTCCheckpointInfo struct { // epoch number of this checkpoint EpochNumber uint64 `protobuf:"varint,1,opt,name=epoch_number,json=epochNumber,proto3" json:"epoch_number,omitempty"` diff --git a/x/btccheckpoint/types/query.pb.go b/x/btccheckpoint/types/query.pb.go index c953afc7c..65b155490 100644 --- a/x/btccheckpoint/types/query.pb.go +++ b/x/btccheckpoint/types/query.pb.go @@ -113,6 +113,8 @@ func (m *QueryParamsResponse) GetParams() Params { return Params{} } +// QueryBtcCheckpointInfoRequest defines the query to get the best checkpoint +// for a given epoch type QueryBtcCheckpointInfoRequest struct { // Number of epoch for which the earliest checkpointing btc height is // requested @@ -307,6 +309,8 @@ func (m *QueryBtcCheckpointsInfoResponse) GetPagination() *query.PageResponse { return nil } +// QueryEpochSubmissionsRequest defines a request to get all submissions in +// given epoch type QueryEpochSubmissionsRequest struct { // Number of epoch for which submissions are requested EpochNum uint64 `protobuf:"varint,1,opt,name=epoch_num,json=epochNum,proto3" json:"epoch_num,omitempty"` @@ -360,6 +364,8 @@ func (m *QueryEpochSubmissionsRequest) GetPagination() *query.PageRequest { return nil } +// QueryEpochSubmissionsResponse defines a response to get all submissions in +// given epoch (QueryEpochSubmissionsRequest) type QueryEpochSubmissionsResponse struct { // All submissions saved during an epoch. Keys []*SubmissionKey `protobuf:"bytes,1,rep,name=keys,proto3" json:"keys,omitempty"` @@ -489,6 +495,7 @@ type QueryClient interface { BtcCheckpointInfo(ctx context.Context, in *QueryBtcCheckpointInfoRequest, opts ...grpc.CallOption) (*QueryBtcCheckpointInfoResponse, error) // BtcCheckpointsInfo returns checkpoint info for a range of epochs BtcCheckpointsInfo(ctx context.Context, in *QueryBtcCheckpointsInfoRequest, opts ...grpc.CallOption) (*QueryBtcCheckpointsInfoResponse, error) + // EpochSubmissions returns all submissions for a given epoch EpochSubmissions(ctx context.Context, in *QueryEpochSubmissionsRequest, opts ...grpc.CallOption) (*QueryEpochSubmissionsResponse, error) } @@ -544,6 +551,7 @@ type QueryServer interface { BtcCheckpointInfo(context.Context, *QueryBtcCheckpointInfoRequest) (*QueryBtcCheckpointInfoResponse, error) // BtcCheckpointsInfo returns checkpoint info for a range of epochs BtcCheckpointsInfo(context.Context, *QueryBtcCheckpointsInfoRequest) (*QueryBtcCheckpointsInfoResponse, error) + // EpochSubmissions returns all submissions for a given epoch EpochSubmissions(context.Context, *QueryEpochSubmissionsRequest) (*QueryEpochSubmissionsResponse, error) } diff --git a/x/btccheckpoint/types/tx.pb.go b/x/btccheckpoint/types/tx.pb.go index fc27edf80..80e1b00f8 100644 --- a/x/btccheckpoint/types/tx.pb.go +++ b/x/btccheckpoint/types/tx.pb.go @@ -27,6 +27,8 @@ var _ = math.Inf // proto package needs to be updated. const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package +// MsgInsertBTCSpvProof defines resquest to insert a new checkpoint into the +// store type MsgInsertBTCSpvProof struct { Submitter string `protobuf:"bytes,1,opt,name=submitter,proto3" json:"submitter,omitempty"` Proofs []*BTCSpvProof `protobuf:"bytes,2,rep,name=proofs,proto3" json:"proofs,omitempty"` @@ -79,6 +81,8 @@ func (m *MsgInsertBTCSpvProof) GetProofs() []*BTCSpvProof { return nil } +// MsgInsertBTCSpvProofResponse defines the response for the +// MsgInsertBTCSpvProof message type MsgInsertBTCSpvProofResponse struct { } @@ -154,6 +158,7 @@ const _ = grpc.SupportPackageIsVersion4 // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. type MsgClient interface { + // InsertBTCSpvProof tries to insert a new checkpoint into the store. InsertBTCSpvProof(ctx context.Context, in *MsgInsertBTCSpvProof, opts ...grpc.CallOption) (*MsgInsertBTCSpvProofResponse, error) } @@ -176,6 +181,7 @@ func (c *msgClient) InsertBTCSpvProof(ctx context.Context, in *MsgInsertBTCSpvPr // MsgServer is the server API for Msg service. type MsgServer interface { + // InsertBTCSpvProof tries to insert a new checkpoint into the store. InsertBTCSpvProof(context.Context, *MsgInsertBTCSpvProof) (*MsgInsertBTCSpvProofResponse, error) } diff --git a/x/btclightclient/types/btclightclient.pb.go b/x/btclightclient/types/btclightclient.pb.go index df500a079..d4dc5f187 100644 --- a/x/btclightclient/types/btclightclient.pb.go +++ b/x/btclightclient/types/btclightclient.pb.go @@ -25,6 +25,14 @@ var _ = math.Inf // proto package needs to be updated. const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package +// BTCHeaderInfo is a structure that contains all relevant information about a +// BTC header +// - Full header bytes +// - Header hash for easy retrieval +// - Height of the header in the BTC chain +// - Total work spent on the header. This is the sum of the work corresponding +// to the header Bits field +// and the total work of the header. type BTCHeaderInfo struct { Header *github_com_babylonchain_babylon_types.BTCHeaderBytes `protobuf:"bytes,1,opt,name=header,proto3,customtype=github.com/babylonchain/babylon/types.BTCHeaderBytes" json:"header,omitempty"` Hash *github_com_babylonchain_babylon_types.BTCHeaderHashBytes `protobuf:"bytes,2,opt,name=hash,proto3,customtype=github.com/babylonchain/babylon/types.BTCHeaderHashBytes" json:"hash,omitempty"` diff --git a/x/btclightclient/types/query.pb.go b/x/btclightclient/types/query.pb.go index 6e10d98cf..fd2c8f8ab 100644 --- a/x/btclightclient/types/query.pb.go +++ b/x/btclightclient/types/query.pb.go @@ -481,6 +481,7 @@ func (m *QueryMainChainResponse) GetPagination() *query.PageResponse { return nil } +// QueryTipRequest is the request type for the Query/Tip RPC method. type QueryTipRequest struct { } @@ -517,6 +518,7 @@ func (m *QueryTipRequest) XXX_DiscardUnknown() { var xxx_messageInfo_QueryTipRequest proto.InternalMessageInfo +// QueryTipResponse is the response type for the Query/Tip RPC method. type QueryTipResponse struct { Header *BTCHeaderInfo `protobuf:"bytes,1,opt,name=header,proto3" json:"header,omitempty"` } @@ -561,6 +563,8 @@ func (m *QueryTipResponse) GetHeader() *BTCHeaderInfo { return nil } +// QueryBaseHeaderRequest is the request type for the Query/BaseHeader RPC +// method. type QueryBaseHeaderRequest struct { } @@ -597,6 +601,8 @@ func (m *QueryBaseHeaderRequest) XXX_DiscardUnknown() { var xxx_messageInfo_QueryBaseHeaderRequest proto.InternalMessageInfo +// QueryBaseHeaderResponse is the response type for the Query/BaseHeader RPC +// method. type QueryBaseHeaderResponse struct { Header *BTCHeaderInfo `protobuf:"bytes,1,opt,name=header,proto3" json:"header,omitempty"` } @@ -741,6 +747,8 @@ type QueryClient interface { MainChain(ctx context.Context, in *QueryMainChainRequest, opts ...grpc.CallOption) (*QueryMainChainResponse, error) // Tip return best header on canonical chain Tip(ctx context.Context, in *QueryTipRequest, opts ...grpc.CallOption) (*QueryTipResponse, error) + // BaseHeader returns the base BTC header of the chain. This header is defined + // on genesis. BaseHeader(ctx context.Context, in *QueryBaseHeaderRequest, opts ...grpc.CallOption) (*QueryBaseHeaderResponse, error) } @@ -832,6 +840,8 @@ type QueryServer interface { MainChain(context.Context, *QueryMainChainRequest) (*QueryMainChainResponse, error) // Tip return best header on canonical chain Tip(context.Context, *QueryTipRequest) (*QueryTipResponse, error) + // BaseHeader returns the base BTC header of the chain. This header is defined + // on genesis. BaseHeader(context.Context, *QueryBaseHeaderRequest) (*QueryBaseHeaderResponse, error) } diff --git a/x/btclightclient/types/tx.pb.go b/x/btclightclient/types/tx.pb.go index 6dd599807..4790b7e81 100644 --- a/x/btclightclient/types/tx.pb.go +++ b/x/btclightclient/types/tx.pb.go @@ -75,6 +75,7 @@ func (m *MsgInsertHeader) GetSigner() string { return "" } +// MsgInsertHeaderResponse defines the response for the InsertHeader transaction type MsgInsertHeaderResponse struct { } @@ -153,6 +154,8 @@ const _ = grpc.SupportPackageIsVersion4 // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. type MsgClient interface { + // InsertHeader adds a header to the BTC light client chain maintained by + // Babylon. InsertHeader(ctx context.Context, in *MsgInsertHeader, opts ...grpc.CallOption) (*MsgInsertHeaderResponse, error) } @@ -175,6 +178,8 @@ func (c *msgClient) InsertHeader(ctx context.Context, in *MsgInsertHeader, opts // MsgServer is the server API for Msg service. type MsgServer interface { + // InsertHeader adds a header to the BTC light client chain maintained by + // Babylon. InsertHeader(context.Context, *MsgInsertHeader) (*MsgInsertHeaderResponse, error) } diff --git a/x/checkpointing/types/checkpoint.pb.go b/x/checkpointing/types/checkpoint.pb.go index 51b473cc0..587a53aaa 100644 --- a/x/checkpointing/types/checkpoint.pb.go +++ b/x/checkpointing/types/checkpoint.pb.go @@ -29,7 +29,7 @@ var _ = time.Kitchen // proto package needs to be updated. const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package -// CkptStatus is the status of a checkpoint. +// CheckpointStatus is the status of a checkpoint. type CheckpointStatus int32 const ( @@ -206,6 +206,7 @@ func (m *RawCheckpointWithMeta) GetLifecycle() []*CheckpointStateUpdate { return nil } +// CheckpointStateUpdate defines a state transition on the checkpoint. type CheckpointStateUpdate struct { // state defines the event of a state transition towards this state State CheckpointStatus `protobuf:"varint,1,opt,name=state,proto3,enum=babylon.checkpointing.v1.CheckpointStatus" json:"state,omitempty"` diff --git a/x/checkpointing/types/events.pb.go b/x/checkpointing/types/events.pb.go index 0ff869053..10e283497 100644 --- a/x/checkpointing/types/events.pb.go +++ b/x/checkpointing/types/events.pb.go @@ -22,6 +22,8 @@ var _ = math.Inf // proto package needs to be updated. const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package +// EventCheckpointAccumulating is emitted when a checkpoint reaches the +// `Accumulating` state. type EventCheckpointAccumulating struct { Checkpoint *RawCheckpointWithMeta `protobuf:"bytes,1,opt,name=checkpoint,proto3" json:"checkpoint,omitempty"` } @@ -66,6 +68,8 @@ func (m *EventCheckpointAccumulating) GetCheckpoint() *RawCheckpointWithMeta { return nil } +// EventCheckpointSealed is emitted when a checkpoint reaches the `Sealed` +// state. type EventCheckpointSealed struct { Checkpoint *RawCheckpointWithMeta `protobuf:"bytes,1,opt,name=checkpoint,proto3" json:"checkpoint,omitempty"` } @@ -110,6 +114,8 @@ func (m *EventCheckpointSealed) GetCheckpoint() *RawCheckpointWithMeta { return nil } +// EventCheckpointSubmitted is emitted when a checkpoint reaches the `Submitted` +// state. type EventCheckpointSubmitted struct { Checkpoint *RawCheckpointWithMeta `protobuf:"bytes,1,opt,name=checkpoint,proto3" json:"checkpoint,omitempty"` } @@ -154,6 +160,8 @@ func (m *EventCheckpointSubmitted) GetCheckpoint() *RawCheckpointWithMeta { return nil } +// EventCheckpointConfirmed is emitted when a checkpoint reaches the `Confirmed` +// state. type EventCheckpointConfirmed struct { Checkpoint *RawCheckpointWithMeta `protobuf:"bytes,1,opt,name=checkpoint,proto3" json:"checkpoint,omitempty"` } @@ -198,6 +206,8 @@ func (m *EventCheckpointConfirmed) GetCheckpoint() *RawCheckpointWithMeta { return nil } +// EventCheckpointFinalized is emitted when a checkpoint reaches the `Finalized` +// state. type EventCheckpointFinalized struct { Checkpoint *RawCheckpointWithMeta `protobuf:"bytes,1,opt,name=checkpoint,proto3" json:"checkpoint,omitempty"` } @@ -242,6 +252,8 @@ func (m *EventCheckpointFinalized) GetCheckpoint() *RawCheckpointWithMeta { return nil } +// EventCheckpointForgotten is emitted when a checkpoint switches to a +// `Forgotten` state. type EventCheckpointForgotten struct { Checkpoint *RawCheckpointWithMeta `protobuf:"bytes,1,opt,name=checkpoint,proto3" json:"checkpoint,omitempty"` } @@ -286,6 +298,8 @@ func (m *EventCheckpointForgotten) GetCheckpoint() *RawCheckpointWithMeta { return nil } +// EventConflictingCheckpoint is emitted when two conflicting checkpoints are +// found. type EventConflictingCheckpoint struct { ConflictingCheckpoint *RawCheckpoint `protobuf:"bytes,1,opt,name=conflicting_checkpoint,json=conflictingCheckpoint,proto3" json:"conflicting_checkpoint,omitempty"` LocalCheckpoint *RawCheckpointWithMeta `protobuf:"bytes,2,opt,name=local_checkpoint,json=localCheckpoint,proto3" json:"local_checkpoint,omitempty"` diff --git a/x/checkpointing/types/genesis.pb.go b/x/checkpointing/types/genesis.pb.go index 79e9934cb..ae69039b7 100644 --- a/x/checkpointing/types/genesis.pb.go +++ b/x/checkpointing/types/genesis.pb.go @@ -27,7 +27,8 @@ const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package // GenesisState defines the checkpointing module's genesis state. type GenesisState struct { // params defines all the paramaters of related to checkpointing - Params Params `protobuf:"bytes,1,opt,name=params,proto3" json:"params"` + Params Params `protobuf:"bytes,1,opt,name=params,proto3" json:"params"` + // genesis_keys defines the public keys for the genesis validators GenesisKeys []*GenesisKey `protobuf:"bytes,2,rep,name=genesis_keys,json=genesisKeys,proto3" json:"genesis_keys,omitempty"` } @@ -78,6 +79,7 @@ func (m *GenesisState) GetGenesisKeys() []*GenesisKey { return nil } +// GenesisKey defines public key information about the genesis validators type GenesisKey struct { // validator_address is the address corresponding to a validator ValidatorAddress string `protobuf:"bytes,1,opt,name=validator_address,json=validatorAddress,proto3" json:"validator_address,omitempty"` diff --git a/x/checkpointing/types/query.pb.go b/x/checkpointing/types/query.pb.go index fdab80cde..08671a168 100644 --- a/x/checkpointing/types/query.pb.go +++ b/x/checkpointing/types/query.pb.go @@ -548,6 +548,8 @@ func (m *QueryRecentEpochStatusCountResponse) GetStatusCount() map[string]uint64 return nil } +// QueryLastCheckpointWithStatusRequest is the request type for the +// Query/LastCheckpointWithStatus RPC method. type QueryLastCheckpointWithStatusRequest struct { Status CheckpointStatus `protobuf:"varint,1,opt,name=status,proto3,enum=babylon.checkpointing.v1.CheckpointStatus" json:"status,omitempty"` } @@ -592,6 +594,8 @@ func (m *QueryLastCheckpointWithStatusRequest) GetStatus() CheckpointStatus { return Accumulating } +// QueryLastCheckpointWithStatusResponse is the response type for the +// Query/LastCheckpointWithStatus RPC method. type QueryLastCheckpointWithStatusResponse struct { RawCheckpoint *RawCheckpoint `protobuf:"bytes,1,opt,name=raw_checkpoint,json=rawCheckpoint,proto3" json:"raw_checkpoint,omitempty"` } diff --git a/x/epoching/types/epoching.pb.go b/x/epoching/types/epoching.pb.go index a0eae549b..ffa316a79 100644 --- a/x/epoching/types/epoching.pb.go +++ b/x/epoching/types/epoching.pb.go @@ -29,14 +29,20 @@ var _ = time.Kitchen // proto package needs to be updated. const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package +// BondState is the bond state of a validator or delegation type BondState int32 const ( - BondState_CREATED BondState = 0 - BondState_BONDED BondState = 1 + // CREATED is when the validator/delegation has been created + BondState_CREATED BondState = 0 + // CREATED is when the validator/delegation has become bonded + BondState_BONDED BondState = 1 + // CREATED is when the validator/delegation has become unbonding BondState_UNBONDING BondState = 2 - BondState_UNBONDED BondState = 3 - BondState_REMOVED BondState = 4 + // CREATED is when the validator/delegation has become unbonded + BondState_UNBONDED BondState = 3 + // CREATED is when the validator/delegation has been removed + BondState_REMOVED BondState = 4 ) var BondState_name = map[int32]string{ @@ -63,6 +69,7 @@ func (BondState) EnumDescriptor() ([]byte, []int) { return fileDescriptor_2f2f209d5311f84c, []int{0} } +// Epoch is a structure that contains the metadata of an epoch type Epoch struct { EpochNumber uint64 `protobuf:"varint,1,opt,name=epoch_number,json=epochNumber,proto3" json:"epoch_number,omitempty"` CurrentEpochInterval uint64 `protobuf:"varint,2,opt,name=current_epoch_interval,json=currentEpochInterval,proto3" json:"current_epoch_interval,omitempty"` @@ -309,6 +316,8 @@ func (*QueuedMessage) XXX_OneofWrappers() []interface{} { } } +// QueuedMessageList is a message that contains a list of staking-related +// messages queued for an epoch type QueuedMessageList struct { EpochNumber uint64 `protobuf:"varint,1,opt,name=epoch_number,json=epochNumber,proto3" json:"epoch_number,omitempty"` Msgs []*QueuedMessage `protobuf:"bytes,2,rep,name=msgs,proto3" json:"msgs,omitempty"` @@ -361,6 +370,7 @@ func (m *QueuedMessageList) GetMsgs() []*QueuedMessage { return nil } +// ValStateUpdate is a messages that records a state update of a validator type ValStateUpdate struct { State BondState `protobuf:"varint,1,opt,name=state,proto3,enum=babylon.epoching.v1.BondState" json:"state,omitempty"` BlockHeight uint64 `protobuf:"varint,2,opt,name=block_height,json=blockHeight,proto3" json:"block_height,omitempty"` @@ -421,6 +431,8 @@ func (m *ValStateUpdate) GetBlockTime() *time.Time { return nil } +// ValidatorLifecycle is a message that records records the lifecycle of +// a validator type ValidatorLifecycle struct { ValAddr string `protobuf:"bytes,1,opt,name=val_addr,json=valAddr,proto3" json:"val_addr,omitempty"` ValLife []*ValStateUpdate `protobuf:"bytes,2,rep,name=val_life,json=valLife,proto3" json:"val_life,omitempty"` @@ -473,6 +485,8 @@ func (m *ValidatorLifecycle) GetValLife() []*ValStateUpdate { return nil } +// DelegationStateUpdate is the message that records a state update of a +// delegation type DelegationStateUpdate struct { State BondState `protobuf:"varint,1,opt,name=state,proto3,enum=babylon.epoching.v1.BondState" json:"state,omitempty"` ValAddr string `protobuf:"bytes,2,opt,name=val_addr,json=valAddr,proto3" json:"val_addr,omitempty"` @@ -541,6 +555,8 @@ func (m *DelegationStateUpdate) GetBlockTime() *time.Time { return nil } +// ValidatorLifecycle is a message that records records the lifecycle of +// a delegation type DelegationLifecycle struct { DelAddr string `protobuf:"bytes,1,opt,name=del_addr,json=delAddr,proto3" json:"del_addr,omitempty"` DelLife []*DelegationStateUpdate `protobuf:"bytes,2,rep,name=del_life,json=delLife,proto3" json:"del_life,omitempty"` @@ -593,6 +609,7 @@ func (m *DelegationLifecycle) GetDelLife() []*DelegationStateUpdate { return nil } +// Validator is a message that denotes a validator type Validator struct { // addr is the validator's address (in sdk.ValAddress) Addr []byte `protobuf:"bytes,1,opt,name=addr,proto3" json:"addr,omitempty"` diff --git a/x/epoching/types/events.pb.go b/x/epoching/types/events.pb.go index 656b776d3..5037813b2 100644 --- a/x/epoching/types/events.pb.go +++ b/x/epoching/types/events.pb.go @@ -24,6 +24,7 @@ var _ = math.Inf // proto package needs to be updated. const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package +// EventBeginEpoch is the event emitted when an epoch has started type EventBeginEpoch struct { EpochNumber uint64 `protobuf:"varint,1,opt,name=epoch_number,json=epochNumber,proto3" json:"epoch_number,omitempty"` } @@ -68,6 +69,7 @@ func (m *EventBeginEpoch) GetEpochNumber() uint64 { return 0 } +// EventEndEpoch is the event emitted when an epoch has ended type EventEndEpoch struct { EpochNumber uint64 `protobuf:"varint,1,opt,name=epoch_number,json=epochNumber,proto3" json:"epoch_number,omitempty"` } @@ -112,6 +114,8 @@ func (m *EventEndEpoch) GetEpochNumber() uint64 { return 0 } +// EventHandleQueuedMsg is the event emitted when a queued message has been +// handled type EventHandleQueuedMsg struct { OriginalEventType string `protobuf:"bytes,1,opt,name=original_event_type,json=originalEventType,proto3" json:"original_event_type,omitempty"` EpochNumber uint64 `protobuf:"varint,2,opt,name=epoch_number,json=epochNumber,proto3" json:"epoch_number,omitempty"` @@ -197,6 +201,8 @@ func (m *EventHandleQueuedMsg) GetError() string { return "" } +// EventSlashThreshold is the event emitted when a set of validators have been +// slashed type EventSlashThreshold struct { SlashedVotingPower int64 `protobuf:"varint,1,opt,name=slashed_voting_power,json=slashedVotingPower,proto3" json:"slashed_voting_power,omitempty"` TotalVotingPower int64 `protobuf:"varint,2,opt,name=total_voting_power,json=totalVotingPower,proto3" json:"total_voting_power,omitempty"` @@ -257,6 +263,8 @@ func (m *EventSlashThreshold) GetSlashedValidators() [][]byte { return nil } +// EventWrappedDelegate is the event emitted when a MsgWrappedDelegate has been +// queued type EventWrappedDelegate struct { DelegatorAddress string `protobuf:"bytes,1,opt,name=delegator_address,json=delegatorAddress,proto3" json:"delegator_address,omitempty"` ValidatorAddress string `protobuf:"bytes,2,opt,name=validator_address,json=validatorAddress,proto3" json:"validator_address,omitempty"` @@ -333,6 +341,8 @@ func (m *EventWrappedDelegate) GetEpochBoundary() uint64 { return 0 } +// EventWrappedUndelegate is the event emitted when a MsgWrappedUndelegate has +// been queued type EventWrappedUndelegate struct { DelegatorAddress string `protobuf:"bytes,1,opt,name=delegator_address,json=delegatorAddress,proto3" json:"delegator_address,omitempty"` ValidatorAddress string `protobuf:"bytes,2,opt,name=validator_address,json=validatorAddress,proto3" json:"validator_address,omitempty"` @@ -409,6 +419,8 @@ func (m *EventWrappedUndelegate) GetEpochBoundary() uint64 { return 0 } +// EventWrappedBeginRedelegate is the event emitted when a +// MsgWrappedBeginRedelegate has been queued type EventWrappedBeginRedelegate struct { DelegatorAddress string `protobuf:"bytes,1,opt,name=delegator_address,json=delegatorAddress,proto3" json:"delegator_address,omitempty"` SourceValidatorAddress string `protobuf:"bytes,2,opt,name=source_validator_address,json=sourceValidatorAddress,proto3" json:"source_validator_address,omitempty"` diff --git a/x/epoching/types/query.pb.go b/x/epoching/types/query.pb.go index d8788aa2f..59bfc31b9 100644 --- a/x/epoching/types/query.pb.go +++ b/x/epoching/types/query.pb.go @@ -113,6 +113,7 @@ func (m *QueryParamsResponse) GetParams() Params { return Params{} } +// QueryEpochInfoRequest is the request type for the Query/EpochInfo method type QueryEpochInfoRequest struct { EpochNum uint64 `protobuf:"varint,1,opt,name=epoch_num,json=epochNum,proto3" json:"epoch_num,omitempty"` } @@ -157,6 +158,7 @@ func (m *QueryEpochInfoRequest) GetEpochNum() uint64 { return 0 } +// QueryEpochInfoRequest is the response type for the Query/EpochInfo method type QueryEpochInfoResponse struct { Epoch *Epoch `protobuf:"bytes,1,opt,name=epoch,proto3" json:"epoch,omitempty"` } @@ -201,6 +203,7 @@ func (m *QueryEpochInfoResponse) GetEpoch() *Epoch { return nil } +// QueryEpochInfosRequest is the request type for the Query/EpochInfos method type QueryEpochsInfoRequest struct { // pagination defines whether to have the pagination in the request Pagination *query.PageRequest `protobuf:"bytes,1,opt,name=pagination,proto3" json:"pagination,omitempty"` @@ -246,6 +249,7 @@ func (m *QueryEpochsInfoRequest) GetPagination() *query.PageRequest { return nil } +// QueryEpochsInfoResponse is the response type for the Query/EpochInfos method type QueryEpochsInfoResponse struct { Epochs []*Epoch `protobuf:"bytes,1,rep,name=epochs,proto3" json:"epochs,omitempty"` // pagination defines the pagination in the response @@ -625,6 +629,8 @@ func (m *QueryLatestEpochMsgsResponse) GetPagination() *query.PageResponse { return nil } +// QueryValidatorLifecycleRequest is the request type for the +// Query/ValidatorLifecycle RPC method type QueryValidatorLifecycleRequest struct { ValAddr string `protobuf:"bytes,1,opt,name=val_addr,json=valAddr,proto3" json:"val_addr,omitempty"` } @@ -669,6 +675,8 @@ func (m *QueryValidatorLifecycleRequest) GetValAddr() string { return "" } +// QueryValidatorLifecycleResponse is the response type for the +// Query/ValidatorLifecycle RPC method type QueryValidatorLifecycleResponse struct { ValLife *ValidatorLifecycle `protobuf:"bytes,1,opt,name=val_life,json=valLife,proto3" json:"val_life,omitempty"` } @@ -713,6 +721,8 @@ func (m *QueryValidatorLifecycleResponse) GetValLife() *ValidatorLifecycle { return nil } +// QueryDelegationLifecycleRequest is the request type for the +// Query/DelegationLifecycle RPC method type QueryDelegationLifecycleRequest struct { DelAddr string `protobuf:"bytes,1,opt,name=del_addr,json=delAddr,proto3" json:"del_addr,omitempty"` } @@ -757,6 +767,8 @@ func (m *QueryDelegationLifecycleRequest) GetDelAddr() string { return "" } +// QueryDelegationLifecycleRequest is the response type for the +// Query/DelegationLifecycle RPC method type QueryDelegationLifecycleResponse struct { DelLife *DelegationLifecycle `protobuf:"bytes,1,opt,name=del_life,json=delLife,proto3" json:"del_life,omitempty"` } @@ -801,6 +813,8 @@ func (m *QueryDelegationLifecycleResponse) GetDelLife() *DelegationLifecycle { return nil } +// QueryEpochValSetRequest is the request type for the Query/EpochValSet RPC +// method type QueryEpochValSetRequest struct { EpochNum uint64 `protobuf:"varint,1,opt,name=epoch_num,json=epochNum,proto3" json:"epoch_num,omitempty"` Pagination *query.PageRequest `protobuf:"bytes,2,opt,name=pagination,proto3" json:"pagination,omitempty"` @@ -853,6 +867,8 @@ func (m *QueryEpochValSetRequest) GetPagination() *query.PageRequest { return nil } +// QueryEpochValSetRequest is the response type for the Query/EpochValSet RPC +// method type QueryEpochValSetResponse struct { Validators []*Validator `protobuf:"bytes,1,rep,name=validators,proto3" json:"validators,omitempty"` TotalVotingPower int64 `protobuf:"varint,2,opt,name=total_voting_power,json=totalVotingPower,proto3" json:"total_voting_power,omitempty"` diff --git a/x/epoching/types/tx.pb.go b/x/epoching/types/tx.pb.go index 35ea70810..4c5d0aa48 100644 --- a/x/epoching/types/tx.pb.go +++ b/x/epoching/types/tx.pb.go @@ -29,6 +29,7 @@ var _ = math.Inf // proto package needs to be updated. const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package +// MsgWrappedDelegate is the message for delegating stakes type MsgWrappedDelegate struct { Msg *types.MsgDelegate `protobuf:"bytes,1,opt,name=msg,proto3" json:"msg,omitempty"` } @@ -66,6 +67,7 @@ func (m *MsgWrappedDelegate) XXX_DiscardUnknown() { var xxx_messageInfo_MsgWrappedDelegate proto.InternalMessageInfo +// MsgWrappedDelegate is the response to the MsgWrappedDelegate message type MsgWrappedDelegateResponse struct { } @@ -102,6 +104,7 @@ func (m *MsgWrappedDelegateResponse) XXX_DiscardUnknown() { var xxx_messageInfo_MsgWrappedDelegateResponse proto.InternalMessageInfo +// MsgWrappedUndelegate is the message for undelegating stakes type MsgWrappedUndelegate struct { Msg *types.MsgUndelegate `protobuf:"bytes,1,opt,name=msg,proto3" json:"msg,omitempty"` } @@ -139,6 +142,8 @@ func (m *MsgWrappedUndelegate) XXX_DiscardUnknown() { var xxx_messageInfo_MsgWrappedUndelegate proto.InternalMessageInfo +// MsgWrappedUndelegateResponse is the response to the MsgWrappedUndelegate +// message type MsgWrappedUndelegateResponse struct { } @@ -175,6 +180,8 @@ func (m *MsgWrappedUndelegateResponse) XXX_DiscardUnknown() { var xxx_messageInfo_MsgWrappedUndelegateResponse proto.InternalMessageInfo +// MsgWrappedDelegate is the message for moving bonded stakes from a +// validator to another validator type MsgWrappedBeginRedelegate struct { Msg *types.MsgBeginRedelegate `protobuf:"bytes,1,opt,name=msg,proto3" json:"msg,omitempty"` } @@ -212,6 +219,8 @@ func (m *MsgWrappedBeginRedelegate) XXX_DiscardUnknown() { var xxx_messageInfo_MsgWrappedBeginRedelegate proto.InternalMessageInfo +// MsgWrappedBeginRedelegateResponse is the response to the +// MsgWrappedBeginRedelegate message type MsgWrappedBeginRedelegateResponse struct { } diff --git a/x/monitor/types/query.pb.go b/x/monitor/types/query.pb.go index dd345b0c7..ab3fac671 100644 --- a/x/monitor/types/query.pb.go +++ b/x/monitor/types/query.pb.go @@ -112,6 +112,8 @@ func (m *QueryParamsResponse) GetParams() Params { return Params{} } +// QueryEndedEpochBtcHeightRequest defines a query type for EndedEpochBtcHeight +// RPC method type QueryEndedEpochBtcHeightRequest struct { EpochNum uint64 `protobuf:"varint,1,opt,name=epoch_num,json=epochNum,proto3" json:"epoch_num,omitempty"` } @@ -156,6 +158,8 @@ func (m *QueryEndedEpochBtcHeightRequest) GetEpochNum() uint64 { return 0 } +// QueryEndedEpochBtcHeightResponse defines a response type for +// EndedEpochBtcHeight RPC method type QueryEndedEpochBtcHeightResponse struct { // height of btc light client when epoch ended BtcLightClientHeight uint64 `protobuf:"varint,1,opt,name=btc_light_client_height,json=btcLightClientHeight,proto3" json:"btc_light_client_height,omitempty"` @@ -201,6 +205,8 @@ func (m *QueryEndedEpochBtcHeightResponse) GetBtcLightClientHeight() uint64 { return 0 } +// QueryReportedCheckpointBtcHeightRequest defines a query type for +// ReportedCheckpointBtcHeight RPC method type QueryReportedCheckpointBtcHeightRequest struct { // ckpt_hash is hex encoded byte string of the hash of the checkpoint CkptHash string `protobuf:"bytes,1,opt,name=ckpt_hash,json=ckptHash,proto3" json:"ckpt_hash,omitempty"` @@ -248,6 +254,8 @@ func (m *QueryReportedCheckpointBtcHeightRequest) GetCkptHash() string { return "" } +// QueryReportedCheckpointBtcHeightResponse defines a response type for +// ReportedCheckpointBtcHeight RPC method type QueryReportedCheckpointBtcHeightResponse struct { // height of btc light client when checkpoint is reported BtcLightClientHeight uint64 `protobuf:"varint,1,opt,name=btc_light_client_height,json=btcLightClientHeight,proto3" json:"btc_light_client_height,omitempty"` diff --git a/x/zoneconcierge/types/packet.pb.go b/x/zoneconcierge/types/packet.pb.go index 54e720aa4..1f2bb92a2 100644 --- a/x/zoneconcierge/types/packet.pb.go +++ b/x/zoneconcierge/types/packet.pb.go @@ -22,7 +22,11 @@ var _ = math.Inf // proto package needs to be updated. const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package +// ZoneconciergePacketData is the message that defines the IBC packets of +// ZoneConcierge type ZoneconciergePacketData struct { + // packet is the actual message carried in the IBC packet + // // Types that are valid to be assigned to Packet: // // *ZoneconciergePacketData_Heartbeart @@ -95,6 +99,8 @@ func (*ZoneconciergePacketData) XXX_OneofWrappers() []interface{} { } } +// Heartbeat is a heartbeat message that can be carried in IBC packets of +// ZoneConcierge type Heartbeat struct { Msg string `protobuf:"bytes,1,opt,name=msg,proto3" json:"msg,omitempty"` } From aab434da2897acfb5c9c4d7887008840b929b188 Mon Sep 17 00:00:00 2001 From: KonradStaniec Date: Thu, 23 Mar 2023 07:57:40 +0100 Subject: [PATCH 19/59] Use new version for our fork of ibc go (#332) New version has been simplified due to usage of ibc-go v7 New version can work with other types of light clients not only tendermint --- go.mod | 2 +- go.sum | 4 ++-- testutil/datagen/tendermint.go | 9 +++++++++ x/zoneconcierge/keeper/grpc_query_test.go | 2 +- x/zoneconcierge/keeper/hooks.go | 9 ++++----- x/zoneconcierge/keeper/keeper_test.go | 6 +++--- 6 files changed, 20 insertions(+), 12 deletions(-) diff --git a/go.mod b/go.mod index 05da22b25..0461b4405 100644 --- a/go.mod +++ b/go.mod @@ -203,7 +203,7 @@ replace ( // slay the dragonberry github.com/confio/ics23/go => github.com/cosmos/cosmos-sdk/ics23/go v0.8.0 - github.com/cosmos/ibc-go/v7 => github.com/babylonchain/ibc-go/v7 v7.0.0-20230317081654-61da7c3b41b6 + github.com/cosmos/ibc-go/v7 => github.com/babylonchain/ibc-go/v7 v7.0.0-20230322083529-2c0496728e4a // Fix upstream GHSA-h395-qcrw-5vmq vulnerability. // TODO Remove it: https://github.com/cosmos/cosmos-sdk/issues/10409 diff --git a/go.sum b/go.sum index 0afbde3ed..812a1cdf6 100644 --- a/go.sum +++ b/go.sum @@ -246,8 +246,8 @@ github.com/aws/aws-sdk-go v1.44.122/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX github.com/aws/aws-sdk-go v1.44.203 h1:pcsP805b9acL3wUqa4JR2vg1k2wnItkDYNvfmcy6F+U= github.com/aws/aws-sdk-go v1.44.203/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= -github.com/babylonchain/ibc-go/v7 v7.0.0-20230317081654-61da7c3b41b6 h1:F41qzSK1VF6ZZqu+Xv3U9pHOYbJOSaWrw1iv8LeFsbg= -github.com/babylonchain/ibc-go/v7 v7.0.0-20230317081654-61da7c3b41b6/go.mod h1:BFh8nKWjr5zeR2OZfhkzdgDzj1+KjRn3aJLpwapStj8= +github.com/babylonchain/ibc-go/v7 v7.0.0-20230322083529-2c0496728e4a h1:2ys6u9PAdj/xJr9sCOzWfsvqXtoAsCnm8SJcP1xrq6g= +github.com/babylonchain/ibc-go/v7 v7.0.0-20230322083529-2c0496728e4a/go.mod h1:BFh8nKWjr5zeR2OZfhkzdgDzj1+KjRn3aJLpwapStj8= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= diff --git a/testutil/datagen/tendermint.go b/testutil/datagen/tendermint.go index d5eb698bb..e666843cf 100644 --- a/testutil/datagen/tendermint.go +++ b/testutil/datagen/tendermint.go @@ -4,6 +4,7 @@ import ( "time" tmproto "github.com/cometbft/cometbft/proto/tendermint/types" + ibcclientkeeper "github.com/cosmos/ibc-go/v7/modules/core/02-client/keeper" ibctmtypes "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" ) @@ -27,3 +28,11 @@ func GenRandomIBCTMHeader(chainID string, height uint64) *ibctmtypes.Header { }, } } + +func HeaderToHeaderInfo(header *ibctmtypes.Header) *ibcclientkeeper.HeaderInfo { + return &ibcclientkeeper.HeaderInfo{ + Hash: header.Header.LastCommitHash, + ChaindId: header.Header.ChainID, + Height: uint64(header.Header.Height), + } +} diff --git a/x/zoneconcierge/keeper/grpc_query_test.go b/x/zoneconcierge/keeper/grpc_query_test.go index 1865159f0..e07de8a64 100644 --- a/x/zoneconcierge/keeper/grpc_query_test.go +++ b/x/zoneconcierge/keeper/grpc_query_test.go @@ -43,7 +43,7 @@ func FuzzChainList(f *testing.F) { allChainIDs = append(allChainIDs, chainID) } header := datagen.GenRandomIBCTMHeader(chainID, 0) - hooks.AfterHeaderWithValidCommit(ctx, datagen.GenRandomByteArray(32), header, false) + hooks.AfterHeaderWithValidCommit(ctx, datagen.GenRandomByteArray(32), datagen.HeaderToHeaderInfo(header), false) } limit := datagen.RandomInt(len(allChainIDs)) + 1 diff --git a/x/zoneconcierge/keeper/hooks.go b/x/zoneconcierge/keeper/hooks.go index 7e85570c3..c46e3a820 100644 --- a/x/zoneconcierge/keeper/hooks.go +++ b/x/zoneconcierge/keeper/hooks.go @@ -9,7 +9,6 @@ import ( "github.com/babylonchain/babylon/x/zoneconcierge/types" sdk "github.com/cosmos/cosmos-sdk/types" ibcclientkeeper "github.com/cosmos/ibc-go/v7/modules/core/02-client/keeper" - ibctmtypes "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" ) type Hooks struct { @@ -24,12 +23,12 @@ var _ epochingtypes.EpochingHooks = Hooks{} func (k Keeper) Hooks() Hooks { return Hooks{k} } // AfterHeaderWithValidCommit is triggered upon each CZ header with a valid QC -func (h Hooks) AfterHeaderWithValidCommit(ctx sdk.Context, txHash []byte, header *ibctmtypes.Header, isOnFork bool) { +func (h Hooks) AfterHeaderWithValidCommit(ctx sdk.Context, txHash []byte, header *ibcclientkeeper.HeaderInfo, isOnFork bool) { babylonHeader := ctx.BlockHeader() indexedHeader := types.IndexedHeader{ - ChainId: header.Header.ChainID, - Hash: header.Header.LastCommitHash, - Height: uint64(header.Header.Height), + ChainId: header.ChaindId, + Hash: header.Hash, + Height: uint64(header.Height), BabylonHeader: &babylonHeader, BabylonEpoch: h.k.GetEpoch(ctx).EpochNumber, BabylonTxHash: txHash, diff --git a/x/zoneconcierge/keeper/keeper_test.go b/x/zoneconcierge/keeper/keeper_test.go index 68e72f86c..421f36c15 100644 --- a/x/zoneconcierge/keeper/keeper_test.go +++ b/x/zoneconcierge/keeper/keeper_test.go @@ -40,7 +40,7 @@ func SimulateHeadersViaHook(ctx sdk.Context, hooks zckeeper.Hooks, chainID strin // invoke the hook a number of times to simulate a number of blocks for i := uint64(0); i < numHeaders; i++ { header := datagen.GenRandomIBCTMHeader(chainID, startHeight+i) - hooks.AfterHeaderWithValidCommit(ctx, datagen.GenRandomByteArray(32), header, false) + hooks.AfterHeaderWithValidCommit(ctx, datagen.GenRandomByteArray(32), datagen.HeaderToHeaderInfo(header), false) headers = append(headers, header) } return headers @@ -52,7 +52,7 @@ func SimulateHeadersAndForksViaHook(ctx sdk.Context, hooks zckeeper.Hooks, chain // invoke the hook a number of times to simulate a number of blocks for i := uint64(0); i < numHeaders; i++ { header := datagen.GenRandomIBCTMHeader(chainID, startHeight+i) - hooks.AfterHeaderWithValidCommit(ctx, datagen.GenRandomByteArray(32), header, false) + hooks.AfterHeaderWithValidCommit(ctx, datagen.GenRandomByteArray(32), datagen.HeaderToHeaderInfo(header), false) headers = append(headers, header) } @@ -60,7 +60,7 @@ func SimulateHeadersAndForksViaHook(ctx sdk.Context, hooks zckeeper.Hooks, chain forkHeaders := []*ibctmtypes.Header{} for i := uint64(0); i < numForkHeaders; i++ { header := datagen.GenRandomIBCTMHeader(chainID, startHeight+numHeaders-1) - hooks.AfterHeaderWithValidCommit(ctx, datagen.GenRandomByteArray(32), header, true) + hooks.AfterHeaderWithValidCommit(ctx, datagen.GenRandomByteArray(32), datagen.HeaderToHeaderInfo(header), true) forkHeaders = append(forkHeaders, header) } return headers, forkHeaders From 6aac360cd4b75b16e4128bfade91983ea4a85b37 Mon Sep 17 00:00:00 2001 From: Runchao Han Date: Fri, 24 Mar 2023 20:12:47 +1100 Subject: [PATCH 20/59] zoneconcierge: moving extended client keeper to Babylon repo (#333) --- app/app.go | 6 +- go.mod | 2 +- go.sum | 4 +- testutil/datagen/tendermint.go | 6 +- .../extended-client-keeper/hooks.go | 42 +++++ .../extended-client-keeper/keeper.go | 149 ++++++++++++++++++ x/zoneconcierge/keeper/hooks.go | 6 +- 7 files changed, 203 insertions(+), 12 deletions(-) create mode 100644 x/zoneconcierge/extended-client-keeper/hooks.go create mode 100644 x/zoneconcierge/extended-client-keeper/keeper.go diff --git a/app/app.go b/app/app.go index 6f23ee0cd..c2d089fa5 100644 --- a/app/app.go +++ b/app/app.go @@ -121,11 +121,11 @@ import ( monitorkeeper "github.com/babylonchain/babylon/x/monitor/keeper" monitortypes "github.com/babylonchain/babylon/x/monitor/types" + extendedkeeper "github.com/babylonchain/babylon/x/zoneconcierge/extended-client-keeper" "github.com/cosmos/ibc-go/v7/modules/apps/transfer" ibctransferkeeper "github.com/cosmos/ibc-go/v7/modules/apps/transfer/keeper" ibctransfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" ibc "github.com/cosmos/ibc-go/v7/modules/core" - ibcclientkeeper "github.com/cosmos/ibc-go/v7/modules/core/02-client/keeper" porttypes "github.com/cosmos/ibc-go/v7/modules/core/05-port/types" // ibc module puts types under `ibchost` rather than `ibctypes` ibcexported "github.com/cosmos/ibc-go/v7/modules/core/exported" ibckeeper "github.com/cosmos/ibc-go/v7/modules/core/keeper" @@ -469,10 +469,10 @@ func NewBabylonApp( ) // replace IBC keeper's client keeper with our ExtendedKeeper - extendedClientKeeper := ibcclientkeeper.NewExtendedKeeper(appCodec, keys[ibcexported.StoreKey], app.GetSubspace(ibcexported.ModuleName), app.StakingKeeper, app.UpgradeKeeper) + extendedClientKeeper := extendedkeeper.NewExtendedKeeper(appCodec, keys[ibcexported.StoreKey], app.GetSubspace(ibcexported.ModuleName), app.StakingKeeper, app.UpgradeKeeper) // make zcKeeper to hooks onto extendedClientKeeper so that zcKeeper can receive notifications of new headers extendedClientKeeper = *extendedClientKeeper.SetHooks( - ibcclientkeeper.NewMultiClientHooks(zcKeeper.Hooks()), + extendedkeeper.NewMultiClientHooks(zcKeeper.Hooks()), ) app.IBCKeeper.ClientKeeper = extendedClientKeeper diff --git a/go.mod b/go.mod index 0461b4405..5b5da8769 100644 --- a/go.mod +++ b/go.mod @@ -203,7 +203,7 @@ replace ( // slay the dragonberry github.com/confio/ics23/go => github.com/cosmos/cosmos-sdk/ics23/go v0.8.0 - github.com/cosmos/ibc-go/v7 => github.com/babylonchain/ibc-go/v7 v7.0.0-20230322083529-2c0496728e4a + github.com/cosmos/ibc-go/v7 => github.com/babylonchain/ibc-go/v7 v7.0.0-20230324085744-4d6a0d2c0fcf // Fix upstream GHSA-h395-qcrw-5vmq vulnerability. // TODO Remove it: https://github.com/cosmos/cosmos-sdk/issues/10409 diff --git a/go.sum b/go.sum index 812a1cdf6..b94a13e7e 100644 --- a/go.sum +++ b/go.sum @@ -246,8 +246,8 @@ github.com/aws/aws-sdk-go v1.44.122/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX github.com/aws/aws-sdk-go v1.44.203 h1:pcsP805b9acL3wUqa4JR2vg1k2wnItkDYNvfmcy6F+U= github.com/aws/aws-sdk-go v1.44.203/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= -github.com/babylonchain/ibc-go/v7 v7.0.0-20230322083529-2c0496728e4a h1:2ys6u9PAdj/xJr9sCOzWfsvqXtoAsCnm8SJcP1xrq6g= -github.com/babylonchain/ibc-go/v7 v7.0.0-20230322083529-2c0496728e4a/go.mod h1:BFh8nKWjr5zeR2OZfhkzdgDzj1+KjRn3aJLpwapStj8= +github.com/babylonchain/ibc-go/v7 v7.0.0-20230324085744-4d6a0d2c0fcf h1:NJU3YuruPqV8w6/y45Zsb8FudcWSkTBugdpTT7kJmjw= +github.com/babylonchain/ibc-go/v7 v7.0.0-20230324085744-4d6a0d2c0fcf/go.mod h1:BFh8nKWjr5zeR2OZfhkzdgDzj1+KjRn3aJLpwapStj8= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= diff --git a/testutil/datagen/tendermint.go b/testutil/datagen/tendermint.go index e666843cf..186f65cec 100644 --- a/testutil/datagen/tendermint.go +++ b/testutil/datagen/tendermint.go @@ -3,8 +3,8 @@ package datagen import ( "time" + extendedkeeper "github.com/babylonchain/babylon/x/zoneconcierge/extended-client-keeper" tmproto "github.com/cometbft/cometbft/proto/tendermint/types" - ibcclientkeeper "github.com/cosmos/ibc-go/v7/modules/core/02-client/keeper" ibctmtypes "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" ) @@ -29,8 +29,8 @@ func GenRandomIBCTMHeader(chainID string, height uint64) *ibctmtypes.Header { } } -func HeaderToHeaderInfo(header *ibctmtypes.Header) *ibcclientkeeper.HeaderInfo { - return &ibcclientkeeper.HeaderInfo{ +func HeaderToHeaderInfo(header *ibctmtypes.Header) *extendedkeeper.HeaderInfo { + return &extendedkeeper.HeaderInfo{ Hash: header.Header.LastCommitHash, ChaindId: header.Header.ChainID, Height: uint64(header.Header.Height), diff --git a/x/zoneconcierge/extended-client-keeper/hooks.go b/x/zoneconcierge/extended-client-keeper/hooks.go new file mode 100644 index 000000000..9c0367277 --- /dev/null +++ b/x/zoneconcierge/extended-client-keeper/hooks.go @@ -0,0 +1,42 @@ +package extended_client_keeper + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" +) + +// ClientHooks defines the hook interface for client +type ClientHooks interface { + AfterHeaderWithValidCommit(ctx sdk.Context, txHash []byte, header *HeaderInfo, isOnFork bool) +} + +type HeaderInfo struct { + Hash []byte + ChaindId string + Height uint64 +} + +// MultiClientHooks is a concrete implementation of ClientHooks +// It allows other modules to hook onto client ExtendedKeeper +var _ ClientHooks = &MultiClientHooks{} + +type MultiClientHooks []ClientHooks + +func NewMultiClientHooks(hooks ...ClientHooks) MultiClientHooks { + return hooks +} + +// invoke hooks in each keeper that hooks onto ExtendedKeeper +func (h MultiClientHooks) AfterHeaderWithValidCommit(ctx sdk.Context, txHash []byte, header *HeaderInfo, isOnFork bool) { + for i := range h { + h[i].AfterHeaderWithValidCommit(ctx, txHash, header, isOnFork) + } +} + +// ensure ExtendedKeeper implements ClientHooks interfaces +var _ ClientHooks = ExtendedKeeper{} + +func (ek ExtendedKeeper) AfterHeaderWithValidCommit(ctx sdk.Context, txHash []byte, header *HeaderInfo, isOnFork bool) { + if ek.hooks != nil { + ek.hooks.AfterHeaderWithValidCommit(ctx, txHash, header, isOnFork) + } +} diff --git a/x/zoneconcierge/extended-client-keeper/keeper.go b/x/zoneconcierge/extended-client-keeper/keeper.go new file mode 100644 index 000000000..4c59119e9 --- /dev/null +++ b/x/zoneconcierge/extended-client-keeper/keeper.go @@ -0,0 +1,149 @@ +package extended_client_keeper + +import ( + sdkerrors "cosmossdk.io/errors" + metrics "github.com/armon/go-metrics" + "github.com/cometbft/cometbft/crypto/tmhash" + "github.com/cosmos/cosmos-sdk/codec" + storetypes "github.com/cosmos/cosmos-sdk/store/types" + "github.com/cosmos/cosmos-sdk/telemetry" + sdk "github.com/cosmos/cosmos-sdk/types" + paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" + clientkeeper "github.com/cosmos/ibc-go/v7/modules/core/02-client/keeper" + "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" + "github.com/cosmos/ibc-go/v7/modules/core/exported" + ibctmtypes "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" +) + +// ExtendedKeeper is same as the original clientkeeper.Keeper, except that +// - it provides hooks for notifying other modules on received headers +// - it applies different verification rules on received headers +// (notably, intercepting headers rather than freezing clients upon errors that indicate dishonest majority) +type ExtendedKeeper struct { + clientkeeper.Keeper + cdc codec.BinaryCodec // since some code needs to use k.cdc + hooks ClientHooks +} + +// GetHeaderInfo returns the information necessary for header timestamping or nil +// if provided message is not a header +func GetHeaderInfo(ctx sdk.Context, m exported.ClientMessage) *HeaderInfo { + switch msg := m.(type) { + case *ibctmtypes.Header: + return &HeaderInfo{ + Hash: msg.Header.LastCommitHash, + ChaindId: msg.Header.ChainID, + Height: uint64(msg.Header.Height), + } + default: + return nil + } +} + +// NewExtendedKeeper creates a new NewExtendedKeeper instance +func NewExtendedKeeper(cdc codec.BinaryCodec, key storetypes.StoreKey, paramSpace paramtypes.Subspace, sk types.StakingKeeper, uk types.UpgradeKeeper) ExtendedKeeper { + // set KeyTable if it has not already been set + if !paramSpace.HasKeyTable() { + paramSpace = paramSpace.WithKeyTable(types.ParamKeyTable()) + } + + k := clientkeeper.NewKeeper(cdc, key, paramSpace, sk, uk) + return ExtendedKeeper{ + Keeper: k, + cdc: cdc, + hooks: nil, + } +} + +// SetHooks sets the hooks for ExtendedKeeper +func (ek *ExtendedKeeper) SetHooks(ch ClientHooks) *ExtendedKeeper { + if ek.hooks != nil { + panic("cannot set hooks twice") + } + ek.hooks = ch + + return ek +} + +// UpdateClient updates the consensus state and the state root from a provided header. +// The implementation is the same as the original IBC-Go implementation, except from: +// 1. Not freezing the client when finding a misbehaviour for header message +// 2. Calling a AfterHeaderWithValidCommit callback when receiving valid header messages (either misbehaving or not) +func (k ExtendedKeeper) UpdateClient(ctx sdk.Context, clientID string, clientMsg exported.ClientMessage) error { + // In case of nil message nothing changes in comparison to the original IBC-Go implementation + if clientMsg == nil { + return k.Keeper.UpdateClient(ctx, clientID, clientMsg) + } + + clientState, found := k.GetClientState(ctx, clientID) + if !found { + return sdkerrors.Wrapf(types.ErrClientNotFound, "cannot update client with ID %s", clientID) + } + + clientStore := k.ClientStore(ctx, clientID) + + if status := clientState.Status(ctx, clientStore, k.cdc); status != exported.Active { + return sdkerrors.Wrapf(types.ErrClientNotActive, "cannot update client (%s) with status %s", clientID, status) + } + + if err := clientState.VerifyClientMessage(ctx, k.cdc, clientStore, clientMsg); err != nil { + return err + } + + foundMisbehaviour := clientState.CheckForMisbehaviour(ctx, k.cdc, clientStore, clientMsg) + + headerInfo := GetHeaderInfo(ctx, clientMsg) + + // found misbehaviour and it was not an header, freeze client + if foundMisbehaviour && headerInfo == nil { + clientState.UpdateStateOnMisbehaviour(ctx, k.cdc, clientStore, clientMsg) + + k.Logger(ctx).Info("client frozen due to misbehaviour", "client-id", clientID) + + defer telemetry.IncrCounterWithLabels( + []string{"ibc", "client", "misbehaviour"}, + 1, + []metrics.Label{ + telemetry.NewLabel(types.LabelClientType, clientState.ClientType()), + telemetry.NewLabel(types.LabelClientID, clientID), + telemetry.NewLabel(types.LabelMsgType, "update"), + }, + ) + + clientkeeper.EmitSubmitMisbehaviourEvent(ctx, clientID, clientState) + + return nil + } else if foundMisbehaviour && headerInfo != nil { + // found misbehaviour and it was an header, this is most probably means + // conflicting headers misbehaviour. + ctx.Logger().Debug("received a header that has QC but is on a fork") + txHash := tmhash.Sum(ctx.TxBytes()) + k.AfterHeaderWithValidCommit(ctx, txHash, headerInfo, true) + return nil + } + + // there was no misbehaviour and we receivied an header, call the callback + if headerInfo != nil { + txHash := tmhash.Sum(ctx.TxBytes()) // get hash of the tx that includes this header + k.AfterHeaderWithValidCommit(ctx, txHash, headerInfo, false) + } + + consensusHeights := clientState.UpdateState(ctx, k.cdc, clientStore, clientMsg) + + k.Logger(ctx).Info("client state updated", "client-id", clientID, "heights", consensusHeights) + + defer telemetry.IncrCounterWithLabels( + []string{"ibc", "client", "update"}, + 1, + []metrics.Label{ + telemetry.NewLabel(types.LabelClientType, clientState.ClientType()), + telemetry.NewLabel(types.LabelClientID, clientID), + telemetry.NewLabel(types.LabelUpdateType, "msg"), + }, + ) + + // emitting events in the keeper emits for both begin block and handler client updates + clientkeeper.EmitUpdateClientEvent(ctx, clientID, clientState.ClientType(), consensusHeights, k.cdc, clientMsg) + + return nil +} diff --git a/x/zoneconcierge/keeper/hooks.go b/x/zoneconcierge/keeper/hooks.go index c46e3a820..12e58ee3c 100644 --- a/x/zoneconcierge/keeper/hooks.go +++ b/x/zoneconcierge/keeper/hooks.go @@ -6,9 +6,9 @@ import ( errorsmod "cosmossdk.io/errors" checkpointingtypes "github.com/babylonchain/babylon/x/checkpointing/types" epochingtypes "github.com/babylonchain/babylon/x/epoching/types" + extendedkeeper "github.com/babylonchain/babylon/x/zoneconcierge/extended-client-keeper" "github.com/babylonchain/babylon/x/zoneconcierge/types" sdk "github.com/cosmos/cosmos-sdk/types" - ibcclientkeeper "github.com/cosmos/ibc-go/v7/modules/core/02-client/keeper" ) type Hooks struct { @@ -16,14 +16,14 @@ type Hooks struct { } // ensures Hooks implements ClientHooks interfaces -var _ ibcclientkeeper.ClientHooks = Hooks{} +var _ extendedkeeper.ClientHooks = Hooks{} var _ checkpointingtypes.CheckpointingHooks = Hooks{} var _ epochingtypes.EpochingHooks = Hooks{} func (k Keeper) Hooks() Hooks { return Hooks{k} } // AfterHeaderWithValidCommit is triggered upon each CZ header with a valid QC -func (h Hooks) AfterHeaderWithValidCommit(ctx sdk.Context, txHash []byte, header *ibcclientkeeper.HeaderInfo, isOnFork bool) { +func (h Hooks) AfterHeaderWithValidCommit(ctx sdk.Context, txHash []byte, header *extendedkeeper.HeaderInfo, isOnFork bool) { babylonHeader := ctx.BlockHeader() indexedHeader := types.IndexedHeader{ ChainId: header.ChaindId, From dac3913de2b39451de066db1ed48d9e67a8cbbfa Mon Sep 17 00:00:00 2001 From: Denis Fadeev Date: Mon, 27 Mar 2023 17:35:36 +0400 Subject: [PATCH 21/59] refactor: remove `handler.go` files from modules (#337) Remove handler.go files from modules --- x/btccheckpoint/handler.go | 24 ------------------- x/btclightclient/handler.go | 24 ------------------- x/checkpointing/handler.go | 24 ------------------- x/checkpointing/testckpt/helper.go | 26 +++++++++------------ x/epoching/handler.go | 36 ----------------------------- x/epoching/testepoching/helper.go | 37 ++++++++++++++++-------------- x/monitor/handler.go | 24 ------------------- 7 files changed, 31 insertions(+), 164 deletions(-) delete mode 100644 x/btccheckpoint/handler.go delete mode 100644 x/btclightclient/handler.go delete mode 100644 x/checkpointing/handler.go delete mode 100644 x/epoching/handler.go delete mode 100644 x/monitor/handler.go diff --git a/x/btccheckpoint/handler.go b/x/btccheckpoint/handler.go deleted file mode 100644 index 3546957a5..000000000 --- a/x/btccheckpoint/handler.go +++ /dev/null @@ -1,24 +0,0 @@ -package btccheckpoint - -import ( - "fmt" - - errorsmod "cosmossdk.io/errors" - "github.com/babylonchain/babylon/x/btccheckpoint/keeper" - "github.com/babylonchain/babylon/x/btccheckpoint/types" - sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" -) - -// NewHandler ... -func NewHandler(k keeper.Keeper) sdk.Handler { - - return func(ctx sdk.Context, msg sdk.Msg) (*sdk.Result, error) { - - switch msg := msg.(type) { - default: - errMsg := fmt.Sprintf("unrecognized %s message type: %T", types.ModuleName, msg) - return nil, errorsmod.Wrap(sdkerrors.ErrUnknownRequest, errMsg) - } - } -} diff --git a/x/btclightclient/handler.go b/x/btclightclient/handler.go deleted file mode 100644 index 75b325404..000000000 --- a/x/btclightclient/handler.go +++ /dev/null @@ -1,24 +0,0 @@ -package btclightclient - -import ( - "fmt" - - "github.com/babylonchain/babylon/x/btclightclient/keeper" - "github.com/babylonchain/babylon/x/btclightclient/types" - sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - errorsmod "cosmossdk.io/errors" -) - -// NewHandler ... -func NewHandler(k keeper.Keeper) sdk.Handler { - return func(ctx sdk.Context, msg sdk.Msg) (*sdk.Result, error) { - _ = ctx.WithEventManager(sdk.NewEventManager()) - - switch msg := msg.(type) { - default: - errMsg := fmt.Sprintf("unrecognized %s message type: %T", types.ModuleName, msg) - return nil, errorsmod.Wrap(sdkerrors.ErrUnknownRequest, errMsg) - } - } -} diff --git a/x/checkpointing/handler.go b/x/checkpointing/handler.go deleted file mode 100644 index 8d1b3b1a4..000000000 --- a/x/checkpointing/handler.go +++ /dev/null @@ -1,24 +0,0 @@ -package checkpointing - -import ( - "fmt" - - errorsmod "cosmossdk.io/errors" - "github.com/babylonchain/babylon/x/checkpointing/keeper" - "github.com/babylonchain/babylon/x/checkpointing/types" - sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" -) - -// NewHandler ... -func NewHandler(k keeper.Keeper) sdk.Handler { - return func(ctx sdk.Context, msg sdk.Msg) (*sdk.Result, error) { - _ = ctx.WithEventManager(sdk.NewEventManager()) - - switch msg := msg.(type) { - default: - errMsg := fmt.Sprintf("unrecognized %s message type: %T", types.ModuleName, msg) - return nil, errorsmod.Wrap(sdkerrors.ErrUnknownRequest, errMsg) - } - } -} diff --git a/x/checkpointing/testckpt/helper.go b/x/checkpointing/testckpt/helper.go index 4329862dc..b7f98dee2 100644 --- a/x/checkpointing/testckpt/helper.go +++ b/x/checkpointing/testckpt/helper.go @@ -10,7 +10,6 @@ import ( "github.com/babylonchain/babylon/testutil/datagen" "github.com/babylonchain/babylon/x/checkpointing/keeper" "github.com/babylonchain/babylon/x/checkpointing/types" - "github.com/babylonchain/babylon/x/epoching" epochingkeeper "github.com/babylonchain/babylon/x/epoching/keeper" tmproto "github.com/cometbft/cometbft/proto/tendermint/types" "github.com/cosmos/cosmos-sdk/baseapp" @@ -19,6 +18,7 @@ import ( authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" + proto "github.com/cosmos/gogoproto/proto" "github.com/stretchr/testify/require" ) @@ -90,22 +90,18 @@ func (h *Helper) CreateValidatorMsg(addr sdk.ValAddress, pk cryptotypes.PubKey, } func (h *Helper) createValidator(addr sdk.ValAddress, pk cryptotypes.PubKey, blsPK *bls12381.PublicKey, pop *types.ProofOfPossession, coin sdk.Coin, ok bool) { - msg := h.CreateValidatorMsg(addr, pk, blsPK, pop, coin.Amount) - h.Handle(msg, ok) + h.Handle(func(ctx sdk.Context) (proto.Message, error) { + return h.CreateValidatorMsg(addr, pk, blsPK, pop, coin.Amount), nil + }) } -// Handle calls epoching handler on a given message -func (h *Helper) Handle(msg sdk.Msg, ok bool) *sdk.Result { - handler := epoching.NewHandler(*h.EpochingKeeper) - res, err := handler(h.Ctx, msg) - if ok { - require.NoError(h.t, err) - require.NotNil(h.t, res) - } else { - require.Error(h.t, err) - require.Nil(h.t, res) - } - return res +// Handle executes an action function with the Helper's context, wraps the result into an SDK service result, and performs two assertions before returning it +func (h *Helper) Handle(action func(sdk.Context) (proto.Message, error)) *sdk.Result { + res, err := action(h.Ctx) + r, _ := sdk.WrapServiceResult(h.Ctx, res, err) + require.NotNil(h.t, r) + require.NoError(h.t, err) + return r } // ZeroCommission constructs a commission rates with all zeros. diff --git a/x/epoching/handler.go b/x/epoching/handler.go deleted file mode 100644 index 1b0e25a85..000000000 --- a/x/epoching/handler.go +++ /dev/null @@ -1,36 +0,0 @@ -package epoching - -import ( - "fmt" - - errorsmod "cosmossdk.io/errors" - "github.com/babylonchain/babylon/x/epoching/keeper" - "github.com/babylonchain/babylon/x/epoching/types" - sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" -) - -// NewHandler handles messages for the epoching module -// TODO (non-urgent): after we bump to Cosmos SDK v0.46, add MsgCancelUnbondingDelegation -func NewHandler(k keeper.Keeper) sdk.Handler { - msgServer := keeper.NewMsgServerImpl(k) - - return func(ctx sdk.Context, msg sdk.Msg) (*sdk.Result, error) { - ctx = ctx.WithEventManager(sdk.NewEventManager()) - - switch msg := msg.(type) { - case *types.MsgWrappedDelegate: - res, err := msgServer.WrappedDelegate(sdk.WrapSDKContext(ctx), msg) - return sdk.WrapServiceResult(ctx, res, err) - case *types.MsgWrappedBeginRedelegate: - res, err := msgServer.WrappedBeginRedelegate(sdk.WrapSDKContext(ctx), msg) - return sdk.WrapServiceResult(ctx, res, err) - case *types.MsgWrappedUndelegate: - res, err := msgServer.WrappedUndelegate(sdk.WrapSDKContext(ctx), msg) - return sdk.WrapServiceResult(ctx, res, err) - default: - errMsg := fmt.Sprintf("unrecognized %s message type: %T", types.ModuleName, msg) - return nil, errorsmod.Wrap(sdkerrors.ErrUnknownRequest, errMsg) - } - } -} diff --git a/x/epoching/testepoching/helper.go b/x/epoching/testepoching/helper.go index 8baa1841b..104db01bf 100644 --- a/x/epoching/testepoching/helper.go +++ b/x/epoching/testepoching/helper.go @@ -7,6 +7,7 @@ import ( "github.com/babylonchain/babylon/testutil/datagen" "cosmossdk.io/math" + proto "github.com/cosmos/gogoproto/proto" "github.com/stretchr/testify/require" appparams "github.com/babylonchain/babylon/app/params" @@ -22,7 +23,6 @@ import ( stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/babylonchain/babylon/app" - "github.com/babylonchain/babylon/x/epoching" "github.com/babylonchain/babylon/x/epoching/keeper" "github.com/babylonchain/babylon/x/epoching/types" ) @@ -174,7 +174,9 @@ func (h *Helper) WrappedDelegate(delegator sdk.AccAddress, val sdk.ValAddress, a coin := sdk.NewCoin(appparams.DefaultBondDenom, amount) msg := stakingtypes.NewMsgDelegate(delegator, val, coin) wmsg := types.NewMsgWrappedDelegate(msg) - return h.Handle(wmsg, true) + return h.Handle(func(ctx sdk.Context) (proto.Message, error) { + return h.MsgSrvr.WrappedDelegate(ctx, wmsg) + }) } // WrappedDelegateWithPower calls handler to delegate stake for a validator @@ -182,7 +184,9 @@ func (h *Helper) WrappedDelegateWithPower(delegator sdk.AccAddress, val sdk.ValA coin := sdk.NewCoin(appparams.DefaultBondDenom, h.StakingKeeper.TokensFromConsensusPower(h.Ctx, power)) msg := stakingtypes.NewMsgDelegate(delegator, val, coin) wmsg := types.NewMsgWrappedDelegate(msg) - return h.Handle(wmsg, true) + return h.Handle(func(ctx sdk.Context) (proto.Message, error) { + return h.MsgSrvr.WrappedDelegate(ctx, wmsg) + }) } // WrappedUndelegate calls handler to unbound some stake from a validator. @@ -190,7 +194,9 @@ func (h *Helper) WrappedUndelegate(delegator sdk.AccAddress, val sdk.ValAddress, unbondAmt := sdk.NewCoin(appparams.DefaultBondDenom, amount) msg := stakingtypes.NewMsgUndelegate(delegator, val, unbondAmt) wmsg := types.NewMsgWrappedUndelegate(msg) - return h.Handle(wmsg, true) + return h.Handle(func(ctx sdk.Context) (proto.Message, error) { + return h.MsgSrvr.WrappedUndelegate(ctx, wmsg) + }) } // WrappedBeginRedelegate calls handler to redelegate some stake from a validator to another @@ -198,21 +204,18 @@ func (h *Helper) WrappedBeginRedelegate(delegator sdk.AccAddress, srcVal sdk.Val unbondAmt := sdk.NewCoin(appparams.DefaultBondDenom, amount) msg := stakingtypes.NewMsgBeginRedelegate(delegator, srcVal, dstVal, unbondAmt) wmsg := types.NewMsgWrappedBeginRedelegate(msg) - return h.Handle(wmsg, true) + return h.Handle(func(ctx sdk.Context) (proto.Message, error) { + return h.MsgSrvr.WrappedBeginRedelegate(ctx, wmsg) + }) } -// Handle calls epoching handler on a given message -func (h *Helper) Handle(msg sdk.Msg, ok bool) *sdk.Result { - handler := epoching.NewHandler(*h.EpochingKeeper) - res, err := handler(h.Ctx, msg) - if ok { - require.NoError(h.t, err) - require.NotNil(h.t, res) - } else { - require.Error(h.t, err) - require.Nil(h.t, res) - } - return res +// Handle executes an action function with the Helper's context, wraps the result into an SDK service result, and performs two assertions before returning it +func (h *Helper) Handle(action func(sdk.Context) (proto.Message, error)) *sdk.Result { + res, err := action(h.Ctx) + r, _ := sdk.WrapServiceResult(h.Ctx, res, err) + require.NotNil(h.t, r) + require.NoError(h.t, err) + return r } // CheckValidator asserts that a validor exists and has a given status (if status!="") diff --git a/x/monitor/handler.go b/x/monitor/handler.go deleted file mode 100644 index 38cae1b35..000000000 --- a/x/monitor/handler.go +++ /dev/null @@ -1,24 +0,0 @@ -package monitor - -import ( - "fmt" - - errorsmod "cosmossdk.io/errors" - "github.com/babylonchain/babylon/x/monitor/keeper" - "github.com/babylonchain/babylon/x/monitor/types" - sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" -) - -// NewHandler ... -func NewHandler(k keeper.Keeper) sdk.Handler { - - return func(ctx sdk.Context, msg sdk.Msg) (*sdk.Result, error) { - - switch msg := msg.(type) { - default: - errMsg := fmt.Sprintf("unrecognized %s message type: %T", types.ModuleName, msg) - return nil, errorsmod.Wrap(sdkerrors.ErrUnknownRequest, errMsg) - } - } -} From 9dba89a8de9d5ba6eef9bc91930d0f39c9c87308 Mon Sep 17 00:00:00 2001 From: KonradStaniec Date: Tue, 28 Mar 2023 05:04:25 +0200 Subject: [PATCH 22/59] Cleanup params in Babylon custom modules. (#334) * Remove unnecessary params from Babylon modules --- app/app.go | 8 +- proto/babylon/btclightclient/v1/genesis.proto | 5 +- proto/babylon/btclightclient/v1/params.proto | 9 - proto/babylon/btclightclient/v1/query.proto | 14 - proto/babylon/checkpointing/v1/genesis.proto | 6 +- proto/babylon/checkpointing/v1/params.proto | 9 - proto/babylon/checkpointing/v1/query.proto | 15 - proto/babylon/monitor/v1/genesis.proto | 3 +- proto/babylon/monitor/v1/params.proto | 9 - proto/babylon/monitor/v1/query.proto | 16 - proto/babylon/zoneconcierge/v1/genesis.proto | 4 +- proto/babylon/zoneconcierge/v1/params.proto | 9 - proto/babylon/zoneconcierge/v1/query.proto | 16 +- test/e2e/initialization/config.go | 1 - testutil/keeper/btclightclient.go | 12 - testutil/keeper/checkpointing.go | 13 - testutil/keeper/zoneconcierge.go | 12 - x/btclightclient/client/cli/query.go | 26 - x/btclightclient/genesis.go | 2 - x/btclightclient/genesis_test.go | 4 +- x/btclightclient/keeper/grpc_query.go | 9 - x/btclightclient/keeper/grpc_query_test.go | 12 - x/btclightclient/keeper/keeper.go | 28 +- x/btclightclient/keeper/params.go | 16 - x/btclightclient/keeper/params_test.go | 18 - x/btclightclient/types/genesis.go | 8 +- x/btclightclient/types/genesis.pb.go | 81 +-- x/btclightclient/types/params.go | 39 -- x/btclightclient/types/params.pb.go | 267 --------- x/btclightclient/types/querier.go | 5 - x/btclightclient/types/querier_test.go | 12 - x/btclightclient/types/query.pb.go | 450 ++-------------- x/btclightclient/types/query.pb.gw.go | 65 --- x/checkpointing/client/cli/query.go | 5 +- x/checkpointing/client/cli/query_params.go | 34 -- x/checkpointing/genesis.go | 4 - x/checkpointing/genesis_test.go | 1 - x/checkpointing/keeper/grpc_query_bls_test.go | 3 +- x/checkpointing/keeper/grpc_query_params.go | 26 - x/checkpointing/keeper/keeper.go | 9 - x/checkpointing/keeper/params.go | 16 - x/checkpointing/keeper/val_bls_set_test.go | 3 +- x/checkpointing/module_simulation.go | 4 +- x/checkpointing/testckpt/helper.go | 3 +- x/checkpointing/types/genesis.go | 6 +- x/checkpointing/types/genesis.pb.go | 105 +--- x/checkpointing/types/params.go | 39 -- x/checkpointing/types/params.pb.go | 267 --------- x/checkpointing/types/query.pb.go | 452 ++-------------- x/checkpointing/types/query.pb.gw.go | 65 --- x/monitor/client/cli/query_params.go | 34 -- x/monitor/genesis.go | 3 - x/monitor/genesis_test.go | 16 +- x/monitor/keeper/grpc_query_params.go | 26 - x/monitor/keeper/grpc_query_test.go | 12 +- x/monitor/keeper/keeper.go | 10 +- x/monitor/keeper/params.go | 17 - x/monitor/module_simulation.go | 4 +- x/monitor/types/genesis.go | 7 +- x/monitor/types/genesis.pb.go | 70 +-- x/monitor/types/params.go | 32 -- x/monitor/types/params.pb.go | 286 ---------- x/monitor/types/params_test.go | 16 - x/monitor/types/query.pb.go | 399 ++------------ x/monitor/types/query.pb.gw.go | 65 --- x/zoneconcierge/client/cli/query.go | 2 - x/zoneconcierge/client/cli/query_params.go | 34 -- x/zoneconcierge/genesis.go | 4 - x/zoneconcierge/genesis_test.go | 2 - x/zoneconcierge/keeper/grpc_query_params.go | 19 - .../keeper/grpc_query_params_test.go | 21 - x/zoneconcierge/keeper/keeper.go | 15 +- x/zoneconcierge/keeper/params.go | 16 - x/zoneconcierge/keeper/params_test.go | 18 - x/zoneconcierge/module_simulation.go | 1 - x/zoneconcierge/types/genesis.go | 4 +- x/zoneconcierge/types/genesis.pb.go | 78 +-- x/zoneconcierge/types/params.go | 39 -- x/zoneconcierge/types/params.pb.go | 267 --------- x/zoneconcierge/types/query.pb.go | 508 +++--------------- x/zoneconcierge/types/query.pb.gw.go | 65 --- 81 files changed, 328 insertions(+), 4007 deletions(-) delete mode 100644 proto/babylon/btclightclient/v1/params.proto delete mode 100644 proto/babylon/checkpointing/v1/params.proto delete mode 100644 proto/babylon/monitor/v1/params.proto delete mode 100644 proto/babylon/zoneconcierge/v1/params.proto delete mode 100644 x/btclightclient/keeper/params.go delete mode 100644 x/btclightclient/keeper/params_test.go delete mode 100644 x/btclightclient/types/params.go delete mode 100644 x/btclightclient/types/params.pb.go delete mode 100644 x/checkpointing/client/cli/query_params.go delete mode 100644 x/checkpointing/keeper/grpc_query_params.go delete mode 100644 x/checkpointing/keeper/params.go delete mode 100644 x/checkpointing/types/params.go delete mode 100644 x/checkpointing/types/params.pb.go delete mode 100644 x/monitor/client/cli/query_params.go delete mode 100644 x/monitor/keeper/grpc_query_params.go delete mode 100644 x/monitor/keeper/params.go delete mode 100644 x/monitor/types/params.go delete mode 100644 x/monitor/types/params.pb.go delete mode 100644 x/monitor/types/params_test.go delete mode 100644 x/zoneconcierge/client/cli/query_params.go delete mode 100644 x/zoneconcierge/keeper/grpc_query_params.go delete mode 100644 x/zoneconcierge/keeper/grpc_query_params_test.go delete mode 100644 x/zoneconcierge/keeper/params.go delete mode 100644 x/zoneconcierge/keeper/params_test.go delete mode 100644 x/zoneconcierge/types/params.go delete mode 100644 x/zoneconcierge/types/params.pb.go diff --git a/app/app.go b/app/app.go index c2d089fa5..c68662f7e 100644 --- a/app/app.go +++ b/app/app.go @@ -454,7 +454,6 @@ func NewBabylonApp( appCodec, keys[zctypes.StoreKey], keys[zctypes.MemStoreKey], - app.GetSubspace(zctypes.ModuleName), app.IBCKeeper.ChannelKeeper, app.IBCKeeper.ChannelKeeper, &app.IBCKeeper.PortKeeper, @@ -500,7 +499,6 @@ func NewBabylonApp( appCodec, keys[btclightclienttypes.StoreKey], keys[btclightclienttypes.MemStoreKey], - app.GetSubspace(btclightclienttypes.ModuleName), btcConfig, ) @@ -508,7 +506,6 @@ func NewBabylonApp( appCodec, keys[monitortypes.StoreKey], keys[monitortypes.StoreKey], - app.GetSubspace(monitortypes.ModuleName), &btclightclientKeeper, ) @@ -527,7 +524,6 @@ func NewBabylonApp( keys[checkpointingtypes.MemStoreKey], privSigner.WrappedPV, app.EpochingKeeper, - app.GetSubspace(checkpointingtypes.ModuleName), privSigner.ClientCtx, ) app.CheckpointingKeeper = *checkpointingKeeper.SetHooks( @@ -951,10 +947,8 @@ func initParamsKeeper(appCodec codec.BinaryCodec, legacyAmino *codec.LegacyAmino paramsKeeper.Subspace(crisistypes.ModuleName) // Babylon modules paramsKeeper.Subspace(epochingtypes.ModuleName) - paramsKeeper.Subspace(btclightclienttypes.ModuleName) paramsKeeper.Subspace(btccheckpointtypes.ModuleName) - paramsKeeper.Subspace(checkpointingtypes.ModuleName) - paramsKeeper.Subspace(monitortypes.ModuleName) + // IBC-related modules paramsKeeper.Subspace(ibcexported.ModuleName) paramsKeeper.Subspace(ibctransfertypes.ModuleName) diff --git a/proto/babylon/btclightclient/v1/genesis.proto b/proto/babylon/btclightclient/v1/genesis.proto index a105b725b..4b15f0714 100644 --- a/proto/babylon/btclightclient/v1/genesis.proto +++ b/proto/babylon/btclightclient/v1/genesis.proto @@ -2,14 +2,11 @@ syntax = "proto3"; package babylon.btclightclient.v1; import "gogoproto/gogo.proto"; -import "babylon/btclightclient/v1/params.proto"; import "babylon/btclightclient/v1/btclightclient.proto"; option go_package = "github.com/babylonchain/babylon/x/btclightclient/types"; // GenesisState defines the btclightclient module's genesis state. message GenesisState { - Params params = 1 [ (gogoproto.nullable) = false ]; - - BTCHeaderInfo base_btc_header = 2 [ (gogoproto.nullable) = false ]; + BTCHeaderInfo base_btc_header = 1 [ (gogoproto.nullable) = false ]; } diff --git a/proto/babylon/btclightclient/v1/params.proto b/proto/babylon/btclightclient/v1/params.proto deleted file mode 100644 index 3ee535386..000000000 --- a/proto/babylon/btclightclient/v1/params.proto +++ /dev/null @@ -1,9 +0,0 @@ -syntax = "proto3"; -package babylon.btclightclient.v1; - -import "gogoproto/gogo.proto"; - -option go_package = "github.com/babylonchain/babylon/x/btclightclient/types"; - -// Params defines the parameters for the module. -message Params { option (gogoproto.goproto_stringer) = false; } diff --git a/proto/babylon/btclightclient/v1/query.proto b/proto/babylon/btclightclient/v1/query.proto index 095b26781..a562cfece 100644 --- a/proto/babylon/btclightclient/v1/query.proto +++ b/proto/babylon/btclightclient/v1/query.proto @@ -4,18 +4,12 @@ package babylon.btclightclient.v1; import "gogoproto/gogo.proto"; import "google/api/annotations.proto"; import "cosmos/base/query/v1beta1/pagination.proto"; -import "babylon/btclightclient/v1/params.proto"; import "babylon/btclightclient/v1/btclightclient.proto"; option go_package = "github.com/babylonchain/babylon/x/btclightclient/types"; // Query defines the gRPC querier service. service Query { - // Parameters queries the parameters of the module. - rpc Params(QueryParamsRequest) returns (QueryParamsResponse) { - option (google.api.http).get = "/babylon/btclightclient/v1/params"; - } - // Hashes retrieves the hashes maintained by the module. rpc Hashes(QueryHashesRequest) returns (QueryHashesResponse) { option (google.api.http).get = "/babylon/btclightclient/v1/hashes"; @@ -52,14 +46,6 @@ service Query { } } -// QueryParamsRequest is request type for the Query/Params RPC method. -message QueryParamsRequest {} - -// QueryParamsResponse is response type for the Query/Params RPC method. -message QueryParamsResponse { - // params holds all the parameters of this module. - Params params = 1 [ (gogoproto.nullable) = false ]; -} // QueryHashesRequest is request type for the Query/Hashes RPC method. // It involves retrieving all hashes that are maintained by the module. message QueryHashesRequest { diff --git a/proto/babylon/checkpointing/v1/genesis.proto b/proto/babylon/checkpointing/v1/genesis.proto index df394cebf..aeab48299 100644 --- a/proto/babylon/checkpointing/v1/genesis.proto +++ b/proto/babylon/checkpointing/v1/genesis.proto @@ -3,18 +3,14 @@ package babylon.checkpointing.v1; import "gogoproto/gogo.proto"; import "cosmos/crypto/ed25519/keys.proto"; -import "babylon/checkpointing/v1/params.proto"; import "babylon/checkpointing/v1/bls_key.proto"; option go_package = "github.com/babylonchain/babylon/x/checkpointing/types"; // GenesisState defines the checkpointing module's genesis state. message GenesisState { - // params defines all the paramaters of related to checkpointing - Params params = 1 [ (gogoproto.nullable) = false ]; - // genesis_keys defines the public keys for the genesis validators - repeated GenesisKey genesis_keys = 2; + repeated GenesisKey genesis_keys = 1; } // GenesisKey defines public key information about the genesis validators diff --git a/proto/babylon/checkpointing/v1/params.proto b/proto/babylon/checkpointing/v1/params.proto deleted file mode 100644 index 15612d498..000000000 --- a/proto/babylon/checkpointing/v1/params.proto +++ /dev/null @@ -1,9 +0,0 @@ -syntax = "proto3"; -package babylon.checkpointing.v1; - -import "gogoproto/gogo.proto"; - -option go_package = "github.com/babylonchain/babylon/x/checkpointing/types"; - -// Params defines the parameters for the module. -message Params { option (gogoproto.goproto_stringer) = false; } diff --git a/proto/babylon/checkpointing/v1/query.proto b/proto/babylon/checkpointing/v1/query.proto index 79301f805..0d876a238 100644 --- a/proto/babylon/checkpointing/v1/query.proto +++ b/proto/babylon/checkpointing/v1/query.proto @@ -5,7 +5,6 @@ import "babylon/checkpointing/v1/bls_key.proto"; import "cosmos/base/query/v1beta1/pagination.proto"; import "gogoproto/gogo.proto"; import "google/api/annotations.proto"; -import "babylon/checkpointing/v1/params.proto"; import "babylon/checkpointing/v1/checkpoint.proto"; option go_package = "github.com/babylonchain/babylon/x/checkpointing/types"; @@ -55,11 +54,6 @@ service Query { option (google.api.http).get = "/babylon/checkpointing/v1/last_raw_checkpoint/{status}"; } - - // Parameters queries the parameters of the module. - rpc Params(QueryParamsRequest) returns (QueryParamsResponse) { - option (google.api.http).get = "/babylon/checkpointing/v1/params"; - } } // QueryRawCheckpointListRequest is the request type for the @@ -145,12 +139,3 @@ message QueryLastCheckpointWithStatusRequest { CheckpointStatus status = 1; } message QueryLastCheckpointWithStatusResponse { RawCheckpoint raw_checkpoint = 1; } - -// QueryParamsRequest is request type for the Query/Params RPC method. -message QueryParamsRequest {} - -// QueryParamsResponse is response type for the Query/Params RPC method. -message QueryParamsResponse { - // params holds all the parameters of this module. - Params params = 1 [ (gogoproto.nullable) = false ]; -} diff --git a/proto/babylon/monitor/v1/genesis.proto b/proto/babylon/monitor/v1/genesis.proto index 82df413d7..17facb8d2 100644 --- a/proto/babylon/monitor/v1/genesis.proto +++ b/proto/babylon/monitor/v1/genesis.proto @@ -2,9 +2,8 @@ syntax = "proto3"; package babylon.monitor.v1; import "gogoproto/gogo.proto"; -import "babylon/monitor/v1/params.proto"; option go_package = "github.com/babylonchain/babylon/x/monitor/types"; // GenesisState defines the monitor module's genesis state. -message GenesisState { Params params = 1 [ (gogoproto.nullable) = false ]; } +message GenesisState {} diff --git a/proto/babylon/monitor/v1/params.proto b/proto/babylon/monitor/v1/params.proto deleted file mode 100644 index 50b3bdc21..000000000 --- a/proto/babylon/monitor/v1/params.proto +++ /dev/null @@ -1,9 +0,0 @@ -syntax = "proto3"; -package babylon.monitor.v1; - -import "gogoproto/gogo.proto"; - -option go_package = "github.com/babylonchain/babylon/x/monitor/types"; - -// Params defines the parameters for the module. -message Params { option (gogoproto.equal) = true; } diff --git a/proto/babylon/monitor/v1/query.proto b/proto/babylon/monitor/v1/query.proto index ec85e2792..65455c338 100644 --- a/proto/babylon/monitor/v1/query.proto +++ b/proto/babylon/monitor/v1/query.proto @@ -3,17 +3,11 @@ package babylon.monitor.v1; import "gogoproto/gogo.proto"; import "google/api/annotations.proto"; -import "babylon/monitor/v1/params.proto"; option go_package = "github.com/babylonchain/babylon/x/monitor/types"; // Query defines the gRPC querier service. service Query { - // Parameters queries the parameters of the module. - rpc Params(QueryParamsRequest) returns (QueryParamsResponse) { - option (google.api.http).get = "/babylon/monitor/v1/params"; - } - // EndedEpochBtcHeight returns the BTC light client height at provided epoch // finish rpc EndedEpochBtcHeight(QueryEndedEpochBtcHeightRequest) @@ -29,16 +23,6 @@ service Query { "/babylon/monitor/v1/checkpoints/{ckpt_hash}"; } } - -// QueryParamsRequest is request type for the Query/Params RPC method. -message QueryParamsRequest {} - -// QueryParamsResponse is response type for the Query/Params RPC method. -message QueryParamsResponse { - // params holds all the parameters of this module. - Params params = 1 [ (gogoproto.nullable) = false ]; -} - // QueryEndedEpochBtcHeightRequest defines a query type for EndedEpochBtcHeight // RPC method message QueryEndedEpochBtcHeightRequest { uint64 epoch_num = 1; } diff --git a/proto/babylon/zoneconcierge/v1/genesis.proto b/proto/babylon/zoneconcierge/v1/genesis.proto index fa55fc58d..9127ad35f 100644 --- a/proto/babylon/zoneconcierge/v1/genesis.proto +++ b/proto/babylon/zoneconcierge/v1/genesis.proto @@ -2,12 +2,10 @@ syntax = "proto3"; package babylon.zoneconcierge.v1; import "gogoproto/gogo.proto"; -import "babylon/zoneconcierge/v1/params.proto"; option go_package = "github.com/babylonchain/babylon/x/zoneconcierge/types"; // GenesisState defines the zoneconcierge module's genesis state. message GenesisState { - Params params = 1 [ (gogoproto.nullable) = false ]; - string port_id = 2; + string port_id = 1; } diff --git a/proto/babylon/zoneconcierge/v1/params.proto b/proto/babylon/zoneconcierge/v1/params.proto deleted file mode 100644 index e843f3ba3..000000000 --- a/proto/babylon/zoneconcierge/v1/params.proto +++ /dev/null @@ -1,9 +0,0 @@ -syntax = "proto3"; -package babylon.zoneconcierge.v1; - -import "gogoproto/gogo.proto"; - -option go_package = "github.com/babylonchain/babylon/x/zoneconcierge/types"; - -// Params defines the parameters for the module. -message Params { option (gogoproto.goproto_stringer) = false; } diff --git a/proto/babylon/zoneconcierge/v1/query.proto b/proto/babylon/zoneconcierge/v1/query.proto index a9f99ec3b..987cece84 100644 --- a/proto/babylon/zoneconcierge/v1/query.proto +++ b/proto/babylon/zoneconcierge/v1/query.proto @@ -7,17 +7,12 @@ import "cosmos/base/query/v1beta1/pagination.proto"; import "babylon/btccheckpoint/v1/btccheckpoint.proto"; import "babylon/checkpointing/v1/checkpoint.proto"; import "babylon/epoching/v1/epoching.proto"; -import "babylon/zoneconcierge/v1/params.proto"; import "babylon/zoneconcierge/v1/zoneconcierge.proto"; option go_package = "github.com/babylonchain/babylon/x/zoneconcierge/types"; // Query defines the gRPC querier service. service Query { - // Parameters queries the parameters of the module. - rpc Params(QueryParamsRequest) returns (QueryParamsResponse) { - option (google.api.http).get = "/babylon/zoneconcierge/v1/params"; - } // Header queries the CZ header and fork headers at a given height. rpc Header(QueryHeaderRequest) returns (QueryHeaderResponse) { option (google.api.http).get = @@ -68,22 +63,13 @@ service Query { } } -// QueryParamsRequest is request type for the Query/Params RPC method. -message QueryParamsRequest {} - -// QueryParamsResponse is response type for the Query/Params RPC method. -message QueryParamsResponse { - // params holds all the parameters of this module. - Params params = 1 [ (gogoproto.nullable) = false ]; -} - // QueryHeaderRequest is request type for the Query/Header RPC method. message QueryHeaderRequest { string chain_id = 1; uint64 height = 2; } -// QueryParamsResponse is response type for the Query/Header RPC method. +// QueryHeaderResponse is response type for the Query/Header RPC method. message QueryHeaderResponse { babylon.zoneconcierge.v1.IndexedHeader header = 1; babylon.zoneconcierge.v1.Forks fork_headers = 2; diff --git a/test/e2e/initialization/config.go b/test/e2e/initialization/config.go index 1d420d377..69092ade1 100644 --- a/test/e2e/initialization/config.go +++ b/test/e2e/initialization/config.go @@ -295,7 +295,6 @@ func updateCrisisGenesis(crisisGenState *crisistypes.GenesisState) { } func updateBtcLightClientGenesis(blcGenState *blctypes.GenesisState) { - blcGenState.Params = blctypes.DefaultParams() btcSimnetGenesisHex := "0100000000000000000000000000000000000000000000000000000000000000000000003ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a45068653ffff7f2002000000" baseBtcHeader, err := bbn.NewBTCHeaderBytesFromHex(btcSimnetGenesisHex) if err != nil { diff --git a/testutil/keeper/btclightclient.go b/testutil/keeper/btclightclient.go index 9b6ac15e8..90d5ba44d 100644 --- a/testutil/keeper/btclightclient.go +++ b/testutil/keeper/btclightclient.go @@ -15,7 +15,6 @@ import ( "github.com/cosmos/cosmos-sdk/store" storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" - typesparams "github.com/cosmos/cosmos-sdk/x/params/types" "github.com/stretchr/testify/require" ) @@ -32,27 +31,16 @@ func BTCLightClientKeeper(t testing.TB) (*keeper.Keeper, sdk.Context) { registry := codectypes.NewInterfaceRegistry() cdc := codec.NewProtoCodec(registry) - paramsSubspace := typesparams.NewSubspace(cdc, - types.Amino, - storeKey, - memStoreKey, - "BTCLightClientParams", - ) - testCfg := bbn.ParseBtcOptionsFromConfig(bapp.EmptyAppOptions{}) k := keeper.NewKeeper( cdc, storeKey, memStoreKey, - paramsSubspace, testCfg, ) ctx := sdk.NewContext(stateStore, tmproto.Header{}, false, log.NewNopLogger()) - // Initialize params - k.SetParams(ctx, types.DefaultParams()) - return k, ctx } diff --git a/testutil/keeper/checkpointing.go b/testutil/keeper/checkpointing.go index 35d5461d9..895ae3ead 100644 --- a/testutil/keeper/checkpointing.go +++ b/testutil/keeper/checkpointing.go @@ -14,7 +14,6 @@ import ( "github.com/cosmos/cosmos-sdk/store" storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" - typesparams "github.com/cosmos/cosmos-sdk/x/params/types" "github.com/stretchr/testify/require" ) @@ -32,28 +31,16 @@ func CheckpointingKeeper(t testing.TB, ek types.EpochingKeeper, signer keeper.Bl types.RegisterInterfaces(registry) cdc := codec.NewProtoCodec(registry) - paramsSubspace := typesparams.NewSubspace( - cdc, - types.Amino, - storeKey, - memStoreKey, - "CheckpointingParams", - ) - k := keeper.NewKeeper( cdc, storeKey, memStoreKey, signer, ek, - paramsSubspace, cliCtx, ) ctx := sdk.NewContext(stateStore, tmproto.Header{}, false, log.NewNopLogger()) - // Initialize params - k.SetParams(ctx, types.DefaultParams()) - return &k, ctx, cdc } diff --git a/testutil/keeper/zoneconcierge.go b/testutil/keeper/zoneconcierge.go index 3dde98375..d4b6e67b0 100644 --- a/testutil/keeper/zoneconcierge.go +++ b/testutil/keeper/zoneconcierge.go @@ -17,7 +17,6 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" capabilitykeeper "github.com/cosmos/cosmos-sdk/x/capability/keeper" capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types" - typesparams "github.com/cosmos/cosmos-sdk/x/params/types" channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" ibcexported "github.com/cosmos/ibc-go/v7/modules/core/exported" "github.com/stretchr/testify/require" @@ -77,18 +76,10 @@ func ZoneConciergeKeeper(t testing.TB, checkpointingKeeper types.CheckpointingKe registry := codectypes.NewInterfaceRegistry() appCodec := codec.NewProtoCodec(registry) capabilityKeeper := capabilitykeeper.NewKeeper(appCodec, storeKey, memStoreKey) - - paramsSubspace := typesparams.NewSubspace(appCodec, - types.Amino, - storeKey, - memStoreKey, - "ZoneconciergeParams", - ) k := keeper.NewKeeper( appCodec, storeKey, memStoreKey, - paramsSubspace, nil, // TODO: mock this keeper zoneconciergeChannelKeeper{}, zoneconciergePortKeeper{}, @@ -104,8 +95,5 @@ func ZoneConciergeKeeper(t testing.TB, checkpointingKeeper types.CheckpointingKe ctx := sdk.NewContext(stateStore, tmproto.Header{}, false, logger) - // Initialize params - k.SetParams(ctx, types.DefaultParams()) - return k, ctx } diff --git a/x/btclightclient/client/cli/query.go b/x/btclightclient/client/cli/query.go index 0cb3e0622..98360a8d0 100644 --- a/x/btclightclient/client/cli/query.go +++ b/x/btclightclient/client/cli/query.go @@ -21,7 +21,6 @@ func GetQueryCmd(queryRoute string) *cobra.Command { RunE: client.ValidateCmd, } - cmd.AddCommand(CmdQueryParams()) cmd.AddCommand(CmdHashes()) cmd.AddCommand(CmdContains()) cmd.AddCommand(CmdMainChain()) @@ -31,31 +30,6 @@ func GetQueryCmd(queryRoute string) *cobra.Command { return cmd } -func CmdQueryParams() *cobra.Command { - cmd := &cobra.Command{ - Use: "params", - Short: "shows the parameters of the module", - Args: cobra.NoArgs, - RunE: func(cmd *cobra.Command, args []string) error { - clientCtx := client.GetClientContextFromCmd(cmd) - - queryClient := types.NewQueryClient(clientCtx) - - params := types.NewQueryParamsRequest() - res, err := queryClient.Params(context.Background(), params) - if err != nil { - return err - } - - return clientCtx.PrintProto(res) - }, - } - - flags.AddQueryFlagsToCmd(cmd) - - return cmd -} - func CmdHashes() *cobra.Command { cmd := &cobra.Command{ Use: "hashes", diff --git a/x/btclightclient/genesis.go b/x/btclightclient/genesis.go index 41c718632..3230a5052 100644 --- a/x/btclightclient/genesis.go +++ b/x/btclightclient/genesis.go @@ -9,14 +9,12 @@ import ( // InitGenesis initializes the capability module's state from a provided genesis // state. func InitGenesis(ctx sdk.Context, k keeper.Keeper, genState types.GenesisState) { - k.SetParams(ctx, genState.Params) k.SetBaseBTCHeader(ctx, genState.BaseBtcHeader) } // ExportGenesis returns the capability module's exported genesis. func ExportGenesis(ctx sdk.Context, k keeper.Keeper) *types.GenesisState { genesis := types.DefaultGenesis() - genesis.Params = k.GetParams(ctx) baseBTCHeader := k.GetBaseBTCHeader(ctx) if baseBTCHeader == nil { panic("A base BTC Header has not been set") diff --git a/x/btclightclient/genesis_test.go b/x/btclightclient/genesis_test.go index b252f61c7..89e2b8b99 100644 --- a/x/btclightclient/genesis_test.go +++ b/x/btclightclient/genesis_test.go @@ -1,9 +1,10 @@ package btclightclient_test import ( - bbn "github.com/babylonchain/babylon/types" "testing" + bbn "github.com/babylonchain/babylon/types" + keepertest "github.com/babylonchain/babylon/testutil/keeper" "github.com/babylonchain/babylon/testutil/nullify" "github.com/babylonchain/babylon/x/btclightclient" @@ -19,7 +20,6 @@ func TestGenesis(t *testing.T) { baseHeaderInfo := types.NewBTCHeaderInfo(&headerBytes, headerHash, headerHeight, &headerWork) genesisState := types.GenesisState{ - Params: types.DefaultParams(), BaseBtcHeader: *baseHeaderInfo, } diff --git a/x/btclightclient/keeper/grpc_query.go b/x/btclightclient/keeper/grpc_query.go index 293d912dc..edd0d1369 100644 --- a/x/btclightclient/keeper/grpc_query.go +++ b/x/btclightclient/keeper/grpc_query.go @@ -13,15 +13,6 @@ import ( var _ types.QueryServer = Keeper{} -func (k Keeper) Params(c context.Context, req *types.QueryParamsRequest) (*types.QueryParamsResponse, error) { - if req == nil { - return nil, status.Error(codes.InvalidArgument, "invalid request") - } - ctx := sdk.UnwrapSDKContext(c) - - return &types.QueryParamsResponse{Params: k.GetParams(ctx)}, nil -} - func (k Keeper) Hashes(ctx context.Context, req *types.QueryHashesRequest) (*types.QueryHashesResponse, error) { if req == nil { return nil, status.Error(codes.InvalidArgument, "invalid request") diff --git a/x/btclightclient/keeper/grpc_query_test.go b/x/btclightclient/keeper/grpc_query_test.go index e8c25630b..2e1caf695 100644 --- a/x/btclightclient/keeper/grpc_query_test.go +++ b/x/btclightclient/keeper/grpc_query_test.go @@ -11,20 +11,8 @@ import ( testkeeper "github.com/babylonchain/babylon/testutil/keeper" "github.com/babylonchain/babylon/x/btclightclient/types" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/stretchr/testify/require" ) -func TestParamsQuery(t *testing.T) { - keeper, ctx := testkeeper.BTCLightClientKeeper(t) - wctx := sdk.WrapSDKContext(ctx) - params := types.DefaultParams() - keeper.SetParams(ctx, params) - - response, err := keeper.Params(wctx, &types.QueryParamsRequest{}) - require.NoError(t, err) - require.Equal(t, &types.QueryParamsResponse{Params: params}, response) -} - func FuzzHashesQuery(f *testing.F) { /* Checks: diff --git a/x/btclightclient/keeper/keeper.go b/x/btclightclient/keeper/keeper.go index e2ee21773..28554a6dc 100644 --- a/x/btclightclient/keeper/keeper.go +++ b/x/btclightclient/keeper/keeper.go @@ -10,17 +10,15 @@ import ( "github.com/babylonchain/babylon/x/btclightclient/types" "github.com/cosmos/cosmos-sdk/codec" sdk "github.com/cosmos/cosmos-sdk/types" - paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" ) type ( Keeper struct { - cdc codec.BinaryCodec - storeKey storetypes.StoreKey - memKey storetypes.StoreKey - hooks types.BTCLightClientHooks - paramstore paramtypes.Subspace - btcConfig bbn.BtcConfig + cdc codec.BinaryCodec + storeKey storetypes.StoreKey + memKey storetypes.StoreKey + hooks types.BTCLightClientHooks + btcConfig bbn.BtcConfig } ) @@ -28,21 +26,15 @@ func NewKeeper( cdc codec.BinaryCodec, storeKey, memKey storetypes.StoreKey, - ps paramtypes.Subspace, btcConfig bbn.BtcConfig, ) *Keeper { - // set KeyTable if it has not already been set - if !ps.HasKeyTable() { - ps = ps.WithKeyTable(types.ParamKeyTable()) - } return &Keeper{ - cdc: cdc, - storeKey: storeKey, - memKey: memKey, - hooks: nil, - paramstore: ps, - btcConfig: btcConfig, + cdc: cdc, + storeKey: storeKey, + memKey: memKey, + hooks: nil, + btcConfig: btcConfig, } } diff --git a/x/btclightclient/keeper/params.go b/x/btclightclient/keeper/params.go deleted file mode 100644 index d85d8d586..000000000 --- a/x/btclightclient/keeper/params.go +++ /dev/null @@ -1,16 +0,0 @@ -package keeper - -import ( - "github.com/babylonchain/babylon/x/btclightclient/types" - sdk "github.com/cosmos/cosmos-sdk/types" -) - -// GetParams get all parameters as types.Params -func (k Keeper) GetParams(ctx sdk.Context) types.Params { - return types.NewParams() -} - -// SetParams set the params -func (k Keeper) SetParams(ctx sdk.Context, params types.Params) { - k.paramstore.SetParamSet(ctx, ¶ms) -} diff --git a/x/btclightclient/keeper/params_test.go b/x/btclightclient/keeper/params_test.go deleted file mode 100644 index a8821e95e..000000000 --- a/x/btclightclient/keeper/params_test.go +++ /dev/null @@ -1,18 +0,0 @@ -package keeper_test - -import ( - "testing" - - testkeeper "github.com/babylonchain/babylon/testutil/keeper" - "github.com/babylonchain/babylon/x/btclightclient/types" - "github.com/stretchr/testify/require" -) - -func TestGetParams(t *testing.T) { - k, ctx := testkeeper.BTCLightClientKeeper(t) - params := types.DefaultParams() - - k.SetParams(ctx, params) - - require.EqualValues(t, params, k.GetParams(ctx)) -} diff --git a/x/btclightclient/types/genesis.go b/x/btclightclient/types/genesis.go index e7ea69f81..f9e5226f9 100644 --- a/x/btclightclient/types/genesis.go +++ b/x/btclightclient/types/genesis.go @@ -18,7 +18,6 @@ func DefaultGenesis() *GenesisState { baseHeaderInfo := NewBTCHeaderInfo(&headerBytes, headerHash, headerHeight, &headerWork) return &GenesisState{ - Params: DefaultParams(), BaseBtcHeader: *baseHeaderInfo, } } @@ -26,12 +25,7 @@ func DefaultGenesis() *GenesisState { // Validate performs basic genesis state validation returning an error upon any // failure. func (gs GenesisState) Validate() error { - err := gs.Params.Validate() - if err != nil { - return err - } - - err = gs.BaseBtcHeader.Validate() + err := gs.BaseBtcHeader.Validate() if err != nil { return err } diff --git a/x/btclightclient/types/genesis.pb.go b/x/btclightclient/types/genesis.pb.go index 4371feddc..096396119 100644 --- a/x/btclightclient/types/genesis.pb.go +++ b/x/btclightclient/types/genesis.pb.go @@ -25,8 +25,7 @@ const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package // GenesisState defines the btclightclient module's genesis state. type GenesisState struct { - Params Params `protobuf:"bytes,1,opt,name=params,proto3" json:"params"` - BaseBtcHeader BTCHeaderInfo `protobuf:"bytes,2,opt,name=base_btc_header,json=baseBtcHeader,proto3" json:"base_btc_header"` + BaseBtcHeader BTCHeaderInfo `protobuf:"bytes,1,opt,name=base_btc_header,json=baseBtcHeader,proto3" json:"base_btc_header"` } func (m *GenesisState) Reset() { *m = GenesisState{} } @@ -62,13 +61,6 @@ func (m *GenesisState) XXX_DiscardUnknown() { var xxx_messageInfo_GenesisState proto.InternalMessageInfo -func (m *GenesisState) GetParams() Params { - if m != nil { - return m.Params - } - return Params{} -} - func (m *GenesisState) GetBaseBtcHeader() BTCHeaderInfo { if m != nil { return m.BaseBtcHeader @@ -85,24 +77,22 @@ func init() { } var fileDescriptor_4f95902e4096217a = []byte{ - // 261 bytes of a gzipped FileDescriptorProto + // 227 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x4f, 0x4a, 0x4c, 0xaa, 0xcc, 0xc9, 0xcf, 0xd3, 0x4f, 0x2a, 0x49, 0xce, 0xc9, 0x4c, 0xcf, 0x00, 0x91, 0xa9, 0x79, 0x25, 0xfa, 0x65, 0x86, 0xfa, 0xe9, 0xa9, 0x79, 0xa9, 0xc5, 0x99, 0xc5, 0x7a, 0x05, 0x45, 0xf9, 0x25, 0xf9, 0x42, 0x92, 0x50, 0x85, 0x7a, 0xa8, 0x0a, 0xf5, 0xca, 0x0c, 0xa5, 0x44, 0xd2, 0xf3, 0xd3, - 0xf3, 0xc1, 0xaa, 0xf4, 0x41, 0x2c, 0x88, 0x06, 0x29, 0x35, 0xdc, 0x26, 0x17, 0x24, 0x16, 0x25, - 0xe6, 0x42, 0x0d, 0x96, 0xd2, 0xc3, 0xad, 0x0e, 0xcd, 0x2a, 0xb0, 0x7a, 0xa5, 0xe5, 0x8c, 0x5c, - 0x3c, 0xee, 0x10, 0xa7, 0x05, 0x97, 0x24, 0x96, 0xa4, 0x0a, 0xd9, 0x73, 0xb1, 0x41, 0x0c, 0x94, - 0x60, 0x54, 0x60, 0xd4, 0xe0, 0x36, 0x52, 0xd4, 0xc3, 0xe9, 0x54, 0xbd, 0x00, 0xb0, 0x42, 0x27, - 0x96, 0x13, 0xf7, 0xe4, 0x19, 0x82, 0xa0, 0xda, 0x84, 0xc2, 0xb8, 0xf8, 0x93, 0x12, 0x8b, 0x53, - 0xe3, 0x93, 0x4a, 0x92, 0xe3, 0x33, 0x52, 0x13, 0x53, 0x52, 0x8b, 0x24, 0x98, 0xc0, 0x26, 0x69, - 0xe0, 0x31, 0xc9, 0x29, 0xc4, 0xd9, 0x03, 0xac, 0xd6, 0x33, 0x2f, 0x2d, 0x1f, 0x6a, 0x20, 0x2f, - 0xc8, 0x18, 0xa7, 0x92, 0x64, 0x88, 0x84, 0x53, 0xc0, 0x89, 0x47, 0x72, 0x8c, 0x17, 0x1e, 0xc9, - 0x31, 0x3e, 0x78, 0x24, 0xc7, 0x38, 0xe1, 0xb1, 0x1c, 0xc3, 0x85, 0xc7, 0x72, 0x0c, 0x37, 0x1e, - 0xcb, 0x31, 0x44, 0x99, 0xa5, 0x67, 0x96, 0x64, 0x94, 0x26, 0xe9, 0x25, 0xe7, 0xe7, 0xea, 0x43, - 0xad, 0x48, 0xce, 0x48, 0xcc, 0xcc, 0x83, 0x71, 0xf4, 0x2b, 0xd0, 0x43, 0xa3, 0xa4, 0xb2, 0x20, - 0xb5, 0x38, 0x89, 0x0d, 0x1c, 0x04, 0xc6, 0x80, 0x00, 0x00, 0x00, 0xff, 0xff, 0x47, 0x62, 0x55, - 0x1c, 0xb6, 0x01, 0x00, 0x00, + 0xf3, 0xc1, 0xaa, 0xf4, 0x41, 0x2c, 0x88, 0x06, 0x29, 0x3d, 0xdc, 0x26, 0xa3, 0x19, 0x01, 0x56, + 0xaf, 0x94, 0xc6, 0xc5, 0xe3, 0x0e, 0xb1, 0x31, 0xb8, 0x24, 0xb1, 0x24, 0x55, 0x28, 0x8c, 0x8b, + 0x3f, 0x29, 0xb1, 0x38, 0x35, 0x3e, 0xa9, 0x24, 0x39, 0x3e, 0x23, 0x35, 0x31, 0x25, 0xb5, 0x48, + 0x82, 0x51, 0x81, 0x51, 0x83, 0xdb, 0x48, 0x43, 0x0f, 0xa7, 0x53, 0xf4, 0x9c, 0x42, 0x9c, 0x3d, + 0xc0, 0x6a, 0x3d, 0xf3, 0xd2, 0xf2, 0x9d, 0x58, 0x4e, 0xdc, 0x93, 0x67, 0x08, 0xe2, 0x05, 0x19, + 0xe3, 0x54, 0x92, 0x0c, 0x91, 0x70, 0x0a, 0x38, 0xf1, 0x48, 0x8e, 0xf1, 0xc2, 0x23, 0x39, 0xc6, + 0x07, 0x8f, 0xe4, 0x18, 0x27, 0x3c, 0x96, 0x63, 0xb8, 0xf0, 0x58, 0x8e, 0xe1, 0xc6, 0x63, 0x39, + 0x86, 0x28, 0xb3, 0xf4, 0xcc, 0x92, 0x8c, 0xd2, 0x24, 0xbd, 0xe4, 0xfc, 0x5c, 0x7d, 0xa8, 0x15, + 0xc9, 0x19, 0x89, 0x99, 0x79, 0x30, 0x8e, 0x7e, 0x05, 0xba, 0x5f, 0x4a, 0x2a, 0x0b, 0x52, 0x8b, + 0x93, 0xd8, 0xc0, 0x1e, 0x30, 0x06, 0x04, 0x00, 0x00, 0xff, 0xff, 0x13, 0xa2, 0xce, 0xd4, 0x4c, + 0x01, 0x00, 0x00, } func (m *GenesisState) Marshal() (dAtA []byte, err error) { @@ -134,16 +124,6 @@ func (m *GenesisState) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintGenesis(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x12 - { - size, err := m.Params.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenesis(dAtA, i, uint64(size)) - } - i-- dAtA[i] = 0xa return len(dAtA) - i, nil } @@ -165,8 +145,6 @@ func (m *GenesisState) Size() (n int) { } var l int _ = l - l = m.Params.Size() - n += 1 + l + sovGenesis(uint64(l)) l = m.BaseBtcHeader.Size() n += 1 + l + sovGenesis(uint64(l)) return n @@ -208,39 +186,6 @@ func (m *GenesisState) Unmarshal(dAtA []byte) error { } switch fieldNum { case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Params", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenesis - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenesis - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Params.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field BaseBtcHeader", wireType) } diff --git a/x/btclightclient/types/params.go b/x/btclightclient/types/params.go deleted file mode 100644 index 357196ad6..000000000 --- a/x/btclightclient/types/params.go +++ /dev/null @@ -1,39 +0,0 @@ -package types - -import ( - paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" - "gopkg.in/yaml.v2" -) - -var _ paramtypes.ParamSet = (*Params)(nil) - -// ParamKeyTable the param key table for launch module -func ParamKeyTable() paramtypes.KeyTable { - return paramtypes.NewKeyTable().RegisterParamSet(&Params{}) -} - -// NewParams creates a new Params instance -func NewParams() Params { - return Params{} -} - -// DefaultParams returns a default set of parameters -func DefaultParams() Params { - return NewParams() -} - -// ParamSetPairs get the params.ParamSet -func (p *Params) ParamSetPairs() paramtypes.ParamSetPairs { - return paramtypes.ParamSetPairs{} -} - -// Validate validates the set of params -func (p Params) Validate() error { - return nil -} - -// String implements the Stringer interface. -func (p Params) String() string { - out, _ := yaml.Marshal(p) - return string(out) -} diff --git a/x/btclightclient/types/params.pb.go b/x/btclightclient/types/params.pb.go deleted file mode 100644 index 86a66a2cc..000000000 --- a/x/btclightclient/types/params.pb.go +++ /dev/null @@ -1,267 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: babylon/btclightclient/v1/params.proto - -package types - -import ( - fmt "fmt" - _ "github.com/cosmos/gogoproto/gogoproto" - proto "github.com/cosmos/gogoproto/proto" - io "io" - math "math" - math_bits "math/bits" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package - -// Params defines the parameters for the module. -type Params struct { -} - -func (m *Params) Reset() { *m = Params{} } -func (*Params) ProtoMessage() {} -func (*Params) Descriptor() ([]byte, []int) { - return fileDescriptor_1e4c5f7a17079e1f, []int{0} -} -func (m *Params) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Params) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Params.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 *Params) XXX_Merge(src proto.Message) { - xxx_messageInfo_Params.Merge(m, src) -} -func (m *Params) XXX_Size() int { - return m.Size() -} -func (m *Params) XXX_DiscardUnknown() { - xxx_messageInfo_Params.DiscardUnknown(m) -} - -var xxx_messageInfo_Params proto.InternalMessageInfo - -func init() { - proto.RegisterType((*Params)(nil), "babylon.btclightclient.v1.Params") -} - -func init() { - proto.RegisterFile("babylon/btclightclient/v1/params.proto", fileDescriptor_1e4c5f7a17079e1f) -} - -var fileDescriptor_1e4c5f7a17079e1f = []byte{ - // 162 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x4b, 0x4a, 0x4c, 0xaa, - 0xcc, 0xc9, 0xcf, 0xd3, 0x4f, 0x2a, 0x49, 0xce, 0xc9, 0x4c, 0xcf, 0x00, 0x91, 0xa9, 0x79, 0x25, - 0xfa, 0x65, 0x86, 0xfa, 0x05, 0x89, 0x45, 0x89, 0xb9, 0xc5, 0x7a, 0x05, 0x45, 0xf9, 0x25, 0xf9, - 0x42, 0x92, 0x50, 0x75, 0x7a, 0xa8, 0xea, 0xf4, 0xca, 0x0c, 0xa5, 0x44, 0xd2, 0xf3, 0xd3, 0xf3, - 0xc1, 0xaa, 0xf4, 0x41, 0x2c, 0x88, 0x06, 0x25, 0x3e, 0x2e, 0xb6, 0x00, 0xb0, 0x01, 0x56, 0x2c, - 0x33, 0x16, 0xc8, 0x33, 0x38, 0x05, 0x9c, 0x78, 0x24, 0xc7, 0x78, 0xe1, 0x91, 0x1c, 0xe3, 0x83, - 0x47, 0x72, 0x8c, 0x13, 0x1e, 0xcb, 0x31, 0x5c, 0x78, 0x2c, 0xc7, 0x70, 0xe3, 0xb1, 0x1c, 0x43, - 0x94, 0x59, 0x7a, 0x66, 0x49, 0x46, 0x69, 0x92, 0x5e, 0x72, 0x7e, 0xae, 0x3e, 0xd4, 0x96, 0xe4, - 0x8c, 0xc4, 0xcc, 0x3c, 0x18, 0x47, 0xbf, 0x02, 0xdd, 0x71, 0x25, 0x95, 0x05, 0xa9, 0xc5, 0x49, - 0x6c, 0x60, 0x8b, 0x8c, 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0xfe, 0x03, 0x9b, 0x66, 0xc3, 0x00, - 0x00, 0x00, -} - -func (m *Params) 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 *Params) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Params) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - return len(dAtA) - i, nil -} - -func encodeVarintParams(dAtA []byte, offset int, v uint64) int { - offset -= sovParams(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func (m *Params) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - return n -} - -func sovParams(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozParams(x uint64) (n int) { - return sovParams(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (m *Params) 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 ErrIntOverflowParams - } - 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: Params: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Params: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipParams(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthParams - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func skipParams(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - depth := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowParams - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - wireType := int(wire & 0x7) - switch wireType { - case 0: - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowParams - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - case 1: - iNdEx += 8 - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowParams - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if length < 0 { - return 0, ErrInvalidLengthParams - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupParams - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthParams - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthParams = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowParams = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupParams = fmt.Errorf("proto: unexpected end of group") -) diff --git a/x/btclightclient/types/querier.go b/x/btclightclient/types/querier.go index 57065a3cb..51537d46c 100644 --- a/x/btclightclient/types/querier.go +++ b/x/btclightclient/types/querier.go @@ -5,11 +5,6 @@ import ( "github.com/cosmos/cosmos-sdk/types/query" ) -// NewQueryParamsRequest creates a new instance of QueryParamsRequest. -func NewQueryParamsRequest() *QueryParamsRequest { - return &QueryParamsRequest{} -} - // NewQueryHashesRequest creates a new instance of QueryHashesRequest. func NewQueryHashesRequest(req *query.PageRequest) *QueryHashesRequest { return &QueryHashesRequest{Pagination: req} diff --git a/x/btclightclient/types/querier_test.go b/x/btclightclient/types/querier_test.go index 064f3a12f..34a9302cf 100644 --- a/x/btclightclient/types/querier_test.go +++ b/x/btclightclient/types/querier_test.go @@ -11,18 +11,6 @@ import ( "github.com/cosmos/cosmos-sdk/types/query" ) -func TestNewQueryParamsRequest(t *testing.T) { - newQueryParams := types.NewQueryParamsRequest() - if newQueryParams == nil { - t.Fatalf("A nil object was returned") - } - - emptyQueryParams := types.QueryParamsRequest{} - if *newQueryParams != emptyQueryParams { - t.Errorf("expected an empty QueryParamsRequest") - } -} - func TestNewQueryHashesRequest(t *testing.T) { headerBytes := bbn.GetBaseBTCHeaderBytes() headerHashBytes := headerBytes.Hash() diff --git a/x/btclightclient/types/query.pb.go b/x/btclightclient/types/query.pb.go index fd2c8f8ab..123bb92d6 100644 --- a/x/btclightclient/types/query.pb.go +++ b/x/btclightclient/types/query.pb.go @@ -31,89 +31,6 @@ var _ = math.Inf // proto package needs to be updated. const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package -// QueryParamsRequest is request type for the Query/Params RPC method. -type QueryParamsRequest struct { -} - -func (m *QueryParamsRequest) Reset() { *m = QueryParamsRequest{} } -func (m *QueryParamsRequest) String() string { return proto.CompactTextString(m) } -func (*QueryParamsRequest) ProtoMessage() {} -func (*QueryParamsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_3961270631e52721, []int{0} -} -func (m *QueryParamsRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryParamsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryParamsRequest.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 *QueryParamsRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryParamsRequest.Merge(m, src) -} -func (m *QueryParamsRequest) XXX_Size() int { - return m.Size() -} -func (m *QueryParamsRequest) XXX_DiscardUnknown() { - xxx_messageInfo_QueryParamsRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryParamsRequest proto.InternalMessageInfo - -// QueryParamsResponse is response type for the Query/Params RPC method. -type QueryParamsResponse struct { - // params holds all the parameters of this module. - Params Params `protobuf:"bytes,1,opt,name=params,proto3" json:"params"` -} - -func (m *QueryParamsResponse) Reset() { *m = QueryParamsResponse{} } -func (m *QueryParamsResponse) String() string { return proto.CompactTextString(m) } -func (*QueryParamsResponse) ProtoMessage() {} -func (*QueryParamsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_3961270631e52721, []int{1} -} -func (m *QueryParamsResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryParamsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryParamsResponse.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 *QueryParamsResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryParamsResponse.Merge(m, src) -} -func (m *QueryParamsResponse) XXX_Size() int { - return m.Size() -} -func (m *QueryParamsResponse) XXX_DiscardUnknown() { - xxx_messageInfo_QueryParamsResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryParamsResponse proto.InternalMessageInfo - -func (m *QueryParamsResponse) GetParams() Params { - if m != nil { - return m.Params - } - return Params{} -} - // QueryHashesRequest is request type for the Query/Hashes RPC method. // It involves retrieving all hashes that are maintained by the module. type QueryHashesRequest struct { @@ -124,7 +41,7 @@ func (m *QueryHashesRequest) Reset() { *m = QueryHashesRequest{} } func (m *QueryHashesRequest) String() string { return proto.CompactTextString(m) } func (*QueryHashesRequest) ProtoMessage() {} func (*QueryHashesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_3961270631e52721, []int{2} + return fileDescriptor_3961270631e52721, []int{0} } func (m *QueryHashesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -170,7 +87,7 @@ func (m *QueryHashesResponse) Reset() { *m = QueryHashesResponse{} } func (m *QueryHashesResponse) String() string { return proto.CompactTextString(m) } func (*QueryHashesResponse) ProtoMessage() {} func (*QueryHashesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_3961270631e52721, []int{3} + return fileDescriptor_3961270631e52721, []int{1} } func (m *QueryHashesResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -216,7 +133,7 @@ func (m *QueryContainsRequest) Reset() { *m = QueryContainsRequest{} } func (m *QueryContainsRequest) String() string { return proto.CompactTextString(m) } func (*QueryContainsRequest) ProtoMessage() {} func (*QueryContainsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_3961270631e52721, []int{4} + return fileDescriptor_3961270631e52721, []int{2} } func (m *QueryContainsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -254,7 +171,7 @@ func (m *QueryContainsResponse) Reset() { *m = QueryContainsResponse{} } func (m *QueryContainsResponse) String() string { return proto.CompactTextString(m) } func (*QueryContainsResponse) ProtoMessage() {} func (*QueryContainsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_3961270631e52721, []int{5} + return fileDescriptor_3961270631e52721, []int{3} } func (m *QueryContainsResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -300,7 +217,7 @@ func (m *QueryContainsBytesRequest) Reset() { *m = QueryContainsBytesReq func (m *QueryContainsBytesRequest) String() string { return proto.CompactTextString(m) } func (*QueryContainsBytesRequest) ProtoMessage() {} func (*QueryContainsBytesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_3961270631e52721, []int{6} + return fileDescriptor_3961270631e52721, []int{4} } func (m *QueryContainsBytesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -346,7 +263,7 @@ func (m *QueryContainsBytesResponse) Reset() { *m = QueryContainsBytesRe func (m *QueryContainsBytesResponse) String() string { return proto.CompactTextString(m) } func (*QueryContainsBytesResponse) ProtoMessage() {} func (*QueryContainsBytesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_3961270631e52721, []int{7} + return fileDescriptor_3961270631e52721, []int{5} } func (m *QueryContainsBytesResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -392,7 +309,7 @@ func (m *QueryMainChainRequest) Reset() { *m = QueryMainChainRequest{} } func (m *QueryMainChainRequest) String() string { return proto.CompactTextString(m) } func (*QueryMainChainRequest) ProtoMessage() {} func (*QueryMainChainRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_3961270631e52721, []int{8} + return fileDescriptor_3961270631e52721, []int{6} } func (m *QueryMainChainRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -438,7 +355,7 @@ func (m *QueryMainChainResponse) Reset() { *m = QueryMainChainResponse{} func (m *QueryMainChainResponse) String() string { return proto.CompactTextString(m) } func (*QueryMainChainResponse) ProtoMessage() {} func (*QueryMainChainResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_3961270631e52721, []int{9} + return fileDescriptor_3961270631e52721, []int{7} } func (m *QueryMainChainResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -489,7 +406,7 @@ func (m *QueryTipRequest) Reset() { *m = QueryTipRequest{} } func (m *QueryTipRequest) String() string { return proto.CompactTextString(m) } func (*QueryTipRequest) ProtoMessage() {} func (*QueryTipRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_3961270631e52721, []int{10} + return fileDescriptor_3961270631e52721, []int{8} } func (m *QueryTipRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -527,7 +444,7 @@ func (m *QueryTipResponse) Reset() { *m = QueryTipResponse{} } func (m *QueryTipResponse) String() string { return proto.CompactTextString(m) } func (*QueryTipResponse) ProtoMessage() {} func (*QueryTipResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_3961270631e52721, []int{11} + return fileDescriptor_3961270631e52721, []int{9} } func (m *QueryTipResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -572,7 +489,7 @@ func (m *QueryBaseHeaderRequest) Reset() { *m = QueryBaseHeaderRequest{} func (m *QueryBaseHeaderRequest) String() string { return proto.CompactTextString(m) } func (*QueryBaseHeaderRequest) ProtoMessage() {} func (*QueryBaseHeaderRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_3961270631e52721, []int{12} + return fileDescriptor_3961270631e52721, []int{10} } func (m *QueryBaseHeaderRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -611,7 +528,7 @@ func (m *QueryBaseHeaderResponse) Reset() { *m = QueryBaseHeaderResponse func (m *QueryBaseHeaderResponse) String() string { return proto.CompactTextString(m) } func (*QueryBaseHeaderResponse) ProtoMessage() {} func (*QueryBaseHeaderResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_3961270631e52721, []int{13} + return fileDescriptor_3961270631e52721, []int{11} } func (m *QueryBaseHeaderResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -648,8 +565,6 @@ func (m *QueryBaseHeaderResponse) GetHeader() *BTCHeaderInfo { } func init() { - proto.RegisterType((*QueryParamsRequest)(nil), "babylon.btclightclient.v1.QueryParamsRequest") - proto.RegisterType((*QueryParamsResponse)(nil), "babylon.btclightclient.v1.QueryParamsResponse") proto.RegisterType((*QueryHashesRequest)(nil), "babylon.btclightclient.v1.QueryHashesRequest") proto.RegisterType((*QueryHashesResponse)(nil), "babylon.btclightclient.v1.QueryHashesResponse") proto.RegisterType((*QueryContainsRequest)(nil), "babylon.btclightclient.v1.QueryContainsRequest") @@ -669,55 +584,51 @@ func init() { } var fileDescriptor_3961270631e52721 = []byte{ - // 755 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x96, 0x41, 0x4f, 0xd4, 0x4e, - 0x18, 0xc6, 0x77, 0x80, 0xff, 0xfe, 0xd7, 0x41, 0xa3, 0x8e, 0xa8, 0xd0, 0x98, 0x05, 0x8a, 0x2c, - 0x2b, 0x48, 0x87, 0x5d, 0xd4, 0x70, 0x30, 0xd1, 0x94, 0x44, 0xf1, 0x60, 0xb2, 0x6e, 0x36, 0x1e, - 0xd4, 0xc4, 0x4c, 0xd7, 0xb1, 0x6d, 0xc2, 0x76, 0xca, 0xb6, 0x10, 0xf7, 0xea, 0xc1, 0xb3, 0xd1, - 0x9b, 0x07, 0x0f, 0x26, 0x5e, 0x3d, 0xf9, 0x21, 0x38, 0x19, 0x12, 0x2f, 0xc6, 0x03, 0x31, 0xe0, - 0x07, 0x31, 0x9d, 0x79, 0xbb, 0x4b, 0x17, 0xd9, 0x96, 0xc8, 0x85, 0xd0, 0xe9, 0xfb, 0xbc, 0xcf, - 0x6f, 0x5e, 0x66, 0x9e, 0x82, 0x67, 0x2d, 0x66, 0x75, 0xd6, 0x85, 0x47, 0xad, 0xb0, 0xb9, 0xee, - 0xda, 0x4e, 0xf4, 0x93, 0x7b, 0x21, 0xdd, 0xaa, 0xd0, 0x8d, 0x4d, 0xde, 0xee, 0x18, 0x7e, 0x5b, - 0x84, 0x82, 0x4c, 0x40, 0x99, 0x91, 0x2c, 0x33, 0xb6, 0x2a, 0xda, 0x98, 0x2d, 0x6c, 0x21, 0xab, - 0x68, 0xf4, 0x9b, 0x12, 0x68, 0x57, 0x6c, 0x21, 0xec, 0x75, 0x4e, 0x99, 0xef, 0x52, 0xe6, 0x79, - 0x22, 0x64, 0xa1, 0x2b, 0xbc, 0x00, 0xde, 0xce, 0x37, 0x45, 0xd0, 0x12, 0x01, 0xb5, 0x58, 0xc0, - 0x95, 0x0f, 0xdd, 0xaa, 0x58, 0x3c, 0x64, 0x15, 0xea, 0x33, 0xdb, 0xf5, 0x64, 0x31, 0xd4, 0x96, - 0x8e, 0x26, 0xf4, 0x59, 0x9b, 0xb5, 0xe2, 0x9e, 0xc6, 0xd1, 0x75, 0x7d, 0xd0, 0xb2, 0x5e, 0x1f, - 0xc3, 0xe4, 0x51, 0xe4, 0x5c, 0x93, 0x4d, 0xea, 0x7c, 0x63, 0x93, 0x07, 0xa1, 0xfe, 0x18, 0x5f, - 0x48, 0xac, 0x06, 0xbe, 0xf0, 0x02, 0x4e, 0xee, 0xe0, 0xbc, 0x32, 0x1b, 0x47, 0x53, 0xa8, 0x3c, - 0x5a, 0x9d, 0x36, 0x8e, 0x1c, 0x88, 0xa1, 0xa4, 0xe6, 0xc8, 0xf6, 0xee, 0x64, 0xae, 0x0e, 0x32, - 0xfd, 0x19, 0xb8, 0xad, 0xb1, 0xc0, 0xe1, 0xb1, 0x1b, 0xb9, 0x87, 0x71, 0x6f, 0xbf, 0xd0, 0xba, - 0x64, 0xa8, 0xe1, 0x18, 0xd1, 0x70, 0x0c, 0xf5, 0x47, 0x80, 0xe1, 0x18, 0x35, 0x66, 0x73, 0xd0, - 0xd6, 0x0f, 0x28, 0xf5, 0xaf, 0x08, 0xb0, 0xe3, 0xf6, 0x80, 0xdd, 0xc0, 0x79, 0x47, 0xae, 0x8c, - 0xa3, 0xa9, 0xe1, 0xf2, 0x69, 0xf3, 0xf6, 0xcf, 0xdd, 0xc9, 0x15, 0xdb, 0x0d, 0x9d, 0x4d, 0xcb, - 0x68, 0x8a, 0x16, 0x85, 0x4d, 0x34, 0x1d, 0xe6, 0x7a, 0xf1, 0x03, 0x0d, 0x3b, 0x3e, 0x0f, 0x0c, - 0xb3, 0xb1, 0xba, 0xc6, 0xd9, 0x0b, 0xde, 0x8e, 0x5a, 0x9a, 0x9d, 0x90, 0x07, 0x75, 0xe8, 0x45, - 0xee, 0x27, 0xa8, 0x87, 0x24, 0xf5, 0x5c, 0x2a, 0xb5, 0x42, 0x4a, 0x60, 0x3b, 0x78, 0x4c, 0x52, - 0xaf, 0x0a, 0x2f, 0x64, 0xae, 0xd7, 0x1d, 0x4b, 0x0d, 0x8f, 0x44, 0x56, 0x72, 0x20, 0xff, 0x0a, - 0x2d, 0x3b, 0xe9, 0xcb, 0xf8, 0x62, 0x9f, 0x13, 0x4c, 0x48, 0xc3, 0x85, 0x26, 0xac, 0x49, 0xbb, - 0x42, 0xbd, 0xfb, 0xac, 0x53, 0x3c, 0x91, 0x10, 0xa9, 0x86, 0xc0, 0x48, 0x0e, 0x32, 0x82, 0xcb, - 0x0a, 0xd6, 0xfe, 0x26, 0xc8, 0x60, 0xf5, 0x1c, 0xf8, 0x1e, 0x32, 0xd7, 0x5b, 0x8d, 0x36, 0x76, - 0xd2, 0x27, 0xe4, 0x33, 0xc2, 0x97, 0xfa, 0x1d, 0x80, 0xcb, 0xc4, 0xff, 0x3b, 0x72, 0x68, 0xea, - 0x94, 0x8c, 0x56, 0xcb, 0x03, 0x0e, 0x77, 0x77, 0xc2, 0x0f, 0xbc, 0x97, 0xa2, 0x1e, 0x0b, 0x4f, - 0xee, 0x48, 0x9c, 0xc7, 0x67, 0x25, 0x66, 0xc3, 0xf5, 0xe3, 0x2b, 0xd9, 0xc0, 0xe7, 0x7a, 0x4b, - 0xc0, 0x7c, 0x17, 0xe7, 0x95, 0x35, 0x8c, 0x24, 0x3b, 0x32, 0xe8, 0xf4, 0x71, 0x98, 0x87, 0xc9, - 0x02, 0xae, 0x5e, 0xc7, 0x7e, 0x4f, 0xf1, 0xe5, 0x43, 0x6f, 0x4e, 0xca, 0xb6, 0xfa, 0xad, 0x80, - 0xff, 0x93, 0xdd, 0xc9, 0x3b, 0x84, 0xf3, 0x2a, 0x2a, 0xc8, 0xe2, 0x80, 0x36, 0x87, 0x33, 0x4a, - 0x33, 0xb2, 0x96, 0x2b, 0x6a, 0xfd, 0xda, 0xeb, 0xef, 0xbf, 0xdf, 0x0f, 0xcd, 0x90, 0x69, 0x9a, - 0x16, 0xa5, 0x12, 0x4a, 0x65, 0x48, 0x3a, 0x54, 0x22, 0xca, 0xd2, 0xa1, 0x92, 0xd1, 0x94, 0x09, - 0x0a, 0xf2, 0xe6, 0x03, 0xc2, 0x85, 0xf8, 0x4a, 0x11, 0x9a, 0xe6, 0xd3, 0x17, 0x26, 0xda, 0x52, - 0x76, 0x01, 0xa0, 0x2d, 0x48, 0xb4, 0x59, 0x32, 0x33, 0x00, 0x2d, 0xbe, 0xb9, 0xe4, 0x0b, 0xc2, - 0x67, 0x12, 0xf7, 0x9d, 0xdc, 0xc8, 0x6a, 0x78, 0x30, 0x4f, 0xb4, 0x9b, 0xc7, 0x54, 0x01, 0xeb, - 0x92, 0x64, 0x9d, 0x27, 0xe5, 0x0c, 0xac, 0x0a, 0xef, 0x23, 0xc2, 0xa7, 0xba, 0x21, 0x40, 0x52, - 0xa7, 0xd3, 0x9f, 0x48, 0x5a, 0xe5, 0x18, 0x0a, 0x80, 0xbc, 0x2e, 0x21, 0x4b, 0xe4, 0xea, 0x00, - 0xc8, 0x16, 0x73, 0x55, 0xa4, 0x93, 0x37, 0x08, 0x0f, 0x37, 0x5c, 0x9f, 0xcc, 0xa7, 0x19, 0xf5, - 0x32, 0x42, 0x5b, 0xc8, 0x54, 0x0b, 0x38, 0x25, 0x89, 0x33, 0x45, 0x8a, 0x03, 0x70, 0x42, 0xd7, - 0x27, 0x9f, 0x10, 0xc6, 0xbd, 0x10, 0x20, 0xa9, 0x1b, 0x3f, 0x14, 0x25, 0x5a, 0xf5, 0x38, 0x12, - 0xa0, 0x5b, 0x94, 0x74, 0x73, 0x64, 0x76, 0x00, 0x5d, 0x94, 0xa8, 0x2a, 0x50, 0xcc, 0xda, 0xf6, - 0x5e, 0x11, 0xed, 0xec, 0x15, 0xd1, 0xaf, 0xbd, 0x22, 0x7a, 0xbb, 0x5f, 0xcc, 0xed, 0xec, 0x17, - 0x73, 0x3f, 0xf6, 0x8b, 0xb9, 0x27, 0xb7, 0xd2, 0xbe, 0x99, 0xaf, 0xfa, 0x3b, 0xcb, 0x8f, 0xa8, - 0x95, 0x97, 0xff, 0x1f, 0x2d, 0xff, 0x09, 0x00, 0x00, 0xff, 0xff, 0x01, 0x5c, 0xdf, 0x45, 0x1b, - 0x0a, 0x00, 0x00, + // 694 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x96, 0xb1, 0x4f, 0x14, 0x4f, + 0x14, 0xc7, 0x19, 0xf8, 0xfd, 0x0e, 0x7c, 0x68, 0xd4, 0x11, 0x15, 0x36, 0x66, 0xc5, 0x45, 0xe0, + 0x04, 0xd9, 0xe1, 0x0e, 0x35, 0x14, 0x16, 0xe6, 0x48, 0x14, 0x0b, 0x13, 0xbc, 0x5c, 0xa5, 0x26, + 0x66, 0xf6, 0x1c, 0x77, 0x37, 0x81, 0x9d, 0x85, 0x19, 0x88, 0xd7, 0x5a, 0x58, 0x1b, 0xed, 0x2c, + 0x2c, 0x4c, 0x6c, 0xad, 0x6c, 0xfc, 0x0f, 0x2c, 0x49, 0x6c, 0x8c, 0x85, 0x31, 0xe0, 0x1f, 0x62, + 0x76, 0xe6, 0x1d, 0xc7, 0x1d, 0x72, 0xb7, 0x44, 0x1a, 0xc2, 0xee, 0xbc, 0xef, 0xfb, 0x7e, 0xe6, + 0x65, 0xbe, 0xb3, 0x07, 0x93, 0x01, 0x0f, 0x1a, 0xab, 0x32, 0x61, 0x81, 0xae, 0xaf, 0xc6, 0x61, + 0x94, 0xfd, 0x15, 0x89, 0x66, 0x5b, 0x25, 0xb6, 0xbe, 0x29, 0x36, 0x1a, 0x7e, 0xba, 0x21, 0xb5, + 0xa4, 0x63, 0x58, 0xe6, 0xb7, 0x97, 0xf9, 0x5b, 0x25, 0x67, 0x24, 0x94, 0xa1, 0x34, 0x55, 0x2c, + 0xfb, 0xcf, 0x0a, 0x9c, 0x4b, 0xa1, 0x94, 0xe1, 0xaa, 0x60, 0x3c, 0x8d, 0x19, 0x4f, 0x12, 0xa9, + 0xb9, 0x8e, 0x65, 0xa2, 0x70, 0x75, 0xa6, 0x2e, 0xd5, 0x9a, 0x54, 0x2c, 0xe0, 0x4a, 0x58, 0x1f, + 0xb6, 0x55, 0x0a, 0x84, 0xe6, 0x25, 0x96, 0xf2, 0x30, 0x4e, 0x4c, 0x31, 0xd6, 0xfa, 0x87, 0x13, + 0x76, 0xc0, 0x98, 0x7a, 0xef, 0x09, 0xd0, 0x87, 0x59, 0xc7, 0x65, 0xae, 0x22, 0xa1, 0xaa, 0x62, + 0x7d, 0x53, 0x28, 0x4d, 0xef, 0x02, 0xb4, 0x3a, 0x8f, 0x92, 0x71, 0x52, 0x1c, 0x2e, 0x4f, 0xf9, + 0x16, 0xc3, 0xcf, 0x30, 0x7c, 0xbb, 0x5d, 0xc4, 0xf0, 0x57, 0x78, 0x28, 0x50, 0x5b, 0xdd, 0xa7, + 0xf4, 0x3e, 0x13, 0x38, 0xd7, 0xd6, 0x5e, 0xa5, 0x32, 0x51, 0x82, 0xd6, 0xa0, 0x10, 0x99, 0x37, + 0xa3, 0x64, 0x7c, 0xa0, 0x78, 0xb2, 0x72, 0xfb, 0xc7, 0xcf, 0xcb, 0x8b, 0x61, 0xac, 0xa3, 0xcd, + 0xc0, 0xaf, 0xcb, 0x35, 0x86, 0x9b, 0xa8, 0x47, 0x3c, 0x4e, 0x9a, 0x0f, 0x4c, 0x37, 0x52, 0xa1, + 0xfc, 0x4a, 0x6d, 0x69, 0x59, 0xf0, 0x67, 0x62, 0x23, 0x6b, 0x59, 0x69, 0x68, 0xa1, 0xaa, 0xd8, + 0x8b, 0xde, 0x6b, 0xa3, 0xee, 0x37, 0xd4, 0xd3, 0x3d, 0xa9, 0x2d, 0x52, 0x1b, 0x76, 0x04, 0x23, + 0x86, 0x7a, 0x49, 0x26, 0x9a, 0xc7, 0xc9, 0xde, 0x58, 0x56, 0xe0, 0xbf, 0xcc, 0xca, 0x0c, 0xe4, + 0x5f, 0xa1, 0x4d, 0x27, 0x6f, 0x01, 0xce, 0x77, 0x38, 0xe1, 0x84, 0x1c, 0x18, 0xaa, 0xe3, 0x3b, + 0x63, 0x37, 0x54, 0xdd, 0x7b, 0xf6, 0x18, 0x8c, 0xb5, 0x89, 0x6c, 0x43, 0x64, 0xa4, 0xfb, 0x19, + 0xd1, 0x65, 0x11, 0x9c, 0xbf, 0x09, 0x72, 0x58, 0x3d, 0x45, 0xbe, 0x07, 0x3c, 0x4e, 0x96, 0xb2, + 0x8d, 0x1d, 0xf7, 0x09, 0xf9, 0x48, 0xe0, 0x42, 0xa7, 0x03, 0x72, 0x55, 0x60, 0x30, 0x32, 0x43, + 0xb3, 0xa7, 0x64, 0xb8, 0x5c, 0xf4, 0x0f, 0xcd, 0x55, 0x6b, 0xc2, 0xf7, 0x93, 0xe7, 0xb2, 0xda, + 0x14, 0x1e, 0xdf, 0x91, 0x38, 0x0b, 0xa7, 0x0d, 0x66, 0x2d, 0x4e, 0x71, 0x1b, 0x5e, 0x0d, 0xce, + 0xb4, 0x5e, 0x21, 0xf3, 0x1d, 0x28, 0x58, 0x6b, 0x1c, 0x49, 0x7e, 0x64, 0xd4, 0x79, 0xa3, 0x38, + 0x8f, 0x0a, 0x57, 0xc2, 0x2e, 0x37, 0xfd, 0x1e, 0xc3, 0xc5, 0x03, 0x2b, 0xc7, 0x65, 0x5b, 0xfe, + 0x32, 0x08, 0xff, 0x9b, 0xee, 0xf4, 0x0d, 0x81, 0x82, 0x8d, 0x2b, 0x9d, 0xeb, 0xd2, 0xe6, 0xe0, + 0xad, 0xe1, 0xf8, 0x79, 0xcb, 0x2d, 0xb5, 0x77, 0xed, 0xe5, 0xb7, 0xdf, 0x6f, 0xfb, 0x27, 0xe8, + 0x15, 0x76, 0xf8, 0xa5, 0x85, 0xd1, 0x7e, 0x47, 0x60, 0xa8, 0x79, 0x7a, 0x29, 0xeb, 0xe5, 0xd3, + 0x91, 0x5b, 0x67, 0x3e, 0xbf, 0x00, 0xd1, 0x66, 0x0d, 0xda, 0x24, 0x9d, 0xe8, 0x82, 0xd6, 0x0c, + 0x09, 0xfd, 0x44, 0xe0, 0x54, 0x5b, 0xb4, 0xe8, 0x8d, 0xbc, 0x86, 0xfb, 0xa3, 0xeb, 0xdc, 0x3c, + 0xa2, 0x0a, 0x59, 0xe7, 0x0d, 0xeb, 0x0c, 0x2d, 0xe6, 0x60, 0xb5, 0x78, 0xef, 0x09, 0x9c, 0xd8, + 0xcb, 0x1b, 0xed, 0x39, 0x9d, 0xce, 0xf0, 0x3b, 0xa5, 0x23, 0x28, 0x10, 0xf2, 0xba, 0x81, 0x9c, + 0xa2, 0x57, 0xbb, 0x40, 0xae, 0xf1, 0xd8, 0xde, 0x9e, 0xf4, 0x15, 0x81, 0x81, 0x5a, 0x9c, 0xd2, + 0x99, 0x5e, 0x46, 0xad, 0x38, 0x3a, 0xb3, 0xb9, 0x6a, 0x11, 0x67, 0xca, 0xe0, 0x8c, 0x53, 0xb7, + 0x0b, 0x8e, 0x8e, 0x53, 0xfa, 0x81, 0x00, 0xb4, 0xf2, 0x46, 0x7b, 0x6e, 0xfc, 0x40, 0x6a, 0x9d, + 0xf2, 0x51, 0x24, 0x48, 0x37, 0x67, 0xe8, 0xa6, 0xe9, 0x64, 0x17, 0xba, 0xec, 0xf2, 0xb2, 0xd9, + 0xad, 0xac, 0x7c, 0xdd, 0x71, 0xc9, 0xf6, 0x8e, 0x4b, 0x7e, 0xed, 0xb8, 0xe4, 0xf5, 0xae, 0xdb, + 0xb7, 0xbd, 0xeb, 0xf6, 0x7d, 0xdf, 0x75, 0xfb, 0x1e, 0xdd, 0xea, 0xf5, 0x79, 0x7a, 0xd1, 0xd9, + 0xd9, 0x7c, 0xaf, 0x82, 0x82, 0xf9, 0x71, 0xb0, 0xf0, 0x27, 0x00, 0x00, 0xff, 0xff, 0x88, 0x96, + 0xa9, 0x76, 0xf0, 0x08, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -732,8 +643,6 @@ const _ = grpc.SupportPackageIsVersion4 // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. type QueryClient interface { - // Parameters queries the parameters of the module. - Params(ctx context.Context, in *QueryParamsRequest, opts ...grpc.CallOption) (*QueryParamsResponse, error) // Hashes retrieves the hashes maintained by the module. Hashes(ctx context.Context, in *QueryHashesRequest, opts ...grpc.CallOption) (*QueryHashesResponse, error) // Contains checks whether a hash is maintained by the module. @@ -760,15 +669,6 @@ func NewQueryClient(cc grpc1.ClientConn) QueryClient { return &queryClient{cc} } -func (c *queryClient) Params(ctx context.Context, in *QueryParamsRequest, opts ...grpc.CallOption) (*QueryParamsResponse, error) { - out := new(QueryParamsResponse) - err := c.cc.Invoke(ctx, "/babylon.btclightclient.v1.Query/Params", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - func (c *queryClient) Hashes(ctx context.Context, in *QueryHashesRequest, opts ...grpc.CallOption) (*QueryHashesResponse, error) { out := new(QueryHashesResponse) err := c.cc.Invoke(ctx, "/babylon.btclightclient.v1.Query/Hashes", in, out, opts...) @@ -825,8 +725,6 @@ func (c *queryClient) BaseHeader(ctx context.Context, in *QueryBaseHeaderRequest // QueryServer is the server API for Query service. type QueryServer interface { - // Parameters queries the parameters of the module. - Params(context.Context, *QueryParamsRequest) (*QueryParamsResponse, error) // Hashes retrieves the hashes maintained by the module. Hashes(context.Context, *QueryHashesRequest) (*QueryHashesResponse, error) // Contains checks whether a hash is maintained by the module. @@ -849,9 +747,6 @@ type QueryServer interface { type UnimplementedQueryServer struct { } -func (*UnimplementedQueryServer) Params(ctx context.Context, req *QueryParamsRequest) (*QueryParamsResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method Params not implemented") -} func (*UnimplementedQueryServer) Hashes(ctx context.Context, req *QueryHashesRequest) (*QueryHashesResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method Hashes not implemented") } @@ -875,24 +770,6 @@ func RegisterQueryServer(s grpc1.Server, srv QueryServer) { s.RegisterService(&_Query_serviceDesc, srv) } -func _Query_Params_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(QueryParamsRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(QueryServer).Params(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/babylon.btclightclient.v1.Query/Params", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(QueryServer).Params(ctx, req.(*QueryParamsRequest)) - } - return interceptor(ctx, in, info, handler) -} - func _Query_Hashes_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(QueryHashesRequest) if err := dec(in); err != nil { @@ -1005,10 +882,6 @@ var _Query_serviceDesc = grpc.ServiceDesc{ ServiceName: "babylon.btclightclient.v1.Query", HandlerType: (*QueryServer)(nil), Methods: []grpc.MethodDesc{ - { - MethodName: "Params", - Handler: _Query_Params_Handler, - }, { MethodName: "Hashes", Handler: _Query_Hashes_Handler, @@ -1038,62 +911,6 @@ var _Query_serviceDesc = grpc.ServiceDesc{ Metadata: "babylon/btclightclient/v1/query.proto", } -func (m *QueryParamsRequest) 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 *QueryParamsRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryParamsRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - return len(dAtA) - i, nil -} - -func (m *QueryParamsResponse) 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 *QueryParamsResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryParamsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size, err := m.Params.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - func (m *QueryHashesRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -1520,26 +1337,6 @@ func encodeVarintQuery(dAtA []byte, offset int, v uint64) int { dAtA[offset] = uint8(v) return base } -func (m *QueryParamsRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - return n -} - -func (m *QueryParamsResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.Params.Size() - n += 1 + l + sovQuery(uint64(l)) - return n -} - func (m *QueryHashesRequest) Size() (n int) { if m == nil { return 0 @@ -1704,139 +1501,6 @@ func sovQuery(x uint64) (n int) { func sozQuery(x uint64) (n int) { return sovQuery(uint64((x << 1) ^ uint64((int64(x) >> 63)))) } -func (m *QueryParamsRequest) 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 ErrIntOverflowQuery - } - 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: QueryParamsRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryParamsRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryParamsResponse) 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 ErrIntOverflowQuery - } - 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: QueryParamsResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryParamsResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Params", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Params.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} func (m *QueryHashesRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/x/btclightclient/types/query.pb.gw.go b/x/btclightclient/types/query.pb.gw.go index d7d5dab4c..14fc314c2 100644 --- a/x/btclightclient/types/query.pb.gw.go +++ b/x/btclightclient/types/query.pb.gw.go @@ -33,24 +33,6 @@ var _ = utilities.NewDoubleArray var _ = descriptor.ForMessage var _ = metadata.Join -func request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryParamsRequest - var metadata runtime.ServerMetadata - - msg, err := client.Params(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryParamsRequest - var metadata runtime.ServerMetadata - - msg, err := server.Params(ctx, &protoReq) - return msg, metadata, err - -} - var ( filter_Query_Hashes_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} ) @@ -237,29 +219,6 @@ func local_request_Query_BaseHeader_0(ctx context.Context, marshaler runtime.Mar // Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterQueryHandlerFromEndpoint instead. func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, server QueryServer) error { - mux.Handle("GET", pattern_Query_Params_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_Params_0(rctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_Params_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - mux.Handle("GET", pattern_Query_Hashes_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -439,26 +398,6 @@ func RegisterQueryHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc // "QueryClient" to call the correct interceptors. func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, client QueryClient) error { - mux.Handle("GET", pattern_Query_Params_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Query_Params_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_Params_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - mux.Handle("GET", pattern_Query_Hashes_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -583,8 +522,6 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie } var ( - pattern_Query_Params_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"babylon", "btclightclient", "v1", "params"}, "", runtime.AssumeColonVerbOpt(false))) - pattern_Query_Hashes_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"babylon", "btclightclient", "v1", "hashes"}, "", runtime.AssumeColonVerbOpt(false))) pattern_Query_Contains_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"babylon", "btclightclient", "v1", "contains"}, "", runtime.AssumeColonVerbOpt(false))) @@ -599,8 +536,6 @@ var ( ) var ( - forward_Query_Params_0 = runtime.ForwardResponseMessage - forward_Query_Hashes_0 = runtime.ForwardResponseMessage forward_Query_Contains_0 = runtime.ForwardResponseMessage diff --git a/x/checkpointing/client/cli/query.go b/x/checkpointing/client/cli/query.go index 78a0b3daf..1546c99d9 100644 --- a/x/checkpointing/client/cli/query.go +++ b/x/checkpointing/client/cli/query.go @@ -4,9 +4,10 @@ import ( "context" "errors" "fmt" - "github.com/cosmos/cosmos-sdk/client/flags" "strconv" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/spf13/cobra" "github.com/cosmos/cosmos-sdk/client" @@ -24,8 +25,6 @@ func GetQueryCmd(queryRoute string) *cobra.Command { SuggestionsMinimumDistance: 2, RunE: client.ValidateCmd, } - - cmd.AddCommand(CmdQueryParams()) cmd.AddCommand(CmdRawCheckpoint()) cmd.AddCommand(CmdRawCheckpointList()) diff --git a/x/checkpointing/client/cli/query_params.go b/x/checkpointing/client/cli/query_params.go deleted file mode 100644 index 64405737f..000000000 --- a/x/checkpointing/client/cli/query_params.go +++ /dev/null @@ -1,34 +0,0 @@ -package cli - -import ( - "context" - - "github.com/babylonchain/babylon/x/checkpointing/types" - "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/client/flags" - "github.com/spf13/cobra" -) - -func CmdQueryParams() *cobra.Command { - cmd := &cobra.Command{ - Use: "params", - Short: "shows the parameters of the module", - Args: cobra.NoArgs, - RunE: func(cmd *cobra.Command, args []string) error { - clientCtx := client.GetClientContextFromCmd(cmd) - - queryClient := types.NewQueryClient(clientCtx) - - res, err := queryClient.Params(context.Background(), &types.QueryParamsRequest{}) - if err != nil { - return err - } - - return clientCtx.PrintProto(res) - }, - } - - flags.AddQueryFlagsToCmd(cmd) - - return cmd -} diff --git a/x/checkpointing/genesis.go b/x/checkpointing/genesis.go index 35760b00f..60bbca23f 100644 --- a/x/checkpointing/genesis.go +++ b/x/checkpointing/genesis.go @@ -9,15 +9,11 @@ import ( // InitGenesis initializes the capability module's state from a provided genesis // state. func InitGenesis(ctx sdk.Context, k keeper.Keeper, genState types.GenesisState) { - k.SetParams(ctx, genState.Params) - k.SetGenBlsKeys(ctx, genState.GenesisKeys) } // ExportGenesis returns the capability module's exported genesis. func ExportGenesis(ctx sdk.Context, k keeper.Keeper) *types.GenesisState { genesis := types.DefaultGenesis() - genesis.Params = k.GetParams(ctx) - return genesis } diff --git a/x/checkpointing/genesis_test.go b/x/checkpointing/genesis_test.go index 578f70fc0..5fdc738c9 100644 --- a/x/checkpointing/genesis_test.go +++ b/x/checkpointing/genesis_test.go @@ -39,7 +39,6 @@ func TestInitGenesis(t *testing.T) { genKeys[i] = genKey } genesisState := types.GenesisState{ - Params: types.Params{}, GenesisKeys: genKeys, } diff --git a/x/checkpointing/keeper/grpc_query_bls_test.go b/x/checkpointing/keeper/grpc_query_bls_test.go index e6e3e264d..e530904cb 100644 --- a/x/checkpointing/keeper/grpc_query_bls_test.go +++ b/x/checkpointing/keeper/grpc_query_bls_test.go @@ -27,9 +27,8 @@ func FuzzQueryBLSKeySet(f *testing.F) { helper := testepoching.NewHelper(t) ek := helper.EpochingKeeper ck := helper.App.CheckpointingKeeper - querier := checkpointingkeeper.Querier{Keeper: ck} queryHelper := baseapp.NewQueryServerTestHelper(helper.Ctx, helper.App.InterfaceRegistry()) - types.RegisterQueryServer(queryHelper, querier) + types.RegisterQueryServer(queryHelper, ck) queryClient := types.NewQueryClient(queryHelper) msgServer := checkpointingkeeper.NewMsgServerImpl(ck) genesisVal := ek.GetValidatorSet(helper.Ctx, 0)[0] diff --git a/x/checkpointing/keeper/grpc_query_params.go b/x/checkpointing/keeper/grpc_query_params.go deleted file mode 100644 index 85bcc8f55..000000000 --- a/x/checkpointing/keeper/grpc_query_params.go +++ /dev/null @@ -1,26 +0,0 @@ -package keeper - -import ( - "context" - - "github.com/babylonchain/babylon/x/checkpointing/types" - sdk "github.com/cosmos/cosmos-sdk/types" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/status" -) - -// Querier is used as Keeper will have duplicate methods if used directly, and gRPC names take precedence over keeper -type Querier struct { - Keeper -} - -var _ types.QueryServer = Querier{} - -func (k Keeper) Params(c context.Context, req *types.QueryParamsRequest) (*types.QueryParamsResponse, error) { - if req == nil { - return nil, status.Error(codes.InvalidArgument, "invalid request") - } - ctx := sdk.UnwrapSDKContext(c) - - return &types.QueryParamsResponse{Params: k.GetParams(ctx)}, nil -} diff --git a/x/checkpointing/keeper/keeper.go b/x/checkpointing/keeper/keeper.go index 153870a34..1de85b530 100644 --- a/x/checkpointing/keeper/keeper.go +++ b/x/checkpointing/keeper/keeper.go @@ -11,7 +11,6 @@ import ( "github.com/cosmos/cosmos-sdk/codec" storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" - paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" "github.com/babylonchain/babylon/crypto/bls12381" "github.com/babylonchain/babylon/x/checkpointing/types" @@ -26,7 +25,6 @@ type ( blsSigner BlsSigner epochingKeeper types.EpochingKeeper hooks types.CheckpointingHooks - paramstore paramtypes.Subspace clientCtx client.Context } ) @@ -37,21 +35,14 @@ func NewKeeper( memKey storetypes.StoreKey, signer BlsSigner, ek types.EpochingKeeper, - ps paramtypes.Subspace, clientCtx client.Context, ) Keeper { - // set KeyTable if it has not already been set - if !ps.HasKeyTable() { - ps = ps.WithKeyTable(types.ParamKeyTable()) - } - return Keeper{ cdc: cdc, storeKey: storeKey, memKey: memKey, blsSigner: signer, epochingKeeper: ek, - paramstore: ps, hooks: nil, clientCtx: clientCtx, } diff --git a/x/checkpointing/keeper/params.go b/x/checkpointing/keeper/params.go deleted file mode 100644 index 489692a8b..000000000 --- a/x/checkpointing/keeper/params.go +++ /dev/null @@ -1,16 +0,0 @@ -package keeper - -import ( - "github.com/babylonchain/babylon/x/checkpointing/types" - sdk "github.com/cosmos/cosmos-sdk/types" -) - -// GetParams get all parameters as types.Params -func (k Keeper) GetParams(ctx sdk.Context) types.Params { - return types.NewParams() -} - -// SetParams set the params -func (k Keeper) SetParams(ctx sdk.Context, params types.Params) { - k.paramstore.SetParamSet(ctx, ¶ms) -} diff --git a/x/checkpointing/keeper/val_bls_set_test.go b/x/checkpointing/keeper/val_bls_set_test.go index 4d36f074f..d7ec3993d 100644 --- a/x/checkpointing/keeper/val_bls_set_test.go +++ b/x/checkpointing/keeper/val_bls_set_test.go @@ -22,9 +22,8 @@ func FuzzGetValidatorBlsKeySet(f *testing.F) { helper := testepoching.NewHelper(t) ek := helper.EpochingKeeper ck := helper.App.CheckpointingKeeper - querier := checkpointingkeeper.Querier{Keeper: ck} queryHelper := baseapp.NewQueryServerTestHelper(helper.Ctx, helper.App.InterfaceRegistry()) - types.RegisterQueryServer(queryHelper, querier) + types.RegisterQueryServer(queryHelper, ck) msgServer := checkpointingkeeper.NewMsgServerImpl(ck) genesisVal := ek.GetValidatorSet(helper.Ctx, 0)[0] genesisBLSPubkey, err := ck.GetBlsPubKey(helper.Ctx, genesisVal.Addr) diff --git a/x/checkpointing/module_simulation.go b/x/checkpointing/module_simulation.go index 90ee4172b..db476aa0d 100644 --- a/x/checkpointing/module_simulation.go +++ b/x/checkpointing/module_simulation.go @@ -29,9 +29,7 @@ func (AppModule) GenerateGenesisState(simState *module.SimulationState) { for i, acc := range simState.Accounts { accs[i] = acc.Address.String() } - headeroracleGenesis := types.GenesisState{ - Params: types.DefaultParams(), - } + headeroracleGenesis := types.GenesisState{} simState.GenState[types.ModuleName] = simState.Cdc.MustMarshalJSON(&headeroracleGenesis) } diff --git a/x/checkpointing/testckpt/helper.go b/x/checkpointing/testckpt/helper.go index b7f98dee2..9f57a1311 100644 --- a/x/checkpointing/testckpt/helper.go +++ b/x/checkpointing/testckpt/helper.go @@ -46,9 +46,8 @@ func NewHelper(t *testing.T, n int) *Helper { checkpointingKeeper := app.CheckpointingKeeper epochingKeeper := app.EpochingKeeper stakingKeeper := app.StakingKeeper - querier := keeper.Querier{Keeper: checkpointingKeeper} queryHelper := baseapp.NewQueryServerTestHelper(ctx, app.InterfaceRegistry()) - types.RegisterQueryServer(queryHelper, querier) + types.RegisterQueryServer(queryHelper, checkpointingKeeper) queryClient := types.NewQueryClient(queryHelper) msgSrvr := keeper.NewMsgServerImpl(checkpointingKeeper) diff --git a/x/checkpointing/types/genesis.go b/x/checkpointing/types/genesis.go index 05a40358d..0f00a9af9 100644 --- a/x/checkpointing/types/genesis.go +++ b/x/checkpointing/types/genesis.go @@ -19,9 +19,7 @@ const DefaultIndex uint64 = 1 // DefaultGenesis returns the default Capability genesis state func DefaultGenesis() *GenesisState { - return &GenesisState{ - Params: DefaultParams(), - } + return &GenesisState{} } // Validate performs basic genesis state validation returning an error upon any @@ -39,7 +37,7 @@ func (gs GenesisState) Validate() error { } } - return gs.Params.Validate() + return nil } func NewGenesisKey(delAddr sdk.ValAddress, blsPubKey *bls12381.PublicKey, pop *ProofOfPossession, pubkey cryptotypes.PubKey) (*GenesisKey, error) { diff --git a/x/checkpointing/types/genesis.pb.go b/x/checkpointing/types/genesis.pb.go index ae69039b7..081845c81 100644 --- a/x/checkpointing/types/genesis.pb.go +++ b/x/checkpointing/types/genesis.pb.go @@ -26,10 +26,8 @@ const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package // GenesisState defines the checkpointing module's genesis state. type GenesisState struct { - // params defines all the paramaters of related to checkpointing - Params Params `protobuf:"bytes,1,opt,name=params,proto3" json:"params"` // genesis_keys defines the public keys for the genesis validators - GenesisKeys []*GenesisKey `protobuf:"bytes,2,rep,name=genesis_keys,json=genesisKeys,proto3" json:"genesis_keys,omitempty"` + GenesisKeys []*GenesisKey `protobuf:"bytes,1,rep,name=genesis_keys,json=genesisKeys,proto3" json:"genesis_keys,omitempty"` } func (m *GenesisState) Reset() { *m = GenesisState{} } @@ -65,13 +63,6 @@ func (m *GenesisState) XXX_DiscardUnknown() { var xxx_messageInfo_GenesisState proto.InternalMessageInfo -func (m *GenesisState) GetParams() Params { - if m != nil { - return m.Params - } - return Params{} -} - func (m *GenesisState) GetGenesisKeys() []*GenesisKey { if m != nil { return m.GenesisKeys @@ -153,31 +144,28 @@ func init() { } var fileDescriptor_bf2c524ebc9800de = []byte{ - // 370 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x91, 0xc1, 0x6a, 0xea, 0x40, - 0x18, 0x85, 0x33, 0x7a, 0xf1, 0xe2, 0xe8, 0xe2, 0xde, 0x70, 0x17, 0x41, 0xb8, 0x69, 0x90, 0xb6, - 0x08, 0x85, 0x19, 0xb4, 0xb8, 0x10, 0x4a, 0xa1, 0x6e, 0x5c, 0x74, 0x51, 0xb1, 0xbb, 0x6e, 0x64, - 0x26, 0x19, 0x62, 0x30, 0x66, 0x42, 0x66, 0x0c, 0xcd, 0x5b, 0x74, 0xd7, 0xf7, 0xe8, 0x53, 0xb8, - 0x74, 0xd9, 0x55, 0x29, 0xfa, 0x22, 0x25, 0x33, 0xa3, 0xa5, 0x85, 0xd0, 0x55, 0x26, 0x99, 0xef, - 0xfc, 0xe7, 0xfc, 0x39, 0xf0, 0x9c, 0x12, 0x5a, 0xc4, 0x3c, 0xc1, 0xfe, 0x82, 0xf9, 0xcb, 0x94, - 0x47, 0x89, 0x8c, 0x92, 0x10, 0xe7, 0x7d, 0x1c, 0xb2, 0x84, 0x89, 0x48, 0xa0, 0x34, 0xe3, 0x92, - 0xdb, 0x8e, 0xe1, 0xd0, 0x17, 0x0e, 0xe5, 0xfd, 0xce, 0xbf, 0x90, 0x87, 0x5c, 0x41, 0xb8, 0x3c, - 0x69, 0xbe, 0xe3, 0xf9, 0x5c, 0xac, 0xb8, 0xc0, 0x7e, 0x56, 0xa4, 0x92, 0x63, 0x16, 0x0c, 0x86, - 0xc3, 0xfe, 0x08, 0x2f, 0x59, 0x61, 0x26, 0x76, 0xce, 0x2a, 0x9d, 0x53, 0x92, 0x91, 0xd5, 0x01, - 0xab, 0x0e, 0x48, 0x63, 0x31, 0x5f, 0xb2, 0x42, 0x73, 0xdd, 0x67, 0x00, 0xdb, 0x13, 0x1d, 0xf9, - 0x5e, 0x12, 0xc9, 0xec, 0x6b, 0xd8, 0xd0, 0x83, 0x1c, 0xe0, 0x81, 0x5e, 0x6b, 0xe0, 0xa1, 0xaa, - 0x15, 0xd0, 0x54, 0x71, 0xe3, 0x5f, 0x9b, 0xb7, 0x13, 0x6b, 0x66, 0x54, 0xf6, 0x04, 0xb6, 0xcd, - 0x2f, 0x28, 0x5d, 0x84, 0x53, 0xf3, 0xea, 0xbd, 0xd6, 0xe0, 0xb4, 0x7a, 0x8a, 0x71, 0xbf, 0x65, - 0xc5, 0xac, 0x15, 0x1e, 0xcf, 0xa2, 0xfb, 0x02, 0x20, 0xfc, 0xbc, 0xb3, 0x2f, 0xe0, 0xdf, 0x9c, - 0xc4, 0x51, 0x40, 0x24, 0xcf, 0xe6, 0x24, 0x08, 0x32, 0x26, 0x74, 0xc4, 0xe6, 0xec, 0xcf, 0xf1, - 0xe2, 0x46, 0x7f, 0xb7, 0x47, 0xf0, 0xb7, 0x59, 0xd3, 0xa9, 0xfd, 0xb4, 0xc5, 0x38, 0x56, 0xde, - 0x0d, 0xaa, 0x9e, 0xf6, 0x15, 0x84, 0x39, 0x89, 0xe7, 0xe9, 0x9a, 0x96, 0xea, 0xba, 0x52, 0xff, - 0x47, 0xba, 0x16, 0xa4, 0x6b, 0x41, 0xa6, 0x16, 0x34, 0x5d, 0xd3, 0x52, 0xda, 0xcc, 0x49, 0x3c, - 0x55, 0xfc, 0xf8, 0x6e, 0xb3, 0x73, 0xc1, 0x76, 0xe7, 0x82, 0xf7, 0x9d, 0x0b, 0x9e, 0xf6, 0xae, - 0xb5, 0xdd, 0xbb, 0xd6, 0xeb, 0xde, 0xb5, 0x1e, 0x86, 0x61, 0x24, 0x17, 0x6b, 0x8a, 0x7c, 0xbe, - 0xc2, 0x26, 0x8b, 0xbf, 0x20, 0x51, 0x72, 0x78, 0xc1, 0x8f, 0xdf, 0xaa, 0x92, 0x45, 0xca, 0x04, - 0x6d, 0xa8, 0x9a, 0x2e, 0x3f, 0x02, 0x00, 0x00, 0xff, 0xff, 0x75, 0x9e, 0x6b, 0xd7, 0x71, 0x02, - 0x00, 0x00, + // 335 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x90, 0xb1, 0x4a, 0x03, 0x31, + 0x1c, 0xc6, 0x1b, 0x0b, 0x95, 0xa6, 0x1d, 0xf4, 0x70, 0x28, 0x05, 0x8f, 0xa3, 0x88, 0x14, 0x84, + 0x84, 0x56, 0x3a, 0x14, 0x5c, 0xec, 0xd2, 0xc1, 0xc1, 0x52, 0x07, 0xc1, 0xa5, 0x24, 0x77, 0xe1, + 0x1a, 0x9a, 0x5e, 0x8e, 0x4b, 0x7a, 0x98, 0xb7, 0xf0, 0x59, 0x7c, 0x0a, 0xc7, 0x8e, 0x8e, 0xd2, + 0xbe, 0x88, 0x5c, 0x12, 0x2b, 0x0a, 0x9d, 0xee, 0x7f, 0xf9, 0xff, 0xbe, 0xff, 0xf7, 0xf1, 0xc1, + 0x6b, 0x4a, 0xa8, 0x11, 0x32, 0xc3, 0xf1, 0x92, 0xc5, 0xab, 0x5c, 0xf2, 0x4c, 0xf3, 0x2c, 0xc5, + 0xe5, 0x00, 0xa7, 0x2c, 0x63, 0x8a, 0x2b, 0x94, 0x17, 0x52, 0xcb, 0xa0, 0xe3, 0x39, 0xf4, 0x87, + 0x43, 0xe5, 0xa0, 0x7b, 0x91, 0xca, 0x54, 0x5a, 0x08, 0x57, 0x93, 0xe3, 0xbb, 0x51, 0x2c, 0xd5, + 0x5a, 0x2a, 0x1c, 0x17, 0x26, 0xd7, 0x12, 0xb3, 0x64, 0x38, 0x1a, 0x0d, 0xc6, 0x78, 0xc5, 0x8c, + 0xbf, 0xd8, 0x3d, 0xee, 0x4c, 0x85, 0x5a, 0xac, 0x98, 0x71, 0x5c, 0xef, 0x19, 0xb6, 0xa7, 0x2e, + 0xca, 0x93, 0x26, 0x9a, 0x05, 0x53, 0xd8, 0xf6, 0xd1, 0x2a, 0x48, 0x75, 0x40, 0x54, 0xef, 0xb7, + 0x86, 0x57, 0xe8, 0x58, 0x40, 0xe4, 0xd5, 0x0f, 0xcc, 0xcc, 0x5b, 0xe9, 0x61, 0x56, 0xbd, 0x77, + 0x00, 0xe1, 0xef, 0x2e, 0xb8, 0x81, 0xe7, 0x25, 0x11, 0x3c, 0x21, 0x5a, 0x16, 0x0b, 0x92, 0x24, + 0x05, 0x53, 0xd5, 0x71, 0xd0, 0x6f, 0xce, 0xcf, 0x0e, 0x8b, 0x7b, 0xf7, 0x1e, 0x8c, 0xe1, 0xa9, + 0x4f, 0xd9, 0x39, 0x89, 0x40, 0xbf, 0x35, 0x8c, 0x8e, 0xfb, 0x4f, 0x84, 0xf5, 0x6e, 0x50, 0xfb, + 0x0d, 0xee, 0x20, 0x2c, 0x89, 0x58, 0xe4, 0x1b, 0x5a, 0xa9, 0xeb, 0x56, 0x7d, 0x89, 0x5c, 0x5d, + 0xc8, 0xd5, 0x85, 0x7c, 0x5d, 0x68, 0xb6, 0xa1, 0x95, 0xb4, 0x59, 0x12, 0x31, 0xb3, 0xfc, 0xe4, + 0xf1, 0x63, 0x17, 0x82, 0xed, 0x2e, 0x04, 0x5f, 0xbb, 0x10, 0xbc, 0xed, 0xc3, 0xda, 0x76, 0x1f, + 0xd6, 0x3e, 0xf7, 0x61, 0xed, 0x65, 0x94, 0x72, 0xbd, 0xdc, 0x50, 0x14, 0xcb, 0x35, 0xf6, 0x59, + 0xe2, 0x25, 0xe1, 0xd9, 0xcf, 0x0f, 0x7e, 0xfd, 0xd7, 0xb4, 0x36, 0x39, 0x53, 0xb4, 0x61, 0x5b, + 0xbe, 0xfd, 0x0e, 0x00, 0x00, 0xff, 0xff, 0x41, 0x5b, 0x7a, 0x70, 0x09, 0x02, 0x00, 0x00, } func (m *GenesisState) Marshal() (dAtA []byte, err error) { @@ -211,19 +199,9 @@ func (m *GenesisState) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintGenesis(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x12 - } - } - { - size, err := m.Params.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err + dAtA[i] = 0xa } - i -= size - i = encodeVarintGenesis(dAtA, i, uint64(size)) } - i-- - dAtA[i] = 0xa return len(dAtA) - i, nil } @@ -298,8 +276,6 @@ func (m *GenesisState) Size() (n int) { } var l int _ = l - l = m.Params.Size() - n += 1 + l + sovGenesis(uint64(l)) if len(m.GenesisKeys) > 0 { for _, e := range m.GenesisKeys { l = e.Size() @@ -366,39 +342,6 @@ func (m *GenesisState) Unmarshal(dAtA []byte) error { } switch fieldNum { case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Params", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenesis - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenesis - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Params.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field GenesisKeys", wireType) } diff --git a/x/checkpointing/types/params.go b/x/checkpointing/types/params.go deleted file mode 100644 index 357196ad6..000000000 --- a/x/checkpointing/types/params.go +++ /dev/null @@ -1,39 +0,0 @@ -package types - -import ( - paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" - "gopkg.in/yaml.v2" -) - -var _ paramtypes.ParamSet = (*Params)(nil) - -// ParamKeyTable the param key table for launch module -func ParamKeyTable() paramtypes.KeyTable { - return paramtypes.NewKeyTable().RegisterParamSet(&Params{}) -} - -// NewParams creates a new Params instance -func NewParams() Params { - return Params{} -} - -// DefaultParams returns a default set of parameters -func DefaultParams() Params { - return NewParams() -} - -// ParamSetPairs get the params.ParamSet -func (p *Params) ParamSetPairs() paramtypes.ParamSetPairs { - return paramtypes.ParamSetPairs{} -} - -// Validate validates the set of params -func (p Params) Validate() error { - return nil -} - -// String implements the Stringer interface. -func (p Params) String() string { - out, _ := yaml.Marshal(p) - return string(out) -} diff --git a/x/checkpointing/types/params.pb.go b/x/checkpointing/types/params.pb.go deleted file mode 100644 index 1be8611d6..000000000 --- a/x/checkpointing/types/params.pb.go +++ /dev/null @@ -1,267 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: babylon/checkpointing/v1/params.proto - -package types - -import ( - fmt "fmt" - _ "github.com/cosmos/gogoproto/gogoproto" - proto "github.com/cosmos/gogoproto/proto" - io "io" - math "math" - math_bits "math/bits" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package - -// Params defines the parameters for the module. -type Params struct { -} - -func (m *Params) Reset() { *m = Params{} } -func (*Params) ProtoMessage() {} -func (*Params) Descriptor() ([]byte, []int) { - return fileDescriptor_e909869559c0a3ee, []int{0} -} -func (m *Params) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Params) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Params.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 *Params) XXX_Merge(src proto.Message) { - xxx_messageInfo_Params.Merge(m, src) -} -func (m *Params) XXX_Size() int { - return m.Size() -} -func (m *Params) XXX_DiscardUnknown() { - xxx_messageInfo_Params.DiscardUnknown(m) -} - -var xxx_messageInfo_Params proto.InternalMessageInfo - -func init() { - proto.RegisterType((*Params)(nil), "babylon.checkpointing.v1.Params") -} - -func init() { - proto.RegisterFile("babylon/checkpointing/v1/params.proto", fileDescriptor_e909869559c0a3ee) -} - -var fileDescriptor_e909869559c0a3ee = []byte{ - // 163 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x4d, 0x4a, 0x4c, 0xaa, - 0xcc, 0xc9, 0xcf, 0xd3, 0x4f, 0xce, 0x48, 0x4d, 0xce, 0x2e, 0xc8, 0xcf, 0xcc, 0x2b, 0xc9, 0xcc, - 0x4b, 0xd7, 0x2f, 0x33, 0xd4, 0x2f, 0x48, 0x2c, 0x4a, 0xcc, 0x2d, 0xd6, 0x2b, 0x28, 0xca, 0x2f, - 0xc9, 0x17, 0x92, 0x80, 0x2a, 0xd3, 0x43, 0x51, 0xa6, 0x57, 0x66, 0x28, 0x25, 0x92, 0x9e, 0x9f, - 0x9e, 0x0f, 0x56, 0xa4, 0x0f, 0x62, 0x41, 0xd4, 0x2b, 0xf1, 0x71, 0xb1, 0x05, 0x80, 0xf5, 0x5b, - 0xb1, 0xcc, 0x58, 0x20, 0xcf, 0xe0, 0xe4, 0x7f, 0xe2, 0x91, 0x1c, 0xe3, 0x85, 0x47, 0x72, 0x8c, - 0x0f, 0x1e, 0xc9, 0x31, 0x4e, 0x78, 0x2c, 0xc7, 0x70, 0xe1, 0xb1, 0x1c, 0xc3, 0x8d, 0xc7, 0x72, - 0x0c, 0x51, 0xa6, 0xe9, 0x99, 0x25, 0x19, 0xa5, 0x49, 0x7a, 0xc9, 0xf9, 0xb9, 0xfa, 0x50, 0x4b, - 0x92, 0x33, 0x12, 0x33, 0xf3, 0x60, 0x1c, 0xfd, 0x0a, 0x34, 0xa7, 0x95, 0x54, 0x16, 0xa4, 0x16, - 0x27, 0xb1, 0x81, 0xed, 0x31, 0x06, 0x04, 0x00, 0x00, 0xff, 0xff, 0x2d, 0x69, 0xd9, 0x00, 0xc0, - 0x00, 0x00, 0x00, -} - -func (m *Params) 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 *Params) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Params) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - return len(dAtA) - i, nil -} - -func encodeVarintParams(dAtA []byte, offset int, v uint64) int { - offset -= sovParams(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func (m *Params) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - return n -} - -func sovParams(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozParams(x uint64) (n int) { - return sovParams(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (m *Params) 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 ErrIntOverflowParams - } - 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: Params: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Params: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipParams(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthParams - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func skipParams(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - depth := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowParams - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - wireType := int(wire & 0x7) - switch wireType { - case 0: - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowParams - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - case 1: - iNdEx += 8 - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowParams - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if length < 0 { - return 0, ErrInvalidLengthParams - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupParams - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthParams - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthParams = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowParams = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupParams = fmt.Errorf("proto: unexpected end of group") -) diff --git a/x/checkpointing/types/query.pb.go b/x/checkpointing/types/query.pb.go index 08671a168..7bf8126d4 100644 --- a/x/checkpointing/types/query.pb.go +++ b/x/checkpointing/types/query.pb.go @@ -640,89 +640,6 @@ func (m *QueryLastCheckpointWithStatusResponse) GetRawCheckpoint() *RawCheckpoin return nil } -// QueryParamsRequest is request type for the Query/Params RPC method. -type QueryParamsRequest struct { -} - -func (m *QueryParamsRequest) Reset() { *m = QueryParamsRequest{} } -func (m *QueryParamsRequest) String() string { return proto.CompactTextString(m) } -func (*QueryParamsRequest) ProtoMessage() {} -func (*QueryParamsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_113f1ca5c3c2ca44, []int{12} -} -func (m *QueryParamsRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryParamsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryParamsRequest.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 *QueryParamsRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryParamsRequest.Merge(m, src) -} -func (m *QueryParamsRequest) XXX_Size() int { - return m.Size() -} -func (m *QueryParamsRequest) XXX_DiscardUnknown() { - xxx_messageInfo_QueryParamsRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryParamsRequest proto.InternalMessageInfo - -// QueryParamsResponse is response type for the Query/Params RPC method. -type QueryParamsResponse struct { - // params holds all the parameters of this module. - Params Params `protobuf:"bytes,1,opt,name=params,proto3" json:"params"` -} - -func (m *QueryParamsResponse) Reset() { *m = QueryParamsResponse{} } -func (m *QueryParamsResponse) String() string { return proto.CompactTextString(m) } -func (*QueryParamsResponse) ProtoMessage() {} -func (*QueryParamsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_113f1ca5c3c2ca44, []int{13} -} -func (m *QueryParamsResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryParamsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryParamsResponse.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 *QueryParamsResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryParamsResponse.Merge(m, src) -} -func (m *QueryParamsResponse) XXX_Size() int { - return m.Size() -} -func (m *QueryParamsResponse) XXX_DiscardUnknown() { - xxx_messageInfo_QueryParamsResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryParamsResponse proto.InternalMessageInfo - -func (m *QueryParamsResponse) GetParams() Params { - if m != nil { - return m.Params - } - return Params{} -} - func init() { proto.RegisterType((*QueryRawCheckpointListRequest)(nil), "babylon.checkpointing.v1.QueryRawCheckpointListRequest") proto.RegisterType((*QueryRawCheckpointListResponse)(nil), "babylon.checkpointing.v1.QueryRawCheckpointListResponse") @@ -737,8 +654,6 @@ func init() { proto.RegisterMapType((map[string]uint64)(nil), "babylon.checkpointing.v1.QueryRecentEpochStatusCountResponse.StatusCountEntry") proto.RegisterType((*QueryLastCheckpointWithStatusRequest)(nil), "babylon.checkpointing.v1.QueryLastCheckpointWithStatusRequest") proto.RegisterType((*QueryLastCheckpointWithStatusResponse)(nil), "babylon.checkpointing.v1.QueryLastCheckpointWithStatusResponse") - proto.RegisterType((*QueryParamsRequest)(nil), "babylon.checkpointing.v1.QueryParamsRequest") - proto.RegisterType((*QueryParamsResponse)(nil), "babylon.checkpointing.v1.QueryParamsResponse") } func init() { @@ -746,68 +661,64 @@ func init() { } var fileDescriptor_113f1ca5c3c2ca44 = []byte{ - // 972 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x57, 0x4f, 0x6f, 0xe3, 0x44, - 0x14, 0xaf, 0xd3, 0xdd, 0x8a, 0xbe, 0xb0, 0xa5, 0x0c, 0x15, 0x1b, 0xbc, 0x4b, 0xb6, 0x32, 0xfb, - 0xa7, 0xac, 0xa8, 0x47, 0x49, 0xff, 0xaa, 0xec, 0x16, 0x29, 0xab, 0xc2, 0x61, 0x97, 0x52, 0x8c, - 0x58, 0x10, 0x07, 0xa2, 0x89, 0x77, 0x94, 0x98, 0x3a, 0x1e, 0x37, 0x33, 0x4e, 0x89, 0x56, 0x7b, - 0x81, 0x0f, 0x00, 0x12, 0x12, 0x5f, 0x82, 0x13, 0x37, 0x6e, 0x48, 0x70, 0xd9, 0x03, 0x42, 0x95, - 0xb8, 0x20, 0x21, 0x21, 0xd4, 0xf2, 0x41, 0x90, 0xc7, 0xe3, 0x26, 0x76, 0xea, 0x3a, 0x29, 0xb9, - 0x39, 0x2f, 0xef, 0xf7, 0xde, 0xef, 0xf7, 0xe6, 0xcd, 0x7b, 0x36, 0xdc, 0x6c, 0x90, 0x46, 0xcf, - 0x65, 0x1e, 0xb6, 0x5b, 0xd4, 0xde, 0xf7, 0x99, 0xe3, 0x09, 0xc7, 0x6b, 0xe2, 0x6e, 0x05, 0x1f, - 0x04, 0xb4, 0xd3, 0x33, 0xfd, 0x0e, 0x13, 0x0c, 0x95, 0x94, 0x97, 0x99, 0xf0, 0x32, 0xbb, 0x15, - 0xfd, 0x76, 0x26, 0xbe, 0xe1, 0xf2, 0xfa, 0x3e, 0x55, 0x11, 0xf4, 0xbb, 0x36, 0xe3, 0x6d, 0xc6, - 0x71, 0x83, 0x70, 0x1a, 0x85, 0xc6, 0xdd, 0x4a, 0x83, 0x0a, 0x52, 0xc1, 0x3e, 0x69, 0x3a, 0x1e, - 0x11, 0x0e, 0xf3, 0x94, 0xef, 0x42, 0x93, 0x35, 0x99, 0x7c, 0xc4, 0xe1, 0x93, 0xb2, 0x5e, 0x6f, - 0x32, 0xd6, 0x74, 0x29, 0x26, 0xbe, 0x83, 0x89, 0xe7, 0x31, 0x21, 0x21, 0x5c, 0xfd, 0x7b, 0x2b, - 0x93, 0x87, 0x4f, 0x3a, 0xa4, 0x1d, 0xbb, 0xbd, 0x99, 0xe9, 0xd6, 0x37, 0x44, 0xae, 0xc6, 0x0f, - 0x1a, 0xbc, 0xfe, 0x61, 0x48, 0xd4, 0x22, 0x87, 0x0f, 0x4e, 0xff, 0x7c, 0xe4, 0x70, 0x61, 0xd1, - 0x83, 0x80, 0x72, 0x81, 0x6a, 0x30, 0xc3, 0x05, 0x11, 0x01, 0x2f, 0x69, 0x8b, 0xda, 0xd2, 0x5c, - 0xf5, 0xae, 0x99, 0x55, 0x26, 0xb3, 0x1f, 0xe0, 0x23, 0x89, 0xb0, 0x14, 0x12, 0xbd, 0x0b, 0xd0, - 0xd7, 0x5f, 0x2a, 0x2c, 0x6a, 0x4b, 0xc5, 0xea, 0x6d, 0x33, 0x2a, 0x96, 0x19, 0x16, 0xcb, 0x8c, - 0xce, 0x41, 0x15, 0xcb, 0xdc, 0x23, 0x4d, 0xaa, 0xf2, 0x5b, 0x03, 0x48, 0xe3, 0x57, 0x0d, 0xca, - 0x59, 0x6c, 0xb9, 0xcf, 0x3c, 0x4e, 0xd1, 0xa7, 0xf0, 0x52, 0x87, 0x1c, 0xd6, 0xfb, 0xdc, 0x42, - 0xde, 0xd3, 0x4b, 0xc5, 0x2a, 0xce, 0xe6, 0x9d, 0x88, 0xf6, 0x89, 0x23, 0x5a, 0xef, 0x53, 0x41, - 0xac, 0xb9, 0xce, 0xa0, 0x99, 0xa3, 0xf7, 0xce, 0x10, 0x71, 0x27, 0x57, 0x44, 0x44, 0x2b, 0xa1, - 0x62, 0x13, 0x5e, 0x1b, 0x16, 0x11, 0x97, 0xfb, 0x1a, 0xcc, 0x52, 0x9f, 0xd9, 0xad, 0xba, 0x17, - 0xb4, 0x65, 0xc5, 0x2f, 0x59, 0x2f, 0x48, 0xc3, 0x6e, 0xd0, 0x36, 0x04, 0xe8, 0x67, 0x21, 0x95, - 0xf4, 0xc7, 0x30, 0x97, 0x94, 0x2e, 0xf1, 0x17, 0x50, 0x7e, 0x25, 0xa1, 0xdc, 0xf8, 0x5a, 0x83, - 0xeb, 0x32, 0x6d, 0xcd, 0xe5, 0x7b, 0x41, 0xc3, 0x75, 0xec, 0x87, 0xb4, 0x37, 0xd8, 0x22, 0xe7, - 0x71, 0x9e, 0xd8, 0xd9, 0xff, 0x1e, 0x77, 0xea, 0x30, 0x0b, 0xa5, 0xff, 0x09, 0x5c, 0xed, 0x12, - 0xd7, 0x79, 0x42, 0x04, 0xeb, 0xd4, 0x0f, 0x1d, 0xd1, 0xaa, 0xab, 0xdb, 0x19, 0xb7, 0xc0, 0x72, - 0x76, 0x21, 0x1e, 0xc7, 0xc0, 0xb0, 0x08, 0x35, 0x97, 0x3f, 0xa4, 0x3d, 0x6b, 0xa1, 0x3b, 0x6c, - 0x9c, 0x60, 0x1b, 0xac, 0xc3, 0x55, 0xa9, 0x67, 0x27, 0xac, 0x94, 0xba, 0x30, 0xa3, 0x34, 0xc1, - 0xe7, 0x50, 0x1a, 0xc6, 0xa9, 0x12, 0x4c, 0xe0, 0xb2, 0x1a, 0x3b, 0x60, 0x44, 0x4d, 0x46, 0x6d, - 0xea, 0x89, 0x81, 0x2c, 0x0f, 0x58, 0xd0, 0xef, 0xd3, 0x1b, 0x50, 0x8c, 0x28, 0xda, 0xa1, 0x55, - 0x91, 0x04, 0x69, 0x92, 0x7e, 0xc6, 0xf7, 0x05, 0x78, 0xe3, 0xdc, 0x38, 0x8a, 0xf2, 0x35, 0x98, - 0x15, 0x8e, 0x5f, 0x97, 0xc8, 0x58, 0xab, 0x70, 0x7c, 0xe9, 0x9f, 0xce, 0x52, 0x48, 0x67, 0x41, - 0x07, 0xf0, 0x62, 0x44, 0x5b, 0x79, 0x4c, 0xcb, 0x83, 0xde, 0xcd, 0x96, 0x3d, 0x02, 0x25, 0x73, - 0xc0, 0xb6, 0xe3, 0x89, 0x4e, 0xcf, 0x2a, 0xf2, 0xbe, 0x45, 0xdf, 0x86, 0xf9, 0xb4, 0x03, 0x9a, - 0x87, 0xe9, 0x7d, 0xda, 0x93, 0xf4, 0x67, 0xad, 0xf0, 0x11, 0x2d, 0xc0, 0xe5, 0x2e, 0x71, 0x03, - 0xaa, 0x38, 0x47, 0x3f, 0xb6, 0x0a, 0x9b, 0x9a, 0xf1, 0x05, 0xdc, 0x94, 0x24, 0x1e, 0x11, 0x2e, - 0x92, 0x97, 0x2f, 0xd9, 0x04, 0x93, 0x38, 0xcb, 0x43, 0xb8, 0x95, 0x93, 0x4b, 0x9d, 0xc2, 0x6e, - 0xc6, 0xec, 0xb8, 0x33, 0xe2, 0xec, 0x48, 0xcf, 0x8c, 0x05, 0x40, 0x32, 0xf1, 0x9e, 0xdc, 0x4b, - 0x4a, 0x92, 0xf1, 0x31, 0xbc, 0x92, 0xb0, 0xaa, 0xe4, 0xdb, 0x30, 0x13, 0xed, 0x2f, 0x95, 0x74, - 0x31, 0x3b, 0x69, 0x84, 0xac, 0x5d, 0x7a, 0xfe, 0xf7, 0x8d, 0x29, 0x4b, 0xa1, 0xaa, 0x3f, 0x03, - 0x5c, 0x96, 0x71, 0xd1, 0x2f, 0x1a, 0xbc, 0x3c, 0xb4, 0x1b, 0xd0, 0x46, 0x5e, 0x3b, 0x64, 0xec, - 0x3e, 0x7d, 0x73, 0x7c, 0x60, 0x24, 0xc9, 0xd8, 0xfa, 0xea, 0x8f, 0x7f, 0xbf, 0x2b, 0xac, 0xa2, - 0x2a, 0xce, 0xdc, 0xc5, 0xa9, 0x35, 0x85, 0x9f, 0x46, 0x67, 0xf6, 0x0c, 0xfd, 0xa4, 0xc1, 0x95, - 0x44, 0x64, 0xb4, 0x32, 0x0e, 0x8f, 0x98, 0xfc, 0xea, 0x78, 0x20, 0x45, 0xfc, 0x9e, 0x24, 0xbe, - 0x8e, 0x56, 0x47, 0x25, 0x8e, 0x9f, 0x9e, 0x8e, 0xaa, 0x67, 0x61, 0xfd, 0xe7, 0xd3, 0xf3, 0x19, - 0xad, 0xe7, 0x10, 0xc9, 0x58, 0x2b, 0xfa, 0xc6, 0xd8, 0x38, 0xa5, 0xe1, 0xbe, 0xd4, 0xb0, 0x81, - 0xd6, 0xf0, 0xb9, 0xef, 0x6d, 0xbe, 0x04, 0xcb, 0x05, 0x91, 0x10, 0xf1, 0xa3, 0x06, 0xc5, 0x81, - 0xd9, 0x80, 0x2a, 0x39, 0x3c, 0x86, 0x07, 0xb8, 0x5e, 0x1d, 0x07, 0xa2, 0x58, 0xbf, 0x2d, 0x59, - 0xaf, 0xa1, 0x95, 0x6c, 0xd6, 0x92, 0x64, 0x82, 0x2c, 0x56, 0x6f, 0x58, 0xbf, 0x69, 0xf0, 0xea, - 0xd9, 0x53, 0x0d, 0xdd, 0xbb, 0xe0, 0x30, 0x8c, 0x94, 0xdc, 0xff, 0x5f, 0xa3, 0xd4, 0x58, 0x93, - 0xa2, 0x30, 0x5a, 0xce, 0x13, 0xb5, 0x35, 0x38, 0xc6, 0xd1, 0x5f, 0x1a, 0x94, 0xb2, 0x66, 0x16, - 0xda, 0xce, 0xa1, 0x94, 0x33, 0x58, 0xf5, 0x77, 0x2e, 0x8c, 0x57, 0xa2, 0xb6, 0xa5, 0xa8, 0x4d, - 0xb4, 0x9e, 0x2d, 0xca, 0x25, 0x5c, 0xd4, 0xd3, 0x17, 0x25, 0xbe, 0xe0, 0xdf, 0x68, 0x30, 0x13, - 0x0d, 0x32, 0xf4, 0x56, 0x0e, 0x97, 0xc4, 0xfc, 0xd4, 0x97, 0x47, 0xf4, 0x56, 0x3c, 0x97, 0x24, - 0x4f, 0x03, 0x2d, 0xe2, 0x9c, 0xef, 0x86, 0xda, 0x07, 0xcf, 0x8f, 0xcb, 0xda, 0xd1, 0x71, 0x59, - 0xfb, 0xe7, 0xb8, 0xac, 0x7d, 0x7b, 0x52, 0x9e, 0x3a, 0x3a, 0x29, 0x4f, 0xfd, 0x79, 0x52, 0x9e, - 0xfa, 0x6c, 0xad, 0xe9, 0x88, 0x56, 0xd0, 0x30, 0x6d, 0xd6, 0x8e, 0xa3, 0xd8, 0x2d, 0xe2, 0x78, - 0xa7, 0x21, 0xbf, 0x4c, 0x05, 0x15, 0x3d, 0x9f, 0xf2, 0xc6, 0x8c, 0xfc, 0xbc, 0x58, 0xf9, 0x2f, - 0x00, 0x00, 0xff, 0xff, 0xa9, 0xb4, 0x09, 0x9c, 0x7a, 0x0d, 0x00, 0x00, + // 898 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x96, 0xcf, 0x8f, 0xdb, 0x44, + 0x14, 0xc7, 0xd7, 0x59, 0x5a, 0xb1, 0x2f, 0x74, 0x59, 0x46, 0x2b, 0x1a, 0xdc, 0x12, 0x2a, 0x53, + 0xda, 0xa5, 0x52, 0x3d, 0x4a, 0xf6, 0x57, 0xb4, 0xb4, 0x8b, 0x94, 0x6a, 0xe1, 0xd0, 0xb2, 0x14, + 0x23, 0x15, 0xc4, 0x81, 0x68, 0xec, 0x8e, 0x1c, 0xb3, 0x8e, 0xc7, 0x9b, 0x19, 0x27, 0x44, 0x55, + 0x2f, 0xf0, 0x0f, 0x20, 0x21, 0xf1, 0x4f, 0x20, 0x0e, 0xdc, 0x38, 0xc3, 0x85, 0x03, 0x42, 0x2b, + 0x71, 0x41, 0xe2, 0x82, 0x76, 0xf9, 0x43, 0x90, 0xc7, 0x93, 0x4d, 0xec, 0xac, 0xd7, 0xc9, 0x36, + 0x37, 0xe7, 0x65, 0xbe, 0xf3, 0x3e, 0xdf, 0x37, 0x6f, 0x9e, 0x0d, 0x37, 0x6d, 0x62, 0x0f, 0x7c, + 0x16, 0x60, 0xa7, 0x4d, 0x9d, 0x83, 0x90, 0x79, 0x81, 0xf0, 0x02, 0x17, 0xf7, 0x6a, 0xf8, 0x30, + 0xa2, 0xdd, 0x81, 0x19, 0x76, 0x99, 0x60, 0xa8, 0xa2, 0x56, 0x99, 0xa9, 0x55, 0x66, 0xaf, 0xa6, + 0xdf, 0xca, 0xd5, 0xdb, 0x3e, 0x6f, 0x1d, 0x50, 0xb5, 0x83, 0x7e, 0xc7, 0x61, 0xbc, 0xc3, 0x38, + 0xb6, 0x09, 0xa7, 0xc9, 0xd6, 0xb8, 0x57, 0xb3, 0xa9, 0x20, 0x35, 0x1c, 0x12, 0xd7, 0x0b, 0x88, + 0xf0, 0x58, 0xa0, 0xd6, 0xae, 0xba, 0xcc, 0x65, 0xf2, 0x11, 0xc7, 0x4f, 0x2a, 0x7a, 0xdd, 0x65, + 0xcc, 0xf5, 0x29, 0x26, 0xa1, 0x87, 0x49, 0x10, 0x30, 0x21, 0x25, 0x5c, 0xfd, 0xfb, 0x6e, 0x2e, + 0xc7, 0x28, 0x90, 0x2c, 0x35, 0x7e, 0xd4, 0xe0, 0xcd, 0x4f, 0x62, 0x02, 0x8b, 0xf4, 0x1f, 0x9c, + 0xfe, 0xf9, 0xc8, 0xe3, 0xc2, 0xa2, 0x87, 0x11, 0xe5, 0x02, 0x35, 0xe1, 0x32, 0x17, 0x44, 0x44, + 0xbc, 0xa2, 0xdd, 0xd0, 0xd6, 0x96, 0xeb, 0x77, 0xcc, 0x3c, 0xff, 0xe6, 0x68, 0x83, 0x4f, 0xa5, + 0xc2, 0x52, 0x4a, 0xf4, 0x01, 0xc0, 0xc8, 0x58, 0xa5, 0x74, 0x43, 0x5b, 0x2b, 0xd7, 0x6f, 0x99, + 0x49, 0x15, 0xcc, 0xb8, 0x0a, 0x66, 0x52, 0x60, 0x55, 0x05, 0xf3, 0x31, 0x71, 0xa9, 0xca, 0x6f, + 0x8d, 0x29, 0x8d, 0xdf, 0x34, 0xa8, 0xe6, 0xd1, 0xf2, 0x90, 0x05, 0x9c, 0xa2, 0xcf, 0xe1, 0xd5, + 0x2e, 0xe9, 0xb7, 0x46, 0x6c, 0x31, 0xf7, 0xe2, 0x5a, 0xb9, 0x8e, 0xf3, 0xb9, 0x53, 0xbb, 0x7d, + 0xe6, 0x89, 0xf6, 0x47, 0x54, 0x10, 0x6b, 0xb9, 0x3b, 0x1e, 0xe6, 0xe8, 0xc3, 0x33, 0x4c, 0xdc, + 0x2e, 0x34, 0x91, 0x60, 0xa5, 0x5c, 0x34, 0xe0, 0x8d, 0x49, 0x13, 0xc3, 0x72, 0x5f, 0x83, 0x25, + 0x1a, 0x32, 0xa7, 0xdd, 0x0a, 0xa2, 0x8e, 0xac, 0xf8, 0x4b, 0xd6, 0xcb, 0x32, 0xb0, 0x1f, 0x75, + 0x0c, 0x01, 0xfa, 0x59, 0x4a, 0x65, 0xfd, 0x09, 0x2c, 0xa7, 0xad, 0x4b, 0xfd, 0x05, 0x9c, 0x5f, + 0x49, 0x39, 0x37, 0xbe, 0xd5, 0xe0, 0xba, 0x4c, 0xdb, 0xf4, 0xf9, 0xe3, 0xc8, 0xf6, 0x3d, 0xe7, + 0x21, 0x1d, 0x8c, 0xb7, 0xc8, 0x79, 0xcc, 0x73, 0x3b, 0xfb, 0x3f, 0x87, 0x9d, 0x3a, 0x49, 0xa1, + 0xfc, 0x3f, 0x85, 0xab, 0x3d, 0xe2, 0x7b, 0x4f, 0x89, 0x60, 0xdd, 0x56, 0xdf, 0x13, 0xed, 0x96, + 0xba, 0x76, 0xc3, 0x16, 0xb8, 0x9b, 0x5f, 0x88, 0x27, 0x43, 0x61, 0x5c, 0x84, 0xa6, 0xcf, 0x1f, + 0xd2, 0x81, 0xb5, 0xda, 0x9b, 0x0c, 0xce, 0xb1, 0x0d, 0xb6, 0xe0, 0xaa, 0xf4, 0xb3, 0x17, 0x57, + 0x4a, 0x5d, 0x98, 0x69, 0x9a, 0xe0, 0x4b, 0xa8, 0x4c, 0xea, 0x54, 0x09, 0xe6, 0x70, 0x59, 0x8d, + 0x3d, 0x30, 0x92, 0x26, 0xa3, 0x0e, 0x0d, 0xc4, 0x58, 0x96, 0x07, 0x2c, 0x1a, 0xf5, 0xe9, 0x5b, + 0x50, 0x4e, 0x10, 0x9d, 0x38, 0xaa, 0x20, 0x41, 0x86, 0xe4, 0x3a, 0xe3, 0x87, 0x12, 0xbc, 0x7d, + 0xee, 0x3e, 0x0a, 0xf9, 0x1a, 0x2c, 0x09, 0x2f, 0x6c, 0x49, 0xe5, 0xd0, 0xab, 0xf0, 0x42, 0xb9, + 0x3e, 0x9b, 0xa5, 0x94, 0xcd, 0x82, 0x0e, 0xe1, 0x95, 0x04, 0x5b, 0xad, 0x58, 0x94, 0x07, 0xbd, + 0x9f, 0x6f, 0x7b, 0x0a, 0x24, 0x73, 0x2c, 0xb6, 0x17, 0x88, 0xee, 0xc0, 0x2a, 0xf3, 0x51, 0x44, + 0xdf, 0x85, 0x95, 0xec, 0x02, 0xb4, 0x02, 0x8b, 0x07, 0x74, 0x20, 0xf1, 0x97, 0xac, 0xf8, 0x11, + 0xad, 0xc2, 0xa5, 0x1e, 0xf1, 0x23, 0xaa, 0x98, 0x93, 0x1f, 0x3b, 0xa5, 0x86, 0x66, 0x7c, 0x05, + 0x37, 0x25, 0xc4, 0x23, 0xc2, 0x45, 0xfa, 0xf2, 0xa5, 0x9b, 0x60, 0x1e, 0x67, 0xd9, 0x87, 0x77, + 0x0a, 0x72, 0xa9, 0x53, 0xd8, 0xcf, 0x99, 0x1d, 0xb7, 0xa7, 0x9c, 0x1d, 0x99, 0x99, 0x51, 0xff, + 0x69, 0x09, 0x2e, 0xc9, 0xcc, 0xe8, 0x57, 0x0d, 0x5e, 0x9b, 0x18, 0xd7, 0x68, 0xbb, 0xe8, 0x84, + 0x72, 0x5e, 0x47, 0x7a, 0x63, 0x76, 0x61, 0x62, 0xd1, 0xd8, 0xf9, 0xe6, 0xaf, 0xff, 0xbe, 0x2f, + 0x6d, 0xa0, 0x3a, 0xce, 0x7d, 0x3d, 0x66, 0xde, 0x1c, 0xf8, 0x59, 0x52, 0xc6, 0xe7, 0xe8, 0x17, + 0x0d, 0xae, 0xa4, 0x76, 0x46, 0xeb, 0xb3, 0x70, 0x0c, 0xe1, 0x37, 0x66, 0x13, 0x29, 0xf0, 0x7b, + 0x12, 0x7c, 0x0b, 0x6d, 0x4c, 0x0b, 0x8e, 0x9f, 0x9d, 0x4e, 0x8f, 0xe7, 0x71, 0xfd, 0x57, 0xb2, + 0x23, 0x13, 0x6d, 0x15, 0x80, 0xe4, 0x4c, 0x7a, 0x7d, 0x7b, 0x66, 0x9d, 0xf2, 0x70, 0x5f, 0x7a, + 0xd8, 0x46, 0x9b, 0xf8, 0xdc, 0x6f, 0xa4, 0x50, 0x8a, 0xe5, 0xcc, 0x4e, 0x99, 0xf8, 0x59, 0x83, + 0xf2, 0xd8, 0x75, 0x45, 0xb5, 0x02, 0x8e, 0xc9, 0x99, 0xaa, 0xd7, 0x67, 0x91, 0x28, 0xea, 0xf7, + 0x24, 0xf5, 0x26, 0x5a, 0xcf, 0xa7, 0x96, 0x90, 0x29, 0x58, 0xac, 0x3e, 0x7a, 0xfe, 0xd0, 0xe0, + 0xf5, 0xb3, 0x07, 0x0d, 0xba, 0x77, 0xc1, 0xf9, 0x94, 0x38, 0xb9, 0xff, 0x42, 0xd3, 0xcd, 0xd8, + 0x94, 0xa6, 0x30, 0xba, 0x5b, 0x64, 0x6a, 0x67, 0x7c, 0xb2, 0xa2, 0x7f, 0x34, 0xa8, 0xe4, 0x8d, + 0x11, 0xb4, 0x5b, 0x80, 0x54, 0x30, 0xeb, 0xf4, 0xf7, 0x2f, 0xac, 0x57, 0xa6, 0x76, 0xa5, 0xa9, + 0x06, 0xda, 0xca, 0x37, 0xe5, 0x13, 0x2e, 0x5a, 0xd9, 0x8b, 0xa2, 0x2e, 0x78, 0xf3, 0xe3, 0xdf, + 0x8f, 0xab, 0xda, 0xd1, 0x71, 0x55, 0xfb, 0xf7, 0xb8, 0xaa, 0x7d, 0x77, 0x52, 0x5d, 0x38, 0x3a, + 0xa9, 0x2e, 0xfc, 0x7d, 0x52, 0x5d, 0xf8, 0x62, 0xd3, 0xf5, 0x44, 0x3b, 0xb2, 0x4d, 0x87, 0x75, + 0x86, 0x7b, 0x3b, 0x6d, 0xe2, 0x05, 0xa7, 0x89, 0xbe, 0xce, 0xa4, 0x12, 0x83, 0x90, 0x72, 0xfb, + 0xb2, 0xfc, 0xbe, 0x5e, 0xff, 0x3f, 0x00, 0x00, 0xff, 0xff, 0x51, 0xee, 0xea, 0x49, 0x54, 0x0c, + 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -837,8 +748,6 @@ type QueryClient interface { // LastCheckpointWithStatus queries the last checkpoint with a given status or // a more matured status LastCheckpointWithStatus(ctx context.Context, in *QueryLastCheckpointWithStatusRequest, opts ...grpc.CallOption) (*QueryLastCheckpointWithStatusResponse, error) - // Parameters queries the parameters of the module. - Params(ctx context.Context, in *QueryParamsRequest, opts ...grpc.CallOption) (*QueryParamsResponse, error) } type queryClient struct { @@ -903,15 +812,6 @@ func (c *queryClient) LastCheckpointWithStatus(ctx context.Context, in *QueryLas return out, nil } -func (c *queryClient) Params(ctx context.Context, in *QueryParamsRequest, opts ...grpc.CallOption) (*QueryParamsResponse, error) { - out := new(QueryParamsResponse) - err := c.cc.Invoke(ctx, "/babylon.checkpointing.v1.Query/Params", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - // QueryServer is the server API for Query service. type QueryServer interface { // RawCheckpointList queries all checkpoints that match the given status. @@ -929,8 +829,6 @@ type QueryServer interface { // LastCheckpointWithStatus queries the last checkpoint with a given status or // a more matured status LastCheckpointWithStatus(context.Context, *QueryLastCheckpointWithStatusRequest) (*QueryLastCheckpointWithStatusResponse, error) - // Parameters queries the parameters of the module. - Params(context.Context, *QueryParamsRequest) (*QueryParamsResponse, error) } // UnimplementedQueryServer can be embedded to have forward compatible implementations. @@ -955,9 +853,6 @@ func (*UnimplementedQueryServer) RecentEpochStatusCount(ctx context.Context, req func (*UnimplementedQueryServer) LastCheckpointWithStatus(ctx context.Context, req *QueryLastCheckpointWithStatusRequest) (*QueryLastCheckpointWithStatusResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method LastCheckpointWithStatus not implemented") } -func (*UnimplementedQueryServer) Params(ctx context.Context, req *QueryParamsRequest) (*QueryParamsResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method Params not implemented") -} func RegisterQueryServer(s grpc1.Server, srv QueryServer) { s.RegisterService(&_Query_serviceDesc, srv) @@ -1071,24 +966,6 @@ func _Query_LastCheckpointWithStatus_Handler(srv interface{}, ctx context.Contex return interceptor(ctx, in, info, handler) } -func _Query_Params_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(QueryParamsRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(QueryServer).Params(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/babylon.checkpointing.v1.Query/Params", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(QueryServer).Params(ctx, req.(*QueryParamsRequest)) - } - return interceptor(ctx, in, info, handler) -} - var _Query_serviceDesc = grpc.ServiceDesc{ ServiceName: "babylon.checkpointing.v1.Query", HandlerType: (*QueryServer)(nil), @@ -1117,10 +994,6 @@ var _Query_serviceDesc = grpc.ServiceDesc{ MethodName: "LastCheckpointWithStatus", Handler: _Query_LastCheckpointWithStatus_Handler, }, - { - MethodName: "Params", - Handler: _Query_Params_Handler, - }, }, Streams: []grpc.StreamDesc{}, Metadata: "babylon/checkpointing/v1/query.proto", @@ -1564,62 +1437,6 @@ func (m *QueryLastCheckpointWithStatusResponse) MarshalToSizedBuffer(dAtA []byte return len(dAtA) - i, nil } -func (m *QueryParamsRequest) 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 *QueryParamsRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryParamsRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - return len(dAtA) - i, nil -} - -func (m *QueryParamsResponse) 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 *QueryParamsResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryParamsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size, err := m.Params.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - func encodeVarintQuery(dAtA []byte, offset int, v uint64) int { offset -= sovQuery(v) base := offset @@ -1810,26 +1627,6 @@ func (m *QueryLastCheckpointWithStatusResponse) Size() (n int) { return n } -func (m *QueryParamsRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - return n -} - -func (m *QueryParamsResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.Params.Size() - n += 1 + l + sovQuery(uint64(l)) - return n -} - func sovQuery(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -3004,139 +2801,6 @@ func (m *QueryLastCheckpointWithStatusResponse) Unmarshal(dAtA []byte) error { } return nil } -func (m *QueryParamsRequest) 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 ErrIntOverflowQuery - } - 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: QueryParamsRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryParamsRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryParamsResponse) 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 ErrIntOverflowQuery - } - 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: QueryParamsResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryParamsResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Params", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Params.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} func skipQuery(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 diff --git a/x/checkpointing/types/query.pb.gw.go b/x/checkpointing/types/query.pb.gw.go index 54079eedb..8b269e51a 100644 --- a/x/checkpointing/types/query.pb.gw.go +++ b/x/checkpointing/types/query.pb.gw.go @@ -387,24 +387,6 @@ func local_request_Query_LastCheckpointWithStatus_0(ctx context.Context, marshal } -func request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryParamsRequest - var metadata runtime.ServerMetadata - - msg, err := client.Params(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryParamsRequest - var metadata runtime.ServerMetadata - - msg, err := server.Params(ctx, &protoReq) - return msg, metadata, err - -} - // RegisterQueryHandlerServer registers the http handlers for service Query to "mux". // UnaryRPC :call QueryServer directly. // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. @@ -549,29 +531,6 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv }) - mux.Handle("GET", pattern_Query_Params_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_Params_0(rctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_Params_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - return nil } @@ -733,26 +692,6 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie }) - mux.Handle("GET", pattern_Query_Params_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Query_Params_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_Params_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - return nil } @@ -768,8 +707,6 @@ var ( pattern_Query_RecentEpochStatusCount_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"babylon", "checkpointing", "v1", "epochs"}, "status_count", runtime.AssumeColonVerbOpt(false))) pattern_Query_LastCheckpointWithStatus_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4}, []string{"babylon", "checkpointing", "v1", "last_raw_checkpoint", "status"}, "", runtime.AssumeColonVerbOpt(false))) - - pattern_Query_Params_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"babylon", "checkpointing", "v1", "params"}, "", runtime.AssumeColonVerbOpt(false))) ) var ( @@ -784,6 +721,4 @@ var ( forward_Query_RecentEpochStatusCount_0 = runtime.ForwardResponseMessage forward_Query_LastCheckpointWithStatus_0 = runtime.ForwardResponseMessage - - forward_Query_Params_0 = runtime.ForwardResponseMessage ) diff --git a/x/monitor/client/cli/query_params.go b/x/monitor/client/cli/query_params.go deleted file mode 100644 index 9578c4226..000000000 --- a/x/monitor/client/cli/query_params.go +++ /dev/null @@ -1,34 +0,0 @@ -package cli - -import ( - "context" - - "github.com/babylonchain/babylon/x/monitor/types" - "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/client/flags" - "github.com/spf13/cobra" -) - -func CmdQueryParams() *cobra.Command { - cmd := &cobra.Command{ - Use: "params", - Short: "shows the parameters of the module", - Args: cobra.NoArgs, - RunE: func(cmd *cobra.Command, args []string) error { - clientCtx := client.GetClientContextFromCmd(cmd) - - queryClient := types.NewQueryClient(clientCtx) - - res, err := queryClient.Params(context.Background(), &types.QueryParamsRequest{}) - if err != nil { - return err - } - - return clientCtx.PrintProto(res) - }, - } - - flags.AddQueryFlagsToCmd(cmd) - - return cmd -} diff --git a/x/monitor/genesis.go b/x/monitor/genesis.go index 9a2cea635..3056ff875 100644 --- a/x/monitor/genesis.go +++ b/x/monitor/genesis.go @@ -9,13 +9,10 @@ import ( // InitGenesis initializes the capability module's state from a provided genesis // state. func InitGenesis(ctx sdk.Context, k keeper.Keeper, genState types.GenesisState) { - k.SetParams(ctx, genState.Params) } // ExportGenesis returns the capability module's exported genesis. func ExportGenesis(ctx sdk.Context, k keeper.Keeper) *types.GenesisState { genesis := types.DefaultGenesis() - genesis.Params = k.GetParams(ctx) - return genesis } diff --git a/x/monitor/genesis_test.go b/x/monitor/genesis_test.go index 19f0272e9..11e9484a4 100644 --- a/x/monitor/genesis_test.go +++ b/x/monitor/genesis_test.go @@ -14,20 +14,6 @@ import ( func TestExportGenesis(t *testing.T) { app := simapp.Setup(t, false) ctx := app.BaseApp.NewContext(false, tmproto.Header{}) - - app.MonitorKeeper.SetParams(ctx, types.DefaultParams()) genesisState := monitor.ExportGenesis(ctx, app.MonitorKeeper) - require.Equal(t, genesisState.Params, types.DefaultParams()) -} - -func TestInitGenesis(t *testing.T) { - app := simapp.Setup(t, false) - ctx := app.BaseApp.NewContext(false, tmproto.Header{}) - - genesisState := types.GenesisState{ - Params: types.Params{}, - } - - monitor.InitGenesis(ctx, app.MonitorKeeper, genesisState) - require.Equal(t, app.MonitorKeeper.GetParams(ctx), genesisState.Params) + require.Equal(t, genesisState, types.DefaultGenesis()) } diff --git a/x/monitor/keeper/grpc_query_params.go b/x/monitor/keeper/grpc_query_params.go deleted file mode 100644 index 9ba4a1b00..000000000 --- a/x/monitor/keeper/grpc_query_params.go +++ /dev/null @@ -1,26 +0,0 @@ -package keeper - -import ( - "context" - - "github.com/babylonchain/babylon/x/monitor/types" - sdk "github.com/cosmos/cosmos-sdk/types" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/status" -) - -// Querier is used as Keeper will have duplicate methods if used directly, and gRPC names take precedence over keeper -type Querier struct { - Keeper -} - -var _ types.QueryServer = Querier{} - -func (k Keeper) Params(c context.Context, req *types.QueryParamsRequest) (*types.QueryParamsResponse, error) { - if req == nil { - return nil, status.Error(codes.InvalidArgument, "invalid request") - } - ctx := sdk.UnwrapSDKContext(c) - - return &types.QueryParamsResponse{Params: k.GetParams(ctx)}, nil -} diff --git a/x/monitor/keeper/grpc_query_test.go b/x/monitor/keeper/grpc_query_test.go index 44dc9ee11..0fbd71500 100644 --- a/x/monitor/keeper/grpc_query_test.go +++ b/x/monitor/keeper/grpc_query_test.go @@ -1,6 +1,9 @@ package keeper_test import ( + "math/rand" + "testing" + "github.com/babylonchain/babylon/btctxformatter" "github.com/babylonchain/babylon/testutil/datagen" "github.com/babylonchain/babylon/testutil/mocks" @@ -8,13 +11,10 @@ import ( ckpttypes "github.com/babylonchain/babylon/x/checkpointing/types" "github.com/babylonchain/babylon/x/epoching/testepoching" types2 "github.com/babylonchain/babylon/x/epoching/types" - monitorkeeper "github.com/babylonchain/babylon/x/monitor/keeper" "github.com/babylonchain/babylon/x/monitor/types" "github.com/cosmos/cosmos-sdk/baseapp" "github.com/golang/mock/gomock" "github.com/stretchr/testify/require" - "math/rand" - "testing" ) func FuzzQueryEndedEpochBtcHeight(f *testing.F) { @@ -26,9 +26,8 @@ func FuzzQueryEndedEpochBtcHeight(f *testing.F) { lck := helper.App.BTCLightClientKeeper mk := helper.App.MonitorKeeper ek := helper.EpochingKeeper - querier := monitorkeeper.Querier{Keeper: mk} queryHelper := baseapp.NewQueryServerTestHelper(helper.Ctx, helper.App.InterfaceRegistry()) - types.RegisterQueryServer(queryHelper, querier) + types.RegisterQueryServer(queryHelper, mk) queryClient := types.NewQueryClient(queryHelper) // BeginBlock of block 1, and thus entering epoch 1 @@ -88,9 +87,8 @@ func FuzzQueryReportedCheckpointBtcHeight(f *testing.F) { ck := helper.App.CheckpointingKeeper mockEk := mocks.NewMockEpochingKeeper(ctl) ck.SetEpochingKeeper(mockEk) - querier := monitorkeeper.Querier{Keeper: mk} queryHelper := baseapp.NewQueryServerTestHelper(helper.Ctx, helper.App.InterfaceRegistry()) - types.RegisterQueryServer(queryHelper, querier) + types.RegisterQueryServer(queryHelper, mk) queryClient := types.NewQueryClient(queryHelper) // BeginBlock of block 1, and thus entering epoch 1 diff --git a/x/monitor/keeper/keeper.go b/x/monitor/keeper/keeper.go index 4fd733021..aa5ff716a 100644 --- a/x/monitor/keeper/keeper.go +++ b/x/monitor/keeper/keeper.go @@ -2,6 +2,7 @@ package keeper import ( "fmt" + ckpttypes "github.com/babylonchain/babylon/x/checkpointing/types" "github.com/babylonchain/babylon/x/monitor/types" @@ -9,7 +10,6 @@ import ( "github.com/cosmos/cosmos-sdk/codec" storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" - paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" ) type ( @@ -17,7 +17,6 @@ type ( cdc codec.BinaryCodec storeKey storetypes.StoreKey memKey storetypes.StoreKey - paramstore paramtypes.Subspace btcLightClientKeeper types.BTCLightClientKeeper } ) @@ -26,19 +25,12 @@ func NewKeeper( cdc codec.BinaryCodec, storeKey, memKey storetypes.StoreKey, - ps paramtypes.Subspace, bk types.BTCLightClientKeeper, ) Keeper { - // set KeyTable if it has not already been set - if !ps.HasKeyTable() { - ps = ps.WithKeyTable(types.ParamKeyTable()) - } - return Keeper{ cdc: cdc, storeKey: storeKey, memKey: memKey, - paramstore: ps, btcLightClientKeeper: bk, } } diff --git a/x/monitor/keeper/params.go b/x/monitor/keeper/params.go deleted file mode 100644 index c904062ad..000000000 --- a/x/monitor/keeper/params.go +++ /dev/null @@ -1,17 +0,0 @@ -package keeper - -import ( - "github.com/babylonchain/babylon/x/monitor/types" - sdk "github.com/cosmos/cosmos-sdk/types" -) - -// GetParams get all parameters as types.Params -func (k Keeper) GetParams(ctx sdk.Context) (params types.Params) { - k.paramstore.GetParamSet(ctx, ¶ms) - return params -} - -// SetParams set the params -func (k Keeper) SetParams(ctx sdk.Context, params types.Params) { - k.paramstore.SetParamSet(ctx, ¶ms) -} diff --git a/x/monitor/module_simulation.go b/x/monitor/module_simulation.go index 6a904a7be..3c06916db 100644 --- a/x/monitor/module_simulation.go +++ b/x/monitor/module_simulation.go @@ -25,9 +25,7 @@ func (AppModule) GenerateGenesisState(simState *module.SimulationState) { for i, acc := range simState.Accounts { accs[i] = acc.Address.String() } - monitorgenesis := types.GenesisState{ - Params: types.DefaultParams(), - } + monitorgenesis := types.GenesisState{} simState.GenState[types.ModuleName] = simState.Cdc.MustMarshalJSON(&monitorgenesis) } diff --git a/x/monitor/types/genesis.go b/x/monitor/types/genesis.go index a6cdfe807..094d1119c 100644 --- a/x/monitor/types/genesis.go +++ b/x/monitor/types/genesis.go @@ -5,14 +5,11 @@ const DefaultIndex uint64 = 1 // DefaultGenesis returns the default Capability genesis state func DefaultGenesis() *GenesisState { - return &GenesisState{ - Params: DefaultParams(), - } + return &GenesisState{} } // Validate performs basic genesis state validation returning an error upon any // failure. func (gs GenesisState) Validate() error { - - return gs.Params.Validate() + return nil } diff --git a/x/monitor/types/genesis.pb.go b/x/monitor/types/genesis.pb.go index 20091b911..2a2ba0c75 100644 --- a/x/monitor/types/genesis.pb.go +++ b/x/monitor/types/genesis.pb.go @@ -25,7 +25,6 @@ const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package // GenesisState defines the monitor module's genesis state. type GenesisState struct { - Params Params `protobuf:"bytes,1,opt,name=params,proto3" json:"params"` } func (m *GenesisState) Reset() { *m = GenesisState{} } @@ -61,13 +60,6 @@ func (m *GenesisState) XXX_DiscardUnknown() { var xxx_messageInfo_GenesisState proto.InternalMessageInfo -func (m *GenesisState) GetParams() Params { - if m != nil { - return m.Params - } - return Params{} -} - func init() { proto.RegisterType((*GenesisState)(nil), "babylon.monitor.v1.GenesisState") } @@ -75,20 +67,17 @@ func init() { func init() { proto.RegisterFile("babylon/monitor/v1/genesis.proto", fileDescriptor_fb844fd916189e7b) } var fileDescriptor_fb844fd916189e7b = []byte{ - // 199 bytes of a gzipped FileDescriptorProto + // 156 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x48, 0x4a, 0x4c, 0xaa, 0xcc, 0xc9, 0xcf, 0xd3, 0xcf, 0xcd, 0xcf, 0xcb, 0x2c, 0xc9, 0x2f, 0xd2, 0x2f, 0x33, 0xd4, 0x4f, 0x4f, 0xcd, 0x4b, 0x2d, 0xce, 0x2c, 0xd6, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x12, 0x82, 0xaa, 0xd0, 0x83, 0xaa, 0xd0, 0x2b, 0x33, 0x94, 0x12, 0x49, 0xcf, 0x4f, 0xcf, 0x07, 0x4b, 0xeb, 0x83, - 0x58, 0x10, 0x95, 0x52, 0xf2, 0x58, 0xcc, 0x2a, 0x48, 0x2c, 0x4a, 0xcc, 0x85, 0x1a, 0xa5, 0xe4, - 0xc1, 0xc5, 0xe3, 0x0e, 0x31, 0x3b, 0xb8, 0x24, 0xb1, 0x24, 0x55, 0xc8, 0x82, 0x8b, 0x0d, 0x22, - 0x2f, 0xc1, 0xa8, 0xc0, 0xa8, 0xc1, 0x6d, 0x24, 0xa5, 0x87, 0x69, 0x97, 0x5e, 0x00, 0x58, 0x85, - 0x13, 0xcb, 0x89, 0x7b, 0xf2, 0x0c, 0x41, 0x50, 0xf5, 0x4e, 0x9e, 0x27, 0x1e, 0xc9, 0x31, 0x5e, - 0x78, 0x24, 0xc7, 0xf8, 0xe0, 0x91, 0x1c, 0xe3, 0x84, 0xc7, 0x72, 0x0c, 0x17, 0x1e, 0xcb, 0x31, - 0xdc, 0x78, 0x2c, 0xc7, 0x10, 0xa5, 0x9f, 0x9e, 0x59, 0x92, 0x51, 0x9a, 0xa4, 0x97, 0x9c, 0x9f, - 0xab, 0x0f, 0x35, 0x2d, 0x39, 0x23, 0x31, 0x33, 0x0f, 0xc6, 0xd1, 0xaf, 0x80, 0x3b, 0xaf, 0xa4, - 0xb2, 0x20, 0xb5, 0x38, 0x89, 0x0d, 0xec, 0x36, 0x63, 0x40, 0x00, 0x00, 0x00, 0xff, 0xff, 0x0f, - 0x47, 0x83, 0xe5, 0x0a, 0x01, 0x00, 0x00, + 0x58, 0x10, 0x95, 0x4a, 0x7c, 0x5c, 0x3c, 0xee, 0x10, 0xad, 0xc1, 0x25, 0x89, 0x25, 0xa9, 0x4e, + 0x9e, 0x27, 0x1e, 0xc9, 0x31, 0x5e, 0x78, 0x24, 0xc7, 0xf8, 0xe0, 0x91, 0x1c, 0xe3, 0x84, 0xc7, + 0x72, 0x0c, 0x17, 0x1e, 0xcb, 0x31, 0xdc, 0x78, 0x2c, 0xc7, 0x10, 0xa5, 0x9f, 0x9e, 0x59, 0x92, + 0x51, 0x9a, 0xa4, 0x97, 0x9c, 0x9f, 0xab, 0x0f, 0x35, 0x3e, 0x39, 0x23, 0x31, 0x33, 0x0f, 0xc6, + 0xd1, 0xaf, 0x80, 0xbb, 0xa7, 0xa4, 0xb2, 0x20, 0xb5, 0x38, 0x89, 0x0d, 0x6c, 0x83, 0x31, 0x20, + 0x00, 0x00, 0xff, 0xff, 0x11, 0xca, 0xf1, 0x5e, 0xaf, 0x00, 0x00, 0x00, } func (m *GenesisState) Marshal() (dAtA []byte, err error) { @@ -111,16 +100,6 @@ func (m *GenesisState) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l - { - size, err := m.Params.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenesis(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa return len(dAtA) - i, nil } @@ -141,8 +120,6 @@ func (m *GenesisState) Size() (n int) { } var l int _ = l - l = m.Params.Size() - n += 1 + l + sovGenesis(uint64(l)) return n } @@ -181,39 +158,6 @@ func (m *GenesisState) Unmarshal(dAtA []byte) error { return fmt.Errorf("proto: GenesisState: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Params", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenesis - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenesis - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Params.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenesis(dAtA[iNdEx:]) diff --git a/x/monitor/types/params.go b/x/monitor/types/params.go deleted file mode 100644 index 4f3215e35..000000000 --- a/x/monitor/types/params.go +++ /dev/null @@ -1,32 +0,0 @@ -package types - -import ( - paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" -) - -var _ paramtypes.ParamSet = (*Params)(nil) - -// ParamKeyTable the param key table for launch module -func ParamKeyTable() paramtypes.KeyTable { - return paramtypes.NewKeyTable().RegisterParamSet(&Params{}) -} - -// NewParams creates a new Params instance -func NewParams() Params { - return Params{} -} - -// DefaultParams returns a default set of parameters -func DefaultParams() Params { - return NewParams() -} - -// ParamSetPairs get the params.ParamSet -func (p *Params) ParamSetPairs() paramtypes.ParamSetPairs { - return paramtypes.ParamSetPairs{} -} - -// Validate validates the set of params -func (p Params) Validate() error { - return nil -} diff --git a/x/monitor/types/params.pb.go b/x/monitor/types/params.pb.go deleted file mode 100644 index 8a9be2724..000000000 --- a/x/monitor/types/params.pb.go +++ /dev/null @@ -1,286 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: babylon/monitor/v1/params.proto - -package types - -import ( - fmt "fmt" - _ "github.com/cosmos/gogoproto/gogoproto" - proto "github.com/cosmos/gogoproto/proto" - io "io" - math "math" - math_bits "math/bits" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package - -// Params defines the parameters for the module. -type Params struct { -} - -func (m *Params) Reset() { *m = Params{} } -func (m *Params) String() string { return proto.CompactTextString(m) } -func (*Params) ProtoMessage() {} -func (*Params) Descriptor() ([]byte, []int) { - return fileDescriptor_03a7a0bed09bba40, []int{0} -} -func (m *Params) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Params) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Params.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 *Params) XXX_Merge(src proto.Message) { - xxx_messageInfo_Params.Merge(m, src) -} -func (m *Params) XXX_Size() int { - return m.Size() -} -func (m *Params) XXX_DiscardUnknown() { - xxx_messageInfo_Params.DiscardUnknown(m) -} - -var xxx_messageInfo_Params proto.InternalMessageInfo - -func init() { - proto.RegisterType((*Params)(nil), "babylon.monitor.v1.Params") -} - -func init() { proto.RegisterFile("babylon/monitor/v1/params.proto", fileDescriptor_03a7a0bed09bba40) } - -var fileDescriptor_03a7a0bed09bba40 = []byte{ - // 157 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4f, 0x4a, 0x4c, 0xaa, - 0xcc, 0xc9, 0xcf, 0xd3, 0xcf, 0xcd, 0xcf, 0xcb, 0x2c, 0xc9, 0x2f, 0xd2, 0x2f, 0x33, 0xd4, 0x2f, - 0x48, 0x2c, 0x4a, 0xcc, 0x2d, 0xd6, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x12, 0x82, 0x2a, 0xd0, - 0x83, 0x2a, 0xd0, 0x2b, 0x33, 0x94, 0x12, 0x49, 0xcf, 0x4f, 0xcf, 0x07, 0x4b, 0xeb, 0x83, 0x58, - 0x10, 0x95, 0x4a, 0x7c, 0x5c, 0x6c, 0x01, 0x60, 0x9d, 0x56, 0x2c, 0x2f, 0x16, 0xc8, 0x33, 0x3a, - 0x79, 0x9e, 0x78, 0x24, 0xc7, 0x78, 0xe1, 0x91, 0x1c, 0xe3, 0x83, 0x47, 0x72, 0x8c, 0x13, 0x1e, - 0xcb, 0x31, 0x5c, 0x78, 0x2c, 0xc7, 0x70, 0xe3, 0xb1, 0x1c, 0x43, 0x94, 0x7e, 0x7a, 0x66, 0x49, - 0x46, 0x69, 0x92, 0x5e, 0x72, 0x7e, 0xae, 0x3e, 0xd4, 0xf8, 0xe4, 0x8c, 0xc4, 0xcc, 0x3c, 0x18, - 0x47, 0xbf, 0x02, 0xee, 0x9c, 0x92, 0xca, 0x82, 0xd4, 0xe2, 0x24, 0x36, 0xb0, 0x0d, 0xc6, 0x80, - 0x00, 0x00, 0x00, 0xff, 0xff, 0x3d, 0x82, 0x82, 0x51, 0xae, 0x00, 0x00, 0x00, -} - -func (this *Params) Equal(that interface{}) bool { - if that == nil { - return this == nil - } - - that1, ok := that.(*Params) - if !ok { - that2, ok := that.(Params) - if ok { - that1 = &that2 - } else { - return false - } - } - if that1 == nil { - return this == nil - } else if this == nil { - return false - } - return true -} -func (m *Params) 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 *Params) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Params) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - return len(dAtA) - i, nil -} - -func encodeVarintParams(dAtA []byte, offset int, v uint64) int { - offset -= sovParams(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func (m *Params) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - return n -} - -func sovParams(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozParams(x uint64) (n int) { - return sovParams(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (m *Params) 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 ErrIntOverflowParams - } - 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: Params: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Params: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipParams(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthParams - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func skipParams(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - depth := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowParams - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - wireType := int(wire & 0x7) - switch wireType { - case 0: - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowParams - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - case 1: - iNdEx += 8 - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowParams - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if length < 0 { - return 0, ErrInvalidLengthParams - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupParams - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthParams - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthParams = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowParams = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupParams = fmt.Errorf("proto: unexpected end of group") -) diff --git a/x/monitor/types/params_test.go b/x/monitor/types/params_test.go deleted file mode 100644 index 53e3c1f6a..000000000 --- a/x/monitor/types/params_test.go +++ /dev/null @@ -1,16 +0,0 @@ -package types_test - -import ( - "testing" - - "github.com/babylonchain/babylon/x/monitor/types" - "github.com/stretchr/testify/require" -) - -func TestParamsEqual(t *testing.T) { - p1 := types.DefaultParams() - p2 := types.DefaultParams() - - ok := p1.Equal(p2) - require.True(t, ok) -} diff --git a/x/monitor/types/query.pb.go b/x/monitor/types/query.pb.go index ab3fac671..a1219b6bc 100644 --- a/x/monitor/types/query.pb.go +++ b/x/monitor/types/query.pb.go @@ -29,89 +29,6 @@ var _ = math.Inf // proto package needs to be updated. const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package -// QueryParamsRequest is request type for the Query/Params RPC method. -type QueryParamsRequest struct { -} - -func (m *QueryParamsRequest) Reset() { *m = QueryParamsRequest{} } -func (m *QueryParamsRequest) String() string { return proto.CompactTextString(m) } -func (*QueryParamsRequest) ProtoMessage() {} -func (*QueryParamsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_a8aafb034c55a8f2, []int{0} -} -func (m *QueryParamsRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryParamsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryParamsRequest.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 *QueryParamsRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryParamsRequest.Merge(m, src) -} -func (m *QueryParamsRequest) XXX_Size() int { - return m.Size() -} -func (m *QueryParamsRequest) XXX_DiscardUnknown() { - xxx_messageInfo_QueryParamsRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryParamsRequest proto.InternalMessageInfo - -// QueryParamsResponse is response type for the Query/Params RPC method. -type QueryParamsResponse struct { - // params holds all the parameters of this module. - Params Params `protobuf:"bytes,1,opt,name=params,proto3" json:"params"` -} - -func (m *QueryParamsResponse) Reset() { *m = QueryParamsResponse{} } -func (m *QueryParamsResponse) String() string { return proto.CompactTextString(m) } -func (*QueryParamsResponse) ProtoMessage() {} -func (*QueryParamsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_a8aafb034c55a8f2, []int{1} -} -func (m *QueryParamsResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryParamsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryParamsResponse.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 *QueryParamsResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryParamsResponse.Merge(m, src) -} -func (m *QueryParamsResponse) XXX_Size() int { - return m.Size() -} -func (m *QueryParamsResponse) XXX_DiscardUnknown() { - xxx_messageInfo_QueryParamsResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryParamsResponse proto.InternalMessageInfo - -func (m *QueryParamsResponse) GetParams() Params { - if m != nil { - return m.Params - } - return Params{} -} - // QueryEndedEpochBtcHeightRequest defines a query type for EndedEpochBtcHeight // RPC method type QueryEndedEpochBtcHeightRequest struct { @@ -122,7 +39,7 @@ func (m *QueryEndedEpochBtcHeightRequest) Reset() { *m = QueryEndedEpoch func (m *QueryEndedEpochBtcHeightRequest) String() string { return proto.CompactTextString(m) } func (*QueryEndedEpochBtcHeightRequest) ProtoMessage() {} func (*QueryEndedEpochBtcHeightRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_a8aafb034c55a8f2, []int{2} + return fileDescriptor_a8aafb034c55a8f2, []int{0} } func (m *QueryEndedEpochBtcHeightRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -169,7 +86,7 @@ func (m *QueryEndedEpochBtcHeightResponse) Reset() { *m = QueryEndedEpoc func (m *QueryEndedEpochBtcHeightResponse) String() string { return proto.CompactTextString(m) } func (*QueryEndedEpochBtcHeightResponse) ProtoMessage() {} func (*QueryEndedEpochBtcHeightResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_a8aafb034c55a8f2, []int{3} + return fileDescriptor_a8aafb034c55a8f2, []int{1} } func (m *QueryEndedEpochBtcHeightResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -218,7 +135,7 @@ func (m *QueryReportedCheckpointBtcHeightRequest) Reset() { func (m *QueryReportedCheckpointBtcHeightRequest) String() string { return proto.CompactTextString(m) } func (*QueryReportedCheckpointBtcHeightRequest) ProtoMessage() {} func (*QueryReportedCheckpointBtcHeightRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_a8aafb034c55a8f2, []int{4} + return fileDescriptor_a8aafb034c55a8f2, []int{2} } func (m *QueryReportedCheckpointBtcHeightRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -267,7 +184,7 @@ func (m *QueryReportedCheckpointBtcHeightResponse) Reset() { func (m *QueryReportedCheckpointBtcHeightResponse) String() string { return proto.CompactTextString(m) } func (*QueryReportedCheckpointBtcHeightResponse) ProtoMessage() {} func (*QueryReportedCheckpointBtcHeightResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_a8aafb034c55a8f2, []int{5} + return fileDescriptor_a8aafb034c55a8f2, []int{3} } func (m *QueryReportedCheckpointBtcHeightResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -304,8 +221,6 @@ func (m *QueryReportedCheckpointBtcHeightResponse) GetBtcLightClientHeight() uin } func init() { - proto.RegisterType((*QueryParamsRequest)(nil), "babylon.monitor.v1.QueryParamsRequest") - proto.RegisterType((*QueryParamsResponse)(nil), "babylon.monitor.v1.QueryParamsResponse") proto.RegisterType((*QueryEndedEpochBtcHeightRequest)(nil), "babylon.monitor.v1.QueryEndedEpochBtcHeightRequest") proto.RegisterType((*QueryEndedEpochBtcHeightResponse)(nil), "babylon.monitor.v1.QueryEndedEpochBtcHeightResponse") proto.RegisterType((*QueryReportedCheckpointBtcHeightRequest)(nil), "babylon.monitor.v1.QueryReportedCheckpointBtcHeightRequest") @@ -315,38 +230,33 @@ func init() { func init() { proto.RegisterFile("babylon/monitor/v1/query.proto", fileDescriptor_a8aafb034c55a8f2) } var fileDescriptor_a8aafb034c55a8f2 = []byte{ - // 488 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x54, 0xcf, 0x6b, 0xd4, 0x40, - 0x14, 0xde, 0xc8, 0xba, 0xb4, 0xe3, 0x6d, 0xba, 0xa0, 0xa4, 0x25, 0x5b, 0x72, 0x68, 0x17, 0xc4, - 0x0c, 0xed, 0x2a, 0x08, 0x8a, 0x87, 0x2d, 0x95, 0x0a, 0xe2, 0x8f, 0xdc, 0xf4, 0x12, 0x26, 0xb3, - 0x43, 0x26, 0x74, 0x33, 0x33, 0xcd, 0x4c, 0x8a, 0x4b, 0xd9, 0x8b, 0x37, 0x6f, 0x82, 0xff, 0x88, - 0x7f, 0x46, 0x2f, 0x42, 0xc1, 0x8b, 0x27, 0x91, 0x5d, 0xff, 0x10, 0xc9, 0x64, 0x0c, 0xc8, 0x26, - 0x2e, 0xda, 0x5b, 0xf2, 0xbe, 0xf7, 0x7d, 0xef, 0x7b, 0x79, 0x1f, 0x01, 0x5e, 0x8c, 0xe3, 0xd9, - 0x54, 0x70, 0x94, 0x09, 0x9e, 0x6a, 0x91, 0xa3, 0xf3, 0x03, 0x74, 0x56, 0xd0, 0x7c, 0x16, 0xc8, - 0x5c, 0x68, 0x01, 0xa1, 0xc5, 0x03, 0x8b, 0x07, 0xe7, 0x07, 0x6e, 0x3f, 0x11, 0x89, 0x30, 0x30, - 0x2a, 0x9f, 0xaa, 0x4e, 0x77, 0x27, 0x11, 0x22, 0x99, 0x52, 0x84, 0x65, 0x8a, 0x30, 0xe7, 0x42, - 0x63, 0x9d, 0x0a, 0xae, 0x2c, 0x3a, 0x68, 0x98, 0x23, 0x71, 0x8e, 0x33, 0xdb, 0xe0, 0xf7, 0x01, - 0x7c, 0x5d, 0xce, 0x7d, 0x65, 0x8a, 0x21, 0x3d, 0x2b, 0xa8, 0xd2, 0xfe, 0x4b, 0xb0, 0xf5, 0x47, - 0x55, 0x49, 0xc1, 0x15, 0x85, 0x0f, 0x41, 0xaf, 0x22, 0xdf, 0x71, 0x76, 0x9d, 0xe1, 0xad, 0x43, - 0x37, 0x58, 0xb5, 0x19, 0x54, 0x9c, 0x71, 0xf7, 0xf2, 0xfb, 0xa0, 0x13, 0xda, 0x7e, 0xff, 0x09, - 0x18, 0x18, 0xc1, 0x63, 0x3e, 0xa1, 0x93, 0x63, 0x29, 0x08, 0x1b, 0x6b, 0x72, 0x42, 0xd3, 0x84, - 0x69, 0x3b, 0x13, 0x6e, 0x83, 0x4d, 0x5a, 0x02, 0x11, 0x2f, 0x32, 0xa3, 0xdf, 0x0d, 0x37, 0x4c, - 0xe1, 0x45, 0x91, 0xf9, 0x6f, 0xc0, 0x6e, 0x3b, 0xdf, 0xba, 0x7b, 0x00, 0x6e, 0xc7, 0x9a, 0x44, - 0xd3, 0xb2, 0x18, 0x91, 0x69, 0x4a, 0xb9, 0x8e, 0x98, 0x69, 0xb1, 0x72, 0xfd, 0x58, 0x93, 0xe7, - 0xe5, 0xfb, 0x91, 0x01, 0x2b, 0xba, 0xff, 0x14, 0xec, 0x1b, 0xe9, 0x90, 0x4a, 0x91, 0x6b, 0x3a, - 0x39, 0x62, 0x94, 0x9c, 0x4a, 0x91, 0x72, 0xdd, 0x64, 0x91, 0x9c, 0x4a, 0x1d, 0x31, 0xac, 0x98, - 0xd1, 0xdc, 0x0c, 0x37, 0xca, 0xc2, 0x09, 0x56, 0xcc, 0xc7, 0x60, 0xb8, 0x5e, 0xe7, 0x5a, 0x56, - 0x0f, 0x3f, 0x74, 0xc1, 0x4d, 0x33, 0x03, 0xce, 0x41, 0xaf, 0xfa, 0xce, 0x70, 0xaf, 0xe9, 0x06, - 0xab, 0x27, 0x75, 0xf7, 0xd7, 0xf6, 0x55, 0xde, 0x7c, 0xff, 0xfd, 0xd7, 0x9f, 0x9f, 0x6e, 0xec, - 0x40, 0x17, 0xb5, 0x66, 0x07, 0x7e, 0x76, 0xc0, 0x56, 0xc3, 0x29, 0xe0, 0xa8, 0x75, 0x48, 0xfb, - 0xe1, 0xdd, 0xfb, 0xff, 0x46, 0xb2, 0x36, 0x03, 0x63, 0x73, 0x08, 0xf7, 0x9a, 0x6c, 0x9a, 0xdc, - 0x28, 0x74, 0x51, 0x07, 0x6a, 0x0e, 0xbf, 0x38, 0x60, 0xfb, 0x2f, 0xa7, 0x81, 0x8f, 0x5a, 0x5d, - 0xac, 0x0f, 0x86, 0xfb, 0xf8, 0xff, 0xc8, 0x76, 0x95, 0x91, 0x59, 0xe5, 0x1e, 0xbc, 0xdb, 0xb4, - 0x0a, 0xa9, 0x89, 0x0a, 0x5d, 0xd4, 0xe9, 0x9b, 0x8f, 0x9f, 0x5d, 0x2e, 0x3c, 0xe7, 0x6a, 0xe1, - 0x39, 0x3f, 0x16, 0x9e, 0xf3, 0x71, 0xe9, 0x75, 0xae, 0x96, 0x5e, 0xe7, 0xdb, 0xd2, 0xeb, 0xbc, - 0x45, 0x49, 0xaa, 0x59, 0x11, 0x07, 0x44, 0x64, 0xbf, 0x05, 0x09, 0xc3, 0x29, 0xaf, 0xd5, 0xdf, - 0xd5, 0xfa, 0x7a, 0x26, 0xa9, 0x8a, 0x7b, 0xe6, 0x57, 0x30, 0xfa, 0x15, 0x00, 0x00, 0xff, 0xff, - 0x06, 0x10, 0xa8, 0x48, 0x95, 0x04, 0x00, 0x00, + // 414 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x93, 0x4f, 0x8b, 0xd3, 0x40, + 0x18, 0xc6, 0x1b, 0xff, 0xb1, 0x3b, 0xc7, 0x71, 0x41, 0xc9, 0x4a, 0x5c, 0x72, 0xd0, 0x82, 0x98, + 0x61, 0xad, 0x9e, 0x14, 0x0f, 0xbb, 0xac, 0x54, 0x10, 0xc1, 0xdc, 0xf4, 0x12, 0x26, 0xd3, 0x21, + 0x33, 0x34, 0x99, 0x77, 0x9a, 0x99, 0x14, 0x4b, 0xe9, 0xc5, 0xa3, 0x27, 0xc1, 0x2f, 0xe2, 0xc7, + 0xf0, 0x22, 0x14, 0xbc, 0x78, 0x94, 0xd6, 0x0f, 0x22, 0x99, 0xc4, 0x5c, 0x4c, 0x2d, 0xea, 0x2d, + 0x79, 0x9f, 0x79, 0x7e, 0x79, 0xdf, 0xf7, 0xc9, 0xa0, 0x20, 0xa5, 0xe9, 0x22, 0x07, 0x45, 0x0a, + 0x50, 0xd2, 0x42, 0x49, 0xe6, 0xa7, 0x64, 0x56, 0xf1, 0x72, 0x11, 0xe9, 0x12, 0x2c, 0x60, 0xdc, + 0xea, 0x51, 0xab, 0x47, 0xf3, 0x53, 0xff, 0x28, 0x83, 0x0c, 0x9c, 0x4c, 0xea, 0xa7, 0xe6, 0xa4, + 0x7f, 0x2b, 0x03, 0xc8, 0x72, 0x4e, 0xa8, 0x96, 0x84, 0x2a, 0x05, 0x96, 0x5a, 0x09, 0xca, 0x34, + 0x6a, 0xf8, 0x14, 0xdd, 0x7e, 0x55, 0x63, 0x2f, 0xd4, 0x84, 0x4f, 0x2e, 0x34, 0x30, 0x71, 0x66, + 0xd9, 0x98, 0xcb, 0x4c, 0xd8, 0x98, 0xcf, 0x2a, 0x6e, 0x2c, 0x3e, 0x46, 0x87, 0xbc, 0x16, 0x12, + 0x55, 0x15, 0x37, 0xbd, 0x13, 0x6f, 0x78, 0x25, 0x3e, 0x70, 0x85, 0x97, 0x55, 0x11, 0xbe, 0x46, + 0x27, 0xbb, 0xfd, 0x46, 0x83, 0x32, 0x1c, 0x3f, 0x42, 0x37, 0x52, 0xcb, 0x92, 0xbc, 0x2e, 0x26, + 0x2c, 0x97, 0x5c, 0xd9, 0x44, 0xb8, 0x23, 0x2d, 0xee, 0x28, 0xb5, 0xec, 0x45, 0xfd, 0x7e, 0xee, + 0xc4, 0xc6, 0x1e, 0x3e, 0x43, 0x77, 0x1d, 0x3a, 0xe6, 0x1a, 0x4a, 0xcb, 0x27, 0xe7, 0x82, 0xb3, + 0xa9, 0x06, 0xa9, 0x6c, 0x5f, 0x8b, 0x6c, 0xaa, 0x6d, 0x22, 0xa8, 0x11, 0x8e, 0x79, 0x18, 0x1f, + 0xd4, 0x85, 0x31, 0x35, 0x22, 0xa4, 0x68, 0xb8, 0x9f, 0xf3, 0x5f, 0xad, 0x3e, 0x78, 0x7f, 0x19, + 0x5d, 0x75, 0xdf, 0xc0, 0x9f, 0x3c, 0x74, 0xbd, 0x67, 0x17, 0x78, 0x14, 0xfd, 0x1e, 0x58, 0xb4, + 0x67, 0xf3, 0xfe, 0xc3, 0xbf, 0x33, 0x35, 0x33, 0x84, 0xd1, 0xbb, 0xaf, 0x3f, 0x3e, 0x5e, 0x1a, + 0xe2, 0x3b, 0xa4, 0xe7, 0x1f, 0x72, 0xc1, 0x19, 0xb2, 0xec, 0x12, 0x5d, 0xe1, 0x2f, 0x1e, 0x3a, + 0xfe, 0xc3, 0x6e, 0xf0, 0xe3, 0x9d, 0x5d, 0xec, 0x4f, 0xc6, 0x7f, 0xf2, 0x6f, 0xe6, 0x76, 0x94, + 0x91, 0x1b, 0xe5, 0x3e, 0xbe, 0xd7, 0x37, 0x0a, 0xeb, 0x8c, 0x86, 0x2c, 0xbb, 0xf8, 0x57, 0x67, + 0xcf, 0x3f, 0x6f, 0x02, 0x6f, 0xbd, 0x09, 0xbc, 0xef, 0x9b, 0xc0, 0xfb, 0xb0, 0x0d, 0x06, 0xeb, + 0x6d, 0x30, 0xf8, 0xb6, 0x0d, 0x06, 0x6f, 0x48, 0x26, 0xad, 0xa8, 0xd2, 0x88, 0x41, 0xf1, 0x0b, + 0xc8, 0x04, 0x95, 0xaa, 0xa3, 0xbf, 0xed, 0xf8, 0x76, 0xa1, 0xb9, 0x49, 0xaf, 0xb9, 0x4b, 0x32, + 0xfa, 0x19, 0x00, 0x00, 0xff, 0xff, 0x2c, 0x9f, 0x08, 0x3d, 0x8e, 0x03, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -361,8 +271,6 @@ const _ = grpc.SupportPackageIsVersion4 // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. type QueryClient interface { - // Parameters queries the parameters of the module. - Params(ctx context.Context, in *QueryParamsRequest, opts ...grpc.CallOption) (*QueryParamsResponse, error) // EndedEpochBtcHeight returns the BTC light client height at provided epoch // finish EndedEpochBtcHeight(ctx context.Context, in *QueryEndedEpochBtcHeightRequest, opts ...grpc.CallOption) (*QueryEndedEpochBtcHeightResponse, error) @@ -379,15 +287,6 @@ func NewQueryClient(cc grpc1.ClientConn) QueryClient { return &queryClient{cc} } -func (c *queryClient) Params(ctx context.Context, in *QueryParamsRequest, opts ...grpc.CallOption) (*QueryParamsResponse, error) { - out := new(QueryParamsResponse) - err := c.cc.Invoke(ctx, "/babylon.monitor.v1.Query/Params", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - func (c *queryClient) EndedEpochBtcHeight(ctx context.Context, in *QueryEndedEpochBtcHeightRequest, opts ...grpc.CallOption) (*QueryEndedEpochBtcHeightResponse, error) { out := new(QueryEndedEpochBtcHeightResponse) err := c.cc.Invoke(ctx, "/babylon.monitor.v1.Query/EndedEpochBtcHeight", in, out, opts...) @@ -408,8 +307,6 @@ func (c *queryClient) ReportedCheckpointBtcHeight(ctx context.Context, in *Query // QueryServer is the server API for Query service. type QueryServer interface { - // Parameters queries the parameters of the module. - Params(context.Context, *QueryParamsRequest) (*QueryParamsResponse, error) // EndedEpochBtcHeight returns the BTC light client height at provided epoch // finish EndedEpochBtcHeight(context.Context, *QueryEndedEpochBtcHeightRequest) (*QueryEndedEpochBtcHeightResponse, error) @@ -422,9 +319,6 @@ type QueryServer interface { type UnimplementedQueryServer struct { } -func (*UnimplementedQueryServer) Params(ctx context.Context, req *QueryParamsRequest) (*QueryParamsResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method Params not implemented") -} func (*UnimplementedQueryServer) EndedEpochBtcHeight(ctx context.Context, req *QueryEndedEpochBtcHeightRequest) (*QueryEndedEpochBtcHeightResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method EndedEpochBtcHeight not implemented") } @@ -436,24 +330,6 @@ func RegisterQueryServer(s grpc1.Server, srv QueryServer) { s.RegisterService(&_Query_serviceDesc, srv) } -func _Query_Params_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(QueryParamsRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(QueryServer).Params(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/babylon.monitor.v1.Query/Params", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(QueryServer).Params(ctx, req.(*QueryParamsRequest)) - } - return interceptor(ctx, in, info, handler) -} - func _Query_EndedEpochBtcHeight_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(QueryEndedEpochBtcHeightRequest) if err := dec(in); err != nil { @@ -494,10 +370,6 @@ var _Query_serviceDesc = grpc.ServiceDesc{ ServiceName: "babylon.monitor.v1.Query", HandlerType: (*QueryServer)(nil), Methods: []grpc.MethodDesc{ - { - MethodName: "Params", - Handler: _Query_Params_Handler, - }, { MethodName: "EndedEpochBtcHeight", Handler: _Query_EndedEpochBtcHeight_Handler, @@ -511,62 +383,6 @@ var _Query_serviceDesc = grpc.ServiceDesc{ Metadata: "babylon/monitor/v1/query.proto", } -func (m *QueryParamsRequest) 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 *QueryParamsRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryParamsRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - return len(dAtA) - i, nil -} - -func (m *QueryParamsResponse) 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 *QueryParamsResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryParamsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size, err := m.Params.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - func (m *QueryEndedEpochBtcHeightRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -692,26 +508,6 @@ func encodeVarintQuery(dAtA []byte, offset int, v uint64) int { dAtA[offset] = uint8(v) return base } -func (m *QueryParamsRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - return n -} - -func (m *QueryParamsResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.Params.Size() - n += 1 + l + sovQuery(uint64(l)) - return n -} - func (m *QueryEndedEpochBtcHeightRequest) Size() (n int) { if m == nil { return 0 @@ -767,139 +563,6 @@ func sovQuery(x uint64) (n int) { func sozQuery(x uint64) (n int) { return sovQuery(uint64((x << 1) ^ uint64((int64(x) >> 63)))) } -func (m *QueryParamsRequest) 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 ErrIntOverflowQuery - } - 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: QueryParamsRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryParamsRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryParamsResponse) 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 ErrIntOverflowQuery - } - 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: QueryParamsResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryParamsResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Params", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Params.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} func (m *QueryEndedEpochBtcHeightRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/x/monitor/types/query.pb.gw.go b/x/monitor/types/query.pb.gw.go index a2399aa23..37dfc78f3 100644 --- a/x/monitor/types/query.pb.gw.go +++ b/x/monitor/types/query.pb.gw.go @@ -33,24 +33,6 @@ var _ = utilities.NewDoubleArray var _ = descriptor.ForMessage var _ = metadata.Join -func request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryParamsRequest - var metadata runtime.ServerMetadata - - msg, err := client.Params(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryParamsRequest - var metadata runtime.ServerMetadata - - msg, err := server.Params(ctx, &protoReq) - return msg, metadata, err - -} - func request_Query_EndedEpochBtcHeight_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryEndedEpochBtcHeightRequest var metadata runtime.ServerMetadata @@ -165,29 +147,6 @@ func local_request_Query_ReportedCheckpointBtcHeight_0(ctx context.Context, mars // Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterQueryHandlerFromEndpoint instead. func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, server QueryServer) error { - mux.Handle("GET", pattern_Query_Params_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_Params_0(rctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_Params_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - mux.Handle("GET", pattern_Query_EndedEpochBtcHeight_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -275,26 +234,6 @@ func RegisterQueryHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc // "QueryClient" to call the correct interceptors. func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, client QueryClient) error { - mux.Handle("GET", pattern_Query_Params_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Query_Params_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_Params_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - mux.Handle("GET", pattern_Query_EndedEpochBtcHeight_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -339,16 +278,12 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie } var ( - pattern_Query_Params_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"babylon", "monitor", "v1", "params"}, "", runtime.AssumeColonVerbOpt(false))) - pattern_Query_EndedEpochBtcHeight_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4}, []string{"babylon", "monitor", "v1", "epochs", "epoch_num"}, "", runtime.AssumeColonVerbOpt(false))) pattern_Query_ReportedCheckpointBtcHeight_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4}, []string{"babylon", "monitor", "v1", "checkpoints", "ckpt_hash"}, "", runtime.AssumeColonVerbOpt(false))) ) var ( - forward_Query_Params_0 = runtime.ForwardResponseMessage - forward_Query_EndedEpochBtcHeight_0 = runtime.ForwardResponseMessage forward_Query_ReportedCheckpointBtcHeight_0 = runtime.ForwardResponseMessage diff --git a/x/zoneconcierge/client/cli/query.go b/x/zoneconcierge/client/cli/query.go index 5ab8f5dfc..0ecf92e7a 100644 --- a/x/zoneconcierge/client/cli/query.go +++ b/x/zoneconcierge/client/cli/query.go @@ -24,7 +24,5 @@ func GetQueryCmd(queryRoute string) *cobra.Command { RunE: client.ValidateCmd, } - cmd.AddCommand(CmdQueryParams()) - return cmd } diff --git a/x/zoneconcierge/client/cli/query_params.go b/x/zoneconcierge/client/cli/query_params.go deleted file mode 100644 index e1faa4fc2..000000000 --- a/x/zoneconcierge/client/cli/query_params.go +++ /dev/null @@ -1,34 +0,0 @@ -package cli - -import ( - "context" - - "github.com/babylonchain/babylon/x/zoneconcierge/types" - "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/client/flags" - "github.com/spf13/cobra" -) - -func CmdQueryParams() *cobra.Command { - cmd := &cobra.Command{ - Use: "params", - Short: "shows the parameters of the module", - Args: cobra.NoArgs, - RunE: func(cmd *cobra.Command, args []string) error { - clientCtx := client.GetClientContextFromCmd(cmd) - - queryClient := types.NewQueryClient(clientCtx) - - res, err := queryClient.Params(context.Background(), &types.QueryParamsRequest{}) - if err != nil { - return err - } - - return clientCtx.PrintProto(res) - }, - } - - flags.AddQueryFlagsToCmd(cmd) - - return cmd -} diff --git a/x/zoneconcierge/genesis.go b/x/zoneconcierge/genesis.go index ef412bd4b..fb3758b66 100644 --- a/x/zoneconcierge/genesis.go +++ b/x/zoneconcierge/genesis.go @@ -19,15 +19,11 @@ func InitGenesis(ctx sdk.Context, k keeper.Keeper, genState types.GenesisState) panic("could not claim port capability: " + err.Error()) } } - k.SetParams(ctx, genState.Params) } // ExportGenesis returns the module's exported genesis func ExportGenesis(ctx sdk.Context, k keeper.Keeper) *types.GenesisState { genesis := types.DefaultGenesis() - genesis.Params = k.GetParams(ctx) - genesis.PortId = k.GetPort(ctx) - return genesis } diff --git a/x/zoneconcierge/genesis_test.go b/x/zoneconcierge/genesis_test.go index c1b5f624c..731765ab6 100644 --- a/x/zoneconcierge/genesis_test.go +++ b/x/zoneconcierge/genesis_test.go @@ -12,7 +12,6 @@ import ( func TestGenesis(t *testing.T) { genesisState := types.GenesisState{ - Params: types.DefaultParams(), PortId: types.PortID, } @@ -25,5 +24,4 @@ func TestGenesis(t *testing.T) { nullify.Fill(got) require.Equal(t, genesisState.PortId, got.PortId) - } diff --git a/x/zoneconcierge/keeper/grpc_query_params.go b/x/zoneconcierge/keeper/grpc_query_params.go deleted file mode 100644 index 2e76d1b4e..000000000 --- a/x/zoneconcierge/keeper/grpc_query_params.go +++ /dev/null @@ -1,19 +0,0 @@ -package keeper - -import ( - "context" - - "github.com/babylonchain/babylon/x/zoneconcierge/types" - sdk "github.com/cosmos/cosmos-sdk/types" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/status" -) - -func (k Keeper) Params(c context.Context, req *types.QueryParamsRequest) (*types.QueryParamsResponse, error) { - if req == nil { - return nil, status.Error(codes.InvalidArgument, "invalid request") - } - ctx := sdk.UnwrapSDKContext(c) - - return &types.QueryParamsResponse{Params: k.GetParams(ctx)}, nil -} diff --git a/x/zoneconcierge/keeper/grpc_query_params_test.go b/x/zoneconcierge/keeper/grpc_query_params_test.go deleted file mode 100644 index 8aeb30bd4..000000000 --- a/x/zoneconcierge/keeper/grpc_query_params_test.go +++ /dev/null @@ -1,21 +0,0 @@ -package keeper_test - -import ( - "testing" - - testkeeper "github.com/babylonchain/babylon/testutil/keeper" - "github.com/babylonchain/babylon/x/zoneconcierge/types" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/stretchr/testify/require" -) - -func TestParamsQuery(t *testing.T) { - keeper, ctx := testkeeper.ZoneConciergeKeeper(t, nil, nil, nil, nil) - wctx := sdk.WrapSDKContext(ctx) - params := types.DefaultParams() - keeper.SetParams(ctx, params) - - response, err := keeper.Params(wctx, &types.QueryParamsRequest{}) - require.NoError(t, err) - require.Equal(t, &types.QueryParamsResponse{Params: params}, response) -} diff --git a/x/zoneconcierge/keeper/keeper.go b/x/zoneconcierge/keeper/keeper.go index fe5c4c7f7..d2f928e8a 100644 --- a/x/zoneconcierge/keeper/keeper.go +++ b/x/zoneconcierge/keeper/keeper.go @@ -7,7 +7,6 @@ import ( storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types" - paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" host "github.com/cosmos/ibc-go/v7/modules/core/24-host" ibcexported "github.com/cosmos/ibc-go/v7/modules/core/exported" @@ -15,10 +14,9 @@ import ( type ( Keeper struct { - cdc codec.BinaryCodec - storeKey storetypes.StoreKey - memKey storetypes.StoreKey - paramstore paramtypes.Subspace + cdc codec.BinaryCodec + storeKey storetypes.StoreKey + memKey storetypes.StoreKey ics4Wrapper types.ICS4Wrapper channelKeeper types.ChannelKeeper @@ -38,7 +36,6 @@ func NewKeeper( cdc codec.BinaryCodec, storeKey, memKey storetypes.StoreKey, - ps paramtypes.Subspace, ics4Wrapper types.ICS4Wrapper, channelKeeper types.ChannelKeeper, portKeeper types.PortKeeper, @@ -51,16 +48,10 @@ func NewKeeper( storeQuerier sdk.Queryable, scopedKeeper types.ScopedKeeper, ) *Keeper { - // set KeyTable if it has not already been set - if !ps.HasKeyTable() { - ps = ps.WithKeyTable(types.ParamKeyTable()) - } - return &Keeper{ cdc: cdc, storeKey: storeKey, memKey: memKey, - paramstore: ps, ics4Wrapper: ics4Wrapper, channelKeeper: channelKeeper, portKeeper: portKeeper, diff --git a/x/zoneconcierge/keeper/params.go b/x/zoneconcierge/keeper/params.go deleted file mode 100644 index 328fbd9c6..000000000 --- a/x/zoneconcierge/keeper/params.go +++ /dev/null @@ -1,16 +0,0 @@ -package keeper - -import ( - "github.com/babylonchain/babylon/x/zoneconcierge/types" - sdk "github.com/cosmos/cosmos-sdk/types" -) - -// GetParams get all parameters as types.Params -func (k Keeper) GetParams(ctx sdk.Context) types.Params { - return types.NewParams() -} - -// SetParams set the params -func (k Keeper) SetParams(ctx sdk.Context, params types.Params) { - k.paramstore.SetParamSet(ctx, ¶ms) -} diff --git a/x/zoneconcierge/keeper/params_test.go b/x/zoneconcierge/keeper/params_test.go deleted file mode 100644 index b319a114c..000000000 --- a/x/zoneconcierge/keeper/params_test.go +++ /dev/null @@ -1,18 +0,0 @@ -package keeper_test - -import ( - "testing" - - testkeeper "github.com/babylonchain/babylon/testutil/keeper" - "github.com/babylonchain/babylon/x/zoneconcierge/types" - "github.com/stretchr/testify/require" -) - -func TestGetParams(t *testing.T) { - k, ctx := testkeeper.ZoneConciergeKeeper(t, nil, nil, nil, nil) - params := types.DefaultParams() - - k.SetParams(ctx, params) - - require.EqualValues(t, params, k.GetParams(ctx)) -} diff --git a/x/zoneconcierge/module_simulation.go b/x/zoneconcierge/module_simulation.go index 52dd2f4f1..7bb84f9a4 100644 --- a/x/zoneconcierge/module_simulation.go +++ b/x/zoneconcierge/module_simulation.go @@ -29,7 +29,6 @@ func (AppModule) GenerateGenesisState(simState *module.SimulationState) { accs[i] = acc.Address.String() } zoneconciergeGenesis := types.GenesisState{ - Params: types.DefaultParams(), PortId: types.PortID, } simState.GenState[types.ModuleName] = simState.Cdc.MustMarshalJSON(&zoneconciergeGenesis) diff --git a/x/zoneconcierge/types/genesis.go b/x/zoneconcierge/types/genesis.go index 5b3085d4a..5bd0f2ea7 100644 --- a/x/zoneconcierge/types/genesis.go +++ b/x/zoneconcierge/types/genesis.go @@ -11,7 +11,6 @@ const DefaultIndex uint64 = 1 func DefaultGenesis() *GenesisState { return &GenesisState{ PortId: PortID, - Params: DefaultParams(), } } @@ -21,6 +20,5 @@ func (gs GenesisState) Validate() error { if err := host.PortIdentifierValidator(gs.PortId); err != nil { return err } - - return gs.Params.Validate() + return nil } diff --git a/x/zoneconcierge/types/genesis.pb.go b/x/zoneconcierge/types/genesis.pb.go index 8a2451224..7c4d2fe05 100644 --- a/x/zoneconcierge/types/genesis.pb.go +++ b/x/zoneconcierge/types/genesis.pb.go @@ -25,8 +25,7 @@ const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package // GenesisState defines the zoneconcierge module's genesis state. type GenesisState struct { - Params Params `protobuf:"bytes,1,opt,name=params,proto3" json:"params"` - PortId string `protobuf:"bytes,2,opt,name=port_id,json=portId,proto3" json:"port_id,omitempty"` + PortId string `protobuf:"bytes,1,opt,name=port_id,json=portId,proto3" json:"port_id,omitempty"` } func (m *GenesisState) Reset() { *m = GenesisState{} } @@ -62,13 +61,6 @@ func (m *GenesisState) XXX_DiscardUnknown() { var xxx_messageInfo_GenesisState proto.InternalMessageInfo -func (m *GenesisState) GetParams() Params { - if m != nil { - return m.Params - } - return Params{} -} - func (m *GenesisState) GetPortId() string { if m != nil { return m.PortId @@ -85,22 +77,19 @@ func init() { } var fileDescriptor_56f290ad7c2c7dc7 = []byte{ - // 228 bytes of a gzipped FileDescriptorProto + // 186 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x4b, 0x4a, 0x4c, 0xaa, 0xcc, 0xc9, 0xcf, 0xd3, 0xaf, 0xca, 0xcf, 0x4b, 0x4d, 0xce, 0xcf, 0x4b, 0xce, 0x4c, 0x2d, 0x4a, 0x4f, 0xd5, 0x2f, 0x33, 0xd4, 0x4f, 0x4f, 0xcd, 0x4b, 0x2d, 0xce, 0x2c, 0xd6, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x92, 0x80, 0xaa, 0xd3, 0x43, 0x51, 0xa7, 0x57, 0x66, 0x28, 0x25, 0x92, 0x9e, - 0x9f, 0x9e, 0x0f, 0x56, 0xa4, 0x0f, 0x62, 0x41, 0xd4, 0x4b, 0xa9, 0xe2, 0x34, 0xb7, 0x20, 0xb1, - 0x28, 0x31, 0x17, 0x6a, 0xac, 0x52, 0x3a, 0x17, 0x8f, 0x3b, 0xc4, 0x9e, 0xe0, 0x92, 0xc4, 0x92, - 0x54, 0x21, 0x3b, 0x2e, 0x36, 0x88, 0xbc, 0x04, 0xa3, 0x02, 0xa3, 0x06, 0xb7, 0x91, 0x82, 0x1e, - 0x2e, 0x7b, 0xf5, 0x02, 0xc0, 0xea, 0x9c, 0x58, 0x4e, 0xdc, 0x93, 0x67, 0x08, 0x82, 0xea, 0x12, - 0x12, 0xe7, 0x62, 0x2f, 0xc8, 0x2f, 0x2a, 0x89, 0xcf, 0x4c, 0x91, 0x60, 0x52, 0x60, 0xd4, 0xe0, - 0x0c, 0x62, 0x03, 0x71, 0x3d, 0x53, 0x9c, 0xfc, 0x4f, 0x3c, 0x92, 0x63, 0xbc, 0xf0, 0x48, 0x8e, - 0xf1, 0xc1, 0x23, 0x39, 0xc6, 0x09, 0x8f, 0xe5, 0x18, 0x2e, 0x3c, 0x96, 0x63, 0xb8, 0xf1, 0x58, - 0x8e, 0x21, 0xca, 0x34, 0x3d, 0xb3, 0x24, 0xa3, 0x34, 0x49, 0x2f, 0x39, 0x3f, 0x57, 0x1f, 0x6a, - 0x59, 0x72, 0x46, 0x62, 0x66, 0x1e, 0x8c, 0xa3, 0x5f, 0x81, 0xe6, 0x87, 0x92, 0xca, 0x82, 0xd4, - 0xe2, 0x24, 0x36, 0xb0, 0x07, 0x8c, 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0xed, 0x60, 0x3d, 0x7d, - 0x41, 0x01, 0x00, 0x00, + 0x9f, 0x9e, 0x0f, 0x56, 0xa4, 0x0f, 0x62, 0x41, 0xd4, 0x2b, 0xa9, 0x73, 0xf1, 0xb8, 0x43, 0x0c, + 0x08, 0x2e, 0x49, 0x2c, 0x49, 0x15, 0x12, 0xe7, 0x62, 0x2f, 0xc8, 0x2f, 0x2a, 0x89, 0xcf, 0x4c, + 0x91, 0x60, 0x54, 0x60, 0xd4, 0xe0, 0x0c, 0x62, 0x03, 0x71, 0x3d, 0x53, 0x9c, 0xfc, 0x4f, 0x3c, + 0x92, 0x63, 0xbc, 0xf0, 0x48, 0x8e, 0xf1, 0xc1, 0x23, 0x39, 0xc6, 0x09, 0x8f, 0xe5, 0x18, 0x2e, + 0x3c, 0x96, 0x63, 0xb8, 0xf1, 0x58, 0x8e, 0x21, 0xca, 0x34, 0x3d, 0xb3, 0x24, 0xa3, 0x34, 0x49, + 0x2f, 0x39, 0x3f, 0x57, 0x1f, 0x6a, 0x7b, 0x72, 0x46, 0x62, 0x66, 0x1e, 0x8c, 0xa3, 0x5f, 0x81, + 0xe6, 0xe8, 0x92, 0xca, 0x82, 0xd4, 0xe2, 0x24, 0x36, 0xb0, 0x03, 0x8c, 0x01, 0x01, 0x00, 0x00, + 0xff, 0xff, 0xbf, 0x3e, 0xc9, 0x02, 0xda, 0x00, 0x00, 0x00, } func (m *GenesisState) Marshal() (dAtA []byte, err error) { @@ -128,18 +117,8 @@ func (m *GenesisState) MarshalToSizedBuffer(dAtA []byte) (int, error) { copy(dAtA[i:], m.PortId) i = encodeVarintGenesis(dAtA, i, uint64(len(m.PortId))) i-- - dAtA[i] = 0x12 + dAtA[i] = 0xa } - { - size, err := m.Params.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenesis(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa return len(dAtA) - i, nil } @@ -160,8 +139,6 @@ func (m *GenesisState) Size() (n int) { } var l int _ = l - l = m.Params.Size() - n += 1 + l + sovGenesis(uint64(l)) l = len(m.PortId) if l > 0 { n += 1 + l + sovGenesis(uint64(l)) @@ -205,39 +182,6 @@ func (m *GenesisState) Unmarshal(dAtA []byte) error { } switch fieldNum { case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Params", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenesis - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenesis - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Params.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field PortId", wireType) } diff --git a/x/zoneconcierge/types/params.go b/x/zoneconcierge/types/params.go deleted file mode 100644 index 357196ad6..000000000 --- a/x/zoneconcierge/types/params.go +++ /dev/null @@ -1,39 +0,0 @@ -package types - -import ( - paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" - "gopkg.in/yaml.v2" -) - -var _ paramtypes.ParamSet = (*Params)(nil) - -// ParamKeyTable the param key table for launch module -func ParamKeyTable() paramtypes.KeyTable { - return paramtypes.NewKeyTable().RegisterParamSet(&Params{}) -} - -// NewParams creates a new Params instance -func NewParams() Params { - return Params{} -} - -// DefaultParams returns a default set of parameters -func DefaultParams() Params { - return NewParams() -} - -// ParamSetPairs get the params.ParamSet -func (p *Params) ParamSetPairs() paramtypes.ParamSetPairs { - return paramtypes.ParamSetPairs{} -} - -// Validate validates the set of params -func (p Params) Validate() error { - return nil -} - -// String implements the Stringer interface. -func (p Params) String() string { - out, _ := yaml.Marshal(p) - return string(out) -} diff --git a/x/zoneconcierge/types/params.pb.go b/x/zoneconcierge/types/params.pb.go deleted file mode 100644 index a7f83a9fe..000000000 --- a/x/zoneconcierge/types/params.pb.go +++ /dev/null @@ -1,267 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: babylon/zoneconcierge/v1/params.proto - -package types - -import ( - fmt "fmt" - _ "github.com/cosmos/gogoproto/gogoproto" - proto "github.com/cosmos/gogoproto/proto" - io "io" - math "math" - math_bits "math/bits" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package - -// Params defines the parameters for the module. -type Params struct { -} - -func (m *Params) Reset() { *m = Params{} } -func (*Params) ProtoMessage() {} -func (*Params) Descriptor() ([]byte, []int) { - return fileDescriptor_c0696c936eb15fe4, []int{0} -} -func (m *Params) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Params) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Params.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 *Params) XXX_Merge(src proto.Message) { - xxx_messageInfo_Params.Merge(m, src) -} -func (m *Params) XXX_Size() int { - return m.Size() -} -func (m *Params) XXX_DiscardUnknown() { - xxx_messageInfo_Params.DiscardUnknown(m) -} - -var xxx_messageInfo_Params proto.InternalMessageInfo - -func init() { - proto.RegisterType((*Params)(nil), "babylon.zoneconcierge.v1.Params") -} - -func init() { - proto.RegisterFile("babylon/zoneconcierge/v1/params.proto", fileDescriptor_c0696c936eb15fe4) -} - -var fileDescriptor_c0696c936eb15fe4 = []byte{ - // 163 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x4d, 0x4a, 0x4c, 0xaa, - 0xcc, 0xc9, 0xcf, 0xd3, 0xaf, 0xca, 0xcf, 0x4b, 0x4d, 0xce, 0xcf, 0x4b, 0xce, 0x4c, 0x2d, 0x4a, - 0x4f, 0xd5, 0x2f, 0x33, 0xd4, 0x2f, 0x48, 0x2c, 0x4a, 0xcc, 0x2d, 0xd6, 0x2b, 0x28, 0xca, 0x2f, - 0xc9, 0x17, 0x92, 0x80, 0x2a, 0xd3, 0x43, 0x51, 0xa6, 0x57, 0x66, 0x28, 0x25, 0x92, 0x9e, 0x9f, - 0x9e, 0x0f, 0x56, 0xa4, 0x0f, 0x62, 0x41, 0xd4, 0x2b, 0xf1, 0x71, 0xb1, 0x05, 0x80, 0xf5, 0x5b, - 0xb1, 0xcc, 0x58, 0x20, 0xcf, 0xe0, 0xe4, 0x7f, 0xe2, 0x91, 0x1c, 0xe3, 0x85, 0x47, 0x72, 0x8c, - 0x0f, 0x1e, 0xc9, 0x31, 0x4e, 0x78, 0x2c, 0xc7, 0x70, 0xe1, 0xb1, 0x1c, 0xc3, 0x8d, 0xc7, 0x72, - 0x0c, 0x51, 0xa6, 0xe9, 0x99, 0x25, 0x19, 0xa5, 0x49, 0x7a, 0xc9, 0xf9, 0xb9, 0xfa, 0x50, 0x4b, - 0x92, 0x33, 0x12, 0x33, 0xf3, 0x60, 0x1c, 0xfd, 0x0a, 0x34, 0xa7, 0x95, 0x54, 0x16, 0xa4, 0x16, - 0x27, 0xb1, 0x81, 0xed, 0x31, 0x06, 0x04, 0x00, 0x00, 0xff, 0xff, 0x7f, 0x50, 0xb4, 0xe9, 0xc0, - 0x00, 0x00, 0x00, -} - -func (m *Params) 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 *Params) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Params) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - return len(dAtA) - i, nil -} - -func encodeVarintParams(dAtA []byte, offset int, v uint64) int { - offset -= sovParams(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func (m *Params) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - return n -} - -func sovParams(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozParams(x uint64) (n int) { - return sovParams(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (m *Params) 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 ErrIntOverflowParams - } - 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: Params: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Params: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipParams(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthParams - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func skipParams(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - depth := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowParams - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - wireType := int(wire & 0x7) - switch wireType { - case 0: - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowParams - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - case 1: - iNdEx += 8 - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowParams - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if length < 0 { - return 0, ErrInvalidLengthParams - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupParams - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthParams - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthParams = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowParams = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupParams = fmt.Errorf("proto: unexpected end of group") -) diff --git a/x/zoneconcierge/types/query.pb.go b/x/zoneconcierge/types/query.pb.go index 5676408d9..25fd96778 100644 --- a/x/zoneconcierge/types/query.pb.go +++ b/x/zoneconcierge/types/query.pb.go @@ -33,89 +33,6 @@ var _ = math.Inf // proto package needs to be updated. const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package -// QueryParamsRequest is request type for the Query/Params RPC method. -type QueryParamsRequest struct { -} - -func (m *QueryParamsRequest) Reset() { *m = QueryParamsRequest{} } -func (m *QueryParamsRequest) String() string { return proto.CompactTextString(m) } -func (*QueryParamsRequest) ProtoMessage() {} -func (*QueryParamsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_cd665af90102da38, []int{0} -} -func (m *QueryParamsRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryParamsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryParamsRequest.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 *QueryParamsRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryParamsRequest.Merge(m, src) -} -func (m *QueryParamsRequest) XXX_Size() int { - return m.Size() -} -func (m *QueryParamsRequest) XXX_DiscardUnknown() { - xxx_messageInfo_QueryParamsRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryParamsRequest proto.InternalMessageInfo - -// QueryParamsResponse is response type for the Query/Params RPC method. -type QueryParamsResponse struct { - // params holds all the parameters of this module. - Params Params `protobuf:"bytes,1,opt,name=params,proto3" json:"params"` -} - -func (m *QueryParamsResponse) Reset() { *m = QueryParamsResponse{} } -func (m *QueryParamsResponse) String() string { return proto.CompactTextString(m) } -func (*QueryParamsResponse) ProtoMessage() {} -func (*QueryParamsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_cd665af90102da38, []int{1} -} -func (m *QueryParamsResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryParamsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryParamsResponse.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 *QueryParamsResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryParamsResponse.Merge(m, src) -} -func (m *QueryParamsResponse) XXX_Size() int { - return m.Size() -} -func (m *QueryParamsResponse) XXX_DiscardUnknown() { - xxx_messageInfo_QueryParamsResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryParamsResponse proto.InternalMessageInfo - -func (m *QueryParamsResponse) GetParams() Params { - if m != nil { - return m.Params - } - return Params{} -} - // QueryHeaderRequest is request type for the Query/Header RPC method. type QueryHeaderRequest struct { ChainId string `protobuf:"bytes,1,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` @@ -126,7 +43,7 @@ func (m *QueryHeaderRequest) Reset() { *m = QueryHeaderRequest{} } func (m *QueryHeaderRequest) String() string { return proto.CompactTextString(m) } func (*QueryHeaderRequest) ProtoMessage() {} func (*QueryHeaderRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_cd665af90102da38, []int{2} + return fileDescriptor_cd665af90102da38, []int{0} } func (m *QueryHeaderRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -169,7 +86,7 @@ func (m *QueryHeaderRequest) GetHeight() uint64 { return 0 } -// QueryParamsResponse is response type for the Query/Header RPC method. +// QueryHeaderResponse is response type for the Query/Header RPC method. type QueryHeaderResponse struct { Header *IndexedHeader `protobuf:"bytes,1,opt,name=header,proto3" json:"header,omitempty"` ForkHeaders *Forks `protobuf:"bytes,2,opt,name=fork_headers,json=forkHeaders,proto3" json:"fork_headers,omitempty"` @@ -179,7 +96,7 @@ func (m *QueryHeaderResponse) Reset() { *m = QueryHeaderResponse{} } func (m *QueryHeaderResponse) String() string { return proto.CompactTextString(m) } func (*QueryHeaderResponse) ProtoMessage() {} func (*QueryHeaderResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_cd665af90102da38, []int{3} + return fileDescriptor_cd665af90102da38, []int{1} } func (m *QueryHeaderResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -232,7 +149,7 @@ func (m *QueryChainListRequest) Reset() { *m = QueryChainListRequest{} } func (m *QueryChainListRequest) String() string { return proto.CompactTextString(m) } func (*QueryChainListRequest) ProtoMessage() {} func (*QueryChainListRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_cd665af90102da38, []int{4} + return fileDescriptor_cd665af90102da38, []int{2} } func (m *QueryChainListRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -280,7 +197,7 @@ func (m *QueryChainListResponse) Reset() { *m = QueryChainListResponse{} func (m *QueryChainListResponse) String() string { return proto.CompactTextString(m) } func (*QueryChainListResponse) ProtoMessage() {} func (*QueryChainListResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_cd665af90102da38, []int{5} + return fileDescriptor_cd665af90102da38, []int{3} } func (m *QueryChainListResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -332,7 +249,7 @@ func (m *QueryChainInfoRequest) Reset() { *m = QueryChainInfoRequest{} } func (m *QueryChainInfoRequest) String() string { return proto.CompactTextString(m) } func (*QueryChainInfoRequest) ProtoMessage() {} func (*QueryChainInfoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_cd665af90102da38, []int{6} + return fileDescriptor_cd665af90102da38, []int{4} } func (m *QueryChainInfoRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -378,7 +295,7 @@ func (m *QueryChainInfoResponse) Reset() { *m = QueryChainInfoResponse{} func (m *QueryChainInfoResponse) String() string { return proto.CompactTextString(m) } func (*QueryChainInfoResponse) ProtoMessage() {} func (*QueryChainInfoResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_cd665af90102da38, []int{7} + return fileDescriptor_cd665af90102da38, []int{5} } func (m *QueryChainInfoResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -425,7 +342,7 @@ func (m *QueryEpochChainInfoRequest) Reset() { *m = QueryEpochChainInfoR func (m *QueryEpochChainInfoRequest) String() string { return proto.CompactTextString(m) } func (*QueryEpochChainInfoRequest) ProtoMessage() {} func (*QueryEpochChainInfoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_cd665af90102da38, []int{8} + return fileDescriptor_cd665af90102da38, []int{6} } func (m *QueryEpochChainInfoRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -479,7 +396,7 @@ func (m *QueryEpochChainInfoResponse) Reset() { *m = QueryEpochChainInfo func (m *QueryEpochChainInfoResponse) String() string { return proto.CompactTextString(m) } func (*QueryEpochChainInfoResponse) ProtoMessage() {} func (*QueryEpochChainInfoResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_cd665af90102da38, []int{9} + return fileDescriptor_cd665af90102da38, []int{7} } func (m *QueryEpochChainInfoResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -526,7 +443,7 @@ func (m *QueryListHeadersRequest) Reset() { *m = QueryListHeadersRequest func (m *QueryListHeadersRequest) String() string { return proto.CompactTextString(m) } func (*QueryListHeadersRequest) ProtoMessage() {} func (*QueryListHeadersRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_cd665af90102da38, []int{10} + return fileDescriptor_cd665af90102da38, []int{8} } func (m *QueryListHeadersRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -582,7 +499,7 @@ func (m *QueryListHeadersResponse) Reset() { *m = QueryListHeadersRespon func (m *QueryListHeadersResponse) String() string { return proto.CompactTextString(m) } func (*QueryListHeadersResponse) ProtoMessage() {} func (*QueryListHeadersResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_cd665af90102da38, []int{11} + return fileDescriptor_cd665af90102da38, []int{9} } func (m *QueryListHeadersResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -636,7 +553,7 @@ func (m *QueryListEpochHeadersRequest) Reset() { *m = QueryListEpochHead func (m *QueryListEpochHeadersRequest) String() string { return proto.CompactTextString(m) } func (*QueryListEpochHeadersRequest) ProtoMessage() {} func (*QueryListEpochHeadersRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_cd665af90102da38, []int{12} + return fileDescriptor_cd665af90102da38, []int{10} } func (m *QueryListEpochHeadersRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -690,7 +607,7 @@ func (m *QueryListEpochHeadersResponse) Reset() { *m = QueryListEpochHea func (m *QueryListEpochHeadersResponse) String() string { return proto.CompactTextString(m) } func (*QueryListEpochHeadersResponse) ProtoMessage() {} func (*QueryListEpochHeadersResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_cd665af90102da38, []int{13} + return fileDescriptor_cd665af90102da38, []int{11} } func (m *QueryListEpochHeadersResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -739,7 +656,7 @@ func (m *QueryFinalizedChainInfoRequest) Reset() { *m = QueryFinalizedCh func (m *QueryFinalizedChainInfoRequest) String() string { return proto.CompactTextString(m) } func (*QueryFinalizedChainInfoRequest) ProtoMessage() {} func (*QueryFinalizedChainInfoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_cd665af90102da38, []int{14} + return fileDescriptor_cd665af90102da38, []int{12} } func (m *QueryFinalizedChainInfoRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -802,7 +719,7 @@ func (m *QueryFinalizedChainInfoResponse) Reset() { *m = QueryFinalizedC func (m *QueryFinalizedChainInfoResponse) String() string { return proto.CompactTextString(m) } func (*QueryFinalizedChainInfoResponse) ProtoMessage() {} func (*QueryFinalizedChainInfoResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_cd665af90102da38, []int{15} + return fileDescriptor_cd665af90102da38, []int{13} } func (m *QueryFinalizedChainInfoResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -887,7 +804,7 @@ func (m *QueryFinalizedChainInfoUntilHeightRequest) String() string { } func (*QueryFinalizedChainInfoUntilHeightRequest) ProtoMessage() {} func (*QueryFinalizedChainInfoUntilHeightRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_cd665af90102da38, []int{16} + return fileDescriptor_cd665af90102da38, []int{14} } func (m *QueryFinalizedChainInfoUntilHeightRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -961,7 +878,7 @@ func (m *QueryFinalizedChainInfoUntilHeightResponse) String() string { } func (*QueryFinalizedChainInfoUntilHeightResponse) ProtoMessage() {} func (*QueryFinalizedChainInfoUntilHeightResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_cd665af90102da38, []int{17} + return fileDescriptor_cd665af90102da38, []int{15} } func (m *QueryFinalizedChainInfoUntilHeightResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1026,8 +943,6 @@ func (m *QueryFinalizedChainInfoUntilHeightResponse) GetProof() *ProofFinalizedC } func init() { - proto.RegisterType((*QueryParamsRequest)(nil), "babylon.zoneconcierge.v1.QueryParamsRequest") - proto.RegisterType((*QueryParamsResponse)(nil), "babylon.zoneconcierge.v1.QueryParamsResponse") proto.RegisterType((*QueryHeaderRequest)(nil), "babylon.zoneconcierge.v1.QueryHeaderRequest") proto.RegisterType((*QueryHeaderResponse)(nil), "babylon.zoneconcierge.v1.QueryHeaderResponse") proto.RegisterType((*QueryChainListRequest)(nil), "babylon.zoneconcierge.v1.QueryChainListRequest") @@ -1051,79 +966,75 @@ func init() { } var fileDescriptor_cd665af90102da38 = []byte{ - // 1145 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x58, 0x5f, 0x6f, 0xdb, 0x54, - 0x14, 0xaf, 0xfb, 0x27, 0x6b, 0x4e, 0xd9, 0x34, 0x5d, 0xca, 0x08, 0xee, 0x96, 0x56, 0xe6, 0x5f, - 0x37, 0x15, 0x9b, 0x84, 0x8d, 0x51, 0x21, 0x31, 0x35, 0x1d, 0xed, 0xca, 0xd0, 0x58, 0x0d, 0xe5, - 0x01, 0x21, 0x45, 0xb6, 0x73, 0xe3, 0x58, 0x6d, 0x7c, 0x33, 0x5f, 0x27, 0x5b, 0x56, 0xca, 0x03, - 0x5f, 0x00, 0x24, 0x5e, 0x10, 0xaf, 0x48, 0x43, 0xe2, 0x61, 0x9f, 0x63, 0x48, 0x7b, 0x98, 0xc4, - 0x0b, 0x4f, 0x08, 0xb5, 0x7c, 0x0d, 0x24, 0xe4, 0x7b, 0xaf, 0x13, 0x3b, 0x8e, 0x17, 0x27, 0xf4, - 0x81, 0x07, 0xde, 0x72, 0xaf, 0xcf, 0xf9, 0x9d, 0xdf, 0xf9, 0x77, 0xcf, 0x51, 0xe0, 0x35, 0xd3, - 0x30, 0xbb, 0x07, 0xc4, 0xd5, 0x1e, 0x12, 0x17, 0x5b, 0xc4, 0xb5, 0x1c, 0xec, 0xd9, 0x58, 0xeb, - 0x94, 0xb4, 0x7b, 0x6d, 0xec, 0x75, 0xd5, 0x96, 0x47, 0x7c, 0x82, 0x0a, 0x42, 0x4a, 0x8d, 0x49, - 0xa9, 0x9d, 0x92, 0xbc, 0x68, 0x13, 0x9b, 0x30, 0x21, 0x2d, 0xf8, 0xc5, 0xe5, 0xe5, 0x8b, 0x36, - 0x21, 0xf6, 0x01, 0xd6, 0x8c, 0x96, 0xa3, 0x19, 0xae, 0x4b, 0x7c, 0xc3, 0x77, 0x88, 0x4b, 0xc5, - 0xd7, 0x2b, 0x16, 0xa1, 0x4d, 0x42, 0x35, 0xd3, 0xa0, 0x98, 0x9b, 0xd1, 0x3a, 0x25, 0x13, 0xfb, - 0x46, 0x49, 0x6b, 0x19, 0xb6, 0xe3, 0x32, 0x61, 0x21, 0xbb, 0x16, 0xf2, 0x33, 0x7d, 0xcb, 0x6a, - 0x60, 0x6b, 0xbf, 0x45, 0x1c, 0xd7, 0x0f, 0xf8, 0xc5, 0x2e, 0x84, 0xf4, 0xe5, 0x50, 0xba, 0xff, - 0xc5, 0x71, 0xed, 0x40, 0x3a, 0x21, 0xaa, 0x84, 0xa2, 0xb8, 0x45, 0xac, 0x86, 0x90, 0x0a, 0x7f, - 0x0b, 0x99, 0xd7, 0x53, 0x83, 0xd3, 0x32, 0x3c, 0xa3, 0x49, 0x07, 0x39, 0x26, 0xc4, 0xe2, 0xe1, - 0x62, 0xd2, 0xca, 0x22, 0xa0, 0xdd, 0xc0, 0xe7, 0xbb, 0x0c, 0x42, 0xc7, 0xf7, 0xda, 0x98, 0xfa, - 0xca, 0x1e, 0xbc, 0x18, 0xbb, 0xa5, 0x2d, 0xe2, 0x52, 0x8c, 0x3e, 0x80, 0x1c, 0x37, 0x55, 0x90, - 0x56, 0xa4, 0xd5, 0x85, 0xf2, 0x8a, 0x9a, 0x96, 0x09, 0x95, 0x6b, 0x56, 0x66, 0x9f, 0xfc, 0xb1, - 0x3c, 0xa5, 0x0b, 0x2d, 0x65, 0x5b, 0x18, 0xbb, 0x85, 0x8d, 0x1a, 0xf6, 0x84, 0x31, 0xf4, 0x0a, - 0xcc, 0x5b, 0x0d, 0xc3, 0x71, 0xab, 0x4e, 0x8d, 0xe1, 0xe6, 0xf5, 0x33, 0xec, 0xbc, 0x53, 0x43, - 0x17, 0x20, 0xd7, 0xc0, 0x8e, 0xdd, 0xf0, 0x0b, 0xd3, 0x2b, 0xd2, 0xea, 0xac, 0x2e, 0x4e, 0xca, - 0x8f, 0x92, 0x20, 0x18, 0x22, 0x09, 0x82, 0x37, 0x02, 0xf9, 0xe0, 0x46, 0x10, 0x7c, 0x33, 0x9d, - 0xe0, 0x8e, 0x5b, 0xc3, 0x0f, 0x70, 0x4d, 0x00, 0x08, 0x35, 0x54, 0x81, 0x17, 0xea, 0xc4, 0xdb, - 0xaf, 0xf2, 0x23, 0x65, 0x66, 0x17, 0xca, 0xcb, 0xe9, 0x30, 0x5b, 0xc4, 0xdb, 0xa7, 0xfa, 0x42, - 0xa0, 0xc4, 0xa1, 0xa8, 0x52, 0x85, 0x97, 0x18, 0xb7, 0xcd, 0xc0, 0x89, 0x8f, 0x1d, 0xea, 0x87, - 0x8e, 0x6e, 0x01, 0xf4, 0x2b, 0x4a, 0x30, 0x7c, 0x43, 0xe5, 0xe5, 0xa7, 0x06, 0xe5, 0xa7, 0xf2, - 0x2a, 0x17, 0xe5, 0xa7, 0xde, 0x35, 0x6c, 0x2c, 0x74, 0xf5, 0x88, 0xa6, 0xf2, 0x35, 0x5c, 0x18, - 0x34, 0x20, 0xfc, 0x5f, 0x82, 0x7c, 0x18, 0xca, 0x20, 0x47, 0x33, 0xab, 0x79, 0x7d, 0x5e, 0xc4, - 0x92, 0xa2, 0xed, 0x98, 0xf9, 0x69, 0x11, 0xa0, 0x51, 0xe6, 0x39, 0x72, 0xcc, 0x7e, 0x39, 0xea, - 0xe0, 0x8e, 0x5b, 0x27, 0xa3, 0x33, 0xa9, 0x7c, 0x19, 0xe5, 0xcc, 0x75, 0x04, 0xe7, 0x0a, 0x80, - 0x50, 0x72, 0xeb, 0x44, 0x44, 0xe5, 0xd5, 0xf4, 0x80, 0xf7, 0x01, 0xb8, 0xab, 0xc1, 0x4f, 0xe5, - 0x33, 0x90, 0x19, 0xfa, 0x87, 0x41, 0xc7, 0x24, 0x68, 0x2d, 0x41, 0x9e, 0xb5, 0x52, 0xd5, 0x6d, - 0x37, 0x99, 0x81, 0x59, 0x7d, 0x9e, 0x5d, 0xdc, 0x69, 0x37, 0x63, 0x9c, 0xa7, 0xe3, 0x9c, 0x0d, - 0x58, 0x1a, 0x8a, 0x7a, 0x8a, 0xc4, 0xbf, 0x82, 0x97, 0x99, 0x89, 0x20, 0x8b, 0xa2, 0x7e, 0x32, - 0xb4, 0xc5, 0xd6, 0x90, 0x4c, 0x4e, 0x52, 0x48, 0x8f, 0x24, 0x28, 0x24, 0xcd, 0x0b, 0xf7, 0x36, - 0xe0, 0x4c, 0xd8, 0x05, 0x41, 0x25, 0x8d, 0xd1, 0x4c, 0xa1, 0xde, 0xe9, 0x55, 0xdc, 0xe7, 0x70, - 0xb1, 0xc7, 0x93, 0x65, 0x63, 0x20, 0x56, 0x93, 0x66, 0xd8, 0x84, 0x4b, 0x29, 0xb8, 0xa7, 0x16, - 0x04, 0x65, 0x17, 0x8a, 0xcc, 0xc6, 0x96, 0xe3, 0x1a, 0x07, 0xce, 0x43, 0x5c, 0x1b, 0xa3, 0x6d, - 0xd0, 0x22, 0xcc, 0xb5, 0x3c, 0xd2, 0xc1, 0x8c, 0xf8, 0xbc, 0xce, 0x0f, 0xca, 0x4f, 0x33, 0xb0, - 0x9c, 0x8a, 0x29, 0x98, 0xef, 0xc1, 0x62, 0x3d, 0xfc, 0x5a, 0x9d, 0xac, 0x4e, 0x51, 0x3d, 0x01, - 0x8f, 0xd6, 0x01, 0x78, 0xa4, 0x19, 0x18, 0x4f, 0xa9, 0xdc, 0x03, 0xeb, 0x4d, 0xac, 0x4e, 0x49, - 0x65, 0xf1, 0xd4, 0x79, 0x5e, 0x98, 0xea, 0x1d, 0x38, 0xe7, 0x19, 0xf7, 0xab, 0xfd, 0xd9, 0x57, - 0x98, 0x19, 0x78, 0xa4, 0x63, 0x73, 0x32, 0xc0, 0xd0, 0x8d, 0xfb, 0x9b, 0xbd, 0x3b, 0xfd, 0xac, - 0x17, 0x3d, 0xa2, 0x3d, 0x40, 0xa6, 0x6f, 0x55, 0x69, 0xdb, 0x6c, 0x3a, 0x94, 0x3a, 0xc4, 0xad, - 0xee, 0xe3, 0x6e, 0x61, 0x76, 0x00, 0x33, 0x3e, 0x98, 0x3b, 0x25, 0xf5, 0xd3, 0x9e, 0xfc, 0x6d, - 0xdc, 0xd5, 0xcf, 0x9b, 0xbe, 0x15, 0xbb, 0x41, 0xdb, 0x2c, 0xe4, 0xa4, 0x5e, 0x98, 0x63, 0x48, - 0xa5, 0xe7, 0xcc, 0xb8, 0x40, 0x6c, 0x48, 0x0a, 0xb8, 0xbe, 0xe2, 0xc3, 0xe5, 0x94, 0x24, 0xed, - 0xb9, 0xbe, 0x73, 0x70, 0x8b, 0x8d, 0xb2, 0xc9, 0x87, 0x60, 0xbf, 0x36, 0x66, 0xa2, 0xb5, 0xf1, - 0x78, 0x06, 0xae, 0x64, 0x31, 0xfb, 0x7f, 0x99, 0xfc, 0x37, 0xca, 0xa4, 0xfc, 0xe8, 0x2c, 0xcc, - 0xb1, 0x84, 0xa1, 0x6f, 0x25, 0xc8, 0xf1, 0xbd, 0x09, 0xad, 0xa5, 0xc3, 0x25, 0xd7, 0x35, 0xf9, - 0xad, 0x8c, 0xd2, 0x3c, 0xe7, 0xca, 0xea, 0x37, 0xbf, 0xfd, 0xf5, 0xfd, 0xb4, 0x82, 0x56, 0xb4, - 0x11, 0x1b, 0x25, 0x7a, 0x2c, 0x41, 0x8e, 0xbf, 0x67, 0x23, 0x19, 0xc5, 0x76, 0xba, 0x91, 0x8c, - 0xe2, 0x7b, 0x9b, 0xb2, 0xcd, 0x18, 0x6d, 0xa0, 0x1b, 0xe9, 0x8c, 0xfa, 0xb5, 0xa9, 0x1d, 0x86, - 0x9d, 0x72, 0xa4, 0xf1, 0x47, 0x56, 0x3b, 0xe4, 0x2d, 0x71, 0x84, 0x7e, 0x90, 0x20, 0xdf, 0x5b, - 0x8b, 0x90, 0x36, 0x82, 0xc5, 0xe0, 0x86, 0x26, 0xbf, 0x9d, 0x5d, 0x21, 0x7b, 0x2c, 0x19, 0x5b, - 0x8a, 0x7e, 0x0e, 0xa9, 0xb1, 0x2a, 0xcf, 0x44, 0x2d, 0x32, 0x24, 0xb2, 0x51, 0x8b, 0x4e, 0x00, - 0xe5, 0x3a, 0xa3, 0x56, 0x42, 0xda, 0x98, 0x41, 0x45, 0xbf, 0x4a, 0x70, 0x2e, 0xbe, 0xf3, 0xa0, - 0xab, 0x23, 0xac, 0x0f, 0x5d, 0xbc, 0xe4, 0x6b, 0x63, 0x6a, 0x09, 0xe2, 0x1f, 0x31, 0xe2, 0x37, - 0x51, 0x65, 0xdc, 0x6a, 0x60, 0x8f, 0x08, 0xd5, 0x0e, 0x7b, 0xbb, 0xc0, 0x11, 0xfa, 0x45, 0x82, - 0x85, 0xc8, 0x76, 0x83, 0x4a, 0x23, 0x28, 0x25, 0x17, 0x31, 0xb9, 0x3c, 0x8e, 0x8a, 0x70, 0xe1, - 0x2a, 0x73, 0x41, 0x45, 0x6b, 0xe9, 0x2e, 0x88, 0xfd, 0x20, 0x1a, 0xf8, 0xa7, 0x12, 0x9c, 0x1f, - 0x5c, 0x45, 0xd0, 0xbb, 0x19, 0xcc, 0x0f, 0xd9, 0x89, 0xe4, 0xeb, 0x63, 0xeb, 0x65, 0x6f, 0xc6, - 0x24, 0xf7, 0x61, 0xb1, 0x7f, 0x2a, 0x01, 0x4a, 0xbe, 0x7b, 0xe8, 0xbd, 0x11, 0xc4, 0x52, 0x17, - 0x25, 0x79, 0x7d, 0x02, 0x4d, 0xe1, 0xd4, 0x06, 0x73, 0xea, 0x7d, 0xb4, 0x9e, 0xee, 0xd4, 0xb0, - 0x39, 0x18, 0xcd, 0xce, 0xdf, 0x12, 0x5c, 0x7a, 0xee, 0x50, 0x45, 0x9b, 0x63, 0xf3, 0x4b, 0x6e, - 0x02, 0xf2, 0xcd, 0x7f, 0x07, 0x22, 0xfc, 0xdd, 0x65, 0xfe, 0xde, 0x46, 0x3b, 0x13, 0xfb, 0xab, - 0xf1, 0x37, 0xb5, 0xf7, 0xb6, 0x56, 0x3e, 0x79, 0x72, 0x5c, 0x94, 0x9e, 0x1d, 0x17, 0xa5, 0x3f, - 0x8f, 0x8b, 0xd2, 0x77, 0x27, 0xc5, 0xa9, 0x67, 0x27, 0xc5, 0xa9, 0xdf, 0x4f, 0x8a, 0x53, 0x5f, - 0x5c, 0xb3, 0x1d, 0xbf, 0xd1, 0x36, 0x55, 0x8b, 0x34, 0x43, 0x73, 0x0c, 0xa6, 0x67, 0xfb, 0xc1, - 0x80, 0x75, 0xbf, 0xdb, 0xc2, 0xd4, 0xcc, 0xb1, 0xbf, 0x20, 0xde, 0xf9, 0x27, 0x00, 0x00, 0xff, - 0xff, 0xc0, 0x78, 0x46, 0x86, 0xf6, 0x11, 0x00, 0x00, + // 1080 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x57, 0x4f, 0x6f, 0xdc, 0x44, + 0x14, 0x8f, 0xf3, 0xaf, 0xd9, 0x97, 0x52, 0x55, 0x43, 0x28, 0x8b, 0xd3, 0x6e, 0x23, 0x83, 0x20, + 0xad, 0x82, 0xcd, 0x2e, 0x2d, 0x25, 0xe2, 0x50, 0x25, 0x29, 0x49, 0x43, 0x51, 0x69, 0x0c, 0xe1, + 0x80, 0x90, 0x56, 0xb6, 0x77, 0xd6, 0x6b, 0x25, 0x3b, 0xb3, 0xf5, 0x78, 0xb7, 0xdd, 0x86, 0x70, + 0xe0, 0x13, 0x20, 0xc1, 0x01, 0x71, 0x45, 0x02, 0x89, 0x43, 0x3f, 0x07, 0x48, 0x3d, 0x54, 0xe2, + 0xc2, 0x11, 0x25, 0x7c, 0x0d, 0x24, 0xe4, 0x99, 0xb1, 0xd7, 0x5e, 0xaf, 0xd9, 0x3f, 0xe4, 0xc0, + 0x81, 0xdb, 0xce, 0xf8, 0xbd, 0xdf, 0xfb, 0xbd, 0x3f, 0xf3, 0xde, 0x5b, 0x78, 0xcd, 0xb6, 0xec, + 0xee, 0x21, 0x25, 0xc6, 0x13, 0x4a, 0xb0, 0x43, 0x89, 0xe3, 0x61, 0xdf, 0xc5, 0x46, 0xa7, 0x6c, + 0x3c, 0x6c, 0x63, 0xbf, 0xab, 0xb7, 0x7c, 0x1a, 0x50, 0x54, 0x94, 0x52, 0x7a, 0x4a, 0x4a, 0xef, + 0x94, 0xd5, 0x25, 0x97, 0xba, 0x94, 0x0b, 0x19, 0xe1, 0x2f, 0x21, 0xaf, 0x5e, 0x76, 0x29, 0x75, + 0x0f, 0xb1, 0x61, 0xb5, 0x3c, 0xc3, 0x22, 0x84, 0x06, 0x56, 0xe0, 0x51, 0xc2, 0xe4, 0xd7, 0xeb, + 0x0e, 0x65, 0x4d, 0xca, 0x0c, 0xdb, 0x62, 0x58, 0x98, 0x31, 0x3a, 0x65, 0x1b, 0x07, 0x56, 0xd9, + 0x68, 0x59, 0xae, 0x47, 0xb8, 0xb0, 0x94, 0x5d, 0x8b, 0xf8, 0xd9, 0x81, 0xe3, 0x34, 0xb0, 0x73, + 0xd0, 0xa2, 0x1e, 0x09, 0x42, 0x7e, 0xa9, 0x0b, 0x29, 0x7d, 0x2d, 0x92, 0xee, 0x7d, 0xf1, 0x88, + 0x1b, 0x4a, 0x67, 0x44, 0xb5, 0x48, 0x14, 0xb7, 0xa8, 0xd3, 0x90, 0x52, 0xd1, 0xef, 0x7e, 0xe3, + 0x99, 0xe0, 0xa4, 0xe3, 0xc0, 0xa5, 0xb5, 0x1d, 0x40, 0x7b, 0xa1, 0x33, 0x77, 0xb1, 0x55, 0xc3, + 0xbe, 0x89, 0x1f, 0xb6, 0x31, 0x0b, 0xd0, 0x2b, 0xb0, 0xe0, 0x34, 0x2c, 0x8f, 0x54, 0xbd, 0x5a, + 0x51, 0x59, 0x51, 0x56, 0x0b, 0xe6, 0x39, 0x7e, 0xde, 0xad, 0xa1, 0x4b, 0x30, 0xdf, 0xc0, 0x9e, + 0xdb, 0x08, 0x8a, 0xd3, 0x2b, 0xca, 0xea, 0xac, 0x29, 0x4f, 0xda, 0xf7, 0x0a, 0xbc, 0x98, 0x42, + 0x62, 0x2d, 0x4a, 0x18, 0x46, 0xb7, 0x43, 0xf9, 0xf0, 0x86, 0x03, 0x2d, 0x56, 0xde, 0xd0, 0xf3, + 0xd2, 0xa2, 0xef, 0x92, 0x1a, 0x7e, 0x8c, 0x6b, 0x12, 0x40, 0xaa, 0xa1, 0x4d, 0x38, 0x5f, 0xa7, + 0xfe, 0x41, 0x55, 0x1c, 0x19, 0x37, 0xbb, 0x58, 0xb9, 0x9a, 0x0f, 0xb3, 0x4d, 0xfd, 0x03, 0x66, + 0x2e, 0x86, 0x4a, 0x02, 0x8a, 0x69, 0x55, 0x78, 0x89, 0x73, 0xdb, 0x0a, 0x9d, 0xf8, 0xd0, 0x63, + 0x41, 0xe4, 0xe8, 0x36, 0x40, 0x2f, 0x7b, 0x92, 0xe1, 0xeb, 0xba, 0x48, 0xb5, 0x1e, 0xa6, 0x5a, + 0x17, 0x15, 0x25, 0x53, 0xad, 0x3f, 0xb0, 0x5c, 0x2c, 0x75, 0xcd, 0x84, 0xa6, 0xf6, 0x25, 0x5c, + 0xea, 0x37, 0x20, 0xfd, 0x5f, 0x86, 0x42, 0x14, 0x4a, 0x56, 0x54, 0x56, 0x66, 0x56, 0x0b, 0xe6, + 0x82, 0x8c, 0x25, 0x43, 0x3b, 0x29, 0xf3, 0xd3, 0x32, 0x40, 0xc3, 0xcc, 0x0b, 0xe4, 0x94, 0xfd, + 0x4a, 0xd2, 0xc1, 0x5d, 0x52, 0xa7, 0xc3, 0x33, 0xa9, 0x7d, 0x9e, 0xe4, 0x2c, 0x74, 0x24, 0xe7, + 0x4d, 0x00, 0xa9, 0x44, 0xea, 0x54, 0x46, 0xe5, 0xd5, 0xfc, 0x80, 0xf7, 0x00, 0x84, 0xab, 0xe1, + 0x4f, 0xed, 0x13, 0x50, 0x39, 0xfa, 0xfb, 0x61, 0x75, 0x66, 0x68, 0x2d, 0x43, 0x81, 0x97, 0x6d, + 0x95, 0xb4, 0x9b, 0xdc, 0xc0, 0xac, 0xb9, 0xc0, 0x2f, 0xee, 0xb7, 0x9b, 0x29, 0xce, 0xd3, 0x69, + 0xce, 0x16, 0x2c, 0x0f, 0x44, 0x3d, 0x43, 0xe2, 0x5f, 0xc0, 0xcb, 0xdc, 0x44, 0x98, 0x45, 0x59, + 0x3f, 0x23, 0x3c, 0x8b, 0xed, 0x01, 0x99, 0x9c, 0xa4, 0x90, 0x7e, 0x54, 0xa0, 0x98, 0x35, 0x2f, + 0xdd, 0xdb, 0x80, 0x73, 0xd1, 0x2b, 0x08, 0x2b, 0x69, 0x8c, 0xc7, 0x14, 0xe9, 0x9d, 0x5d, 0xc5, + 0x7d, 0x0a, 0x97, 0x63, 0x9e, 0x3c, 0x1b, 0x7d, 0xb1, 0x9a, 0x34, 0xc3, 0x36, 0x5c, 0xc9, 0xc1, + 0x3d, 0xb3, 0x20, 0x68, 0x7b, 0x50, 0xe2, 0x36, 0xb6, 0x3d, 0x62, 0x1d, 0x7a, 0x4f, 0x70, 0x6d, + 0x8c, 0x67, 0x83, 0x96, 0x60, 0xae, 0xe5, 0xd3, 0x0e, 0xe6, 0xc4, 0x17, 0x4c, 0x71, 0xd0, 0x7e, + 0x98, 0x81, 0xab, 0xb9, 0x98, 0x92, 0xf9, 0x3e, 0x2c, 0xd5, 0xa3, 0xaf, 0xd5, 0xc9, 0xea, 0x14, + 0xd5, 0x33, 0xf0, 0x68, 0x1d, 0x40, 0x44, 0x9a, 0x83, 0x89, 0x94, 0xaa, 0x31, 0x58, 0x3c, 0x1d, + 0x3a, 0x65, 0x9d, 0xc7, 0xd3, 0x14, 0x79, 0xe1, 0xaa, 0xf7, 0xe1, 0x82, 0x6f, 0x3d, 0xaa, 0xf6, + 0xe6, 0x4c, 0x71, 0xa6, 0xaf, 0x49, 0xa7, 0x66, 0x52, 0x88, 0x61, 0x5a, 0x8f, 0xb6, 0xe2, 0x3b, + 0xf3, 0x05, 0x3f, 0x79, 0x44, 0xfb, 0x80, 0xec, 0xc0, 0xa9, 0xb2, 0xb6, 0xdd, 0xf4, 0x18, 0xf3, + 0x28, 0xa9, 0x1e, 0xe0, 0x6e, 0x71, 0xb6, 0x0f, 0x33, 0x3d, 0x04, 0x3b, 0x65, 0xfd, 0xe3, 0x58, + 0xfe, 0x1e, 0xee, 0x9a, 0x17, 0xed, 0xc0, 0x49, 0xdd, 0xa0, 0x1d, 0x1e, 0x72, 0x5a, 0x2f, 0xce, + 0x71, 0xa4, 0x72, 0x7e, 0xa4, 0x1e, 0x84, 0x62, 0x03, 0x52, 0x20, 0xf4, 0xb5, 0x00, 0xae, 0xe5, + 0x24, 0x69, 0x9f, 0x04, 0xde, 0xe1, 0x5d, 0x3e, 0xca, 0x26, 0x1f, 0x82, 0xbd, 0xda, 0x98, 0x49, + 0xd6, 0xc6, 0xd3, 0x19, 0xb8, 0x3e, 0x8a, 0xd9, 0xff, 0xcb, 0xe4, 0xbf, 0x51, 0x26, 0x95, 0x6f, + 0xcf, 0xc3, 0x1c, 0x4f, 0x18, 0x7a, 0xaa, 0xc0, 0xbc, 0xe8, 0x1e, 0x68, 0x2d, 0x1f, 0x2e, 0xbb, + 0x41, 0xa9, 0x6f, 0x8e, 0x28, 0x2d, 0x72, 0xae, 0xed, 0x7c, 0xf5, 0xdb, 0x9f, 0xdf, 0x4c, 0x6f, + 0xa0, 0xdb, 0x46, 0xee, 0xf6, 0xd6, 0xab, 0x04, 0xe3, 0x28, 0xaa, 0xcb, 0x63, 0x43, 0xb4, 0x34, + 0xe3, 0x48, 0x14, 0xe0, 0x31, 0xfa, 0x4e, 0x81, 0x42, 0xbc, 0x84, 0x20, 0x63, 0x08, 0x8b, 0xfe, + 0x7d, 0x48, 0x7d, 0x6b, 0x74, 0x05, 0xc9, 0x7c, 0x95, 0x33, 0xd7, 0xd0, 0xca, 0x10, 0xe6, 0x0c, + 0xfd, 0x14, 0x51, 0xe3, 0x35, 0x35, 0x12, 0xb5, 0x44, 0x4b, 0x1e, 0x8d, 0x5a, 0xb2, 0xdf, 0x6a, + 0xb7, 0x38, 0xb5, 0x32, 0x32, 0xc6, 0x0c, 0x2a, 0xfa, 0x55, 0x81, 0x0b, 0xe9, 0x0d, 0x03, 0xdd, + 0x18, 0x62, 0x7d, 0xe0, 0x9a, 0xa3, 0xde, 0x1c, 0x53, 0x4b, 0x12, 0xff, 0x80, 0x13, 0xbf, 0x83, + 0x36, 0xc7, 0xad, 0x06, 0xfe, 0x64, 0x99, 0x71, 0x14, 0x4f, 0xde, 0x63, 0xf4, 0xb3, 0x02, 0x8b, + 0x89, 0x5d, 0x02, 0x95, 0x87, 0x50, 0xca, 0xae, 0x3d, 0x6a, 0x65, 0x1c, 0x15, 0xe9, 0xc2, 0x0d, + 0xee, 0x82, 0x8e, 0xd6, 0xf2, 0x5d, 0x90, 0xd3, 0x38, 0x19, 0xf8, 0x67, 0x0a, 0x5c, 0xec, 0x1f, + 0xfc, 0xe8, 0x9d, 0x11, 0xcc, 0x0f, 0xd8, 0x40, 0xd4, 0x5b, 0x63, 0xeb, 0x8d, 0xfe, 0x18, 0xb3, + 0xdc, 0x07, 0xc5, 0xfe, 0x99, 0x02, 0x28, 0xdb, 0x65, 0xd0, 0xbb, 0x43, 0x88, 0xe5, 0xae, 0x25, + 0xea, 0xfa, 0x04, 0x9a, 0xd2, 0xa9, 0x0d, 0xee, 0xd4, 0x7b, 0x68, 0x3d, 0xdf, 0xa9, 0x41, 0x53, + 0x27, 0x99, 0x9d, 0xbf, 0x14, 0xb8, 0xf2, 0x8f, 0x23, 0x0c, 0x6d, 0x8d, 0xcd, 0x2f, 0x3b, 0x77, + 0xd5, 0x3b, 0xff, 0x0e, 0x44, 0xfa, 0xbb, 0xc7, 0xfd, 0xbd, 0x87, 0x76, 0x27, 0xf6, 0xd7, 0x10, + 0x3d, 0x35, 0xee, 0xad, 0x9b, 0x1f, 0xfd, 0x72, 0x52, 0x52, 0x9e, 0x9f, 0x94, 0x94, 0x3f, 0x4e, + 0x4a, 0xca, 0xd7, 0xa7, 0xa5, 0xa9, 0xe7, 0xa7, 0xa5, 0xa9, 0xdf, 0x4f, 0x4b, 0x53, 0x9f, 0xdd, + 0x74, 0xbd, 0xa0, 0xd1, 0xb6, 0x75, 0x87, 0x36, 0x23, 0x73, 0x1c, 0x26, 0xb6, 0xfd, 0xb8, 0xcf, + 0x7a, 0xd0, 0x6d, 0x61, 0x66, 0xcf, 0xf3, 0xff, 0xe0, 0x6f, 0xff, 0x1d, 0x00, 0x00, 0xff, 0xff, + 0xdc, 0x2b, 0x14, 0x99, 0xd0, 0x10, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -1138,8 +1049,6 @@ const _ = grpc.SupportPackageIsVersion4 // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. type QueryClient interface { - // Parameters queries the parameters of the module. - Params(ctx context.Context, in *QueryParamsRequest, opts ...grpc.CallOption) (*QueryParamsResponse, error) // Header queries the CZ header and fork headers at a given height. Header(ctx context.Context, in *QueryHeaderRequest, opts ...grpc.CallOption) (*QueryHeaderResponse, error) // ChainList queries the list of chains that checkpoint to Babylon @@ -1170,15 +1079,6 @@ func NewQueryClient(cc grpc1.ClientConn) QueryClient { return &queryClient{cc} } -func (c *queryClient) Params(ctx context.Context, in *QueryParamsRequest, opts ...grpc.CallOption) (*QueryParamsResponse, error) { - out := new(QueryParamsResponse) - err := c.cc.Invoke(ctx, "/babylon.zoneconcierge.v1.Query/Params", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - func (c *queryClient) Header(ctx context.Context, in *QueryHeaderRequest, opts ...grpc.CallOption) (*QueryHeaderResponse, error) { out := new(QueryHeaderResponse) err := c.cc.Invoke(ctx, "/babylon.zoneconcierge.v1.Query/Header", in, out, opts...) @@ -1253,8 +1153,6 @@ func (c *queryClient) FinalizedChainInfoUntilHeight(ctx context.Context, in *Que // QueryServer is the server API for Query service. type QueryServer interface { - // Parameters queries the parameters of the module. - Params(context.Context, *QueryParamsRequest) (*QueryParamsResponse, error) // Header queries the CZ header and fork headers at a given height. Header(context.Context, *QueryHeaderRequest) (*QueryHeaderResponse, error) // ChainList queries the list of chains that checkpoint to Babylon @@ -1281,9 +1179,6 @@ type QueryServer interface { type UnimplementedQueryServer struct { } -func (*UnimplementedQueryServer) Params(ctx context.Context, req *QueryParamsRequest) (*QueryParamsResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method Params not implemented") -} func (*UnimplementedQueryServer) Header(ctx context.Context, req *QueryHeaderRequest) (*QueryHeaderResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method Header not implemented") } @@ -1313,24 +1208,6 @@ func RegisterQueryServer(s grpc1.Server, srv QueryServer) { s.RegisterService(&_Query_serviceDesc, srv) } -func _Query_Params_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(QueryParamsRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(QueryServer).Params(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/babylon.zoneconcierge.v1.Query/Params", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(QueryServer).Params(ctx, req.(*QueryParamsRequest)) - } - return interceptor(ctx, in, info, handler) -} - func _Query_Header_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(QueryHeaderRequest) if err := dec(in); err != nil { @@ -1479,10 +1356,6 @@ var _Query_serviceDesc = grpc.ServiceDesc{ ServiceName: "babylon.zoneconcierge.v1.Query", HandlerType: (*QueryServer)(nil), Methods: []grpc.MethodDesc{ - { - MethodName: "Params", - Handler: _Query_Params_Handler, - }, { MethodName: "Header", Handler: _Query_Header_Handler, @@ -1520,62 +1393,6 @@ var _Query_serviceDesc = grpc.ServiceDesc{ Metadata: "babylon/zoneconcierge/v1/query.proto", } -func (m *QueryParamsRequest) 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 *QueryParamsRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryParamsRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - return len(dAtA) - i, nil -} - -func (m *QueryParamsResponse) 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 *QueryParamsResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryParamsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size, err := m.Params.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - func (m *QueryHeaderRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -2297,26 +2114,6 @@ func encodeVarintQuery(dAtA []byte, offset int, v uint64) int { dAtA[offset] = uint8(v) return base } -func (m *QueryParamsRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - return n -} - -func (m *QueryParamsResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.Params.Size() - n += 1 + l + sovQuery(uint64(l)) - return n -} - func (m *QueryHeaderRequest) Size() (n int) { if m == nil { return 0 @@ -2603,139 +2400,6 @@ func sovQuery(x uint64) (n int) { func sozQuery(x uint64) (n int) { return sovQuery(uint64((x << 1) ^ uint64((int64(x) >> 63)))) } -func (m *QueryParamsRequest) 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 ErrIntOverflowQuery - } - 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: QueryParamsRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryParamsRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryParamsResponse) 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 ErrIntOverflowQuery - } - 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: QueryParamsResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryParamsResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Params", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Params.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} func (m *QueryHeaderRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/x/zoneconcierge/types/query.pb.gw.go b/x/zoneconcierge/types/query.pb.gw.go index fedaaec08..8766d6fd7 100644 --- a/x/zoneconcierge/types/query.pb.gw.go +++ b/x/zoneconcierge/types/query.pb.gw.go @@ -33,24 +33,6 @@ var _ = utilities.NewDoubleArray var _ = descriptor.ForMessage var _ = metadata.Join -func request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryParamsRequest - var metadata runtime.ServerMetadata - - msg, err := client.Params(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryParamsRequest - var metadata runtime.ServerMetadata - - msg, err := server.Params(ctx, &protoReq) - return msg, metadata, err - -} - func request_Query_Header_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryHeaderRequest var metadata runtime.ServerMetadata @@ -613,29 +595,6 @@ func local_request_Query_FinalizedChainInfoUntilHeight_0(ctx context.Context, ma // Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterQueryHandlerFromEndpoint instead. func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, server QueryServer) error { - mux.Handle("GET", pattern_Query_Params_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_Params_0(rctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_Params_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - mux.Handle("GET", pattern_Query_Header_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -861,26 +820,6 @@ func RegisterQueryHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc // "QueryClient" to call the correct interceptors. func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, client QueryClient) error { - mux.Handle("GET", pattern_Query_Params_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Query_Params_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_Params_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - mux.Handle("GET", pattern_Query_Header_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -1045,8 +984,6 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie } var ( - pattern_Query_Params_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"babylon", "zoneconcierge", "v1", "params"}, "", runtime.AssumeColonVerbOpt(false))) - pattern_Query_Header_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4, 2, 5, 1, 0, 4, 1, 5, 6}, []string{"babylon", "zoneconcierge", "v1", "chain_info", "chain_id", "header", "height"}, "", runtime.AssumeColonVerbOpt(false))) pattern_Query_ChainList_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"babylon", "zoneconcierge", "v1", "chains"}, "", runtime.AssumeColonVerbOpt(false))) @@ -1065,8 +1002,6 @@ var ( ) var ( - forward_Query_Params_0 = runtime.ForwardResponseMessage - forward_Query_Header_0 = runtime.ForwardResponseMessage forward_Query_ChainList_0 = runtime.ForwardResponseMessage From 58834793e492db25380cd801379978621e6fbf9e Mon Sep 17 00:00:00 2001 From: Denis Fadeev Date: Tue, 28 Mar 2023 17:13:08 +0400 Subject: [PATCH 23/59] chore: set up OpenAPI (#339) --- app/app.go | 20 +---- client/docs/docs.go | 37 ++++++++ client/docs/swagger-ui/swagger.yaml | 135 ++++++++++++++++++++++------ client/docs/template/index.tpl | 23 +++++ 4 files changed, 170 insertions(+), 45 deletions(-) create mode 100644 client/docs/docs.go create mode 100644 client/docs/template/index.tpl diff --git a/app/app.go b/app/app.go index c68662f7e..5c333acd9 100644 --- a/app/app.go +++ b/app/app.go @@ -4,7 +4,6 @@ import ( "encoding/json" "fmt" "io" - "net/http" "os" "path/filepath" @@ -13,6 +12,7 @@ import ( nodeservice "github.com/cosmos/cosmos-sdk/client/grpc/node" + "github.com/babylonchain/babylon/client/docs" bbn "github.com/babylonchain/babylon/types" runtimeservices "github.com/cosmos/cosmos-sdk/runtime/services" consensusparamkeeper "github.com/cosmos/cosmos-sdk/x/consensus/keeper" @@ -25,8 +25,6 @@ import ( "github.com/cometbft/cometbft/libs/log" tmos "github.com/cometbft/cometbft/libs/os" ibcclientclient "github.com/cosmos/ibc-go/v7/modules/core/02-client/client" - "github.com/gorilla/mux" - "github.com/rakyll/statik/fs" "github.com/spf13/cast" errorsmod "cosmossdk.io/errors" @@ -98,9 +96,6 @@ import ( appparams "github.com/babylonchain/babylon/app/params" - // unnamed import of statik for swagger UI support - _ "github.com/cosmos/cosmos-sdk/client/docs/statik" - storetypes "github.com/cosmos/cosmos-sdk/store/types" govclient "github.com/cosmos/cosmos-sdk/x/gov/client" govv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" @@ -864,7 +859,7 @@ func (app *BabylonApp) RegisterAPIRoutes(apiSvr *api.Server, apiConfig config.AP // register swagger API from root so that other applications can override easily if apiConfig.Swagger { - RegisterSwaggerAPI(clientCtx, apiSvr.Router) + docs.RegisterOpenAPIService(apiSvr.Router) } } @@ -900,17 +895,6 @@ func (app *BabylonApp) TxConfig() client.TxConfig { return app.txConfig } -// RegisterSwaggerAPI registers swagger route with API Server -func RegisterSwaggerAPI(ctx client.Context, rtr *mux.Router) { - statikFS, err := fs.New() - if err != nil { - panic(err) - } - - staticServer := http.FileServer(statikFS) - rtr.PathPrefix("/swagger/").Handler(http.StripPrefix("/swagger/", staticServer)) -} - // GetMaccPerms returns a copy of the module account permissions func GetMaccPerms() map[string][]string { dupMaccPerms := make(map[string][]string) diff --git a/client/docs/docs.go b/client/docs/docs.go new file mode 100644 index 000000000..9ee6e12cc --- /dev/null +++ b/client/docs/docs.go @@ -0,0 +1,37 @@ +package docs + +import ( + "embed" + "html/template" + "net/http" + + "github.com/gorilla/mux" +) + +const ( + apiFile = "/swagger-ui/swagger.yaml" + indexFile = "template/index.tpl" +) + +//go:embed swagger-ui +var staticFS embed.FS + +//go:embed template +var templateFS embed.FS + +func RegisterOpenAPIService(router *mux.Router) { + router.Handle(apiFile, http.FileServer(http.FS(staticFS))) + router.HandleFunc("/", openAPIHandler()) +} + +func openAPIHandler() http.HandlerFunc { + tmpl, _ := template.ParseFS(templateFS, indexFile) + + return func(w http.ResponseWriter, req *http.Request) { + tmpl.Execute(w, struct { + URL string + }{ + apiFile, + }) + } +} diff --git a/client/docs/swagger-ui/swagger.yaml b/client/docs/swagger-ui/swagger.yaml index c3c31aa5b..5d1af6845 100644 --- a/client/docs/swagger-ui/swagger.yaml +++ b/client/docs/swagger-ui/swagger.yaml @@ -1327,6 +1327,10 @@ paths: if (any.is(Foo.class)) { foo = any.unpack(Foo.class); } + // or ... + if (any.isSameTypeAs(Foo.getDefaultInstance())) { + foo = any.unpack(Foo.getDefaultInstance()); + } Example 3: Pack and unpack a message in Python. @@ -1366,7 +1370,6 @@ paths: name "y.z". - JSON @@ -1580,6 +1583,10 @@ paths: if (any.is(Foo.class)) { foo = any.unpack(Foo.class); } + // or ... + if (any.isSameTypeAs(Foo.getDefaultInstance())) { + foo = any.unpack(Foo.getDefaultInstance()); + } Example 3: Pack and unpack a message in Python. @@ -1619,7 +1626,6 @@ paths: name "y.z". - JSON @@ -2023,6 +2029,10 @@ paths: if (any.is(Foo.class)) { foo = any.unpack(Foo.class); } + // or ... + if (any.isSameTypeAs(Foo.getDefaultInstance())) { + foo = any.unpack(Foo.getDefaultInstance()); + } Example 3: Pack and unpack a message in Python. @@ -2062,7 +2072,6 @@ paths: name "y.z". - JSON @@ -2481,6 +2490,10 @@ paths: if (any.is(Foo.class)) { foo = any.unpack(Foo.class); } + // or ... + if (any.isSameTypeAs(Foo.getDefaultInstance())) { + foo = any.unpack(Foo.getDefaultInstance()); + } Example 3: Pack and unpack a message in Python. @@ -2520,7 +2533,6 @@ paths: name "y.z". - JSON @@ -2762,6 +2774,10 @@ paths: if (any.is(Foo.class)) { foo = any.unpack(Foo.class); } + // or ... + if (any.isSameTypeAs(Foo.getDefaultInstance())) { + foo = any.unpack(Foo.getDefaultInstance()); + } Example 3: Pack and unpack a message in Python. @@ -2801,7 +2817,6 @@ paths: name "y.z". - JSON @@ -3101,6 +3116,10 @@ paths: if (any.is(Foo.class)) { foo = any.unpack(Foo.class); } + // or ... + if (any.isSameTypeAs(Foo.getDefaultInstance())) { + foo = any.unpack(Foo.getDefaultInstance()); + } Example 3: Pack and unpack a message in Python. @@ -3140,7 +3159,6 @@ paths: name "y.z". - JSON @@ -3417,6 +3435,10 @@ paths: if (any.is(Foo.class)) { foo = any.unpack(Foo.class); } + // or ... + if (any.isSameTypeAs(Foo.getDefaultInstance())) { + foo = any.unpack(Foo.getDefaultInstance()); + } Example 3: Pack and unpack a message in Python. @@ -3456,7 +3478,6 @@ paths: name "y.z". - JSON @@ -3772,6 +3793,10 @@ paths: if (any.is(Foo.class)) { foo = any.unpack(Foo.class); } + // or ... + if (any.isSameTypeAs(Foo.getDefaultInstance())) { + foo = any.unpack(Foo.getDefaultInstance()); + } Example 3: Pack and unpack a message in Python. @@ -3812,7 +3837,6 @@ paths: name "y.z". - JSON @@ -4118,6 +4142,10 @@ paths: if (any.is(Foo.class)) { foo = any.unpack(Foo.class); } + // or ... + if (any.isSameTypeAs(Foo.getDefaultInstance())) { + foo = any.unpack(Foo.getDefaultInstance()); + } Example 3: Pack and unpack a message in Python. @@ -4157,7 +4185,6 @@ paths: name "y.z". - JSON @@ -4403,6 +4430,10 @@ paths: if (any.is(Foo.class)) { foo = any.unpack(Foo.class); } + // or ... + if (any.isSameTypeAs(Foo.getDefaultInstance())) { + foo = any.unpack(Foo.getDefaultInstance()); + } Example 3: Pack and unpack a message in Python. @@ -4442,7 +4473,6 @@ paths: name "y.z". - JSON @@ -4652,6 +4682,10 @@ paths: if (any.is(Foo.class)) { foo = any.unpack(Foo.class); } + // or ... + if (any.isSameTypeAs(Foo.getDefaultInstance())) { + foo = any.unpack(Foo.getDefaultInstance()); + } Example 3: Pack and unpack a message in Python. @@ -4691,7 +4725,6 @@ paths: name "y.z". - JSON @@ -5957,6 +5990,10 @@ paths: if (any.is(Foo.class)) { foo = any.unpack(Foo.class); } + // or ... + if (any.isSameTypeAs(Foo.getDefaultInstance())) { + foo = any.unpack(Foo.getDefaultInstance()); + } Example 3: Pack and unpack a message in Python. @@ -5996,7 +6033,6 @@ paths: name "y.z". - JSON @@ -6469,6 +6505,10 @@ paths: if (any.is(Foo.class)) { foo = any.unpack(Foo.class); } + // or ... + if (any.isSameTypeAs(Foo.getDefaultInstance())) { + foo = any.unpack(Foo.getDefaultInstance()); + } Example 3: Pack and unpack a message in Python. @@ -6508,7 +6548,6 @@ paths: name "y.z". - JSON @@ -6958,6 +6997,10 @@ paths: if (any.is(Foo.class)) { foo = any.unpack(Foo.class); } + // or ... + if (any.isSameTypeAs(Foo.getDefaultInstance())) { + foo = any.unpack(Foo.getDefaultInstance()); + } Example 3: Pack and unpack a message in Python. @@ -6997,7 +7040,6 @@ paths: name "y.z". - JSON @@ -7210,6 +7252,10 @@ paths: if (any.is(Foo.class)) { foo = any.unpack(Foo.class); } + // or ... + if (any.isSameTypeAs(Foo.getDefaultInstance())) { + foo = any.unpack(Foo.getDefaultInstance()); + } Example 3: Pack and unpack a message in Python. @@ -7249,7 +7295,6 @@ paths: name "y.z". - JSON @@ -8241,6 +8286,10 @@ paths: if (any.is(Foo.class)) { foo = any.unpack(Foo.class); } + // or ... + if (any.isSameTypeAs(Foo.getDefaultInstance())) { + foo = any.unpack(Foo.getDefaultInstance()); + } Example 3: Pack and unpack a message in Python. @@ -8280,7 +8329,6 @@ paths: name "y.z". - JSON @@ -9232,6 +9280,10 @@ paths: if (any.is(Foo.class)) { foo = any.unpack(Foo.class); } + // or ... + if (any.isSameTypeAs(Foo.getDefaultInstance())) { + foo = any.unpack(Foo.getDefaultInstance()); + } Example 3: Pack and unpack a message in Python. @@ -9271,7 +9323,6 @@ paths: name "y.z". - JSON @@ -9617,6 +9668,10 @@ paths: if (any.is(Foo.class)) { foo = any.unpack(Foo.class); } + // or ... + if (any.isSameTypeAs(Foo.getDefaultInstance())) { + foo = any.unpack(Foo.getDefaultInstance()); + } Example 3: Pack and unpack a message in Python. @@ -9656,7 +9711,6 @@ paths: name "y.z". - JSON @@ -10009,6 +10063,10 @@ paths: if (any.is(Foo.class)) { foo = any.unpack(Foo.class); } + // or ... + if (any.isSameTypeAs(Foo.getDefaultInstance())) { + foo = any.unpack(Foo.getDefaultInstance()); + } Example 3: Pack and unpack a message in Python. @@ -10048,7 +10106,6 @@ paths: name "y.z". - JSON @@ -10228,6 +10285,10 @@ paths: if (any.is(Foo.class)) { foo = any.unpack(Foo.class); } + // or ... + if (any.isSameTypeAs(Foo.getDefaultInstance())) { + foo = any.unpack(Foo.getDefaultInstance()); + } Example 3: Pack and unpack a message in Python. @@ -10267,7 +10328,6 @@ paths: name "y.z". - JSON @@ -11110,6 +11170,10 @@ definitions: if (any.is(Foo.class)) { foo = any.unpack(Foo.class); } + // or ... + if (any.isSameTypeAs(Foo.getDefaultInstance())) { + foo = any.unpack(Foo.getDefaultInstance()); + } Example 3: Pack and unpack a message in Python. @@ -11145,7 +11209,6 @@ definitions: name "y.z". - JSON @@ -11286,6 +11349,10 @@ definitions: if (any.is(Foo.class)) { foo = any.unpack(Foo.class); } + // or ... + if (any.isSameTypeAs(Foo.getDefaultInstance())) { + foo = any.unpack(Foo.getDefaultInstance()); + } Example 3: Pack and unpack a message in Python. @@ -11321,7 +11388,6 @@ definitions: name "y.z". - JSON @@ -12294,6 +12360,10 @@ definitions: if (any.is(Foo.class)) { foo = any.unpack(Foo.class); } + // or ... + if (any.isSameTypeAs(Foo.getDefaultInstance())) { + foo = any.unpack(Foo.getDefaultInstance()); + } Example 3: Pack and unpack a message in Python. @@ -12333,7 +12403,6 @@ definitions: name "y.z". - JSON @@ -12980,6 +13049,10 @@ definitions: if (any.is(Foo.class)) { foo = any.unpack(Foo.class); } + // or ... + if (any.isSameTypeAs(Foo.getDefaultInstance())) { + foo = any.unpack(Foo.getDefaultInstance()); + } Example 3: Pack and unpack a message in Python. @@ -13019,7 +13092,6 @@ definitions: name "y.z". - JSON @@ -13437,6 +13509,10 @@ definitions: if (any.is(Foo.class)) { foo = any.unpack(Foo.class); } + // or ... + if (any.isSameTypeAs(Foo.getDefaultInstance())) { + foo = any.unpack(Foo.getDefaultInstance()); + } Example 3: Pack and unpack a message in Python. @@ -13473,7 +13549,6 @@ definitions: name "y.z". - JSON @@ -13795,6 +13870,10 @@ definitions: if (any.is(Foo.class)) { foo = any.unpack(Foo.class); } + // or ... + if (any.isSameTypeAs(Foo.getDefaultInstance())) { + foo = any.unpack(Foo.getDefaultInstance()); + } Example 3: Pack and unpack a message in Python. @@ -13834,7 +13913,6 @@ definitions: name "y.z". - JSON @@ -14281,6 +14359,10 @@ definitions: if (any.is(Foo.class)) { foo = any.unpack(Foo.class); } + // or ... + if (any.isSameTypeAs(Foo.getDefaultInstance())) { + foo = any.unpack(Foo.getDefaultInstance()); + } Example 3: Pack and unpack a message in Python. @@ -14316,7 +14398,6 @@ definitions: name "y.z". - JSON diff --git a/client/docs/template/index.tpl b/client/docs/template/index.tpl new file mode 100644 index 000000000..f228fc71d --- /dev/null +++ b/client/docs/template/index.tpl @@ -0,0 +1,23 @@ + + + + + + + + +
+ + + + + From 2681179e44463758c690cbbf5300f3fd8f306923 Mon Sep 17 00:00:00 2001 From: KonradStaniec Date: Wed, 29 Mar 2023 03:41:39 +0200 Subject: [PATCH 24/59] Integrate wasmd (#324) * Wire up wasmd --- Makefile | 4 + app/app.go | 159 ++++++++++++++++++++-- app/app_test.go | 2 +- app/test_helpers.go | 4 +- client/docs/docs.go | 2 +- cmd/babylond/cmd/custom_babylon_config.go | 6 +- cmd/babylond/cmd/root.go | 15 +- contrib/images/babylond-dlv/Dockerfile | 15 +- contrib/images/babylond-env/Dockerfile | 15 +- go.mod | 12 +- go.sum | 7 + simapp/sim_bench_test.go | 4 + simapp/sim_test.go | 12 +- 13 files changed, 223 insertions(+), 34 deletions(-) diff --git a/Makefile b/Makefile index 95613c928..dac0844f3 100644 --- a/Makefile +++ b/Makefile @@ -92,6 +92,10 @@ ifeq (boltdb,$(findstring boltdb,$(BABYLON_BUILD_OPTIONS))) ldflags += -X github.com/cosmos/cosmos-sdk/types.DBBackend=boltdb endif +ifeq ($(LINK_STATICALLY),true) + ldflags += -linkmode=external -extldflags "-Wl,-z,muldefs -static" +endif + ifeq (,$(findstring nostrip,$(BABYLON_BUILD_OPTIONS))) ldflags += -w -s endif diff --git a/app/app.go b/app/app.go index 5c333acd9..b67bf92ba 100644 --- a/app/app.go +++ b/app/app.go @@ -6,15 +6,21 @@ import ( "io" "os" "path/filepath" + "strings" autocliv1 "cosmossdk.io/api/cosmos/autocli/v1" reflectionv1 "cosmossdk.io/api/cosmos/reflection/v1" - nodeservice "github.com/cosmos/cosmos-sdk/client/grpc/node" + wasmapp "github.com/CosmWasm/wasmd/app" + "github.com/CosmWasm/wasmd/x/wasm" + wasmclient "github.com/CosmWasm/wasmd/x/wasm/client" + wasmkeeper "github.com/CosmWasm/wasmd/x/wasm/keeper" "github.com/babylonchain/babylon/client/docs" bbn "github.com/babylonchain/babylon/types" + nodeservice "github.com/cosmos/cosmos-sdk/client/grpc/node" runtimeservices "github.com/cosmos/cosmos-sdk/runtime/services" + "github.com/cosmos/cosmos-sdk/x/consensus" consensusparamkeeper "github.com/cosmos/cosmos-sdk/x/consensus/keeper" consensusparamtypes "github.com/cosmos/cosmos-sdk/x/consensus/types" ibcclient "github.com/cosmos/ibc-go/v7/modules/core/02-client" @@ -24,6 +30,7 @@ import ( abci "github.com/cometbft/cometbft/abci/types" "github.com/cometbft/cometbft/libs/log" tmos "github.com/cometbft/cometbft/libs/os" + tmproto "github.com/cometbft/cometbft/proto/tendermint/types" ibcclientclient "github.com/cosmos/ibc-go/v7/modules/core/02-client/client" "github.com/spf13/cast" @@ -97,7 +104,6 @@ import ( appparams "github.com/babylonchain/babylon/app/params" storetypes "github.com/cosmos/cosmos-sdk/store/types" - govclient "github.com/cosmos/cosmos-sdk/x/gov/client" govv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" "github.com/babylonchain/babylon/x/btccheckpoint" @@ -139,6 +145,12 @@ const ( // From cosmos version 0.46 is is possible to have custom prefix for application // enviromental variables - https://github.com/cosmos/cosmos-sdk/pull/10950 BabylonAppEnvPrefix = "" + + // TODO review possible capabilities + // The last arguments can contain custom message handlers, and custom query handlers, + // if we want to allow any custom callbacks + // See https://github.com/CosmWasm/cosmwasm/blob/main/docs/CAPABILITIES-BUILT-IN.md + wasmCapabilities = "iterator,staking,stargate,cosmwasm_1_1,cosmwasm_1_2" ) var ( @@ -156,15 +168,17 @@ var ( mint.AppModuleBasic{}, distr.AppModuleBasic{}, gov.NewAppModuleBasic( - []govclient.ProposalHandler{ + append( + wasmclient.ProposalHandlers, paramsclient.ProposalHandler, upgradeclient.LegacyProposalHandler, upgradeclient.LegacyCancelProposalHandler, ibcclientclient.UpdateClientProposalHandler, ibcclientclient.UpgradeProposalHandler, - }, + ), ), params.AppModuleBasic{}, + consensus.AppModuleBasic{}, crisis.AppModuleBasic{}, slashing.AppModuleBasic{}, feegrantmodule.AppModuleBasic{}, @@ -172,6 +186,7 @@ var ( evidence.AppModuleBasic{}, authzmodule.AppModuleBasic{}, vesting.AppModuleBasic{}, + wasm.AppModuleBasic{}, // Babylon modules epoching.AppModuleBasic{}, @@ -201,6 +216,46 @@ var ( } ) +// Wasm related variables +var ( + // WasmProposalsEnabled enables all x/wasm proposals when its value is "true" + // and EnableSpecificWasmProposals is empty. Otherwise, all x/wasm proposals + // are disabled. + WasmProposalsEnabled = "true" + + // EnableSpecificWasmProposals, if set, must be comma-separated list of values + // that are all a subset of "EnableAllProposals", which takes precedence over + // WasmProposalsEnabled. + // + // See: https://github.com/CosmWasm/wasmd/blob/02a54d33ff2c064f3539ae12d75d027d9c665f05/x/wasm/internal/types/proposal.go#L28-L34 + EnableSpecificWasmProposals = "" + + // EmptyWasmOpts defines a type alias for a list of wasm options. + EmptyWasmOpts []wasm.Option +) + +// GetWasmEnabledProposals parses the WasmProposalsEnabled and +// EnableSpecificWasmProposals values to produce a list of enabled proposals to +// pass into the application. +func GetWasmEnabledProposals() []wasm.ProposalType { + if EnableSpecificWasmProposals == "" { + if WasmProposalsEnabled == "true" { + return wasm.EnableAllProposals + } + + return wasm.DisableAllProposals + } + + chunks := strings.Split(EnableSpecificWasmProposals, ",") + + proposals, err := wasm.ConvertToProposals(chunks) + if err != nil { + panic(err) + } + + return proposals +} + var ( _ App = (*BabylonApp)(nil) _ servertypes.Application = (*BabylonApp)(nil) @@ -253,10 +308,12 @@ type BabylonApp struct { TransferKeeper ibctransferkeeper.Keeper // for cross-chain fungible token transfers ZoneConciergeKeeper zckeeper.Keeper // for cross-chain fungible token transfers + WasmKeeper wasm.Keeper // make scoped keepers public for test purposes ScopedIBCKeeper capabilitykeeper.ScopedKeeper ScopedTransferKeeper capabilitykeeper.ScopedKeeper ScopedZoneConciergeKeeper capabilitykeeper.ScopedKeeper + ScopedWasmKeeper capabilitykeeper.ScopedKeeper // the module manager mm *module.Manager @@ -282,7 +339,10 @@ func init() { func NewBabylonApp( logger log.Logger, db dbm.DB, traceStore io.Writer, loadLatest bool, skipUpgradeHeights map[int64]bool, homePath string, invCheckPeriod uint, encodingConfig appparams.EncodingConfig, privSigner *PrivSigner, - appOpts servertypes.AppOptions, baseAppOptions ...func(*baseapp.BaseApp), + appOpts servertypes.AppOptions, + wasmEnabledProposals []wasm.ProposalType, + wasmOpts []wasm.Option, + baseAppOptions ...func(*baseapp.BaseApp), ) *BabylonApp { // we could also take it from global object which should be initilised in rootCmd // but this way it makes babylon app more testable @@ -315,7 +375,9 @@ func NewBabylonApp( ibcexported.StoreKey, ibctransfertypes.StoreKey, zctypes.StoreKey, + wasm.StoreKey, ) + tkeys := sdk.NewTransientStoreKeys( paramstypes.TStoreKey, btccheckpointtypes.TStoreKey) // NOTE: The testingkey is just mounted for testing purposes. Actual applications should @@ -345,6 +407,7 @@ func NewBabylonApp( scopedIBCKeeper := app.CapabilityKeeper.ScopeToModule(ibcexported.ModuleName) scopedTransferKeeper := app.CapabilityKeeper.ScopeToModule(ibctransfertypes.ModuleName) scopedZoneConciergeKeeper := app.CapabilityKeeper.ScopeToModule(zctypes.ModuleName) + scopedWasmKeeper := app.CapabilityKeeper.ScopeToModule(wasm.ModuleName) // Applications that wish to enforce statically created ScopedKeepers should call `Seal` after creating // their scoped modules in `NewApp` with `ScopeToModule` @@ -555,6 +618,40 @@ func NewBabylonApp( // If evidence needs to be handled for the app, set routes in router here and seal app.EvidenceKeeper = *evidenceKeeper + wasmDir := filepath.Join(homePath, "wasm") + wasmConfig, err := wasm.ReadWasmConfig(appOpts) + if err != nil { + panic(fmt.Sprintf("error while reading wasm config: %s", err)) + } + + app.WasmKeeper = wasm.NewKeeper( + appCodec, + keys[wasm.StoreKey], + app.AccountKeeper, + app.BankKeeper, + app.StakingKeeper, + distrkeeper.NewQuerier(app.DistrKeeper), + app.IBCKeeper.ChannelKeeper, + &app.IBCKeeper.PortKeeper, + scopedWasmKeeper, + app.TransferKeeper, + app.MsgServiceRouter(), + app.GRPCQueryRouter(), + wasmDir, + wasmConfig, + wasmCapabilities, + authtypes.NewModuleAddress(govtypes.ModuleName).String(), + wasmOpts..., + ) + + // The gov proposal types can be individually enabled + if len(wasmEnabledProposals) != 0 { + govRouter.AddRoute(wasm.RouterKey, wasm.NewWasmProposalHandler(app.WasmKeeper, wasmEnabledProposals)) + } + + // Set legacy router for backwards compatibility with gov v1beta1 + app.GovKeeper.SetLegacyRouter(govRouter) + /**** Module Options ****/ // NOTE: we may consider parsing `appOpts` inside module constructors. For the moment @@ -582,7 +679,9 @@ func NewBabylonApp( upgrade.NewAppModule(app.UpgradeKeeper), evidence.NewAppModule(app.EvidenceKeeper), params.NewAppModule(app.ParamsKeeper), + consensus.NewAppModule(appCodec, app.ConsensusParamsKeeper), authzmodule.NewAppModule(appCodec, app.AuthzKeeper, app.AccountKeeper, app.BankKeeper, app.interfaceRegistry), + wasm.NewAppModule(appCodec, &app.WasmKeeper, app.StakingKeeper, app.AccountKeeper, app.BankKeeper, app.MsgServiceRouter(), app.GetSubspace(wasm.ModuleName)), // Babylon modules epoching.NewAppModule(appCodec, app.EpochingKeeper, app.AccountKeeper, app.BankKeeper, app.StakingKeeper), btclightclient.NewAppModule(appCodec, app.BTCLightClientKeeper, app.AccountKeeper, app.BankKeeper), @@ -616,6 +715,7 @@ func NewBabylonApp( ibcexported.ModuleName, ibctransfertypes.ModuleName, zctypes.ModuleName, + wasm.ModuleName, ) // TODO: there will be an architecture design on whether to modify slashing/evidence, specifically // - how many validators can we slash in a single epoch and @@ -639,6 +739,7 @@ func NewBabylonApp( ibcexported.ModuleName, ibctransfertypes.ModuleName, zctypes.ModuleName, + wasm.ModuleName, ) // Babylon does not want EndBlock processing in staking app.mm.OrderEndBlockers = append(app.mm.OrderEndBlockers[:2], app.mm.OrderEndBlockers[2+1:]...) // remove stakingtypes.ModuleName @@ -664,6 +765,7 @@ func NewBabylonApp( ibcexported.ModuleName, ibctransfertypes.ModuleName, zctypes.ModuleName, + wasm.ModuleName, ) // Uncomment if you want to set a custom migration order here. @@ -705,20 +807,31 @@ func NewBabylonApp( app.SetBeginBlocker(app.BeginBlocker) // initialize AnteHandler, which includes - // - authAnteHandler: the default AnteHandler created by `auth.ante.NewAnteHandler` + // - authAnteHandler + // - custom wasm ante handler NewLimitSimulationGasDecorator and NewCountTXDecorator // - Extra decorators introduced in Babylon, such as DropValidatorMsgDecorator that delays validator-related messages - authAnteHandler, err := ante.NewAnteHandler( - ante.HandlerOptions{ - AccountKeeper: app.AccountKeeper, - BankKeeper: app.BankKeeper, - SignModeHandler: encodingConfig.TxConfig.SignModeHandler(), - FeegrantKeeper: app.FeeGrantKeeper, - SigGasConsumer: ante.DefaultSigVerificationGasConsumer, + // + // We are using constructor from wasmapp as it introduces custom wasm ante handle decorators + // early in chain of ante handlers. + authAnteHandler, err := wasmapp.NewAnteHandler( + wasmapp.HandlerOptions{ + HandlerOptions: ante.HandlerOptions{ + AccountKeeper: app.AccountKeeper, + BankKeeper: app.BankKeeper, + SignModeHandler: encodingConfig.TxConfig.SignModeHandler(), + FeegrantKeeper: app.FeeGrantKeeper, + SigGasConsumer: ante.DefaultSigVerificationGasConsumer, + }, + IBCKeeper: app.IBCKeeper, + WasmConfig: &wasmConfig, + TXCounterStoreKey: keys[wasm.StoreKey], }, ) + if err != nil { panic(err) } + anteHandler := sdk.ChainAnteDecorators( NewWrappedAnteHandler(authAnteHandler), epochingkeeper.NewDropValidatorMsgDecorator(app.EpochingKeeper), @@ -726,6 +839,18 @@ func NewBabylonApp( ) app.SetAnteHandler(anteHandler) + // must be before Loading version + // requires the snapshot store to be created and registered as a BaseAppOption + // see cmd/wasmd/root.go: 206 - 214 approx + if manager := app.SnapshotManager(); manager != nil { + err := manager.RegisterExtensions( + wasmkeeper.NewWasmSnapshotter(app.CommitMultiStore(), &app.WasmKeeper), + ) + if err != nil { + panic(fmt.Errorf("failed to register snapshot extension: %s", err)) + } + } + // initialize EndBlocker app.SetEndBlocker(app.EndBlocker) @@ -733,11 +858,19 @@ func NewBabylonApp( if err := app.LoadLatestVersion(); err != nil { tmos.Exit(err.Error()) } + + ctx := app.BaseApp.NewUncachedContext(true, tmproto.Header{}) + + // Initialize pinned codes in wasmvm as they are not persisted there + if err := app.WasmKeeper.InitializePinnedCodes(ctx); err != nil { + tmos.Exit(fmt.Sprintf("failed initialize pinned codes %s", err)) + } } app.ScopedIBCKeeper = scopedIBCKeeper app.ScopedZoneConciergeKeeper = scopedZoneConciergeKeeper app.ScopedTransferKeeper = scopedTransferKeeper + app.ScopedWasmKeeper = scopedWasmKeeper return app } diff --git a/app/app_test.go b/app/app_test.go index 9433d960b..75a406c64 100644 --- a/app/app_test.go +++ b/app/app_test.go @@ -47,7 +47,7 @@ func TestBabylonBlockedAddrs(t *testing.T) { logger2 := log.NewTMLogger(log.NewSyncWriter(os.Stdout)) // Making a new app object with the db, so that initchain hasn't been called - app2 := NewBabylonApp(logger2, db, nil, true, map[int64]bool{}, DefaultNodeHome, 0, encCfg, signer, EmptyAppOptions{}) + app2 := NewBabylonApp(logger2, db, nil, true, map[int64]bool{}, DefaultNodeHome, 0, encCfg, signer, EmptyAppOptions{}, GetWasmEnabledProposals(), EmptyWasmOpts) _, err := app2.ExportAppStateAndValidators(false, []string{}, []string{}) require.NoError(t, err, "ExportAppStateAndValidators should not have an error") } diff --git a/app/test_helpers.go b/app/test_helpers.go index ef9251f54..043397397 100644 --- a/app/test_helpers.go +++ b/app/test_helpers.go @@ -65,7 +65,7 @@ func setup(withGenesis bool, invCheckPeriod uint) (*BabylonApp, GenesisState) { if err != nil { panic(err) } - app := NewBabylonApp(log.NewNopLogger(), db, nil, true, map[int64]bool{}, DefaultNodeHome, invCheckPeriod, encCdc, privSigner, EmptyAppOptions{}) + app := NewBabylonApp(log.NewNopLogger(), db, nil, true, map[int64]bool{}, DefaultNodeHome, invCheckPeriod, encCdc, privSigner, EmptyAppOptions{}, GetWasmEnabledProposals(), EmptyWasmOpts) if withGenesis { return app, NewDefaultGenesisState(encCdc.Marshaler) } @@ -104,7 +104,7 @@ func NewBabyblonAppWithCustomOptions(t *testing.T, isCheckTx bool, privSigner *P options.InvCheckPeriod, options.EncConfig, privSigner, - options.AppOpts) + options.AppOpts, GetWasmEnabledProposals(), EmptyWasmOpts) genesisState := NewDefaultGenesisState(app.appCodec) genesisState = genesisStateWithValSet(t, app, genesisState, valSet, []authtypes.GenesisAccount{acc}, balance) diff --git a/client/docs/docs.go b/client/docs/docs.go index 9ee6e12cc..44f466970 100644 --- a/client/docs/docs.go +++ b/client/docs/docs.go @@ -28,7 +28,7 @@ func openAPIHandler() http.HandlerFunc { tmpl, _ := template.ParseFS(templateFS, indexFile) return func(w http.ResponseWriter, req *http.Request) { - tmpl.Execute(w, struct { + _ = tmpl.Execute(w, struct { URL string }{ apiFile, diff --git a/cmd/babylond/cmd/custom_babylon_config.go b/cmd/babylond/cmd/custom_babylon_config.go index b214f9ba3..7af72488a 100644 --- a/cmd/babylond/cmd/custom_babylon_config.go +++ b/cmd/babylond/cmd/custom_babylon_config.go @@ -1,6 +1,7 @@ package cmd import ( + wasmtypes "github.com/CosmWasm/wasmd/x/wasm/types" serverconfig "github.com/cosmos/cosmos-sdk/server/config" txformat "github.com/babylonchain/babylon/btctxformatter" @@ -43,6 +44,8 @@ type SignerConfig struct { type BabylonAppConfig struct { serverconfig.Config `mapstructure:",squash"` + Wasm wasmtypes.WasmConfig `mapstructure:"wasm"` + BtcConfig BtcConfig `mapstructure:"btc-config"` SignerConfig SignerConfig `mapstructure:"signer-config"` @@ -51,13 +54,14 @@ type BabylonAppConfig struct { func DefaultBabylonConfig() *BabylonAppConfig { return &BabylonAppConfig{ Config: *serverconfig.DefaultConfig(), + Wasm: wasmtypes.DefaultWasmConfig(), BtcConfig: defaultBabylonBtcConfig(), SignerConfig: defaultSignerConfig(), } } func DefaultBabylonTemplate() string { - return serverconfig.DefaultConfigTemplate + ` + return serverconfig.DefaultConfigTemplate + wasmtypes.DefaultConfigTemplate() + ` ############################################################################### ### Babylon Bitcoin configuration ### ############################################################################### diff --git a/cmd/babylond/cmd/root.go b/cmd/babylond/cmd/root.go index 00e76d887..9b93146dd 100644 --- a/cmd/babylond/cmd/root.go +++ b/cmd/babylond/cmd/root.go @@ -7,6 +7,8 @@ import ( "path/filepath" rosettaCmd "cosmossdk.io/tools/rosetta/cmd" + "github.com/CosmWasm/wasmd/x/wasm" + wasmkeeper "github.com/CosmWasm/wasmd/x/wasm/keeper" dbm "github.com/cometbft/cometbft-db" tmcfg "github.com/cometbft/cometbft/config" tmcli "github.com/cometbft/cometbft/libs/cli" @@ -34,6 +36,7 @@ import ( "github.com/cosmos/cosmos-sdk/x/genutil" genutilcli "github.com/cosmos/cosmos-sdk/x/genutil/client/cli" genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types" + "github.com/prometheus/client_golang/prometheus" "github.com/spf13/cast" "github.com/spf13/cobra" @@ -174,6 +177,7 @@ func initRootCmd(rootCmd *cobra.Command, encodingConfig params.EncodingConfig) { func addModuleInitFlags(startCmd *cobra.Command) { crisis.AddModuleInitFlags(startCmd) + wasm.AddModuleInitFlags(startCmd) startCmd.Flags().String(flags.FlagKeyringBackend, flags.DefaultKeyringBackend, "Select keyring's backend (os|file|kwallet|pass|test)") startCmd.Flags().String(flags.FlagChainID, "", "genesis file chain-id, if left blank will be randomly created") @@ -304,6 +308,11 @@ func (a appCreator) newApp(logger log.Logger, db dbm.DB, traceStore io.Writer, a cast.ToUint32(appOpts.Get(server.FlagStateSyncSnapshotKeepRecent)), ) + var wasmOpts []wasm.Option + if cast.ToBool(appOpts.Get("telemetry.enabled")) { + wasmOpts = append(wasmOpts, wasmkeeper.WithVMCacheMetrics(prometheus.DefaultRegisterer)) + } + return app.NewBabylonApp( logger, db, traceStore, true, skipUpgradeHeights, cast.ToString(appOpts.Get(flags.FlagHome)), @@ -311,6 +320,8 @@ func (a appCreator) newApp(logger log.Logger, db dbm.DB, traceStore io.Writer, a a.encCfg, privSigner, appOpts, + app.GetWasmEnabledProposals(), + wasmOpts, baseapp.SetPruning(pruningOpts), baseapp.SetMinGasPrices(cast.ToString(appOpts.Get(server.FlagMinGasPrices))), baseapp.SetHaltHeight(cast.ToUint64(appOpts.Get(server.FlagHaltHeight))), @@ -370,13 +381,13 @@ func (a appCreator) appExport( panic(err) } if height != -1 { - babylonApp = app.NewBabylonApp(logger, db, traceStore, false, map[int64]bool{}, homePath, uint(1), a.encCfg, privSigner, appOpts) + babylonApp = app.NewBabylonApp(logger, db, traceStore, false, map[int64]bool{}, homePath, uint(1), a.encCfg, privSigner, appOpts, app.GetWasmEnabledProposals(), app.EmptyWasmOpts) if err = babylonApp.LoadHeight(height); err != nil { return servertypes.ExportedApp{}, err } } else { - babylonApp = app.NewBabylonApp(logger, db, traceStore, true, map[int64]bool{}, homePath, uint(1), a.encCfg, privSigner, appOpts) + babylonApp = app.NewBabylonApp(logger, db, traceStore, true, map[int64]bool{}, homePath, uint(1), a.encCfg, privSigner, appOpts, app.GetWasmEnabledProposals(), app.EmptyWasmOpts) } return babylonApp.ExportAppStateAndValidators(forZeroHeight, jailAllowedAddrs, modulesToExport) diff --git a/contrib/images/babylond-dlv/Dockerfile b/contrib/images/babylond-dlv/Dockerfile index 79f1cfaba..e8244789a 100644 --- a/contrib/images/babylond-dlv/Dockerfile +++ b/contrib/images/babylond-dlv/Dockerfile @@ -4,8 +4,19 @@ RUN go install github.com/go-delve/delve/cmd/dlv@latest WORKDIR /work COPY go.mod go.sum /work/ RUN go mod download -COPY ./ /work -RUN LEDGER_ENABLED=false make COSMOS_BUILD_OPTIONS="debug,nostrip" clean build + +# Cosmwasm - Download correct libwasmvm version +RUN WASMVM_VERSION=$(go list -m github.com/CosmWasm/wasmvm | cut -d ' ' -f 2) && \ + wget https://github.com/CosmWasm/wasmvm/releases/download/$WASMVM_VERSION/libwasmvm_muslc.$(uname -m).a \ + -O /lib/libwasmvm_muslc.a && \ + # verify checksum + wget https://github.com/CosmWasm/wasmvm/releases/download/$WASMVM_VERSION/checksums.txt -O /tmp/checksums.txt && \ + sha256sum /lib/libwasmvm_muslc.a | grep $(cat /tmp/checksums.txt | grep $(uname -m) | cut -d ' ' -f 1) + +# Copy the remaining files +COPY . . + +RUN LEDGER_ENABLED=false BUILD_TAGS=muslc LINK_STATICALLY=true make COSMOS_BUILD_OPTIONS="debug,nostrip" clean build FROM alpine:3.14 AS run RUN apk add bash curl jq diff --git a/contrib/images/babylond-env/Dockerfile b/contrib/images/babylond-env/Dockerfile index 426845bd0..d29dac7bf 100644 --- a/contrib/images/babylond-env/Dockerfile +++ b/contrib/images/babylond-env/Dockerfile @@ -4,8 +4,19 @@ WORKDIR /work COPY go.mod go.sum /work/ RUN go mod download -COPY ./ /work -RUN LEDGER_ENABLED=false make clean build + +# Cosmwasm - Download correct libwasmvm version +RUN WASMVM_VERSION=$(go list -m github.com/CosmWasm/wasmvm | cut -d ' ' -f 2) && \ + wget https://github.com/CosmWasm/wasmvm/releases/download/$WASMVM_VERSION/libwasmvm_muslc.$(uname -m).a \ + -O /lib/libwasmvm_muslc.a && \ + # verify checksum + wget https://github.com/CosmWasm/wasmvm/releases/download/$WASMVM_VERSION/checksums.txt -O /tmp/checksums.txt && \ + sha256sum /lib/libwasmvm_muslc.a | grep $(cat /tmp/checksums.txt | grep $(uname -m) | cut -d ' ' -f 1) + +# Copy the remaining files +COPY . . + +RUN LEDGER_ENABLED=false BUILD_TAGS=muslc LINK_STATICALLY=true make clean build FROM alpine:3.14 AS run RUN apk add bash curl jq diff --git a/go.mod b/go.mod index 5b5da8769..1ce835e85 100644 --- a/go.mod +++ b/go.mod @@ -3,6 +3,7 @@ go 1.19 module github.com/babylonchain/babylon require ( + github.com/CosmWasm/wasmd v0.40.0-rc.0 github.com/btcsuite/btcd v0.23.4 github.com/cometbft/cometbft v0.37.0 github.com/cometbft/cometbft-db v0.7.0 @@ -11,7 +12,7 @@ require ( github.com/gorilla/mux v1.8.0 github.com/grpc-ecosystem/grpc-gateway v1.16.0 github.com/pkg/errors v0.9.1 - github.com/rakyll/statik v0.1.7 + github.com/rakyll/statik v0.1.7 // indirect github.com/spf13/cast v1.5.0 github.com/spf13/cobra v1.6.1 github.com/spf13/viper v1.15.0 @@ -19,7 +20,7 @@ require ( github.com/supranational/blst v0.3.8 google.golang.org/genproto v0.0.0-20230216225411-c8e22ba71e44 google.golang.org/grpc v1.53.0 - gopkg.in/yaml.v2 v2.4.0 + gopkg.in/yaml.v2 v2.4.0 // indirect ) require ( @@ -31,7 +32,7 @@ require ( github.com/btcsuite/btcd/btcutil v1.1.2 github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 github.com/cosmos/gogoproto v1.4.6 - github.com/cosmos/ibc-go/v7 v7.0.0-rc0 + github.com/cosmos/ibc-go/v7 v7.0.0 github.com/golang/mock v1.6.0 github.com/jinzhu/copier v0.3.5 github.com/ory/dockertest/v3 v3.9.1 @@ -94,7 +95,7 @@ require ( github.com/mtibben/percent v0.2.1 // indirect github.com/petermattis/goid v0.0.0-20221215004737-a150e88a970d // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.14.0 // indirect + github.com/prometheus/client_golang v1.14.0 github.com/prometheus/client_model v0.3.0 // indirect github.com/prometheus/common v0.40.0 // indirect github.com/prometheus/procfs v0.9.0 // indirect @@ -126,6 +127,7 @@ require ( cosmossdk.io/core v0.5.1 // indirect cosmossdk.io/depinject v1.0.0-alpha.3 // indirect github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect + github.com/CosmWasm/wasmvm v1.2.1 // indirect github.com/Microsoft/go-winio v0.6.0 // indirect github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 // indirect github.com/aws/aws-sdk-go v1.44.203 // indirect @@ -145,6 +147,7 @@ require ( github.com/decred/dcrd/crypto/blake256 v1.0.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect github.com/docker/cli v20.10.21+incompatible // indirect + github.com/docker/distribution v2.8.1+incompatible // indirect github.com/docker/docker v20.10.21+incompatible // indirect github.com/docker/go-connections v0.4.0 // indirect github.com/docker/go-units v0.5.0 // indirect @@ -154,6 +157,7 @@ require ( github.com/golang/glog v1.1.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/google/go-cmp v0.5.9 // indirect + github.com/google/gofuzz v1.2.0 // indirect github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect github.com/google/uuid v1.3.0 // indirect github.com/googleapis/enterprise-certificate-proxy v0.2.3 // indirect diff --git a/go.sum b/go.sum index b94a13e7e..3fda292da 100644 --- a/go.sum +++ b/go.sum @@ -209,6 +209,10 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d h1:nalkkPQcITbvhmL4+C4cKA87NW0tfm3Kl9VXRoPywFg= github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d/go.mod h1:URdX5+vg25ts3aCh8H5IFZybJYKWhJHYMTnf+ULtoC4= +github.com/CosmWasm/wasmd v0.40.0-rc.0 h1:QhJzLSWQCjUjrEPO2dc61WgafnaxetuKZRBHUfKJR84= +github.com/CosmWasm/wasmd v0.40.0-rc.0/go.mod h1:9MispMuIWmjs6HlgRx+XPLfOD0y1k7iQx5KIE2cNGTc= +github.com/CosmWasm/wasmvm v1.2.1 h1:si0tRsRDdUShV0k51Wn6zRKlmj3/WWP9Yr4cLmDTf+8= +github.com/CosmWasm/wasmvm v1.2.1/go.mod h1:vW/E3h8j9xBQs9bCoijDuawKo9kCtxOaS8N8J7KFtkc= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= github.com/Microsoft/go-winio v0.6.0 h1:slsWYD/zyx7lCXoZVlvQrj0hPTM1HI4+v1sIda2yDvg= @@ -404,6 +408,8 @@ github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WA github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/docker/cli v20.10.21+incompatible h1:qVkgyYUnOLQ98LtXBrwd/duVqPT2X4SHndOuGsfwyhU= github.com/docker/cli v20.10.21+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/distribution v2.8.1+incompatible h1:Q50tZOPR6T/hjNsyc9g8/syEs6bk8XXApsHjKukMl68= +github.com/docker/distribution v2.8.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/docker v20.10.21+incompatible h1:UTLdBmHk3bEY+w8qeO5KttOhy6OmXWsl/FEet9Uswog= github.com/docker/docker v20.10.21+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= @@ -566,6 +572,7 @@ github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeN github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= diff --git a/simapp/sim_bench_test.go b/simapp/sim_bench_test.go index bc15e1328..4efb8f4c7 100644 --- a/simapp/sim_bench_test.go +++ b/simapp/sim_bench_test.go @@ -49,6 +49,8 @@ func BenchmarkFullAppSimulation(b *testing.B) { app.GetEncodingConfig(), privSigner, sims.EmptyAppOptions{}, + app.GetWasmEnabledProposals(), + app.EmptyWasmOpts, interBlockCacheOpt()) // run randomized simulation @@ -114,6 +116,8 @@ func BenchmarkInvariants(b *testing.B) { app.GetEncodingConfig(), privSigner, sims.EmptyAppOptions{}, + app.GetWasmEnabledProposals(), + app.EmptyWasmOpts, interBlockCacheOpt()) // run randomized simulation diff --git a/simapp/sim_test.go b/simapp/sim_test.go index 4d612e684..e95e0ac66 100644 --- a/simapp/sim_test.go +++ b/simapp/sim_test.go @@ -79,7 +79,7 @@ func TestFullAppSimulation(t *testing.T) { privSigner, err := app.SetupPrivSigner() require.NoError(t, err) - babylon := app.NewBabylonApp(logger, db, nil, true, map[int64]bool{}, app.DefaultNodeHome, FlagPeriodValue, app.GetEncodingConfig(), privSigner, sims.EmptyAppOptions{}, fauxMerkleModeOpt) + babylon := app.NewBabylonApp(logger, db, nil, true, map[int64]bool{}, app.DefaultNodeHome, FlagPeriodValue, app.GetEncodingConfig(), privSigner, sims.EmptyAppOptions{}, app.GetWasmEnabledProposals(), app.EmptyWasmOpts, fauxMerkleModeOpt) require.Equal(t, "BabylonApp", babylon.Name()) // run randomized simulation @@ -119,7 +119,7 @@ func TestAppImportExport(t *testing.T) { privSigner, err := app.SetupPrivSigner() require.NoError(t, err) - babylon := app.NewBabylonApp(logger, db, nil, true, map[int64]bool{}, app.DefaultNodeHome, FlagPeriodValue, app.GetEncodingConfig(), privSigner, sims.EmptyAppOptions{}, fauxMerkleModeOpt) + babylon := app.NewBabylonApp(logger, db, nil, true, map[int64]bool{}, app.DefaultNodeHome, FlagPeriodValue, app.GetEncodingConfig(), privSigner, sims.EmptyAppOptions{}, app.GetWasmEnabledProposals(), app.EmptyWasmOpts, fauxMerkleModeOpt) require.Equal(t, "BabylonApp", babylon.Name()) // Run randomized simulation @@ -159,7 +159,7 @@ func TestAppImportExport(t *testing.T) { require.NoError(t, os.RemoveAll(newDir)) }() - newBabylon := app.NewBabylonApp(log.NewNopLogger(), newDB, nil, true, map[int64]bool{}, app.DefaultNodeHome, FlagPeriodValue, app.GetEncodingConfig(), privSigner, sims.EmptyAppOptions{}, fauxMerkleModeOpt) + newBabylon := app.NewBabylonApp(log.NewNopLogger(), newDB, nil, true, map[int64]bool{}, app.DefaultNodeHome, FlagPeriodValue, app.GetEncodingConfig(), privSigner, sims.EmptyAppOptions{}, app.GetWasmEnabledProposals(), app.EmptyWasmOpts, fauxMerkleModeOpt) require.Equal(t, "BabylonApp", newBabylon.Name()) var genesisState app.GenesisState @@ -223,7 +223,7 @@ func TestAppSimulationAfterImport(t *testing.T) { privSigner, err := app.SetupPrivSigner() require.NoError(t, err) - babylon := app.NewBabylonApp(logger, db, nil, true, map[int64]bool{}, app.DefaultNodeHome, FlagPeriodValue, app.GetEncodingConfig(), privSigner, sims.EmptyAppOptions{}, fauxMerkleModeOpt) + babylon := app.NewBabylonApp(logger, db, nil, true, map[int64]bool{}, app.DefaultNodeHome, FlagPeriodValue, app.GetEncodingConfig(), privSigner, sims.EmptyAppOptions{}, app.GetWasmEnabledProposals(), app.EmptyWasmOpts, fauxMerkleModeOpt) require.Equal(t, "BabylonApp", babylon.Name()) // Run randomized simulation @@ -268,7 +268,7 @@ func TestAppSimulationAfterImport(t *testing.T) { require.NoError(t, os.RemoveAll(newDir)) }() - newBabylon := app.NewBabylonApp(log.NewNopLogger(), newDB, nil, true, map[int64]bool{}, app.DefaultNodeHome, FlagPeriodValue, app.GetEncodingConfig(), privSigner, sims.EmptyAppOptions{}, fauxMerkleModeOpt) + newBabylon := app.NewBabylonApp(log.NewNopLogger(), newDB, nil, true, map[int64]bool{}, app.DefaultNodeHome, FlagPeriodValue, app.GetEncodingConfig(), privSigner, sims.EmptyAppOptions{}, app.GetWasmEnabledProposals(), app.EmptyWasmOpts, fauxMerkleModeOpt) require.Equal(t, "BabylonApp", newBabylon.Name()) newBabylon.InitChain(abci.RequestInitChain{ @@ -321,7 +321,7 @@ func TestAppStateDeterminism(t *testing.T) { db := dbm.NewMemDB() privSigner, err := app.SetupPrivSigner() require.NoError(t, err) - babylon := app.NewBabylonApp(logger, db, nil, true, map[int64]bool{}, app.DefaultNodeHome, FlagPeriodValue, app.GetEncodingConfig(), privSigner, sims.EmptyAppOptions{}, interBlockCacheOpt()) + babylon := app.NewBabylonApp(logger, db, nil, true, map[int64]bool{}, app.DefaultNodeHome, FlagPeriodValue, app.GetEncodingConfig(), privSigner, sims.EmptyAppOptions{}, app.GetWasmEnabledProposals(), app.EmptyWasmOpts, interBlockCacheOpt()) fmt.Printf( "running non-determinism simulation; seed %d: %d/%d, attempt: %d/%d\n", From b77e0363ae1ff6b3769e338290b2a48ebb1a1706 Mon Sep 17 00:00:00 2001 From: KonradStaniec Date: Mon, 3 Apr 2023 07:27:01 +0200 Subject: [PATCH 25/59] Re-enable e2e tests (#342) --- .circleci/config.yml | 9 ++++----- test/e2e/containers/config.go | 2 +- test/e2e/containers/containers.go | 2 +- test/e2e/e2e_test.go | 12 ++++++------ 4 files changed, 12 insertions(+), 13 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 13e8fa794..6fc4c5b37 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -48,11 +48,10 @@ jobs: make localnet-stop # TODO: If CI tests will take to long consider having only this e2e test # instead of separate integration tests and e2e tests. - # TODO: re-enable e2e test after bumping heremes releyer - # - run: - # name: Run e2e tests - # command: | - # make test-e2e + - run: + name: Run e2e tests + command: | + make test-e2e build_docker: machine: diff --git a/test/e2e/containers/config.go b/test/e2e/containers/config.go index 652fb5462..90b8416cc 100644 --- a/test/e2e/containers/config.go +++ b/test/e2e/containers/config.go @@ -13,7 +13,7 @@ const ( BabylonContainerName = "babylonchain/babylond" relayerRepository = "informalsystems/hermes" - relayerTag = "1.3.0" + relayerTag = "1.4.0" ) // Returns ImageConfig needed for running e2e test. diff --git a/test/e2e/containers/containers.go b/test/e2e/containers/containers.go index e97fba0db..62d0b3e61 100644 --- a/test/e2e/containers/containers.go +++ b/test/e2e/containers/containers.go @@ -61,7 +61,7 @@ func (m *Manager) ExecTxCmd(t *testing.T, chainId string, containerName string, // namely adding flags `--chain-id={chain-id} -b=block --yes --keyring-backend=test "--log_format=json"`, // and searching for `successStr` func (m *Manager) ExecTxCmdWithSuccessString(t *testing.T, chainId string, containerName string, command []string, successStr string) (bytes.Buffer, bytes.Buffer, error) { - allTxArgs := []string{fmt.Sprintf("--chain-id=%s", chainId), "-b=block", "--yes", "--keyring-backend=test", "--log_format=json", "--home=/babylondata"} + allTxArgs := []string{fmt.Sprintf("--chain-id=%s", chainId), "-b=sync", "--yes", "--keyring-backend=test", "--log_format=json", "--home=/babylondata"} txCommand := append(command, allTxArgs...) return m.ExecCmd(t, containerName, txCommand, successStr) } diff --git a/test/e2e/e2e_test.go b/test/e2e/e2e_test.go index 182430580..e1344e622 100644 --- a/test/e2e/e2e_test.go +++ b/test/e2e/e2e_test.go @@ -24,18 +24,18 @@ func (s *IntegrationTestSuite) TestConnectIbc() { func (s *IntegrationTestSuite) TestIbcCheckpointing() { chainA := s.configurer.GetChainConfig(0) - chainA.WaitUntilHeight(25) + chainA.WaitUntilHeight(35) nonValidatorNode, err := chainA.GetNodeAtIndex(2) s.NoError(err) - // Finalize epoch 1 and 2, as first headers of opposing chain are in epoch 2 - nonValidatorNode.FinalizeSealedEpochs(1, 2) + // Finalize epoch 1,2,3 , as first headers of opposing chain are in epoch 3 + nonValidatorNode.FinalizeSealedEpochs(1, 3) - epoch2, err := nonValidatorNode.QueryCheckpointForEpoch(2) + epoch3, err := nonValidatorNode.QueryCheckpointForEpoch(3) s.NoError(err) - if epoch2.Status != ct.Finalized { + if epoch3.Status != ct.Finalized { s.FailNow("Epoch 2 should be finalized") } @@ -44,7 +44,7 @@ func (s *IntegrationTestSuite) TestIbcCheckpointing() { s.NoError(err) // TODO Add more assertion here. Maybe check proofs ? s.Equal(fininfo.FinalizedChainInfo.ChainId, initialization.ChainBID) - s.Equal(fininfo.EpochInfo.EpochNumber, uint64(2)) + s.Equal(fininfo.EpochInfo.EpochNumber, uint64(3)) currEpoch, err := nonValidatorNode.QueryCurrentEpoch() s.NoError(err) From c05c04c859f408d17e50d1249065d549ea5c4281 Mon Sep 17 00:00:00 2001 From: Vitalis Salis Date: Mon, 3 Apr 2023 10:14:37 +0300 Subject: [PATCH 26/59] chore: Parallelize CircleCI lint build (#341) --- .circleci/config.yml | 32 +++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 6fc4c5b37..da1118bdb 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -8,14 +8,12 @@ orbs: # Define a job to be invoked later in a workflow. # See: https://circleci.com/docs/2.0/configuration-reference/#jobs jobs: - build: + build-test: # Specify the execution environment. You can specify an image from Dockerhub or use one of our Convenience Images from CircleCI's Developer Hub. # See: https://circleci.com/docs/2.0/configuration-reference/#docker-machine-macos-windows-executor machine: image: ubuntu-2204:2022.10.1 resource_class: large - # Add steps to the job - # See: https://circleci.com/docs/2.0/configuration-reference/#steps steps: - checkout - run: @@ -31,11 +29,6 @@ jobs: key: go-mod-v6-{{ checksum "go.sum" }} paths: - "/home/circleci/.go_workspace/pkg/mod" - - run: - name: Lint - command: | - curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s v1.50.1 - ./bin/golangci-lint run - run: name: Run tests command: | @@ -51,7 +44,18 @@ jobs: - run: name: Run e2e tests command: | - make test-e2e + make test-e2e + lint: + machine: + image: ubuntu-2204:2022.10.1 + resource_class: medium + steps: + - checkout + - run: + name: Lint + command: | + curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s v1.50.1 + ./bin/golangci-lint run build_docker: machine: @@ -99,9 +103,15 @@ jobs: # Invoke jobs via workflows # See: https://circleci.com/docs/2.0/configuration-reference/#workflows workflows: - build-lint-test: + version: 2 + build-test: + jobs: + - build-test + lint: + jobs: + - lint + docker: jobs: - - build - build_docker: filters: tags: From fd052308088ad9dbe0d174d5372bc769f7191791 Mon Sep 17 00:00:00 2001 From: KonradStaniec Date: Wed, 5 Apr 2023 06:51:26 +0200 Subject: [PATCH 27/59] Feature/lint proto ci (#343) * Lint proto files on CI --- .circleci/config.yml | 3 +++ proto/babylon/checkpointing/v1/genesis.proto | 1 - proto/babylon/checkpointing/v1/query.proto | 1 - proto/babylon/monitor/v1/genesis.proto | 2 -- proto/babylon/monitor/v1/query.proto | 1 - proto/babylon/zoneconcierge/v1/genesis.proto | 2 -- proto/babylon/zoneconcierge/v1/query.proto | 1 - 7 files changed, 3 insertions(+), 8 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index da1118bdb..6a3b6660e 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -51,6 +51,9 @@ jobs: resource_class: medium steps: - checkout + - run: + name: Lint proto files + command: make proto-lint - run: name: Lint command: | diff --git a/proto/babylon/checkpointing/v1/genesis.proto b/proto/babylon/checkpointing/v1/genesis.proto index aeab48299..dd65d5017 100644 --- a/proto/babylon/checkpointing/v1/genesis.proto +++ b/proto/babylon/checkpointing/v1/genesis.proto @@ -1,7 +1,6 @@ syntax = "proto3"; package babylon.checkpointing.v1; -import "gogoproto/gogo.proto"; import "cosmos/crypto/ed25519/keys.proto"; import "babylon/checkpointing/v1/bls_key.proto"; diff --git a/proto/babylon/checkpointing/v1/query.proto b/proto/babylon/checkpointing/v1/query.proto index 0d876a238..5bcb7c0b0 100644 --- a/proto/babylon/checkpointing/v1/query.proto +++ b/proto/babylon/checkpointing/v1/query.proto @@ -3,7 +3,6 @@ package babylon.checkpointing.v1; import "babylon/checkpointing/v1/bls_key.proto"; import "cosmos/base/query/v1beta1/pagination.proto"; -import "gogoproto/gogo.proto"; import "google/api/annotations.proto"; import "babylon/checkpointing/v1/checkpoint.proto"; diff --git a/proto/babylon/monitor/v1/genesis.proto b/proto/babylon/monitor/v1/genesis.proto index 17facb8d2..66a259f15 100644 --- a/proto/babylon/monitor/v1/genesis.proto +++ b/proto/babylon/monitor/v1/genesis.proto @@ -1,8 +1,6 @@ syntax = "proto3"; package babylon.monitor.v1; -import "gogoproto/gogo.proto"; - option go_package = "github.com/babylonchain/babylon/x/monitor/types"; // GenesisState defines the monitor module's genesis state. diff --git a/proto/babylon/monitor/v1/query.proto b/proto/babylon/monitor/v1/query.proto index 65455c338..622305a34 100644 --- a/proto/babylon/monitor/v1/query.proto +++ b/proto/babylon/monitor/v1/query.proto @@ -1,7 +1,6 @@ syntax = "proto3"; package babylon.monitor.v1; -import "gogoproto/gogo.proto"; import "google/api/annotations.proto"; option go_package = "github.com/babylonchain/babylon/x/monitor/types"; diff --git a/proto/babylon/zoneconcierge/v1/genesis.proto b/proto/babylon/zoneconcierge/v1/genesis.proto index 9127ad35f..65ed8cb19 100644 --- a/proto/babylon/zoneconcierge/v1/genesis.proto +++ b/proto/babylon/zoneconcierge/v1/genesis.proto @@ -1,8 +1,6 @@ syntax = "proto3"; package babylon.zoneconcierge.v1; -import "gogoproto/gogo.proto"; - option go_package = "github.com/babylonchain/babylon/x/zoneconcierge/types"; // GenesisState defines the zoneconcierge module's genesis state. diff --git a/proto/babylon/zoneconcierge/v1/query.proto b/proto/babylon/zoneconcierge/v1/query.proto index 987cece84..06a0d4b27 100644 --- a/proto/babylon/zoneconcierge/v1/query.proto +++ b/proto/babylon/zoneconcierge/v1/query.proto @@ -1,7 +1,6 @@ syntax = "proto3"; package babylon.zoneconcierge.v1; -import "gogoproto/gogo.proto"; import "google/api/annotations.proto"; import "cosmos/base/query/v1beta1/pagination.proto"; import "babylon/btccheckpoint/v1/btccheckpoint.proto"; From 7dc3b57e27c4da4d9519aa78964815610c5b997b Mon Sep 17 00:00:00 2001 From: KonradStaniec Date: Wed, 5 Apr 2023 08:34:47 +0200 Subject: [PATCH 28/59] Migrate epoching and btccheckpointing module to new way of handling params (#344) * Migrate epoching and btccheckpointing module to new way of handling params --- app/app.go | 22 +- go.mod | 2 +- proto/babylon/btccheckpoint/v1/tx.proto | 26 + proto/babylon/epoching/v1/tx.proto | 26 + testutil/keeper/btccheckpoint.go | 16 +- testutil/keeper/epoching.go | 15 +- x/btccheckpoint/genesis.go | 5 +- x/btccheckpoint/genesis_test.go | 13 +- .../keeper/grpc_query_params_test.go | 13 +- x/btccheckpoint/keeper/keeper.go | 11 +- x/btccheckpoint/keeper/msg_server.go | 16 + x/btccheckpoint/keeper/params.go | 28 +- x/btccheckpoint/keeper/params_test.go | 5 +- x/btccheckpoint/types/codec.go | 8 +- x/btccheckpoint/types/keys.go | 1 + x/btccheckpoint/types/msgs.go | 22 + x/btccheckpoint/types/params.go | 22 - x/btccheckpoint/types/tx.pb.go | 437 ++++++++++++++++- x/epoching/genesis.go | 5 +- x/epoching/genesis_test.go | 5 +- x/epoching/keeper/apphash_chain_test.go | 9 +- x/epoching/keeper/epochs_test.go | 10 +- x/epoching/keeper/grpc_query_test.go | 4 +- x/epoching/keeper/keeper.go | 39 +- x/epoching/keeper/keeper_test.go | 6 +- x/epoching/keeper/msg_server.go | 18 + x/epoching/keeper/params.go | 27 +- x/epoching/keeper/params_test.go | 4 +- x/epoching/types/codec.go | 5 + x/epoching/types/keys.go | 1 + x/epoching/types/msg.go | 21 + x/epoching/types/params.go | 16 - x/epoching/types/tx.pb.go | 448 +++++++++++++++++- 33 files changed, 1129 insertions(+), 177 deletions(-) diff --git a/app/app.go b/app/app.go index b67bf92ba..2683b9628 100644 --- a/app/app.go +++ b/app/app.go @@ -432,7 +432,7 @@ func NewBabylonApp( // NOTE: the epoching module has to be set before the chekpointing module, as the checkpointing module will have access to the epoching module epochingKeeper := epochingkeeper.NewKeeper( - appCodec, keys[epochingtypes.StoreKey], keys[epochingtypes.StoreKey], app.GetSubspace(epochingtypes.ModuleName), app.BankKeeper, app.StakingKeeper, + appCodec, keys[epochingtypes.StoreKey], keys[epochingtypes.StoreKey], app.BankKeeper, app.StakingKeeper, authtypes.NewModuleAddress(govtypes.ModuleName).String(), ) app.MintKeeper = mintkeeper.NewKeeper(appCodec, keys[minttypes.StoreKey], app.StakingKeeper, app.AccountKeeper, app.BankKeeper, authtypes.FeeCollectorName, authtypes.NewModuleAddress(govtypes.ModuleName).String()) @@ -597,13 +597,11 @@ func NewBabylonApp( keys[btccheckpointtypes.StoreKey], tkeys[btccheckpointtypes.TStoreKey], keys[btccheckpointtypes.MemStoreKey], - app.GetSubspace(btccheckpointtypes.ModuleName), &btclightclientKeeper, app.CheckpointingKeeper, - // TODO decide on proper values for those constants, also those should be taken - // from some global config &powLimit, btcConfig.CheckpointTag(), + authtypes.NewModuleAddress(govtypes.ModuleName).String(), ) app.ZoneConciergeKeeper.SetBtcCheckpointKeeper(app.BtcCheckpointKeeper) @@ -1054,19 +1052,9 @@ func BlockedAddresses() map[string]bool { func initParamsKeeper(appCodec codec.BinaryCodec, legacyAmino *codec.LegacyAmino, key, tkey storetypes.StoreKey) paramskeeper.Keeper { paramsKeeper := paramskeeper.NewKeeper(appCodec, legacyAmino, key, tkey) - paramsKeeper.Subspace(authtypes.ModuleName) - paramsKeeper.Subspace(banktypes.ModuleName) - paramsKeeper.Subspace(stakingtypes.ModuleName) - paramsKeeper.Subspace(minttypes.ModuleName) - paramsKeeper.Subspace(distrtypes.ModuleName) - paramsKeeper.Subspace(slashingtypes.ModuleName) - paramsKeeper.Subspace(govtypes.ModuleName) - paramsKeeper.Subspace(crisistypes.ModuleName) - // Babylon modules - paramsKeeper.Subspace(epochingtypes.ModuleName) - paramsKeeper.Subspace(btccheckpointtypes.ModuleName) - - // IBC-related modules + // TODO: Only modules which did not migrate yet to new way of hanldling params + // are the IBC-related modules. Once they are migrated, we can remove this and + // whole usage of params module paramsKeeper.Subspace(ibcexported.ModuleName) paramsKeeper.Subspace(ibctransfertypes.ModuleName) paramsKeeper.Subspace(zctypes.ModuleName) diff --git a/go.mod b/go.mod index 1ce835e85..e4d184ca3 100644 --- a/go.mod +++ b/go.mod @@ -31,6 +31,7 @@ require ( github.com/boljen/go-bitmap v0.0.0-20151001105940-23cd2fb0ce7d github.com/btcsuite/btcd/btcutil v1.1.2 github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 + github.com/cosmos/cosmos-proto v1.0.0-beta.2 github.com/cosmos/gogoproto v1.4.6 github.com/cosmos/ibc-go/v7 v7.0.0 github.com/golang/mock v1.6.0 @@ -138,7 +139,6 @@ require ( github.com/cockroachdb/apd/v2 v2.0.2 // indirect github.com/coinbase/rosetta-sdk-go/types v1.0.0 // indirect github.com/containerd/continuity v0.3.0 // indirect - github.com/cosmos/cosmos-proto v1.0.0-beta.2 // indirect github.com/cosmos/gogogateway v1.2.0 // indirect github.com/cosmos/ics23/go v0.9.1-0.20221207100636-b1abd8678aab // indirect github.com/cosmos/rosetta-sdk-go v0.10.0 // indirect diff --git a/proto/babylon/btccheckpoint/v1/tx.proto b/proto/babylon/btccheckpoint/v1/tx.proto index 4a9cc1b11..d0d12b363 100644 --- a/proto/babylon/btccheckpoint/v1/tx.proto +++ b/proto/babylon/btccheckpoint/v1/tx.proto @@ -2,6 +2,10 @@ syntax = "proto3"; package babylon.btccheckpoint.v1; import "babylon/btccheckpoint/v1/btccheckpoint.proto"; +import "cosmos_proto/cosmos.proto"; +import "cosmos/msg/v1/msg.proto"; +import "babylon/btccheckpoint/v1/params.proto"; +import "gogoproto/gogo.proto"; option go_package = "github.com/babylonchain/babylon/x/btccheckpoint/types"; @@ -10,6 +14,9 @@ service Msg { // InsertBTCSpvProof tries to insert a new checkpoint into the store. rpc InsertBTCSpvProof(MsgInsertBTCSpvProof) returns (MsgInsertBTCSpvProofResponse); + + // UpdateParams updates the btccheckpoint module parameters. + rpc UpdateParams(MsgUpdateParams) returns (MsgUpdateParamsResponse); } // MsgInsertBTCSpvProof defines resquest to insert a new checkpoint into the @@ -22,3 +29,22 @@ message MsgInsertBTCSpvProof { // MsgInsertBTCSpvProofResponse defines the response for the // MsgInsertBTCSpvProof message message MsgInsertBTCSpvProofResponse {} + +// MsgUpdateParams defines a message to update the btccheckpoint module params. +message MsgUpdateParams { + option (cosmos.msg.v1.signer) = "authority"; + + // authority is the address of the governance account. + // just FYI: cosmos.AddressString marks that this field should use type alias + // for AddressString instead of string, but the functionality is not yet implemented + // in cosmos-proto + string authority = 1 [(cosmos_proto.scalar) = "cosmos.AddressString"]; + + // params defines the btccheckpoint parameters to update. + // + // NOTE: All parameters must be supplied. + Params params = 2 [(gogoproto.nullable) = false]; +} + +// MsgUpdateParamsResponse defines the response to the MsgUpdateParams message. +message MsgUpdateParamsResponse {} diff --git a/proto/babylon/epoching/v1/tx.proto b/proto/babylon/epoching/v1/tx.proto index eb644bd5c..a9bc48604 100644 --- a/proto/babylon/epoching/v1/tx.proto +++ b/proto/babylon/epoching/v1/tx.proto @@ -3,6 +3,10 @@ package babylon.epoching.v1; import "gogoproto/gogo.proto"; import "cosmos/staking/v1beta1/tx.proto"; +import "babylon/epoching/v1/params.proto"; + +import "cosmos_proto/cosmos.proto"; +import "cosmos/msg/v1/msg.proto"; option go_package = "github.com/babylonchain/babylon/x/epoching/types"; @@ -21,6 +25,9 @@ service Msg { // coins from a delegator and source validator to a destination validator. rpc WrappedBeginRedelegate(MsgWrappedBeginRedelegate) returns (MsgWrappedBeginRedelegateResponse); + + // UpdateParams defines a method for updating epoching module parameters. + rpc UpdateParams(MsgUpdateParams) returns (MsgUpdateParamsResponse); } // MsgWrappedDelegate is the message for delegating stakes @@ -58,3 +65,22 @@ message MsgWrappedBeginRedelegate { // MsgWrappedBeginRedelegateResponse is the response to the // MsgWrappedBeginRedelegate message message MsgWrappedBeginRedelegateResponse {} + +// MsgUpdateParams defines a message for updating epoching module parameters. +message MsgUpdateParams { + option (cosmos.msg.v1.signer) = "authority"; + + // authority is the address of the governance account. + // just FYI: cosmos.AddressString marks that this field should use type alias + // for AddressString instead of string, but the functionality is not yet implemented + // in cosmos-proto + string authority = 1 [(cosmos_proto.scalar) = "cosmos.AddressString"]; + + // params defines the epoching paramaeters parameters to update. + // + // NOTE: All parameters must be supplied. + Params params = 2 [(gogoproto.nullable) = false]; +} + +// MsgUpdateParamsResponse is the response to the MsgUpdateParams message. +message MsgUpdateParamsResponse {} diff --git a/testutil/keeper/btccheckpoint.go b/testutil/keeper/btccheckpoint.go index 77af7f8cd..fdf90a468 100644 --- a/testutil/keeper/btccheckpoint.go +++ b/testutil/keeper/btccheckpoint.go @@ -16,7 +16,8 @@ import ( "github.com/cosmos/cosmos-sdk/store" storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" - typesparams "github.com/cosmos/cosmos-sdk/x/params/types" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" + govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" "github.com/stretchr/testify/require" ) @@ -38,30 +39,25 @@ func NewBTCCheckpointKeeper( registry := codectypes.NewInterfaceRegistry() cdc := codec.NewProtoCodec(registry) - paramsSubspace := typesparams.NewSubspace(cdc, - btcctypes.Amino, - storeKey, - memStoreKey, - "BTCCheckpointParams", - ) - k := keeper.NewKeeper( cdc, storeKey, tstoreKey, memStoreKey, - paramsSubspace, lk, ek, powLimit, // use MainTag tests txformat.MainTag(0), + authtypes.NewModuleAddress(govtypes.ModuleName).String(), ) ctx := sdk.NewContext(stateStore, tmproto.Header{}, false, log.NewNopLogger()) // Initialize params - k.SetParams(ctx, btcctypes.DefaultParams()) + if err := k.SetParams(ctx, btcctypes.DefaultParams()); err != nil { + panic(err) + } return &k, ctx } diff --git a/testutil/keeper/epoching.go b/testutil/keeper/epoching.go index a92838d1b..d1dab7cdc 100644 --- a/testutil/keeper/epoching.go +++ b/testutil/keeper/epoching.go @@ -11,7 +11,8 @@ import ( "github.com/cosmos/cosmos-sdk/store" storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" - typesparams "github.com/cosmos/cosmos-sdk/x/params/types" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" + govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" "github.com/stretchr/testify/require" "github.com/babylonchain/babylon/x/epoching/keeper" @@ -31,20 +32,14 @@ func EpochingKeeper(t testing.TB) (*keeper.Keeper, sdk.Context) { registry := codectypes.NewInterfaceRegistry() cdc := codec.NewProtoCodec(registry) - paramsSubspace := typesparams.NewSubspace(cdc, - types.Amino, - storeKey, - memStoreKey, - "EpochingParams", - ) k := keeper.NewKeeper( cdc, storeKey, memStoreKey, - paramsSubspace, // TODO: make this compile at the moment, will fix for integrated testing nil, nil, + authtypes.NewModuleAddress(govtypes.ModuleName).String(), ) // TODO: add msgServiceRouter? @@ -52,7 +47,9 @@ func EpochingKeeper(t testing.TB) (*keeper.Keeper, sdk.Context) { ctx := sdk.NewContext(stateStore, tmproto.Header{}, false, log.NewNopLogger()) // Initialize params - k.SetParams(ctx, types.DefaultParams()) + if err := k.SetParams(ctx, types.DefaultParams()); err != nil { + panic(err) + } return &k, ctx } diff --git a/x/btccheckpoint/genesis.go b/x/btccheckpoint/genesis.go index c74293d2e..a5246537b 100644 --- a/x/btccheckpoint/genesis.go +++ b/x/btccheckpoint/genesis.go @@ -9,7 +9,10 @@ import ( // InitGenesis initializes the capability module's state from a provided genesis // state. func InitGenesis(ctx sdk.Context, k keeper.Keeper, genState types.GenesisState) { - k.SetParams(ctx, genState.Params) + // set params for this module + if err := k.SetParams(ctx, genState.Params); err != nil { + panic(err) + } } // ExportGenesis returns the capability module's exported genesis. diff --git a/x/btccheckpoint/genesis_test.go b/x/btccheckpoint/genesis_test.go index 47c4323bb..ad9afac65 100644 --- a/x/btccheckpoint/genesis_test.go +++ b/x/btccheckpoint/genesis_test.go @@ -15,7 +15,10 @@ func TestExportGenesis(t *testing.T) { app := simapp.Setup(t, false) ctx := app.BaseApp.NewContext(false, tmproto.Header{}) - app.BtcCheckpointKeeper.SetParams(ctx, types.DefaultParams()) + if err := app.BtcCheckpointKeeper.SetParams(ctx, types.DefaultParams()); err != nil { + panic(err) + } + genesisState := btccheckpoint.ExportGenesis(ctx, app.BtcCheckpointKeeper) require.Equal(t, genesisState.Params, types.DefaultParams()) } @@ -26,12 +29,12 @@ func TestInitGenesis(t *testing.T) { genesisState := types.GenesisState{ Params: types.Params{ - BtcConfirmationDepth: 999, - CheckpointFinalizationTimeout: 888, + BtcConfirmationDepth: 888, + CheckpointFinalizationTimeout: 999, }, } btccheckpoint.InitGenesis(ctx, app.BtcCheckpointKeeper, genesisState) - require.Equal(t, app.BtcCheckpointKeeper.GetParams(ctx).BtcConfirmationDepth, uint64(999)) - require.Equal(t, app.BtcCheckpointKeeper.GetParams(ctx).CheckpointFinalizationTimeout, uint64(888)) + require.Equal(t, app.BtcCheckpointKeeper.GetParams(ctx).BtcConfirmationDepth, uint64(888)) + require.Equal(t, app.BtcCheckpointKeeper.GetParams(ctx).CheckpointFinalizationTimeout, uint64(999)) } diff --git a/x/btccheckpoint/keeper/grpc_query_params_test.go b/x/btccheckpoint/keeper/grpc_query_params_test.go index 31d8af6a0..f12ae45f6 100644 --- a/x/btccheckpoint/keeper/grpc_query_params_test.go +++ b/x/btccheckpoint/keeper/grpc_query_params_test.go @@ -43,13 +43,24 @@ func FuzzParamsQuery(f *testing.F) { params.CheckpointFinalizationTimeout = uint64(rand.Int()) } + if btcConfirmationDepth >= checkpointFinalizationTimeout { + // validation should not pass with BtcConfirmationDepth >= CheckpointFinalizationTimeout + require.Error(t, params.Validate()) + + // swap the values so we can continue the test + params.CheckpointFinalizationTimeout = btcConfirmationDepth + params.BtcConfirmationDepth = checkpointFinalizationTimeout + } + keeper, ctx := testkeeper.NewBTCCheckpointKeeper(t, nil, nil, nil) wctx := sdk.WrapSDKContext(ctx) // if setParamsFlag == 0, set params setParamsFlag := rand.Intn(2) if setParamsFlag == 0 { - keeper.SetParams(ctx, params) + if err := keeper.SetParams(ctx, params); err != nil { + panic(err) + } } req := types.QueryParamsRequest{} resp, err := keeper.Params(wctx, &req) diff --git a/x/btccheckpoint/keeper/keeper.go b/x/btccheckpoint/keeper/keeper.go index 2461782b0..d89fbce7b 100644 --- a/x/btccheckpoint/keeper/keeper.go +++ b/x/btccheckpoint/keeper/keeper.go @@ -13,7 +13,6 @@ import ( "github.com/cosmos/cosmos-sdk/store/prefix" storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" - paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" ) type ( @@ -22,11 +21,11 @@ type ( storeKey storetypes.StoreKey tstoreKey storetypes.StoreKey memKey storetypes.StoreKey - paramstore paramtypes.Subspace btcLightClientKeeper types.BTCLightClientKeeper checkpointingKeeper types.CheckpointingKeeper powLimit *big.Int expectedCheckpointTag txformat.BabylonTag + authority string } submissionBtcError string @@ -63,27 +62,23 @@ func NewKeeper( storeKey, tstoreKey, memKey storetypes.StoreKey, - ps paramtypes.Subspace, bk types.BTCLightClientKeeper, ck types.CheckpointingKeeper, powLimit *big.Int, expectedTag txformat.BabylonTag, + authority string, ) Keeper { - // set KeyTable if it has not already been set - if !ps.HasKeyTable() { - ps = ps.WithKeyTable(types.ParamKeyTable()) - } return Keeper{ cdc: cdc, storeKey: storeKey, tstoreKey: tstoreKey, memKey: memKey, - paramstore: ps, btcLightClientKeeper: bk, checkpointingKeeper: ck, powLimit: powLimit, expectedCheckpointTag: expectedTag, + authority: authority, } } diff --git a/x/btccheckpoint/keeper/msg_server.go b/x/btccheckpoint/keeper/msg_server.go index 69ae6e0d3..45507a3d2 100644 --- a/x/btccheckpoint/keeper/msg_server.go +++ b/x/btccheckpoint/keeper/msg_server.go @@ -3,8 +3,10 @@ package keeper import ( "context" + errorsmod "cosmossdk.io/errors" "github.com/babylonchain/babylon/x/btccheckpoint/types" sdk "github.com/cosmos/cosmos-sdk/types" + govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" ) var _ types.MsgServer = msgServer{} @@ -91,3 +93,17 @@ func (m msgServer) InsertBTCSpvProof(ctx context.Context, req *types.MsgInsertBT return &types.MsgInsertBTCSpvProofResponse{}, nil } + +// UpdateParams updates the params. +func (ms msgServer) UpdateParams(goCtx context.Context, req *types.MsgUpdateParams) (*types.MsgUpdateParamsResponse, error) { + if ms.k.authority != req.Authority { + return nil, errorsmod.Wrapf(govtypes.ErrInvalidSigner, "invalid authority; expected %s, got %s", ms.k.authority, req.Authority) + } + + ctx := sdk.UnwrapSDKContext(goCtx) + if err := ms.k.SetParams(ctx, req.Params); err != nil { + return nil, err + } + + return &types.MsgUpdateParamsResponse{}, nil +} diff --git a/x/btccheckpoint/keeper/params.go b/x/btccheckpoint/keeper/params.go index e3202978d..a9f7dd3ed 100644 --- a/x/btccheckpoint/keeper/params.go +++ b/x/btccheckpoint/keeper/params.go @@ -5,13 +5,27 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" ) -// GetParams get all parameters as types.Params -func (k Keeper) GetParams(ctx sdk.Context) (params types.Params) { - k.paramstore.GetParamSet(ctx, ¶ms) - return params +// SetParams sets the x/btccheckpoint module parameters. +func (k Keeper) SetParams(ctx sdk.Context, p types.Params) error { + if err := p.Validate(); err != nil { + return err + } + + store := ctx.KVStore(k.storeKey) + bz := k.cdc.MustMarshal(&p) + store.Set(types.ParamsKey, bz) + + return nil } -// SetParams set the params -func (k Keeper) SetParams(ctx sdk.Context, params types.Params) { - k.paramstore.SetParamSet(ctx, ¶ms) +// GetParams returns the current x/btccheckpoint module parameters. +func (k Keeper) GetParams(ctx sdk.Context) (p types.Params) { + store := ctx.KVStore(k.storeKey) + bz := store.Get(types.ParamsKey) + if bz == nil { + return p + } + + k.cdc.MustUnmarshal(bz, &p) + return p } diff --git a/x/btccheckpoint/keeper/params_test.go b/x/btccheckpoint/keeper/params_test.go index 8f0dc7dce..d690964a2 100644 --- a/x/btccheckpoint/keeper/params_test.go +++ b/x/btccheckpoint/keeper/params_test.go @@ -10,9 +10,12 @@ import ( func TestGetParams(t *testing.T) { k, ctx := testkeeper.NewBTCCheckpointKeeper(t, nil, nil, nil) + params := types.DefaultParams() - k.SetParams(ctx, params) + if err := k.SetParams(ctx, params); err != nil { + panic(err) + } require.EqualValues(t, params, k.GetParams(ctx)) } diff --git a/x/btccheckpoint/types/codec.go b/x/btccheckpoint/types/codec.go index 27b141d5a..c5140de50 100644 --- a/x/btccheckpoint/types/codec.go +++ b/x/btccheckpoint/types/codec.go @@ -9,14 +9,18 @@ import ( ) func RegisterCodec(cdc *codec.LegacyAmino) { + cdc.RegisterConcrete(&MsgInsertBTCSpvProof{}, "btccheckpoint/MsgInsertBTCSpvProof", nil) + cdc.RegisterConcrete(&MsgUpdateParams{}, "btccheckpoint/MsgUpdateParams", nil) } func RegisterInterfaces(registry cdctypes.InterfaceRegistry) { - registry.RegisterImplementations((*sdk.Msg)(nil), &MsgInsertBTCSpvProof{}, ) - + registry.RegisterImplementations( + (*sdk.Msg)(nil), + &MsgUpdateParams{}, + ) msgservice.RegisterMsgServiceDesc(registry, &_Msg_serviceDesc) } diff --git a/x/btccheckpoint/types/keys.go b/x/btccheckpoint/types/keys.go index 8d831ef95..5c002734d 100644 --- a/x/btccheckpoint/types/keys.go +++ b/x/btccheckpoint/types/keys.go @@ -33,6 +33,7 @@ var ( EpochDataPrefix = []byte{4} LastFinalizedEpochKey = append([]byte{5}, []byte(LatestFinalizedEpochKey)...) BtcLightClientUpdatedKey = append([]byte{6}, []byte(btcLightClientUpdated)...) + ParamsKey = []byte{7} ) func KeyPrefix(p string) []byte { diff --git a/x/btccheckpoint/types/msgs.go b/x/btccheckpoint/types/msgs.go index 9c4fccf06..8ddca7c89 100644 --- a/x/btccheckpoint/types/msgs.go +++ b/x/btccheckpoint/types/msgs.go @@ -5,6 +5,8 @@ import ( fmt "fmt" "math/big" + errorsmod "cosmossdk.io/errors" + txformat "github.com/babylonchain/babylon/btctxformatter" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" @@ -13,6 +15,7 @@ import ( var ( // Ensure that MsgInsertBTCSpvProof implements all functions of the Msg interface _ sdk.Msg = (*MsgInsertBTCSpvProof)(nil) + _ sdk.Msg = (*MsgUpdateParams)(nil) ) // Parse and Validate transactions which should contain OP_RETURN data. @@ -130,3 +133,22 @@ func (m *MsgInsertBTCSpvProof) GetSigners() []sdk.AccAddress { return []sdk.AccAddress{submitter} } + +// GetSigners returns the expected signers for a MsgUpdateParams message. +func (m *MsgUpdateParams) GetSigners() []sdk.AccAddress { + addr, _ := sdk.AccAddressFromBech32(m.Authority) + return []sdk.AccAddress{addr} +} + +// ValidateBasic does a sanity check on the provided data. +func (m *MsgUpdateParams) ValidateBasic() error { + if _, err := sdk.AccAddressFromBech32(m.Authority); err != nil { + return errorsmod.Wrap(err, "invalid authority address") + } + + if err := m.Params.Validate(); err != nil { + return err + } + + return nil +} diff --git a/x/btccheckpoint/types/params.go b/x/btccheckpoint/types/params.go index aa0bef50f..4c61c889c 100644 --- a/x/btccheckpoint/types/params.go +++ b/x/btccheckpoint/types/params.go @@ -2,8 +2,6 @@ package types import ( fmt "fmt" - - paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" ) const ( @@ -11,18 +9,6 @@ const ( DefaultCheckpointFinalizationTimeout uint64 = 100 ) -var ( - KeyBtcConfirmationDepth = []byte("BtcConfirmationDepth") - KeyCheckpointFinalizationTimeout = []byte("CheckpointFinalizationTimeout") -) - -var _ paramtypes.ParamSet = (*Params)(nil) - -// ParamKeyTable the param key table for launch module -func ParamKeyTable() paramtypes.KeyTable { - return paramtypes.NewKeyTable().RegisterParamSet(&Params{}) -} - // NewParams creates a new Params instance func NewParams(btcConfirmationDepth uint64, checkpointFinalizationTimeout uint64) Params { return Params{ @@ -39,14 +25,6 @@ func DefaultParams() Params { ) } -// ParamSetPairs get the params.ParamSet -func (p *Params) ParamSetPairs() paramtypes.ParamSetPairs { - return paramtypes.ParamSetPairs{ - paramtypes.NewParamSetPair(KeyBtcConfirmationDepth, &p.BtcConfirmationDepth, validateBtcConfirmationDepth), - paramtypes.NewParamSetPair(KeyCheckpointFinalizationTimeout, &p.CheckpointFinalizationTimeout, validateCheckpointFinalizationTimeout), - } -} - // Validate validates the set of params func (p Params) Validate() error { if err := validateBtcConfirmationDepth(p.BtcConfirmationDepth); err != nil { diff --git a/x/btccheckpoint/types/tx.pb.go b/x/btccheckpoint/types/tx.pb.go index 80e1b00f8..d36a3a6ba 100644 --- a/x/btccheckpoint/types/tx.pb.go +++ b/x/btccheckpoint/types/tx.pb.go @@ -6,6 +6,9 @@ package types import ( context "context" fmt "fmt" + _ "github.com/cosmos/cosmos-proto" + _ "github.com/cosmos/cosmos-sdk/types/msgservice" + _ "github.com/cosmos/gogoproto/gogoproto" grpc1 "github.com/cosmos/gogoproto/grpc" proto "github.com/cosmos/gogoproto/proto" grpc "google.golang.org/grpc" @@ -119,31 +122,141 @@ func (m *MsgInsertBTCSpvProofResponse) XXX_DiscardUnknown() { var xxx_messageInfo_MsgInsertBTCSpvProofResponse proto.InternalMessageInfo +// MsgUpdateParams defines a message to update the btccheckpoint module params. +type MsgUpdateParams struct { + // authority is the address of the governance account. + // just FYI: cosmos.AddressString marks that this field should use type alias + // for AddressString instead of string, but the functionality is not yet implemented + // in cosmos-proto + Authority string `protobuf:"bytes,1,opt,name=authority,proto3" json:"authority,omitempty"` + // params defines the btccheckpoint parameters to update. + // + // NOTE: All parameters must be supplied. + Params Params `protobuf:"bytes,2,opt,name=params,proto3" json:"params"` +} + +func (m *MsgUpdateParams) Reset() { *m = MsgUpdateParams{} } +func (m *MsgUpdateParams) String() string { return proto.CompactTextString(m) } +func (*MsgUpdateParams) ProtoMessage() {} +func (*MsgUpdateParams) Descriptor() ([]byte, []int) { + return fileDescriptor_69a562325f8b35c5, []int{2} +} +func (m *MsgUpdateParams) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgUpdateParams) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgUpdateParams.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 *MsgUpdateParams) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgUpdateParams.Merge(m, src) +} +func (m *MsgUpdateParams) XXX_Size() int { + return m.Size() +} +func (m *MsgUpdateParams) XXX_DiscardUnknown() { + xxx_messageInfo_MsgUpdateParams.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgUpdateParams proto.InternalMessageInfo + +func (m *MsgUpdateParams) GetAuthority() string { + if m != nil { + return m.Authority + } + return "" +} + +func (m *MsgUpdateParams) GetParams() Params { + if m != nil { + return m.Params + } + return Params{} +} + +// MsgUpdateParamsResponse defines the response to the MsgUpdateParams message. +type MsgUpdateParamsResponse struct { +} + +func (m *MsgUpdateParamsResponse) Reset() { *m = MsgUpdateParamsResponse{} } +func (m *MsgUpdateParamsResponse) String() string { return proto.CompactTextString(m) } +func (*MsgUpdateParamsResponse) ProtoMessage() {} +func (*MsgUpdateParamsResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_69a562325f8b35c5, []int{3} +} +func (m *MsgUpdateParamsResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgUpdateParamsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgUpdateParamsResponse.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 *MsgUpdateParamsResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgUpdateParamsResponse.Merge(m, src) +} +func (m *MsgUpdateParamsResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgUpdateParamsResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgUpdateParamsResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgUpdateParamsResponse proto.InternalMessageInfo + func init() { proto.RegisterType((*MsgInsertBTCSpvProof)(nil), "babylon.btccheckpoint.v1.MsgInsertBTCSpvProof") proto.RegisterType((*MsgInsertBTCSpvProofResponse)(nil), "babylon.btccheckpoint.v1.MsgInsertBTCSpvProofResponse") + proto.RegisterType((*MsgUpdateParams)(nil), "babylon.btccheckpoint.v1.MsgUpdateParams") + proto.RegisterType((*MsgUpdateParamsResponse)(nil), "babylon.btccheckpoint.v1.MsgUpdateParamsResponse") } func init() { proto.RegisterFile("babylon/btccheckpoint/v1/tx.proto", fileDescriptor_69a562325f8b35c5) } var fileDescriptor_69a562325f8b35c5 = []byte{ - // 255 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x4c, 0x4a, 0x4c, 0xaa, - 0xcc, 0xc9, 0xcf, 0xd3, 0x4f, 0x2a, 0x49, 0x4e, 0xce, 0x48, 0x4d, 0xce, 0x2e, 0xc8, 0xcf, 0xcc, - 0x2b, 0xd1, 0x2f, 0x33, 0xd4, 0x2f, 0xa9, 0xd0, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x92, 0x80, - 0x2a, 0xd1, 0x43, 0x51, 0xa2, 0x57, 0x66, 0x28, 0xa5, 0x83, 0x53, 0x33, 0xaa, 0x52, 0xb0, 0x39, - 0x4a, 0xc5, 0x5c, 0x22, 0xbe, 0xc5, 0xe9, 0x9e, 0x79, 0xc5, 0xa9, 0x45, 0x25, 0x4e, 0x21, 0xce, - 0xc1, 0x05, 0x65, 0x01, 0x45, 0xf9, 0xf9, 0x69, 0x42, 0x32, 0x5c, 0x9c, 0xc5, 0xa5, 0x49, 0xb9, - 0x99, 0x25, 0x25, 0xa9, 0x45, 0x12, 0x8c, 0x0a, 0x8c, 0x1a, 0x9c, 0x41, 0x08, 0x01, 0x21, 0x5b, - 0x2e, 0xb6, 0x02, 0x90, 0xb2, 0x62, 0x09, 0x26, 0x05, 0x66, 0x0d, 0x6e, 0x23, 0x55, 0x3d, 0x5c, - 0xce, 0xd1, 0x43, 0x32, 0x34, 0x08, 0xaa, 0x49, 0x49, 0x8e, 0x4b, 0x06, 0x9b, 0xa5, 0x41, 0xa9, - 0xc5, 0x05, 0xf9, 0x79, 0xc5, 0xa9, 0x46, 0x4d, 0x8c, 0x5c, 0xcc, 0xbe, 0xc5, 0xe9, 0x42, 0xd5, - 0x5c, 0x82, 0x98, 0x2e, 0xd3, 0xc3, 0x6d, 0x17, 0x36, 0x43, 0xa5, 0xcc, 0x48, 0x53, 0x0f, 0x73, - 0x84, 0x93, 0xff, 0x89, 0x47, 0x72, 0x8c, 0x17, 0x1e, 0xc9, 0x31, 0x3e, 0x78, 0x24, 0xc7, 0x38, - 0xe1, 0xb1, 0x1c, 0xc3, 0x85, 0xc7, 0x72, 0x0c, 0x37, 0x1e, 0xcb, 0x31, 0x44, 0x99, 0xa6, 0x67, - 0x96, 0x64, 0x94, 0x26, 0xe9, 0x25, 0xe7, 0xe7, 0xea, 0x43, 0xcd, 0x4e, 0xce, 0x48, 0xcc, 0xcc, - 0x83, 0x71, 0xf4, 0x2b, 0xd0, 0xc2, 0xbe, 0xa4, 0xb2, 0x20, 0xb5, 0x38, 0x89, 0x0d, 0x1c, 0xe2, - 0xc6, 0x80, 0x00, 0x00, 0x00, 0xff, 0xff, 0x8a, 0x0e, 0xae, 0xdc, 0xde, 0x01, 0x00, 0x00, + // 425 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x52, 0xcb, 0xaa, 0xd3, 0x40, + 0x18, 0xce, 0x9c, 0x23, 0x85, 0xce, 0x11, 0xc5, 0x50, 0x38, 0x69, 0x28, 0x31, 0x06, 0x0a, 0x55, + 0x34, 0xa1, 0x15, 0xbb, 0x10, 0x14, 0x8c, 0x2b, 0x17, 0xc5, 0x92, 0xea, 0xc6, 0x8d, 0x24, 0xe9, + 0x38, 0x09, 0x36, 0x99, 0x61, 0xfe, 0x69, 0x69, 0x71, 0xe7, 0x13, 0xb8, 0xf5, 0x2d, 0x5c, 0xf8, + 0x10, 0x5d, 0x16, 0x57, 0xae, 0x44, 0xda, 0x85, 0x5b, 0x1f, 0x41, 0x9a, 0x0b, 0xbd, 0xd8, 0x88, + 0x67, 0x37, 0xff, 0xcc, 0x77, 0x9b, 0x8f, 0x1f, 0xdf, 0x09, 0xfc, 0x60, 0x31, 0x61, 0xa9, 0x13, + 0xc8, 0x30, 0x8c, 0x48, 0xf8, 0x9e, 0xb3, 0x38, 0x95, 0xce, 0xac, 0xeb, 0xc8, 0xb9, 0xcd, 0x05, + 0x93, 0x4c, 0xd5, 0x0a, 0x88, 0x7d, 0x00, 0xb1, 0x67, 0x5d, 0xfd, 0x7e, 0x25, 0xf9, 0x10, 0x9a, + 0xe9, 0xe8, 0xcd, 0x90, 0x41, 0xc2, 0xe0, 0x6d, 0x36, 0x39, 0xf9, 0x50, 0x3c, 0x5d, 0xe6, 0x93, + 0x93, 0x00, 0xdd, 0xb2, 0x13, 0xa0, 0xc5, 0x43, 0xbb, 0xd2, 0x81, 0xfb, 0xc2, 0x4f, 0x4a, 0x7e, + 0x83, 0x32, 0xca, 0x72, 0xdd, 0xed, 0x29, 0xbf, 0xb5, 0x00, 0x37, 0x06, 0x40, 0x5f, 0xa4, 0x40, + 0x84, 0x74, 0x5f, 0x3d, 0x1f, 0xf1, 0xd9, 0x50, 0x30, 0xf6, 0x4e, 0x6d, 0xe1, 0x3a, 0x4c, 0x83, + 0x24, 0x96, 0x92, 0x08, 0x0d, 0x99, 0xa8, 0x53, 0xf7, 0x76, 0x17, 0xea, 0x13, 0x5c, 0xe3, 0x5b, + 0x18, 0x68, 0x67, 0xe6, 0x79, 0xe7, 0xa2, 0xd7, 0xb6, 0xab, 0xfe, 0x6f, 0xef, 0x89, 0x7a, 0x05, + 0xc9, 0x32, 0x70, 0xeb, 0x94, 0xa9, 0x47, 0x80, 0xb3, 0x14, 0x88, 0xf5, 0x19, 0xe1, 0x9b, 0x03, + 0xa0, 0xaf, 0xf9, 0xd8, 0x97, 0x64, 0x98, 0x7d, 0x42, 0xed, 0xe3, 0xba, 0x3f, 0x95, 0x11, 0x13, + 0xb1, 0x5c, 0xe4, 0x81, 0x5c, 0xed, 0xdb, 0xd7, 0x07, 0x8d, 0xa2, 0xa3, 0x67, 0xe3, 0xb1, 0x20, + 0x00, 0x23, 0x29, 0xe2, 0x94, 0x7a, 0x3b, 0xa8, 0xfa, 0x14, 0xd7, 0xf2, 0x1a, 0xb4, 0x33, 0x13, + 0x75, 0x2e, 0x7a, 0x66, 0x75, 0xd4, 0xdc, 0xc9, 0xbd, 0xb6, 0xfc, 0x71, 0x5b, 0xf1, 0x0a, 0xd6, + 0xe3, 0x1b, 0x1f, 0x7f, 0x7d, 0xb9, 0xb7, 0xd3, 0xb3, 0x9a, 0xf8, 0xf2, 0x28, 0x5a, 0x19, 0xbb, + 0xf7, 0x1b, 0xe1, 0xf3, 0x01, 0x50, 0xf5, 0x03, 0xbe, 0xf5, 0x77, 0xa1, 0x76, 0xb5, 0xef, 0xa9, + 0x2e, 0xf4, 0xfe, 0xd5, 0xf0, 0x65, 0x08, 0x75, 0x82, 0xaf, 0x1f, 0xf4, 0x76, 0xf7, 0x9f, 0x3a, + 0xfb, 0x50, 0xbd, 0xfb, 0xdf, 0xd0, 0xd2, 0xcd, 0x7d, 0xb9, 0x5c, 0x1b, 0x68, 0xb5, 0x36, 0xd0, + 0xcf, 0xb5, 0x81, 0x3e, 0x6d, 0x0c, 0x65, 0xb5, 0x31, 0x94, 0xef, 0x1b, 0x43, 0x79, 0xf3, 0x88, + 0xc6, 0x32, 0x9a, 0x06, 0x76, 0xc8, 0x12, 0xa7, 0x90, 0x0d, 0x23, 0x3f, 0x4e, 0xcb, 0xc1, 0x99, + 0x1f, 0xed, 0xab, 0x5c, 0x70, 0x02, 0x41, 0x2d, 0x5b, 0xcb, 0x87, 0x7f, 0x02, 0x00, 0x00, 0xff, + 0xff, 0x53, 0xca, 0xbd, 0x84, 0x74, 0x03, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -160,6 +273,8 @@ const _ = grpc.SupportPackageIsVersion4 type MsgClient interface { // InsertBTCSpvProof tries to insert a new checkpoint into the store. InsertBTCSpvProof(ctx context.Context, in *MsgInsertBTCSpvProof, opts ...grpc.CallOption) (*MsgInsertBTCSpvProofResponse, error) + // UpdateParams updates the btccheckpoint module parameters. + UpdateParams(ctx context.Context, in *MsgUpdateParams, opts ...grpc.CallOption) (*MsgUpdateParamsResponse, error) } type msgClient struct { @@ -179,10 +294,21 @@ func (c *msgClient) InsertBTCSpvProof(ctx context.Context, in *MsgInsertBTCSpvPr return out, nil } +func (c *msgClient) UpdateParams(ctx context.Context, in *MsgUpdateParams, opts ...grpc.CallOption) (*MsgUpdateParamsResponse, error) { + out := new(MsgUpdateParamsResponse) + err := c.cc.Invoke(ctx, "/babylon.btccheckpoint.v1.Msg/UpdateParams", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // MsgServer is the server API for Msg service. type MsgServer interface { // InsertBTCSpvProof tries to insert a new checkpoint into the store. InsertBTCSpvProof(context.Context, *MsgInsertBTCSpvProof) (*MsgInsertBTCSpvProofResponse, error) + // UpdateParams updates the btccheckpoint module parameters. + UpdateParams(context.Context, *MsgUpdateParams) (*MsgUpdateParamsResponse, error) } // UnimplementedMsgServer can be embedded to have forward compatible implementations. @@ -192,6 +318,9 @@ type UnimplementedMsgServer struct { func (*UnimplementedMsgServer) InsertBTCSpvProof(ctx context.Context, req *MsgInsertBTCSpvProof) (*MsgInsertBTCSpvProofResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method InsertBTCSpvProof not implemented") } +func (*UnimplementedMsgServer) UpdateParams(ctx context.Context, req *MsgUpdateParams) (*MsgUpdateParamsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpdateParams not implemented") +} func RegisterMsgServer(s grpc1.Server, srv MsgServer) { s.RegisterService(&_Msg_serviceDesc, srv) @@ -215,6 +344,24 @@ func _Msg_InsertBTCSpvProof_Handler(srv interface{}, ctx context.Context, dec fu return interceptor(ctx, in, info, handler) } +func _Msg_UpdateParams_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgUpdateParams) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).UpdateParams(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/babylon.btccheckpoint.v1.Msg/UpdateParams", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).UpdateParams(ctx, req.(*MsgUpdateParams)) + } + return interceptor(ctx, in, info, handler) +} + var _Msg_serviceDesc = grpc.ServiceDesc{ ServiceName: "babylon.btccheckpoint.v1.Msg", HandlerType: (*MsgServer)(nil), @@ -223,6 +370,10 @@ var _Msg_serviceDesc = grpc.ServiceDesc{ MethodName: "InsertBTCSpvProof", Handler: _Msg_InsertBTCSpvProof_Handler, }, + { + MethodName: "UpdateParams", + Handler: _Msg_UpdateParams_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "babylon/btccheckpoint/v1/tx.proto", @@ -295,6 +446,69 @@ func (m *MsgInsertBTCSpvProofResponse) MarshalToSizedBuffer(dAtA []byte) (int, e return len(dAtA) - i, nil } +func (m *MsgUpdateParams) 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 *MsgUpdateParams) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgUpdateParams) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size, err := m.Params.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + if len(m.Authority) > 0 { + i -= len(m.Authority) + copy(dAtA[i:], m.Authority) + i = encodeVarintTx(dAtA, i, uint64(len(m.Authority))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MsgUpdateParamsResponse) 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 *MsgUpdateParamsResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgUpdateParamsResponse) 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 @@ -334,6 +548,30 @@ func (m *MsgInsertBTCSpvProofResponse) Size() (n int) { return n } +func (m *MsgUpdateParams) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Authority) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = m.Params.Size() + n += 1 + l + sovTx(uint64(l)) + return n +} + +func (m *MsgUpdateParamsResponse) 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 } @@ -506,6 +744,171 @@ func (m *MsgInsertBTCSpvProofResponse) Unmarshal(dAtA []byte) error { } return nil } +func (m *MsgUpdateParams) 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: MsgUpdateParams: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgUpdateParams: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Authority", 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.Authority = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Params", 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 + } + if err := m.Params.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 *MsgUpdateParamsResponse) 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: MsgUpdateParamsResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgUpdateParamsResponse: 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 diff --git a/x/epoching/genesis.go b/x/epoching/genesis.go index 4176246b0..9cd920c89 100644 --- a/x/epoching/genesis.go +++ b/x/epoching/genesis.go @@ -10,7 +10,10 @@ import ( // state. func InitGenesis(ctx sdk.Context, k keeper.Keeper, genState types.GenesisState) { // set params for this module - k.SetParams(ctx, genState.Params) + if err := k.SetParams(ctx, genState.Params); err != nil { + panic(err) + } + // init epoch number k.InitEpoch(ctx) // init msg queue diff --git a/x/epoching/genesis_test.go b/x/epoching/genesis_test.go index e7b90c9ed..85a21d31f 100644 --- a/x/epoching/genesis_test.go +++ b/x/epoching/genesis_test.go @@ -15,7 +15,10 @@ func TestExportGenesis(t *testing.T) { app := simapp.Setup(t, false) ctx := app.BaseApp.NewContext(false, tmproto.Header{}) - app.EpochingKeeper.SetParams(ctx, types.DefaultParams()) + if err := app.EpochingKeeper.SetParams(ctx, types.DefaultParams()); err != nil { + panic(err) + } + genesisState := epoching.ExportGenesis(ctx, app.EpochingKeeper) require.Equal(t, genesisState.Params, types.DefaultParams()) } diff --git a/x/epoching/keeper/apphash_chain_test.go b/x/epoching/keeper/apphash_chain_test.go index b852bf270..2998b6d97 100644 --- a/x/epoching/keeper/apphash_chain_test.go +++ b/x/epoching/keeper/apphash_chain_test.go @@ -26,9 +26,14 @@ func FuzzAppHashChain(f *testing.F) { // set a random epoch interval epochInterval := rand.Uint64()%100 + 2 // the epoch interval should at at least 2 - k.SetParams(ctx, types.Params{ + + params := types.Params{ EpochInterval: epochInterval, - }) + } + + if err := k.SetParams(ctx, params); err != nil { + panic(err) + } // reach the end of the 1st epoch expectedHeight := epochInterval diff --git a/x/epoching/keeper/epochs_test.go b/x/epoching/keeper/epochs_test.go index 4720807ec..78577e7ae 100644 --- a/x/epoching/keeper/epochs_test.go +++ b/x/epoching/keeper/epochs_test.go @@ -25,9 +25,15 @@ func FuzzEpochs(f *testing.F) { // set a random epoch interval epochInterval := rand.Uint64()%100 + 2 // the epoch interval should at at least 2 - keeper.SetParams(ctx, types.Params{ + + params := types.Params{ EpochInterval: epochInterval, - }) + } + + if err := keeper.SetParams(ctx, params); err != nil { + panic(err) + } + // increment a random number of new blocks numIncBlocks := rand.Uint64()%1000 + 1 for i := uint64(0); i < numIncBlocks; i++ { diff --git a/x/epoching/keeper/grpc_query_test.go b/x/epoching/keeper/grpc_query_test.go index 663b0aeea..c4aac2066 100644 --- a/x/epoching/keeper/grpc_query_test.go +++ b/x/epoching/keeper/grpc_query_test.go @@ -43,7 +43,9 @@ func FuzzParamsQuery(f *testing.F) { // if setParamsFlag == 0, set params setParamsFlag := rand.Intn(2) if setParamsFlag == 0 { - keeper.SetParams(ctx, params) + if err := keeper.SetParams(ctx, params); err != nil { + panic(err) + } } req := types.QueryParamsRequest{} resp, err := queryClient.Params(wctx, &req) diff --git a/x/epoching/keeper/keeper.go b/x/epoching/keeper/keeper.go index 2969364f9..dbe78f4f9 100644 --- a/x/epoching/keeper/keeper.go +++ b/x/epoching/keeper/keeper.go @@ -8,21 +8,22 @@ import ( "github.com/cosmos/cosmos-sdk/codec" storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" - paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" "github.com/babylonchain/babylon/x/epoching/types" ) type ( Keeper struct { - cdc codec.BinaryCodec - storeKey storetypes.StoreKey - memKey storetypes.StoreKey - hooks types.EpochingHooks - paramstore paramtypes.Subspace - bk types.BankKeeper - stk types.StakingKeeper - router *baseapp.MsgServiceRouter + cdc codec.BinaryCodec + storeKey storetypes.StoreKey + memKey storetypes.StoreKey + hooks types.EpochingHooks + bk types.BankKeeper + stk types.StakingKeeper + router *baseapp.MsgServiceRouter + // the address capable of executing a MsgUpdateParams message. Typically, this + // should be the x/gov module account. + authority string } ) @@ -30,23 +31,19 @@ func NewKeeper( cdc codec.BinaryCodec, storeKey, memKey storetypes.StoreKey, - ps paramtypes.Subspace, bk types.BankKeeper, stk types.StakingKeeper, + authority string, ) Keeper { - // set KeyTable if it has not already been set - if !ps.HasKeyTable() { - ps = ps.WithKeyTable(types.ParamKeyTable()) - } return Keeper{ - cdc: cdc, - storeKey: storeKey, - memKey: memKey, - paramstore: ps, - hooks: nil, - bk: bk, - stk: stk, + cdc: cdc, + storeKey: storeKey, + memKey: memKey, + hooks: nil, + bk: bk, + stk: stk, + authority: authority, } } diff --git a/x/epoching/keeper/keeper_test.go b/x/epoching/keeper/keeper_test.go index 3ed8ed1d2..64a9aae1c 100644 --- a/x/epoching/keeper/keeper_test.go +++ b/x/epoching/keeper/keeper_test.go @@ -22,7 +22,11 @@ func TestParams(t *testing.T) { //modify a params, save, and retrieve expParams.EpochInterval = 777 - keeper.SetParams(ctx, expParams) + + if err := keeper.SetParams(ctx, expParams); err != nil { + panic(err) + } + resParams = keeper.GetParams(ctx) require.True(t, expParams.Equal(resParams)) } diff --git a/x/epoching/keeper/msg_server.go b/x/epoching/keeper/msg_server.go index 64fb4410f..17c2e1dec 100644 --- a/x/epoching/keeper/msg_server.go +++ b/x/epoching/keeper/msg_server.go @@ -8,6 +8,7 @@ import ( "github.com/cometbft/cometbft/crypto/tmhash" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" ) @@ -183,3 +184,20 @@ func (k msgServer) WrappedBeginRedelegate(goCtx context.Context, msg *types.MsgW return &types.MsgWrappedBeginRedelegateResponse{}, nil } + +// UpdateParams updates the params. +// TODO investigate when it is the best time to update the params. We can update them +// when the epoch changes, but we can also update them during the epoch and extend +// the epoch duration. +func (ms msgServer) UpdateParams(goCtx context.Context, req *types.MsgUpdateParams) (*types.MsgUpdateParamsResponse, error) { + if ms.authority != req.Authority { + return nil, errorsmod.Wrapf(govtypes.ErrInvalidSigner, "invalid authority; expected %s, got %s", ms.authority, req.Authority) + } + + ctx := sdk.UnwrapSDKContext(goCtx) + if err := ms.SetParams(ctx, req.Params); err != nil { + return nil, err + } + + return &types.MsgUpdateParamsResponse{}, nil +} diff --git a/x/epoching/keeper/params.go b/x/epoching/keeper/params.go index a365fa055..255ea6b27 100644 --- a/x/epoching/keeper/params.go +++ b/x/epoching/keeper/params.go @@ -6,12 +6,27 @@ import ( ) // GetParams get all parameters as types.Params -func (k Keeper) GetParams(ctx sdk.Context) (params types.Params) { - k.paramstore.GetParamSet(ctx, ¶ms) - return params +// SetParams sets the x/epoching module parameters. +func (k Keeper) SetParams(ctx sdk.Context, p types.Params) error { + if err := p.Validate(); err != nil { + return err + } + + store := ctx.KVStore(k.storeKey) + bz := k.cdc.MustMarshal(&p) + store.Set(types.ParamsKey, bz) + + return nil } -// SetParams set the params -func (k Keeper) SetParams(ctx sdk.Context, params types.Params) { - k.paramstore.SetParamSet(ctx, ¶ms) +// GetParams returns the current x/epoching module parameters. +func (k Keeper) GetParams(ctx sdk.Context) (p types.Params) { + store := ctx.KVStore(k.storeKey) + bz := store.Get(types.ParamsKey) + if bz == nil { + return p + } + + k.cdc.MustUnmarshal(bz, &p) + return p } diff --git a/x/epoching/keeper/params_test.go b/x/epoching/keeper/params_test.go index 4294a7eea..01ff49ae6 100644 --- a/x/epoching/keeper/params_test.go +++ b/x/epoching/keeper/params_test.go @@ -12,7 +12,9 @@ func TestGetParams(t *testing.T) { k, ctx := testkeeper.EpochingKeeper(t) params := types.DefaultParams() - k.SetParams(ctx, params) + if err := k.SetParams(ctx, params); err != nil { + panic(err) + } require.EqualValues(t, params, k.GetParams(ctx)) } diff --git a/x/epoching/types/codec.go b/x/epoching/types/codec.go index 99c0144fb..cb32c4dae 100644 --- a/x/epoching/types/codec.go +++ b/x/epoching/types/codec.go @@ -12,6 +12,7 @@ func RegisterCodec(cdc *codec.LegacyAmino) { cdc.RegisterConcrete(&MsgWrappedUndelegate{}, "epoching/WrappedUndelegate", nil) cdc.RegisterConcrete(&MsgWrappedBeginRedelegate{}, "epoching/WrappedBeginRedelegate", nil) cdc.RegisterConcrete(&QueuedMessage{}, "epoching/QueuedMessage", nil) + cdc.RegisterConcrete(&MsgUpdateParams{}, "epoching/MsgUpdateParams", nil) } func RegisterInterfaces(registry cdctypes.InterfaceRegistry) { @@ -32,6 +33,10 @@ func RegisterInterfaces(registry cdctypes.InterfaceRegistry) { (*sdk.Msg)(nil), &QueuedMessage{}, ) + registry.RegisterImplementations( + (*sdk.Msg)(nil), + &MsgUpdateParams{}, + ) msgservice.RegisterMsgServiceDesc(registry, &_Msg_serviceDesc) } diff --git a/x/epoching/types/keys.go b/x/epoching/types/keys.go index a5591b643..417a3b433 100644 --- a/x/epoching/types/keys.go +++ b/x/epoching/types/keys.go @@ -29,6 +29,7 @@ var ( ValidatorLifecycleKey = []byte{0x19} // key prefix for validator life cycle DelegationLifecycleKey = []byte{0x20} // key prefix for delegation life cycle AppHashKey = []byte{0x21} // key prefix for the app hash + ParamsKey = []byte{0x22} // key prefix for the parameters ) func KeyPrefix(p string) []byte { diff --git a/x/epoching/types/msg.go b/x/epoching/types/msg.go index abc9d3144..bac4f93b5 100644 --- a/x/epoching/types/msg.go +++ b/x/epoching/types/msg.go @@ -1,6 +1,7 @@ package types import ( + errorsmod "cosmossdk.io/errors" sdk "github.com/cosmos/cosmos-sdk/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" ) @@ -17,6 +18,7 @@ var ( _ sdk.Msg = &MsgWrappedDelegate{} _ sdk.Msg = &MsgWrappedUndelegate{} _ sdk.Msg = &MsgWrappedBeginRedelegate{} + _ sdk.Msg = &MsgUpdateParams{} ) // NewMsgWrappedDelegate creates a new MsgWrappedDelegate instance. @@ -120,3 +122,22 @@ func (msg MsgWrappedBeginRedelegate) ValidateBasic() error { } return msg.Msg.ValidateBasic() } + +// GetSigners returns the expected signers for a MsgUpdateParams message. +func (m *MsgUpdateParams) GetSigners() []sdk.AccAddress { + addr, _ := sdk.AccAddressFromBech32(m.Authority) + return []sdk.AccAddress{addr} +} + +// ValidateBasic does a sanity check on the provided data. +func (m *MsgUpdateParams) ValidateBasic() error { + if _, err := sdk.AccAddressFromBech32(m.Authority); err != nil { + return errorsmod.Wrap(err, "invalid authority address") + } + + if err := m.Params.Validate(); err != nil { + return err + } + + return nil +} diff --git a/x/epoching/types/params.go b/x/epoching/types/params.go index 32c7c2276..1b14269ed 100644 --- a/x/epoching/types/params.go +++ b/x/epoching/types/params.go @@ -2,8 +2,6 @@ package types import ( fmt "fmt" - - paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" ) const ( @@ -14,13 +12,6 @@ var ( KeyEpochInterval = []byte("EpochInterval") ) -var _ paramtypes.ParamSet = (*Params)(nil) - -// ParamKeyTable the param key table for launch module -func ParamKeyTable() paramtypes.KeyTable { - return paramtypes.NewKeyTable().RegisterParamSet(&Params{}) -} - // NewParams creates a new Params instance func NewParams(epochInterval uint64) Params { return Params{ @@ -28,13 +19,6 @@ func NewParams(epochInterval uint64) Params { } } -// ParamSetPairs get the params.ParamSet -func (p *Params) ParamSetPairs() paramtypes.ParamSetPairs { - return paramtypes.ParamSetPairs{ - paramtypes.NewParamSetPair(KeyEpochInterval, &p.EpochInterval, validateEpochInterval), - } -} - // DefaultParams returns a default set of parameters func DefaultParams() Params { return NewParams(DefaultEpochInterval) diff --git a/x/epoching/types/tx.pb.go b/x/epoching/types/tx.pb.go index 4c5d0aa48..56c8ce0b9 100644 --- a/x/epoching/types/tx.pb.go +++ b/x/epoching/types/tx.pb.go @@ -6,6 +6,8 @@ package types import ( context "context" fmt "fmt" + _ "github.com/cosmos/cosmos-proto" + _ "github.com/cosmos/cosmos-sdk/types/msgservice" types "github.com/cosmos/cosmos-sdk/x/staking/types" _ "github.com/cosmos/gogoproto/gogoproto" grpc1 "github.com/cosmos/gogoproto/grpc" @@ -257,6 +259,103 @@ func (m *MsgWrappedBeginRedelegateResponse) XXX_DiscardUnknown() { var xxx_messageInfo_MsgWrappedBeginRedelegateResponse proto.InternalMessageInfo +// MsgUpdateParams defines a message for updating epoching module parameters. +type MsgUpdateParams struct { + // authority is the address of the governance account. + // just FYI: cosmos.AddressString marks that this field should use type alias + // for AddressString instead of string, but the functionality is not yet implemented + // in cosmos-proto + Authority string `protobuf:"bytes,1,opt,name=authority,proto3" json:"authority,omitempty"` + // params defines the epoching paramaeters parameters to update. + // + // NOTE: All parameters must be supplied. + Params Params `protobuf:"bytes,2,opt,name=params,proto3" json:"params"` +} + +func (m *MsgUpdateParams) Reset() { *m = MsgUpdateParams{} } +func (m *MsgUpdateParams) String() string { return proto.CompactTextString(m) } +func (*MsgUpdateParams) ProtoMessage() {} +func (*MsgUpdateParams) Descriptor() ([]byte, []int) { + return fileDescriptor_a5fc8fed8f4e58b6, []int{6} +} +func (m *MsgUpdateParams) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgUpdateParams) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgUpdateParams.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 *MsgUpdateParams) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgUpdateParams.Merge(m, src) +} +func (m *MsgUpdateParams) XXX_Size() int { + return m.Size() +} +func (m *MsgUpdateParams) XXX_DiscardUnknown() { + xxx_messageInfo_MsgUpdateParams.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgUpdateParams proto.InternalMessageInfo + +func (m *MsgUpdateParams) GetAuthority() string { + if m != nil { + return m.Authority + } + return "" +} + +func (m *MsgUpdateParams) GetParams() Params { + if m != nil { + return m.Params + } + return Params{} +} + +// MsgUpdateParamsResponse is the response to the MsgUpdateParams message. +type MsgUpdateParamsResponse struct { +} + +func (m *MsgUpdateParamsResponse) Reset() { *m = MsgUpdateParamsResponse{} } +func (m *MsgUpdateParamsResponse) String() string { return proto.CompactTextString(m) } +func (*MsgUpdateParamsResponse) ProtoMessage() {} +func (*MsgUpdateParamsResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_a5fc8fed8f4e58b6, []int{7} +} +func (m *MsgUpdateParamsResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgUpdateParamsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgUpdateParamsResponse.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 *MsgUpdateParamsResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgUpdateParamsResponse.Merge(m, src) +} +func (m *MsgUpdateParamsResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgUpdateParamsResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgUpdateParamsResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgUpdateParamsResponse proto.InternalMessageInfo + func init() { proto.RegisterType((*MsgWrappedDelegate)(nil), "babylon.epoching.v1.MsgWrappedDelegate") proto.RegisterType((*MsgWrappedDelegateResponse)(nil), "babylon.epoching.v1.MsgWrappedDelegateResponse") @@ -264,35 +363,46 @@ func init() { proto.RegisterType((*MsgWrappedUndelegateResponse)(nil), "babylon.epoching.v1.MsgWrappedUndelegateResponse") proto.RegisterType((*MsgWrappedBeginRedelegate)(nil), "babylon.epoching.v1.MsgWrappedBeginRedelegate") proto.RegisterType((*MsgWrappedBeginRedelegateResponse)(nil), "babylon.epoching.v1.MsgWrappedBeginRedelegateResponse") + proto.RegisterType((*MsgUpdateParams)(nil), "babylon.epoching.v1.MsgUpdateParams") + proto.RegisterType((*MsgUpdateParamsResponse)(nil), "babylon.epoching.v1.MsgUpdateParamsResponse") } func init() { proto.RegisterFile("babylon/epoching/v1/tx.proto", fileDescriptor_a5fc8fed8f4e58b6) } var fileDescriptor_a5fc8fed8f4e58b6 = []byte{ - // 370 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x93, 0x4f, 0x4b, 0x3a, 0x41, - 0x18, 0xc7, 0x77, 0x7f, 0xc2, 0x8f, 0x78, 0x3a, 0x44, 0x9b, 0x44, 0x2d, 0x32, 0x96, 0x12, 0xfd, - 0x39, 0xcc, 0xa4, 0x51, 0x41, 0x74, 0x92, 0x4e, 0x81, 0x17, 0x41, 0xa2, 0x6e, 0xbb, 0xeb, 0x30, - 0x2e, 0xea, 0xce, 0xe6, 0x4c, 0xa2, 0xb7, 0x8e, 0x1d, 0x7b, 0x09, 0xbe, 0x9c, 0x8e, 0x1e, 0x3b, - 0x86, 0x5e, 0x7c, 0x19, 0xa1, 0xee, 0x38, 0xb2, 0xfe, 0xed, 0xa6, 0x7c, 0xbf, 0xcf, 0xe7, 0xf3, - 0xf0, 0x2c, 0x03, 0x29, 0xd7, 0x71, 0x3b, 0x75, 0x1e, 0x10, 0x1a, 0x72, 0xaf, 0xea, 0x07, 0x8c, - 0xb4, 0x72, 0x44, 0xb6, 0x71, 0xd8, 0xe4, 0x92, 0x5b, 0x7b, 0x51, 0x8a, 0x55, 0x8a, 0x5b, 0x39, - 0x3b, 0xc9, 0x38, 0xe3, 0xe3, 0x9c, 0x8c, 0x7e, 0x4d, 0xaa, 0x76, 0xda, 0xe3, 0xa2, 0xc1, 0x05, - 0x11, 0xd2, 0xa9, 0x4d, 0x30, 0x2e, 0x95, 0x8e, 0x66, 0x65, 0xca, 0x60, 0x15, 0x05, 0x7b, 0x6a, - 0x3a, 0x61, 0x48, 0x2b, 0x0f, 0xb4, 0x4e, 0x99, 0x23, 0xa9, 0x75, 0x0d, 0x89, 0x86, 0x60, 0x07, - 0xe6, 0x91, 0x79, 0xb6, 0x9d, 0xcf, 0xe2, 0x09, 0x04, 0x47, 0x10, 0x1c, 0x41, 0x70, 0x51, 0x30, - 0x35, 0x51, 0x1a, 0xf5, 0xef, 0xb6, 0x3e, 0xba, 0x69, 0x63, 0xd8, 0x4d, 0x1b, 0x99, 0x14, 0xd8, - 0xf3, 0xd8, 0x12, 0x15, 0x21, 0x0f, 0x04, 0xcd, 0x3c, 0x43, 0x52, 0xa7, 0xe5, 0xa0, 0xa2, 0xb4, - 0xb7, 0xb3, 0xda, 0x93, 0x15, 0x5a, 0x3d, 0x13, 0x17, 0x23, 0x48, 0x2d, 0x42, 0x4f, 0xd5, 0x1e, - 0x1c, 0xea, 0xbc, 0x40, 0x99, 0x1f, 0x94, 0xe8, 0xd4, 0x7f, 0x3f, 0xeb, 0xbf, 0x58, 0xe1, 0x8f, - 0x0d, 0xc6, 0x97, 0xc8, 0xc2, 0xf1, 0x52, 0x89, 0xda, 0x24, 0x3f, 0xfc, 0x07, 0x89, 0xa2, 0x60, - 0x56, 0x0d, 0x76, 0xe2, 0xe7, 0x3f, 0xc5, 0x0b, 0xbe, 0x30, 0x9e, 0x3f, 0xa8, 0x4d, 0x36, 0x2c, - 0x2a, 0xa9, 0xf5, 0x0a, 0xbb, 0xf3, 0x67, 0x3f, 0x5f, 0x43, 0xd1, 0x55, 0x3b, 0xb7, 0x71, 0x75, - 0xaa, 0x7c, 0x37, 0x61, 0x7f, 0xc9, 0xbd, 0xf1, 0x1a, 0x5a, 0xac, 0x6f, 0xdf, 0xfc, 0xad, 0xaf, - 0x56, 0x28, 0x3c, 0x7e, 0xf5, 0x91, 0xd9, 0xeb, 0x23, 0xf3, 0xa7, 0x8f, 0xcc, 0xcf, 0x01, 0x32, - 0x7a, 0x03, 0x64, 0x7c, 0x0f, 0x90, 0xf1, 0x72, 0xc9, 0x7c, 0x59, 0x7d, 0x73, 0xb1, 0xc7, 0x1b, - 0x24, 0x62, 0x7b, 0x55, 0xc7, 0x0f, 0xd4, 0x1f, 0xd2, 0xd6, 0x4f, 0x50, 0x76, 0x42, 0x2a, 0xdc, - 0xff, 0xe3, 0x77, 0x73, 0xf5, 0x1b, 0x00, 0x00, 0xff, 0xff, 0x97, 0xc6, 0x4a, 0xb3, 0xa3, 0x03, + // 514 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x94, 0x31, 0x6f, 0xd3, 0x40, + 0x1c, 0xc5, 0x6d, 0x82, 0x2a, 0xfa, 0x07, 0x51, 0x61, 0x22, 0x9a, 0x98, 0xc8, 0x29, 0x29, 0x08, + 0xa8, 0xe0, 0x4c, 0x8a, 0x28, 0xa2, 0x62, 0x21, 0x62, 0x42, 0x8a, 0x84, 0x8c, 0x2a, 0x04, 0x0b, + 0x3a, 0xdb, 0xa7, 0x8b, 0xd5, 0xda, 0x67, 0x7c, 0xd7, 0xaa, 0xd9, 0x10, 0x13, 0x23, 0x03, 0x1f, + 0xa0, 0x1f, 0x81, 0x81, 0x0f, 0xd1, 0x81, 0xa1, 0x62, 0x62, 0x42, 0x28, 0x19, 0xe0, 0x63, 0xa0, + 0xd8, 0x67, 0x5f, 0x70, 0x92, 0x26, 0xdd, 0x62, 0xbd, 0xf7, 0x7f, 0xbf, 0x17, 0xf9, 0xc9, 0xd0, + 0x70, 0xb1, 0xdb, 0xdf, 0x63, 0x91, 0x4d, 0x62, 0xe6, 0xf5, 0x82, 0x88, 0xda, 0x07, 0x6d, 0x5b, + 0x1c, 0xa2, 0x38, 0x61, 0x82, 0x19, 0x57, 0xa5, 0x8a, 0x72, 0x15, 0x1d, 0xb4, 0xcd, 0x2a, 0x65, + 0x94, 0xa5, 0xba, 0x3d, 0xfa, 0x95, 0x59, 0xcd, 0xa6, 0xc7, 0x78, 0xc8, 0xb8, 0xcd, 0x05, 0xde, + 0xcd, 0x62, 0x5c, 0x22, 0xb0, 0xca, 0x32, 0xd7, 0xa6, 0x91, 0x62, 0x9c, 0xe0, 0x90, 0x4b, 0x47, + 0x3d, 0x8b, 0x78, 0x97, 0x65, 0x67, 0x0f, 0x52, 0x5a, 0x95, 0xe9, 0x21, 0x4f, 0xcf, 0x42, 0x4e, + 0x33, 0xa1, 0xb5, 0x03, 0x46, 0x97, 0xd3, 0xd7, 0x09, 0x8e, 0x63, 0xe2, 0x3f, 0x27, 0x7b, 0x84, + 0x62, 0x41, 0x8c, 0x47, 0x50, 0x09, 0x39, 0xad, 0xe9, 0x6b, 0xfa, 0x9d, 0x8b, 0x9b, 0xeb, 0x48, + 0x46, 0xc9, 0x6a, 0x48, 0x56, 0x43, 0x5d, 0x4e, 0xf3, 0x0b, 0x67, 0xe4, 0xdf, 0xbe, 0xf0, 0xe9, + 0xa8, 0xa9, 0xfd, 0x3d, 0x6a, 0x6a, 0xad, 0x06, 0x98, 0x93, 0xb1, 0x0e, 0xe1, 0x31, 0x8b, 0x38, + 0x69, 0xbd, 0x81, 0xaa, 0x52, 0x77, 0x22, 0x3f, 0xc7, 0x3e, 0x1e, 0xc7, 0xde, 0x3a, 0x05, 0xab, + 0x6e, 0xca, 0x60, 0x0b, 0x1a, 0xd3, 0xa2, 0x0b, 0xb4, 0x07, 0x75, 0xa5, 0x77, 0x08, 0x0d, 0x22, + 0x87, 0x14, 0xfc, 0xa7, 0xe3, 0xfc, 0x8d, 0x53, 0xf8, 0xa5, 0xc3, 0x72, 0x89, 0x75, 0xb8, 0x31, + 0x13, 0x52, 0x34, 0xf9, 0xa2, 0xc3, 0xca, 0xe8, 0xaf, 0xc4, 0x3e, 0x16, 0xe4, 0x65, 0xfa, 0x1e, + 0x8d, 0x2d, 0x58, 0xc6, 0xfb, 0xa2, 0xc7, 0x92, 0x40, 0xf4, 0xd3, 0x1a, 0xcb, 0x9d, 0xda, 0x8f, + 0x6f, 0xf7, 0xab, 0xb2, 0xc9, 0x33, 0xdf, 0x4f, 0x08, 0xe7, 0xaf, 0x44, 0x12, 0x44, 0xd4, 0x51, + 0x56, 0xe3, 0x09, 0x2c, 0x65, 0x4b, 0xa8, 0x9d, 0x4b, 0xbb, 0x5f, 0x47, 0x53, 0x86, 0x87, 0x32, + 0x48, 0xe7, 0xfc, 0xf1, 0xaf, 0xa6, 0xe6, 0xc8, 0x83, 0xed, 0xcb, 0x1f, 0xff, 0x7c, 0xdd, 0x50, + 0x51, 0xad, 0x3a, 0xac, 0x96, 0x5a, 0xe5, 0x8d, 0x37, 0xbf, 0x57, 0xa0, 0xd2, 0xe5, 0xd4, 0xd8, + 0x85, 0x95, 0xf2, 0x60, 0x6e, 0x4f, 0x05, 0x4e, 0x4e, 0xc0, 0xb4, 0x17, 0x34, 0xe6, 0x50, 0xe3, + 0x3d, 0x5c, 0x99, 0x1c, 0xca, 0xdd, 0x39, 0x29, 0xca, 0x6a, 0xb6, 0x17, 0xb6, 0x16, 0xc8, 0x0f, + 0x3a, 0x5c, 0x9b, 0xb1, 0x10, 0x34, 0x27, 0xad, 0xe4, 0x37, 0xb7, 0xce, 0xe6, 0x2f, 0x2a, 0xb8, + 0x70, 0xe9, 0xbf, 0x61, 0xdc, 0x9c, 0x95, 0x33, 0xee, 0x32, 0xef, 0x2d, 0xe2, 0xca, 0x19, 0x9d, + 0x17, 0xc7, 0x03, 0x4b, 0x3f, 0x19, 0x58, 0xfa, 0xef, 0x81, 0xa5, 0x7f, 0x1e, 0x5a, 0xda, 0xc9, + 0xd0, 0xd2, 0x7e, 0x0e, 0x2d, 0xed, 0xed, 0x03, 0x1a, 0x88, 0xde, 0xbe, 0x8b, 0x3c, 0x16, 0xda, + 0x32, 0xd1, 0xeb, 0xe1, 0x20, 0xca, 0x1f, 0xec, 0x43, 0xf5, 0x11, 0x12, 0xfd, 0x98, 0x70, 0x77, + 0x29, 0xfd, 0x9a, 0x3c, 0xfc, 0x17, 0x00, 0x00, 0xff, 0xff, 0xcd, 0x69, 0x5c, 0x18, 0x0f, 0x05, 0x00, 0x00, } @@ -317,6 +427,8 @@ type MsgClient interface { // WrappedBeginRedelegate defines a method for performing a redelegation of // coins from a delegator and source validator to a destination validator. WrappedBeginRedelegate(ctx context.Context, in *MsgWrappedBeginRedelegate, opts ...grpc.CallOption) (*MsgWrappedBeginRedelegateResponse, error) + // UpdateParams defines a method for updating epoching module parameters. + UpdateParams(ctx context.Context, in *MsgUpdateParams, opts ...grpc.CallOption) (*MsgUpdateParamsResponse, error) } type msgClient struct { @@ -354,6 +466,15 @@ func (c *msgClient) WrappedBeginRedelegate(ctx context.Context, in *MsgWrappedBe return out, nil } +func (c *msgClient) UpdateParams(ctx context.Context, in *MsgUpdateParams, opts ...grpc.CallOption) (*MsgUpdateParamsResponse, error) { + out := new(MsgUpdateParamsResponse) + err := c.cc.Invoke(ctx, "/babylon.epoching.v1.Msg/UpdateParams", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // MsgServer is the server API for Msg service. type MsgServer interface { // WrappedDelegate defines a method for performing a delegation of coins from @@ -365,6 +486,8 @@ type MsgServer interface { // WrappedBeginRedelegate defines a method for performing a redelegation of // coins from a delegator and source validator to a destination validator. WrappedBeginRedelegate(context.Context, *MsgWrappedBeginRedelegate) (*MsgWrappedBeginRedelegateResponse, error) + // UpdateParams defines a method for updating epoching module parameters. + UpdateParams(context.Context, *MsgUpdateParams) (*MsgUpdateParamsResponse, error) } // UnimplementedMsgServer can be embedded to have forward compatible implementations. @@ -380,6 +503,9 @@ func (*UnimplementedMsgServer) WrappedUndelegate(ctx context.Context, req *MsgWr func (*UnimplementedMsgServer) WrappedBeginRedelegate(ctx context.Context, req *MsgWrappedBeginRedelegate) (*MsgWrappedBeginRedelegateResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method WrappedBeginRedelegate not implemented") } +func (*UnimplementedMsgServer) UpdateParams(ctx context.Context, req *MsgUpdateParams) (*MsgUpdateParamsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpdateParams not implemented") +} func RegisterMsgServer(s grpc1.Server, srv MsgServer) { s.RegisterService(&_Msg_serviceDesc, srv) @@ -439,6 +565,24 @@ func _Msg_WrappedBeginRedelegate_Handler(srv interface{}, ctx context.Context, d return interceptor(ctx, in, info, handler) } +func _Msg_UpdateParams_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgUpdateParams) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).UpdateParams(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/babylon.epoching.v1.Msg/UpdateParams", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).UpdateParams(ctx, req.(*MsgUpdateParams)) + } + return interceptor(ctx, in, info, handler) +} + var _Msg_serviceDesc = grpc.ServiceDesc{ ServiceName: "babylon.epoching.v1.Msg", HandlerType: (*MsgServer)(nil), @@ -455,6 +599,10 @@ var _Msg_serviceDesc = grpc.ServiceDesc{ MethodName: "WrappedBeginRedelegate", Handler: _Msg_WrappedBeginRedelegate_Handler, }, + { + MethodName: "UpdateParams", + Handler: _Msg_UpdateParams_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "babylon/epoching/v1/tx.proto", @@ -634,6 +782,69 @@ func (m *MsgWrappedBeginRedelegateResponse) MarshalToSizedBuffer(dAtA []byte) (i return len(dAtA) - i, nil } +func (m *MsgUpdateParams) 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 *MsgUpdateParams) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgUpdateParams) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size, err := m.Params.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + if len(m.Authority) > 0 { + i -= len(m.Authority) + copy(dAtA[i:], m.Authority) + i = encodeVarintTx(dAtA, i, uint64(len(m.Authority))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MsgUpdateParamsResponse) 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 *MsgUpdateParamsResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgUpdateParamsResponse) 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 @@ -711,6 +922,30 @@ func (m *MsgWrappedBeginRedelegateResponse) Size() (n int) { return n } +func (m *MsgUpdateParams) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Authority) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = m.Params.Size() + n += 1 + l + sovTx(uint64(l)) + return n +} + +func (m *MsgUpdateParamsResponse) 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 } @@ -1125,6 +1360,171 @@ func (m *MsgWrappedBeginRedelegateResponse) Unmarshal(dAtA []byte) error { } return nil } +func (m *MsgUpdateParams) 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: MsgUpdateParams: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgUpdateParams: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Authority", 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.Authority = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Params", 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 + } + if err := m.Params.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 *MsgUpdateParamsResponse) 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: MsgUpdateParamsResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgUpdateParamsResponse: 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 0cced27c86b7b6ce3d777df25f437deccef34470 Mon Sep 17 00:00:00 2001 From: danb Date: Fri, 7 Apr 2023 09:25:45 -0400 Subject: [PATCH 29/59] docker: Refactor to a lightweight unified image (#340) --------- Co-authored-by: Vitalis Salis --- .circleci/config.yml | 6 +-- Makefile | 61 ++++++++++++++------------ contrib/images/Makefile | 12 ++--- contrib/images/babylond-dlv/Dockerfile | 33 -------------- contrib/images/babylond-dlv/README.md | 37 ---------------- contrib/images/babylond-dlv/wrapper.sh | 24 ---------- contrib/images/babylond-env/Dockerfile | 32 -------------- contrib/images/babylond-env/wrapper.sh | 19 -------- contrib/images/babylond/Dockerfile | 58 ++++++++++++++++++++++++ docker-compose.yml | 26 +++++------ 10 files changed, 108 insertions(+), 200 deletions(-) delete mode 100644 contrib/images/babylond-dlv/Dockerfile delete mode 100644 contrib/images/babylond-dlv/README.md delete mode 100755 contrib/images/babylond-dlv/wrapper.sh delete mode 100644 contrib/images/babylond-env/Dockerfile delete mode 100755 contrib/images/babylond-env/wrapper.sh create mode 100644 contrib/images/babylond/Dockerfile diff --git a/.circleci/config.yml b/.circleci/config.yml index 6a3b6660e..3ef7fbc5d 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -36,9 +36,7 @@ jobs: - run: # sudo is needed, so that integration test binary have proper access to nodes keyring name: Run integration tests command: | - make localnet-start-test - sudo -E env "PATH=$PATH" make test-babylon-integration - make localnet-stop + sudo -E env "PATH=$PATH" make localnet-test-integration # TODO: If CI tests will take to long consider having only this e2e test # instead of separate integration tests and e2e tests. - run: @@ -69,7 +67,7 @@ jobs: - aws-ecr/build-image: push-image: false dockerfile: Dockerfile - path: ./contrib/images/babylond-env/ + path: ./contrib/images/babylond/ build-path: ./ tag: "$CIRCLE_SHA1,$CIRCLE_TAG" repo: "babylond" diff --git a/Makefile b/Makefile index dac0844f3..c0863a8a6 100644 --- a/Makefile +++ b/Makefile @@ -222,10 +222,13 @@ endif .PHONY: run-tests test test-all $(TEST_TARGETS) -test-babylon-integration: +test-integration: @echo "Running babylon integration test" @go test github.com/babylonchain/babylon/test -v -count=1 --tags=integration -p 1 +test-e2e: + go test -mod=readonly -timeout=25m -v $(PACKAGES_E2E) -count=1 --tags=e2e + test-sim-nondeterminism: @echo "Running non-determinism test..." @go test -mod=readonly $(SIMAPP) -run TestAppStateDeterminism -Enabled=true \ @@ -377,49 +380,49 @@ proto-lint: .PHONY: proto-gen proto-swagger-gen proto-format prot-lint ############################################################################### -### Localnet ### +### Docker ### ############################################################################### -localnet-build-env: - $(MAKE) -C contrib/images babylond-env +build-docker: + $(MAKE) -C contrib/images babylond -localnet-build-dlv: - $(MAKE) -C contrib/images babylond-dlv +.PHONY: build-docker -localnet-build-nodes-test: - $(DOCKER) run --rm -v $(CURDIR)/.testnets:/data babylonchain/babylond \ - testnet init-files --v 4 -o /data \ +############################################################################### +### Localnet ### +############################################################################### + +# init-testnet-dirs will create a ./.testnets directory containing configuration for 4 Babylon nodes +init-testnet-dirs: + # need to create the dir before hand so that the docker container has write access to the `.testnets` dir + # regardless of the user it uses + mkdir -p $(CURDIR)/.testnets && chmod o+w $(CURDIR)/.testnets + $(DOCKER) run --rm -v $(CURDIR)/.testnets:/home/babylon/.testnets:Z babylonchain/babylond \ + babylond testnet init-files --v 4 -o /home/babylon/.testnets \ --starting-ip-address 192.168.10.2 --keyring-backend=test \ --chain-id chain-test --btc-confirmation-depth 2 --additional-sender-account true \ --epoch-interval 5 - docker-compose up -d -localnet-build-nodes: - $(DOCKER) run --rm -v $(CURDIR)/.testnets:/data babylonchain/babylond \ - testnet init-files --v 4 -o /data \ - --starting-ip-address 192.168.10.2 --keyring-backend=test \ - --chain-id chain-test +# localnet-start-nodes will boot the nodes described in the docker-compose.yml file +localnet-start-nodes: init-testnet-dirs docker-compose up -d # localnet-start will run a with 4 nodes with 4 nodes, a bitcoin instance, and a vigilante instance -localnet-start: localnet-stop localnet-build-env localnet-build-nodes - -# localnet-start-test will start with 4 nodes with test confiuration and low -# epoch interval -localnet-start-test: localnet-stop localnet-build-env localnet-build-nodes-test - -# localnet-debug will run a 4-node testnet locally in debug mode -# you can read more about the debug mode here: ./contrib/images/babylond-dlv/README.md -localnet-debug: localnet-stop localnet-build-dlv localnet-build-nodes - -test-e2e: - go test -mod=readonly -timeout=25m -v $(PACKAGES_E2E) -count=1 --tags=e2e +localnet-start: localnet-stop build-docker localnet-start-nodes +# localnet-stop will stop all localnets running localnet-stop: docker-compose down -.PHONY: localnet-start localnet-stop localnet-debug localnet-build-env \ -localnet-build-dlv localnet-build-nodes +# localnet-test-integration will spin up a localnet and run integration tests on it +localnet-test-integration: localnet-start test-integration localnet-stop + +.PHONY: \ +init-testnet-dirs \ +localnet-start-nodes \ +localnet-start \ +localnet-test-integration \ +localnet-stop .PHONY: diagrams diagrams: diff --git a/contrib/images/Makefile b/contrib/images/Makefile index 998778ef6..711077c7e 100644 --- a/contrib/images/Makefile +++ b/contrib/images/Makefile @@ -1,14 +1,10 @@ -all: babylond-env +all: babylond -babylond-env: babylond-rmi - docker build --tag babylonchain/babylond -f babylond-env/Dockerfile \ +babylond: babylond-rmi + docker build --tag babylonchain/babylond -f babylond/Dockerfile \ $(shell git rev-parse --show-toplevel) -babylond-dlv: babylond-rmi - docker build --tag babylonchain/babylond -f babylond-dlv/Dockerfile \ - $(shell git rev-parse --show-toplevel) - babylond-rmi: docker rmi babylonchain/babylond 2>/dev/null; true -.PHONY: all babylond-env babylond-dlv babylond-rmi +.PHONY: all babylondbabylond-rmi diff --git a/contrib/images/babylond-dlv/Dockerfile b/contrib/images/babylond-dlv/Dockerfile deleted file mode 100644 index e8244789a..000000000 --- a/contrib/images/babylond-dlv/Dockerfile +++ /dev/null @@ -1,33 +0,0 @@ -FROM golang:1.19-alpine AS build -RUN apk add build-base git linux-headers libc-dev -RUN go install github.com/go-delve/delve/cmd/dlv@latest -WORKDIR /work -COPY go.mod go.sum /work/ -RUN go mod download - -# Cosmwasm - Download correct libwasmvm version -RUN WASMVM_VERSION=$(go list -m github.com/CosmWasm/wasmvm | cut -d ' ' -f 2) && \ - wget https://github.com/CosmWasm/wasmvm/releases/download/$WASMVM_VERSION/libwasmvm_muslc.$(uname -m).a \ - -O /lib/libwasmvm_muslc.a && \ - # verify checksum - wget https://github.com/CosmWasm/wasmvm/releases/download/$WASMVM_VERSION/checksums.txt -O /tmp/checksums.txt && \ - sha256sum /lib/libwasmvm_muslc.a | grep $(cat /tmp/checksums.txt | grep $(uname -m) | cut -d ' ' -f 1) - -# Copy the remaining files -COPY . . - -RUN LEDGER_ENABLED=false BUILD_TAGS=muslc LINK_STATICALLY=true make COSMOS_BUILD_OPTIONS="debug,nostrip" clean build - -FROM alpine:3.14 AS run -RUN apk add bash curl jq -COPY contrib/images/babylond-dlv/wrapper.sh /usr/bin/wrapper.sh - -VOLUME /babylond -COPY --from=build /work/build/babylond /babylond/ -COPY --from=build /go/bin/dlv /usr/local/bin -WORKDIR /babylond - -EXPOSE 26656 26657 2345 1317 -ENTRYPOINT ["/usr/bin/wrapper.sh"] -CMD ["start", "--log_format", "plain"] -STOPSIGNAL SIGTERM diff --git a/contrib/images/babylond-dlv/README.md b/contrib/images/babylond-dlv/README.md deleted file mode 100644 index 9cf7671c5..000000000 --- a/contrib/images/babylond-dlv/README.md +++ /dev/null @@ -1,37 +0,0 @@ -# Remote Debugging with go-delve - -[Delve](https://github.com/go-delve/delve) is a debugger for the Go programming language. The goal of the project is to provide a simple, full featured debugging tool for Go. Delve should be easy to invoke and easy to use. Chances are if you're using a debugger, things aren't going your way. With that in mind, Delve should stay out of your way as much as possible. - -## Use-case - -Cosmos-SDK provides you with a local network to bootstrap a chain in your machine, but how does one debug a node or module? - -If we start a single node, we won't be able to debug transactions as the machine will be in bootstrapping phase trying to find peers to connect too, thats why we need to start a local network. - -But the current `localnet-start` does not provide us with debugging tools so that's why there is a different image for debugging a local network, that is to avoid any issues in the future were debugging won't be needed. - -Both `babylond-env` and `babylond-dlv` work and run the same, except that `babylond-dlv` uses `go-delve` to run the binaries. - -## How to use - -The command to start a local network in debug mode is: - -```shell -# make localnet-debug -``` - -The command to stop the local network and destroy its containers is: - -```shell -# make localnet-stop -``` - -__note: this works the same for both `localnet-start` and `localnet-debug`__ - -Now, by default only `babylonnode0` is run in debug mode, but you can run any of the other nodes in debug mode by changing the `DEBUG` environment variable to `1` in `docker-compose.yml`. - -## How to connect - -Delve will open a port on `2345` for `babylonnode0` and it will increment for each of the other nodes that have `DEBUG` set to `1`. - -You can connect to the debugging server either through [GoLand IDE](https://www.jetbrains.com/help/go/attach-to-running-go-processes-with-debugger.html) or you can use [delve cli](https://github.com/go-delve/delve/blob/master/Documentation/usage/dlv_connect.md) command. diff --git a/contrib/images/babylond-dlv/wrapper.sh b/contrib/images/babylond-dlv/wrapper.sh deleted file mode 100755 index 21b6badbb..000000000 --- a/contrib/images/babylond-dlv/wrapper.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/usr/bin/env sh -set -euo pipefail -set -x - -DEBUG=${DEBUG:-0} -BINARY=/babylond/${BINARY:-babylond} -LOG=${LOG:-babylond.log} - -if ! [ -f "${BINARY}" ]; then - echo "The binary $(basename "${BINARY}") cannot be found. Please add the binary to the shared folder. Please use the BINARY environment variable if the name of the binary is not 'babylond'" - exit 1 -fi - -export BABYLONDHOME="${HOME:-/data/node0/babylond}" - -if [ "$DEBUG" -eq 1 ]; then - dlv --listen=:2345 --continue --headless=true --api-version=2 --accept-multiclient exec "${BINARY}" -- --home "${BABYLONDHOME}" "$@" -elif [ "$DEBUG" -eq 1 ] && [ -d "$(dirname "${BABYLONDHOME}"/"${LOG}")" ]; then - dlv --listen=:2345 --continue --headless=true --api-version=2 --accept-multiclient exec "${BINARY}" -- --home "${BABYLONDHOME}" "$@" | tee "${BABYLONDHOME}/${LOG}" -elif [ -d "$(dirname "${BABYLONDHOME}"/"${LOG}")" ]; then - "${BINARY}" --home "${BABYLONDHOME}" "$@" | tee "${BABYLONDHOME}/${LOG}" -else - "${BINARY}" --home "${BABYLONDHOME}" "$@" -fi diff --git a/contrib/images/babylond-env/Dockerfile b/contrib/images/babylond-env/Dockerfile deleted file mode 100644 index d29dac7bf..000000000 --- a/contrib/images/babylond-env/Dockerfile +++ /dev/null @@ -1,32 +0,0 @@ -FROM golang:1.19-alpine AS build -RUN apk add build-base git linux-headers -WORKDIR /work -COPY go.mod go.sum /work/ - -RUN go mod download - -# Cosmwasm - Download correct libwasmvm version -RUN WASMVM_VERSION=$(go list -m github.com/CosmWasm/wasmvm | cut -d ' ' -f 2) && \ - wget https://github.com/CosmWasm/wasmvm/releases/download/$WASMVM_VERSION/libwasmvm_muslc.$(uname -m).a \ - -O /lib/libwasmvm_muslc.a && \ - # verify checksum - wget https://github.com/CosmWasm/wasmvm/releases/download/$WASMVM_VERSION/checksums.txt -O /tmp/checksums.txt && \ - sha256sum /lib/libwasmvm_muslc.a | grep $(cat /tmp/checksums.txt | grep $(uname -m) | cut -d ' ' -f 1) - -# Copy the remaining files -COPY . . - -RUN LEDGER_ENABLED=false BUILD_TAGS=muslc LINK_STATICALLY=true make clean build - -FROM alpine:3.14 AS run -RUN apk add bash curl jq -COPY contrib/images/babylond-env/wrapper.sh /usr/bin/wrapper.sh - -VOLUME /babylond -COPY --from=build /work/build/babylond /babylond/ -WORKDIR /babylond - -EXPOSE 26656 26657 1317 9090 -ENTRYPOINT ["/usr/bin/wrapper.sh"] -CMD ["start", "--log_format", "plain"] -STOPSIGNAL SIGTERM diff --git a/contrib/images/babylond-env/wrapper.sh b/contrib/images/babylond-env/wrapper.sh deleted file mode 100755 index 539f5588a..000000000 --- a/contrib/images/babylond-env/wrapper.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env sh -set -euo pipefail -set -x - -BINARY=/babylond/${BINARY:-babylond} -LOG=${LOG:-babylond.log} - -if ! [ -f "${BINARY}" ]; then - echo "The binary $(basename "${BINARY}") cannot be found. Please add the binary to the shared folder. Please use the BINARY environment variable if the name of the binary is not 'babylond'" - exit 1 -fi - -export BABYLONDHOME="${HOME:-/data/node0/babylond}" - -if [ -d "$(dirname "${BABYLONDHOME}"/"${LOG}")" ]; then - "${BINARY}" --home "${BABYLONDHOME}" "$@" 2>&1 | tee "${BABYLONDHOME}/${LOG}" -else - "${BINARY}" --home "${BABYLONDHOME}" "$@" -fi diff --git a/contrib/images/babylond/Dockerfile b/contrib/images/babylond/Dockerfile new file mode 100644 index 000000000..e7991d04f --- /dev/null +++ b/contrib/images/babylond/Dockerfile @@ -0,0 +1,58 @@ +FROM golang:1.19-alpine AS build-env + +# Customize to your build env + +# TARGETPLATFORM should be one of linux/amd64 or linux/arm64. +ARG TARGETPLATFORM="linux/amd64" +# Version to build. Default is the Git HEAD. +ARG VERSION="HEAD" + +# Use muslc for static libs +ARG BUILD_TAGS="muslc" +ARG LEDGER_ENABLED="false" +# Cosmos build options +ARG COSMOS_BUILD_OPTIONS="" + +# Install cli tools for building and final image +RUN apk add --update --no-cache make git bash gcc linux-headers eudev-dev ncurses-dev openssh curl jq +RUN apk add --no-cache musl-dev + +# Build +WORKDIR /go/src/github.com/babylonchain +RUN git clone https://github.com/babylonchain/babylon.git +WORKDIR /go/src/github.com/babylonchain/babylon +RUN git fetch +RUN git checkout ${VERSION} + +# Cosmwasm - Download correct libwasmvm version +RUN WASMVM_VERSION=$(go list -m github.com/CosmWasm/wasmvm | cut -d ' ' -f 2) && \ + wget https://github.com/CosmWasm/wasmvm/releases/download/$WASMVM_VERSION/libwasmvm_muslc.$(uname -m).a \ + -O /lib/libwasmvm_muslc.a && \ + # verify checksum + wget https://github.com/CosmWasm/wasmvm/releases/download/$WASMVM_VERSION/checksums.txt -O /tmp/checksums.txt && \ + sha256sum /lib/libwasmvm_muslc.a | grep $(cat /tmp/checksums.txt | grep $(uname -m) | cut -d ' ' -f 1) + +RUN LEDGER_ENABLED=$LEDGER_ENABLED \ + BUILD_TAGS=$BUILD_TAGS \ + COSMOS_BUILD_OPTIONS=$COSMOS_BUILD_OPTIONS \ + LINK_STATICALLY=true \ + make build + +FROM alpine:3.14 AS run +# Create a user +RUN addgroup --gid 1137 -S babylon && adduser --uid 1137 -S babylon -G babylon +RUN apk add bash curl jq + +# Label should match your github repo +LABEL org.opencontainers.image.source="https://github.com/babylonchain/babylond:${VERSION}" + +# Install Libraries +# COPY --from=build-env /usr/lib/libgcc_s.so.1 /lib/ +# COPY --from=build-env /lib/ld-musl*.so.1* /lib + +COPY --from=build-env /go/src/github.com/babylonchain/babylon/build/babylond /bin/babylond + +# Set home directory and user +WORKDIR /home/babylon +RUN chown -R babylon /home/babylon +USER babylon diff --git a/docker-compose.yml b/docker-compose.yml index 0acb4f90d..e864519c6 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -4,10 +4,8 @@ services: babylondnode0: container_name: babylondnode0 image: "babylonchain/babylond" - environment: - - DEBUG=1 - - HOME=/data/node0/babylond - - LOG=${LOG:-babylond.log} + command: > + babylond --home /babylondhome start --log_format 'plain' 2>&1 | tee /babylondhome/babylond.log cap_add: - SYS_PTRACE security_opt: @@ -18,7 +16,7 @@ services: - "9090:9090" - "2345:2345" volumes: - - ./.testnets:/data:Z + - ./.testnets/node0/babylond:/babylondhome:Z networks: localnet: ipv4_address: 192.168.10.2 @@ -26,10 +24,8 @@ services: babylondnode1: container_name: babylondnode1 image: "babylonchain/babylond" - environment: - - DEBUG=0 - - HOME=/data/node1/babylond - - LOG=${LOG:-babylond.log} + command: > + babylond --home /babylondhome start --log_format 'plain' 2>&1 | tee /babylondhome/babylond.log cap_add: - SYS_PTRACE security_opt: @@ -40,7 +36,7 @@ services: - "9091:9090" - "2346:2345" volumes: - - ./.testnets:/data:Z + - ./.testnets/node1/babylond:/babylondhome:Z networks: localnet: ipv4_address: 192.168.10.3 @@ -49,9 +45,10 @@ services: container_name: babylondnode2 image: "babylonchain/babylond" environment: - - DEBUG=0 - HOME=/data/node2/babylond - LOG=${LOG:-babylond.log} + command: > + babylond --home /babylondhome start --log_format 'plain' 2>&1 | tee /babylondhome/babylond.log cap_add: - SYS_PTRACE security_opt: @@ -62,7 +59,7 @@ services: - "9092:9090" - "2347:2345" volumes: - - ./.testnets:/data:Z + - ./.testnets/node2/babylond:/babylondhome:Z networks: localnet: ipv4_address: 192.168.10.4 @@ -71,9 +68,10 @@ services: container_name: babylondnode3 image: "babylonchain/babylond" environment: - - DEBUG=0 - HOME=/data/node3/babylond - LOG=${LOG:-babylond.log} + command: > + babylond --home /babylondhome start --log_format 'plain' 2>&1 | tee /babylondhome/babylond.log cap_add: - SYS_PTRACE security_opt: @@ -84,7 +82,7 @@ services: - "9093:9090" - "2348:2345" volumes: - - ./.testnets:/data:Z + - ./.testnets/node3/babylond:/babylondhome:Z networks: localnet: ipv4_address: 192.168.10.5 From 0f0e5810f49ac3747ca7e9f1bbefb3a24a7291b8 Mon Sep 17 00:00:00 2001 From: Vitalis Salis Date: Tue, 11 Apr 2023 09:37:02 +0300 Subject: [PATCH 30/59] fix: Make e2e tests work with new docker image (#345) --- test/e2e/configurer/chain/commands.go | 4 ++-- test/e2e/configurer/chain/node.go | 2 +- test/e2e/containers/containers.go | 14 +++++++++----- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/test/e2e/configurer/chain/commands.go b/test/e2e/configurer/chain/commands.go index c55d6f843..ffa17a544 100644 --- a/test/e2e/configurer/chain/commands.go +++ b/test/e2e/configurer/chain/commands.go @@ -54,7 +54,7 @@ func (n *NodeConfig) BankSend(amount string, sendAddress string, receiveAddress func (n *NodeConfig) SendHeaderHex(headerHex string) { n.LogActionF("btclightclient sending header %s", headerHex) - cmd := []string{"./babylond", "tx", "btclightclient", "insert-header", headerHex, "--from=val", "--gas=500000"} + cmd := []string{"babylond", "tx", "btclightclient", "insert-header", headerHex, "--from=val", "--gas=500000"} _, _, err := n.containerManager.ExecTxCmd(n.t, n.chainId, n.Name, cmd) require.NoError(n.t, err) n.LogActionF("successfully inserted header %s", headerHex) @@ -89,7 +89,7 @@ func (n *NodeConfig) InsertProofs(p1 *btccheckpointtypes.BTCSpvProof, p2 *btcche p1HexBytes := hex.EncodeToString(p1bytes) p2HexBytes := hex.EncodeToString(p2bytes) - cmd := []string{"./babylond", "tx", "btccheckpoint", "insert-proofs", p1HexBytes, p2HexBytes, "--from=val"} + cmd := []string{"babylond", "tx", "btccheckpoint", "insert-proofs", p1HexBytes, p2HexBytes, "--from=val"} _, _, err = n.containerManager.ExecTxCmd(n.t, n.chainId, n.Name, cmd) require.NoError(n.t, err) n.LogActionF("successfully inserted btc spv proofs") diff --git a/test/e2e/configurer/chain/node.go b/test/e2e/configurer/chain/node.go index fb1336b43..ac7c27f0b 100644 --- a/test/e2e/configurer/chain/node.go +++ b/test/e2e/configurer/chain/node.go @@ -145,7 +145,7 @@ func (n *NodeConfig) extractOperatorAddressIfValidator() error { return nil } - cmd := []string{"./babylond", "debug", "addr", n.PublicKey} + cmd := []string{"babylond", "debug", "addr", n.PublicKey} n.t.Logf("extracting validator operator addresses for validator: %s", n.Name) _, errBuf, err := n.containerManager.ExecCmd(n.t, n.Name, cmd, "") if err != nil { diff --git a/test/e2e/containers/containers.go b/test/e2e/containers/containers.go index 62d0b3e61..7806d6bda 100644 --- a/test/e2e/containers/containers.go +++ b/test/e2e/containers/containers.go @@ -61,7 +61,7 @@ func (m *Manager) ExecTxCmd(t *testing.T, chainId string, containerName string, // namely adding flags `--chain-id={chain-id} -b=block --yes --keyring-backend=test "--log_format=json"`, // and searching for `successStr` func (m *Manager) ExecTxCmdWithSuccessString(t *testing.T, chainId string, containerName string, command []string, successStr string) (bytes.Buffer, bytes.Buffer, error) { - allTxArgs := []string{fmt.Sprintf("--chain-id=%s", chainId), "-b=sync", "--yes", "--keyring-backend=test", "--log_format=json", "--home=/babylondata"} + allTxArgs := []string{fmt.Sprintf("--chain-id=%s", chainId), "-b=sync", "--yes", "--keyring-backend=test", "--log_format=json", "--home=/home/babylon/babylondata"} txCommand := append(command, allTxArgs...) return m.ExecCmd(t, containerName, txCommand, successStr) } @@ -174,6 +174,7 @@ func (m *Manager) RunHermesResource(chainAID, osmoARelayerNodeName, osmoAValMnem PortBindings: map[docker.Port][]docker.PortBinding{ "3031/tcp": {{HostIP: "", HostPort: "3031"}}, }, + Platform: "linux/x86_64", Env: []string{ fmt.Sprintf("BBN_A_E2E_CHAIN_ID=%s", chainAID), fmt.Sprintf("BBN_B_E2E_CHAIN_ID=%s", chainBID), @@ -205,12 +206,15 @@ func (m *Manager) RunNodeResource(chainId string, containerName, valCondifDir st Repository: BabylonContainerName, NetworkID: m.network.Network.ID, User: "root:root", - Cmd: []string{"start"}, - Env: []string{ - "HOME=/babylondata", + Entrypoint: []string{ + "sh", + "-c", + "babylond start --home /home/babylon/babylondata", }, + ExposedPorts: []string{"26656", "26657", "1317", "9090"}, + Platform: "linux/x86_64", Mounts: []string{ - fmt.Sprintf("%s/:/babylondata", valCondifDir), + fmt.Sprintf("%s/:/home/babylon/babylondata", valCondifDir), }, } From a0cead99a54b4f4ecf7226364d24e14d455707be Mon Sep 17 00:00:00 2001 From: KonradStaniec Date: Thu, 13 Apr 2023 11:08:14 +0200 Subject: [PATCH 31/59] Custom bindings for smart contracts (#347) * Add custom queries to babylon --- .gitignore | 5 +- Makefile | 16 + app/app.go | 6 +- wasmbinding/bindings/query.go | 9 + wasmbinding/test/custom_query_test.go | 184 +++++ wasmbinding/testdata/Cargo.lock | 717 ++++++++++++++++++ wasmbinding/testdata/Cargo.toml | 13 + wasmbinding/testdata/README.md | 18 + wasmbinding/testdata/artifacts/checksums.txt | 2 + .../artifacts/checksums_intermediate.txt | 1 + .../testdata/artifacts/testdata-aarch64.wasm | Bin 0 -> 159438 bytes wasmbinding/testdata/artifacts/testdata.wasm | Bin 0 -> 159560 bytes wasmbinding/testdata/src/lib.rs | 4 + wasmbinding/wasm.go | 68 ++ 14 files changed, 1040 insertions(+), 3 deletions(-) create mode 100644 wasmbinding/bindings/query.go create mode 100644 wasmbinding/test/custom_query_test.go create mode 100644 wasmbinding/testdata/Cargo.lock create mode 100644 wasmbinding/testdata/Cargo.toml create mode 100644 wasmbinding/testdata/README.md create mode 100644 wasmbinding/testdata/artifacts/checksums.txt create mode 100644 wasmbinding/testdata/artifacts/checksums_intermediate.txt create mode 100644 wasmbinding/testdata/artifacts/testdata-aarch64.wasm create mode 100644 wasmbinding/testdata/artifacts/testdata.wasm create mode 100644 wasmbinding/testdata/src/lib.rs create mode 100644 wasmbinding/wasm.go diff --git a/.gitignore b/.gitignore index 607e987fd..cf18c804e 100644 --- a/.gitignore +++ b/.gitignore @@ -194,6 +194,9 @@ $RECYCLE.BIN/ # Windows shortcuts *.lnk +# Build artifacts for wasm contracts used in tests +wasmbinding/testdata/target + # End of https://www.toptal.com/developers/gitignore/api/intellij,vscode,macos,windows # The following content is adapted from https://github.com/osmosis-labs/osmosis/blob/main/.gitignore @@ -211,4 +214,4 @@ docs/diagrams/plantuml.jar .testnets/ .testnet/ mytestnet/ -output/ \ No newline at end of file +output/ diff --git a/Makefile b/Makefile index c0863a8a6..54ab1a201 100644 --- a/Makefile +++ b/Makefile @@ -13,6 +13,12 @@ SIMAPP = ./simapp BRANCH := $(shell git rev-parse --abbrev-ref HEAD) COMMIT := $(shell git log -1 --format='%H') +CUR_DIR := $(shell pwd) + +WASM_DIR := $(CUR_DIR)/wasmbinding/testdata + +WASM_DIR_BASE_NAME := $(shell basename $(WASM_DIR)) + # don't override user values ifeq (,$(VERSION)) # Find a name that exactly describes the current commit (e.g. a version tag) @@ -417,6 +423,16 @@ localnet-stop: # localnet-test-integration will spin up a localnet and run integration tests on it localnet-test-integration: localnet-start test-integration localnet-stop +build-test-wasm: + docker run --rm -v "$(WASM_DIR)":/code \ + --mount type=volume,source="$(WASM_DIR_BASE_NAME)_cache",target=/code/target \ + --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ + cosmwasm/rust-optimizer-arm64:0.12.13 + docker run --rm -v "$(WASM_DIR)":/code \ + --mount type=volume,source="$(WASM_DIR_BASE_NAME)_cache",target=/code/target \ + --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ + cosmwasm/rust-optimizer:0.12.13 + .PHONY: \ init-testnet-dirs \ localnet-start-nodes \ diff --git a/app/app.go b/app/app.go index 2683b9628..4e3b9ee20 100644 --- a/app/app.go +++ b/app/app.go @@ -15,9 +15,9 @@ import ( "github.com/CosmWasm/wasmd/x/wasm" wasmclient "github.com/CosmWasm/wasmd/x/wasm/client" wasmkeeper "github.com/CosmWasm/wasmd/x/wasm/keeper" - "github.com/babylonchain/babylon/client/docs" bbn "github.com/babylonchain/babylon/types" + owasm "github.com/babylonchain/babylon/wasmbinding" nodeservice "github.com/cosmos/cosmos-sdk/client/grpc/node" runtimeservices "github.com/cosmos/cosmos-sdk/runtime/services" "github.com/cosmos/cosmos-sdk/x/consensus" @@ -150,7 +150,7 @@ const ( // The last arguments can contain custom message handlers, and custom query handlers, // if we want to allow any custom callbacks // See https://github.com/CosmWasm/cosmwasm/blob/main/docs/CAPABILITIES-BUILT-IN.md - wasmCapabilities = "iterator,staking,stargate,cosmwasm_1_1,cosmwasm_1_2" + wasmCapabilities = "iterator,staking,stargate,cosmwasm_1_1,cosmwasm_1_2,babylon" ) var ( @@ -622,6 +622,8 @@ func NewBabylonApp( panic(fmt.Sprintf("error while reading wasm config: %s", err)) } + wasmOpts = append(owasm.RegisterCustomPlugins(&app.EpochingKeeper), wasmOpts...) + app.WasmKeeper = wasm.NewKeeper( appCodec, keys[wasm.StoreKey], diff --git a/wasmbinding/bindings/query.go b/wasmbinding/bindings/query.go new file mode 100644 index 000000000..d17459bf6 --- /dev/null +++ b/wasmbinding/bindings/query.go @@ -0,0 +1,9 @@ +package bindings + +type BabylonQuery struct { + Epoch *struct{} `json:"epoch,omitempty"` +} + +type CurrentEpochResponse struct { + Epoch uint64 `json:"epoch"` +} diff --git a/wasmbinding/test/custom_query_test.go b/wasmbinding/test/custom_query_test.go new file mode 100644 index 000000000..28343d472 --- /dev/null +++ b/wasmbinding/test/custom_query_test.go @@ -0,0 +1,184 @@ +package wasmbinding + +import ( + "encoding/json" + "os" + "runtime" + "testing" + "time" + + "github.com/CosmWasm/wasmd/x/wasm/keeper" + wasmvmtypes "github.com/CosmWasm/wasmvm/types" + "github.com/cometbft/cometbft/crypto" + "github.com/cometbft/cometbft/crypto/ed25519" + tmproto "github.com/cometbft/cometbft/proto/tendermint/types" + + "github.com/babylonchain/babylon/app" + "github.com/babylonchain/babylon/wasmbinding/bindings" + sdk "github.com/cosmos/cosmos-sdk/types" + bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" + minttypes "github.com/cosmos/cosmos-sdk/x/mint/types" + "github.com/stretchr/testify/require" +) + +// TODO consider doing it by enviromental variables as currently it may fail on some +// weird architectures +func getArtifactPath() string { + if runtime.GOARCH == "amd64" { + return "../testdata/artifacts/testdata.wasm" + } else if runtime.GOARCH == "arm64" { + return "../testdata/artifacts/testdata-aarch64.wasm" + } else { + panic("Unsupported architecture") + } +} + +var pathToContract = getArtifactPath() + +func TestQueryEpoch(t *testing.T) { + acc := randomAccountAddress() + babylonApp, ctx := setupAppWithContext(t) + fundAccount(t, ctx, babylonApp, acc) + + contractAddress := deployTestContract(t, ctx, babylonApp, acc, pathToContract) + + query := bindings.BabylonQuery{ + Epoch: &struct{}{}, + } + resp := bindings.CurrentEpochResponse{} + queryCustom(t, ctx, babylonApp, contractAddress, query, &resp) + require.Equal(t, resp.Epoch, uint64(0)) + + newEpoch := babylonApp.EpochingKeeper.IncEpoch(ctx) + + resp = bindings.CurrentEpochResponse{} + queryCustom(t, ctx, babylonApp, contractAddress, query, &resp) + require.Equal(t, resp.Epoch, newEpoch.EpochNumber) +} + +func setupAppWithContext(t *testing.T) (*app.BabylonApp, sdk.Context) { + babylonApp := app.Setup(t, false) + ctx := babylonApp.BaseApp.NewContext(false, tmproto.Header{Height: 1, Time: time.Now().UTC()}) + return babylonApp, ctx +} + +func keyPubAddr() (crypto.PrivKey, crypto.PubKey, sdk.AccAddress) { + key := ed25519.GenPrivKey() + pub := key.PubKey() + addr := sdk.AccAddress(pub.Address()) + return key, pub, addr +} + +func randomAccountAddress() sdk.AccAddress { + _, _, addr := keyPubAddr() + return addr +} + +func mintCoinsTo( + bankKeeper bankkeeper.Keeper, + ctx sdk.Context, + addr sdk.AccAddress, + amounts sdk.Coins) error { + if err := bankKeeper.MintCoins(ctx, minttypes.ModuleName, amounts); err != nil { + return err + } + + return bankKeeper.SendCoinsFromModuleToAccount(ctx, minttypes.ModuleName, addr, amounts) +} + +func fundAccount( + t *testing.T, + ctx sdk.Context, + bbn *app.BabylonApp, + acc sdk.AccAddress) { + + err := mintCoinsTo(bbn.BankKeeper, ctx, acc, sdk.NewCoins( + sdk.NewCoin("ubbn", sdk.NewInt(10000000000)), + )) + require.NoError(t, err) +} + +func storeTestCodeCode( + t *testing.T, + ctx sdk.Context, + babylonApp *app.BabylonApp, + addr sdk.AccAddress, + codePath string, +) (uint64, []byte) { + wasmCode, err := os.ReadFile(codePath) + + require.NoError(t, err) + permKeeper := keeper.NewPermissionedKeeper(babylonApp.WasmKeeper, keeper.DefaultAuthorizationPolicy{}) + id, checksum, err := permKeeper.Create(ctx, addr, wasmCode, nil) + require.NoError(t, err) + return id, checksum +} + +func instantiateExampleContract( + t *testing.T, + ctx sdk.Context, + bbn *app.BabylonApp, + funder sdk.AccAddress, + codeId uint64, +) sdk.AccAddress { + initMsgBz := []byte("{}") + contractKeeper := keeper.NewDefaultPermissionKeeper(bbn.WasmKeeper) + addr, _, err := contractKeeper.Instantiate(ctx, codeId, funder, funder, initMsgBz, "demo contract", nil) + require.NoError(t, err) + return addr +} + +func deployTestContract( + t *testing.T, + ctx sdk.Context, + bbn *app.BabylonApp, + deployer sdk.AccAddress, + codePath string, +) sdk.AccAddress { + + codeId, _ := storeTestCodeCode(t, ctx, bbn, deployer, codePath) + + contractAddr := instantiateExampleContract(t, ctx, bbn, deployer, codeId) + + return contractAddr +} + +type ExampleQuery struct { + Chain *ChainRequest `json:"chain,omitempty"` +} + +type ChainRequest struct { + Request wasmvmtypes.QueryRequest `json:"request"` +} + +type ChainResponse struct { + Data []byte `json:"data"` +} + +func queryCustom( + t *testing.T, + ctx sdk.Context, + bbn *app.BabylonApp, + contract sdk.AccAddress, + request bindings.BabylonQuery, + response interface{}, +) { + msgBz, err := json.Marshal(request) + require.NoError(t, err) + + query := ExampleQuery{ + Chain: &ChainRequest{ + Request: wasmvmtypes.QueryRequest{Custom: msgBz}, + }, + } + queryBz, err := json.Marshal(query) + require.NoError(t, err) + + resBz, err := bbn.WasmKeeper.QuerySmart(ctx, contract, queryBz) + require.NoError(t, err) + var resp ChainResponse + err = json.Unmarshal(resBz, &resp) + require.NoError(t, err) + err = json.Unmarshal(resp.Data, response) + require.NoError(t, err) +} diff --git a/wasmbinding/testdata/Cargo.lock b/wasmbinding/testdata/Cargo.lock new file mode 100644 index 000000000..61a704e23 --- /dev/null +++ b/wasmbinding/testdata/Cargo.lock @@ -0,0 +1,717 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "ahash" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" +dependencies = [ + "getrandom", + "once_cell", + "version_check", +] + +[[package]] +name = "babylon-bindings" +version = "0.1.0" +source = "git+https://github.com/babylonchain/bindings?branch=main#d027f75d7d9b5a3e908c613e15b9c9a083bc9a8d" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "schemars", + "serde", +] + +[[package]] +name = "babylon-example" +version = "0.1.0" +source = "git+https://github.com/babylonchain/bindings?branch=main#d027f75d7d9b5a3e908c613e15b9c9a083bc9a8d" +dependencies = [ + "babylon-bindings", + "cosmwasm-schema", + "cosmwasm-std", + "cosmwasm-storage", + "schemars", + "serde", + "thiserror", +] + +[[package]] +name = "base16ct" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" + +[[package]] +name = "base64" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" + +[[package]] +name = "base64ct" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" + +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "byteorder" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "const-oid" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "520fbf3c07483f94e3e3ca9d0cfd913d7718ef2483d2cfd91c0d9e91474ab913" + +[[package]] +name = "cosmwasm-crypto" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f22add0f9b2a5416df98c1d0248a8d8eedb882c38fbf0c5052b64eebe865df6d" +dependencies = [ + "digest 0.10.6", + "ed25519-zebra", + "k256", + "rand_core 0.6.4", + "thiserror", +] + +[[package]] +name = "cosmwasm-derive" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2e64f710a18ef90d0a632cf27842e98ffc2d005a38a6f76c12fd0bc03bc1a2d" +dependencies = [ + "syn 1.0.109", +] + +[[package]] +name = "cosmwasm-schema" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe5ad2e23a971b9e4cd57b20cee3e2e79c33799bed4b128e473aca3702bfe5dd" +dependencies = [ + "cosmwasm-schema-derive", + "schemars", + "serde", + "serde_json", + "thiserror", +] + +[[package]] +name = "cosmwasm-schema-derive" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2926d159a9bb1a716a592b40280f1663f2491a9de3b6da77c0933cee2a2655b8" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "cosmwasm-std" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76fee88ff5bf7bef55bd37ac0619974701b99bf6bd4b16cf56ee8810718abd71" +dependencies = [ + "base64", + "cosmwasm-crypto", + "cosmwasm-derive", + "derivative", + "forward_ref", + "hex", + "schemars", + "serde", + "serde-json-wasm", + "sha2 0.10.6", + "thiserror", + "uint", +] + +[[package]] +name = "cosmwasm-storage" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "639bc36408bc1ac45e3323166ceeb8f0b91b55a941c4ad59d389829002fbbd94" +dependencies = [ + "cosmwasm-std", + "serde", +] + +[[package]] +name = "cpufeatures" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "280a9f2d8b3a38871a3c8a46fb80db65e5e5ed97da80c4d08bf27fb63e35e181" +dependencies = [ + "libc", +] + +[[package]] +name = "crunchy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" + +[[package]] +name = "crypto-bigint" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef2b4b23cddf68b89b8f8069890e8c270d54e2d5fe1b143820234805e4cb17ef" +dependencies = [ + "generic-array", + "rand_core 0.6.4", + "subtle", + "zeroize", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "curve25519-dalek" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b9fdf9972b2bd6af2d913799d9ebc165ea4d2e65878e329d9c6b372c4491b61" +dependencies = [ + "byteorder", + "digest 0.9.0", + "rand_core 0.5.1", + "subtle", + "zeroize", +] + +[[package]] +name = "der" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1a467a65c5e759bce6e65eaf91cc29f466cdc57cb65777bd646872a8a1fd4de" +dependencies = [ + "const-oid", + "zeroize", +] + +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + +[[package]] +name = "digest" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" +dependencies = [ + "block-buffer 0.10.4", + "crypto-common", + "subtle", +] + +[[package]] +name = "dyn-clone" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68b0cf012f1230e43cd00ebb729c6bb58707ecfa8ad08b52ef3a4ccd2697fc30" + +[[package]] +name = "ecdsa" +version = "0.14.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413301934810f597c1d19ca71c8710e99a3f1ba28a0d2ebc01551a2daeea3c5c" +dependencies = [ + "der", + "elliptic-curve", + "rfc6979", + "signature", +] + +[[package]] +name = "ed25519-zebra" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c24f403d068ad0b359e577a77f92392118be3f3c927538f2bb544a5ecd828c6" +dependencies = [ + "curve25519-dalek", + "hashbrown", + "hex", + "rand_core 0.6.4", + "serde", + "sha2 0.9.9", + "zeroize", +] + +[[package]] +name = "elliptic-curve" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7bb888ab5300a19b8e5bceef25ac745ad065f3c9f7efc6de1b91958110891d3" +dependencies = [ + "base16ct", + "crypto-bigint", + "der", + "digest 0.10.6", + "ff", + "generic-array", + "group", + "pkcs8", + "rand_core 0.6.4", + "sec1", + "subtle", + "zeroize", +] + +[[package]] +name = "ff" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d013fc25338cc558c5c2cfbad646908fb23591e2404481826742b651c9af7160" +dependencies = [ + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "forward_ref" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8cbd1169bd7b4a0a20d92b9af7a7e0422888bd38a6f5ec29c1fd8c1558a272e" + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c85e1d9ab2eadba7e5040d4e09cbd6d072b76a557ad64e797c2cb9d4da21d7e4" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "group" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dfbfb3a6cfbd390d5c9564ab283a0349b9b9fcd46a706c1eb10e0db70bfbac7" +dependencies = [ + "ff", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +dependencies = [ + "ahash", +] + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest 0.10.6", +] + +[[package]] +name = "itoa" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" + +[[package]] +name = "k256" +version = "0.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72c1e0b51e7ec0a97369623508396067a486bd0cbed95a2659a4b863d28cfc8b" +dependencies = [ + "cfg-if", + "ecdsa", + "elliptic-curve", + "sha2 0.10.6", +] + +[[package]] +name = "libc" +version = "0.2.141" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3304a64d199bb964be99741b7a14d26972741915b3649639149b2479bb46f4b5" + +[[package]] +name = "once_cell" +version = "1.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" + +[[package]] +name = "opaque-debug" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" + +[[package]] +name = "pkcs8" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9eca2c590a5f85da82668fa685c09ce2888b9430e83299debf1f34b65fd4a4ba" +dependencies = [ + "der", + "spki", +] + +[[package]] +name = "proc-macro2" +version = "1.0.56" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rfc6979" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7743f17af12fa0b03b803ba12cd6a8d9483a587e89c69445e3909655c0b9fabb" +dependencies = [ + "crypto-bigint", + "hmac", + "zeroize", +] + +[[package]] +name = "ryu" +version = "1.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041" + +[[package]] +name = "schemars" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02c613288622e5f0c3fdc5dbd4db1c5fbe752746b1d1a56a0630b78fd00de44f" +dependencies = [ + "dyn-clone", + "schemars_derive", + "serde", + "serde_json", +] + +[[package]] +name = "schemars_derive" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "109da1e6b197438deb6db99952990c7f959572794b80ff93707d55a232545e7c" +dependencies = [ + "proc-macro2", + "quote", + "serde_derive_internals", + "syn 1.0.109", +] + +[[package]] +name = "sec1" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3be24c1842290c45df0a7bf069e0c268a747ad05a192f2fd7dcfdbc1cba40928" +dependencies = [ + "base16ct", + "der", + "generic-array", + "pkcs8", + "subtle", + "zeroize", +] + +[[package]] +name = "serde" +version = "1.0.160" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb2f3770c8bce3bcda7e149193a069a0f4365bda1fa5cd88e03bca26afc1216c" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde-json-wasm" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16a62a1fad1e1828b24acac8f2b468971dade7b8c3c2e672bcadefefb1f8c137" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_derive" +version = "1.0.160" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "291a097c63d8497e00160b166a967a4a79c64f3facdd01cbd7502231688d77df" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.14", +] + +[[package]] +name = "serde_derive_internals" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85bf8229e7920a9f636479437026331ce11aa132b4dde37d121944a44d6e5f3c" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "serde_json" +version = "1.0.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d721eca97ac802aa7777b701877c8004d950fc142651367300d21c1cc0194744" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "sha2" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if", + "cpufeatures", + "digest 0.9.0", + "opaque-debug", +] + +[[package]] +name = "sha2" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest 0.10.6", +] + +[[package]] +name = "signature" +version = "1.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" +dependencies = [ + "digest 0.10.6", + "rand_core 0.6.4", +] + +[[package]] +name = "spki" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67cf02bbac7a337dc36e4f5a693db6c21e7863f45070f7064577eb4367a3212b" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "subtle" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcf316d5356ed6847742d036f8a39c3b8435cac10bd528a4bd461928a6ab34d5" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "testdata" +version = "0.1.0" +dependencies = [ + "babylon-example", +] + +[[package]] +name = "thiserror" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.14", +] + +[[package]] +name = "typenum" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" + +[[package]] +name = "uint" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76f64bba2c53b04fcab63c01a7d7427eadc821e3bc48c34dc9ba29c501164b52" +dependencies = [ + "byteorder", + "crunchy", + "hex", + "static_assertions", +] + +[[package]] +name = "unicode-ident" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "zeroize" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9" diff --git a/wasmbinding/testdata/Cargo.toml b/wasmbinding/testdata/Cargo.toml new file mode 100644 index 000000000..ced0f9300 --- /dev/null +++ b/wasmbinding/testdata/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "testdata" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html +[lib] +crate-type = ["cdylib", "rlib"] + +# TODO for now we use main branch, we should change it to some release +# branches or tags when api will be more stable +[dependencies] +babylon-example = { git = "https://github.com/babylonchain/bindings", branch = "main" } diff --git a/wasmbinding/testdata/README.md b/wasmbinding/testdata/README.md new file mode 100644 index 000000000..cd0a7ef09 --- /dev/null +++ b/wasmbinding/testdata/README.md @@ -0,0 +1,18 @@ +# Stub test contract + +This folder contains bogus test contract which just exposes public api from +example contract from babylon bindings repo - https://github.com/babylonchain/bindings/tree/main/contracts/example + +This approach enables us to specify which branch from bindings library we want to test/use. + +Until custom babylon api is stable this approach enables faster iteration than publishing +wasm blobs from bindings library directly. + + +## Artifacts + +We are storing current version of artifacts in repo to speed up the CI. +In principle we could use rust-optimizer in each run to build contract from sources but it would take longer +time. +Downside of this approach is than with each update of `Cargo.toml` or `lib.rs` file +wasm blobs should be regenerated by running `make build-test-wasm` command diff --git a/wasmbinding/testdata/artifacts/checksums.txt b/wasmbinding/testdata/artifacts/checksums.txt new file mode 100644 index 000000000..e11f281b0 --- /dev/null +++ b/wasmbinding/testdata/artifacts/checksums.txt @@ -0,0 +1,2 @@ +9935d0de9ffbd36688ff1b99bc48c931dfb4d7bb3e08b8bc143ceeecde7f0ecb testdata-aarch64.wasm +9fa6ca0b4b4f3aff6a7c2bb71c01ab6c3929df33e57916d742951f78fba4f079 testdata.wasm diff --git a/wasmbinding/testdata/artifacts/checksums_intermediate.txt b/wasmbinding/testdata/artifacts/checksums_intermediate.txt new file mode 100644 index 000000000..1ad713b7b --- /dev/null +++ b/wasmbinding/testdata/artifacts/checksums_intermediate.txt @@ -0,0 +1 @@ +8daf4b44e2d0239ae957d816b75330235e1f646472db3469bdbd951165a68a2c ./target/wasm32-unknown-unknown/release/testdata.wasm diff --git a/wasmbinding/testdata/artifacts/testdata-aarch64.wasm b/wasmbinding/testdata/artifacts/testdata-aarch64.wasm new file mode 100644 index 0000000000000000000000000000000000000000..cbc28804c007a68ba05c4370a70f53fc2d4aaf19 GIT binary patch literal 159438 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 literal 0 HcmV?d00001 diff --git a/wasmbinding/testdata/artifacts/testdata.wasm b/wasmbinding/testdata/artifacts/testdata.wasm new file mode 100644 index 0000000000000000000000000000000000000000..2a3c2a61a56ef5bddeb19aa10a963090206e025b GIT binary patch literal 159560 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

L=Yy5L>0$NN_iBu zPji{y19~V#j)+2X!Uj;uUS1F4uP!3!bB(>Uwc^R4G5o;^3<+ue)NqJEI|H5+G3E zd;crY@HzvwcWKiOIwl9uxC4r>W;Ua$KqU5ii!%7UMM`YfUcjck49mwH%Q<1k{QEf_ zCBrObLwuu0s#fni(!LAh!(S`Q-g)a0CMiR+XHf$M{^tc2!C=yOiEY~SaXICJqpZLH z1^XoaBlRAe0aeBn8RG1Op(GtxsAY zL?gvKPfTdhW@y5RszHfrF+7|1Jx4&+;0I?cY2#xrz`-mJo5tVodjTOHUb zZniE~*&wz@N3n@LI3+w@n4JqKgtTmH0`EjTeQey{HCQ;y5h5%+FXHB@cK90WoI31X z-_DtLeH&-qbtTEX5^J8KFjmn5|HRS+B%v7KH%!OVHAIP|dVulpl<@CO3mk7+;Ji}Y zAy4;?e~s_`-@~Zl3E9_;!CMI7+;a1gB)pIdx#c{<4M1t?5uokBQ&ezIi;beSrxOck zB3C8@ntCA7rGii0z+4+omFCxylfg1G%f0fdSPsqoy_h%MS$^a38@q8E6I@ifc=qN7^;VvzW3fEp_ozo@4!T1}kk zNnHFgej*dZvfUMYVDZa+W7ydR^8~Qt@(Ff^iC~8wf}MRxYp~NJA}hsI>_yLe!NHd9 zJomlutu!ozLN7i!?#0Xrdokm^nDJiBcrUc))|dk0UeL=vvC@bB7ViB1Arqj*jJlNS zP_9NoQ8J4Onn%xyATtvLd4D^dc7?~BZ8GYGktS~&qiOW%XaYuQ=K z+gdT(7V}McRhFcsi8cvyt2Q4CQdl@qewMwpf*Nr_N`zI$M!Of@jbLRX#T~~_z5;(f z^ZXW6wSQS7P4n`ierzHRa&*R}(~>5Gw}TrF@0hlfp?A65ra-##ChYFez7g1SLICVE z^%bJNnkW3Sj#)2!Nk@!;Tvj?>0-6mV*3sQ~$jA{h5>T)f6Sjo7v0}Y!+Atx(Un*9# zyT67Q%a#ggDFaBh61hoC^W_UgcZlV~I2Y6)<>6#Fl|jey578y`Vdio6Kn)cI6m_@OG|bez*{EtG4G+XN{wA|!Vxh( ze;oc0v2)4Y9(#Qh4HjY*e3OBmr53~f~nZQ9SM=NT9ZUuXi|*|ILvFbt1sA?0hpQ66q7!J;&cDDozk0hXwN zj1QG810R+;iU??7G@Nhud4Uc)ffnp%k2ZY)z$Hz$$k(7agx0JJJqWkl;dv8etk{Pn zl=jfz-SBt`5|p8Pqs%64kXs-?i+BGrO{gge1r}9?QvoNT{u0?&oQThCRO-~`)!2XP zcl%4>!C!shZk~VoXE<-}Ua_5mf9fl}rSKO$-T(71aQdP7_<)3mpE@>mDfj=k4|0Dd z-X>w<=x3(HXJVZ2Z*D)5gmc4}bhs}Kzxb0Je={GvOXD@+`LBLyYAI-QMF&g+^Vm)M zcAJkA9>=5!+r#}o&f!B@`0JnG_^~X$+?%5F1&qve?5A^QWHC8piIozcjoQOP2plwM{Kzb^0{Bf4HB@UQ^$`&fygBdibOoZM)GM(1hKh(=I z^L>Y=yv3DHYB0$`}xlnSwU zB=`~Sj2P+>-}9uHmZ%Qc8FCrLD-V@^n{xE+;f} zqU#tQ6@c;{DY4x9^^E!Sa?hCt$yP5gshenS`*kME#F-$Vq0BFM61G|b5G$}cYO9>) zfDu7H0j-JP$$3ig@{&BcaH82y5KDX%@ww|sP1+Z2OHl@&n#ujkMA@1db--PMV$tqX zYt^DAps!nhUKO0?!6#MgH6T+a=3h1XMBS2N-f-|Zi+>nCoGm_F!3Fc)InUeSCgt$Y5 zK+aTzfV3e6AvS!GGJVdBWFJ^tQmfc_W{J!4i8q5cq>`mCGL>sd&Yb6n~FAnWCvAMF#X1^JU%p(QGYQ=4_*S zM7=|qiaDF=puPPW?gtX}s}9=qhgugRX-*46kWOp&u*hNpV#-6`!-6~7!-9kFVF4a3 z0nxyWdsq;yJK-J{K#qVVlvsmRmY;aJOf}>@rW%spgGe+9C-EQmtH6lSx}o`DntA_5 zzLXskg^fF0v~*lNgu=O;FSBa&>1lpx#&6OvCv`+DW$DRbi*>F+|oS- zlHNs1*>z^}QHgpjwipo*^_MNNLR3?eT4I*vI;l6K4HtX8-oHS82tjmQMPPVpF@4sQ z2PK$jJL)7@O4AVTFM)A9D7xAEC8<$W!i3SRbR3dMNS^2{fogwJkpE3nc$GA!ek0c9 zby7JJL~35$H$!9zdyMX*DKSV3l%})t}G+y^np4nT6-uX^(&w+QcZI*2&MbFjwI4KEXZ2l1i z@PoZir9LNwP4YOf0RJxL!^hua%W;ZW zm2AtgGaqUXXsCG(v81^5r9kN57w=&>yG%zx3)%cV$DfwFOcKS!&N{tOCY5@lOl2p< zWN+l+mA%QmH|G=N4yyzb%PsHhoI)B{3J4pvY!XD<`}aPZmKGPZwCO!bP-9;u?6To1 zOw-h%!}wF?t_D;)oQC;TWV@zTN1a_$m|S58-;qmn2Rkh=#PCsU@aU&AYS`8aV2=p; zkAg-e=i&`WKEnJAAnI%RJ}Tb0isnm{x~y#2*6vJq!xB~F;QQj_4I4__<&K;r_V zJ;$}TR0af!?|@P{0aTW)q}A?7L~G^AS+usTXl+Z;S`0^9AWKP$)wV2FtMV44 zRcfCFX({L{Y1`vSE$`Trm%Zbav4R$j1^wi?(S(@3B<&Ac;rLWYk{g=WKa=v|c zUymWSHPa|mkt%#bWIb%+*Kt^3>nXkj)p^BMpnNr2aXQ9EWOjTt8u<(Fe{2Oe>#Ner zS0-9qwUlmLb5lj~K>eQOGD>fwaZ-$n%D~UN{H|iUh1)DLdS5cLT z`I36JcE2(*vm?Bf=E~R8T-tnv$t>Ry$Tl>P_8^$!p_Nl~*;S8eW^`4_7p{LS0dqI% z+~E)&M;Ts#%`c!I8WlL8s;WZyb9$fRI0K8}OMm+df7!Y)(bsjQ`lZPRx2C<@?CL!*Q7$je|_qe-kA|!i`ID0C%tCgB2J9q@uhHD=~t6r?8QCZ9#G1 z<5`Vx#-4z&w=euSB4qiJmFbK?0By-xj?LKs4V%alOL|YHKE;#68DmWH^;s=LvL*

!*43AWaDPnG~}*ql0S^P~n(0 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ì%4)rTRsxm z8Vtcm)}(VL)gfvib#Mq~a2;dIRdf=vT#4*Q@SX9NI+%_QT)a%D!Ovi=CLTYF=g%RX z2_8R>_Vgi|KHGSF6LT)~5hMDddek9>z78J_WBuW6=Ji^gc?7K@pAH%b6J(zds16y(<~O!P1#A6Y2q`{c+jIeVT{e5+F(dEd>kW*h+cV8R|xsXn;!22tau0mp% HXMFQN1!v2W literal 0 HcmV?d00001 diff --git a/wasmbinding/testdata/src/lib.rs b/wasmbinding/testdata/src/lib.rs new file mode 100644 index 000000000..96149e55e --- /dev/null +++ b/wasmbinding/testdata/src/lib.rs @@ -0,0 +1,4 @@ +use babylon_example::contract; + +pub use contract::instantiate; +pub use contract::query; diff --git a/wasmbinding/wasm.go b/wasmbinding/wasm.go new file mode 100644 index 000000000..7a3d9d2e1 --- /dev/null +++ b/wasmbinding/wasm.go @@ -0,0 +1,68 @@ +package wasmbinding + +import ( + "encoding/json" + + errorsmod "cosmossdk.io/errors" + "github.com/CosmWasm/wasmd/x/wasm" + wasmkeeper "github.com/CosmWasm/wasmd/x/wasm/keeper" + wasmvmtypes "github.com/CosmWasm/wasmvm/types" + "github.com/babylonchain/babylon/wasmbinding/bindings" + epochingkeeper "github.com/babylonchain/babylon/x/epoching/keeper" + sdk "github.com/cosmos/cosmos-sdk/types" +) + +type QueryPlugin struct { + epochingKeeper *epochingkeeper.Keeper +} + +// NewQueryPlugin returns a reference to a new QueryPlugin. +func NewQueryPlugin(ek *epochingkeeper.Keeper) *QueryPlugin { + return &QueryPlugin{ + epochingKeeper: ek, + } +} + +// CustomQuerier dispatches custom CosmWasm bindings queries. +func CustomQuerier(qp *QueryPlugin) func(ctx sdk.Context, request json.RawMessage) ([]byte, error) { + return func(ctx sdk.Context, request json.RawMessage) ([]byte, error) { + var contractQuery bindings.BabylonQuery + if err := json.Unmarshal(request, &contractQuery); err != nil { + return nil, errorsmod.Wrap(err, "failed to unarshall request ") + } + + switch { + case contractQuery.Epoch != nil: + epoch := qp.epochingKeeper.GetEpoch(ctx) + res := bindings.CurrentEpochResponse{ + Epoch: epoch.EpochNumber, + } + + ctx.Logger().Debug("Marshalled custom response") + + bz, err := json.Marshal(res) + if err != nil { + return nil, errorsmod.Wrap(err, "failed marshaling") + } + + return bz, nil + + default: + return nil, wasmvmtypes.UnsupportedRequest{Kind: "unknown babylon query variant"} + } + } +} + +func RegisterCustomPlugins( + ek *epochingkeeper.Keeper, +) []wasmkeeper.Option { + wasmQueryPlugin := NewQueryPlugin(ek) + + queryPluginOpt := wasmkeeper.WithQueryPlugins(&wasmkeeper.QueryPlugins{ + Custom: CustomQuerier(wasmQueryPlugin), + }) + + return []wasm.Option{ + queryPluginOpt, + } +} From 3388e0fcd4f2020432d4d4b3e3d61dc3b174bb08 Mon Sep 17 00:00:00 2001 From: Vitalis Salis Date: Fri, 14 Apr 2023 14:06:47 +0300 Subject: [PATCH 32/59] fix: Use the account specified in app.toml to sign BLS transactions (#348) --- app/test_helpers.go | 4 +- app/utils.go | 19 ++- client/tx/tx.go | 2 - cmd/babylond/cmd/custom_babylon_config.go | 2 +- cmd/babylond/cmd/root.go | 11 +- proto/babylon/checkpointing/v1/tx.proto | 8 +- x/checkpointing/client/cli/tx.go | 2 +- x/checkpointing/keeper/bls_signer.go | 2 +- x/checkpointing/keeper/msg_server_test.go | 10 +- x/checkpointing/types/genesis.pb.go | 45 ++++--- x/checkpointing/types/msgs.go | 23 ++-- x/checkpointing/types/query.pb.go | 116 +++++++++--------- x/checkpointing/types/tx.pb.go | 102 +++++++++++----- x/monitor/types/genesis.pb.go | 16 ++- x/monitor/types/query.pb.go | 53 ++++----- x/zoneconcierge/types/genesis.pb.go | 20 ++-- x/zoneconcierge/types/query.pb.go | 138 +++++++++++----------- 17 files changed, 315 insertions(+), 258 deletions(-) diff --git a/app/test_helpers.go b/app/test_helpers.go index 043397397..3794e0be4 100644 --- a/app/test_helpers.go +++ b/app/test_helpers.go @@ -226,13 +226,13 @@ func Setup(t *testing.T, isCheckTx bool) *BabylonApp { // SetupPrivSigner sets up a PrivSigner for testing func SetupPrivSigner() (*PrivSigner, error) { - nodeCfg := tmconfig.DefaultConfig() kr, err := client.NewKeyringFromBackend(client.Context{}, keyring.BackendMemory) if err != nil { return nil, err } + nodeCfg := tmconfig.DefaultConfig() encodingCfg := appparams.GetEncodingConfig() - privSigner, _ := InitPrivSigner(client.Context{}, ".", kr, encodingCfg) + privSigner, _ := InitPrivSigner(client.Context{}, ".", kr, "", encodingCfg) privSigner.WrappedPV.Clean(nodeCfg.PrivValidatorKeyFile(), nodeCfg.PrivValidatorStateFile()) return privSigner, nil } diff --git a/app/utils.go b/app/utils.go index 435160090..4bbd2fd41 100644 --- a/app/utils.go +++ b/app/utils.go @@ -13,7 +13,6 @@ import ( tmos "github.com/cometbft/cometbft/libs/os" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/config" - sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/auth/types" appparams "github.com/babylonchain/babylon/app/params" @@ -44,7 +43,7 @@ type PrivSigner struct { ClientCtx client.Context } -func InitPrivSigner(clientCtx client.Context, nodeDir string, kr keyring.Keyring, encodingCfg appparams.EncodingConfig) (*PrivSigner, error) { +func InitPrivSigner(clientCtx client.Context, nodeDir string, kr keyring.Keyring, feePayer string, encodingCfg appparams.EncodingConfig) (*PrivSigner, error) { // setup private validator nodeCfg := tmconfig.DefaultConfig() pvKeyFile := filepath.Join(nodeDir, nodeCfg.PrivValidatorKeyFile()) @@ -65,12 +64,24 @@ func InitPrivSigner(clientCtx client.Context, nodeDir string, kr keyring.Keyring WithLegacyAmino(encodingCfg.Amino). WithTxConfig(encodingCfg.TxConfig). WithAccountRetriever(types.AccountRetriever{}). - WithFromAddress(sdk.AccAddress(wrappedPV.GetAddress())). - WithFeeGranterAddress(sdk.AccAddress(wrappedPV.GetAddress())). WithSkipConfirmation(true). WithKeyring(kr). WithNodeURI(nodeCfg.RPC.ListenAddress) + if feePayer != "" { + feePayerRecord, err := kr.Key(feePayer) + if err != nil { + return nil, err + } + feePayerAddress, err := feePayerRecord.GetAddress() + if err != nil { + return nil, err + } + clientCtx = clientCtx. + WithFromAddress(feePayerAddress). + WithFromName(feePayer) + } + return &PrivSigner{ WrappedPV: wrappedPV, ClientCtx: clientCtx, diff --git a/client/tx/tx.go b/client/tx/tx.go index 5701bc471..cc7b9b4e3 100644 --- a/client/tx/tx.go +++ b/client/tx/tx.go @@ -28,7 +28,6 @@ func SendMsgsToTendermint(clientCtx client.Context, msgs []sdk.Msg) (*sdk.TxResp WithAccountRetriever(clientCtx.AccountRetriever). WithKeybase(clientCtx.Keyring). WithChainID(clientCtx.ChainID). - WithFeeGranter(clientCtx.FeeGranter). WithFeePayer(clientCtx.FeePayer). WithGasPrices(gasPrice). WithGasAdjustment(gasAdjustment) @@ -113,7 +112,6 @@ func prepareFactory(clientCtx client.Context, txf sdktx.Factory) (sdktx.Factory, if initNum == 0 { txf = txf.WithAccountNumber(num) } - if initSeq == 0 { txf = txf.WithSequence(seq) } diff --git a/cmd/babylond/cmd/custom_babylon_config.go b/cmd/babylond/cmd/custom_babylon_config.go index 7af72488a..f52d949e7 100644 --- a/cmd/babylond/cmd/custom_babylon_config.go +++ b/cmd/babylond/cmd/custom_babylon_config.go @@ -9,7 +9,7 @@ import ( ) const ( - defaultKeyName = "default" + defaultKeyName = "" defaultGasPrice = "0.01ubbn" defaultGasAdjustment = 1.5 ) diff --git a/cmd/babylond/cmd/root.go b/cmd/babylond/cmd/root.go index 9b93146dd..709402c37 100644 --- a/cmd/babylond/cmd/root.go +++ b/cmd/babylond/cmd/root.go @@ -279,16 +279,12 @@ func (a appCreator) newApp(logger log.Logger, db dbm.DB, traceStore io.Writer, a panic(err) } - // parse the key name that will be used for signing BLS-sig txs from app.toml - keyName := bbntypes.ParseKeyNameFromConfig(appOpts) - clientCtx, err := config.ReadFromClientConfig( client.Context{}. WithHomeDir(homeDir). WithViper(""). WithKeyringDir(homeDir). WithInput(os.Stdin). - WithFromName(keyName). // Warning: It is important that ReadFromClientConfig receives context // with already initialized codec. It creates keyring inside, and from cosmos // 0.46.0 keyring requires codec. Without codec, operations performed by @@ -298,7 +294,10 @@ func (a appCreator) newApp(logger log.Logger, db dbm.DB, traceStore io.Writer, a if err != nil { panic(err) } - privSigner, err := app.InitPrivSigner(clientCtx, homeDir, clientCtx.Keyring, a.encCfg) + // parse the key name that will be used for signing BLS-sig txs from app.toml + keyName := bbntypes.ParseKeyNameFromConfig(appOpts) + + privSigner, err := app.InitPrivSigner(clientCtx, homeDir, clientCtx.Keyring, keyName, a.encCfg) if err != nil { panic(err) } @@ -376,7 +375,7 @@ func (a appCreator) appExport( panic(err) } - privSigner, err := app.InitPrivSigner(clientCtx, homePath, kr, a.encCfg) + privSigner, err := app.InitPrivSigner(clientCtx, homePath, kr, "", a.encCfg) if err != nil { panic(err) } diff --git a/proto/babylon/checkpointing/v1/tx.proto b/proto/babylon/checkpointing/v1/tx.proto index 47345c5f7..78a990491 100644 --- a/proto/babylon/checkpointing/v1/tx.proto +++ b/proto/babylon/checkpointing/v1/tx.proto @@ -5,6 +5,7 @@ import "gogoproto/gogo.proto"; import "babylon/checkpointing/v1/checkpoint.proto"; import "babylon/checkpointing/v1/bls_key.proto"; import "cosmos/staking/v1beta1/tx.proto"; +import "cosmos_proto/cosmos.proto"; option go_package = "github.com/babylonchain/babylon/x/checkpointing/types"; @@ -24,7 +25,12 @@ message MsgAddBlsSig { option (gogoproto.equal) = false; option (gogoproto.goproto_getters) = false; - BlsSig bls_sig = 1; + // signer corresponds to the submitter of the transaction + // This might be a different entity compared to the one that created the BLS signature + // (i.e. the validator owner of the BLS key which is specified by the `bls_sig.signer_address`) + string signer = 1 [(cosmos_proto.scalar) = "cosmos.AddressString"]; + + BlsSig bls_sig = 2; } // MsgAddBlsSigResponse defines the MsgAddBlsSig response type. diff --git a/x/checkpointing/client/cli/tx.go b/x/checkpointing/client/cli/tx.go index d4986d8cb..6c32ab132 100644 --- a/x/checkpointing/client/cli/tx.go +++ b/x/checkpointing/client/cli/tx.go @@ -72,7 +72,7 @@ func CmdTxAddBlsSig() *cobra.Command { return err } - msg := types.NewMsgAddBlsSig(epoch_num, lch, blsSig, addr) + msg := types.NewMsgAddBlsSig(clientCtx.GetFromAddress(), epoch_num, lch, blsSig, addr) return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) }, diff --git a/x/checkpointing/keeper/bls_signer.go b/x/checkpointing/keeper/bls_signer.go index 584de5bea..e6d432316 100644 --- a/x/checkpointing/keeper/bls_signer.go +++ b/x/checkpointing/keeper/bls_signer.go @@ -40,7 +40,7 @@ func (k Keeper) SendBlsSig(ctx sdk.Context, epochNum uint64, lch types.LastCommi } // create MsgAddBlsSig message - msg := types.NewMsgAddBlsSig(epochNum, lch, blsSig, addr) + msg := types.NewMsgAddBlsSig(k.clientCtx.GetFromAddress(), epochNum, lch, blsSig, addr) // keep sending the message to Tendermint until success or timeout // TODO should read the parameters from config file diff --git a/x/checkpointing/keeper/msg_server_test.go b/x/checkpointing/keeper/msg_server_test.go index afe1e648f..d20caf652 100644 --- a/x/checkpointing/keeper/msg_server_test.go +++ b/x/checkpointing/keeper/msg_server_test.go @@ -242,7 +242,7 @@ func FuzzAddBlsSig_NoError(f *testing.F) { blsSig := bls12381.Sign(blsPrivKey, signBytes) // create MsgAddBlsSig message - msg := types.NewMsgAddBlsSig(endingEpoch, lch, blsSig, addr) + msg := types.NewMsgAddBlsSig(sdk.AccAddress(addr), endingEpoch, lch, blsSig, addr) _, err = msgServer.AddBlsSig(ctx, msg) require.NoError(t, err) afterCkpt, err := ck.GetRawCheckpoint(ctx, endingEpoch) @@ -285,7 +285,7 @@ func FuzzAddBlsSig_NotInValSet(f *testing.F) { valAddr := datagen.GenRandomValidatorAddress() signBytes := types.GetSignBytes(endingEpoch, lch) blsSig := bls12381.Sign(blsPrivKey, signBytes) - msg := types.NewMsgAddBlsSig(endingEpoch, lch, blsSig, valAddr) + msg := types.NewMsgAddBlsSig(sdk.AccAddress(valAddr), endingEpoch, lch, blsSig, valAddr) _, err = msgServer.AddBlsSig(ctx, msg) require.Error(t, err, types.ErrCkptDoesNotExist) @@ -318,7 +318,7 @@ func FuzzAddBlsSig_CkptNotExist(f *testing.F) { addr := helper.ValBlsPrivKeys[i].Address signBytes := types.GetSignBytes(epoch.EpochNumber-1, lch) blsSig := bls12381.Sign(blsPrivKey, signBytes) - msg := types.NewMsgAddBlsSig(epoch.EpochNumber-1, lch, blsSig, addr) + msg := types.NewMsgAddBlsSig(sdk.AccAddress(addr), epoch.EpochNumber-1, lch, blsSig, addr) // add the BLS signature _, err := msgServer.AddBlsSig(ctx, msg) @@ -361,7 +361,7 @@ func FuzzAddBlsSig_WrongLastCommitHash(f *testing.F) { addr := helper.ValBlsPrivKeys[i].Address signBytes := types.GetSignBytes(endingEpoch, lch) blsSig := bls12381.Sign(blsPrivKey, signBytes) - msg := types.NewMsgAddBlsSig(endingEpoch, lch, blsSig, addr) + msg := types.NewMsgAddBlsSig(sdk.AccAddress(addr), endingEpoch, lch, blsSig, addr) // add the BLS signature _, err = msgServer.AddBlsSig(ctx, msg) @@ -401,7 +401,7 @@ func FuzzAddBlsSig_InvalidSignature(f *testing.F) { lch := ctx.BlockHeader().LastCommitHash addr := helper.ValBlsPrivKeys[i].Address blsSig := datagen.GenRandomBlsMultiSig() - msg := types.NewMsgAddBlsSig(endingEpoch, lch, blsSig, addr) + msg := types.NewMsgAddBlsSig(sdk.AccAddress(addr), endingEpoch, lch, blsSig, addr) // add the BLS signature message _, err = msgServer.AddBlsSig(ctx, msg) diff --git a/x/checkpointing/types/genesis.pb.go b/x/checkpointing/types/genesis.pb.go index 081845c81..380afef3d 100644 --- a/x/checkpointing/types/genesis.pb.go +++ b/x/checkpointing/types/genesis.pb.go @@ -6,7 +6,6 @@ package types import ( fmt "fmt" ed25519 "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" - _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/cosmos/gogoproto/proto" io "io" math "math" @@ -144,28 +143,28 @@ func init() { } var fileDescriptor_bf2c524ebc9800de = []byte{ - // 335 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x90, 0xb1, 0x4a, 0x03, 0x31, - 0x1c, 0xc6, 0x1b, 0x0b, 0x95, 0xa6, 0x1d, 0xf4, 0x70, 0x28, 0x05, 0x8f, 0xa3, 0x88, 0x14, 0x84, - 0x84, 0x56, 0x3a, 0x14, 0x5c, 0xec, 0xd2, 0xc1, 0xc1, 0x52, 0x07, 0xc1, 0xa5, 0x24, 0x77, 0xe1, - 0x1a, 0x9a, 0x5e, 0x8e, 0x4b, 0x7a, 0x98, 0xb7, 0xf0, 0x59, 0x7c, 0x0a, 0xc7, 0x8e, 0x8e, 0xd2, - 0xbe, 0x88, 0x5c, 0x12, 0x2b, 0x0a, 0x9d, 0xee, 0x7f, 0xf9, 0xff, 0xbe, 0xff, 0xf7, 0xf1, 0xc1, - 0x6b, 0x4a, 0xa8, 0x11, 0x32, 0xc3, 0xf1, 0x92, 0xc5, 0xab, 0x5c, 0xf2, 0x4c, 0xf3, 0x2c, 0xc5, - 0xe5, 0x00, 0xa7, 0x2c, 0x63, 0x8a, 0x2b, 0x94, 0x17, 0x52, 0xcb, 0xa0, 0xe3, 0x39, 0xf4, 0x87, - 0x43, 0xe5, 0xa0, 0x7b, 0x91, 0xca, 0x54, 0x5a, 0x08, 0x57, 0x93, 0xe3, 0xbb, 0x51, 0x2c, 0xd5, - 0x5a, 0x2a, 0x1c, 0x17, 0x26, 0xd7, 0x12, 0xb3, 0x64, 0x38, 0x1a, 0x0d, 0xc6, 0x78, 0xc5, 0x8c, - 0xbf, 0xd8, 0x3d, 0xee, 0x4c, 0x85, 0x5a, 0xac, 0x98, 0x71, 0x5c, 0xef, 0x19, 0xb6, 0xa7, 0x2e, - 0xca, 0x93, 0x26, 0x9a, 0x05, 0x53, 0xd8, 0xf6, 0xd1, 0x2a, 0x48, 0x75, 0x40, 0x54, 0xef, 0xb7, - 0x86, 0x57, 0xe8, 0x58, 0x40, 0xe4, 0xd5, 0x0f, 0xcc, 0xcc, 0x5b, 0xe9, 0x61, 0x56, 0xbd, 0x77, - 0x00, 0xe1, 0xef, 0x2e, 0xb8, 0x81, 0xe7, 0x25, 0x11, 0x3c, 0x21, 0x5a, 0x16, 0x0b, 0x92, 0x24, - 0x05, 0x53, 0xd5, 0x71, 0xd0, 0x6f, 0xce, 0xcf, 0x0e, 0x8b, 0x7b, 0xf7, 0x1e, 0x8c, 0xe1, 0xa9, - 0x4f, 0xd9, 0x39, 0x89, 0x40, 0xbf, 0x35, 0x8c, 0x8e, 0xfb, 0x4f, 0x84, 0xf5, 0x6e, 0x50, 0xfb, - 0x0d, 0xee, 0x20, 0x2c, 0x89, 0x58, 0xe4, 0x1b, 0x5a, 0xa9, 0xeb, 0x56, 0x7d, 0x89, 0x5c, 0x5d, - 0xc8, 0xd5, 0x85, 0x7c, 0x5d, 0x68, 0xb6, 0xa1, 0x95, 0xb4, 0x59, 0x12, 0x31, 0xb3, 0xfc, 0xe4, - 0xf1, 0x63, 0x17, 0x82, 0xed, 0x2e, 0x04, 0x5f, 0xbb, 0x10, 0xbc, 0xed, 0xc3, 0xda, 0x76, 0x1f, - 0xd6, 0x3e, 0xf7, 0x61, 0xed, 0x65, 0x94, 0x72, 0xbd, 0xdc, 0x50, 0x14, 0xcb, 0x35, 0xf6, 0x59, - 0xe2, 0x25, 0xe1, 0xd9, 0xcf, 0x0f, 0x7e, 0xfd, 0xd7, 0xb4, 0x36, 0x39, 0x53, 0xb4, 0x61, 0x5b, - 0xbe, 0xfd, 0x0e, 0x00, 0x00, 0xff, 0xff, 0x41, 0x5b, 0x7a, 0x70, 0x09, 0x02, 0x00, 0x00, + // 325 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x90, 0xcf, 0x6a, 0x2a, 0x31, + 0x18, 0xc5, 0xcd, 0x15, 0xbc, 0x18, 0x5d, 0xb4, 0xb3, 0x12, 0xa1, 0x61, 0x90, 0x52, 0x84, 0x42, + 0x82, 0x16, 0x17, 0x42, 0x37, 0x75, 0xe3, 0xa2, 0x8b, 0x8a, 0x5d, 0x14, 0xba, 0x91, 0x24, 0x13, + 0xc6, 0x60, 0x9c, 0x0c, 0x93, 0x38, 0x34, 0x6f, 0xd1, 0x67, 0xe9, 0x53, 0x74, 0xe9, 0xb2, 0xcb, + 0xa2, 0x2f, 0x52, 0x66, 0x26, 0xb5, 0xb4, 0x30, 0xab, 0xfc, 0xf9, 0xce, 0xf9, 0xce, 0xe1, 0x07, + 0xaf, 0x18, 0x65, 0x4e, 0xe9, 0x84, 0xf0, 0xb5, 0xe0, 0x9b, 0x54, 0xcb, 0xc4, 0xca, 0x24, 0x26, + 0xf9, 0x88, 0xc4, 0x22, 0x11, 0x46, 0x1a, 0x9c, 0x66, 0xda, 0xea, 0xa0, 0xe7, 0x75, 0xf8, 0x97, + 0x0e, 0xe7, 0xa3, 0x7e, 0xc8, 0xb5, 0xd9, 0x6a, 0x43, 0x78, 0xe6, 0x52, 0xab, 0x89, 0x88, 0xc6, + 0x93, 0xc9, 0x68, 0x4a, 0x36, 0xc2, 0x79, 0x6f, 0xbf, 0x3e, 0x83, 0x29, 0xb3, 0xda, 0x08, 0x57, + 0xe9, 0x06, 0x4f, 0xb0, 0x3b, 0xaf, 0x42, 0x1f, 0x2d, 0xb5, 0x22, 0x98, 0xc3, 0xae, 0x2f, 0x51, + 0x88, 0x4c, 0x0f, 0x84, 0xcd, 0x61, 0x67, 0x7c, 0x89, 0xeb, 0xaa, 0x60, 0xef, 0xbe, 0x17, 0x6e, + 0xd9, 0x89, 0x4f, 0x77, 0x33, 0x78, 0x03, 0x10, 0xfe, 0xcc, 0x82, 0x6b, 0x78, 0x9e, 0x53, 0x25, + 0x23, 0x6a, 0x75, 0xb6, 0xa2, 0x51, 0x94, 0x09, 0x53, 0x2c, 0x07, 0xc3, 0xf6, 0xf2, 0xec, 0x34, + 0xb8, 0xab, 0xfe, 0x83, 0x29, 0xfc, 0xef, 0x5b, 0xf6, 0xfe, 0x85, 0x60, 0xd8, 0x19, 0x87, 0xf5, + 0xf9, 0x33, 0x55, 0x66, 0xb7, 0x58, 0x79, 0x06, 0xb7, 0x10, 0xe6, 0x54, 0xad, 0xd2, 0x1d, 0x2b, + 0xdc, 0xcd, 0xd2, 0x7d, 0x81, 0x2b, 0x5c, 0xb8, 0xc2, 0x85, 0x3d, 0x2e, 0xbc, 0xd8, 0xb1, 0xc2, + 0xda, 0xce, 0xa9, 0x5a, 0x94, 0xfa, 0xd9, 0xc3, 0xfb, 0x01, 0x81, 0xfd, 0x01, 0x81, 0xcf, 0x03, + 0x02, 0xaf, 0x47, 0xd4, 0xd8, 0x1f, 0x51, 0xe3, 0xe3, 0x88, 0x1a, 0xcf, 0x93, 0x58, 0xda, 0xf5, + 0x8e, 0x61, 0xae, 0xb7, 0xc4, 0x77, 0xe1, 0x6b, 0x2a, 0x93, 0xef, 0x07, 0x79, 0xf9, 0x43, 0xda, + 0xba, 0x54, 0x18, 0xd6, 0x2a, 0x29, 0xdf, 0x7c, 0x05, 0x00, 0x00, 0xff, 0xff, 0x1c, 0xab, 0xd1, + 0x3a, 0xf3, 0x01, 0x00, 0x00, } func (m *GenesisState) Marshal() (dAtA []byte, err error) { diff --git a/x/checkpointing/types/msgs.go b/x/checkpointing/types/msgs.go index aee1604ab..aee9efd03 100644 --- a/x/checkpointing/types/msgs.go +++ b/x/checkpointing/types/msgs.go @@ -16,13 +16,16 @@ var ( _ sdk.Msg = (*MsgAddBlsSig)(nil) ) -func NewMsgAddBlsSig(epochNum uint64, lch LastCommitHash, sig bls12381.Signature, addr sdk.ValAddress) *MsgAddBlsSig { - return &MsgAddBlsSig{BlsSig: &BlsSig{ - EpochNum: epochNum, - LastCommitHash: &lch, - BlsSig: &sig, - SignerAddress: addr.String(), - }} +func NewMsgAddBlsSig(signer sdk.AccAddress, epochNum uint64, lch LastCommitHash, sig bls12381.Signature, addr sdk.ValAddress) *MsgAddBlsSig { + return &MsgAddBlsSig{ + Signer: signer.String(), + BlsSig: &BlsSig{ + EpochNum: epochNum, + LastCommitHash: &lch, + BlsSig: &sig, + SignerAddress: addr.String(), + }, + } } func NewMsgWrappedCreateValidator(msgCreateVal *stakingtypes.MsgCreateValidator, blsPK *bls12381.PublicKey, pop *ProofOfPossession) (*MsgWrappedCreateValidator, error) { @@ -56,12 +59,14 @@ func (m *MsgAddBlsSig) ValidateBasic() error { } func (m *MsgAddBlsSig) GetSigners() []sdk.AccAddress { - signer, err := sdk.ValAddressFromBech32(m.BlsSig.SignerAddress) + signer, err := sdk.AccAddressFromBech32(m.Signer) if err != nil { + // Panic, since the GetSigners method is called after ValidateBasic + // which performs the same check. panic(err) } - return []sdk.AccAddress{sdk.AccAddress(signer)} + return []sdk.AccAddress{signer} } func (m *MsgWrappedCreateValidator) VerifyPoP(valPubkey cryptotypes.PubKey) bool { diff --git a/x/checkpointing/types/query.pb.go b/x/checkpointing/types/query.pb.go index 7bf8126d4..f74b0e6f3 100644 --- a/x/checkpointing/types/query.pb.go +++ b/x/checkpointing/types/query.pb.go @@ -7,7 +7,6 @@ import ( context "context" fmt "fmt" query "github.com/cosmos/cosmos-sdk/types/query" - _ "github.com/cosmos/gogoproto/gogoproto" grpc1 "github.com/cosmos/gogoproto/grpc" proto "github.com/cosmos/gogoproto/proto" _ "google.golang.org/genproto/googleapis/api/annotations" @@ -661,64 +660,63 @@ func init() { } var fileDescriptor_113f1ca5c3c2ca44 = []byte{ - // 898 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x96, 0xcf, 0x8f, 0xdb, 0x44, - 0x14, 0xc7, 0xd7, 0x59, 0x5a, 0xb1, 0x2f, 0x74, 0x59, 0x46, 0x2b, 0x1a, 0xdc, 0x12, 0x2a, 0x53, - 0xda, 0xa5, 0x52, 0x3d, 0x4a, 0xf6, 0x57, 0xb4, 0xb4, 0x8b, 0x94, 0x6a, 0xe1, 0xd0, 0xb2, 0x14, - 0x23, 0x15, 0xc4, 0x81, 0x68, 0xec, 0x8e, 0x1c, 0xb3, 0x8e, 0xc7, 0x9b, 0x19, 0x27, 0x44, 0x55, - 0x2f, 0xf0, 0x0f, 0x20, 0x21, 0xf1, 0x4f, 0x20, 0x0e, 0xdc, 0x38, 0xc3, 0x85, 0x03, 0x42, 0x2b, - 0x71, 0x41, 0xe2, 0x82, 0x76, 0xf9, 0x43, 0x90, 0xc7, 0x93, 0x4d, 0xec, 0xac, 0xd7, 0xc9, 0x36, - 0x37, 0xe7, 0x65, 0xbe, 0xf3, 0x3e, 0xdf, 0x37, 0x6f, 0x9e, 0x0d, 0x37, 0x6d, 0x62, 0x0f, 0x7c, - 0x16, 0x60, 0xa7, 0x4d, 0x9d, 0x83, 0x90, 0x79, 0x81, 0xf0, 0x02, 0x17, 0xf7, 0x6a, 0xf8, 0x30, - 0xa2, 0xdd, 0x81, 0x19, 0x76, 0x99, 0x60, 0xa8, 0xa2, 0x56, 0x99, 0xa9, 0x55, 0x66, 0xaf, 0xa6, - 0xdf, 0xca, 0xd5, 0xdb, 0x3e, 0x6f, 0x1d, 0x50, 0xb5, 0x83, 0x7e, 0xc7, 0x61, 0xbc, 0xc3, 0x38, - 0xb6, 0x09, 0xa7, 0xc9, 0xd6, 0xb8, 0x57, 0xb3, 0xa9, 0x20, 0x35, 0x1c, 0x12, 0xd7, 0x0b, 0x88, - 0xf0, 0x58, 0xa0, 0xd6, 0xae, 0xba, 0xcc, 0x65, 0xf2, 0x11, 0xc7, 0x4f, 0x2a, 0x7a, 0xdd, 0x65, - 0xcc, 0xf5, 0x29, 0x26, 0xa1, 0x87, 0x49, 0x10, 0x30, 0x21, 0x25, 0x5c, 0xfd, 0xfb, 0x6e, 0x2e, - 0xc7, 0x28, 0x90, 0x2c, 0x35, 0x7e, 0xd4, 0xe0, 0xcd, 0x4f, 0x62, 0x02, 0x8b, 0xf4, 0x1f, 0x9c, - 0xfe, 0xf9, 0xc8, 0xe3, 0xc2, 0xa2, 0x87, 0x11, 0xe5, 0x02, 0x35, 0xe1, 0x32, 0x17, 0x44, 0x44, - 0xbc, 0xa2, 0xdd, 0xd0, 0xd6, 0x96, 0xeb, 0x77, 0xcc, 0x3c, 0xff, 0xe6, 0x68, 0x83, 0x4f, 0xa5, - 0xc2, 0x52, 0x4a, 0xf4, 0x01, 0xc0, 0xc8, 0x58, 0xa5, 0x74, 0x43, 0x5b, 0x2b, 0xd7, 0x6f, 0x99, - 0x49, 0x15, 0xcc, 0xb8, 0x0a, 0x66, 0x52, 0x60, 0x55, 0x05, 0xf3, 0x31, 0x71, 0xa9, 0xca, 0x6f, - 0x8d, 0x29, 0x8d, 0xdf, 0x34, 0xa8, 0xe6, 0xd1, 0xf2, 0x90, 0x05, 0x9c, 0xa2, 0xcf, 0xe1, 0xd5, - 0x2e, 0xe9, 0xb7, 0x46, 0x6c, 0x31, 0xf7, 0xe2, 0x5a, 0xb9, 0x8e, 0xf3, 0xb9, 0x53, 0xbb, 0x7d, - 0xe6, 0x89, 0xf6, 0x47, 0x54, 0x10, 0x6b, 0xb9, 0x3b, 0x1e, 0xe6, 0xe8, 0xc3, 0x33, 0x4c, 0xdc, - 0x2e, 0x34, 0x91, 0x60, 0xa5, 0x5c, 0x34, 0xe0, 0x8d, 0x49, 0x13, 0xc3, 0x72, 0x5f, 0x83, 0x25, - 0x1a, 0x32, 0xa7, 0xdd, 0x0a, 0xa2, 0x8e, 0xac, 0xf8, 0x4b, 0xd6, 0xcb, 0x32, 0xb0, 0x1f, 0x75, - 0x0c, 0x01, 0xfa, 0x59, 0x4a, 0x65, 0xfd, 0x09, 0x2c, 0xa7, 0xad, 0x4b, 0xfd, 0x05, 0x9c, 0x5f, - 0x49, 0x39, 0x37, 0xbe, 0xd5, 0xe0, 0xba, 0x4c, 0xdb, 0xf4, 0xf9, 0xe3, 0xc8, 0xf6, 0x3d, 0xe7, - 0x21, 0x1d, 0x8c, 0xb7, 0xc8, 0x79, 0xcc, 0x73, 0x3b, 0xfb, 0x3f, 0x87, 0x9d, 0x3a, 0x49, 0xa1, - 0xfc, 0x3f, 0x85, 0xab, 0x3d, 0xe2, 0x7b, 0x4f, 0x89, 0x60, 0xdd, 0x56, 0xdf, 0x13, 0xed, 0x96, - 0xba, 0x76, 0xc3, 0x16, 0xb8, 0x9b, 0x5f, 0x88, 0x27, 0x43, 0x61, 0x5c, 0x84, 0xa6, 0xcf, 0x1f, - 0xd2, 0x81, 0xb5, 0xda, 0x9b, 0x0c, 0xce, 0xb1, 0x0d, 0xb6, 0xe0, 0xaa, 0xf4, 0xb3, 0x17, 0x57, - 0x4a, 0x5d, 0x98, 0x69, 0x9a, 0xe0, 0x4b, 0xa8, 0x4c, 0xea, 0x54, 0x09, 0xe6, 0x70, 0x59, 0x8d, - 0x3d, 0x30, 0x92, 0x26, 0xa3, 0x0e, 0x0d, 0xc4, 0x58, 0x96, 0x07, 0x2c, 0x1a, 0xf5, 0xe9, 0x5b, - 0x50, 0x4e, 0x10, 0x9d, 0x38, 0xaa, 0x20, 0x41, 0x86, 0xe4, 0x3a, 0xe3, 0x87, 0x12, 0xbc, 0x7d, - 0xee, 0x3e, 0x0a, 0xf9, 0x1a, 0x2c, 0x09, 0x2f, 0x6c, 0x49, 0xe5, 0xd0, 0xab, 0xf0, 0x42, 0xb9, - 0x3e, 0x9b, 0xa5, 0x94, 0xcd, 0x82, 0x0e, 0xe1, 0x95, 0x04, 0x5b, 0xad, 0x58, 0x94, 0x07, 0xbd, - 0x9f, 0x6f, 0x7b, 0x0a, 0x24, 0x73, 0x2c, 0xb6, 0x17, 0x88, 0xee, 0xc0, 0x2a, 0xf3, 0x51, 0x44, - 0xdf, 0x85, 0x95, 0xec, 0x02, 0xb4, 0x02, 0x8b, 0x07, 0x74, 0x20, 0xf1, 0x97, 0xac, 0xf8, 0x11, - 0xad, 0xc2, 0xa5, 0x1e, 0xf1, 0x23, 0xaa, 0x98, 0x93, 0x1f, 0x3b, 0xa5, 0x86, 0x66, 0x7c, 0x05, - 0x37, 0x25, 0xc4, 0x23, 0xc2, 0x45, 0xfa, 0xf2, 0xa5, 0x9b, 0x60, 0x1e, 0x67, 0xd9, 0x87, 0x77, - 0x0a, 0x72, 0xa9, 0x53, 0xd8, 0xcf, 0x99, 0x1d, 0xb7, 0xa7, 0x9c, 0x1d, 0x99, 0x99, 0x51, 0xff, - 0x69, 0x09, 0x2e, 0xc9, 0xcc, 0xe8, 0x57, 0x0d, 0x5e, 0x9b, 0x18, 0xd7, 0x68, 0xbb, 0xe8, 0x84, - 0x72, 0x5e, 0x47, 0x7a, 0x63, 0x76, 0x61, 0x62, 0xd1, 0xd8, 0xf9, 0xe6, 0xaf, 0xff, 0xbe, 0x2f, - 0x6d, 0xa0, 0x3a, 0xce, 0x7d, 0x3d, 0x66, 0xde, 0x1c, 0xf8, 0x59, 0x52, 0xc6, 0xe7, 0xe8, 0x17, - 0x0d, 0xae, 0xa4, 0x76, 0x46, 0xeb, 0xb3, 0x70, 0x0c, 0xe1, 0x37, 0x66, 0x13, 0x29, 0xf0, 0x7b, - 0x12, 0x7c, 0x0b, 0x6d, 0x4c, 0x0b, 0x8e, 0x9f, 0x9d, 0x4e, 0x8f, 0xe7, 0x71, 0xfd, 0x57, 0xb2, - 0x23, 0x13, 0x6d, 0x15, 0x80, 0xe4, 0x4c, 0x7a, 0x7d, 0x7b, 0x66, 0x9d, 0xf2, 0x70, 0x5f, 0x7a, - 0xd8, 0x46, 0x9b, 0xf8, 0xdc, 0x6f, 0xa4, 0x50, 0x8a, 0xe5, 0xcc, 0x4e, 0x99, 0xf8, 0x59, 0x83, - 0xf2, 0xd8, 0x75, 0x45, 0xb5, 0x02, 0x8e, 0xc9, 0x99, 0xaa, 0xd7, 0x67, 0x91, 0x28, 0xea, 0xf7, - 0x24, 0xf5, 0x26, 0x5a, 0xcf, 0xa7, 0x96, 0x90, 0x29, 0x58, 0xac, 0x3e, 0x7a, 0xfe, 0xd0, 0xe0, - 0xf5, 0xb3, 0x07, 0x0d, 0xba, 0x77, 0xc1, 0xf9, 0x94, 0x38, 0xb9, 0xff, 0x42, 0xd3, 0xcd, 0xd8, - 0x94, 0xa6, 0x30, 0xba, 0x5b, 0x64, 0x6a, 0x67, 0x7c, 0xb2, 0xa2, 0x7f, 0x34, 0xa8, 0xe4, 0x8d, - 0x11, 0xb4, 0x5b, 0x80, 0x54, 0x30, 0xeb, 0xf4, 0xf7, 0x2f, 0xac, 0x57, 0xa6, 0x76, 0xa5, 0xa9, - 0x06, 0xda, 0xca, 0x37, 0xe5, 0x13, 0x2e, 0x5a, 0xd9, 0x8b, 0xa2, 0x2e, 0x78, 0xf3, 0xe3, 0xdf, - 0x8f, 0xab, 0xda, 0xd1, 0x71, 0x55, 0xfb, 0xf7, 0xb8, 0xaa, 0x7d, 0x77, 0x52, 0x5d, 0x38, 0x3a, - 0xa9, 0x2e, 0xfc, 0x7d, 0x52, 0x5d, 0xf8, 0x62, 0xd3, 0xf5, 0x44, 0x3b, 0xb2, 0x4d, 0x87, 0x75, - 0x86, 0x7b, 0x3b, 0x6d, 0xe2, 0x05, 0xa7, 0x89, 0xbe, 0xce, 0xa4, 0x12, 0x83, 0x90, 0x72, 0xfb, - 0xb2, 0xfc, 0xbe, 0x5e, 0xff, 0x3f, 0x00, 0x00, 0xff, 0xff, 0x51, 0xee, 0xea, 0x49, 0x54, 0x0c, - 0x00, 0x00, + // 886 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x56, 0x41, 0x6f, 0xe3, 0x44, + 0x14, 0xae, 0x53, 0x76, 0x45, 0x5e, 0xd8, 0x52, 0x46, 0x2b, 0x36, 0x78, 0x97, 0xb0, 0x32, 0xa5, + 0x2d, 0x95, 0x6a, 0x2b, 0x69, 0x93, 0x46, 0xa5, 0x2d, 0x52, 0xaa, 0xc2, 0xa1, 0xa5, 0x14, 0x23, + 0x15, 0xc4, 0x81, 0x68, 0xec, 0x8e, 0x12, 0x53, 0xc7, 0x76, 0x33, 0xe3, 0x84, 0xa8, 0xea, 0x05, + 0xfe, 0x00, 0x12, 0x12, 0x7f, 0x02, 0x71, 0xe0, 0xc6, 0x19, 0x2e, 0x1c, 0x10, 0xaa, 0xc4, 0x05, + 0x89, 0x0b, 0x6a, 0xf9, 0x21, 0xc8, 0xe3, 0x49, 0x13, 0x3b, 0x75, 0x9d, 0x74, 0x73, 0x4b, 0x9e, + 0xdf, 0x37, 0xef, 0xfb, 0xde, 0xbc, 0xf7, 0xd9, 0xb0, 0x60, 0x60, 0xa3, 0x67, 0xbb, 0x8e, 0x66, + 0x36, 0x89, 0x79, 0xea, 0xb9, 0x96, 0xc3, 0x2c, 0xa7, 0xa1, 0x75, 0x8a, 0xda, 0x99, 0x4f, 0xda, + 0x3d, 0xd5, 0x6b, 0xbb, 0xcc, 0x45, 0x79, 0x91, 0xa5, 0x46, 0xb2, 0xd4, 0x4e, 0x51, 0x5e, 0x4c, + 0xc4, 0x1b, 0x36, 0xad, 0x9f, 0x12, 0x71, 0x82, 0xbc, 0x62, 0xba, 0xb4, 0xe5, 0x52, 0xcd, 0xc0, + 0x94, 0x84, 0x47, 0x6b, 0x9d, 0xa2, 0x41, 0x18, 0x2e, 0x6a, 0x1e, 0x6e, 0x58, 0x0e, 0x66, 0x96, + 0xeb, 0x88, 0xdc, 0x67, 0x0d, 0xd7, 0x6d, 0xd8, 0x44, 0xc3, 0x9e, 0xa5, 0x61, 0xc7, 0x71, 0x19, + 0x7f, 0x48, 0xc5, 0xd3, 0x77, 0x13, 0x2b, 0x0e, 0x02, 0x61, 0xaa, 0xf2, 0xa3, 0x04, 0x6f, 0x7e, + 0x12, 0xd4, 0xd2, 0x71, 0x77, 0xf7, 0xe6, 0xe1, 0x81, 0x45, 0x99, 0x4e, 0xce, 0x7c, 0x42, 0x19, + 0xaa, 0xc1, 0x43, 0xca, 0x30, 0xf3, 0x69, 0x5e, 0x7a, 0x2e, 0x2d, 0xcf, 0x95, 0x56, 0xd4, 0x24, + 0xa5, 0xea, 0xe0, 0x80, 0x4f, 0x39, 0x42, 0x17, 0x48, 0xf4, 0x01, 0xc0, 0x40, 0x42, 0x3e, 0xf3, + 0x5c, 0x5a, 0xce, 0x95, 0x16, 0xd5, 0x50, 0xaf, 0x1a, 0xe8, 0x55, 0xc3, 0x56, 0x0a, 0xbd, 0xea, + 0x11, 0x6e, 0x10, 0x51, 0x5f, 0x1f, 0x42, 0x2a, 0xbf, 0x49, 0x50, 0x48, 0x62, 0x4b, 0x3d, 0xd7, + 0xa1, 0x04, 0x7d, 0x0e, 0xaf, 0xb6, 0x71, 0xb7, 0x3e, 0xe0, 0x16, 0xf0, 0x9e, 0x5d, 0xce, 0x95, + 0xb4, 0x64, 0xde, 0x91, 0xd3, 0x3e, 0xb3, 0x58, 0xf3, 0x23, 0xc2, 0xb0, 0x3e, 0xd7, 0x1e, 0x0e, + 0x53, 0xf4, 0xe1, 0x2d, 0x22, 0x96, 0x52, 0x45, 0x84, 0xb4, 0x22, 0x2a, 0xaa, 0xf0, 0xc6, 0xa8, + 0x88, 0x7e, 0xbb, 0x9f, 0x42, 0x96, 0x78, 0xae, 0xd9, 0xac, 0x3b, 0x7e, 0x8b, 0x77, 0xfc, 0x25, + 0xfd, 0x65, 0x1e, 0x38, 0xf4, 0x5b, 0x0a, 0x03, 0xf9, 0x36, 0xa4, 0x90, 0x7e, 0x0c, 0x73, 0x51, + 0xe9, 0x1c, 0x7f, 0x0f, 0xe5, 0x8f, 0x22, 0xca, 0x95, 0x6f, 0x25, 0x78, 0xc6, 0xcb, 0xd6, 0x6c, + 0x7a, 0xe4, 0x1b, 0xb6, 0x65, 0xee, 0x93, 0xde, 0xf0, 0x88, 0xdc, 0xc5, 0x79, 0x6a, 0x77, 0xff, + 0x67, 0x7f, 0x52, 0x47, 0x59, 0x08, 0xfd, 0x27, 0xf0, 0xa4, 0x83, 0x6d, 0xeb, 0x04, 0x33, 0xb7, + 0x5d, 0xef, 0x5a, 0xac, 0x59, 0x17, 0x0b, 0xd6, 0x1f, 0x81, 0xd5, 0xe4, 0x46, 0x1c, 0xf7, 0x81, + 0x41, 0x13, 0x6a, 0x36, 0xdd, 0x27, 0x3d, 0xfd, 0x71, 0x67, 0x34, 0x38, 0xc5, 0x31, 0xa8, 0xc0, + 0x13, 0xae, 0x67, 0x2f, 0xe8, 0x94, 0x58, 0x98, 0x71, 0x86, 0xe0, 0x4b, 0xc8, 0x8f, 0xe2, 0x44, + 0x0b, 0xa6, 0xb0, 0xac, 0xca, 0x1e, 0x28, 0xe1, 0x90, 0x11, 0x93, 0x38, 0x6c, 0xa8, 0xca, 0xae, + 0xeb, 0x0f, 0xe6, 0xf4, 0x2d, 0xc8, 0x85, 0x14, 0xcd, 0x20, 0x2a, 0x48, 0x02, 0x0f, 0xf1, 0x3c, + 0xe5, 0x87, 0x0c, 0xbc, 0x7d, 0xe7, 0x39, 0x82, 0xf2, 0x53, 0xc8, 0x32, 0xcb, 0xab, 0x73, 0x64, + 0x5f, 0x2b, 0xb3, 0x3c, 0x9e, 0x1f, 0xaf, 0x92, 0x89, 0x57, 0x41, 0x67, 0xf0, 0x4a, 0x48, 0x5b, + 0x64, 0xcc, 0xf2, 0x8b, 0x3e, 0x4c, 0x96, 0x3d, 0x06, 0x25, 0x75, 0x28, 0xb6, 0xe7, 0xb0, 0x76, + 0x4f, 0xcf, 0xd1, 0x41, 0x44, 0xde, 0x81, 0xf9, 0x78, 0x02, 0x9a, 0x87, 0xd9, 0x53, 0xd2, 0xe3, + 0xf4, 0xb3, 0x7a, 0xf0, 0x13, 0x3d, 0x86, 0x07, 0x1d, 0x6c, 0xfb, 0x44, 0x70, 0x0e, 0xff, 0x6c, + 0x66, 0xaa, 0x92, 0xf2, 0x15, 0x2c, 0x70, 0x12, 0x07, 0x98, 0xb2, 0xe8, 0xf2, 0x45, 0x87, 0x60, + 0x1a, 0x77, 0xd9, 0x85, 0x77, 0x52, 0x6a, 0x89, 0x5b, 0x38, 0x4c, 0xf0, 0x8e, 0xa5, 0x31, 0xbd, + 0x23, 0xe6, 0x19, 0xa5, 0x9f, 0xb2, 0xf0, 0x80, 0x57, 0x46, 0xbf, 0x4a, 0xf0, 0xda, 0x88, 0x5d, + 0xa3, 0x8d, 0xb4, 0x1b, 0x4a, 0x78, 0x1d, 0xc9, 0xd5, 0xc9, 0x81, 0xa1, 0x44, 0x65, 0xf3, 0x9b, + 0xbf, 0xfe, 0xfb, 0x3e, 0xb3, 0x8e, 0x4a, 0x5a, 0xe2, 0xeb, 0x31, 0xf6, 0xe6, 0xd0, 0xce, 0xc3, + 0x36, 0x5e, 0xa0, 0x5f, 0x24, 0x78, 0x14, 0x39, 0x19, 0xad, 0x4d, 0xc2, 0xa3, 0x4f, 0x7e, 0x7d, + 0x32, 0x90, 0x20, 0xbe, 0xc5, 0x89, 0x57, 0xd0, 0xfa, 0xb8, 0xc4, 0xb5, 0xf3, 0x1b, 0xf7, 0xb8, + 0x08, 0xfa, 0x3f, 0x1f, 0xb7, 0x4c, 0x54, 0x49, 0x21, 0x92, 0xe0, 0xf4, 0xf2, 0xc6, 0xc4, 0x38, + 0xa1, 0x61, 0x9b, 0x6b, 0xd8, 0x40, 0x65, 0xed, 0xce, 0xaf, 0x21, 0x8f, 0x83, 0xb9, 0x67, 0x47, + 0x44, 0xfc, 0x2c, 0x41, 0x6e, 0x68, 0x5d, 0x51, 0x31, 0x85, 0xc7, 0xa8, 0xa7, 0xca, 0xa5, 0x49, + 0x20, 0x82, 0xf5, 0x7b, 0x9c, 0x75, 0x19, 0xad, 0x25, 0xb3, 0xe6, 0x24, 0x23, 0x64, 0x35, 0xf1, + 0xd1, 0xf3, 0x87, 0x04, 0xaf, 0xdf, 0x6e, 0x34, 0x68, 0xeb, 0x9e, 0xfe, 0x14, 0x2a, 0xd9, 0x7e, + 0x21, 0x77, 0x53, 0xca, 0x5c, 0x94, 0x86, 0x56, 0xd3, 0x44, 0x6d, 0x0e, 0x3b, 0x2b, 0xfa, 0x47, + 0x82, 0x7c, 0x92, 0x8d, 0xa0, 0x9d, 0x14, 0x4a, 0x29, 0x5e, 0x27, 0xbf, 0x7f, 0x6f, 0xbc, 0x10, + 0xb5, 0xc3, 0x45, 0x55, 0x51, 0x25, 0x59, 0x94, 0x8d, 0x29, 0xab, 0xc7, 0x17, 0x45, 0x2c, 0x78, + 0xed, 0xe3, 0xdf, 0xaf, 0x0a, 0xd2, 0xe5, 0x55, 0x41, 0xfa, 0xf7, 0xaa, 0x20, 0x7d, 0x77, 0x5d, + 0x98, 0xb9, 0xbc, 0x2e, 0xcc, 0xfc, 0x7d, 0x5d, 0x98, 0xf9, 0xa2, 0xdc, 0xb0, 0x58, 0xd3, 0x37, + 0x54, 0xd3, 0x6d, 0xf5, 0xcf, 0x36, 0x9b, 0xd8, 0x72, 0x6e, 0x0a, 0x7d, 0x1d, 0x2b, 0xc5, 0x7a, + 0x1e, 0xa1, 0xc6, 0x43, 0xfe, 0x7d, 0xbd, 0xf6, 0x7f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x26, 0xf7, + 0x47, 0x75, 0x3e, 0x0c, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/checkpointing/types/tx.pb.go b/x/checkpointing/types/tx.pb.go index 05dc31f9b..18b6a0a87 100644 --- a/x/checkpointing/types/tx.pb.go +++ b/x/checkpointing/types/tx.pb.go @@ -6,6 +6,7 @@ package types import ( context "context" fmt "fmt" + _ "github.com/cosmos/cosmos-proto" types "github.com/cosmos/cosmos-sdk/x/staking/types" _ "github.com/cosmos/gogoproto/gogoproto" grpc1 "github.com/cosmos/gogoproto/grpc" @@ -32,7 +33,8 @@ const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package // MsgAddBlsSig defines a message to add a bls signature from a // validator type MsgAddBlsSig struct { - BlsSig *BlsSig `protobuf:"bytes,1,opt,name=bls_sig,json=blsSig,proto3" json:"bls_sig,omitempty"` + Signer string `protobuf:"bytes,1,opt,name=signer,proto3" json:"signer,omitempty"` + BlsSig *BlsSig `protobuf:"bytes,2,opt,name=bls_sig,json=blsSig,proto3" json:"bls_sig,omitempty"` } func (m *MsgAddBlsSig) Reset() { *m = MsgAddBlsSig{} } @@ -192,32 +194,35 @@ func init() { func init() { proto.RegisterFile("babylon/checkpointing/v1/tx.proto", fileDescriptor_6b16c54750152c21) } var fileDescriptor_6b16c54750152c21 = []byte{ - // 399 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x92, 0xcd, 0x4a, 0xeb, 0x40, - 0x14, 0xc7, 0x33, 0xb7, 0xd0, 0x7b, 0xef, 0xdc, 0xbb, 0x0a, 0xa5, 0xd4, 0x2c, 0xd2, 0x0f, 0xa1, - 0xa8, 0x8b, 0x09, 0x6d, 0x71, 0xa1, 0xae, 0xac, 0x4b, 0x09, 0x42, 0x0a, 0x0a, 0x22, 0x94, 0x49, - 0x32, 0x4c, 0x43, 0x3e, 0x26, 0x64, 0xc6, 0xd2, 0xbc, 0x81, 0xb8, 0xf2, 0x11, 0xfa, 0x16, 0xbe, - 0x82, 0xcb, 0x2e, 0x5d, 0x4a, 0xbb, 0xf1, 0x0d, 0xdc, 0x4a, 0xf3, 0x41, 0x6b, 0x35, 0x52, 0x5c, - 0x25, 0x73, 0xf8, 0x9d, 0xff, 0xff, 0xfc, 0x0f, 0x07, 0x36, 0x4d, 0x6c, 0xc6, 0x1e, 0x0b, 0x34, - 0x6b, 0x44, 0x2c, 0x37, 0x64, 0x4e, 0x20, 0x9c, 0x80, 0x6a, 0xe3, 0x8e, 0x26, 0x26, 0x28, 0x8c, - 0x98, 0x60, 0x72, 0x2d, 0x43, 0xd0, 0x07, 0x04, 0x8d, 0x3b, 0x4a, 0x85, 0x32, 0xca, 0x12, 0x48, - 0x5b, 0xfe, 0xa5, 0xbc, 0xb2, 0x5f, 0x28, 0xb9, 0x2a, 0x64, 0x68, 0xbb, 0x10, 0x35, 0x3d, 0x3e, - 0x74, 0x49, 0x9c, 0x71, 0x75, 0x8b, 0x71, 0x9f, 0x71, 0x8d, 0x0b, 0xec, 0xa6, 0x80, 0x49, 0x04, - 0x5e, 0xcd, 0xd8, 0x1a, 0xc0, 0xff, 0x3a, 0xa7, 0xa7, 0xb6, 0xdd, 0xf7, 0xf8, 0xc0, 0xa1, 0xf2, - 0x11, 0xfc, 0xbd, 0x54, 0xe0, 0x0e, 0xad, 0x81, 0x06, 0xd8, 0xfb, 0xd7, 0x6d, 0xa0, 0xa2, 0x14, - 0x28, 0x6d, 0x31, 0xca, 0x66, 0xf2, 0x3d, 0xfe, 0x73, 0x37, 0xad, 0x4b, 0xaf, 0xd3, 0xba, 0xd4, - 0xaa, 0xc2, 0xca, 0xba, 0xa8, 0x41, 0x78, 0xc8, 0x02, 0x4e, 0x5a, 0x8f, 0x00, 0xee, 0xe8, 0x9c, - 0x5e, 0x45, 0x38, 0x0c, 0x89, 0x7d, 0x16, 0x11, 0x2c, 0xc8, 0x25, 0xf6, 0x1c, 0x1b, 0x0b, 0x16, - 0xc9, 0x5d, 0x58, 0x72, 0x49, 0xbc, 0x95, 0xed, 0x39, 0x89, 0x8d, 0x25, 0x2c, 0xdf, 0xc0, 0x8a, - 0xcf, 0xe9, 0xd0, 0x4a, 0xa4, 0x86, 0xe3, 0x5c, 0xab, 0xf6, 0x2b, 0x11, 0x39, 0x40, 0x69, 0x7c, - 0x94, 0xc5, 0x47, 0x59, 0x7c, 0xa4, 0x73, 0xba, 0xe1, 0x6e, 0xc8, 0xfe, 0xa7, 0xda, 0x5a, 0xa2, - 0x5d, 0xd8, 0x2c, 0x1c, 0x3c, 0x8f, 0xd7, 0x7d, 0x03, 0xb0, 0xa4, 0x73, 0x2a, 0x5b, 0xf0, 0xef, - 0x6a, 0xa1, 0xed, 0xe2, 0x20, 0xeb, 0x3b, 0x52, 0xd0, 0x76, 0x5c, 0x6e, 0x26, 0xdf, 0x03, 0x58, - 0x2d, 0x58, 0x64, 0xef, 0x5b, 0xa9, 0xaf, 0x9b, 0x94, 0x93, 0x1f, 0x34, 0xe5, 0xc3, 0xf4, 0x2f, - 0x9e, 0xe6, 0x2a, 0x98, 0xcd, 0x55, 0xf0, 0x32, 0x57, 0xc1, 0xc3, 0x42, 0x95, 0x66, 0x0b, 0x55, - 0x7a, 0x5e, 0xa8, 0xd2, 0xf5, 0x21, 0x75, 0xc4, 0xe8, 0xd6, 0x44, 0x16, 0xf3, 0xb5, 0xcc, 0xc0, - 0x1a, 0x61, 0x27, 0xc8, 0x1f, 0xda, 0x64, 0xe3, 0x84, 0x45, 0x1c, 0x12, 0x6e, 0x96, 0x93, 0xeb, - 0xec, 0xbd, 0x07, 0x00, 0x00, 0xff, 0xff, 0x57, 0x8a, 0x2d, 0x96, 0x66, 0x03, 0x00, 0x00, + // 447 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x93, 0x4f, 0x6b, 0xd4, 0x40, + 0x18, 0xc6, 0x33, 0x16, 0x56, 0x3b, 0x7a, 0x1a, 0x96, 0x92, 0xe6, 0x90, 0xdd, 0xae, 0x50, 0xaa, + 0xe0, 0xc4, 0x6e, 0xf1, 0xa0, 0x9e, 0xba, 0x1e, 0x25, 0x08, 0x29, 0x28, 0x88, 0x10, 0x26, 0xc9, + 0x30, 0x3b, 0xe4, 0xcf, 0x84, 0xbc, 0xe3, 0xd2, 0x7c, 0x00, 0x41, 0x3c, 0xf9, 0x11, 0xfa, 0x21, + 0x04, 0xbf, 0x82, 0xc7, 0xe2, 0xc9, 0xa3, 0xec, 0x5e, 0xfc, 0x06, 0x5e, 0x65, 0x93, 0x09, 0xbb, + 0x56, 0xa3, 0xe2, 0x29, 0x99, 0x37, 0xbf, 0xf7, 0x7d, 0x9e, 0xf7, 0x49, 0x82, 0x0f, 0x22, 0x16, + 0xd5, 0x99, 0x2a, 0xbc, 0x78, 0xce, 0xe3, 0xb4, 0x54, 0xb2, 0xd0, 0xb2, 0x10, 0xde, 0xe2, 0xd8, + 0xd3, 0xe7, 0xb4, 0xac, 0x94, 0x56, 0xc4, 0x36, 0x08, 0xfd, 0x09, 0xa1, 0x8b, 0x63, 0x67, 0x28, + 0x94, 0x50, 0x0d, 0xe4, 0xad, 0xef, 0x5a, 0xde, 0xb9, 0xd3, 0x3b, 0x72, 0x53, 0x30, 0xe8, 0x61, + 0x2f, 0x1a, 0x65, 0x10, 0xa6, 0xbc, 0x36, 0xdc, 0x28, 0x56, 0x90, 0x2b, 0xf0, 0x40, 0xb3, 0xb4, + 0x05, 0x22, 0xae, 0xd9, 0xc6, 0xa3, 0xb3, 0xdf, 0x02, 0x61, 0x6b, 0xa6, 0x3d, 0xb4, 0x8f, 0x26, + 0x6f, 0x10, 0xbe, 0xe5, 0x83, 0x38, 0x4d, 0x92, 0x59, 0x06, 0x67, 0x52, 0x90, 0xfb, 0x78, 0x00, + 0x52, 0x14, 0xbc, 0xb2, 0xd1, 0x18, 0x1d, 0xed, 0xce, 0xec, 0xcf, 0x1f, 0xee, 0x0d, 0x4d, 0xcb, + 0x69, 0x92, 0x54, 0x1c, 0xe0, 0x4c, 0x57, 0xb2, 0x10, 0x81, 0xe1, 0xc8, 0x43, 0x7c, 0x7d, 0xed, + 0x07, 0xa4, 0xb0, 0xaf, 0x8d, 0xd1, 0xd1, 0xcd, 0xe9, 0x98, 0xf6, 0x65, 0x42, 0x5b, 0x91, 0x60, + 0x10, 0x35, 0xd7, 0x47, 0x37, 0xde, 0x5e, 0x8c, 0xac, 0x6f, 0x17, 0x23, 0x6b, 0xb2, 0x87, 0x87, + 0xdb, 0x36, 0x02, 0x0e, 0xa5, 0x2a, 0x80, 0x4f, 0x3e, 0x22, 0xbc, 0xef, 0x83, 0x78, 0x51, 0xb1, + 0xb2, 0xe4, 0xc9, 0x93, 0x8a, 0x33, 0xcd, 0x9f, 0xb3, 0x4c, 0x26, 0x4c, 0xab, 0x8a, 0x4c, 0xf1, + 0x4e, 0xca, 0xeb, 0xc6, 0xe9, 0xdf, 0x64, 0x9f, 0xf2, 0x3a, 0x58, 0xc3, 0xe4, 0x15, 0x1e, 0xe6, + 0x20, 0xc2, 0xb8, 0x19, 0x15, 0x2e, 0xba, 0x59, 0xc6, 0xfb, 0x5d, 0x6a, 0x76, 0x35, 0x61, 0x52, + 0x13, 0x26, 0xf5, 0x41, 0x5c, 0x51, 0x0f, 0x48, 0xfe, 0x4b, 0x6d, 0x6b, 0xa3, 0xdb, 0xf8, 0xa0, + 0xd7, 0x78, 0xb7, 0xde, 0xf4, 0x3b, 0xc2, 0x3b, 0x3e, 0x08, 0x12, 0xe3, 0xdd, 0xcd, 0x2b, 0x38, + 0xec, 0x5f, 0x64, 0x3b, 0x23, 0x87, 0xfe, 0x1b, 0xd7, 0x89, 0x91, 0x77, 0x08, 0xef, 0xf5, 0x04, + 0x79, 0xf2, 0xc7, 0x51, 0xbf, 0x6f, 0x72, 0x1e, 0xff, 0x47, 0x53, 0x67, 0x66, 0xf6, 0xec, 0xd3, + 0xd2, 0x45, 0x97, 0x4b, 0x17, 0x7d, 0x5d, 0xba, 0xe8, 0xfd, 0xca, 0xb5, 0x2e, 0x57, 0xae, 0xf5, + 0x65, 0xe5, 0x5a, 0x2f, 0x1f, 0x08, 0xa9, 0xe7, 0xaf, 0x23, 0x1a, 0xab, 0xdc, 0x33, 0x02, 0xf1, + 0x9c, 0xc9, 0xa2, 0x3b, 0x78, 0xe7, 0x57, 0x7e, 0x08, 0x5d, 0x97, 0x1c, 0xa2, 0x41, 0xf3, 0x41, + 0x9f, 0xfc, 0x08, 0x00, 0x00, 0xff, 0xff, 0x8e, 0xef, 0x32, 0xf7, 0xb4, 0x03, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -370,6 +375,13 @@ func (m *MsgAddBlsSig) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintTx(dAtA, i, uint64(size)) } i-- + dAtA[i] = 0x12 + } + if len(m.Signer) > 0 { + i -= len(m.Signer) + copy(dAtA[i:], m.Signer) + i = encodeVarintTx(dAtA, i, uint64(len(m.Signer))) + i-- dAtA[i] = 0xa } return len(dAtA) - i, nil @@ -485,6 +497,10 @@ func (m *MsgAddBlsSig) Size() (n int) { } var l int _ = l + l = len(m.Signer) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } if m.BlsSig != nil { l = m.BlsSig.Size() n += 1 + l + sovTx(uint64(l)) @@ -563,6 +579,38 @@ func (m *MsgAddBlsSig) Unmarshal(dAtA []byte) error { } switch fieldNum { case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Signer", 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.Signer = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field BlsSig", wireType) } diff --git a/x/monitor/types/genesis.pb.go b/x/monitor/types/genesis.pb.go index 2a2ba0c75..8e2be0c21 100644 --- a/x/monitor/types/genesis.pb.go +++ b/x/monitor/types/genesis.pb.go @@ -5,7 +5,6 @@ package types import ( fmt "fmt" - _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/cosmos/gogoproto/proto" io "io" math "math" @@ -67,17 +66,16 @@ func init() { func init() { proto.RegisterFile("babylon/monitor/v1/genesis.proto", fileDescriptor_fb844fd916189e7b) } var fileDescriptor_fb844fd916189e7b = []byte{ - // 156 bytes of a gzipped FileDescriptorProto + // 144 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x48, 0x4a, 0x4c, 0xaa, 0xcc, 0xc9, 0xcf, 0xd3, 0xcf, 0xcd, 0xcf, 0xcb, 0x2c, 0xc9, 0x2f, 0xd2, 0x2f, 0x33, 0xd4, 0x4f, 0x4f, 0xcd, 0x4b, 0x2d, 0xce, 0x2c, 0xd6, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x12, 0x82, 0xaa, - 0xd0, 0x83, 0xaa, 0xd0, 0x2b, 0x33, 0x94, 0x12, 0x49, 0xcf, 0x4f, 0xcf, 0x07, 0x4b, 0xeb, 0x83, - 0x58, 0x10, 0x95, 0x4a, 0x7c, 0x5c, 0x3c, 0xee, 0x10, 0xad, 0xc1, 0x25, 0x89, 0x25, 0xa9, 0x4e, - 0x9e, 0x27, 0x1e, 0xc9, 0x31, 0x5e, 0x78, 0x24, 0xc7, 0xf8, 0xe0, 0x91, 0x1c, 0xe3, 0x84, 0xc7, - 0x72, 0x0c, 0x17, 0x1e, 0xcb, 0x31, 0xdc, 0x78, 0x2c, 0xc7, 0x10, 0xa5, 0x9f, 0x9e, 0x59, 0x92, - 0x51, 0x9a, 0xa4, 0x97, 0x9c, 0x9f, 0xab, 0x0f, 0x35, 0x3e, 0x39, 0x23, 0x31, 0x33, 0x0f, 0xc6, - 0xd1, 0xaf, 0x80, 0xbb, 0xa7, 0xa4, 0xb2, 0x20, 0xb5, 0x38, 0x89, 0x0d, 0x6c, 0x83, 0x31, 0x20, - 0x00, 0x00, 0xff, 0xff, 0x11, 0xca, 0xf1, 0x5e, 0xaf, 0x00, 0x00, 0x00, + 0xd0, 0x83, 0xaa, 0xd0, 0x2b, 0x33, 0x54, 0xe2, 0xe3, 0xe2, 0x71, 0x87, 0x28, 0x0a, 0x2e, 0x49, + 0x2c, 0x49, 0x75, 0xf2, 0x3c, 0xf1, 0x48, 0x8e, 0xf1, 0xc2, 0x23, 0x39, 0xc6, 0x07, 0x8f, 0xe4, + 0x18, 0x27, 0x3c, 0x96, 0x63, 0xb8, 0xf0, 0x58, 0x8e, 0xe1, 0xc6, 0x63, 0x39, 0x86, 0x28, 0xfd, + 0xf4, 0xcc, 0x92, 0x8c, 0xd2, 0x24, 0xbd, 0xe4, 0xfc, 0x5c, 0x7d, 0xa8, 0x41, 0xc9, 0x19, 0x89, + 0x99, 0x79, 0x30, 0x8e, 0x7e, 0x05, 0xdc, 0xe6, 0x92, 0xca, 0x82, 0xd4, 0xe2, 0x24, 0x36, 0xb0, + 0xad, 0xc6, 0x80, 0x00, 0x00, 0x00, 0xff, 0xff, 0xb7, 0x9f, 0x6b, 0xe2, 0x99, 0x00, 0x00, 0x00, } func (m *GenesisState) Marshal() (dAtA []byte, err error) { diff --git a/x/monitor/types/query.pb.go b/x/monitor/types/query.pb.go index a1219b6bc..210128e1c 100644 --- a/x/monitor/types/query.pb.go +++ b/x/monitor/types/query.pb.go @@ -6,7 +6,6 @@ package types import ( context "context" fmt "fmt" - _ "github.com/cosmos/gogoproto/gogoproto" grpc1 "github.com/cosmos/gogoproto/grpc" proto "github.com/cosmos/gogoproto/proto" _ "google.golang.org/genproto/googleapis/api/annotations" @@ -230,33 +229,33 @@ func init() { func init() { proto.RegisterFile("babylon/monitor/v1/query.proto", fileDescriptor_a8aafb034c55a8f2) } var fileDescriptor_a8aafb034c55a8f2 = []byte{ - // 414 bytes of a gzipped FileDescriptorProto + // 404 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x93, 0x4f, 0x8b, 0xd3, 0x40, - 0x18, 0xc6, 0x1b, 0xff, 0xb1, 0x3b, 0xc7, 0x71, 0x41, 0xc9, 0x4a, 0x5c, 0x72, 0xd0, 0x82, 0x98, - 0x61, 0xad, 0x9e, 0x14, 0x0f, 0xbb, 0xac, 0x54, 0x10, 0xc1, 0xdc, 0xf4, 0x12, 0x26, 0xd3, 0x21, - 0x33, 0x34, 0x99, 0x77, 0x9a, 0x99, 0x14, 0x4b, 0xe9, 0xc5, 0xa3, 0x27, 0xc1, 0x2f, 0xe2, 0xc7, - 0xf0, 0x22, 0x14, 0xbc, 0x78, 0x94, 0xd6, 0x0f, 0x22, 0x99, 0xc4, 0x5c, 0x4c, 0x2d, 0xea, 0x2d, - 0x79, 0x9f, 0x79, 0x7e, 0x79, 0xdf, 0xf7, 0xc9, 0xa0, 0x20, 0xa5, 0xe9, 0x22, 0x07, 0x45, 0x0a, - 0x50, 0xd2, 0x42, 0x49, 0xe6, 0xa7, 0x64, 0x56, 0xf1, 0x72, 0x11, 0xe9, 0x12, 0x2c, 0x60, 0xdc, - 0xea, 0x51, 0xab, 0x47, 0xf3, 0x53, 0xff, 0x28, 0x83, 0x0c, 0x9c, 0x4c, 0xea, 0xa7, 0xe6, 0xa4, - 0x7f, 0x2b, 0x03, 0xc8, 0x72, 0x4e, 0xa8, 0x96, 0x84, 0x2a, 0x05, 0x96, 0x5a, 0x09, 0xca, 0x34, - 0x6a, 0xf8, 0x14, 0xdd, 0x7e, 0x55, 0x63, 0x2f, 0xd4, 0x84, 0x4f, 0x2e, 0x34, 0x30, 0x71, 0x66, - 0xd9, 0x98, 0xcb, 0x4c, 0xd8, 0x98, 0xcf, 0x2a, 0x6e, 0x2c, 0x3e, 0x46, 0x87, 0xbc, 0x16, 0x12, - 0x55, 0x15, 0x37, 0xbd, 0x13, 0x6f, 0x78, 0x25, 0x3e, 0x70, 0x85, 0x97, 0x55, 0x11, 0xbe, 0x46, - 0x27, 0xbb, 0xfd, 0x46, 0x83, 0x32, 0x1c, 0x3f, 0x42, 0x37, 0x52, 0xcb, 0x92, 0xbc, 0x2e, 0x26, - 0x2c, 0x97, 0x5c, 0xd9, 0x44, 0xb8, 0x23, 0x2d, 0xee, 0x28, 0xb5, 0xec, 0x45, 0xfd, 0x7e, 0xee, - 0xc4, 0xc6, 0x1e, 0x3e, 0x43, 0x77, 0x1d, 0x3a, 0xe6, 0x1a, 0x4a, 0xcb, 0x27, 0xe7, 0x82, 0xb3, - 0xa9, 0x06, 0xa9, 0x6c, 0x5f, 0x8b, 0x6c, 0xaa, 0x6d, 0x22, 0xa8, 0x11, 0x8e, 0x79, 0x18, 0x1f, - 0xd4, 0x85, 0x31, 0x35, 0x22, 0xa4, 0x68, 0xb8, 0x9f, 0xf3, 0x5f, 0xad, 0x3e, 0x78, 0x7f, 0x19, - 0x5d, 0x75, 0xdf, 0xc0, 0x9f, 0x3c, 0x74, 0xbd, 0x67, 0x17, 0x78, 0x14, 0xfd, 0x1e, 0x58, 0xb4, - 0x67, 0xf3, 0xfe, 0xc3, 0xbf, 0x33, 0x35, 0x33, 0x84, 0xd1, 0xbb, 0xaf, 0x3f, 0x3e, 0x5e, 0x1a, - 0xe2, 0x3b, 0xa4, 0xe7, 0x1f, 0x72, 0xc1, 0x19, 0xb2, 0xec, 0x12, 0x5d, 0xe1, 0x2f, 0x1e, 0x3a, - 0xfe, 0xc3, 0x6e, 0xf0, 0xe3, 0x9d, 0x5d, 0xec, 0x4f, 0xc6, 0x7f, 0xf2, 0x6f, 0xe6, 0x76, 0x94, - 0x91, 0x1b, 0xe5, 0x3e, 0xbe, 0xd7, 0x37, 0x0a, 0xeb, 0x8c, 0x86, 0x2c, 0xbb, 0xf8, 0x57, 0x67, - 0xcf, 0x3f, 0x6f, 0x02, 0x6f, 0xbd, 0x09, 0xbc, 0xef, 0x9b, 0xc0, 0xfb, 0xb0, 0x0d, 0x06, 0xeb, - 0x6d, 0x30, 0xf8, 0xb6, 0x0d, 0x06, 0x6f, 0x48, 0x26, 0xad, 0xa8, 0xd2, 0x88, 0x41, 0xf1, 0x0b, - 0xc8, 0x04, 0x95, 0xaa, 0xa3, 0xbf, 0xed, 0xf8, 0x76, 0xa1, 0xb9, 0x49, 0xaf, 0xb9, 0x4b, 0x32, - 0xfa, 0x19, 0x00, 0x00, 0xff, 0xff, 0x2c, 0x9f, 0x08, 0x3d, 0x8e, 0x03, 0x00, 0x00, + 0x18, 0xc6, 0x1b, 0xff, 0xd1, 0xce, 0x71, 0x14, 0x94, 0x56, 0x62, 0xc9, 0x41, 0x0b, 0x62, 0x86, + 0x5a, 0x3d, 0x29, 0x1e, 0x5a, 0x2a, 0x15, 0x44, 0x30, 0x37, 0xbd, 0x84, 0xc9, 0x74, 0xc8, 0x0c, + 0x4d, 0x66, 0xa6, 0x99, 0x49, 0xb1, 0x94, 0x5e, 0x3c, 0x7a, 0x12, 0xfc, 0x22, 0x7e, 0x0c, 0x2f, + 0x42, 0xc1, 0x8b, 0xc7, 0xa5, 0xdd, 0x0f, 0xb2, 0x64, 0x9a, 0xcd, 0x65, 0xd3, 0x2d, 0xbb, 0x7b, + 0xcc, 0xfb, 0xe6, 0xf9, 0xcd, 0xfb, 0xbc, 0xcf, 0x0c, 0x70, 0x23, 0x1c, 0x2d, 0x13, 0x29, 0x50, + 0x2a, 0x05, 0x37, 0x32, 0x43, 0x8b, 0x3e, 0x9a, 0xe7, 0x34, 0x5b, 0xfa, 0x2a, 0x93, 0x46, 0x42, + 0x58, 0xf6, 0xfd, 0xb2, 0xef, 0x2f, 0xfa, 0xed, 0xc7, 0xb1, 0x94, 0x71, 0x42, 0x11, 0x56, 0x1c, + 0x61, 0x21, 0xa4, 0xc1, 0x86, 0x4b, 0xa1, 0xf7, 0x0a, 0xef, 0x1d, 0x78, 0xf2, 0xb9, 0x00, 0x8c, + 0xc5, 0x94, 0x4e, 0xc7, 0x4a, 0x12, 0x36, 0x34, 0x64, 0x42, 0x79, 0xcc, 0x4c, 0x40, 0xe7, 0x39, + 0xd5, 0x06, 0x76, 0x40, 0x8b, 0x16, 0x8d, 0x50, 0xe4, 0xe9, 0x23, 0xa7, 0xeb, 0xf4, 0xee, 0x04, + 0x4d, 0x5b, 0xf8, 0x94, 0xa7, 0xde, 0x17, 0xd0, 0x3d, 0xac, 0xd7, 0x4a, 0x0a, 0x4d, 0xe1, 0x6b, + 0xf0, 0x30, 0x32, 0x24, 0x4c, 0x8a, 0x62, 0x48, 0x12, 0x4e, 0x85, 0x09, 0x99, 0xfd, 0xa5, 0xc4, + 0x3d, 0x88, 0x0c, 0xf9, 0x58, 0x7c, 0x8f, 0x6c, 0x73, 0x2f, 0xf7, 0xde, 0x83, 0x67, 0x16, 0x1d, + 0x50, 0x25, 0x33, 0x43, 0xa7, 0x23, 0x46, 0xc9, 0x4c, 0x49, 0x2e, 0x4c, 0xdd, 0x88, 0x64, 0xa6, + 0x4c, 0xc8, 0xb0, 0x66, 0x96, 0xd9, 0x0a, 0x9a, 0x45, 0x61, 0x82, 0x35, 0xf3, 0x30, 0xe8, 0x1d, + 0xe7, 0xdc, 0x68, 0xd4, 0x97, 0x3f, 0x6e, 0x83, 0xbb, 0xf6, 0x0c, 0xf8, 0xdb, 0x01, 0xf7, 0x6b, + 0x76, 0x01, 0x07, 0xfe, 0xc5, 0x68, 0xfc, 0x23, 0x9b, 0x6f, 0xbf, 0xba, 0x9a, 0x68, 0xef, 0xc1, + 0xf3, 0xbf, 0xff, 0x3b, 0xfd, 0x75, 0xab, 0x07, 0x9f, 0xa2, 0x9a, 0xdb, 0x62, 0x83, 0xd3, 0x68, + 0x55, 0x25, 0xba, 0x86, 0x7f, 0x1d, 0xd0, 0xb9, 0x64, 0x37, 0xf0, 0xcd, 0xc1, 0x29, 0x8e, 0x27, + 0xd3, 0x7e, 0x7b, 0x3d, 0x71, 0x69, 0x65, 0x60, 0xad, 0xbc, 0x80, 0xcf, 0xeb, 0xac, 0x90, 0x4a, + 0xa8, 0xd1, 0xaa, 0x8a, 0x7f, 0x3d, 0xfc, 0xf0, 0x67, 0xeb, 0x3a, 0x9b, 0xad, 0xeb, 0x9c, 0x6c, + 0x5d, 0xe7, 0xe7, 0xce, 0x6d, 0x6c, 0x76, 0x6e, 0xe3, 0xff, 0xce, 0x6d, 0x7c, 0x45, 0x31, 0x37, + 0x2c, 0x8f, 0x7c, 0x22, 0xd3, 0x73, 0x20, 0x61, 0x98, 0x8b, 0x8a, 0xfe, 0xad, 0xe2, 0x9b, 0xa5, + 0xa2, 0x3a, 0xba, 0x67, 0x1f, 0xc9, 0xe0, 0x2c, 0x00, 0x00, 0xff, 0xff, 0xf9, 0x12, 0xa1, 0x9a, + 0x78, 0x03, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/zoneconcierge/types/genesis.pb.go b/x/zoneconcierge/types/genesis.pb.go index 7c4d2fe05..67c72b428 100644 --- a/x/zoneconcierge/types/genesis.pb.go +++ b/x/zoneconcierge/types/genesis.pb.go @@ -5,7 +5,6 @@ package types import ( fmt "fmt" - _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/cosmos/gogoproto/proto" io "io" math "math" @@ -77,19 +76,18 @@ func init() { } var fileDescriptor_56f290ad7c2c7dc7 = []byte{ - // 186 bytes of a gzipped FileDescriptorProto + // 173 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x4b, 0x4a, 0x4c, 0xaa, 0xcc, 0xc9, 0xcf, 0xd3, 0xaf, 0xca, 0xcf, 0x4b, 0x4d, 0xce, 0xcf, 0x4b, 0xce, 0x4c, 0x2d, 0x4a, 0x4f, 0xd5, 0x2f, 0x33, 0xd4, 0x4f, 0x4f, 0xcd, 0x4b, 0x2d, 0xce, 0x2c, 0xd6, 0x2b, 0x28, 0xca, - 0x2f, 0xc9, 0x17, 0x92, 0x80, 0xaa, 0xd3, 0x43, 0x51, 0xa7, 0x57, 0x66, 0x28, 0x25, 0x92, 0x9e, - 0x9f, 0x9e, 0x0f, 0x56, 0xa4, 0x0f, 0x62, 0x41, 0xd4, 0x2b, 0xa9, 0x73, 0xf1, 0xb8, 0x43, 0x0c, - 0x08, 0x2e, 0x49, 0x2c, 0x49, 0x15, 0x12, 0xe7, 0x62, 0x2f, 0xc8, 0x2f, 0x2a, 0x89, 0xcf, 0x4c, - 0x91, 0x60, 0x54, 0x60, 0xd4, 0xe0, 0x0c, 0x62, 0x03, 0x71, 0x3d, 0x53, 0x9c, 0xfc, 0x4f, 0x3c, - 0x92, 0x63, 0xbc, 0xf0, 0x48, 0x8e, 0xf1, 0xc1, 0x23, 0x39, 0xc6, 0x09, 0x8f, 0xe5, 0x18, 0x2e, - 0x3c, 0x96, 0x63, 0xb8, 0xf1, 0x58, 0x8e, 0x21, 0xca, 0x34, 0x3d, 0xb3, 0x24, 0xa3, 0x34, 0x49, - 0x2f, 0x39, 0x3f, 0x57, 0x1f, 0x6a, 0x7b, 0x72, 0x46, 0x62, 0x66, 0x1e, 0x8c, 0xa3, 0x5f, 0x81, - 0xe6, 0xe8, 0x92, 0xca, 0x82, 0xd4, 0xe2, 0x24, 0x36, 0xb0, 0x03, 0x8c, 0x01, 0x01, 0x00, 0x00, - 0xff, 0xff, 0xbf, 0x3e, 0xc9, 0x02, 0xda, 0x00, 0x00, 0x00, + 0x2f, 0xc9, 0x17, 0x92, 0x80, 0xaa, 0xd3, 0x43, 0x51, 0xa7, 0x57, 0x66, 0xa8, 0xa4, 0xce, 0xc5, + 0xe3, 0x0e, 0x51, 0x1a, 0x5c, 0x92, 0x58, 0x92, 0x2a, 0x24, 0xce, 0xc5, 0x5e, 0x90, 0x5f, 0x54, + 0x12, 0x9f, 0x99, 0x22, 0xc1, 0xa8, 0xc0, 0xa8, 0xc1, 0x19, 0xc4, 0x06, 0xe2, 0x7a, 0xa6, 0x38, + 0xf9, 0x9f, 0x78, 0x24, 0xc7, 0x78, 0xe1, 0x91, 0x1c, 0xe3, 0x83, 0x47, 0x72, 0x8c, 0x13, 0x1e, + 0xcb, 0x31, 0x5c, 0x78, 0x2c, 0xc7, 0x70, 0xe3, 0xb1, 0x1c, 0x43, 0x94, 0x69, 0x7a, 0x66, 0x49, + 0x46, 0x69, 0x92, 0x5e, 0x72, 0x7e, 0xae, 0x3e, 0xd4, 0x9e, 0xe4, 0x8c, 0xc4, 0xcc, 0x3c, 0x18, + 0x47, 0xbf, 0x02, 0xcd, 0x79, 0x25, 0x95, 0x05, 0xa9, 0xc5, 0x49, 0x6c, 0x60, 0xa7, 0x19, 0x03, + 0x02, 0x00, 0x00, 0xff, 0xff, 0x7f, 0x84, 0xa6, 0xb1, 0xc4, 0x00, 0x00, 0x00, } func (m *GenesisState) Marshal() (dAtA []byte, err error) { diff --git a/x/zoneconcierge/types/query.pb.go b/x/zoneconcierge/types/query.pb.go index 25fd96778..9841ea276 100644 --- a/x/zoneconcierge/types/query.pb.go +++ b/x/zoneconcierge/types/query.pb.go @@ -10,7 +10,6 @@ import ( types1 "github.com/babylonchain/babylon/x/checkpointing/types" types "github.com/babylonchain/babylon/x/epoching/types" query "github.com/cosmos/cosmos-sdk/types/query" - _ "github.com/cosmos/gogoproto/gogoproto" grpc1 "github.com/cosmos/gogoproto/grpc" proto "github.com/cosmos/gogoproto/proto" _ "google.golang.org/genproto/googleapis/api/annotations" @@ -966,75 +965,74 @@ func init() { } var fileDescriptor_cd665af90102da38 = []byte{ - // 1080 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x57, 0x4f, 0x6f, 0xdc, 0x44, - 0x14, 0x8f, 0xf3, 0xaf, 0xd9, 0x97, 0x52, 0x55, 0x43, 0x28, 0x8b, 0xd3, 0x6e, 0x23, 0x83, 0x20, - 0xad, 0x82, 0xcd, 0x2e, 0x2d, 0x25, 0xe2, 0x50, 0x25, 0x29, 0x49, 0x43, 0x51, 0x69, 0x0c, 0xe1, - 0x80, 0x90, 0x56, 0xb6, 0x77, 0xd6, 0x6b, 0x25, 0x3b, 0xb3, 0xf5, 0x78, 0xb7, 0xdd, 0x86, 0x70, - 0xe0, 0x13, 0x20, 0xc1, 0x01, 0x71, 0x45, 0x02, 0x89, 0x43, 0x3f, 0x07, 0x48, 0x3d, 0x54, 0xe2, - 0xc2, 0x11, 0x25, 0x7c, 0x0d, 0x24, 0xe4, 0x99, 0xb1, 0xd7, 0x5e, 0xaf, 0xd9, 0x3f, 0xe4, 0xc0, - 0x81, 0xdb, 0xce, 0xf8, 0xbd, 0xdf, 0xfb, 0xbd, 0x3f, 0xf3, 0xde, 0x5b, 0x78, 0xcd, 0xb6, 0xec, - 0xee, 0x21, 0x25, 0xc6, 0x13, 0x4a, 0xb0, 0x43, 0x89, 0xe3, 0x61, 0xdf, 0xc5, 0x46, 0xa7, 0x6c, - 0x3c, 0x6c, 0x63, 0xbf, 0xab, 0xb7, 0x7c, 0x1a, 0x50, 0x54, 0x94, 0x52, 0x7a, 0x4a, 0x4a, 0xef, - 0x94, 0xd5, 0x25, 0x97, 0xba, 0x94, 0x0b, 0x19, 0xe1, 0x2f, 0x21, 0xaf, 0x5e, 0x76, 0x29, 0x75, - 0x0f, 0xb1, 0x61, 0xb5, 0x3c, 0xc3, 0x22, 0x84, 0x06, 0x56, 0xe0, 0x51, 0xc2, 0xe4, 0xd7, 0xeb, - 0x0e, 0x65, 0x4d, 0xca, 0x0c, 0xdb, 0x62, 0x58, 0x98, 0x31, 0x3a, 0x65, 0x1b, 0x07, 0x56, 0xd9, - 0x68, 0x59, 0xae, 0x47, 0xb8, 0xb0, 0x94, 0x5d, 0x8b, 0xf8, 0xd9, 0x81, 0xe3, 0x34, 0xb0, 0x73, - 0xd0, 0xa2, 0x1e, 0x09, 0x42, 0x7e, 0xa9, 0x0b, 0x29, 0x7d, 0x2d, 0x92, 0xee, 0x7d, 0xf1, 0x88, - 0x1b, 0x4a, 0x67, 0x44, 0xb5, 0x48, 0x14, 0xb7, 0xa8, 0xd3, 0x90, 0x52, 0xd1, 0xef, 0x7e, 0xe3, - 0x99, 0xe0, 0xa4, 0xe3, 0xc0, 0xa5, 0xb5, 0x1d, 0x40, 0x7b, 0xa1, 0x33, 0x77, 0xb1, 0x55, 0xc3, - 0xbe, 0x89, 0x1f, 0xb6, 0x31, 0x0b, 0xd0, 0x2b, 0xb0, 0xe0, 0x34, 0x2c, 0x8f, 0x54, 0xbd, 0x5a, - 0x51, 0x59, 0x51, 0x56, 0x0b, 0xe6, 0x39, 0x7e, 0xde, 0xad, 0xa1, 0x4b, 0x30, 0xdf, 0xc0, 0x9e, - 0xdb, 0x08, 0x8a, 0xd3, 0x2b, 0xca, 0xea, 0xac, 0x29, 0x4f, 0xda, 0xf7, 0x0a, 0xbc, 0x98, 0x42, - 0x62, 0x2d, 0x4a, 0x18, 0x46, 0xb7, 0x43, 0xf9, 0xf0, 0x86, 0x03, 0x2d, 0x56, 0xde, 0xd0, 0xf3, - 0xd2, 0xa2, 0xef, 0x92, 0x1a, 0x7e, 0x8c, 0x6b, 0x12, 0x40, 0xaa, 0xa1, 0x4d, 0x38, 0x5f, 0xa7, - 0xfe, 0x41, 0x55, 0x1c, 0x19, 0x37, 0xbb, 0x58, 0xb9, 0x9a, 0x0f, 0xb3, 0x4d, 0xfd, 0x03, 0x66, - 0x2e, 0x86, 0x4a, 0x02, 0x8a, 0x69, 0x55, 0x78, 0x89, 0x73, 0xdb, 0x0a, 0x9d, 0xf8, 0xd0, 0x63, - 0x41, 0xe4, 0xe8, 0x36, 0x40, 0x2f, 0x7b, 0x92, 0xe1, 0xeb, 0xba, 0x48, 0xb5, 0x1e, 0xa6, 0x5a, - 0x17, 0x15, 0x25, 0x53, 0xad, 0x3f, 0xb0, 0x5c, 0x2c, 0x75, 0xcd, 0x84, 0xa6, 0xf6, 0x25, 0x5c, - 0xea, 0x37, 0x20, 0xfd, 0x5f, 0x86, 0x42, 0x14, 0x4a, 0x56, 0x54, 0x56, 0x66, 0x56, 0x0b, 0xe6, - 0x82, 0x8c, 0x25, 0x43, 0x3b, 0x29, 0xf3, 0xd3, 0x32, 0x40, 0xc3, 0xcc, 0x0b, 0xe4, 0x94, 0xfd, - 0x4a, 0xd2, 0xc1, 0x5d, 0x52, 0xa7, 0xc3, 0x33, 0xa9, 0x7d, 0x9e, 0xe4, 0x2c, 0x74, 0x24, 0xe7, - 0x4d, 0x00, 0xa9, 0x44, 0xea, 0x54, 0x46, 0xe5, 0xd5, 0xfc, 0x80, 0xf7, 0x00, 0x84, 0xab, 0xe1, - 0x4f, 0xed, 0x13, 0x50, 0x39, 0xfa, 0xfb, 0x61, 0x75, 0x66, 0x68, 0x2d, 0x43, 0x81, 0x97, 0x6d, - 0x95, 0xb4, 0x9b, 0xdc, 0xc0, 0xac, 0xb9, 0xc0, 0x2f, 0xee, 0xb7, 0x9b, 0x29, 0xce, 0xd3, 0x69, - 0xce, 0x16, 0x2c, 0x0f, 0x44, 0x3d, 0x43, 0xe2, 0x5f, 0xc0, 0xcb, 0xdc, 0x44, 0x98, 0x45, 0x59, - 0x3f, 0x23, 0x3c, 0x8b, 0xed, 0x01, 0x99, 0x9c, 0xa4, 0x90, 0x7e, 0x54, 0xa0, 0x98, 0x35, 0x2f, - 0xdd, 0xdb, 0x80, 0x73, 0xd1, 0x2b, 0x08, 0x2b, 0x69, 0x8c, 0xc7, 0x14, 0xe9, 0x9d, 0x5d, 0xc5, - 0x7d, 0x0a, 0x97, 0x63, 0x9e, 0x3c, 0x1b, 0x7d, 0xb1, 0x9a, 0x34, 0xc3, 0x36, 0x5c, 0xc9, 0xc1, - 0x3d, 0xb3, 0x20, 0x68, 0x7b, 0x50, 0xe2, 0x36, 0xb6, 0x3d, 0x62, 0x1d, 0x7a, 0x4f, 0x70, 0x6d, - 0x8c, 0x67, 0x83, 0x96, 0x60, 0xae, 0xe5, 0xd3, 0x0e, 0xe6, 0xc4, 0x17, 0x4c, 0x71, 0xd0, 0x7e, - 0x98, 0x81, 0xab, 0xb9, 0x98, 0x92, 0xf9, 0x3e, 0x2c, 0xd5, 0xa3, 0xaf, 0xd5, 0xc9, 0xea, 0x14, - 0xd5, 0x33, 0xf0, 0x68, 0x1d, 0x40, 0x44, 0x9a, 0x83, 0x89, 0x94, 0xaa, 0x31, 0x58, 0x3c, 0x1d, - 0x3a, 0x65, 0x9d, 0xc7, 0xd3, 0x14, 0x79, 0xe1, 0xaa, 0xf7, 0xe1, 0x82, 0x6f, 0x3d, 0xaa, 0xf6, - 0xe6, 0x4c, 0x71, 0xa6, 0xaf, 0x49, 0xa7, 0x66, 0x52, 0x88, 0x61, 0x5a, 0x8f, 0xb6, 0xe2, 0x3b, - 0xf3, 0x05, 0x3f, 0x79, 0x44, 0xfb, 0x80, 0xec, 0xc0, 0xa9, 0xb2, 0xb6, 0xdd, 0xf4, 0x18, 0xf3, - 0x28, 0xa9, 0x1e, 0xe0, 0x6e, 0x71, 0xb6, 0x0f, 0x33, 0x3d, 0x04, 0x3b, 0x65, 0xfd, 0xe3, 0x58, - 0xfe, 0x1e, 0xee, 0x9a, 0x17, 0xed, 0xc0, 0x49, 0xdd, 0xa0, 0x1d, 0x1e, 0x72, 0x5a, 0x2f, 0xce, - 0x71, 0xa4, 0x72, 0x7e, 0xa4, 0x1e, 0x84, 0x62, 0x03, 0x52, 0x20, 0xf4, 0xb5, 0x00, 0xae, 0xe5, - 0x24, 0x69, 0x9f, 0x04, 0xde, 0xe1, 0x5d, 0x3e, 0xca, 0x26, 0x1f, 0x82, 0xbd, 0xda, 0x98, 0x49, - 0xd6, 0xc6, 0xd3, 0x19, 0xb8, 0x3e, 0x8a, 0xd9, 0xff, 0xcb, 0xe4, 0xbf, 0x51, 0x26, 0x95, 0x6f, - 0xcf, 0xc3, 0x1c, 0x4f, 0x18, 0x7a, 0xaa, 0xc0, 0xbc, 0xe8, 0x1e, 0x68, 0x2d, 0x1f, 0x2e, 0xbb, - 0x41, 0xa9, 0x6f, 0x8e, 0x28, 0x2d, 0x72, 0xae, 0xed, 0x7c, 0xf5, 0xdb, 0x9f, 0xdf, 0x4c, 0x6f, - 0xa0, 0xdb, 0x46, 0xee, 0xf6, 0xd6, 0xab, 0x04, 0xe3, 0x28, 0xaa, 0xcb, 0x63, 0x43, 0xb4, 0x34, - 0xe3, 0x48, 0x14, 0xe0, 0x31, 0xfa, 0x4e, 0x81, 0x42, 0xbc, 0x84, 0x20, 0x63, 0x08, 0x8b, 0xfe, - 0x7d, 0x48, 0x7d, 0x6b, 0x74, 0x05, 0xc9, 0x7c, 0x95, 0x33, 0xd7, 0xd0, 0xca, 0x10, 0xe6, 0x0c, - 0xfd, 0x14, 0x51, 0xe3, 0x35, 0x35, 0x12, 0xb5, 0x44, 0x4b, 0x1e, 0x8d, 0x5a, 0xb2, 0xdf, 0x6a, - 0xb7, 0x38, 0xb5, 0x32, 0x32, 0xc6, 0x0c, 0x2a, 0xfa, 0x55, 0x81, 0x0b, 0xe9, 0x0d, 0x03, 0xdd, - 0x18, 0x62, 0x7d, 0xe0, 0x9a, 0xa3, 0xde, 0x1c, 0x53, 0x4b, 0x12, 0xff, 0x80, 0x13, 0xbf, 0x83, - 0x36, 0xc7, 0xad, 0x06, 0xfe, 0x64, 0x99, 0x71, 0x14, 0x4f, 0xde, 0x63, 0xf4, 0xb3, 0x02, 0x8b, - 0x89, 0x5d, 0x02, 0x95, 0x87, 0x50, 0xca, 0xae, 0x3d, 0x6a, 0x65, 0x1c, 0x15, 0xe9, 0xc2, 0x0d, - 0xee, 0x82, 0x8e, 0xd6, 0xf2, 0x5d, 0x90, 0xd3, 0x38, 0x19, 0xf8, 0x67, 0x0a, 0x5c, 0xec, 0x1f, - 0xfc, 0xe8, 0x9d, 0x11, 0xcc, 0x0f, 0xd8, 0x40, 0xd4, 0x5b, 0x63, 0xeb, 0x8d, 0xfe, 0x18, 0xb3, - 0xdc, 0x07, 0xc5, 0xfe, 0x99, 0x02, 0x28, 0xdb, 0x65, 0xd0, 0xbb, 0x43, 0x88, 0xe5, 0xae, 0x25, - 0xea, 0xfa, 0x04, 0x9a, 0xd2, 0xa9, 0x0d, 0xee, 0xd4, 0x7b, 0x68, 0x3d, 0xdf, 0xa9, 0x41, 0x53, - 0x27, 0x99, 0x9d, 0xbf, 0x14, 0xb8, 0xf2, 0x8f, 0x23, 0x0c, 0x6d, 0x8d, 0xcd, 0x2f, 0x3b, 0x77, - 0xd5, 0x3b, 0xff, 0x0e, 0x44, 0xfa, 0xbb, 0xc7, 0xfd, 0xbd, 0x87, 0x76, 0x27, 0xf6, 0xd7, 0x10, - 0x3d, 0x35, 0xee, 0xad, 0x9b, 0x1f, 0xfd, 0x72, 0x52, 0x52, 0x9e, 0x9f, 0x94, 0x94, 0x3f, 0x4e, - 0x4a, 0xca, 0xd7, 0xa7, 0xa5, 0xa9, 0xe7, 0xa7, 0xa5, 0xa9, 0xdf, 0x4f, 0x4b, 0x53, 0x9f, 0xdd, - 0x74, 0xbd, 0xa0, 0xd1, 0xb6, 0x75, 0x87, 0x36, 0x23, 0x73, 0x1c, 0x26, 0xb6, 0xfd, 0xb8, 0xcf, - 0x7a, 0xd0, 0x6d, 0x61, 0x66, 0xcf, 0xf3, 0xff, 0xe0, 0x6f, 0xff, 0x1d, 0x00, 0x00, 0xff, 0xff, - 0xdc, 0x2b, 0x14, 0x99, 0xd0, 0x10, 0x00, 0x00, + // 1071 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x57, 0x4f, 0x6f, 0x1b, 0x45, + 0x14, 0xef, 0xc6, 0x49, 0x1a, 0xbf, 0x94, 0xaa, 0x1a, 0x4a, 0x31, 0x9b, 0xd6, 0x8d, 0x16, 0x04, + 0x69, 0x15, 0x76, 0x59, 0xd3, 0x52, 0x22, 0x0e, 0x55, 0x92, 0x92, 0x34, 0x14, 0x95, 0x66, 0x21, + 0x1c, 0x10, 0x92, 0xb5, 0xbb, 0x1e, 0xdb, 0xab, 0xc4, 0x33, 0xee, 0xce, 0xda, 0xad, 0x1b, 0xc2, + 0x81, 0x4f, 0x80, 0x04, 0x07, 0xc4, 0x15, 0x09, 0x24, 0x0e, 0xfd, 0x1c, 0x20, 0xf5, 0x50, 0x89, + 0x0b, 0x47, 0x94, 0xf0, 0x35, 0x90, 0xd0, 0xce, 0xcc, 0xae, 0x77, 0xbd, 0x5e, 0xfc, 0x87, 0x1c, + 0x38, 0x70, 0xf3, 0xcc, 0xbe, 0xf7, 0x7b, 0xbf, 0xf7, 0x67, 0xde, 0x7b, 0x86, 0xd7, 0x1c, 0xdb, + 0xe9, 0x1d, 0x50, 0x62, 0x3c, 0xa1, 0x04, 0xbb, 0x94, 0xb8, 0x1e, 0xf6, 0x1b, 0xd8, 0xe8, 0x9a, + 0xc6, 0xc3, 0x0e, 0xf6, 0x7b, 0x7a, 0xdb, 0xa7, 0x01, 0x45, 0x25, 0x29, 0xa5, 0xa7, 0xa4, 0xf4, + 0xae, 0xa9, 0x5e, 0x6e, 0x50, 0xda, 0x38, 0xc0, 0x86, 0xdd, 0xf6, 0x0c, 0x9b, 0x10, 0x1a, 0xd8, + 0x81, 0x47, 0x09, 0x13, 0x7a, 0xea, 0x75, 0x97, 0xb2, 0x16, 0x65, 0x86, 0x63, 0x33, 0x2c, 0x00, + 0x8d, 0xae, 0xe9, 0xe0, 0xc0, 0x36, 0x8d, 0xb6, 0xdd, 0xf0, 0x08, 0x17, 0x96, 0xb2, 0xab, 0x11, + 0x13, 0x27, 0x70, 0xdd, 0x26, 0x76, 0xf7, 0xdb, 0xd4, 0x23, 0x41, 0xc8, 0x24, 0x75, 0x21, 0xa5, + 0xaf, 0x45, 0xd2, 0xfd, 0x2f, 0x1e, 0x69, 0x84, 0xd2, 0x19, 0x51, 0x2d, 0x12, 0xc5, 0x6d, 0xea, + 0x36, 0xa5, 0x54, 0xf4, 0x7b, 0xd0, 0x78, 0x26, 0x0c, 0x69, 0x8f, 0xb9, 0xb4, 0xb6, 0x0d, 0x68, + 0x37, 0x74, 0xe6, 0x2e, 0xb6, 0x6b, 0xd8, 0xb7, 0xf0, 0xc3, 0x0e, 0x66, 0x01, 0x7a, 0x05, 0x16, + 0xdc, 0xa6, 0xed, 0x91, 0xaa, 0x57, 0x2b, 0x29, 0xcb, 0xca, 0x4a, 0xd1, 0x3a, 0xcb, 0xcf, 0x3b, + 0x35, 0x74, 0x09, 0xe6, 0x9b, 0xd8, 0x6b, 0x34, 0x83, 0xd2, 0xcc, 0xb2, 0xb2, 0x32, 0x6b, 0xc9, + 0x93, 0xf6, 0xbd, 0x02, 0x2f, 0xa6, 0x90, 0x58, 0x9b, 0x12, 0x86, 0xd1, 0xed, 0x50, 0x3e, 0xbc, + 0xe1, 0x40, 0x8b, 0x95, 0x37, 0xf4, 0xbc, 0x04, 0xe8, 0x3b, 0xa4, 0x86, 0x1f, 0xe3, 0x9a, 0x04, + 0x90, 0x6a, 0x68, 0x03, 0xce, 0xd5, 0xa9, 0xbf, 0x5f, 0x15, 0x47, 0xc6, 0xcd, 0x2e, 0x56, 0xae, + 0xe6, 0xc3, 0x6c, 0x51, 0x7f, 0x9f, 0x59, 0x8b, 0xa1, 0x92, 0x80, 0x62, 0x5a, 0x15, 0x5e, 0xe2, + 0xdc, 0x36, 0x43, 0x27, 0x3e, 0xf4, 0x58, 0x10, 0x39, 0xba, 0x05, 0xd0, 0xcf, 0x9e, 0x64, 0xf8, + 0xba, 0x2e, 0x52, 0xad, 0x87, 0xa9, 0xd6, 0x45, 0xed, 0xc8, 0x54, 0xeb, 0x0f, 0xec, 0x06, 0x96, + 0xba, 0x56, 0x42, 0x53, 0xfb, 0x12, 0x2e, 0x0d, 0x1a, 0x90, 0xfe, 0x2f, 0x41, 0x31, 0x0a, 0x25, + 0x2b, 0x29, 0xcb, 0x85, 0x95, 0xa2, 0xb5, 0x20, 0x63, 0xc9, 0xd0, 0x76, 0xca, 0xfc, 0x8c, 0x0c, + 0xd0, 0x28, 0xf3, 0x02, 0x39, 0x65, 0xbf, 0x92, 0x74, 0x70, 0x87, 0xd4, 0xe9, 0xe8, 0x4c, 0x6a, + 0x9f, 0x27, 0x39, 0x0b, 0x1d, 0xc9, 0x79, 0x03, 0x40, 0x2a, 0x91, 0x3a, 0x95, 0x51, 0x79, 0x35, + 0x3f, 0xe0, 0x7d, 0x00, 0xe1, 0x6a, 0xf8, 0x53, 0xfb, 0x04, 0x54, 0x8e, 0xfe, 0x7e, 0x58, 0x9d, + 0x19, 0x5a, 0x4b, 0x50, 0xe4, 0x65, 0x5b, 0x25, 0x9d, 0x16, 0x37, 0x30, 0x6b, 0x2d, 0xf0, 0x8b, + 0xfb, 0x9d, 0x56, 0x8a, 0xf3, 0x4c, 0x9a, 0xb3, 0x0d, 0x4b, 0x43, 0x51, 0x4f, 0x91, 0xf8, 0x17, + 0xf0, 0x32, 0x37, 0x11, 0x66, 0x51, 0xd6, 0xcf, 0x18, 0xcf, 0x62, 0x6b, 0x48, 0x26, 0xa7, 0x29, + 0xa4, 0x1f, 0x15, 0x28, 0x65, 0xcd, 0x4b, 0xf7, 0xd6, 0xe1, 0x6c, 0xf4, 0x0a, 0xc2, 0x4a, 0x9a, + 0xe0, 0x31, 0x45, 0x7a, 0xa7, 0x57, 0x71, 0x9f, 0xc2, 0xe5, 0x98, 0x27, 0xcf, 0xc6, 0x40, 0xac, + 0xa6, 0xcd, 0xb0, 0x03, 0x57, 0x72, 0x70, 0x4f, 0x2d, 0x08, 0xda, 0x2e, 0x94, 0xb9, 0x8d, 0x2d, + 0x8f, 0xd8, 0x07, 0xde, 0x13, 0x5c, 0x9b, 0xe0, 0xd9, 0xa0, 0x8b, 0x30, 0xd7, 0xf6, 0x69, 0x17, + 0x73, 0xe2, 0x0b, 0x96, 0x38, 0x68, 0x3f, 0x14, 0xe0, 0x6a, 0x2e, 0xa6, 0x64, 0xbe, 0x07, 0x17, + 0xeb, 0xd1, 0xd7, 0xea, 0x74, 0x75, 0x8a, 0xea, 0x19, 0x78, 0xb4, 0x06, 0x20, 0x22, 0xcd, 0xc1, + 0x44, 0x4a, 0xd5, 0x18, 0x2c, 0x9e, 0x0e, 0x5d, 0x53, 0xe7, 0xf1, 0xb4, 0x44, 0x5e, 0xb8, 0xea, + 0x7d, 0x38, 0xef, 0xdb, 0x8f, 0xaa, 0xfd, 0x39, 0x53, 0x2a, 0x0c, 0x34, 0xe9, 0xd4, 0x4c, 0x0a, + 0x31, 0x2c, 0xfb, 0xd1, 0x66, 0x7c, 0x67, 0xbd, 0xe0, 0x27, 0x8f, 0x68, 0x0f, 0x90, 0x13, 0xb8, + 0x55, 0xd6, 0x71, 0x5a, 0x1e, 0x63, 0x1e, 0x25, 0xd5, 0x7d, 0xdc, 0x2b, 0xcd, 0x0e, 0x60, 0xa6, + 0x87, 0x60, 0xd7, 0xd4, 0x3f, 0x8e, 0xe5, 0xef, 0xe1, 0x9e, 0x75, 0xc1, 0x09, 0xdc, 0xd4, 0x0d, + 0xda, 0xe6, 0x21, 0xa7, 0xf5, 0xd2, 0x1c, 0x47, 0x32, 0xf3, 0x23, 0xf5, 0x20, 0x14, 0x1b, 0x92, + 0x02, 0xa1, 0xaf, 0x05, 0x70, 0x2d, 0x27, 0x49, 0x7b, 0x24, 0xf0, 0x0e, 0xee, 0xf2, 0x51, 0x36, + 0xfd, 0x10, 0xec, 0xd7, 0x46, 0x21, 0x59, 0x1b, 0x4f, 0x0b, 0x70, 0x7d, 0x1c, 0xb3, 0xff, 0x97, + 0xc9, 0x7f, 0xa3, 0x4c, 0x2a, 0xdf, 0x9e, 0x83, 0x39, 0x9e, 0x30, 0xf4, 0x54, 0x81, 0x79, 0xd1, + 0x3d, 0xd0, 0x6a, 0x3e, 0x5c, 0x76, 0x83, 0x52, 0xdf, 0x1c, 0x53, 0x5a, 0xe4, 0x5c, 0xdb, 0xfe, + 0xea, 0xb7, 0x3f, 0xbf, 0x99, 0x59, 0x47, 0xb7, 0x8d, 0xdc, 0xed, 0xad, 0x5f, 0x09, 0xc6, 0x61, + 0x54, 0x97, 0x47, 0x86, 0x68, 0x69, 0xc6, 0xa1, 0x28, 0xc0, 0x23, 0xf4, 0x9d, 0x02, 0xc5, 0x78, + 0x09, 0x41, 0xc6, 0x08, 0x16, 0x83, 0xfb, 0x90, 0xfa, 0xd6, 0xf8, 0x0a, 0x92, 0xf9, 0x0a, 0x67, + 0xae, 0xa1, 0xe5, 0x11, 0xcc, 0x19, 0xfa, 0x29, 0xa2, 0xc6, 0x6b, 0x6a, 0x2c, 0x6a, 0x89, 0x96, + 0x3c, 0x1e, 0xb5, 0x64, 0xbf, 0xd5, 0x6e, 0x71, 0x6a, 0x26, 0x32, 0x26, 0x0c, 0x2a, 0xfa, 0x55, + 0x81, 0xf3, 0xe9, 0x0d, 0x03, 0xdd, 0x18, 0x61, 0x7d, 0xe8, 0x9a, 0xa3, 0xde, 0x9c, 0x50, 0x4b, + 0x12, 0xff, 0x80, 0x13, 0xbf, 0x83, 0x36, 0x26, 0xad, 0x06, 0xfe, 0x64, 0x99, 0x71, 0x18, 0x4f, + 0xde, 0x23, 0xf4, 0xb3, 0x02, 0x8b, 0x89, 0x5d, 0x02, 0x99, 0x23, 0x28, 0x65, 0xd7, 0x1e, 0xb5, + 0x32, 0x89, 0x8a, 0x74, 0xe1, 0x06, 0x77, 0x41, 0x47, 0xab, 0xf9, 0x2e, 0xc8, 0x69, 0x9c, 0x0c, + 0xfc, 0x33, 0x05, 0x2e, 0x0c, 0x0e, 0x7e, 0xf4, 0xce, 0x18, 0xe6, 0x87, 0x6c, 0x20, 0xea, 0xad, + 0x89, 0xf5, 0xc6, 0x7f, 0x8c, 0x59, 0xee, 0xc3, 0x62, 0xff, 0x4c, 0x01, 0x94, 0xed, 0x32, 0xe8, + 0xdd, 0x11, 0xc4, 0x72, 0xd7, 0x12, 0x75, 0x6d, 0x0a, 0x4d, 0xe9, 0xd4, 0x3a, 0x77, 0xea, 0x3d, + 0xb4, 0x96, 0xef, 0xd4, 0xb0, 0xa9, 0x93, 0xcc, 0xce, 0x5f, 0x0a, 0x5c, 0xf9, 0xc7, 0x11, 0x86, + 0x36, 0x27, 0xe6, 0x97, 0x9d, 0xbb, 0xea, 0x9d, 0x7f, 0x07, 0x22, 0xfd, 0xdd, 0xe5, 0xfe, 0xde, + 0x43, 0x3b, 0x53, 0xfb, 0x6b, 0x88, 0x9e, 0x1a, 0xf7, 0xd6, 0x8d, 0x8f, 0x7e, 0x39, 0x2e, 0x2b, + 0xcf, 0x8f, 0xcb, 0xca, 0x1f, 0xc7, 0x65, 0xe5, 0xeb, 0x93, 0xf2, 0x99, 0xe7, 0x27, 0xe5, 0x33, + 0xbf, 0x9f, 0x94, 0xcf, 0x7c, 0x76, 0xb3, 0xe1, 0x05, 0xcd, 0x8e, 0xa3, 0xbb, 0xb4, 0x15, 0x99, + 0xe3, 0x30, 0xb1, 0xed, 0xc7, 0x03, 0xd6, 0x83, 0x5e, 0x1b, 0x33, 0x67, 0x9e, 0xff, 0x07, 0x7f, + 0xfb, 0xef, 0x00, 0x00, 0x00, 0xff, 0xff, 0x9a, 0x83, 0xf5, 0xfe, 0xba, 0x10, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. From d3e58e39d2fdffab39ab9602c6ff6be9240ee38e Mon Sep 17 00:00:00 2001 From: KonradStaniec Date: Mon, 17 Apr 2023 11:04:51 +0200 Subject: [PATCH 33/59] Use block gas limit when defining genesis (#349) --- app/app.go | 6 ++++ cmd/babylond/cmd/flags.go | 9 ++++- cmd/babylond/cmd/genesis.go | 47 +++++++++++++++++++-------- cmd/babylond/cmd/testnet.go | 30 +++++++++-------- go.mod | 2 +- test/e2e/initialization/node.go | 2 ++ x/btclightclient/keeper/state_test.go | 2 -- 7 files changed, 66 insertions(+), 32 deletions(-) diff --git a/app/app.go b/app/app.go index 4e3b9ee20..08a7e3943 100644 --- a/app/app.go +++ b/app/app.go @@ -151,6 +151,12 @@ const ( // if we want to allow any custom callbacks // See https://github.com/CosmWasm/cosmwasm/blob/main/docs/CAPABILITIES-BUILT-IN.md wasmCapabilities = "iterator,staking,stargate,cosmwasm_1_1,cosmwasm_1_2,babylon" + + // According to https://github.com/CosmWasm/wasmd#genesis-configuration chains + // using smart contracts should configure proper gas limits per block. + // https://medium.com/cosmwasm/cosmwasm-for-ctos-iv-native-integrations-713140bf75fc + // suggests 50M as reasonable limits. Me may want to adjust it later. + DefaultGasLimit int64 = 50000000 ) var ( diff --git a/cmd/babylond/cmd/flags.go b/cmd/babylond/cmd/flags.go index f7166bee2..f9f309524 100644 --- a/cmd/babylond/cmd/flags.go +++ b/cmd/babylond/cmd/flags.go @@ -1,10 +1,12 @@ package cmd import ( + "time" + + babylonApp "github.com/babylonchain/babylon/app" tmrand "github.com/cometbft/cometbft/libs/rand" "github.com/cosmos/cosmos-sdk/client/flags" "github.com/spf13/cobra" - "time" ) const ( @@ -20,6 +22,7 @@ const ( flagGoalBonded = "goal-bonded" flagBlocksPerYear = "blocks-per-year" flagGenesisTime = "genesis-time" + flagBlockGasLimit = "block-gas-limit" ) type GenesisCLIArgs struct { @@ -36,6 +39,7 @@ type GenesisCLIArgs struct { GoalBonded float64 BlocksPerYear uint64 GenesisTime time.Time + BlockGasLimit int64 } func addGenesisFlags(cmd *cobra.Command) { @@ -57,6 +61,7 @@ func addGenesisFlags(cmd *cobra.Command) { cmd.Flags().Float64(flagGoalBonded, 0.67, "Bonded tokens goal") cmd.Flags().Uint64(flagBlocksPerYear, 6311520, "Blocks per year") cmd.Flags().Int64(flagGenesisTime, time.Now().Unix(), "Genesis time") + cmd.Flags().Int64(flagBlockGasLimit, babylonApp.DefaultGasLimit, "Block gas limit") } func parseGenesisFlags(cmd *cobra.Command) *GenesisCLIArgs { @@ -73,6 +78,7 @@ func parseGenesisFlags(cmd *cobra.Command) *GenesisCLIArgs { inflationMin, _ := cmd.Flags().GetFloat64(flagInflationMin) goalBonded, _ := cmd.Flags().GetFloat64(flagGoalBonded) blocksPerYear, _ := cmd.Flags().GetUint64(flagBlocksPerYear) + blockGasLimit, _ := cmd.Flags().GetInt64(flagBlockGasLimit) if chainID == "" { chainID = "chain-" + tmrand.NewRand().Str(6) @@ -94,5 +100,6 @@ func parseGenesisFlags(cmd *cobra.Command) *GenesisCLIArgs { InflationMin: inflationMin, GoalBonded: goalBonded, BlocksPerYear: blocksPerYear, + BlockGasLimit: blockGasLimit, } } diff --git a/cmd/babylond/cmd/genesis.go b/cmd/babylond/cmd/genesis.go index 5cc3b8045..2af9d551d 100644 --- a/cmd/babylond/cmd/genesis.go +++ b/cmd/babylond/cmd/genesis.go @@ -11,7 +11,7 @@ import ( btclightclienttypes "github.com/babylonchain/babylon/x/btclightclient/types" checkpointingtypes "github.com/babylonchain/babylon/x/checkpointing/types" epochingtypes "github.com/babylonchain/babylon/x/epoching/types" - "github.com/cometbft/cometbft/types" + comettypes "github.com/cometbft/cometbft/types" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" cdctypes "github.com/cosmos/cosmos-sdk/codec/types" @@ -51,6 +51,7 @@ Example: genesisCliArgs := parseGenesisFlags(cmd) genFile := config.GenesisFile() + appState, genDoc, err := genutiltypes.GenesisStateFromGenFile(genFile) if err != nil { return fmt.Errorf("failed to unmarshal genesis state: %s", err) @@ -66,7 +67,7 @@ Example: genesisCliArgs.EpochInterval, genesisCliArgs.BaseBtcHeaderHex, genesisCliArgs.BaseBtcHeaderHeight, genesisCliArgs.InflationRateChange, genesisCliArgs.InflationMin, genesisCliArgs.InflationMax, genesisCliArgs.GoalBonded, - genesisCliArgs.BlocksPerYear, genesisCliArgs.GenesisTime) + genesisCliArgs.BlocksPerYear, genesisCliArgs.GenesisTime, genesisCliArgs.BlockGasLimit) } else if network == "mainnet" { // TODO: mainnet genesis params panic("Mainnet params not implemented.") @@ -74,7 +75,7 @@ Example: return fmt.Errorf("please choose testnet or mainnet") } - appState, genDoc, err = PrepareGenesis(clientCtx, appState, genDoc, genesisParams, chainID) + err = PrepareGenesis(clientCtx, appState, genDoc, genesisParams, chainID) if err != nil { return fmt.Errorf("failed to prepare genesis: %w", err) } @@ -83,11 +84,6 @@ Example: return fmt.Errorf("error validating genesis file: %s", err) } - appStateJSON, err := json.Marshal(appState) - if err != nil { - return fmt.Errorf("failed to marshal application genesis state: %w", err) - } - genDoc.AppState = appStateJSON return genutil.ExportGenesisFile(genDoc, genFile) }, } @@ -98,8 +94,16 @@ Example: return cmd } -func PrepareGenesis(clientCtx client.Context, appState map[string]json.RawMessage, - genDoc *types.GenesisDoc, genesisParams GenesisParams, chainID string) (map[string]json.RawMessage, *types.GenesisDoc, error) { +func PrepareGenesis( + clientCtx client.Context, + appState map[string]json.RawMessage, + genDoc *comettypes.GenesisDoc, + genesisParams GenesisParams, + chainID string, +) error { + if genDoc == nil { + return fmt.Errorf("provided genesis must not be nil") + } depCdc := clientCtx.Codec cdc := depCdc @@ -108,6 +112,13 @@ func PrepareGenesis(clientCtx client.Context, appState map[string]json.RawMessag genDoc.ChainID = chainID genDoc.GenesisTime = genesisParams.GenesisTime + if genDoc.ConsensusParams == nil { + genDoc.ConsensusParams = comettypes.DefaultConsensusParams() + } + + // Set gas limit + genDoc.ConsensusParams.Block.MaxGas = genesisParams.BlockGasLimit + // Set the confirmation and finalization parameters btccheckpointGenState := btccheckpointtypes.DefaultGenesis() btccheckpointGenState.Params = genesisParams.BtccheckpointParams @@ -167,8 +178,15 @@ func PrepareGenesis(clientCtx client.Context, appState map[string]json.RawMessag } appState[banktypes.ModuleName] = cdc.MustMarshalJSON(bankGenState) - // return appState - return appState, genDoc, nil + appGenStateJSON, err := json.MarshalIndent(appState, "", " ") + + if err != nil { + return err + } + + genDoc.AppState = appGenStateJSON + + return nil } type GenesisParams struct { @@ -189,13 +207,14 @@ type GenesisParams struct { BtccheckpointParams btccheckpointtypes.Params EpochingParams epochingtypes.Params BtclightclientBaseBtcHeader btclightclienttypes.BTCHeaderInfo + BlockGasLimit int64 } func TestnetGenesisParams(maxActiveValidators uint32, btcConfirmationDepth uint64, btcFinalizationTimeout uint64, epochInterval uint64, baseBtcHeaderHex string, baseBtcHeaderHeight uint64, inflationRateChange float64, inflationMin float64, inflationMax float64, goalBonded float64, - blocksPerYear uint64, genesisTime time.Time) GenesisParams { + blocksPerYear uint64, genesisTime time.Time, blockGasLimit int64) GenesisParams { genParams := GenesisParams{} @@ -266,6 +285,6 @@ func TestnetGenesisParams(maxActiveValidators uint32, btcConfirmationDepth uint6 } genParams.EpochingParams = epochingtypes.DefaultParams() genParams.EpochingParams.EpochInterval = epochInterval - + genParams.BlockGasLimit = blockGasLimit return genParams } diff --git a/cmd/babylond/cmd/testnet.go b/cmd/babylond/cmd/testnet.go index 9ccd20016..7674163bc 100644 --- a/cmd/babylond/cmd/testnet.go +++ b/cmd/babylond/cmd/testnet.go @@ -100,7 +100,7 @@ Example: genesisCliArgs.EpochInterval, genesisCliArgs.BaseBtcHeaderHex, genesisCliArgs.BaseBtcHeaderHeight, genesisCliArgs.InflationRateChange, genesisCliArgs.InflationMin, genesisCliArgs.InflationMax, genesisCliArgs.GoalBonded, - genesisCliArgs.BlocksPerYear, genesisCliArgs.GenesisTime) + genesisCliArgs.BlocksPerYear, genesisCliArgs.GenesisTime, genesisCliArgs.BlockGasLimit) return InitTestnet( clientCtx, cmd, config, mbm, genBalIterator, outputDir, genesisCliArgs.ChainID, minGasPrices, @@ -400,21 +400,16 @@ func initGenFiles( // set the bls keys for the checkpointing module genesisParams.CheckpointingGenKeys = genKeys - appGenState, _, err = PrepareGenesis(clientCtx, appGenState, &types.GenesisDoc{}, genesisParams, chainID) - if err != nil { - return err - } + genDoc := &types.GenesisDoc{} + + err = PrepareGenesis(clientCtx, appGenState, genDoc, genesisParams, chainID) - appGenStateJSON, err := json.MarshalIndent(appGenState, "", " ") if err != nil { return err } - - genDoc := types.GenesisDoc{ - ChainID: chainID, - AppState: appGenStateJSON, - Validators: nil, - } + // set initial validators to nil, they will be added by collectGenFiles based on + // genesis tranascations + genDoc.Validators = nil // generate empty genesis files for each validator and save for i := 0; i < numValidators; i++ { @@ -467,10 +462,17 @@ func collectGenFiles( appState = nodeAppState } + // overwrite each validator's genesis file to have a canonical genesis time genFile := nodeConfig.GenesisFile() - // overwrite each validator's genesis file to have a canonical genesis time - if err := genutil.ExportGenesisFileWithTime(genFile, chainID, nil, appState, genTime); err != nil { + newGendoc := types.GenesisDoc{ + GenesisTime: genTime, + AppState: appState, + ConsensusParams: genDoc.ConsensusParams, + ChainID: genDoc.ChainID, + } + + if err := genutil.ExportGenesisFile(&newGendoc, genFile); err != nil { return err } } diff --git a/go.mod b/go.mod index e4d184ca3..4866d705c 100644 --- a/go.mod +++ b/go.mod @@ -28,6 +28,7 @@ require ( cosmossdk.io/errors v1.0.0-beta.7 cosmossdk.io/math v1.0.0-rc.0 cosmossdk.io/tools/rosetta v0.2.1 + github.com/CosmWasm/wasmvm v1.2.1 github.com/boljen/go-bitmap v0.0.0-20151001105940-23cd2fb0ce7d github.com/btcsuite/btcd/btcutil v1.1.2 github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 @@ -128,7 +129,6 @@ require ( cosmossdk.io/core v0.5.1 // indirect cosmossdk.io/depinject v1.0.0-alpha.3 // indirect github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect - github.com/CosmWasm/wasmvm v1.2.1 // indirect github.com/Microsoft/go-winio v0.6.0 // indirect github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 // indirect github.com/aws/aws-sdk-go v1.44.203 // indirect diff --git a/test/e2e/initialization/node.go b/test/e2e/initialization/node.go index 3cb6ebf79..9a670d350 100644 --- a/test/e2e/initialization/node.go +++ b/test/e2e/initialization/node.go @@ -308,6 +308,8 @@ func (n *internalNode) init() error { genDoc.ChainID = n.chain.chainMeta.Id genDoc.Validators = nil genDoc.AppState = appState + genDoc.ConsensusParams = tmtypes.DefaultConsensusParams() + genDoc.ConsensusParams.Block.MaxGas = babylonApp.DefaultGasLimit if err = genutil.ExportGenesisFile(genDoc, config.GenesisFile()); err != nil { return fmt.Errorf("failed to export app genesis state: %w", err) diff --git a/x/btclightclient/keeper/state_test.go b/x/btclightclient/keeper/state_test.go index 37f77e9b7..5cedc2889 100644 --- a/x/btclightclient/keeper/state_test.go +++ b/x/btclightclient/keeper/state_test.go @@ -1,7 +1,6 @@ package keeper_test import ( - "fmt" "math/rand" "testing" @@ -478,7 +477,6 @@ func FuzzHeadersStateGetHighestCommonAncestor(f *testing.F) { t.Fatalf("No common ancestor found between the nodes %s and %s. Expected ancestor: %s", descendant1.Hash, descendant2.Hash, commonAncestor.Hash) } if !commonAncestor.Eq(retrievedHighestCommonAncestor) { - fmt.Println("Failed") t.Errorf("Did not retrieve the correct highest common ancestor. Got %s, expected %s", retrievedHighestCommonAncestor.Hash, commonAncestor.Hash) } }) From 0c089ad79acae0299136e52ac661225d8e0b7833 Mon Sep 17 00:00:00 2001 From: KonradStaniec Date: Mon, 17 Apr 2023 13:42:21 +0200 Subject: [PATCH 34/59] Add support for querying for latest finalized epoch (#350) * Add support for querying for latest finalized epoch --- app/app.go | 2 +- wasmbinding/bindings/query.go | 7 ++- wasmbinding/test/custom_query_test.go | 48 ++++++++++++++++-- wasmbinding/testdata/Cargo.lock | 4 +- wasmbinding/testdata/artifacts/checksums.txt | 4 +- .../artifacts/checksums_intermediate.txt | 2 +- .../testdata/artifacts/testdata-aarch64.wasm | Bin 159438 -> 160538 bytes wasmbinding/testdata/artifacts/testdata.wasm | Bin 159560 -> 160637 bytes wasmbinding/wasm.go | 29 +++++++++-- 9 files changed, 83 insertions(+), 13 deletions(-) diff --git a/app/app.go b/app/app.go index 08a7e3943..687845d4a 100644 --- a/app/app.go +++ b/app/app.go @@ -628,7 +628,7 @@ func NewBabylonApp( panic(fmt.Sprintf("error while reading wasm config: %s", err)) } - wasmOpts = append(owasm.RegisterCustomPlugins(&app.EpochingKeeper), wasmOpts...) + wasmOpts = append(owasm.RegisterCustomPlugins(&app.EpochingKeeper, &app.ZoneConciergeKeeper), wasmOpts...) app.WasmKeeper = wasm.NewKeeper( appCodec, diff --git a/wasmbinding/bindings/query.go b/wasmbinding/bindings/query.go index d17459bf6..cdb970d08 100644 --- a/wasmbinding/bindings/query.go +++ b/wasmbinding/bindings/query.go @@ -1,9 +1,14 @@ package bindings type BabylonQuery struct { - Epoch *struct{} `json:"epoch,omitempty"` + Epoch *struct{} `json:"epoch,omitempty"` + LatestFinalizedEpoch *struct{} `json:"latest_finalized_epoch,omitempty"` } type CurrentEpochResponse struct { Epoch uint64 `json:"epoch"` } + +type LatestFinalizedEpochResponse struct { + Epoch uint64 `json:"epoch"` +} diff --git a/wasmbinding/test/custom_query_test.go b/wasmbinding/test/custom_query_test.go index 28343d472..b5f4472fa 100644 --- a/wasmbinding/test/custom_query_test.go +++ b/wasmbinding/test/custom_query_test.go @@ -9,12 +9,11 @@ import ( "github.com/CosmWasm/wasmd/x/wasm/keeper" wasmvmtypes "github.com/CosmWasm/wasmvm/types" + "github.com/babylonchain/babylon/app" + "github.com/babylonchain/babylon/wasmbinding/bindings" "github.com/cometbft/cometbft/crypto" "github.com/cometbft/cometbft/crypto/ed25519" tmproto "github.com/cometbft/cometbft/proto/tendermint/types" - - "github.com/babylonchain/babylon/app" - "github.com/babylonchain/babylon/wasmbinding/bindings" sdk "github.com/cosmos/cosmos-sdk/types" bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" minttypes "github.com/cosmos/cosmos-sdk/x/mint/types" @@ -56,6 +55,27 @@ func TestQueryEpoch(t *testing.T) { require.Equal(t, resp.Epoch, newEpoch.EpochNumber) } +func TestFinalizedEpoch(t *testing.T) { + acc := randomAccountAddress() + babylonApp, ctx := setupAppWithContext(t) + fundAccount(t, ctx, babylonApp, acc) + + // babylonApp.ZoneConciergeKeeper + contractAddress := deployTestContract(t, ctx, babylonApp, acc, pathToContract) + + query := bindings.BabylonQuery{ + LatestFinalizedEpoch: &struct{}{}, + } + + // There is no finalized epoch yet so we require an error + queryCustomErr(t, ctx, babylonApp, contractAddress, query) + + _ = babylonApp.ZoneConciergeKeeper.Hooks().AfterRawCheckpointFinalized(ctx, 5) + resp := bindings.CurrentEpochResponse{} + queryCustom(t, ctx, babylonApp, contractAddress, query, &resp) + require.Equal(t, resp.Epoch, uint64(5)) +} + func setupAppWithContext(t *testing.T) (*app.BabylonApp, sdk.Context) { babylonApp := app.Setup(t, false) ctx := babylonApp.BaseApp.NewContext(false, tmproto.Header{Height: 1, Time: time.Now().UTC()}) @@ -182,3 +202,25 @@ func queryCustom( err = json.Unmarshal(resp.Data, response) require.NoError(t, err) } + +func queryCustomErr( + t *testing.T, + ctx sdk.Context, + bbn *app.BabylonApp, + contract sdk.AccAddress, + request bindings.BabylonQuery, +) { + msgBz, err := json.Marshal(request) + require.NoError(t, err) + + query := ExampleQuery{ + Chain: &ChainRequest{ + Request: wasmvmtypes.QueryRequest{Custom: msgBz}, + }, + } + queryBz, err := json.Marshal(query) + require.NoError(t, err) + + _, err = bbn.WasmKeeper.QuerySmart(ctx, contract, queryBz) + require.Error(t, err) +} diff --git a/wasmbinding/testdata/Cargo.lock b/wasmbinding/testdata/Cargo.lock index 61a704e23..84e85d960 100644 --- a/wasmbinding/testdata/Cargo.lock +++ b/wasmbinding/testdata/Cargo.lock @@ -16,7 +16,7 @@ dependencies = [ [[package]] name = "babylon-bindings" version = "0.1.0" -source = "git+https://github.com/babylonchain/bindings?branch=main#d027f75d7d9b5a3e908c613e15b9c9a083bc9a8d" +source = "git+https://github.com/babylonchain/bindings?branch=main#9ab0e442ded6956b86ceb2dd249256590bf1d6e2" dependencies = [ "cosmwasm-schema", "cosmwasm-std", @@ -27,7 +27,7 @@ dependencies = [ [[package]] name = "babylon-example" version = "0.1.0" -source = "git+https://github.com/babylonchain/bindings?branch=main#d027f75d7d9b5a3e908c613e15b9c9a083bc9a8d" +source = "git+https://github.com/babylonchain/bindings?branch=main#9ab0e442ded6956b86ceb2dd249256590bf1d6e2" dependencies = [ "babylon-bindings", "cosmwasm-schema", diff --git a/wasmbinding/testdata/artifacts/checksums.txt b/wasmbinding/testdata/artifacts/checksums.txt index e11f281b0..1603d26c5 100644 --- a/wasmbinding/testdata/artifacts/checksums.txt +++ b/wasmbinding/testdata/artifacts/checksums.txt @@ -1,2 +1,2 @@ -9935d0de9ffbd36688ff1b99bc48c931dfb4d7bb3e08b8bc143ceeecde7f0ecb testdata-aarch64.wasm -9fa6ca0b4b4f3aff6a7c2bb71c01ab6c3929df33e57916d742951f78fba4f079 testdata.wasm +67583334a4c32986fe1eac33094ec268c858d7329762b8cf5425044389991d13 testdata-aarch64.wasm +a7c0c359ae50b71ff78aacf97090ebbb3f25192b545cc0ccedde55a89ccc6d12 testdata.wasm diff --git a/wasmbinding/testdata/artifacts/checksums_intermediate.txt b/wasmbinding/testdata/artifacts/checksums_intermediate.txt index 1ad713b7b..d361a28c4 100644 --- a/wasmbinding/testdata/artifacts/checksums_intermediate.txt +++ b/wasmbinding/testdata/artifacts/checksums_intermediate.txt @@ -1 +1 @@ -8daf4b44e2d0239ae957d816b75330235e1f646472db3469bdbd951165a68a2c ./target/wasm32-unknown-unknown/release/testdata.wasm +33dc1a2754ac9156c2796ec5d73cf997f84535462efa07275921c9903b246f1d ./target/wasm32-unknown-unknown/release/testdata.wasm diff --git a/wasmbinding/testdata/artifacts/testdata-aarch64.wasm b/wasmbinding/testdata/artifacts/testdata-aarch64.wasm index cbc28804c007a68ba05c4370a70f53fc2d4aaf19..36e6eb4fcf28febf2f0f5d218ab2c9bb3e3d1499 100644 GIT binary patch delta 59454 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 delta 57427 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 diff --git a/wasmbinding/testdata/artifacts/testdata.wasm b/wasmbinding/testdata/artifacts/testdata.wasm index 2a3c2a61a56ef5bddeb19aa10a963090206e025b..0d4e8b5b4f925398d77d55e3700f7c73a4fac168 100644 GIT binary patch delta 28758 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 F{{X1fIxheK delta 26361 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 Hz36`fXeCd> diff --git a/wasmbinding/wasm.go b/wasmbinding/wasm.go index 7a3d9d2e1..c58be518c 100644 --- a/wasmbinding/wasm.go +++ b/wasmbinding/wasm.go @@ -9,17 +9,23 @@ import ( wasmvmtypes "github.com/CosmWasm/wasmvm/types" "github.com/babylonchain/babylon/wasmbinding/bindings" epochingkeeper "github.com/babylonchain/babylon/x/epoching/keeper" + zckeeper "github.com/babylonchain/babylon/x/zoneconcierge/keeper" sdk "github.com/cosmos/cosmos-sdk/types" ) type QueryPlugin struct { epochingKeeper *epochingkeeper.Keeper + zcKeeper *zckeeper.Keeper } // NewQueryPlugin returns a reference to a new QueryPlugin. -func NewQueryPlugin(ek *epochingkeeper.Keeper) *QueryPlugin { +func NewQueryPlugin( + ek *epochingkeeper.Keeper, + zcKeeper *zckeeper.Keeper, +) *QueryPlugin { return &QueryPlugin{ epochingKeeper: ek, + zcKeeper: zcKeeper, } } @@ -38,7 +44,23 @@ func CustomQuerier(qp *QueryPlugin) func(ctx sdk.Context, request json.RawMessag Epoch: epoch.EpochNumber, } - ctx.Logger().Debug("Marshalled custom response") + bz, err := json.Marshal(res) + if err != nil { + return nil, errorsmod.Wrap(err, "failed marshaling") + } + + return bz, nil + + case contractQuery.LatestFinalizedEpoch != nil: + epoch, err := qp.zcKeeper.GetFinalizedEpoch(ctx) + + if err != nil { + return nil, err + } + + res := bindings.LatestFinalizedEpochResponse{ + Epoch: epoch, + } bz, err := json.Marshal(res) if err != nil { @@ -55,8 +77,9 @@ func CustomQuerier(qp *QueryPlugin) func(ctx sdk.Context, request json.RawMessag func RegisterCustomPlugins( ek *epochingkeeper.Keeper, + zcKeeper *zckeeper.Keeper, ) []wasmkeeper.Option { - wasmQueryPlugin := NewQueryPlugin(ek) + wasmQueryPlugin := NewQueryPlugin(ek, zcKeeper) queryPluginOpt := wasmkeeper.WithQueryPlugins(&wasmkeeper.QueryPlugins{ Custom: CustomQuerier(wasmQueryPlugin), From d0731c7af65f2efebb4c241088121160a837b0f3 Mon Sep 17 00:00:00 2001 From: Runchao Han Date: Wed, 19 Apr 2023 15:37:13 +1000 Subject: [PATCH 35/59] fix: fixing the bug in generating proof of sealed epoch (#351) --- x/zoneconcierge/keeper/proof_epoch_sealed.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x/zoneconcierge/keeper/proof_epoch_sealed.go b/x/zoneconcierge/keeper/proof_epoch_sealed.go index b6126f719..a0d32e1a8 100644 --- a/x/zoneconcierge/keeper/proof_epoch_sealed.go +++ b/x/zoneconcierge/keeper/proof_epoch_sealed.go @@ -36,7 +36,7 @@ func getValSetKey(epochNumber uint64) []byte { func (k Keeper) ProveValSet(epoch *epochingtypes.Epoch) (*tmcrypto.ProofOps, error) { valSetKey := getValSetKey(epoch.EpochNumber) - _, _, proof, err := k.QueryStore(epochingtypes.StoreKey, valSetKey, epoch.SealerHeader.Height) + _, _, proof, err := k.QueryStore(checkpointingtypes.StoreKey, valSetKey, epoch.SealerHeader.Height) if err != nil { return nil, err } From 754c3baf60d2ba111bf4aca13c04f99cc0e6aa79 Mon Sep 17 00:00:00 2001 From: Runchao Han Date: Thu, 20 Apr 2023 16:26:00 +1000 Subject: [PATCH 36/59] fix: fix query height in `ProveEpochSealed` (#352) --- x/zoneconcierge/keeper/query_kvstore.go | 2 +- x/zoneconcierge/keeper/query_kvstore_test.go | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/x/zoneconcierge/keeper/query_kvstore.go b/x/zoneconcierge/keeper/query_kvstore.go index cf83a1075..bdebccee1 100644 --- a/x/zoneconcierge/keeper/query_kvstore.go +++ b/x/zoneconcierge/keeper/query_kvstore.go @@ -28,7 +28,7 @@ func (k Keeper) QueryStore(moduleStoreKey string, key []byte, queryHeight int64) resp := k.storeQuerier.Query(abci.RequestQuery{ Path: path, Data: key, - Height: queryHeight, + Height: queryHeight - 1, // NOTE: the inclusion proof corresponds to the NEXT header Prove: true, }) if resp.Code != 0 { diff --git a/x/zoneconcierge/keeper/query_kvstore_test.go b/x/zoneconcierge/keeper/query_kvstore_test.go index 06f619831..c4fa20087 100644 --- a/x/zoneconcierge/keeper/query_kvstore_test.go +++ b/x/zoneconcierge/keeper/query_kvstore_test.go @@ -25,10 +25,11 @@ func FuzzQueryStore(f *testing.F) { ctx := babylonChain.GetContext() - // NOTE: the queryHeight has to be the previous block because - // NextBlock() only invokes BeginBlock(), but not EndBlock(), for the new block epochQueryKey := append(epochingtypes.EpochInfoKey, sdk.Uint64ToBigEndian(1)...) - key, value, proof, err := zcKeeper.QueryStore(epochingtypes.StoreKey, epochQueryKey, ctx.BlockHeight()-1) + // NOTE: QueryStore will use ctx.BlockHeight() - 1 as the height for ABCI query + // This is because the ABCI query will return the inclusion proof corresponding + // to the NEXT block rather than the given block. + key, value, proof, err := zcKeeper.QueryStore(epochingtypes.StoreKey, epochQueryKey, ctx.BlockHeight()) require.NoError(t, err) require.NotNil(t, proof) From c1ac556e25fa4fa99d07e8e5f8c358be87295c64 Mon Sep 17 00:00:00 2001 From: Vitalis Salis Date: Thu, 20 Apr 2023 09:34:50 +0300 Subject: [PATCH 37/59] chore: Use more descriptive error message for using wrapped transactions (#355) --- x/epoching/types/errors.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/x/epoching/types/errors.go b/x/epoching/types/errors.go index ab254e392..bd1028ef3 100644 --- a/x/epoching/types/errors.go +++ b/x/epoching/types/errors.go @@ -6,12 +6,13 @@ import ( errorsmod "cosmossdk.io/errors" ) -// x/epoching module sentinel errors var ( - ErrUnwrappedMsgType = errorsmod.Register(ModuleName, 1, "invalid message type in {MsgCreateValidator, MsgDelegate, MsgUndelegate, MsgBeginRedelegate} messages. use wrapped versions instead") + ErrUnwrappedMsgType = errorsmod.Register(ModuleName, 1, ` + invalid message type in {MsgCreateValidator, MsgDelegate, MsgUndelegate, MsgBeginRedelegate} + messages. For creating a validator use the wrapped version under 'tx checkpointing create-validator' + and for the other messages use the wrapped versions under 'tx epoching {delegate,undelegate,redelegate}'`) ErrInvalidQueuedMessageType = errorsmod.Register(ModuleName, 2, "invalid message type of a QueuedMessage") ErrUnknownEpochNumber = errorsmod.Register(ModuleName, 3, "the epoch number is not known in DB") - ErrUnknownQueueLen = errorsmod.Register(ModuleName, 4, "the msg queue length is not known in DB") ErrUnknownSlashedVotingPower = errorsmod.Register(ModuleName, 5, "the slashed voting power is not known in DB. Maybe the epoch has been checkpointed?") ErrUnknownValidator = errorsmod.Register(ModuleName, 6, "the validator is not known in the validator set.") ErrUnknownTotalVotingPower = errorsmod.Register(ModuleName, 7, "the total voting power is not known in DB.") From 25963095cedf79e72b6c00f52712f04f08142154 Mon Sep 17 00:00:00 2001 From: Vitalis Salis Date: Thu, 20 Apr 2023 10:30:35 +0300 Subject: [PATCH 38/59] chore: Enable building docker image with unpushed changes (#354) --- contrib/images/babylond/Dockerfile | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/contrib/images/babylond/Dockerfile b/contrib/images/babylond/Dockerfile index e7991d04f..d48402bfd 100644 --- a/contrib/images/babylond/Dockerfile +++ b/contrib/images/babylond/Dockerfile @@ -18,11 +18,13 @@ RUN apk add --update --no-cache make git bash gcc linux-headers eudev-dev ncurse RUN apk add --no-cache musl-dev # Build -WORKDIR /go/src/github.com/babylonchain -RUN git clone https://github.com/babylonchain/babylon.git WORKDIR /go/src/github.com/babylonchain/babylon -RUN git fetch -RUN git checkout ${VERSION} +# First cache dependencies +COPY go.mod go.sum /go/src/github.com/babylonchain/babylon/ +RUN go mod download +# Then copy everything else +COPY ./ /go/src/github.com/babylonchain/babylon/ +RUN git checkout -f ${VERSION} # Cosmwasm - Download correct libwasmvm version RUN WASMVM_VERSION=$(go list -m github.com/CosmWasm/wasmvm | cut -d ' ' -f 2) && \ From 51dd20603396d665970be82f7b359c61c9c988c1 Mon Sep 17 00:00:00 2001 From: KonradStaniec Date: Fri, 21 Apr 2023 12:03:31 +0200 Subject: [PATCH 39/59] Handle btc related wasm queries (#353) * Handle btc related wasm queries --- app/app.go | 2 +- wasmbinding/bindings/query.go | 42 ++++++- wasmbinding/bindings/utils.go | 27 +++++ wasmbinding/test/custom_query_test.go | 110 ++++++++++++++++++ wasmbinding/testdata/Cargo.lock | 16 +-- wasmbinding/testdata/artifacts/checksums.txt | 4 +- .../artifacts/checksums_intermediate.txt | 2 +- .../testdata/artifacts/testdata-aarch64.wasm | Bin 160538 -> 167071 bytes wasmbinding/testdata/artifacts/testdata.wasm | Bin 160637 -> 165873 bytes wasmbinding/wasm.go | 76 +++++++++++- x/btclightclient/keeper/keeper.go | 39 +++++++ x/btclightclient/keeper/state.go | 1 - 12 files changed, 302 insertions(+), 17 deletions(-) create mode 100644 wasmbinding/bindings/utils.go diff --git a/app/app.go b/app/app.go index 687845d4a..d337ea939 100644 --- a/app/app.go +++ b/app/app.go @@ -628,7 +628,7 @@ func NewBabylonApp( panic(fmt.Sprintf("error while reading wasm config: %s", err)) } - wasmOpts = append(owasm.RegisterCustomPlugins(&app.EpochingKeeper, &app.ZoneConciergeKeeper), wasmOpts...) + wasmOpts = append(owasm.RegisterCustomPlugins(&app.EpochingKeeper, &app.ZoneConciergeKeeper, &app.BTCLightClientKeeper), wasmOpts...) app.WasmKeeper = wasm.NewKeeper( appCodec, diff --git a/wasmbinding/bindings/query.go b/wasmbinding/bindings/query.go index cdb970d08..5d1051994 100644 --- a/wasmbinding/bindings/query.go +++ b/wasmbinding/bindings/query.go @@ -1,8 +1,20 @@ package bindings type BabylonQuery struct { - Epoch *struct{} `json:"epoch,omitempty"` - LatestFinalizedEpoch *struct{} `json:"latest_finalized_epoch,omitempty"` + Epoch *struct{} `json:"epoch,omitempty"` + LatestFinalizedEpoch *struct{} `json:"latest_finalized_epoch,omitempty"` + BtcTip *struct{} `json:"btc_tip,omitempty"` + BtcBaseHeader *struct{} `json:"btc_base_header,omitempty"` + BtcHeaderByHash *BtcHeaderByHash `json:"btc_header_by_hash,omitempty"` + BtcHeaderByHeight *BtcHeaderByHeight `json:"btc_header_by_height,omitempty"` +} + +type BtcHeaderByHash struct { + Hash string `json:"hash,omitempty"` +} + +type BtcHeaderByHeight struct { + Height uint64 `json:"height,omitempty"` } type CurrentEpochResponse struct { @@ -12,3 +24,29 @@ type CurrentEpochResponse struct { type LatestFinalizedEpochResponse struct { Epoch uint64 `json:"epoch"` } + +type BtcBlockHeader struct { + Version int32 `json:"version,omitempty"` + PrevBlockhash string `json:"prev_blockhash,omitempty"` + MerkleRoot string `json:"merkle_root,omitempty"` + Time uint32 `json:"time,omitempty"` + Bits uint32 `json:"bits,omitempty"` + Nonce uint32 `json:"nonce,omitempty"` +} + +type BtcBlockHeaderInfo struct { + Header *BtcBlockHeader `json:"header,omitempty"` + Height uint64 `json:"height,omitempty"` +} + +type BtcTipResponse struct { + HeaderInfo *BtcBlockHeaderInfo `json:"header_info,omitempty"` +} + +type BtcBaseHeaderResponse struct { + HeaderInfo *BtcBlockHeaderInfo `json:"header_info,omitempty"` +} + +type BtcHeaderQueryResponse struct { + HeaderInfo *BtcBlockHeaderInfo `json:"header_info,omitempty"` +} diff --git a/wasmbinding/bindings/utils.go b/wasmbinding/bindings/utils.go new file mode 100644 index 000000000..14f90d3f4 --- /dev/null +++ b/wasmbinding/bindings/utils.go @@ -0,0 +1,27 @@ +package bindings + +import ( + lcTypes "github.com/babylonchain/babylon/x/btclightclient/types" +) + +// translate BTCHeaderInfo to BtcBlockHeaderInfo +func AsBtcBlockHeaderInfo(info *lcTypes.BTCHeaderInfo) *BtcBlockHeaderInfo { + if info == nil { + return nil + } + + header := info.Header.ToBlockHeader() + return &BtcBlockHeaderInfo{ + Header: &BtcBlockHeader{ + Version: header.Version, + Time: uint32(header.Timestamp.Unix()), + Bits: header.Bits, + Nonce: header.Nonce, + // for compatibility with all btc infra we are returning the hex encoded bytes + // in reversed order + MerkleRoot: header.MerkleRoot.String(), + PrevBlockhash: header.PrevBlock.String(), + }, + Height: info.Height, + } +} diff --git a/wasmbinding/test/custom_query_test.go b/wasmbinding/test/custom_query_test.go index b5f4472fa..03748b85a 100644 --- a/wasmbinding/test/custom_query_test.go +++ b/wasmbinding/test/custom_query_test.go @@ -10,6 +10,7 @@ import ( "github.com/CosmWasm/wasmd/x/wasm/keeper" wasmvmtypes "github.com/CosmWasm/wasmvm/types" "github.com/babylonchain/babylon/app" + "github.com/babylonchain/babylon/testutil/datagen" "github.com/babylonchain/babylon/wasmbinding/bindings" "github.com/cometbft/cometbft/crypto" "github.com/cometbft/cometbft/crypto/ed25519" @@ -76,6 +77,115 @@ func TestFinalizedEpoch(t *testing.T) { require.Equal(t, resp.Epoch, uint64(5)) } +func TestQueryBtcTip(t *testing.T) { + acc := randomAccountAddress() + babylonApp, ctx := setupAppWithContext(t) + fundAccount(t, ctx, babylonApp, acc) + + contractAddress := deployTestContract(t, ctx, babylonApp, acc, pathToContract) + + query := bindings.BabylonQuery{ + BtcTip: &struct{}{}, + } + + resp := bindings.BtcTipResponse{} + queryCustom(t, ctx, babylonApp, contractAddress, query, &resp) + + tip := babylonApp.BTCLightClientKeeper.GetTipInfo(ctx) + tipAsInfo := bindings.AsBtcBlockHeaderInfo(tip) + + require.Equal(t, resp.HeaderInfo.Height, tip.Height) + require.Equal(t, tipAsInfo, resp.HeaderInfo) +} + +func TestQueryBtcBase(t *testing.T) { + acc := randomAccountAddress() + babylonApp, ctx := setupAppWithContext(t) + fundAccount(t, ctx, babylonApp, acc) + + contractAddress := deployTestContract(t, ctx, babylonApp, acc, pathToContract) + + query := bindings.BabylonQuery{ + BtcBaseHeader: &struct{}{}, + } + + resp := bindings.BtcBaseHeaderResponse{} + queryCustom(t, ctx, babylonApp, contractAddress, query, &resp) + + base := babylonApp.BTCLightClientKeeper.GetBaseBTCHeader(ctx) + baseAsInfo := bindings.AsBtcBlockHeaderInfo(base) + + require.Equal(t, baseAsInfo, resp.HeaderInfo) +} + +func TestQueryBtcByHash(t *testing.T) { + acc := randomAccountAddress() + babylonApp, ctx := setupAppWithContext(t) + fundAccount(t, ctx, babylonApp, acc) + + contractAddress := deployTestContract(t, ctx, babylonApp, acc, pathToContract) + tip := babylonApp.BTCLightClientKeeper.GetTipInfo(ctx) + + query := bindings.BabylonQuery{ + BtcHeaderByHash: &bindings.BtcHeaderByHash{ + Hash: tip.Hash.String(), + }, + } + + headerAsInfo := bindings.AsBtcBlockHeaderInfo(tip) + resp := bindings.BtcHeaderQueryResponse{} + queryCustom(t, ctx, babylonApp, contractAddress, query, &resp) + + require.Equal(t, resp.HeaderInfo, headerAsInfo) +} + +func TestQueryBtcByNumber(t *testing.T) { + acc := randomAccountAddress() + babylonApp, ctx := setupAppWithContext(t) + fundAccount(t, ctx, babylonApp, acc) + + contractAddress := deployTestContract(t, ctx, babylonApp, acc, pathToContract) + tip := babylonApp.BTCLightClientKeeper.GetTipInfo(ctx) + + query := bindings.BabylonQuery{ + BtcHeaderByHeight: &bindings.BtcHeaderByHeight{ + Height: tip.Height, + }, + } + + headerAsInfo := bindings.AsBtcBlockHeaderInfo(tip) + resp := bindings.BtcHeaderQueryResponse{} + queryCustom(t, ctx, babylonApp, contractAddress, query, &resp) + + require.Equal(t, resp.HeaderInfo, headerAsInfo) +} + +func TestQueryNonExistingHeader(t *testing.T) { + acc := randomAccountAddress() + babylonApp, ctx := setupAppWithContext(t) + fundAccount(t, ctx, babylonApp, acc) + + contractAddress := deployTestContract(t, ctx, babylonApp, acc, pathToContract) + + queryNonExisitingHeight := bindings.BabylonQuery{ + BtcHeaderByHeight: &bindings.BtcHeaderByHeight{ + Height: 1, + }, + } + resp := bindings.BtcHeaderQueryResponse{} + queryCustom(t, ctx, babylonApp, contractAddress, queryNonExisitingHeight, &resp) + require.Nil(t, resp.HeaderInfo) + + queryNonExisitingHash := bindings.BabylonQuery{ + BtcHeaderByHash: &bindings.BtcHeaderByHash{ + Hash: datagen.GenRandomBtcdHash().String(), + }, + } + resp1 := bindings.BtcHeaderQueryResponse{} + queryCustom(t, ctx, babylonApp, contractAddress, queryNonExisitingHash, &resp1) + require.Nil(t, resp1.HeaderInfo) +} + func setupAppWithContext(t *testing.T) (*app.BabylonApp, sdk.Context) { babylonApp := app.Setup(t, false) ctx := babylonApp.BaseApp.NewContext(false, tmproto.Header{Height: 1, Time: time.Now().UTC()}) diff --git a/wasmbinding/testdata/Cargo.lock b/wasmbinding/testdata/Cargo.lock index 84e85d960..1a5e7aee3 100644 --- a/wasmbinding/testdata/Cargo.lock +++ b/wasmbinding/testdata/Cargo.lock @@ -16,7 +16,7 @@ dependencies = [ [[package]] name = "babylon-bindings" version = "0.1.0" -source = "git+https://github.com/babylonchain/bindings?branch=main#9ab0e442ded6956b86ceb2dd249256590bf1d6e2" +source = "git+https://github.com/babylonchain/bindings?branch=main#c9a0b2e60203785f4ae21bca4ccde987e27e49e0" dependencies = [ "cosmwasm-schema", "cosmwasm-std", @@ -27,7 +27,7 @@ dependencies = [ [[package]] name = "babylon-example" version = "0.1.0" -source = "git+https://github.com/babylonchain/bindings?branch=main#9ab0e442ded6956b86ceb2dd249256590bf1d6e2" +source = "git+https://github.com/babylonchain/bindings?branch=main#c9a0b2e60203785f4ae21bca4ccde987e27e49e0" dependencies = [ "babylon-bindings", "cosmwasm-schema", @@ -544,7 +544,7 @@ checksum = "291a097c63d8497e00160b166a967a4a79c64f3facdd01cbd7502231688d77df" dependencies = [ "proc-macro2", "quote", - "syn 2.0.14", + "syn 2.0.15", ] [[package]] @@ -560,9 +560,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.95" +version = "1.0.96" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d721eca97ac802aa7777b701877c8004d950fc142651367300d21c1cc0194744" +checksum = "057d394a50403bcac12672b2b18fb387ab6d289d957dab67dd201875391e52f1" dependencies = [ "itoa", "ryu", @@ -638,9 +638,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.14" +version = "2.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcf316d5356ed6847742d036f8a39c3b8435cac10bd528a4bd461928a6ab34d5" +checksum = "a34fcf3e8b60f57e6a14301a2e916d323af98b0ea63c599441eec8558660c822" dependencies = [ "proc-macro2", "quote", @@ -671,7 +671,7 @@ checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.14", + "syn 2.0.15", ] [[package]] diff --git a/wasmbinding/testdata/artifacts/checksums.txt b/wasmbinding/testdata/artifacts/checksums.txt index 1603d26c5..c260c026b 100644 --- a/wasmbinding/testdata/artifacts/checksums.txt +++ b/wasmbinding/testdata/artifacts/checksums.txt @@ -1,2 +1,2 @@ -67583334a4c32986fe1eac33094ec268c858d7329762b8cf5425044389991d13 testdata-aarch64.wasm -a7c0c359ae50b71ff78aacf97090ebbb3f25192b545cc0ccedde55a89ccc6d12 testdata.wasm +85a05952497b1d42cedfd25d16057af25b0ac8e67040852efcdf106577a9f36a testdata-aarch64.wasm +364ac6b66b9677ea28cfe67c42a5c0ba6a63d955aa4ff28eacc2be5628611fdf testdata.wasm diff --git a/wasmbinding/testdata/artifacts/checksums_intermediate.txt b/wasmbinding/testdata/artifacts/checksums_intermediate.txt index d361a28c4..dfe43e681 100644 --- a/wasmbinding/testdata/artifacts/checksums_intermediate.txt +++ b/wasmbinding/testdata/artifacts/checksums_intermediate.txt @@ -1 +1 @@ -33dc1a2754ac9156c2796ec5d73cf997f84535462efa07275921c9903b246f1d ./target/wasm32-unknown-unknown/release/testdata.wasm +cba16345ebd363489d35b12a796b1db9a8131e90abfe0391bb3cd84cbee77e22 ./target/wasm32-unknown-unknown/release/testdata.wasm diff --git a/wasmbinding/testdata/artifacts/testdata-aarch64.wasm b/wasmbinding/testdata/artifacts/testdata-aarch64.wasm index 36e6eb4fcf28febf2f0f5d218ab2c9bb3e3d1499..e67313fbe55faebf2ddc6afaf20eccc017ba202b 100644 GIT binary patch literal 167071 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 YK$On;cI1B^;qMUGNodlnxE}EOKM;=fkN^Mx literal 160538 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 GoZmqH<-|>E-NsbW(&i51C@e7w z_bjG|>8LXt@h3itMt+`u;`f3^4j+C&rDN>-BOl}03;n^5hiCpuk8kk%T*x1khC*rD zwJp*xE#+_1bFR&d81ve|Qkq$&>J)P%LE&bzX#Te;+QV0H$aj^V(+b}2--!WW?kws~ zDWNPHLeLM@n#ozcX24Tmd`+!~o4zEv?6gied?Ay?;c;;wu{BDB{-QFE%?S1~f&I5>uUB|2Ctfzw?2}9il7T zVb{hTMpl1c`8*IgT_Ad|O zCwZmKku}ZYHE|F533<--Pb=0JQ=AN@{KeP$Z(F$M=3>)6oB?G&w^%!86G5F~9dl1T zwj&~Bx*&hZ6*>E!^qm^h+bsN|i1OiCwA$OK4g`37@=C2blCv$VzT40I%li#;3C>`A z0l2)F%x=(cCF4G-;iLU+b#Z@rL9`E!@DB~g7G~LGxMpl2v=e`)#4`EDp3thlFJ3?b z^A2!rQvU8A-Zqz@*YyNJ{6oXrnUuyj8iv0|hqul6N0&7Ddt!LoEPlRe0KfWu0xql@ zH!~mCsmpNPZoNHoknozGVHVQ=}d zlKgqXwBU1POj@703w?7+cronoxiCx=1$>-eG15`v!9%F9IgHX3+?ftT= zHC=wt1wE~eyx_S7(TgA*SrYWfSu(@gG`}@T$=Nf8IaCE_7l3H zKjHse=5NoRpKN4F!omqZNgTW3UmTJW#*|MUDWgv|=0D?jxMkiXgl5^!PYSD(-khKG z2dw4YfueXBn`}B1YJ8J9C05yN8_(ZOv2(NOS4&O+gOT&xEGKrwi=k4Ma61^M($BN-cWgdVdOQSFnTSkV`4iBBr4G4uZ~*S?wG z;xKu`Fy){*GlG>?MdWkX%&KbgVPRzSNLAVpiKd2CF_&T^zO0Hj;>aceB#vw)c4%a4 zwf@M+ZZfhpe~gTRTbCbPNqn0Bv8@@dY9;hblZ-p@x2AK&D}Zpk(rJ)w{}hPuyI&Y3 z!biD2MIuyHMIsEVdIpK`px`@cA{?)DB*F*Mv~iq~a1tY+94aUpX&7BPKs?o5CGWa$4&)BH#UFq;30_7I}o zi-Hc+I~Q5Irr@}G8GX{mtg(qLD)+Nay>AzLl@EZg^_Sd<|kMXIRWggJHs!Wm#lUoc=w*i_2r}(w(3sDm`4G1)1lAJvQ ztOq7tk+=pXwQWrh+8PV#43#N;342U1N@@oS&N$nQKI3dg;?Z>P$K-m{j~bD1LGB?-Vr9mZYh+2I7}*)aSop-M=1oSE`L-L+2;E z!)`P}Jg9lyppn1VrO-MeilT-nf2#`Aa4ystJ@%R2Nj;l>us}Cpc-dJS+Bd;a{4P*@ zrD2$A48w0!+xr}ucD7VtZ5V9;SOsq_-+zkD-$WsMe>bli8ci(Na0m?a)7H_Fd0df{ zz(OFSO06T2c~%J;BaA6c47w}pm@RlBfk?HyD#P z_{JCp0Lc)QRRD3>@&}RRLjJasG{Qq+;k6nO9;r?YsA`gG;08hmhlcSrX=##W!wiwk z{2CG@q-G>y3Olobyt!{AnU*GUmtvPl`ZY03Xib@43P&Q6^rk4G!P4VE?wVW~a4TdF zHG_|D-5>YAXNN+J?GJID z-yj?q{mGw!miG=aj+c4I^Oc5-Z3|D0YKBx08-I7Qt~{E<%vh!80vg5#ED|H#k~#tct z5`XZ7ufpJKzqL&30~u@OdCJ?Q#K+54hyrO>Z(>|NVWYK zOvznanZXJ3Hpq6cVRs23)1e?LNm~ySCc`#P@iRS;wGQctKhx9gJB=NnHmC-ftvv^N zOf*uq1iwXW6w6gwJNV{_)}BjjX6l1PuH?2)*rkcF9%RYt>e98U6FEX%=x)_T9jj7e z!#FSXC`-OiIVE^YgfXf=!<6)8FX+p#BGxRZp|FIbqm+LCXT-KJ zpqNS0^JS$L(_qrxL&r!IRZfTvh*;6E$^)yby!d3R)by3c*ils;IkXB&Mq$vkCxX&e z*RECN!>3#&@hmfDzO|AG!&KOC#-NuCAT4z7>SlN=KrY+hDE!K75U;9gSPzLox~TE* zT7B5Jy7H4oi#Z2tRr%PbPZiUsH6z{-8Ig?lo^qA4m}PwprSGuv3e(~MVfwaXHgocr zHna9*8+_a>j@r7bi-wXmQYO+;E{!o0Sv&R--3@deBD(_*L{8Rq-5H+3zRx!zA z+{$k-u~aMgYbuzJ6nr2Ql(4B43{HgqpiEypE7cgh74832FZf>7II&hi2?lCB+Wh}( zRXXLrrb9Hb_p6rM^%KF@jeNI_^~(qj0rbKG)iH98ev-p$AlY8Ee#`F%jVqsh<>$J0lca zrZPw^POlYwL}#%gKyDd^k(p9vN!EHg#d+ zS(h)$*GE0%d#AMAC2mv8%9TtL#mf$ljL8e;|C<_CM5Aoh7)MRu5pN8yk^(O&|u>9``FLk-hC!MfqDeN2tyGPQ83-6nm#w;?nc3f z5Zjy1B08P{uXk1>tMq!~Jb!R=)tLE@a)AGt`Ml52M^@J$*eizKbR4f1W2ijzlXj`^ zIX&gmQG3!^1~!RHZCjfea-U=a7*`J1y>rZ?;gRmoe3u5)tidO-$;uYv<8k zjl%JUR@v|5gHPJ=A3sE2kY*gQ;)8gbjo1AtNur4nn28A*Fg5EebMY0piP!PK^kZXV>@F5Z8aQg#)h zNnu-xT4x+J~z!c}h(OQHU4GplYB zBhu}`s@o)kk}FtS-85BO-2{wrbrT(7b<<$#Ef(SpYg&^`Y12n@0V8=(%(LJ726>Fhx zN)L`g9W!G>P;c&72wGQybV3f&2E)c{Ul)SdzF3%8%|UE+vlfER(Cu%CgEp#$qtLLy z>RpS2G_?kTPCF)o&QyVu8e*)SJOu=8vbT;x(B^P^^$>eb*~Y1J&~sG<9MoDp_|DdY z*6844clkmN!!+Bv6JW--(-l2sf$Nts=#}+-C0XD1>OzZkB*c)OcFn^eXjlIt``GRM z`oZ}8fa;Ww>@4vYsmS-SwL%9WuT`lX$wKFUKr1Rtp0fs4drUcrM*_P+JlbbiCVaY7 z3KG67tiIsG=+0oWCS&x)8G95KT~K5<8SMJh^iU4DAXg{YK889PBhOOwOp7$buBB6( z78#epnUc>eSCswYs8chvfJj3mJR1zOTY)EqMZUh)DXUkz{T99}qY#5OyEr0DDzQ4$ zwYnaykuJNb1aGj=c@+x@tVZ^r;1fk4#hPXf#%?fGwm;erQ<@bFOekIg3_c^vgb0S< zxcAWrhdx7#!?03PSXYqGuC<`X8D;#T^10~5`*yA8^ur&nb;>W7H3PaoP+kDLKUiK! z{ZX+kZ81&9TIN3aENI!lOR5#VLCKDLcF}>C>{~tb%D(i*KHV^pNHAcn12v%6^;sx= zn1Jr^y>oP{9zYiD4dd7mR$nd97gY@4hyIk_%Uf0NACF-9N4e|2*&k4Ew5Z&^f67X0 zwu!-%&|>m7IfZCyZ4tv-Upul@jON`m>)zo&u0bPQCA=?_mqCTaLzsanM@;+&|4cp! zMg93!)Zbw@p{Pip)xUbrQ_HYthS3+ijm=PO zA@&ajM_V(#1t4!`rpOFS`PQu9&K4WipvB+!AnnX^3kmJ=UvQ$>43iZ6oP#T!X{E(E zs!cN&nWhWABOET_aQhd9!;3iMutlY)@cF9kP38og$|JioqAjck5o8|v|Sn6R;)rJaP-l4lUO z_n$g&pvHg`ib~){Bap&MoQ41^@ofL97B#=1soF3>%VcguhfT&tbOhm`foBL?v);#z z^M+{l%=MhGUIj5nYm4-JsH$y$g)%rY69&~rn3UcKK+w)zv_~b zMZ=Lt?fJ=xRC|89W;0`}&xYmQd=0GnoOEu}Y(Mfx@d}MyB@U$|4zY1&b*)4qZKUbn ztI|ECf{V>HqByYmQh54{dfL`gv0Z%HD4+hd+MVJl9-9#2{I96|=_;>kVtKY!w6=}K z?^lTysoiyGEQjlm3-c65>T=D#MvR}$^5~?A(CVgN1viXJe_BPX9jLT zLUBucgS^uKL^PFR5Ag(|2WUHll7Hxrqu8^Y*Q@YIALowAlE;uGcm4?%%d{m~g8a$O z&DhWrg%Si<6i^o_fFlI5Q@tco_y25!j5(xEP%=D4!;~NhMfy}0htNK{CI~3>W|rat zD;U@G5AUaS_FN%MGT=ua0oFom(<=k}W{sqZq|KReUK4?dm{Bd5HO;UA;2 z5rLH2oaaTTT#aQU(Cb1#S=A@VJ`N4)<6>PW+4jJ%9scykZ~o$E-@W%Wkl4hT8b0e8 zX*hnAs@K;z8%~iz_#i%DFmtU2G6*IX_oG!+RV)L9Pd?8=Edt58%Ja$q#G z_&(|gRi~&_KZ~os!q;!5XcewBeGBJ^){gzgw1`UK2Zo>C(t0*1Nfrsg-N;7?SAs0grnvwni!*aIvVo$WU!>vL!metR&yyOo7Dhn`a8Z9q$GO+Ym_u4CBK7r zn=q+{lg>1p^u7s)W+|d(xWguzh{-0Rp%jz)5)%ZtN=l(0`1ND z&rvajN8zIny7xpxeI35@fC~Hg5)O80J&dt98L=Qri|ggiew1qJ)3=mXAmpSgf?ovWff* zBx=_`5O3?~_tJzuOMO&vMMED7CGiY(=HGAR<0F3Yc4}uP6G3l&#@A8a02zgk#fAA9 z#7iGkQwqTcNQF?kQxJ`noR>0K*F@A|w{ohRF*babtaS-IbE=Lx5A)EC;z3QO+`b&R zF;Nq8xbShFQn87MV&9%hjBTZURqonv~2+bZJ~MC$kY>m@d+y>U|v*Q z(WX|dTND!dj5giGbO?d#G7a4V*NT9rBddsr&IVEC@T3c{reTX*wytY)ZMmiT^cjd? zRKfB(BT$#(3-bRC^qaJZ6o8jmx1Gc&rU5o#n|;Vrcq z7dDyC`;{H8)OXk71*51a?AzE9U ztFX4$0lSjMTGA0YQWjLYo1k4_jaHC;%xSP_Q4=K@tf5Wy6jG7d7w}nf0V@L_jBI$S z$@qSAn+}$&oK`%Gue7wtrW(eL7u7_z}0#@8nv&r>cAIggG69;g(iteuxNm$ zmad3M>0=HgKzK0t<-&p9L!C6ow9Lw4Hw|9Tr1yc+@cG5-BMG!|K86?;3pf58>l+s`$cLV!y zZ)nOSpP0m!GSh{?t57v=&cK=J0aL8>hCvm?f9W%Dqf`U+T{6nOB-Y*~qeQQ*{TZ=X zwB>E=g;qTxPyig|5wwKanCRkiKVkHs#)BLoW1Q#+Q7q>X(1Lgn78RCsS*b{{O^u6K zs_|E)N_qcZ=&Z^GG1YO$SA*&(yIUS#QbMt6GY*3`DRr8S`6SN@Sq}G!SV&tJB{bqS z_N1+z@<~kf#15LM7Qv7(RUt(-=%=mOvV#=7Xk(MxXbaYy<#H3*F$dYMscXapbs~Do zaoFahtpSN8N5>+uDS~$xHx#Lkss>5<82N2+shzP{0KWW%Qy0MHX*mcdl=}>O_HsNuJbwnaQzxP;!yqi zf#C&Ine&Aj6!olW#q2U`N?!(%3IZ!yPmRYQ@69k&l`hIL;MrbQU|aOpq90(?Y${<5 z%*P>OXEsE_==c+`x}N8dUVFrFI4>N|;jsMILVCd&2L%=#oil5N!OaDU-me5I!c@>;)NCmzO8_J&%fa|F!>zTCqVy^{ zgGrP^p!0}?@hgd;8gW9Tres8TVB3oAF%%gR8szP;6HOF8@Vj&!C8g`oD>iT;k0~M} zPau>Afb10`k5md4%sJL3^eH)MC2|t82zP_>nS?d1k+TkRUFWRZ>(_ABf%^6S;e~P5 zIis9~#75ZLHbR<_glysr83;ipab}#s<}%>^xSa6-EuA7~NXJn9D$X!Mz!KGX7LvYE z7CD$z>uzBYhNh_^EELTlfQfz@1VbeKvGkDtLd7M7(Mm2sTy6V8jZ37h-~(1GNlC&N zrlpKSzFtO=nky+)8^fnWsmD&4Qpg@-gjJL>WYj1HEz5x8*FT6KOzRdwL@u*#Ad|qg z*wPMs;mL&K5c^Ow=oULjNQ!mibA~f=(Y_ZI4h(u5nStE(Usa5J9bQykcq?}<3NFrg=G13G}p&B%YveZ@Egj7N?BE^(x!0Cw69^%xk ziPORyjuD*6y$%X|e9+P6 zxG&#UzI@6<>VL%O@gb(xq(d}jO=A2h)({^f3hr*N-zkTY$u6@SOtOfP*}qp@CVL4L z(agiEgrlz@O(wWkMFq0=v1GvtW{1xIOp*GVVAEp(Z?9kv~*7N3kQZA4ScEj1`49UPOf`QpL z5rt)(%=ORk*e$f7B$hEaa;!MJ=;uF4hMD4U>w(x}D{H-&*Ut>~G({z0W>(39awrc)V3hF@u4-gm9FFX!x|O90!F=Iph;wchn!pZB>x&%4DQ z*$}cnib{vvQTz~L(Ay0&p?qvgs%jR=T*460wr( zAv|N4N{K=N^<3H`^>=nWEzSx9SkanHVoi?m``E5EIo7TTcZ~0;D!_uYFSQ_Bu^<$3C${RXv>^U$sKQzhE?SV5=i5pPl6$4u z^Md%mPcMiE5`EseAcFb)KMcRTl!k+d zt+QG68MivQc8O$Il{`4{-vp=VcvDswq!+}xE^!m!<_wa%+b@gok7 z4kjlv5=svM5y@7E^-AeXo027+HbYs84kOz(U%-)t>&s^Fg-hY;!Z9sks>P8}SUz-A z5uZ%2_(^?Ovi%gnnqe-r=}?!1m%J_Q2{*5o+{5cD1U8at*K_cYrbYao=ItS^+;$b& zuoxr+^!kE4Q+MjF$$6&!ay?+y@He#{)Kk~|$|o+;(dqB<4d0U>%d4y}n1eMvd}y{# z9T-6Mgb3K7&fIya4uyZ|Y|fk00-(R;?@tS_s)l9taD@wqh{W>sx)2m;q%|mV7%T}A zoy%+08M@lOv&y{q97(>S*Wp#8(NqtesqUq1P~AE0YeOQ7Nscc1curZDq;0}j#2-9& zoMoB0;nTsnGu2HoY!42vpW%af;J;Va>$h==0<)4nW~BX(A4nhjs6qO1lSlyRq}9$# zH7CM1q{8+kloC|PX|k-TD+NI5XG%nt7fAzU4|!NceaMKx>y$^ldz>HY#_7>tcAO+G zpppAy?Orp(yL7v{cZOCU+h=Sv2rz~t@HN|)i&AT0$r71dHo^`J&1}ZcOQxx^CMiFk z&ublmcBr@b%hL0}Aj&x6nZEN(@$CXH=9Hwe+=)5SqyZ_gCNXD*V&+URBB;>RsdgLP z)6N}lS7!mHvF2%vZjC>m&IWq!@zx)UV@p+W81ePhU1zXO`tH^<=mb$}Now_R1>z#O zL$j%K9coSo(4fVyaJy)Xg731hkq+0O=@N+=RzP}sG$d0(8TvhW14_!ZB&%iaL7yMVoTEijnQ3y@E2}TiueU;i)1KD&_i-TA3LZmIrp` zgD#tjc#xbqPWKxrE1;J{Dz6|0Eb zyg9>&D#UAWa7?+<2ElQ1S2?GrQKvgJ77o*@G34lhCYWjKcg}hs5gN@sNENctq;!*R z6fc$pnQrwgty0w1NI@K4ZK^N8nO)b6LxB*BmjDBV(e6D`V`|fOvoqA*8}{~|k+b)n z@4WYn5_BTASI>){_g+Fcf={8KJ$p|KOx{}>ycm@BH`R$h$-jl$^WHOZ%KeJH7yWs5 zdyl!$-s9rEr{2Wg+xNvY*?ap|WD2)m)47Emd(X5m$2EvGWbZLiu!du{;1jZgdJAsH z7K~+v|79y}2YbZb4z|!BY_^a$VWkEy0;ctRL7SMTW(nbrD&}JVGzU9~W5gR~YlE}7 zjRaDW0$?ea!X>9@tm-v0g+AVD&D@=D7lek5E^4x>5#LTBq_0y-cnPZ6?>mCK{ts%Oj<62|e+sNOfD?#T*DkGz_0bl}I2gnFn!|4bZ%qWe6QHt*C z!zYwEL+ir|fjOV2Q;A1>W>ng?;JN;CU6sH&})77-R>%#M4n>T=tW1xC-OF zUr!Z=)ZO1KDvUJn=T#Wbt1zS#eO`s}w3Q?~$WvBfRGB<2AT=%YHS8lEC>X_>jNn4d ziI5N>2~ync5TxY39|{cKNWZSs4r0rC`gPufejRhEI43EoPSiYY_3P^cb39#(ZZ(9e zX$V!*Bvh>@O*`_(dZ^4f-#nDw4&Je*ow_@rs!{=-^n|KG7OJwoebxGQovz&1w@;al zDRpO|D)+CRw!#&6Wl!%u6{l&v`!w|KQv?_3mB}`fgsYP^uOwXM+Tiron~}~nD$5F; z;>qUS5}I^~5gr-Vn%_5Dm&Ck;I*OW3UXN(^^OWKG9nwOsH!=<>&EvY`Tws8El~0pI z)@x#Yzb0&zaucNU*xke+n!u|D-#|5nf`_sq7CcMpe4b4e*e-Rx25#+TR_9BnvlIs* zz)i=Uu9hKBN?)=bn!I?VV=1luXXT{*2c)e1mw1FzXwv>GcIvC>P34gn+JDw?X{{P) zA~CWUjyOk{>5ips9uqMgN#awDlGeCOnrUnzj)c;J0jn|%&{gDH5++`&rciY^?^Xqq zeg&w}RP<2yF-M`MDp5ZXymkHH4kkshW9$`736wuQ*RdwJ7)nh%IK~C5!xk4#OPF$D zT4Y~9(vy7wsw_>iO!+I0l|eo3u7*VE85vlUFAJ261pB_ND@*}$+_4DSH&AFYvh+!U z3Q0OWb-gA$3>0?5wSmH08Cd_YhhqZ;kdWH$3>5m*1`1vwqn(zCY)xXnWPIc`qUXK)Nm38TVsV3hz>hp#7wNL7Hf>1@4b|CK3OgLqX#o3 ztHlXz=AF}!trmIkSS|S0g9qRa96a*pSlg6u?ia9aSFgdU%H`fT^W(Yd)~`P8ZmmgZ zcDJsLZUMsT)*+3`IL*@Yx)7=CDqJ#Cf~efLtFX=cb`=TI(igoz2yE0^SQMa13t?eF zdm{^rK}8l8$_Z2iD6E=Old^7X=-Ysd`UMaAiDP600_-fCUNrm3Ub4&dlHwf$Co1Bk z6{{Dd{$1#)e;1_wUFfNQ7nFj<>R;bk{fmE{HfdyQk-BgJ+#aTvh0gTC?Oyfo!Y=ji z0!S{ad#$DDtA7_d_3wgaF83=m3elfur~YLwr2ge%^{;vp>fe1|WaaGB5v%vDNU*T) zi`>EvzGXp71M1)MdA{YFk#89kSIM?C9}!<81v1qBX>cv6frFWrT@5_Xvt*v-U9FlM zq@J80xcj>BEb<@t)5f!;`RrJd=XsWA%}PDbv+Qsed7fvvU_YJ2wDsIY_GKInv$Noj@u?DgYNOpu(o$OnG3O?T+D*1Hz5q|`vM^VDbL;&**8Z^A1z$Q`)A*Z^wqvE zatrb>Nd85X3>MU0%;B_!H*!o3j>b&tW;dyJM&9fu)o#k0?WAf#^l`N%hn4WG=7L3V zlZ6ifCRkmZtiuPEMaq8S6e6(}c_bPF36hp;wK#zeiC-K^Dc@JrVoP*>j>hx^!q>6; z@=1u{Ke{;mJ2E&&q>o*RusfoBaJml^VlOI2ac6FGU= zsyfkI2X`U&RS|0-Hv+Tk^!mS(Um86agquRoRZ5+p8`#~aQiaI-6qD?hTk(Lykttq^ zU!;@d7EmGkC}U7fKFa=#4FLq<4#?#ith{Z6MwNV&(ObcZpuQ4_drSg;xuNom*|$si zK!cv3-J^gYL;(o$)yO{L;dtWieJFcc0Fcx9N{m3>L((4MSjwn%=j>)%a#L)#>J?pt z=!yGepYIj*jv#L7F*rnCoD}jj{)Sr!y~L6*RH=z3;b}OjRo?D)*399jh;oa}lO9Q9 zPbePY^=@I>2+8vwefI>(g^CHny#esl%rI7+jhIv`1BZ~P3Hw}4dp=j;w&ZWDrt*sI zJ9EGKr*Gz9a<6XYn3aQOPLLinLmrV@LiuY7me}&da_TOUyX$TuzsYM@TOyYN!mS3E zW|jv)6Ldm%EUKcM1PWKG4*xstA8O6u${tPrr0j*(oiw@EU$!l~zYr-9{jv-oRq8E2 zLcj!cU0|Y-5h|%3#dFYiJO`tMBd9`KjdP{H-3T9#KJMI&G!I0q3O!M!ikQjtxLy=B zCM}Ot%ZsAMi#=+*C~CYYYCLD(x#x@ZVxq^sGd*6Erglm})LM(vzsdBdQd}OTUp~SI zCZqKcumXiz7r-OhUyB{BIO18SP!MEov_+9!cYx-D>_)Rec8|1V_ehZ4BVDWxl}jsC z(JaePr|D|J584zJ6<|bZdWgbp7{r+cSGXwAqQgM}x>*$duH2O%)eOy~TK(n)>&Fw( z@SQJ!V;T{@N#WdD)5Szc3GO-6mVY^ll=(^ z;%9h6oZXHzzIAyEuFDEdmFrO1K}acxQs8T1(KJ&TJUmeXEKL;4c{jDNzmz8KPM%x> zX36m(H{9m)|D2${^YUe%{#HriiK3oGf~)Ifbtvju(96tUKe$sk-NC<{h}OEK7sf3a zK>An3>78C%nNG`Us1=~#bgD{Ei2S$PJ2f}ps17$r8 z+{7viP?&DbtR{u}(4=4X9qR1MzQaz@HGt7d)6Jg6GXtf6ETyqlagkqI_!-IOLslTJn^`ijpf=<{C;t8s)<${jcON(hbij5ZTH73NjUl6IBY zRY6ScOhM#tBTYJ3BY;Rpq8H7#`QWnxbXO^vx=oSX;n?dmHOhe&Qu zx}osd(k;a;OVfAA{ayy?{L7V#k8T!UflE97)W>cq{_A?8MJ3NVSozI!kkVZbvL*Oc z&sXr-T!8p3z5L`aznLN{cg+{DzoD+?=hAl)&AIYdPh!0S`Ou|$EQT`@F%e+`CKQ)9 z8`G=Y@`73>9EC5JqKElY`k*$8`I0N={awHOW-Og;ebB{vQAoj5mfTrIqulQN#N2E5 z&$x^HU_8b!OXbUAZWXp9aZ{Z8MAVa|Fb$djsK)$;QeiZ@K-KCz`E(E%Us8N)J<#?A z)B`d80avo1^YmLuFGHOoc1niMlD{f0cX4_0iwYFKlRGYVxV*Ai-pvCtgbCS#+nkXG zYEA*|`0&}@Ra2BYB-UO-e*|z``@oy!k?P7IOnjeqI5XU3+5|>kALv^k0Yu@?x zk17?j^Qh{z@T$l?d5QErnD{44CMW;TM}zZg%f+A^#DCR5Na5H1h#fId%IAts*-lO0 zBIR@0{JP$Tkv^q}{#iX)Rr#VTpVL#pvQsSk=xF*A8--kS#hlX< z&Nsr})hkY}RVAkaMt|#)Uy3Nw-jqC`%ypWNj`C=2MX)dPhNV{WDjL~aLR^_XU!JQI zqTU?}SpMQhwGrE1@%AJ3w?Pv`Tg;b}n}ke*5$|HB3mB^#V5|f+&F@Jz)y^2I5%Yqd zH|&9fTc}K_v;^o7HF=gZkYx#yW@6P$wmwo>m?J&b%v(l8bX4!?2|+e(OTvt&PgV)w zWny*=fx=5eHU)d+k)-KHysX{bKb%&H&iqh|4X>TmVG~2CTa;T#S@GJHkyQ0Xi z-2MYlLQc{aY=UQ|BONL05GV*r+&?0;mjm~r={pDFhB&U zZ&Qo`+bqWzs0GkKGmHZC7b~vjMRg9cSxI|To>p>)DMhX;u>e_kxA5y4clJ(!E^G{i zp>mhpVcZ4FypA=1JyICzFuB7Zy8>f?4S522waXo5B6paokPpXV^Mx;6%=-*_uZXPK z#K_8b6!?k?jI&i~()z+MWJ&Qmd|{GQ-qkC z^pl?)CUVoe~sWAkV zsDo7@;rMp-Dj?HAcENuj8i8fw^G7@^ zOkKCH!U?9PgTc!^#9wBxjXR2`=1@dK#K)m|YJ-gl8Au)>YoJ&vlgCl+0+jGoLO&HW zF3-tNRf3AxJCa%;UBMzftN0v5%(Q1XIw1B8Y{d$q%olZzl39!teZ!M_MNT%0Og-Ct zxDz+V&xmXgaulc%tSd>f4YYxUs1HdLAR~{VaFC!7U~%HR%dfgxT(WepIZ1HFoM@Kn zErCT=t*omq>Y)M9LItX58>5?WD1dGQM;JD54ZiaeA)l@gAZw{o;5fy1U z#^O8_8oMO;K*InHVFr*c$X%dyA2TMLtq`K3oQ3wW8lFT*RR?_PUvH~{vjx*syBa{C z-PQww9ngnc5Z@a5I>6rt`kKQ09-V%v4{6@6-W*%+O?vLo^nfjwKy2Ay>)<%V^qiY* z-BQXuhfK!wX@;2G|kLZw4??c`Yey4Tj!;yw$@cH zK+K>L_KJ^y@X9@i8s@AKPvkgudd{+u^H~mbhii*iE^g-4#mIRf7MV?UpO#VV3JM#6 zEO&I-jO~?cx3KFDt1?T!`d*ASqBGLYzZz5{4w7Ui?~r!#2_8J3hN@m0bUy4$JHux$ z?Q9_JAW)16qE0eSmMumh)exc0D^7({thVHu5hBbei7*qSn@(OC?UGlhcSmL99Sp%{ z^vg82^uup9QzPcck-uo6ne324hOHD5cS#BXU35~2VzjapGHs=hW3gaXXAAvE>e#p{ zse_%jpWyNMm#?g~ZAx&jl*Z`{MNe?B?a!6y z4bpwTz0R@QN6XRPh7y%T{jz$Q4R$5aE^)IHxY?2L>tgdHQhPE*S$c8JxrZ$mi%?O@ zd?w>bmOEAyF$)3{7pqkDU@kDO#2?++i8HuZ8g=aJxcSIeF817=(5&<7V|rFjf6^R6 z@O;p2uZTS7g%20v`{ADN$r;xBUOUG;BN$zzUdc1*`S=j2+xD774ai3w$Lgw_}B zx4bA#l*kPze^GK1e^a=to=D?uXaEtW6nSY09Quu1ZR_DTegg zlmly19duH%O$~z_VUcYIh9;Vao$dD~e$t!%Tbk64X4n`KHW>DXa9!?dy`iv`)X@!v zvnVl|3m_4+FJ+4+ubQI5DfF$#fS8>&UQ~RG5}5fj%=%CkkOCL705Z(zF{L7bS@fMD zFec~Aaw0Wbpgm}SU&+cA4O-~y#$1#{2a6_g8j*jhbU zub`&_=H_xMn3gV_JXkuV4U{G-ybQMc8#1jv`jzcg(~_ySiIkKCOdnL6GN)$J8h~EV zt<>|0sI`ue<;|W%XUFwafmrZwZ_%<1o9vU#f|E5^5islQ zSeBMyGgk4(S`{8T*8F1D)+#yyL2)@0FpNt&M`t=)rH;sE;cvFC{7sFmeo$`(876Cu zWDj=f^3H4)buG%=lHuh#$nb#W1DctqhqQJn8b{PohKc=Cotgg`)>ERB)>&L@7oQXX zUX@lxbx5ltr5hwvGeO20$&_+V2^9uz11Zs2&9l=2AjlnsP74h>7l!(WZ;b?YbWie4 zk)Bdc1=7~&G>S-cHie1Db|?+(+?5lZO(R!d1Q4Ym!!;0BbQOut zD(~48J5*`g_7a^{fsvdUi9~SHMJRclm{YSIF--PFf1vE4q#&{bU7lSbajY9V61q*M zPdm{W+36G~vpl-EoQ315X9!zlZqNVU{DqEx0CP!h0Ra%|DO8y)AoX8sMS&3VoAJMx+Z$FMW6 z89bvDMPyvNbv~0u$_QQCl&@wQX&`@X?jDiMm`W#i^M-NDC4!56C7jgElyct}@ZoGw z4U9B6+N;1EL@KJcU(9n-z4R=tPvcl@xBU|m9h!iECSoC06CG-^Ds_yZx*-KqqC(v5 zph8tkg?J+>WD^ORta?7pRERe@9JorH|BN)dJt}miaNrX`k523e2Oi1(5#hkTor)fL zYpYe&-KR&C<;i~Gz?mw^{xJ&s2O8llF)lMdgr&ArDVBu!SZ=8kcZoW=3l3A9iaITa z^QfHjG|!`8D*Gj z(rLxV7e#mnHixu?*TuHFI&_p&szWf?5?so);lQi)F*)X}MmRA1ijd)I&H1-0TtJNz zE@nnot(aG6O(n6`RVT@jv0vYY17H5F&VXCW;lLgS(4DhUbyI3dK2L;@tE!K1U>jb} z2~~M3^EqUk;h2oG`l)Ti^M23HN#HiQ=)!?D8`1%!d4!s$0^$wBn6R7NrvlLCP{}8f zzABQghC!q1?P`#8D5WKGR?OkRTfK1L{@8`zdH@AxO0@kN@eMntA=CCe_|W@%@SYMc z%jE};Br{BU|N8}CBJV*T3Z&O6@brBBiV{2F{F(|8IPy_*qL0Jt3B>+Jq=rbssL)S7W6WI{W9g%SmO94L#|$lXjO9^UZW+rZF_yVs!B|Gmg0Va*M%tRMqoMga zYFSE}ucIB0pT;{%nlHvJ#*&K}OLZl3%Iy0B4MEa;NsrNLzM}fR=Ihy2kCR8PUfzb6 zr1`Q*FV<&Mo>d;G0(G&hIn+ebqb+kA2&aiJx6N*Y>5ktvfAVp4N{YeOuE(@(5J?vD zho;N6y5tMEMAPjeXJBbfb6Q`(W{16X*vO$xZ4r~KJ8BegAbjn+aT95%F?etR`0Ol|ETq{ClbcaTwN`CYSYo!YkjczKKd`U0 zFJ)gt@1w9T3faDflTWg*QA%ODTx3|Ib*kw)pa(Xw(QTR22%n8JRy+u_zR8wWk0r;` zw2fv&cq}lfma#Zvy{Dn8$-*RUqdm~MKb}rs7)e8D8Ehn*8E>}u$;KnQz|v+l9HnqS7?IXnt35E8)b_t%8GuY8F zP9_XPb&v@TougWz8(8ut(;va=D7|SqHi2)*Qy+e%cHBe#v zFwi{@5FB9m+yI39(w}312z?3A;0=M6#LHP;2^x&at{NJEfq(`fprFa3KlVXv9XQx> zt#?O;P#)yX&S}6J_A>e$o(8Q=o?x4SD>vKSgX4$x3E_X-X`=~BkEZJ7-(pRzsmt_C zvDgs^+6`wGVb6{2;wXDd+7Z(U*BGg0{^OwM)7o^RlVX>#dsWR4tJ z!9fMu1#89?^>$caB2tFWjF z7g3dHoy&T1*T}un?2YLs-DK>tVsj@17k3O3b803raz`v?hxm7xe_OFAL1z-0k+Vj4 zZ)}GyFjgh44b*Bo)`q(sW-?g=nRy5gZ)7HuWm2}ndcFk7(18Sclbtnesgs8BxSk$o z_DzfS9z()uHeq;=;Gq2vAXyUW^XUm{OEq@JF&{v}lZ~0p#L1abK`hx>!$*&dWefMY zd~gX77Nok;xHW|_ZthBG92?z@+Hk!ja~KxwemKxk8pzHXyplN#XN|S`Xt+WiYku>s z9}QPZ>5j3Tw9Xp+qepUZkKHeiUiq7F);M~3XAQ^i$XTNozmuIchDIrxIhmhWwg=|Q zV8SqEHV$VE?t12@VK}%RlD){2*Sxp&l+^d(Y!P2nz?v$32#@!1win^(KW^!>iT=^Ku=cL)?vdPU`1@{$-NIoM2TN>FZ8X=;CMyeE9ceZ z$Y5yXb1Xf4oEc`g9;mkDMpSy{eQIVZlj5M}xxQfOgnOA7dL!T(&=c zAbsosV2-~@)!M47@|mXzd}Bk@P!%rLhr(f_KTL28oCk5}1)q9O%B4jc-tZ!HWZ){xI1U8FoVJ^blDN3Wt5jrfB9X5UhU%b{~!ww2| z*wBHP)EkBp*lRg#c(PVGiRR_7E|^0#juwWsV6% zSx8Ao86Ncf4=~g-7rV;$)E0;-B%R#d-#4{U*B!3O333rr^e3CVegpk*-?`jtgeXkXhzhY9TY_v7Wj9Rf7kKv8veZ?2*n!IZVjyF!#hPNp0ziH zEXj}w3~}}RP>=~GC6kF1s~2Q~ry>)$+P-17JV0{W{Xb|;k)OwcU>p+%#tvOh-hINb zpx`N-5Vwa~Zwj@l7CVCB0z63sLv?mO_%tH2vCEr6gtR3as__bB!%drP9NLF$9HW6C z8z)3jOg5@n_LM!QD9=Gz$yN5m4rFV7{nRe8B>`L|4C*&)LenisFRx8tU46pDsAeP9_79(t(CAO@J5k(S5t95t? zTmv|m{0M=|WE$j$yB*}m-Va;J`(Yt@KaA%??euV9=m?T(6memxlb_)1I&PEaf(_L6 zemLBHyd#)2Q8TJ}Xm+%#150|Y1Dv?a`@xxVM&yk*!@LwUOj@g&3|CT@fFvxaE{SnF z8qc6`q%TRz6brP^+SZ^b3Oo+NA>dHY8A93GJy#-;d0y1G<~%z?WYQ7-0EeEAGX$vE z&JaE?H#0l%@jETC0|12^YEaboHDeIL_EJ=6pXsh0KQY!?)E( zL5GX=;h>%U@k2ZNFovH(pLXt?iro|NG#nx{KCq|rqto8~f;l-v5LhTOx}aV0jqBE7 zX?EN#z*yZP2vglUs!oZ&57$?piq1AqbG-mrCkmYOF<(87&L;uL&REQ0M-%%fM0E505}PuWdPO^ z1F*!i%mDDEGTk{!+MW?>NvZ~waJz#6kY{xWVDg5x@)41py=?|ypbke6uV&W_0PKet z07x$oEWEiE41mk3JBa}p#NY;obTI&fZuaX1<|;DBX9i#d!~0Ps~ zOR{Ka7UF=4M7?lpFx!+|JeY<_J8SZ-5R0Tl55YF+fcKa+LMk{U%!C3>>m%LH=Qi(r$Co;a z`$%W7axC`|7B0zt%40)KttV7Ld#%Chh%jXCO^h%469y}Xa(jG5jE@u*37(5?>ZxFQ z-}H|i2^Wt8g45$=-d`$Uv6lZ{S+Kp|5?g%d-&(=JYXraG?A@h3Q(7I#yH3r6Jm@Qw z!&iXKSL8ci0f5US=mEK1<_$1(nK!JyYTY+)&u`yV9e&He0qm7?QB41dQoVpnis_TO z+t#xA4luB7W`0PQdiw7Zdkz=C?+aB^p(5l9#TpKp&$b%^1JCsXAel|UbD*&K>W{)! z6MUmM%ISaO97)Qor_Ua%@;({}bb0bf?}?lq2hEqesvX`rXg=S2!urgS%laJV0btvcl@DZLaX zAg{tPafzk2oX(I^&LtCD`jGUuW2C>H#3m9QZPF@2S8i2`Q`PGzFrPx+z7&eWE~#XM z6mlo9Hzxh9KSQ|``dco_qZF-k87BR0?v?s!{jCy1I-zL{#3a$fgz?JyTgmb0Zl+(= zMrQ~LlSByT4&{2mVi*&Rg|5VI%@^`cuZzxT7`t9ivguG0!l#}GG`PIk;wK$rV@~Hz z#?3Qvf5>WTdi@{|$MHk42Px-KBYk`8LBLc(}6kwt#_Jr0I#tzu!4|a5=#m0Q& zekp6zprO(z-*y@v^AbhW-={!spHbaViRRz^7$oBb{Gg|h3{~=ENx-HX53&H8mXURu zjf=e}OeSAY=pXLdkse^o_%0%pxC1EZRDP>(q1W;KQ29N1` zNF#rr3O&2Oc$6pJmZrg3=7K0jL9-?Fk1@_CH75X*T~k=znQDQVm~FzEqga})K>#j>J~nT&{#9Q?%0Z0+dyx=k z*Lp0Nn(3EHumD59lby=~%%(w2Y!&1YGwUzeGAmj}u2xVA(?Z);HWt#>ma=>}-$Ej4 zu5FajlHfnMt>#*}yi7F_`pm5~CtsVz$VO&qE~J`18IeP0W!fcrt2oC!?mO$lf$V zFc)|4fojXBN!Y3wOh(-v1xh$<)>fMpI1Z^NW=s_FErYYEfr%B& zsh^P{$u@R!C8-k7k()OC@M)hwsO*_a<;$uwc99z09TxB=d*%v*HAEe5e*Nu9$-Ir1p-+y0^Yk^pEsN$Tg`Q&; z)HKC6%)h(P-#H+h#1T1~0_Q24L|7wafzf%@lsI`Nkhmu(OP2U+!bM&Wb$8MQM zhtZPMb}7m{_a^!hd=#bQF{)3-dA~;P;p+05xd(qPc&@<-wGQJb=mjz1>n6PcE_q3B zP+|(C$evo3fnaisICx*E;^s7yT;R)2%Ye8T3l9sp7{CB?7cuqQ#ml5oz?b4Bg@V2L z{xlb+`|O$GKXH)NQkW3q%thIn!9KB?HoJN;Z|>IeCa^Qb=Bu3jp1xhOE^TNl+Z z;S_>}>Wf97xN9Jefiuc&&4-n-cM+H8uP~~lT@!yr;Tar zR5c{)YpPzBS{~(0&T!yyaAeIlq5{peysgDhnE*JcFKH@76vT zbuw*bJy_Lzz)XiIG%T?5)5op2;rEu3vmYsgDw?0an`N)k2?}bZYT#bt!!&U5(Lmea z2|l9>b5$#DCNo8rrh1H!?M9R_%;kPC=C&Jy)9S?o(TSRp&|wy}V$?o1K-r2z;8Qm8 z=}(l<)3fJU@4r!2LM~9}vrd!N{&kB~XZ4ZN zCl(T0((w4!3bGpn9g=@kD^=cDyma~tG)-4Rj=E^*Akupi?4l=kkTM{*#!iNO&GzsR(E5o8_DZCtXrhozs z+Vt0v^GKvhqn<7BJ<;!CR}vqiVa=IQK9pZ6n`-(l|D23!HXzT3_ra^6;fOUxI=@dW zmQ^T4^D%hTW;p#RcflCI&~P=CzGUAz4R!PlULudG0vR%R0LEe{0P|M1=EC%yr6d~8u`*=|p$w_@UsvlZ zZR=#TSIMW-x~6Dv^*l)kD-y?oj)BAy+#4VxndrbWgR3Y5G#*%wsKo*OX}KTaeHP)W zAn9v{Bpg4yrTk3*l<9%?fQXHuSS6IowAu=Vq?IDxiVLwZ7s5_OSFIa-x*uk$5$Iyi z<^TX=ND%sVa}2x9k#x}eZjJ;gAJ^s>=glFwYd6P1mG0dfs?+|gWK2cO@OH;cQUoxe z_Y5YIO(9CndVp)$yg<=J`#~`5g)f@lSIHv+V3pMO`xfQl_0>=WwDkcMW&|ktip3Fq zKBx>(M7NnqZ@L5{2aWxTFk;CeZHhqNY`>i_V&uICMxN1!8OAl%K%mbV=KKd=7tGmG zg)aGB0?u^iLPnzC#e>k;FDeLG8Tg0yWjwhLCKJ1S0Osf+({xfq>P6tiD`P<+;%Cs) ztF5{v8Ico)(V~WYXHX3ZiU*DjypRcn=4+G*#np5`-~I<0Tke+0VMKZF8XM@~pmn=? z>e45jK}&j1@~$$!@F$pZEW?>V8*1%>iI`FplL(SQ+$N&lV(2<-X{$*Q#(;S+mE!VF ziM}Z?^3Z<vYRxiPF#DX*Qgn;^crN^YZ%m*CCfcxMy#cJ_3pQ^mM^4ax0Fv{3P38y z1ui5{f$2D;;&c!|3p}E9D#gl4d+P8CgFw>pIQ+p7&^~}^GXTT`52)5@T@36LiicjW zlRRv&uEgy1Yqr@aUhR^P>5VKA0&I55X;r*eRK|u)bs^}swPf+uqx92p@QxlL>TjjX zL)WU#WrfYS^8`GpXN;Y{j3uxV4h=?2kCrh9kCj?PsYn1LuD602nre9_WU(MD zvF;aAjp@V)S~$f8{vRu!`S1^;Yk`tZ;sca)mZNuM>cSdLR3-hu}nis+EuW4)0(RfsOMVs?u|Ni1Go3qT7S8a2~z8vE|q7idX z4q|dw+w|PLpSn406nigN>XLqZINjQ~>-^q%LT^~Xm_Ww}rB};>s zg6@o`KV9_&540(QLfRT?&tRW=x`IdO8U1N=I_V!ZOG)G16Ff3HxKs+u4jOH9d#d!H zQtmGt?j<-(?v9_^0kw9I@kW5DY2Gh)$4?6M1-oeVn6WcQrb$>U*QHu%YC#(Ie~r!W+T|eo(=p3DYcvU^LsY2>SkwlWrVBP#Fsd9 zS^ArA(_8lITj#`dl2Vu zENtRAX!l${MY8ph5B>o^;X zm92GX@03BP;2b?p-FaFR7FxuVa94)2ftz*^>9V5W2rHGd!8kb^=&bf|HXx~WayA%5 zgqJ7TrztKJgF!VIl!N64yp84WiT{rUji5KDI{^3c^uO2BWrxBkS#?9^O=SWpnkRX| z^*c@~?Jc3l0jWv_!rV9g<|K)*i4=UdtI^56jZXG$baLfJ33ZVZWVkyFT6YJM&d@RK zSR!9n$SO@3edq2lsIRfR!x&HkW?3(evH`Mu^o;`01c#`L^U*iLML1Gz7q~pUuhh~V zSsM%o97_o+A%BDo;SMin^Y3*U;v_jg;IoGL7_{xrk#;y-ZyP5pqV+d-{UgmR{V=54<}ck#-CFIcf-kJFS8ksw@rw_Cvmg@4-cE z9Gp98@@~M8o{VeU4w5(5n#!N%0oB~Vg<7_`;GlM@X3MgL%ci>hq?q@$`dXP1*Xng0 zmPa(c94{T*qjSdS;fe<&dt%U5agt$GQCxUl z*%^*f-?>IQ(}wq2o8TeTgq++s`i6;tEInoB*eHQ29$_hTQjR=6aFoqm_|(oWJ_Yl} zJj(<2P3q}}q<_z6UR|6&(rfysX_6*Y6W)A5<6oY31<{QKcPC0b1*F7Y2feuaW{5OVcBW8 ziB0VdP2P`$x!I~2b93vXXdPST({QQ1a}zU0=E=qk4OrB<2Xn6(bE9W7SDVewOP~;9 z<2%evX00M-g1dyd-Sm=pCZB@46qsAltil1x^%j_W)9Msavpy=FHpBC18wLfaJMi{q z^I>6VopuW*hLdYBlOqk$^55kJ*W2|xVeU;K(f^I-E#}UCI8M2=8*?k%mTv87bh>Y& z)5|nEy>g@VrZBh8)IbJFzDY2o$zKV~y%cHUwfwE4+M;8Y6xwRc&3e7F6hLjG)G>-< zi-?~p-o+k%K)21i6XJejJ%a4AcuO7bet`~q4H4z-V`tt%6@gyXt?@OU}91~kvs zx~?ny6Dm9ulHXJK+O*#X%G53q5S)207kqZkaRHG^LXz-6iitGQ~R(P(w&1U8SFPt?qHq8V!KGom*f9w&Me+%P+p zDnP4LaKUI54RG!m+NA!VE_hHNOz@#xlTipYX=LC-m=Pw5*oPf6?f#|Z1!Ql}%a!+D zxUTm09ziW>?{U}Pd$y^2?_uBXpWQcwEz5h4S8~zBgKQJX{I@<$mvdhz;SIr)1EJPO z>|IL@`G`HvBwf_9qb3ZuuHJCub{H^rt)2qQU_wts2PzP;yZD8N*qx$=F>eU~`}3A7 z;xO3j*w6;q4!-*nnbN}zu4WX7;@FlN z?0oN@&@1m)!JT%G;TI^JdmF8W6(tSt4B5 zGy3_!nc^=|m$ta}KYL=qVW*TfU*G@@e6TeIUwQScaL}CKk)J4^B{=h(r zYO(Lz)yK*?c^5l|ZeN}w`Qzp6TDzJ^S_?)CJAg`X zPNuU}&;>AvIU>mtJ)WZWS=T(&O7W zKmIa*WEE$m6E&nSAuus5-LM3(ah`a{sr+Q>+t>i9&#XP#$qCBCEb)Qd<+uQkyKMPD z-jKtR&#_fWtu=S-9Z$0)UCk=71*I_$tl+AuJx)|1<9owwA+v($nZ*1p1@pI*n7;)x zf0YB^EVlbL1%k0qxv_4cT!0ofW+1Vsb0LfE%44J$ficWqrO>!if=xbM(YbtFV`769 zb{NbbcZmSG=}K@sme`KvL#h`7dd6M!uHyTJY}E^qBQxw(ivu z%Eg=1p^D7n{}dy@T^A!@FLXpt&s+0L;$eE0`+}%5yXuV4C9Dh2+v+4}@|B*NY znE9xOnKa{)+n2ag3Rm&BbN<)Y;r!36C+B~|6raPi@NstjPYnkW5(;v|Laz>Q@RnTE zKJ+Nu`i`*!pl&H;T-ezOHw|P-`I#pGI*J79&Nwj?KBA5t(v}c_qD-n7FuOeDB3za9 zz#ZY?aUut9Jij&^6h(=OZjG%mY5v@KZHH!2=)o}OaLw`b=SyCm_Djm~wIQDs<936J zPQRS@-~I~HIe={fSbv!_zvtK7Qa^GhgI3eRJlDLBGsSaFiaA?+dH2$BqHc>?(J&MA z>b4f$0QZyTB`;T!Gq8=?0F^K$06#XJ=5Tv2l~e#&S{#aBadET^cY&Eo32yd^^YjU; z0;7uzn2Y*D+o%AIk&}AJ8Z5cj8LcXBU73O+a5q#?grVkiz(NE?(Aa6gyQBl|Z&FZE zfW)#0FOOn704c3<3>%gMV+RRF#Qe%PrU$6x>`MA7R|=&U+~0i0W+<>bpSXk?L&Y0Z z4?U9g89|5G_sl^c?Ct6!<&3QgNdcjMIAr|vkOzF2UM#ByD>_gI5dC*A7kYAz3yS_% zg^u8E?aaOw2Dt3#1S3V!8d{g4J|--;QzJw7ds>(o&a$Q>8(bAMC(ZF?wFBibg5u1a_!%`jG(_oL+4mvDsK&Iv_Y-2= zw1t>O(U4t24Ebdf4LPJ&iH0mO9OuA1)clTU$U>qasEt;GhOCNJOL1mP)Dd#OzuCO< zH_GIQ!XaqLYD+^_Tg9sdp=)$TSw}-w6Aj6NkZ6cgD4a95%AOKe8*ygh{ku3b$?lFb zv#Qn8*UOyAnx{Ck_{Ox<_Dhk~4Z#EiMuG=>(Q#&CsA-@hG-jvI3E!tUGfuUo0Lz4% zeU_2kO@T>bcz5hz_-4nMS*&oJS#acwNj}b`CNl~tUXjHAve!1i0xo=|=oF2;}%XU2ECYFXA!(#fwc z<-&fxIn5*&L@39ZCFTK4kr)a%rGZc?Qi0>lP=N@g`g>#+NhN_&H*TvZ5od-9o^jlPgaVz3XygXUwQ=FN-@H5c3 zT-ZCAb58mOy2TqS&P?18?KsZNtPp7pTvWqsQF5r3`DW-vLFwD-K&<`ltCm@S4P(~r z>eFRd20m3rl;9_^5U38iEbf|;D4?}exIpxY*;q_+Ruab^giN;&EIm?UU5w*N4aLf3 zkax-^G^~%jq{vtvWRJLmpIq_RCDcB%cCAxf?9x;)AX>+SEpeLQ4vEupBXK`N^Ce(&rP~@iz5+6* zxQvGpCMp%EUMi8>S&LShkF^GX{6$3Oi~F_tzq$?Sxzui13D{fy2W3^grIaNWf)YYW z*%6fegc7G&n#T*Wr6s`I8l2C@7fVmhd{|?+;*NFd0Ahqn*H41sRt81{U zt`5lI=Mvs#CtLx@^#!y5hUcvxP1{jBG;bZjy}=x59J*ktsLgw&(rGLF=GS`}yb#!1 z2SruVQTW%03+8&ePD$2pMZ0k|&ydGR+O%QVMpB@pmW@RVH1$dOR}F-wVxefITdJ-# z6cD}EwZq@>xI!EaU-Y(=tA~SdQM3oCwUH*jmx?C_zCq zD>oK*T7jB3*LTbZ&Hq!JUwh%O9G6%6Z=sYg{-Bxb%=9AvH!@S9;ArW=s9hpEj1+gA z{EotFkX^rS=l1uC+aKgYPPGTIvG#eS_;}|T$AWMrTooIisDcOv-~CSxv5puJ_%OA0 zv)k37D*E;9jOk_AK~odB#FcV#m{+Vejc52`ng_qGrrT9lO0aMG!2cc)gRC_085L=DJL_l%P&tMbNz3CQN$(?_AH}pLKHN;*9AJnpAk`8LIcfUs&Z}yk z-X|`kb<|ceWC#6LW~^vT)~XD)YV8g$Yb?#nQyQeSsAtcoMcuB>s!u9@E5#*qL89a> zUWtF_FWP|VuQMz{!2ov|?tn~+KO{<=qNFSdSr?(!Jo^-tU{u+Z+n;mViuHKd%D+lJ zHH1i@^yb40rP~k>rE{MfQ`SZ9?B#*S%V9}Eix~@JD#Ci6>o4c`$^r?*fsDC$a|Wx( z0;&hL87{vY2S{O~vm}B!Ra9r=|GLr^DD5{x(c&-8BgZ<>wLWJL(I7Yh*H$dNNaC_X zlA|Yky#qpsOmn%4g)=|(hnsoz7O4)LVqZy@>_ZLlyXHRCKwq2p{^CXMrrbU1JEiS# zWXj_14{lyX`1~>MjE;S~xkGO3jA8u?;{msl11c(1wkmCEd9|0E3+hjO}q8 z)x6kQz)HI4qIF`+4>F>>x$p#@55QJ~W&`}TQjI{ZfJ2#cJ&0d&cHlDSbb!rO)jgRG zpD4hc&3Qp$yTm>{$tBEY{I(ZFMfPK|; zj$%4Tp3Ym@DkG*!)2Ta6rz)W2X%39Jz<<*-gKeHX<;=q)rasT76U&s-djw}nvx_1~ zSgxD25tAP~NSk~_9-roSsF=b#JLr`kHDCUbeLASU403!a7jVSQ?qsaKx_dL-rJvjd z9Ju3mbRE}Fa>vh}-_!9jI(~L<$03E$bM+enqaB{1hMw+*nrF2zPwqGFZ>EKLWWNsn z$yk_Yf_FZdhWky5cN(w+ZWh?6xj42i3+$r_fdwUeVh~;IsV2 zs;5zvfl}}0(BHN`XV1}7HeaqUQcLwK0^JFtHvcFbA5v;5sH3yzTverx72BuITDeQ; z4p&oQMTx0mG}*3q=iteM6`gGdACY1E3|^eB4Mn0kG!WSxWV0cA(a8F7Td?3!Zy6@j!P1}A8J7coKFCsFm!=+|YuCbiY+g?PdRbv- zOdD9~7H=#H`R3G2DVfvoktu;pbl4BgkVkJ*)EQ5l^-a0yNd9JoL@`Bc@)OWy6}chU z)S$~r9Xw5l$Q_tX;0v>_fPiB$rz`}*j7bdcuodL8gBrI<7z)tk2zxBQ!5{nST)?&p5v6YqM<^c^aOT1Jom z(LenkfA?R$@BeuFmx_1{d&b9mi=$!CpFT8$GzZsu^>0Q74 zW)Ak?=h-*&_z*vFbLV|>Fy<6v-rf1;dV@EV{7#BbZ}|(4V4j}dQoXG{#QnoUJ=0rm zd>cJJ^vJ`v{Kk9U`U^k#OT!DxRJg%FFFpC8zx|e*dx z=%4i(Dx;x#^L@?f2VYXWnl@SNM;X^@^XS_EFnXpQvD)tWea*MltLLY$#%aa645<$A zWoAK1^lbT0eugN-F=MTXTc05p!KMe6;)7r1}qixEsqRoJ4vmx;ei#8g&l zjJ!Q!D!VsGW<#jm0b`a|3F8xLUo#b!Sy-sudtAK(C(tdO{INpfQE9aJk@Av(W<PkJ&@-vLwyp zUT(P$Tog2Jw0vp8z`~V1#1Fkh7Denc=Kw$A4F*8zO zE&u-W>|>98ga}N3vd^t_pnlm6c2zv%k1kZ>);207i$NWyP%#dfOXp`I{nCqYFE^;)gU}1pnt8nG!BllVAQXdZ}=el^r=WEqJD6!$EI&lF)J$^u`%Ndf9-X zHwTtsvYJ)aQ`1HIv(#q;yYW$4XirQJo**?zvYMbR55SRxrLUK&_D zi?T`lrA!uV!F8Ea?>3=$ZU|(Ly2HDR-ni91y>Y9V-ULZq{?5>Ivb^E&1r-y#p`g|R z<;2^0t@3Xz1Tp){#s=Jc=4~Gp&|+hdEz0uXCl{-w*xS-W2jozvSlCpD*IysCzu`kQ zgWwxYSD8Y(_#i(J11p$sA7Jp}LESyL| zM=+a8SkAxYn9esfCCNmxz&?G7F$G(17_RS|E5MAs#abb^b0}uC5tTT^@9cS<_Cm0m zPk|FaX~QEP=y()4rp`4tR6$^$z*=`eD*KX?93)Y}F2d}P?wHb(I0sza2s1cR*P0U1 zS8#}&6_gUu^VwO^MceCcl}?wtULtyz7GIxE10k9RnNDBnBPF8uiB)M_vhr28o~fLO zzDl-bs!WOK`AmuE;lffPdTWR!63RpxV-vV*k6yNFy{lC`645VdKHcsOb0$t2bt?1I z5i<#-Vz_o0(3{QKcp1uMQb`vr##;XiyEz}JlloxQ&MPG!Qy&{DAtasLvHRtK<1F&I z2Rgb#xp;&{S*}PQDb$IBI-<9MMz3_|6%;SNwJ~SArkNHJdeDXT)mi+v@sM->S(vQgd#}BLk>LIx^GsX9Kqy% zp2^o6E-?vg7a=AgH`|#x99PMYEKG@MV00|wET~&vXX6W z8v9NS%~%cPbObqEC|}9vl_qUPKc}x`$)PpPfA$96AsQm^@oW5p%|-oMX)L5r$z(oo zr$w2I;BxfTTn;xwaIy4>{Lj-+=x7_!#D$@o?6t9;+sKWQjfK}MKe($Gn?KkryrKDg zbY!SS?f10(=#mTUu5+~+EYHfibg$j3`M_#TdJks-!=#?tWkS1SpdHP|EzK~2+If-` zJX5B%DVG1rZYspgJ~xEu$4A)#?@~tEy9}Z*I3w0nmOkO)p)eckHvOeCBM(7^am5Wz zj-v&>qchp_E?K^`JDU%F!ulMelXCh$$jh|(1kVuHhc;(D{M-Dv#2+QU;+Z(SgzvmD zqNVv*Oo4B1SZiz4V%n9UXkkMWOxk_h>J8HPHog+BoaB?O%SgaHw_N6nJi9Gv} z7FPn6RuR|-wCuvCU}8|21izHENcNlT>iEVQh|>bDtW^UN&ef$XO-$_&FDrfK{Hi}I z+p?1vxy}e?ib`N}Hq;U=DtiJL!JH2)Q}_AbZe#M>&s8?^{}3e@pNpiW&q2}TCwOsn zKNn71ehnAAqweKGgxxtV(2!Sgfla)-#tV!dKutg?BVkiQF zBG`zy3evhFzzEP9DHEEKnJ~X=BEBhziXWg)Il71!XJIx4@IprJabnOl!_KU9PF~tq zdS4S?wFFjof;G=@m2;m>t zF{eEu#Bwf{Z(j1qMoT=EVEtgOXT^Y0SHYY!s+THbpH|uQSec4?6NjBXPn@Kl{N_Vm z+;=PJk@r9-DKfV?A7O4QJsG{UH&#*9k;g=|otJwHFAF0p5ZBS2+-lt!s-80X2G_E(60)xIl6wEg?c8>L_~wh4A_&RvnUtvLSRl3fBe~`IvKXk6ivL3x|Rl z>2##2nSLckfn0w~ySxJL%nns&Sxp|@G=G5r2wDH;*-Q_n^Cev-TAGRh+Jea#7ETqO z4ASr2H|O9*kQzOkpKQv9=GTz9VX406o3lz>y>S9z!k~||;F`%TS zv^qjsZ1riW`4Jj@ld_PwqbJda;9_cb({OX}Ky^MPBVD17qlfO}5Q9SrH!OhA(NQea zFL3X)%7^%q-wM|p;tx%!3s$s1h+(8?t)wqC+w5y8 zCYdY}tk4_nv?bPtSxjQ^5)Da+UDCplTTo)~0yT@ysPcjRIM##Gtnby*T($!q{w{Tk z)DnWZX>2zo>fn4#%{mkVrKt(Vl1gj|I5ii`!~n!6>2%7ma!N@pYT9RYsg)kiRjXxF z#L-yVH6LN=0%}3CIgS8rVWcW1MG61JLs4Iz5qJyFNZ1d%8BsPVJmga@8_FlZ7`MTu zY7;o8@pLNZSj3yYS}lVGGZE#Cn1RMCA?Acbgl|C-r2H~@#37t?JWly#WWuVaz->@k zWFg^#0zeT7LS<{-w9@DdLbO_Yrk zTd!78=JZwil5yx9a&Jn3+tWbj1`r?UP~HZ$sgFIVY+Y8p*i$qnh|Mu)*U%?5e{MdH zcyGW%%n^iUuJk1~WwZFW*2+QD2nFYsYfNsqxdHUeWgAx+E~g*?TxwLMT#f;N;_S`r z>qu5To0I-XaaXHC@>^V3@+lX5)mOL>g-vEN`T9z=Cm_@eE?z&V0fJQl?;>J>Ha2}+ zRaYslNwXqlReNbMZQfPpjMAs_wvS?b1ojOIDkElHFw1?7Rteyez9(&E8OBsfW{DYC zx6^15TaYGo5fMA4M$;4jOW^s4NHQtOD@l4uW~0|Qp7=?U*z_dHX4NO{Kh0U|NvKO7 zNjOuHix7zm66~Jhl>0}1lt{grABZqWm1^**tQkeH^g;JlS<}9dflOML;+6z<>VuxH zar>#bwTS)6iXGuPVfU!=t~n0uaBz~+La3AS93d_gHY~1!X^1;2pcTU`SrIb=T=4U_ zbAe0BLpZa-#bHvs*#bDkNJ`&2oljH=ta4PMji%YHL_b$Gp{i?fUU8zW)4UWRed#Fi zdUaLIg@vY75c9+>afx2(!@||k92vcosHoa4W>prmcq27GpI)${xu!LNYI>}=7Xqgk zmZZrP`XYU@_1NG#K(D9aF5&z6^s)u?%J@^NZ9$Kw`NO5!v}QSFs@LMObGmoxkCZ@K zp5|k~2_(q%2toik?P&Cg?L*#un4$t7_RL50m7wP<4+A}?_<@|h1A3&LK{+XqMLCct z=%D#3Pske$AU0p-)^q|e5g;pqM-bXPVz7pPYrlG&C!u|4-pTEWsNgYf$*!tTK0{q> zdEH*J(!!h((8+U0saT1D{z`$`6#68Eoau-kYWaaPgU@Po(5R<0v=0)d`Qqvmx_!jA zAJgsUh%tY$$Ig#0S1`;ku0F2MxL!jV@*_Gle2~V$ zd9rM&Qb3fA-~DC}%9PN)2S=hO?|!q#6b+Q$qwjG|!mCct$zQNVyJn$c0#l?XY7z{Q z-)q*NsuCVz{@%~XOboHAJfTrCadUn11W@+=ucB)`&kw*Dd4+>R6bD0x2F?48biAsn z@(HTcSJbE|7=iuQ9NJEWfJ?}gD)1z~h^+1=Pc`v`tEEfHa~Tu$5;~k_ns#m@fyCc*8Y2POYgAQ~go3 zb6n+5gk{T67}JztP4tQ?=@@R66;3?8jk^3Z7`(>^#b5l{O?fUR9+IPuNpucBUTDH)}A*$+m5BJW36~J0|xN z?m$8iTg+=Qszd&AhgUMBDTM%tK-C^;86)LEjFcNjYCq~ybWCP9A#51)s^^t_g>QFx zCF@%g#JV`&Ou{P}gxGo|GrMZD#^Z5t{pxZsK3)ITr6KYcAt@LEjjtb{?}>;@(q_uoR+ zN>p+8BV?4Fr_n}$5EoAlXUNKFo`{ zt@k7O)pL`(ZNc5}fP4Tv6afzheQS8w`K@ZDz4OgL@F4rELqgQ(EVWr<8TbPYC!#`J z2CmD4*MyyD>#)z6-rMJFcO3~H{9f>&{o_3(0U9_MooB)ThgYDOLEB!+Qn;=L7MVsV z*<)eEZ>#FLFJ53i>t>3tc-`WNcDU-V8Skq3qhDb(Lr0+iP2#()UAme|jU)EdIV+=Y zMPK@{7c`S99)unH=#y^roh-Fsp=Jvul)+sGLoTi@*F2^#mLRBj#P}OckC_@?zD+O5 z1jZhk{*Ck=!?y}f1WYSBSsZekT7T=#*5UXLYCSiQYu6O*t)3@I7gB~B40e98S#|}3 zsd0vugUSp*JO`D5NjtC%0DDjwO^A&bT6JjdRY6k3mo18_0(AZ+P=;8?klm8+n@iYw zz7^KSMNfymThx&cCxF76!^n|eHtP5h%4+0 z%?JSchuRh6v@5(Zfu*|L83$FocV|SspihBXEe^+iIf$-V69EufYTVLr9Fm@1&aHKe z*P2Kr1OTr5w2X-ic#{q)HU&x-?zTmFi4E|EvGPb;$qft3bk(Nyxm>k@`xGa6<>?I2 zDEESfx+Qs5EA53k94JB|N>>GR5rNr@0ZjtnFs%LU5#tx8>_-!P-I&f?z>0axvhbtLA@?}It>9`*5~ znuwFyrJDlm#pz=<2FH*3BsJ!s?d6IxiJM~7BL85&O(EdTL?FGDH|tIIXAsCE!s~u| zB=9K4}Ms@51n^yzhJNog5>WB9KH7%3&wCng% zu4B80Lk0)$5zH@XkNmM`v)E9yrYhN=2)!8fj9)- z_`otyI?D7Z6YR#WCt?A2mI3B>KG8}Tm_@6f9@BYvFJ~cMX-7Dvna&hWX(jXFmgzhk zd+Kn@bUvdG)t>sV{k@*{_lb6Y+cv!3XMor1^>%-sX!~*^`f?)e@Aa4x3&uKD6`5PE z0Tzs5&XEWM_hPJY_%=Ti?&TtJPwy=lbCU&QLv2qm9tQ3`=v(97o!_c@8am(TYzTHk z*(|nB#VoMe6z=_;1YcGrs7*C)P7sw**sR$cLQGD~gN zz`+-_BB8o+8SEsjs=}mzr{_a;rT5*6^y+9=g!fimDN<-Q>{wz@I(}V<8e)nEWu;Tm zSnlRs(wlJS>>LKdoXdtF*hyZY@Q*?e>7GDg{o1`*=bvl1Ooj5il%iqsnE1l@S~<9S4>H8y;AO zaUWQQsW_-i>);@Tp#4rR6*(gA7%IT?^J8eel)*xK^*VGq}~_r>&U5 ztrl0JW=vBQ&uW)VH8Dj}7;49`Zimvk9dFl7ZZ~K=d+T-xFP*$@$J*OIm{h5^QBB4vED4p#>`qZnS<=YW=#~G^*dIcdF4Na5FST_fJz~+*BlhZO^@zOp z=Cr%nVjwJO2M4%1w0h-aZC7jIVwLpDS?j0BC-$+tQ58NVz4AiRD-*za3>V5-F@OND ziO^F@>nL@l5EsRS^z_tfWo|MVg7xHSRx3;Em|d2or!iZ$kR#;4U*7UOzp^^;3C$fu zCrgsRhilTnz!2yGfsb69?~)?$7mST~lAt+o1ekcIrjCtzU>P>*L1kKI#~LW!!-PaxwKTBMt)XILV8a%Zftm9*&FcH5cAMI_F=0Jz0vHe@ z#t=@76a924wrSwX78iM&id3S36Z7KTXy%12Ibp<^c?pY&poT>g)abpThMNpE@wBt@ zK+v@t5Bk=-ap$+Kg=UzoJj4C0JilXzYOOrO{%*|eCQ>O_GpSU^wWHN8hW&M58Nm6VGQ1BOA=@T6;HpfUp{AS~>@lh8 zn@)qhDg?6HCsnKUYD=o7EvcHu9>8H#`~h8kMjz@kQB74a=8o=_h@wbXsj(QIGHO~y8(_{kG1eD z60elclf{uDnzM(EJc>9rSiQDi0)O`w2;)0G8_nPPG2Dv&sc4Zb=I_8JZ@?TXjTak zyabcPC;DF{U=za5MzG2&PKJ>!-nvA!HiVZQ7Qw+w6_==HxNfKkwG;~>+rG$+pExMi zPgv5KIA6OPx@Y!=bv!Y#c2GjPM)S$9kd1D?!b;ycug>}T*gh20eT`077CxnY9R-}5 zo>xW{!ZY%Y`+D?*QAS5R=xsUcCR+u4WBczvH}a6ypkoMNfXfvV{>;SyF$lfojr?>z zPVM)nUzKgmk}|||ZXag?YRnoqHd(MMfa(u7tfC7;v!z$m@U%L?!+09r7t=L32{>3OMV83&1J0EkQVo0lH6-2?){ z+($pOD|D~7(#6nwZaWSN2!V7WttGjwqx=Ir))3K4jmiwmB=!+ z;qn=)%Mig*`C;2Ju|N7QI!4)aU-<>tFZkbM+72bN>&#`ukq}eXoD;hiX1}{deD^ z()H`Vr>?*2haP(M_t)QZ&ugiM`u_7`S{&wjH`i6J_rLbL9=zwlA9~UEKXmVlzW>4R zev!Zak01R0H}U=$@BdO+6pLKH`<~am?)4AV-}m}^U;8~jR6q2ZSJw~R^Sal5cm0~z zzy5svJrBPA`{<0HoPX`>zL)n8zWSbfpP-JL_GzOnM?0UU%r%sG8~@Z!{{0uKqIf~? z_kYUo>-hcucXuV=aa2dTuQ@f6Mm{9llI^y!E!mbvGty{gG_vJGmMnp>Wy?o=G3wE@ zq_O7^b667R$aWHLL&%0BAFR!K!5rbpW+5S5y8#lC4aa_5AqU3?A^U9>oDIpc5YYbh zx?38_cKE>X?Xr^;uV24e~TMJzs#7aPx6!&PDn= zBpjy46$6Yq)J_Rt3SjD__tTI!=*8&7D3($NL;KVo%%w*ePMea?e;z}mN$dyu}895psh+z>E8Ex@WY9^aXVC|KJtfo@Q6dNO| zvN6*do;a4?cn0I}3fkI5(3cFncOQLt@rk$?b1jw=_>1Lqe=-}3$YE7pwp@;>3Arko zmb;Zqx11h`(a;hRb%?#Z7Hw1C7a%P|8bV4m>_$rSYsO*_jq~YQiacXOZ5k8GsEszT z&z4MYpq0(?Q}KKv8xN}~dC(aCd1@+2l$8_7L=DSih6hv~E0avh={QzS&H#x`OU@{% zJ~bmx!iv$`lVe2_*lf{=9EtX!h2CT~5dnGRbS8zB)OX2%l1i(1n^F5PIJP^~_y8C~ z!&>ZeasMGYIV=yyX{1eNGqhX7)Lc5q_7^P!RzVJ`10H+}eUt-71<*co z54qiLkGsxY@AkSI+&;J89dI{#+#Zjo&QtI4dKx@FkKYsUG}gK6Jau(-^>yC5hB{xJ zzb;VMSnsa))YsM5*L&+5>V5V8`apf7*X{Lq>%8?|ueZVL^ZLC3Z)1bI!P8LJP~YHf zXlU>?_!|NZjXt-}y_1$>Qux8LKh^Vj>m{szC#@An7%jRAMS6Q~Q+ z2fTrXfG^+=1OknX7-A#3Z$#6LsMd&AN;<8km^jvia8O>-lTD@MX4%uoamKvg!UB+7 zAQ~GqTZrdHfJ(qgNvCaJ#CmG9yBGqHWTuh-8uGOFPNdV0E z2T)%rB?0bFV`~^YU)K3kE1~_xnjn@1oAzb;nTkf%9tIMScW@}Iy8Q>MLVnb|K%UI>bHk*Sl0`G^(RjHN%Z4Z9laV=Zyem| za=CVsFx2-mZSe`4pJ>|6af_`^j?OPHQli1t`o0aTeULVg(nQ)SdRQzE_Cr(WW_% z6`!^4!@sy{SM1sydgI`gS6%as+wXhuhfh5D)K7o&=3AqjR5E3;$LkL^E$=vU_ra@B z_`L^z_~cKYe&)@$IH|CRl?Izy+d9rXC!!v_=G!+t_4G4^C5!Q@W82PM=Y%5amDk*k zDo;H1>YHyJFDz;8h^V=P-+kzjM_+j9_#X~@_41>)KJw@jKYr$wU$$TW@Xw!o`k9XP z8@6pfCv@pmhwi)ofk*%8$sfN|Qd+ii*Ps9Es(CqPy?8_=gXb zmd%;lws!r7uk6@$&P5mh;}g%n@T=p0_){uCyEYcI>oRi=CCV@4TBx`j@X*-Fo#kU47Y~JoW5zFaP50k4HH-mWa#vCAPSaf5NVz!E%1gD9SF(t_#cV0DcNR~vY_W(^h217vMGO8aswg@nlUQKp zi>8~_Tgoll@aH4T9Gy~&SR?XMiMiMjlx8ms$#H4V!rV_x`|lNJnfHGrZnu=$X4s}V zraAVQ?dDnL?UtpcHhVSxy=q?c6jV#I%mrfZE)>;z&K7e=t;@t>ahWAxU257tS~A00 zTT&y=E1p-JyF%K3-OPgNmweMyYihCxMKf%Kyr#g_oC@QF^76dqgZ3iwik3{uLWu5=<70V720J>X{1QCUEj4!W7fgl4<;Op-h-r zSYeuNoy#xa_egt%d&K*MhlFQ@=Y;1SFW6obUJ_p6Uo*Wfye<7sct<`iy)S$qe#kp2 zo0`{eICS&Pe|!Gr*M94k?>_jo`^*-bZ+Y|9KR)}MG;M~@zjfQicier?!ws)Z`TC_- z-8{yO#Ea`UMATjPKTuv_vDyo!mH8Tj$8LZ57dHRZ*BrCho0@y0hrUsg3_beJyF0?~ z{bjUk^Nrtj)mBz*x#{qczdL%{vF|+i(BtL;$Mo636|Ea@z3pFqe%LZ|*8GLdE8hP7 zyQ5D$DamInTvSyb2)3WOuCr^)R^q+x9<_IGdg#K7FFSh2J@-EL?A`Yyl8;<_&iwOD zqEsXHihQjrw|};LM|?9aO=87XzPPUNz_)v| z1-ZvBTh~)~(CsWebjSX+M}Dxs(XvF^WnN@&vsam>?!R}ZdY05^DOpJ@aozjYgD))S)A9;4k{@>>QYw5hbHQjCUpDD%q;}`b`x?H`DpYlz*mLhq42qOp@6OA!rv9 zb)v&N;GfrB~@Z zzURos4as?%ZhGj*Chi%fOMUK07x&7%&D?9RZ@K#oW!vxHoVWei-yPX5bMI_F&R@KP z8-S@=1BFGv|M>O-_jD((LfQ!eFP*{9Dc@NT#6RviL*i`^4yL8zGV78VyzEB>$qK1v zu?w^LAXS&FK(Pz6ctL1{6p`?EjYWQrAR=@Dc@q%$X+kMv46xC*mA8m?VGiGfx(?K= zLi1=rNCRPyij1{A=~+^FrVKiN`j3y zi@yXBFj@<>C|J#Qfp^dKNN(g!e3i|CZ)SlY22hBKV$doG*Nga+(Lx=H!jmgG{zvmT z@k+j1=FCwzk$BvEb_&n}F!q^(iN8*mHKmYWWSv>y65W`aAXM@#puB*OqOE)_UyoJ= z!Gw7)5v=?>L^d7hWR0)a;T^z~~1Od;;DKBhCfHmsNX z6&M+EPcj}?WTiKQF_MuTQ_>mDn+7$QJTFQrrNE(+lHrD^l7CBjiK$aHkotI)y6ypiX4Lwl+!Q(lYN+7HI(;gPrnSufvgUJ0Msq(hRlB5 zodCCtnjpnELN19do7-vvt_|TmYEMSqs}7HA^O|?T)uDSRbP0?(LYp5*LZu!nB6o*@ zra4E(id1rAVT9_rS#+wpT89SE5p~^YrQEXT2va0ikXM2&*3DUiB5 zlgg^y)pB>Q5=+wqh>EufutoP@>xE`N)<$J@B|M+3V&#REdG&~}gX46StJbu*-EZWs zUDMXqw)oRFk6~5rp4fVSw6A|c^8u~-)t}rvwHBn-Hnh=d$H;Y>N)x+GB;84h^%Xry zO*nTM2b{Fk7#PXbl1yY$$ynZ!O>$PbzOX$A6E2(37>O*ndrO^MANC*FaO69L9#GQ{ zpTMfFmX40e<3o8>nUmRvM!g&G?hBO}7_aV1;kwax82w!cAU}qYAHj1qpe31(C(~!A z`$+8cWYd{sJgg-4t_I*`7#>?Cj-8%K!#>X>LrNr)Qq$>eKt^#-OjS~N7ms2)V|5@Z z7)EvgT9T?2u+n(6k7Qp$9SqU#4MijIH0*wCxI`w30{vw#c?)AoSdFPeYEL$!YGWk3 zob3J@fD2&cYw_#`bdv~zo8k5uPUcUqmO1YGcotB03@Oa>v6St$?(zKdC?|X0!24Wy z$m4RmJU%y*-(zc`4#D*dce-}1@E-czfqs9F$&jDPkX}q+r-$QVa5_XvZ*LmjTueGP z)5-jZIiw`}FGWi8YBdC@Iy5F<`;~nv_M)#QjNVdeT%qG9<>HQ_&eFWTnA-;Vm+_u_ z+>_hhpu7DwhYXIko@@-hd~9^x0S%h>^k)-$$;X2K4`ef^Nxra>R()Qaex7>$_=_;! z(EKL#voxCh2xBGR$-MbzELgaxvTE^?rPVcVPhGvY!RHS&u3WXcWld|_+V+k!&sul( z`p%7;x;DdT+rDFGw-WA&sQuABdt>o|b5j%XHt2}kfXVQB`!vi%61eG1cHiL8@Ok6i zEUk9co?Z*C+VR#tOG}@n&UlYCq0_6sw0889ejEi4n9LTd&0gRb9W5*>c9u+;I&FHX zR6{Pn(lwKemi{+%aMHv&yykjq}FD*?Swll=B~-u0DLn zq*;&8S3{UQ>k|n0B_c!f=;){9{}rSEfA}A>A6@Y&=Rf*?eg5)1+_TAmxqvx<*?VRRx7%P*TiGzTm{T*xqE5?90AWAmNd66h3~z7a950mqac ziaycRp)XX&DLX^caZoskuN}=e1}H<7s!(@(#XF$DgV1k`9Dm`e=sR8 zLV3<_&oL=KeNx_o`sAxL`u8GF_gO~19eJ{OjQm;1liq9OL&#HnN=JMknNCNsG(kBI za|B^Qv0*qjpwYU?Mh|FurXB_awUa5#ObdnY0d_TR0)e8%G-!9Z>C6Hrw>ht`qm#z+ zedI}}KDEA!8%-#;xXoqGAFbK(vEPKcq>pZb%LjbIToam)h@1hiQ5I@C>Rk2Az|g{^NJH*KKOu|**YND_T_4Z*buN+!~Xii)Ik>kW}o5w00{4glF})ZR+KDu5!di6Zs}zNb$L z3&Qqe3HO#BA-_6qur?wowh&E4?ZbwXp}Tv~a*1_Iup!x`@}?>s8!p zMCoa4P~EkLKYu*FN%uj3Uf*2g?rbE$%Mjn0*7LU z`j8UMHC)570!fzCkS{T!ui-DzW8`DlKNJ3MtXisI!_`bz@C( zD^X5!T?>am3Nd#EQM>V;V%Ijo<^#dyfoz!kfkrVmgmRKGTT!bws>cNCrPrg3#yP%L z#tNj9*;J28YfC&yu!exG+v?#RShf7JR+Jev^WV4OeV4v+Di%j;HAD-@_{L~^E%4ym z=pcs10v_l^F`Sa*NKA(Pskzal$%DehwUHz%fvX$y9Pch1&=FX5tupz+**;h(}NBPFy$E!i2HWUS)1sgR!-}XKX(1 z28@CB@oh+n|MJ&(d_0NBmc-sfa&UYzzYKihJDs9%nK1qvCcmZSZBw7D4_JTB}z)TcQa^})CB^e|tx78Hpx_fjV}GY=;n?Mo;Kh*b5s$;~LIeQmS> zcYeQK#AQ%MXXAwZg8bEZPkx)#N(L@>l|>sK!#j$z(dUS1v-iyHmcP#HfTQ=NbIdS! zR*CEHH1=s@A)WfGE@Q+K-nL_$+6y)c^oN*M&_e?7fR7hDxeo#F118hGv-M!K55?dVWau}L%qASgrK3d&BGCetgC()=djGM$0i zT846x;Rc>&1%PdmIE|Rr1_Oa%k7u=x63Gya7@Vw)Y&;)Pv)Yc%juXUaC5irMZ(oFz zXm*vJ-i(y=lsk}Gklu%s_<^MJdw8bx*Yz4)?rAur>p1aDWo%a&G(f%r?`huikkY#9 zlNfuyOmAZ=$_)Kz8=k)cI34|HJL=Q#i_nk0hcV~tNAV~$b7(ESQ5C_}-Q7;NM%%ea zssBipJlt^S8yI-!Mj6GQ8#ww(L5e~PN@UPV^_U_d18=jAuOcNnp_uO5;Lip?wb$#V z4Lro6Fka861Nqf=>hNi7z{k-R*?_01r=RG=)^0nQ6Z?JiLF4-dpc0TJU24pjYh@yPx$%BM}rldYLw zUWh#HDFfdzsT@%g41e5~8^48ES*OV#qwW&mk~}c-O?ute%AMR{KsP`JyawO@VSs)Z zF>Q7?>X9s?{df-Gi(I#RF>YEnFMw!Cd_}?Vq^Q!T5hqzW%~+)M1-?6zZo74QC(5SH>zdYV3d&pQ!y(OaKoP-o*UmmvfTN%*lT0anD*RBmQKM)Cyu;Ne z-I}HGMbU6F%c2&tINQchae0OX1|~dLO2j3vOG5nNjuc)dd9A8_?4os`X@%Oi5rlxA zj6jA#6;}87NsX{@ip+>3fD91~G6j;+HJjOWuUb{tQqDtBq+AaZ)NgE3j#4G+`AkmMDz@ zL&>X~cFCI&`H)KDjyA(8v#&pJ5f2@g!b>nvnIPgPprMWlP?YJ{rjA7LS21D}MUrzCx` zLbtwyS}+SuAxYn`wxRrsRz7kn2m0%&_Z6l-X_x=nHDS8!E=P& z3vmaAQ)PpHWZWhz4jvNA(4hf4zX)!ru{1I zw@fsy!pR&>AliYVCvZ+scmpj0=uB7gLolupMZtn0`jm7i7L7;YSR059hmwg+lx|2Q zR2(qSdm#$oID(d}#K80ER&1vXY5Vx%F2%M?dX@16p9$Odn{*95t}SaCEg_DB95|Tk z9)Kb1iHBo=IN-C&dYJg^2hx1*vVK``qO8{~19=O?q^B-`@4)058U0=lJUUx%M@svU zxsG+gi!VfA%Cqpcw45CvSF--4k9!CqRc()W|T6dv=l-e5|Qt3Oz z_s}QN{R{w|zb%Mqi>QfYTnoA3GEJIIF^rUaEF=v#lAUKTS}2<6O^#)Vv+(gImLDGl zrZVtCq0SHVHvR#ri2MymNnYJLDZO7WH{L&@=ksX|Rg{rhTBg}j(~uIKX-rX^1Nn9) z#1~hEa?vx)Fm-9XOIQuRdqrz?3{#`Ve zLp>QlcIF7+^W)k4dj>x}b|NlZbWUWf$|QIa(RJZrr~-_ONrg&hLcO@Nq;otH zQU{Vf{p>&Iuh4i}MN0eVs{n(}U&Hg)0jERfOHiMFUxds)jxql=-@&?-n(tsIQtIFE z3mCqIe6K)E$2}h@&402_fYkwW8hFseH6o??w34n)ss7$byO1ZDW*B?geL9`` zxJ}oUwGMUyobAnBsyghFhlU~u9QFmWK-6w%kGoAg*UJh1D` zU=YM%PbZF$4T4P-C(p@;IN_8zIm(2y2XUNOUy_>ymjNyZTmdl7UBl;lL5p_gVt&0* X9PCt&ezbS41Y89;1Yq=IvgUsPY$F7L diff --git a/wasmbinding/testdata/artifacts/testdata.wasm b/wasmbinding/testdata/artifacts/testdata.wasm index 0d4e8b5b4f925398d77d55e3700f7c73a4fac168..089e18c9f1e20cdb1e32d617e403341f5c6c47ef 100644 GIT binary patch literal 165873 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

Hg9hU9&`LW5-3-viz|zR4w6}? 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 l09ZV2#kek9ZrE&~OCkxwkm}Kg Date: Mon, 24 Apr 2023 10:33:42 +0300 Subject: [PATCH 40/59] fix: Make testnet command produce addresses bound to the host IP (#357) --- cmd/babylond/cmd/testnet.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cmd/babylond/cmd/testnet.go b/cmd/babylond/cmd/testnet.go index 7674163bc..d01d5c048 100644 --- a/cmd/babylond/cmd/testnet.go +++ b/cmd/babylond/cmd/testnet.go @@ -156,6 +156,7 @@ func InitTestnet( babylonConfig := DefaultBabylonConfig() babylonConfig.MinGasPrices = minGasPrices babylonConfig.API.Enable = true + babylonConfig.API.Address = "tcp://0.0.0.0:1317" babylonConfig.Telemetry.Enabled = true babylonConfig.Telemetry.PrometheusRetentionTime = 60 babylonConfig.Telemetry.EnableHostnameLabel = false @@ -166,6 +167,7 @@ func InitTestnet( // Explorer related config. Allow CORS connections. babylonConfig.API.EnableUnsafeCORS = true babylonConfig.GRPC.Address = "0.0.0.0:9090" + babylonConfig.GRPCWeb.Address = "0.0.0.0:9091" var ( genAccounts []authtypes.GenesisAccount From 9395d8b58e77071176eabc289351a97fb1025ae1 Mon Sep 17 00:00:00 2001 From: KonradStaniec Date: Mon, 24 Apr 2023 13:15:17 +0200 Subject: [PATCH 41/59] Version bumps (#358) * Bump versions --- Makefile | 2 +- app/app.go | 14 ++--- cmd/babylond/cmd/testnet.go | 4 +- contrib/images/babylond/Dockerfile | 4 +- go.mod | 33 +++++------ go.sum | 58 +++++++++---------- proto/buf.lock | 4 ++ proto/scripts/protocgen.sh | 2 +- x/checkpointing/client/cli/tx.go | 10 +++- x/checkpointing/types/tx.pb.go | 3 + .../keeper/proof_tx_in_block_test.go | 6 +- 11 files changed, 75 insertions(+), 65 deletions(-) diff --git a/Makefile b/Makefile index 54ab1a201..272a682c1 100644 --- a/Makefile +++ b/Makefile @@ -363,7 +363,7 @@ devdoc-update: ### Protobuf ### ############################################################################### -protoVer=0.11.5 +protoVer=0.12.0 protoImageName=ghcr.io/cosmos/proto-builder:$(protoVer) protoImage=$(DOCKER) run --rm -v $(CURDIR):/workspace --workdir /workspace $(protoImageName) diff --git a/app/app.go b/app/app.go index d337ea939..95fb690af 100644 --- a/app/app.go +++ b/app/app.go @@ -13,7 +13,6 @@ import ( wasmapp "github.com/CosmWasm/wasmd/app" "github.com/CosmWasm/wasmd/x/wasm" - wasmclient "github.com/CosmWasm/wasmd/x/wasm/client" wasmkeeper "github.com/CosmWasm/wasmd/x/wasm/keeper" "github.com/babylonchain/babylon/client/docs" bbn "github.com/babylonchain/babylon/types" @@ -103,9 +102,6 @@ import ( appparams "github.com/babylonchain/babylon/app/params" - storetypes "github.com/cosmos/cosmos-sdk/store/types" - govv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" - "github.com/babylonchain/babylon/x/btccheckpoint" btccheckpointkeeper "github.com/babylonchain/babylon/x/btccheckpoint/keeper" btccheckpointtypes "github.com/babylonchain/babylon/x/btccheckpoint/types" @@ -121,6 +117,9 @@ import ( "github.com/babylonchain/babylon/x/monitor" monitorkeeper "github.com/babylonchain/babylon/x/monitor/keeper" monitortypes "github.com/babylonchain/babylon/x/monitor/types" + storetypes "github.com/cosmos/cosmos-sdk/store/types" + govclient "github.com/cosmos/cosmos-sdk/x/gov/client" + govv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" extendedkeeper "github.com/babylonchain/babylon/x/zoneconcierge/extended-client-keeper" "github.com/cosmos/ibc-go/v7/modules/apps/transfer" @@ -150,7 +149,7 @@ const ( // The last arguments can contain custom message handlers, and custom query handlers, // if we want to allow any custom callbacks // See https://github.com/CosmWasm/cosmwasm/blob/main/docs/CAPABILITIES-BUILT-IN.md - wasmCapabilities = "iterator,staking,stargate,cosmwasm_1_1,cosmwasm_1_2,babylon" + wasmCapabilities = "iterator,stargate,cosmwasm_1_1,cosmwasm_1_2,babylon" // According to https://github.com/CosmWasm/wasmd#genesis-configuration chains // using smart contracts should configure proper gas limits per block. @@ -174,14 +173,13 @@ var ( mint.AppModuleBasic{}, distr.AppModuleBasic{}, gov.NewAppModuleBasic( - append( - wasmclient.ProposalHandlers, + []govclient.ProposalHandler{ paramsclient.ProposalHandler, upgradeclient.LegacyProposalHandler, upgradeclient.LegacyCancelProposalHandler, ibcclientclient.UpdateClientProposalHandler, ibcclientclient.UpgradeProposalHandler, - ), + }, ), params.AppModuleBasic{}, consensus.AppModuleBasic{}, diff --git a/cmd/babylond/cmd/testnet.go b/cmd/babylond/cmd/testnet.go index d01d5c048..da40b4da5 100644 --- a/cmd/babylond/cmd/testnet.go +++ b/cmd/babylond/cmd/testnet.go @@ -87,7 +87,7 @@ Example: nodeDaemonHome, _ := cmd.Flags().GetString(flagNodeDaemonHome) startingIPAddress, _ := cmd.Flags().GetString(flagStartingIPAddress) numValidators, _ := cmd.Flags().GetInt(flagNumValidators) - algo, _ := cmd.Flags().GetString(flags.FlagKeyAlgorithm) + algo, _ := cmd.Flags().GetString(flags.FlagKeyType) btcNetwork, _ := cmd.Flags().GetString(flagBtcNetwork) btcCheckpointTag, _ := cmd.Flags().GetString(flagBtcCheckpointTag) additionalAccount, _ := cmd.Flags().GetBool(flagAdditionalSenderAccount) @@ -117,7 +117,7 @@ Example: cmd.Flags().String(flagStartingIPAddress, "192.168.0.1", "Starting IP address (192.168.0.1 results in persistent peers list ID0@192.168.0.1:46656, ID1@192.168.0.2:46656, ...)") cmd.Flags().String(server.FlagMinGasPrices, fmt.Sprintf("0.000006%s", appparams.BaseCoinUnit), "Minimum gas prices to accept for transactions; All fees in a tx must meet this minimum (e.g. 0.001bbn)") cmd.Flags().String(flags.FlagKeyringBackend, flags.DefaultKeyringBackend, "Select keyring's backend (os|file|test)") - cmd.Flags().String(flags.FlagKeyAlgorithm, string(hd.Secp256k1Type), "Key signing algorithm to generate keys for") + cmd.Flags().String(flags.FlagKeyType, string(hd.Secp256k1Type), "Key signing algorithm to generate keys for") cmd.Flags().String(flagBtcNetwork, string(bbn.BtcSimnet), "Bitcoin network to use. Available networks: simnet, testnet, regtest, mainnet") cmd.Flags().String(flagBtcCheckpointTag, string(txformat.DefaultTestTagStr), "Tag to use for Bitcoin checkpoints.") cmd.Flags().Bool(flagAdditionalSenderAccount, false, "If there should be additional pre funded account per validator") diff --git a/contrib/images/babylond/Dockerfile b/contrib/images/babylond/Dockerfile index d48402bfd..11bb49450 100644 --- a/contrib/images/babylond/Dockerfile +++ b/contrib/images/babylond/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.19-alpine AS build-env +FROM golang:1.20-alpine AS build-env # Customize to your build env @@ -32,7 +32,7 @@ RUN WASMVM_VERSION=$(go list -m github.com/CosmWasm/wasmvm | cut -d ' ' -f 2) && -O /lib/libwasmvm_muslc.a && \ # verify checksum wget https://github.com/CosmWasm/wasmvm/releases/download/$WASMVM_VERSION/checksums.txt -O /tmp/checksums.txt && \ - sha256sum /lib/libwasmvm_muslc.a | grep $(cat /tmp/checksums.txt | grep $(uname -m) | cut -d ' ' -f 1) + sha256sum /lib/libwasmvm_muslc.a | grep $(cat /tmp/checksums.txt | grep libwasmvm_muslc.$(uname -m) | cut -d ' ' -f 1) RUN LEDGER_ENABLED=$LEDGER_ENABLED \ BUILD_TAGS=$BUILD_TAGS \ diff --git a/go.mod b/go.mod index 4866d705c..f6139242f 100644 --- a/go.mod +++ b/go.mod @@ -1,13 +1,13 @@ -go 1.19 +go 1.20 module github.com/babylonchain/babylon require ( - github.com/CosmWasm/wasmd v0.40.0-rc.0 + github.com/CosmWasm/wasmd v0.40.0-rc.1 github.com/btcsuite/btcd v0.23.4 github.com/cometbft/cometbft v0.37.0 github.com/cometbft/cometbft-db v0.7.0 - github.com/cosmos/cosmos-sdk v0.47.0 + github.com/cosmos/cosmos-sdk v0.47.1 github.com/golang/protobuf v1.5.3 github.com/gorilla/mux v1.8.0 github.com/grpc-ecosystem/grpc-gateway v1.16.0 @@ -19,26 +19,26 @@ require ( github.com/stretchr/testify v1.8.2 github.com/supranational/blst v0.3.8 google.golang.org/genproto v0.0.0-20230216225411-c8e22ba71e44 - google.golang.org/grpc v1.53.0 + google.golang.org/grpc v1.54.0 gopkg.in/yaml.v2 v2.4.0 // indirect ) require ( cosmossdk.io/api v0.3.1 cosmossdk.io/errors v1.0.0-beta.7 - cosmossdk.io/math v1.0.0-rc.0 + cosmossdk.io/math v1.0.0 cosmossdk.io/tools/rosetta v0.2.1 - github.com/CosmWasm/wasmvm v1.2.1 + github.com/CosmWasm/wasmvm v1.2.3 github.com/boljen/go-bitmap v0.0.0-20151001105940-23cd2fb0ce7d github.com/btcsuite/btcd/btcutil v1.1.2 github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 github.com/cosmos/cosmos-proto v1.0.0-beta.2 - github.com/cosmos/gogoproto v1.4.6 + github.com/cosmos/gogoproto v1.4.8 github.com/cosmos/ibc-go/v7 v7.0.0 github.com/golang/mock v1.6.0 github.com/jinzhu/copier v0.3.5 github.com/ory/dockertest/v3 v3.9.1 - google.golang.org/protobuf v1.29.1 + google.golang.org/protobuf v1.30.0 ) require ( @@ -97,9 +97,9 @@ require ( github.com/mtibben/percent v0.2.1 // indirect github.com/petermattis/goid v0.0.0-20221215004737-a150e88a970d // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.14.0 + github.com/prometheus/client_golang v1.15.0 github.com/prometheus/client_model v0.3.0 // indirect - github.com/prometheus/common v0.40.0 // indirect + github.com/prometheus/common v0.42.0 // indirect github.com/prometheus/procfs v0.9.0 // indirect github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect github.com/rs/cors v1.8.3 // indirect @@ -113,9 +113,9 @@ require ( github.com/zondax/hid v0.9.1 // indirect go.etcd.io/bbolt v1.3.7 // indirect golang.org/x/crypto v0.7.0 // indirect - golang.org/x/sys v0.6.0 // indirect - golang.org/x/term v0.6.0 // indirect - golang.org/x/text v0.8.0 // indirect + golang.org/x/sys v0.7.0 // indirect + golang.org/x/term v0.7.0 // indirect + golang.org/x/text v0.9.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect nhooyr.io/websocket v1.8.6 // indirect ) @@ -169,13 +169,10 @@ require ( github.com/huandu/skiplist v1.2.0 // indirect github.com/imdario/mergo v0.3.13 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect - github.com/json-iterator/go v1.1.12 // indirect github.com/manifoldco/promptui v0.9.0 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/mitchellh/go-testing-interface v1.14.1 // indirect github.com/moby/term v0.0.0-20221120202655-abb19827d345 // indirect - github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect - github.com/modern-go/reflect2 v1.0.2 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.1.0-rc2 // indirect github.com/opencontainers/runc v1.1.4 // indirect @@ -189,9 +186,9 @@ require ( github.com/xeipuuv/gojsonschema v1.2.0 // indirect github.com/zondax/ledger-go v0.14.1 // indirect go.opencensus.io v0.24.0 // indirect - golang.org/x/exp v0.0.0-20230310171629-522b1b587ee0 // indirect + golang.org/x/exp v0.0.0-20230321023759-10a507213a29 // indirect golang.org/x/mod v0.8.0 // indirect - golang.org/x/net v0.8.0 // indirect + golang.org/x/net v0.9.0 // indirect golang.org/x/oauth2 v0.5.0 // indirect golang.org/x/tools v0.6.0 // indirect golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect diff --git a/go.sum b/go.sum index 3fda292da..84bf7b61c 100644 --- a/go.sum +++ b/go.sum @@ -196,8 +196,8 @@ cosmossdk.io/depinject v1.0.0-alpha.3 h1:6evFIgj//Y3w09bqOUOzEpFj5tsxBqdc5CfkO7z cosmossdk.io/depinject v1.0.0-alpha.3/go.mod h1:eRbcdQ7MRpIPEM5YUJh8k97nxHpYbc3sMUnEtt8HPWU= cosmossdk.io/errors v1.0.0-beta.7 h1:gypHW76pTQGVnHKo6QBkb4yFOJjC+sUGRc5Al3Odj1w= cosmossdk.io/errors v1.0.0-beta.7/go.mod h1:mz6FQMJRku4bY7aqS/Gwfcmr/ue91roMEKAmDUDpBfE= -cosmossdk.io/math v1.0.0-rc.0 h1:ml46ukocrAAoBpYKMidF0R2tQJ1Uxfns0yH8wqgMAFc= -cosmossdk.io/math v1.0.0-rc.0/go.mod h1:Ygz4wBHrgc7g0N+8+MrnTfS9LLn9aaTGa9hKopuym5k= +cosmossdk.io/math v1.0.0 h1:ro9w7eKx23om2tZz/VM2Pf+z2WAbGX1yDQQOJ6iGeJw= +cosmossdk.io/math v1.0.0/go.mod h1:Ygz4wBHrgc7g0N+8+MrnTfS9LLn9aaTGa9hKopuym5k= cosmossdk.io/tools/rosetta v0.2.1 h1:ddOMatOH+pbxWbrGJKRAawdBkPYLfKXutK9IETnjYxw= cosmossdk.io/tools/rosetta v0.2.1/go.mod h1:Pqdc1FdvkNV3LcNIkYWt2RQY6IP1ge6YWZk8MhhO9Hw= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= @@ -209,10 +209,10 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d h1:nalkkPQcITbvhmL4+C4cKA87NW0tfm3Kl9VXRoPywFg= github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d/go.mod h1:URdX5+vg25ts3aCh8H5IFZybJYKWhJHYMTnf+ULtoC4= -github.com/CosmWasm/wasmd v0.40.0-rc.0 h1:QhJzLSWQCjUjrEPO2dc61WgafnaxetuKZRBHUfKJR84= -github.com/CosmWasm/wasmd v0.40.0-rc.0/go.mod h1:9MispMuIWmjs6HlgRx+XPLfOD0y1k7iQx5KIE2cNGTc= -github.com/CosmWasm/wasmvm v1.2.1 h1:si0tRsRDdUShV0k51Wn6zRKlmj3/WWP9Yr4cLmDTf+8= -github.com/CosmWasm/wasmvm v1.2.1/go.mod h1:vW/E3h8j9xBQs9bCoijDuawKo9kCtxOaS8N8J7KFtkc= +github.com/CosmWasm/wasmd v0.40.0-rc.1 h1:prIM2vP1jNh0zgs9seua5BgKdayBgp3FiHtwxFcZSGs= +github.com/CosmWasm/wasmd v0.40.0-rc.1/go.mod h1:uacdue6EGn9JA1TqBNHB3iCe4PCIChuFT23AzIl2VME= +github.com/CosmWasm/wasmvm v1.2.3 h1:OKYlobwmVGbl0eSn0mXoAAjE5hIuXnQCLPjbNd91sVY= +github.com/CosmWasm/wasmvm v1.2.3/go.mod h1:vW/E3h8j9xBQs9bCoijDuawKo9kCtxOaS8N8J7KFtkc= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= github.com/Microsoft/go-winio v0.6.0 h1:slsWYD/zyx7lCXoZVlvQrj0hPTM1HI4+v1sIda2yDvg= @@ -350,8 +350,8 @@ github.com/cosmos/btcutil v1.0.5 h1:t+ZFcX77LpKtDBhjucvnOH8C2l2ioGsBNEQ3jef8xFk= github.com/cosmos/btcutil v1.0.5/go.mod h1:IyB7iuqZMJlthe2tkIFL33xPyzbFYP0XVdS8P5lUPis= github.com/cosmos/cosmos-proto v1.0.0-beta.2 h1:X3OKvWgK9Gsejo0F1qs5l8Qn6xJV/AzgIWR2wZ8Nua8= github.com/cosmos/cosmos-proto v1.0.0-beta.2/go.mod h1:+XRCLJ14pr5HFEHIUcn51IKXD1Fy3rkEQqt4WqmN4V0= -github.com/cosmos/cosmos-sdk v0.47.0 h1:GKYtBpvjwuDEVix1vdnQpq7PuEOnItuEK0vdAL2cZ5g= -github.com/cosmos/cosmos-sdk v0.47.0/go.mod h1:FTtZbqiHCZ2vun9WrPq6qLQafNKkAuIhLAxzLjr2TiI= +github.com/cosmos/cosmos-sdk v0.47.1 h1:HnaCYtaAMWZp1SdlwwE1mPJ8kFlZ/TuEJ/ciNXH6Uno= +github.com/cosmos/cosmos-sdk v0.47.1/go.mod h1:14tO5KQaTrl2q3OxBnDRfue7TRN9zkXS0cLutrSqkOo= github.com/cosmos/cosmos-sdk/ics23/go v0.8.0 h1:iKclrn3YEOwk4jQHT2ulgzuXyxmzmPczUalMwW4XH9k= github.com/cosmos/cosmos-sdk/ics23/go v0.8.0/go.mod h1:2a4dBq88TUoqoWAU5eu0lGvpFP3wWDPgdHPargtyw30= github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d/go.mod h1:tSxLoYXyBmiFeKpvmq4dzayMdCjCnu8uqmCysIGBT2Y= @@ -360,8 +360,8 @@ github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4x github.com/cosmos/gogogateway v1.2.0 h1:Ae/OivNhp8DqBi/sh2A8a1D0y638GpL3tkmLQAiKxTE= github.com/cosmos/gogogateway v1.2.0/go.mod h1:iQpLkGWxYcnCdz5iAdLcRBSw3h7NXeOkZ4GUkT+tbFI= github.com/cosmos/gogoproto v1.4.2/go.mod h1:cLxOsn1ljAHSV527CHOtaIP91kK6cCrZETRBrkzItWU= -github.com/cosmos/gogoproto v1.4.6 h1:Ee7z15dWJaGlgM2rWrK8N2IX7PQcuccu8oG68jp5RL4= -github.com/cosmos/gogoproto v1.4.6/go.mod h1:VS/ASYmPgv6zkPKLjR9EB91lwbLHOzaGCirmKKhncfI= +github.com/cosmos/gogoproto v1.4.8 h1:BrHKc6WFZt8+jRV71vKSQE+JrfF+JAnzrKo2VP7wIZ4= +github.com/cosmos/gogoproto v1.4.8/go.mod h1:hnb0DIEWTv+wdNzNcqus5xCQXq5+CXauq1FJuurRfVY= github.com/cosmos/iavl v0.20.0 h1:fTVznVlepH0KK8NyKq8w+U7c2L6jofa27aFX6YGlm38= github.com/cosmos/iavl v0.20.0/go.mod h1:WO7FyvaZJoH65+HFOsDir7xU9FWk2w9cHXNW1XHcl7A= github.com/cosmos/ics23/go v0.9.1-0.20221207100636-b1abd8678aab h1:I9ialKTQo7248V827Bba4OuKPmk+FPzmTVHsLXaIJWw= @@ -725,7 +725,6 @@ github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/u github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= -github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= @@ -807,7 +806,6 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= -github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= github.com/mtibben/percent v0.2.1 h1:5gssi8Nqo8QU/r2pynCm+hBQHpkB/uNK7BJCFogWdzs= github.com/mtibben/percent v0.2.1/go.mod h1:KG9uO+SZkUp+VkRHsCdYQV3XSZrrSpR3O9ibNBTZrns= @@ -887,8 +885,8 @@ github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5Fsn github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw= -github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= +github.com/prometheus/client_golang v1.15.0 h1:5fCgGYogn0hFdhyhLbw7hEsWxufKtY9klyvdNfFlFhM= +github.com/prometheus/client_golang v1.15.0/go.mod h1:e9yaBhRPU2pPNsZwE+JdQl0KEt1N9XgF6zxWmaC0xOk= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= @@ -903,8 +901,8 @@ github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt2 github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= -github.com/prometheus/common v0.40.0 h1:Afz7EVRqGg2Mqqf4JuF9vdvp1pi220m55Pi9T2JnO4Q= -github.com/prometheus/common v0.40.0/go.mod h1:L65ZJPSmfn/UBWLQIHV7dBrKFidB/wPlF1y5TlSt9OE= +github.com/prometheus/common v0.42.0 h1:EKsfXEYo4JpWMHH5cg+KOUWeuJSov1Id8zGR8eeI1YM= +github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= @@ -1088,8 +1086,8 @@ golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= -golang.org/x/exp v0.0.0-20230310171629-522b1b587ee0 h1:LGJsf5LRplCck6jUCH3dBL2dmycNruWNF5xugkSlfXw= -golang.org/x/exp v0.0.0-20230310171629-522b1b587ee0/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= +golang.org/x/exp v0.0.0-20230321023759-10a507213a29 h1:ooxPy7fPvB4kwsA2h+iBNHkAbp/4JxTSwCmvdjEYmug= +golang.org/x/exp v0.0.0-20230321023759-10a507213a29/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -1179,8 +1177,8 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= -golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +golang.org/x/net v0.9.0 h1:aWJ/m6xSmxWBx+V0XRHTlrYrPG56jKsLdTFmsSsCzOM= +golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1327,13 +1325,13 @@ golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU= +golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.6.0 h1:clScbb1cHjoCkyRbWwBEUZ5H/tIFu5TAXIqaZD0Gcjw= -golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= +golang.org/x/term v0.7.0 h1:BEvjmm5fURWqcfbSKTdpkDXYBrUS1c0m8agp14W48vQ= +golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1344,8 +1342,8 @@ golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1634,8 +1632,8 @@ google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACu google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.53.0 h1:LAv2ds7cmFV/XTS3XG1NneeENYrXGmorPxsBbptIjNc= -google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw= +google.golang.org/grpc v1.54.0 h1:EhTqbhiYeixwWQtAEZAxmV9MGqcjEU2mFx52xCzNyag= +google.golang.org/grpc v1.54.0/go.mod h1:PUSEXI6iWghWaB6lXM4knEgpJNu2qUcKfDtNci3EC2g= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= @@ -1652,8 +1650,8 @@ google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.29.1 h1:7QBf+IK2gx70Ap/hDsOmam3GE0v9HicjfEdAxE62UoM= -google.golang.org/protobuf v1.29.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= +google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/proto/buf.lock b/proto/buf.lock index baf8c2e97..7a2810e68 100644 --- a/proto/buf.lock +++ b/proto/buf.lock @@ -5,15 +5,19 @@ deps: owner: cosmos repository: cosmos-proto commit: 1935555c206d4afb9e94615dfd0fad31 + digest: shake256:c74d91a3ac7ae07d579e90eee33abf9b29664047ac8816500cf22c081fec0d72d62c89ce0bebafc1f6fec7aa5315be72606717740ca95007248425102c365377 - remote: buf.build owner: cosmos repository: cosmos-sdk commit: 954f7b05f38440fc8250134b15adec47 + digest: shake256:2ab4404fd04a7d1d52df0e2d0f2d477a3d83ffd88d876957bf3fedfd702c8e52833d65b3ce1d89a3c5adf2aab512616b0e4f51d8463f07eda9a8a3317ee3ac54 - remote: buf.build owner: cosmos repository: gogo-proto commit: 34d970b699f84aa382f3c29773a60836 + digest: shake256:3d3bee5229ba579e7d19ffe6e140986a228b48a8c7fe74348f308537ab95e9135210e81812489d42cd8941d33ff71f11583174ccc5972e86e6112924b6ce9f04 - remote: buf.build owner: googleapis repository: googleapis commit: 8d7204855ec14631a499bd7393ce1970 + digest: shake256:40bf4112960cad01281930beed85829910768e32e80e986791596853eccd42c0cbd9d96690b918f658020d2d427e16f8b6514e2ac7f4a10306fd32e77be44329 diff --git a/proto/scripts/protocgen.sh b/proto/scripts/protocgen.sh index df3710663..70312bb3d 100755 --- a/proto/scripts/protocgen.sh +++ b/proto/scripts/protocgen.sh @@ -19,4 +19,4 @@ cd .. cp -r github.com/babylonchain/babylon/* ./ rm -rf github.com -go mod tidy -compat=1.19 +go mod tidy -compat=1.20 diff --git a/x/checkpointing/client/cli/tx.go b/x/checkpointing/client/cli/tx.go index 6c32ab132..f309c0654 100644 --- a/x/checkpointing/client/cli/tx.go +++ b/x/checkpointing/client/cli/tx.go @@ -98,8 +98,14 @@ before running the command (e.g., via babylond create-bls-key).`)) return err } - txf := tx.NewFactoryCLI(clientCtx, cmd.Flags()). - WithTxConfig(clientCtx.TxConfig).WithAccountRetriever(clientCtx.AccountRetriever) + txf, err := tx.NewFactoryCLI(clientCtx, cmd.Flags()) + + if err != nil { + return err + } + + txf = txf.WithTxConfig(clientCtx.TxConfig).WithAccountRetriever(clientCtx.AccountRetriever) + txf, msg, err := buildWrappedCreateValidatorMsg(clientCtx, txf, cmd.Flags()) if err != nil { return err diff --git a/x/checkpointing/types/tx.pb.go b/x/checkpointing/types/tx.pb.go index 18b6a0a87..83b25f08a 100644 --- a/x/checkpointing/types/tx.pb.go +++ b/x/checkpointing/types/tx.pb.go @@ -33,6 +33,9 @@ const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package // MsgAddBlsSig defines a message to add a bls signature from a // validator type MsgAddBlsSig struct { + // signer corresponds to the submitter of the transaction + // This might be a different entity compared to the one that created the BLS signature + // (i.e. the validator owner of the BLS key which is specified by the `bls_sig.signer_address`) Signer string `protobuf:"bytes,1,opt,name=signer,proto3" json:"signer,omitempty"` BlsSig *BlsSig `protobuf:"bytes,2,opt,name=bls_sig,json=blsSig,proto3" json:"bls_sig,omitempty"` } diff --git a/x/zoneconcierge/keeper/proof_tx_in_block_test.go b/x/zoneconcierge/keeper/proof_tx_in_block_test.go index dc2e73770..36d88ce6e 100644 --- a/x/zoneconcierge/keeper/proof_tx_in_block_test.go +++ b/x/zoneconcierge/keeper/proof_tx_in_block_test.go @@ -54,10 +54,14 @@ func TestProveTxInBlock(t *testing.T) { coins := sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(10))) msg := banktypes.NewMsgSend(val.Address, testNetwork.Validators[1].Address, coins) + txf, err := tx.NewFactoryCLI(val.ClientCtx, fs) + + require.NoError(t, err) // construct a tx that includes this msg - txf := tx.NewFactoryCLI(val.ClientCtx, fs). + txf = txf. WithTxConfig(val.ClientCtx.TxConfig). WithAccountRetriever(val.ClientCtx.AccountRetriever) + txf, err = txf.Prepare(val.ClientCtx) require.NoError(t, err) txb, err := txf.BuildUnsignedTx(msg) From 4ace11f32741d84936f77885806a078fff4b578b Mon Sep 17 00:00:00 2001 From: KonradStaniec Date: Tue, 25 Apr 2023 07:14:14 +0200 Subject: [PATCH 42/59] Move checkpoint tag to params (#356) * Move checkpoint tag to params --- app/ante_btc_validation_decorator.go | 14 +++- app/app.go | 3 +- app/test_helpers.go | 5 -- btctxformatter/bbnformatter.go | 25 ------- btctxformatter/formatter_test.go | 3 +- cmd/babylond/cmd/custom_babylon_config.go | 11 +-- cmd/babylond/cmd/flags.go | 6 ++ cmd/babylond/cmd/genesis.go | 9 ++- cmd/babylond/cmd/testnet.go | 10 +-- proto/babylon/btccheckpoint/v1/params.proto | 5 ++ test/e2e/configurer/chain/commands.go | 3 +- test/e2e/initialization/config.go | 10 ++- test/e2e/initialization/node.go | 1 - test/integration_test.go | 6 +- testutil/datagen/btc_transaction.go | 13 ++-- testutil/keeper/btccheckpoint.go | 3 - types/btc_config.go | 30 -------- x/btccheckpoint/genesis_test.go | 1 + x/btccheckpoint/keeper/keeper.go | 52 +++++++------ x/btccheckpoint/keeper/msg_server.go | 9 ++- x/btccheckpoint/keeper/params.go | 3 - x/btccheckpoint/types/genesis_test.go | 1 + x/btccheckpoint/types/params.go | 33 +++++++- x/btccheckpoint/types/params.pb.go | 75 +++++++++++++++++-- .../keeper/proof_epoch_submitted_test.go | 6 +- 25 files changed, 196 insertions(+), 141 deletions(-) delete mode 100644 btctxformatter/bbnformatter.go diff --git a/app/ante_btc_validation_decorator.go b/app/ante_btc_validation_decorator.go index 232cb17b8..109789023 100644 --- a/app/ante_btc_validation_decorator.go +++ b/app/ante_btc_validation_decorator.go @@ -2,18 +2,24 @@ package app import ( bbn "github.com/babylonchain/babylon/types" + btccheckpointkeeper "github.com/babylonchain/babylon/x/btccheckpoint/keeper" btccheckpointtypes "github.com/babylonchain/babylon/x/btccheckpoint/types" btclightclient "github.com/babylonchain/babylon/x/btclightclient/types" sdk "github.com/cosmos/cosmos-sdk/types" ) type BtcValidationDecorator struct { - BtcCfg bbn.BtcConfig + BtcCfg bbn.BtcConfig + btccheckpointKeeper *btccheckpointkeeper.Keeper } -func NewBtcValidationDecorator(cfg bbn.BtcConfig) BtcValidationDecorator { +func NewBtcValidationDecorator( + cfg bbn.BtcConfig, + k *btccheckpointkeeper.Keeper, +) BtcValidationDecorator { return BtcValidationDecorator{ - BtcCfg: cfg, + BtcCfg: cfg, + btccheckpointKeeper: k, } } @@ -26,7 +32,7 @@ func (bvd BtcValidationDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulat switch msg := m.(type) { case *btccheckpointtypes.MsgInsertBTCSpvProof: powLimit := bvd.BtcCfg.PowLimit() - _, err := btccheckpointtypes.ParseSubmission(msg, &powLimit, bvd.BtcCfg.CheckpointTag()) + _, err := btccheckpointtypes.ParseSubmission(msg, &powLimit, bvd.btccheckpointKeeper.GetExpectedTag(ctx)) if err != nil { return ctx, btccheckpointtypes.ErrInvalidCheckpointProof.Wrap(err.Error()) diff --git a/app/app.go b/app/app.go index 95fb690af..ddef2f6c4 100644 --- a/app/app.go +++ b/app/app.go @@ -604,7 +604,6 @@ func NewBabylonApp( &btclightclientKeeper, app.CheckpointingKeeper, &powLimit, - btcConfig.CheckpointTag(), authtypes.NewModuleAddress(govtypes.ModuleName).String(), ) app.ZoneConciergeKeeper.SetBtcCheckpointKeeper(app.BtcCheckpointKeeper) @@ -839,7 +838,7 @@ func NewBabylonApp( anteHandler := sdk.ChainAnteDecorators( NewWrappedAnteHandler(authAnteHandler), epochingkeeper.NewDropValidatorMsgDecorator(app.EpochingKeeper), - NewBtcValidationDecorator(btcConfig), + NewBtcValidationDecorator(btcConfig, &app.BtcCheckpointKeeper), ) app.SetAnteHandler(anteHandler) diff --git a/app/test_helpers.go b/app/test_helpers.go index 3794e0be4..f83e2a392 100644 --- a/app/test_helpers.go +++ b/app/test_helpers.go @@ -20,7 +20,6 @@ import ( errorsmod "cosmossdk.io/errors" "github.com/babylonchain/babylon/app/params" appparams "github.com/babylonchain/babylon/app/params" - txformat "github.com/babylonchain/babylon/btctxformatter" bbn "github.com/babylonchain/babylon/types" dbm "github.com/cometbft/cometbft-db" abci "github.com/cometbft/cometbft/abci/types" @@ -606,10 +605,6 @@ func (ao EmptyAppOptions) Get(o string) interface{} { return string(bbn.BtcSimnet) } - if o == "btc-config.checkpoint-tag" { - return txformat.DefaultMainTagStr - } - return nil } diff --git a/btctxformatter/bbnformatter.go b/btctxformatter/bbnformatter.go deleted file mode 100644 index d9c8304e3..000000000 --- a/btctxformatter/bbnformatter.go +++ /dev/null @@ -1,25 +0,0 @@ -package btctxformatter - -// Little helpers for now which will be usefull in tests etc. -// Probably we should not hardcode stuff either way but to define this tags -// in some separate document/config - -const ( - mainTagPrefix string = "bbn" - testTagPrefix string = "bbt" - - DefaultTestTagStr string = testTagPrefix + "0" - DefaultMainTagStr string = testTagPrefix + "m" -) - -func MainTag(idx uint8) BabylonTag { - bytes := []byte(mainTagPrefix) - bytes = append(bytes, idx) - return BabylonTag(bytes) -} - -func TestTag(idx uint8) BabylonTag { - bytes := []byte(testTagPrefix) - bytes = append(bytes, idx) - return BabylonTag(bytes) -} diff --git a/btctxformatter/formatter_test.go b/btctxformatter/formatter_test.go index a8aef4b84..757202528 100644 --- a/btctxformatter/formatter_test.go +++ b/btctxformatter/formatter_test.go @@ -97,7 +97,8 @@ func FuzzDecodingWontPanic(f *testing.F) { f.Add(randNBytes(secondPartLength), uint8(rand.Intn(99))) f.Fuzz(func(t *testing.T, bytes []byte, tagIdx uint8) { - decoded, err := IsBabylonCheckpointData(MainTag(tagIdx), CurrentVersion, bytes) + tag := []byte{0, 1, 2, 3} + decoded, err := IsBabylonCheckpointData(BabylonTag(tag), CurrentVersion, bytes) if err == nil { if decoded.Index != 0 && decoded.Index != 1 { diff --git a/cmd/babylond/cmd/custom_babylon_config.go b/cmd/babylond/cmd/custom_babylon_config.go index f52d949e7..dea8fd351 100644 --- a/cmd/babylond/cmd/custom_babylon_config.go +++ b/cmd/babylond/cmd/custom_babylon_config.go @@ -4,7 +4,6 @@ import ( wasmtypes "github.com/CosmWasm/wasmd/x/wasm/types" serverconfig "github.com/cosmos/cosmos-sdk/server/config" - txformat "github.com/babylonchain/babylon/btctxformatter" bbn "github.com/babylonchain/babylon/types" ) @@ -16,14 +15,11 @@ const ( type BtcConfig struct { Network string `mapstructure:"network"` - - CheckpointTag string `mapstructure:"checkpoint-tag"` } func defaultBabylonBtcConfig() BtcConfig { return BtcConfig{ - Network: string(bbn.BtcMainnet), - CheckpointTag: txformat.DefaultMainTagStr, + Network: string(bbn.BtcMainnet), } } @@ -72,11 +68,6 @@ func DefaultBabylonTemplate() string { # valid values are: [mainnet, testnet, simnet, regtest] network = "{{ .BtcConfig.Network }}" - -# Configures what tag should be prepended to op_return data in btc transaction -# for it to be considered as valid babylon checkpoint. Must have exactly 4 bytes. -checkpoint-tag = "{{ .BtcConfig.CheckpointTag }}" - [signer-config] # Configures which key that the BLS signer uses to sign BLS-sig transactions diff --git a/cmd/babylond/cmd/flags.go b/cmd/babylond/cmd/flags.go index f9f309524..0e24553ec 100644 --- a/cmd/babylond/cmd/flags.go +++ b/cmd/babylond/cmd/flags.go @@ -4,6 +4,7 @@ import ( "time" babylonApp "github.com/babylonchain/babylon/app" + btcctypes "github.com/babylonchain/babylon/x/btccheckpoint/types" tmrand "github.com/cometbft/cometbft/libs/rand" "github.com/cosmos/cosmos-sdk/client/flags" "github.com/spf13/cobra" @@ -14,6 +15,7 @@ const ( flagBtcConfirmationDepth = "btc-confirmation-depth" flagEpochInterval = "epoch-interval" flagBtcFinalizationTimeout = "btc-finalization-timeout" + flagCheckpointTag = "checkpoint-tag" flagBaseBtcHeaderHex = "btc-base-header" flagBaseBtcHeaderHeight = "btc-base-header-height" flagInflationRateChange = "inflation-rate-change" @@ -30,6 +32,7 @@ type GenesisCLIArgs struct { MaxActiveValidators uint32 BtcConfirmationDepth uint64 BtcFinalizationTimeout uint64 + CheckpointTag string EpochInterval uint64 BaseBtcHeaderHex string BaseBtcHeaderHeight uint64 @@ -49,6 +52,7 @@ func addGenesisFlags(cmd *cobra.Command) { // btccheckpoint flags cmd.Flags().Uint64(flagBtcConfirmationDepth, 6, "Confirmation depth for Bitcoin headers.") cmd.Flags().Uint64(flagBtcFinalizationTimeout, 20, "Finalization timeout for Bitcoin headers.") + cmd.Flags().String(flagCheckpointTag, btcctypes.DefaultCheckpointTag, "Hex encoded tag for babylon checkpoint on btc") // epoch args cmd.Flags().Uint64(flagEpochInterval, 400, "Number of blocks between epochs. Must be more than 0.") // btclightclient args @@ -69,6 +73,7 @@ func parseGenesisFlags(cmd *cobra.Command) *GenesisCLIArgs { maxActiveValidators, _ := cmd.Flags().GetUint32(flagMaxActiveValidators) btcConfirmationDepth, _ := cmd.Flags().GetUint64(flagBtcConfirmationDepth) btcFinalizationTimeout, _ := cmd.Flags().GetUint64(flagBtcFinalizationTimeout) + checkpointTag, _ := cmd.Flags().GetString(flagCheckpointTag) epochInterval, _ := cmd.Flags().GetUint64(flagEpochInterval) baseBtcHeaderHex, _ := cmd.Flags().GetString(flagBaseBtcHeaderHex) baseBtcHeaderHeight, _ := cmd.Flags().GetUint64(flagBaseBtcHeaderHeight) @@ -91,6 +96,7 @@ func parseGenesisFlags(cmd *cobra.Command) *GenesisCLIArgs { MaxActiveValidators: maxActiveValidators, BtcConfirmationDepth: btcConfirmationDepth, BtcFinalizationTimeout: btcFinalizationTimeout, + CheckpointTag: checkpointTag, EpochInterval: epochInterval, BaseBtcHeaderHeight: baseBtcHeaderHeight, BaseBtcHeaderHex: baseBtcHeaderHex, diff --git a/cmd/babylond/cmd/genesis.go b/cmd/babylond/cmd/genesis.go index 2af9d551d..fd61482d9 100644 --- a/cmd/babylond/cmd/genesis.go +++ b/cmd/babylond/cmd/genesis.go @@ -63,7 +63,7 @@ Example: var genesisParams GenesisParams if network == "testnet" { genesisParams = TestnetGenesisParams(genesisCliArgs.MaxActiveValidators, - genesisCliArgs.BtcConfirmationDepth, genesisCliArgs.BtcFinalizationTimeout, + genesisCliArgs.BtcConfirmationDepth, genesisCliArgs.BtcFinalizationTimeout, genesisCliArgs.CheckpointTag, genesisCliArgs.EpochInterval, genesisCliArgs.BaseBtcHeaderHex, genesisCliArgs.BaseBtcHeaderHeight, genesisCliArgs.InflationRateChange, genesisCliArgs.InflationMin, genesisCliArgs.InflationMax, genesisCliArgs.GoalBonded, @@ -211,7 +211,7 @@ type GenesisParams struct { } func TestnetGenesisParams(maxActiveValidators uint32, btcConfirmationDepth uint64, - btcFinalizationTimeout uint64, epochInterval uint64, baseBtcHeaderHex string, + btcFinalizationTimeout uint64, checkpointTag string, epochInterval uint64, baseBtcHeaderHex string, baseBtcHeaderHeight uint64, inflationRateChange float64, inflationMin float64, inflationMax float64, goalBonded float64, blocksPerYear uint64, genesisTime time.Time, blockGasLimit int64) GenesisParams { @@ -270,6 +270,11 @@ func TestnetGenesisParams(maxActiveValidators uint32, btcConfirmationDepth uint6 genParams.BtccheckpointParams = btccheckpointtypes.DefaultParams() genParams.BtccheckpointParams.BtcConfirmationDepth = btcConfirmationDepth genParams.BtccheckpointParams.CheckpointFinalizationTimeout = btcFinalizationTimeout + genParams.BtccheckpointParams.CheckpointTag = checkpointTag + + if err := genParams.BtccheckpointParams.Validate(); err != nil { + panic(err) + } // set the base BTC header in the genesis state baseBtcHeader, err := bbn.NewBTCHeaderBytesFromHex(baseBtcHeaderHex) diff --git a/cmd/babylond/cmd/testnet.go b/cmd/babylond/cmd/testnet.go index da40b4da5..683499ae9 100644 --- a/cmd/babylond/cmd/testnet.go +++ b/cmd/babylond/cmd/testnet.go @@ -12,7 +12,6 @@ import ( "path/filepath" appparams "github.com/babylonchain/babylon/app/params" - txformat "github.com/babylonchain/babylon/btctxformatter" bbn "github.com/babylonchain/babylon/types" cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" @@ -53,7 +52,6 @@ var ( flagNodeDaemonHome = "node-daemon-home" flagStartingIPAddress = "starting-ip-address" flagBtcNetwork = "btc-network" - flagBtcCheckpointTag = "btc-checkpoint-tag" flagAdditionalSenderAccount = "additional-sender-account" ) @@ -89,14 +87,13 @@ Example: numValidators, _ := cmd.Flags().GetInt(flagNumValidators) algo, _ := cmd.Flags().GetString(flags.FlagKeyType) btcNetwork, _ := cmd.Flags().GetString(flagBtcNetwork) - btcCheckpointTag, _ := cmd.Flags().GetString(flagBtcCheckpointTag) additionalAccount, _ := cmd.Flags().GetBool(flagAdditionalSenderAccount) if err != nil { return errors.New("base Bitcoin header height should be a uint64") } genesisParams := TestnetGenesisParams(genesisCliArgs.MaxActiveValidators, - genesisCliArgs.BtcConfirmationDepth, genesisCliArgs.BtcFinalizationTimeout, + genesisCliArgs.BtcConfirmationDepth, genesisCliArgs.BtcFinalizationTimeout, genesisCliArgs.CheckpointTag, genesisCliArgs.EpochInterval, genesisCliArgs.BaseBtcHeaderHex, genesisCliArgs.BaseBtcHeaderHeight, genesisCliArgs.InflationRateChange, genesisCliArgs.InflationMin, genesisCliArgs.InflationMax, genesisCliArgs.GoalBonded, @@ -105,7 +102,7 @@ Example: return InitTestnet( clientCtx, cmd, config, mbm, genBalIterator, outputDir, genesisCliArgs.ChainID, minGasPrices, nodeDirPrefix, nodeDaemonHome, startingIPAddress, keyringBackend, algo, numValidators, - btcNetwork, btcCheckpointTag, additionalAccount, genesisParams, + btcNetwork, additionalAccount, genesisParams, ) }, } @@ -119,7 +116,6 @@ Example: cmd.Flags().String(flags.FlagKeyringBackend, flags.DefaultKeyringBackend, "Select keyring's backend (os|file|test)") cmd.Flags().String(flags.FlagKeyType, string(hd.Secp256k1Type), "Key signing algorithm to generate keys for") cmd.Flags().String(flagBtcNetwork, string(bbn.BtcSimnet), "Bitcoin network to use. Available networks: simnet, testnet, regtest, mainnet") - cmd.Flags().String(flagBtcCheckpointTag, string(txformat.DefaultTestTagStr), "Tag to use for Bitcoin checkpoints.") cmd.Flags().Bool(flagAdditionalSenderAccount, false, "If there should be additional pre funded account per validator") addGenesisFlags(cmd) @@ -145,7 +141,6 @@ func InitTestnet( algoStr string, numValidators int, btcNetwork string, - btcCheckpointTag string, additionalAccount bool, genesisParams GenesisParams, ) error { @@ -163,7 +158,6 @@ func InitTestnet( babylonConfig.Telemetry.GlobalLabels = [][]string{{"chain_id", chainID}} // BTC related config. Default values "simnet" and "BBT1" babylonConfig.BtcConfig.Network = btcNetwork - babylonConfig.BtcConfig.CheckpointTag = btcCheckpointTag // Explorer related config. Allow CORS connections. babylonConfig.API.EnableUnsafeCORS = true babylonConfig.GRPC.Address = "0.0.0.0:9090" diff --git a/proto/babylon/btccheckpoint/v1/params.proto b/proto/babylon/btccheckpoint/v1/params.proto index 2f57cb53d..20ed5e6ee 100644 --- a/proto/babylon/btccheckpoint/v1/params.proto +++ b/proto/babylon/btccheckpoint/v1/params.proto @@ -23,4 +23,9 @@ message Params { // has dishonest majority and is stalling checkpoints (w in research paper) uint64 checkpoint_finalization_timeout = 2 [ (gogoproto.moretags) = "yaml:\"checkpoint_finalization_timeout\"" ]; + + // 4byte tag in hex format, required to be present in the OP_RETURN transaction + // related to babylon + string checkpoint_tag = 3 + [ (gogoproto.moretags) = "yaml:\"checkpoint_tag\"" ]; } diff --git a/test/e2e/configurer/chain/commands.go b/test/e2e/configurer/chain/commands.go index ffa17a544..1af0ba31e 100644 --- a/test/e2e/configurer/chain/commands.go +++ b/test/e2e/configurer/chain/commands.go @@ -126,8 +126,9 @@ func (n *NodeConfig) FinalizeSealedEpochs(startingEpoch uint64, lastEpoch uint64 require.NoError(n.t, err) + babylonTagBytes, _ := hex.DecodeString(initialization.BabylonOpReturnTag) p1, p2, err := txformat.EncodeCheckpointData( - txformat.BabylonTag(initialization.BabylonOpReturnTag), + txformat.BabylonTag(babylonTagBytes), txformat.CurrentVersion, btcCheckpoint, ) diff --git a/test/e2e/initialization/config.go b/test/e2e/initialization/config.go index 69092ade1..3903f49f3 100644 --- a/test/e2e/initialization/config.go +++ b/test/e2e/initialization/config.go @@ -43,10 +43,11 @@ type NodeConfig struct { const ( // common - BabylonDenom = "ubbn" - MinGasPrice = "0.000" - ValidatorWalletName = "val" - BabylonOpReturnTag = "bbni" + BabylonDenom = "ubbn" + MinGasPrice = "0.000" + ValidatorWalletName = "val" + BabylonOpReturnTag = "01020304" + BabylonBtcConfirmationPeriod = 2 BabylonBtcFinalizationPeriod = 4 // chainA @@ -308,6 +309,7 @@ func updateBtccheckpointGenesis(btccheckpointGenState *btccheckpointtypes.Genesi btccheckpointGenState.Params = btccheckpointtypes.DefaultParams() btccheckpointGenState.Params.BtcConfirmationDepth = BabylonBtcConfirmationPeriod btccheckpointGenState.Params.CheckpointFinalizationTimeout = BabylonBtcFinalizationPeriod + btccheckpointGenState.Params.CheckpointTag = BabylonOpReturnTag } func updateGenUtilGenesis(c *internalChain) func(*genutiltypes.GenesisState) { diff --git a/test/e2e/initialization/node.go b/test/e2e/initialization/node.go index 9a670d350..f3ede8b3b 100644 --- a/test/e2e/initialization/node.go +++ b/test/e2e/initialization/node.go @@ -131,7 +131,6 @@ func (n *internalNode) createAppConfig(nodeConfig *NodeConfig) { appConfig.StateSync.SnapshotKeepRecent = nodeConfig.SnapshotKeepRecent appConfig.SignerConfig.KeyName = ValidatorWalletName appConfig.BtcConfig.Network = string(bbn.BtcSimnet) - appConfig.BtcConfig.CheckpointTag = BabylonOpReturnTag appConfig.GRPC.Enable = true appConfig.GRPC.Address = "0.0.0.0:9090" diff --git a/test/integration_test.go b/test/integration_test.go index 5138dab0e..5d6d76793 100644 --- a/test/integration_test.go +++ b/test/integration_test.go @@ -5,6 +5,7 @@ package babylon_integration import ( "context" + "encoding/hex" "errors" "fmt" "os" @@ -15,6 +16,7 @@ import ( txformat "github.com/babylonchain/babylon/btctxformatter" "github.com/babylonchain/babylon/testutil/datagen" bbn "github.com/babylonchain/babylon/types" + btcctypes "github.com/babylonchain/babylon/x/btccheckpoint/types" lightclient "github.com/babylonchain/babylon/x/btclightclient/types" checkpointingtypes "github.com/babylonchain/babylon/x/checkpointing/types" epochingtypes "github.com/babylonchain/babylon/x/epoching/types" @@ -291,8 +293,10 @@ func TestSubmitCheckpoint(t *testing.T) { t.Fatalf("Could not create raw btc checkpoint from raw chekpoint") } + tagAsBytes, _ := hex.DecodeString(btcctypes.DefaultCheckpointTag) + p1, p2 := txformat.MustEncodeCheckpointData( - txformat.BabylonTag(txformat.DefaultTestTagStr), + txformat.BabylonTag(tagAsBytes), txformat.CurrentVersion, rawBtcCheckpoint, ) diff --git a/testutil/datagen/btc_transaction.go b/testutil/datagen/btc_transaction.go index afca3d927..7156aa610 100644 --- a/testutil/datagen/btc_transaction.go +++ b/testutil/datagen/btc_transaction.go @@ -15,11 +15,11 @@ import ( bbn "github.com/babylonchain/babylon/types" btcctypes "github.com/babylonchain/babylon/x/btccheckpoint/types" "github.com/btcsuite/btcd/blockchain" + "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btcd/chaincfg" "github.com/btcsuite/btcd/chaincfg/chainhash" "github.com/btcsuite/btcd/txscript" "github.com/btcsuite/btcd/wire" - "github.com/btcsuite/btcd/btcutil" sdk "github.com/cosmos/cosmos-sdk/types" ) @@ -375,9 +375,10 @@ func GenRandomBabylonTxPair() ([]*wire.MsgTx, *btctxformatter.RawBtcCheckpoint) // fake a raw checkpoint rawBTCCkpt := GetRandomRawBtcCheckpoint() + tag := GenRandomByteArray(4) // encode raw checkpoint to two halves firstHalf, secondHalf, err := btctxformatter.EncodeCheckpointData( - btctxformatter.TestTag(48), // TODO: randomise the tag ID + btctxformatter.BabylonTag(tag), btctxformatter.CurrentVersion, rawBTCCkpt, ) @@ -514,13 +515,15 @@ func RandomRawCheckpointDataForEpoch(e uint64) (*TestRawCheckpointData, *txforma } func EncodeRawCkptToTestData(rawBTCCkpt *txformat.RawBtcCheckpoint) *TestRawCheckpointData { - tag := txformat.MainTag(0) + tag := btcctypes.DefaultCheckpointTag + tagAsBytes, _ := hex.DecodeString(tag) + babylonTag := txformat.BabylonTag(tagAsBytes) data1, data2 := txformat.MustEncodeCheckpointData( - tag, + babylonTag, txformat.CurrentVersion, rawBTCCkpt, ) - opReturn := getExpectedOpReturn(tag, data1, data2) + opReturn := getExpectedOpReturn(babylonTag, data1, data2) return &TestRawCheckpointData{ Epoch: rawBTCCkpt.Epoch, diff --git a/testutil/keeper/btccheckpoint.go b/testutil/keeper/btccheckpoint.go index fdf90a468..ecd1f7c4f 100644 --- a/testutil/keeper/btccheckpoint.go +++ b/testutil/keeper/btccheckpoint.go @@ -5,7 +5,6 @@ import ( "math/big" - txformat "github.com/babylonchain/babylon/btctxformatter" "github.com/babylonchain/babylon/x/btccheckpoint/keeper" btcctypes "github.com/babylonchain/babylon/x/btccheckpoint/types" tmdb "github.com/cometbft/cometbft-db" @@ -47,8 +46,6 @@ func NewBTCCheckpointKeeper( lk, ek, powLimit, - // use MainTag tests - txformat.MainTag(0), authtypes.NewModuleAddress(govtypes.ModuleName).String(), ) diff --git a/types/btc_config.go b/types/btc_config.go index 43a93f13b..ad24a4014 100644 --- a/types/btc_config.go +++ b/types/btc_config.go @@ -3,7 +3,6 @@ package types import ( "math/big" - txformat "github.com/babylonchain/babylon/btctxformatter" "github.com/btcsuite/btcd/chaincfg" servertypes "github.com/cosmos/cosmos-sdk/server/types" "github.com/spf13/cast" @@ -13,7 +12,6 @@ type SupportedBtcNetwork string type BtcConfig struct { powLimit *big.Int - checkPointTag txformat.BabylonTag retargetAdjustmentFactor int64 reduceMinDifficulty bool } @@ -63,38 +61,14 @@ func parseReduceMinDifficulty(opts servertypes.AppOptions) bool { return getParams(opts).ReduceMinDifficulty } -func parseCheckpointTag(opts servertypes.AppOptions) txformat.BabylonTag { - valueInterface := opts.Get("btc-config.checkpoint-tag") - - if valueInterface == nil { - panic("Bitcoin network should be provided in options") - } - - tag, err := cast.ToStringE(valueInterface) - - if err != nil { - panic("checkpoint-tag should be valid string") - } - - tagBytes := []byte(tag) - - if len(tagBytes) != txformat.TagLength { - panic("provided tag should have exactly 4 bytes") - } - - return txformat.BabylonTag(tagBytes) -} - func ParseBtcOptionsFromConfig(opts servertypes.AppOptions) BtcConfig { powLimit := parsePowLimit(opts) - tag := parseCheckpointTag(opts) retargetAdjustmentFactor := parseRetargetAdjustmentFactor(opts) reduceMinDifficulty := parseReduceMinDifficulty(opts) return BtcConfig{ powLimit: powLimit, retargetAdjustmentFactor: retargetAdjustmentFactor, reduceMinDifficulty: reduceMinDifficulty, - checkPointTag: tag, } } @@ -102,10 +76,6 @@ func (c *BtcConfig) PowLimit() big.Int { return *c.powLimit } -func (c *BtcConfig) CheckpointTag() txformat.BabylonTag { - return c.checkPointTag -} - func (c *BtcConfig) RetargetAdjustmentFactor() int64 { return c.retargetAdjustmentFactor } diff --git a/x/btccheckpoint/genesis_test.go b/x/btccheckpoint/genesis_test.go index ad9afac65..da1d512d9 100644 --- a/x/btccheckpoint/genesis_test.go +++ b/x/btccheckpoint/genesis_test.go @@ -31,6 +31,7 @@ func TestInitGenesis(t *testing.T) { Params: types.Params{ BtcConfirmationDepth: 888, CheckpointFinalizationTimeout: 999, + CheckpointTag: types.DefaultCheckpointTag, }, } diff --git a/x/btccheckpoint/keeper/keeper.go b/x/btccheckpoint/keeper/keeper.go index d89fbce7b..9c04169f4 100644 --- a/x/btccheckpoint/keeper/keeper.go +++ b/x/btccheckpoint/keeper/keeper.go @@ -1,6 +1,7 @@ package keeper import ( + "encoding/hex" "fmt" "math" "math/big" @@ -17,15 +18,14 @@ import ( type ( Keeper struct { - cdc codec.BinaryCodec - storeKey storetypes.StoreKey - tstoreKey storetypes.StoreKey - memKey storetypes.StoreKey - btcLightClientKeeper types.BTCLightClientKeeper - checkpointingKeeper types.CheckpointingKeeper - powLimit *big.Int - expectedCheckpointTag txformat.BabylonTag - authority string + cdc codec.BinaryCodec + storeKey storetypes.StoreKey + tstoreKey storetypes.StoreKey + memKey storetypes.StoreKey + btcLightClientKeeper types.BTCLightClientKeeper + checkpointingKeeper types.CheckpointingKeeper + powLimit *big.Int + authority string } submissionBtcError string @@ -65,20 +65,18 @@ func NewKeeper( bk types.BTCLightClientKeeper, ck types.CheckpointingKeeper, powLimit *big.Int, - expectedTag txformat.BabylonTag, authority string, ) Keeper { return Keeper{ - cdc: cdc, - storeKey: storeKey, - tstoreKey: tstoreKey, - memKey: memKey, - btcLightClientKeeper: bk, - checkpointingKeeper: ck, - powLimit: powLimit, - expectedCheckpointTag: expectedTag, - authority: authority, + cdc: cdc, + storeKey: storeKey, + tstoreKey: tstoreKey, + memKey: memKey, + btcLightClientKeeper: bk, + checkpointingKeeper: ck, + powLimit: powLimit, + authority: authority, } } @@ -86,8 +84,20 @@ func (k Keeper) GetPowLimit() *big.Int { return k.powLimit } -func (k Keeper) GetExpectedTag() txformat.BabylonTag { - return k.expectedCheckpointTag +// GetExpectedTag retrerieves checkpoint tag from params and decodes it from +// hex string to bytes. +// NOTE: keeper could probably cache decoded tag, but it is rather improbable this function +// will ever be a bottleneck so it is not worth it. +func (k Keeper) GetExpectedTag(ctx sdk.Context) txformat.BabylonTag { + tag := k.GetParams(ctx).CheckpointTag + + tagAsBytes, err := hex.DecodeString(tag) + + if err != nil { + panic("Tag should always be valid") + } + + return txformat.BabylonTag(tagAsBytes) } func (k Keeper) Logger(ctx sdk.Context) log.Logger { diff --git a/x/btccheckpoint/keeper/msg_server.go b/x/btccheckpoint/keeper/msg_server.go index 45507a3d2..08906227e 100644 --- a/x/btccheckpoint/keeper/msg_server.go +++ b/x/btccheckpoint/keeper/msg_server.go @@ -25,15 +25,16 @@ func NewMsgServerImpl(keeper Keeper) types.MsgServer { // TODO emit some events for external consumers. Those should be probably emited // at EndBlockerCallback func (m msgServer) InsertBTCSpvProof(ctx context.Context, req *types.MsgInsertBTCSpvProof) (*types.MsgInsertBTCSpvProofResponse, error) { - rawSubmission, err := types.ParseSubmission(req, m.k.GetPowLimit(), m.k.GetExpectedTag()) + + // Get the SDK wrapped context + sdkCtx := sdk.UnwrapSDKContext(ctx) + + rawSubmission, err := types.ParseSubmission(req, m.k.GetPowLimit(), m.k.GetExpectedTag(sdkCtx)) if err != nil { return nil, types.ErrInvalidCheckpointProof.Wrap(err.Error()) } - // Get the SDK wrapped context - sdkCtx := sdk.UnwrapSDKContext(ctx) - submissionKey := rawSubmission.GetSubmissionKey() if m.k.SubmissionExists(sdkCtx, submissionKey) { diff --git a/x/btccheckpoint/keeper/params.go b/x/btccheckpoint/keeper/params.go index a9f7dd3ed..c69f94aa2 100644 --- a/x/btccheckpoint/keeper/params.go +++ b/x/btccheckpoint/keeper/params.go @@ -10,11 +10,9 @@ func (k Keeper) SetParams(ctx sdk.Context, p types.Params) error { if err := p.Validate(); err != nil { return err } - store := ctx.KVStore(k.storeKey) bz := k.cdc.MustMarshal(&p) store.Set(types.ParamsKey, bz) - return nil } @@ -25,7 +23,6 @@ func (k Keeper) GetParams(ctx sdk.Context) (p types.Params) { if bz == nil { return p } - k.cdc.MustUnmarshal(bz, &p) return p } diff --git a/x/btccheckpoint/types/genesis_test.go b/x/btccheckpoint/types/genesis_test.go index 2b24794ac..068fd4e15 100644 --- a/x/btccheckpoint/types/genesis_test.go +++ b/x/btccheckpoint/types/genesis_test.go @@ -24,6 +24,7 @@ func TestGenesisState_Validate(t *testing.T) { Params: types.Params{ BtcConfirmationDepth: 124, CheckpointFinalizationTimeout: 12222, + CheckpointTag: types.DefaultCheckpointTag, }, }, valid: true, diff --git a/x/btccheckpoint/types/params.go b/x/btccheckpoint/types/params.go index 4c61c889c..0a33579d6 100644 --- a/x/btccheckpoint/types/params.go +++ b/x/btccheckpoint/types/params.go @@ -1,19 +1,24 @@ package types import ( + "encoding/hex" fmt "fmt" + + txformat "github.com/babylonchain/babylon/btctxformatter" ) const ( DefaultBtcConfirmationDepth uint64 = 10 DefaultCheckpointFinalizationTimeout uint64 = 100 + DefaultCheckpointTag = "01020304" ) // NewParams creates a new Params instance -func NewParams(btcConfirmationDepth uint64, checkpointFinalizationTimeout uint64) Params { +func NewParams(btcConfirmationDepth uint64, checkpointFinalizationTimeout uint64, checkpointTag string) Params { return Params{ BtcConfirmationDepth: btcConfirmationDepth, CheckpointFinalizationTimeout: checkpointFinalizationTimeout, + CheckpointTag: checkpointTag, } } @@ -22,6 +27,7 @@ func DefaultParams() Params { return NewParams( DefaultBtcConfirmationDepth, DefaultCheckpointFinalizationTimeout, + DefaultCheckpointTag, ) } @@ -33,6 +39,11 @@ func (p Params) Validate() error { if err := validateCheckpointFinalizationTimeout(p.CheckpointFinalizationTimeout); err != nil { return err } + + if err := validateCheckpointTag(p.CheckpointTag); err != nil { + return err + } + if p.BtcConfirmationDepth >= p.CheckpointFinalizationTimeout { return fmt.Errorf("BtcConfirmationDepth should be smaller than CheckpointFinalizationTimeout") } @@ -65,3 +76,23 @@ func validateCheckpointFinalizationTimeout(i interface{}) error { return nil } + +func validateCheckpointTag(i interface{}) error { + t, ok := i.(string) + + if !ok { + return fmt.Errorf("invalid parameter type: %T", i) + } + + decoded, err := hex.DecodeString(t) + + if err != nil { + return fmt.Errorf("checkpoint tag should be in valid hex format") + } + + if len(decoded) != txformat.TagLength { + return fmt.Errorf("checkpoint tag should have exactly %d bytes", txformat.TagLength) + } + + return nil +} diff --git a/x/btccheckpoint/types/params.pb.go b/x/btccheckpoint/types/params.pb.go index a71c4b449..4f6d10a6c 100644 --- a/x/btccheckpoint/types/params.pb.go +++ b/x/btccheckpoint/types/params.pb.go @@ -36,6 +36,9 @@ type Params struct { // If a checkpoint has not been reported back within w BTC blocks, then BBN // has dishonest majority and is stalling checkpoints (w in research paper) CheckpointFinalizationTimeout uint64 `protobuf:"varint,2,opt,name=checkpoint_finalization_timeout,json=checkpointFinalizationTimeout,proto3" json:"checkpoint_finalization_timeout,omitempty" yaml:"checkpoint_finalization_timeout"` + // 4byte tag in hex format, required to be present in the OP_RETURN transaction + // related to babylon + CheckpointTag string `protobuf:"bytes,3,opt,name=checkpoint_tag,json=checkpointTag,proto3" json:"checkpoint_tag,omitempty" yaml:"checkpoint_tag"` } func (m *Params) Reset() { *m = Params{} } @@ -85,6 +88,13 @@ func (m *Params) GetCheckpointFinalizationTimeout() uint64 { return 0 } +func (m *Params) GetCheckpointTag() string { + if m != nil { + return m.CheckpointTag + } + return "" +} + func init() { proto.RegisterType((*Params)(nil), "babylon.btccheckpoint.v1.Params") } @@ -94,24 +104,27 @@ func init() { } var fileDescriptor_5445a19005ae983c = []byte{ - // 271 bytes of a gzipped FileDescriptorProto + // 306 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x4d, 0x4a, 0x4c, 0xaa, 0xcc, 0xc9, 0xcf, 0xd3, 0x4f, 0x2a, 0x49, 0x4e, 0xce, 0x48, 0x4d, 0xce, 0x2e, 0xc8, 0xcf, 0xcc, 0x2b, 0xd1, 0x2f, 0x33, 0xd4, 0x2f, 0x48, 0x2c, 0x4a, 0xcc, 0x2d, 0xd6, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x92, 0x80, 0x2a, 0xd3, 0x43, 0x51, 0xa6, 0x57, 0x66, 0x28, 0x25, 0x92, 0x9e, 0x9f, - 0x9e, 0x0f, 0x56, 0xa4, 0x0f, 0x62, 0x41, 0xd4, 0x2b, 0xdd, 0x66, 0xe4, 0x62, 0x0b, 0x00, 0x1b, + 0x9e, 0x0f, 0x56, 0xa4, 0x0f, 0x62, 0x41, 0xd4, 0x2b, 0xcd, 0x65, 0xe2, 0x62, 0x0b, 0x00, 0x1b, 0x20, 0x14, 0xce, 0x25, 0x96, 0x54, 0x92, 0x1c, 0x9f, 0x9c, 0x9f, 0x97, 0x96, 0x59, 0x94, 0x9b, 0x58, 0x92, 0x99, 0x9f, 0x17, 0x9f, 0x92, 0x5a, 0x50, 0x92, 0x21, 0xc1, 0xa8, 0xc0, 0xa8, 0xc1, 0xe2, 0xa4, 0xf8, 0xe9, 0x9e, 0xbc, 0x6c, 0x65, 0x62, 0x6e, 0x8e, 0x95, 0x12, 0x76, 0x75, 0x4a, 0x41, 0x22, 0x49, 0x25, 0xc9, 0xce, 0x48, 0xe2, 0x2e, 0x20, 0x61, 0xa1, 0x22, 0x2e, 0x79, 0x84, 0x53, 0xe2, 0xd3, 0x32, 0xf3, 0x12, 0x73, 0x32, 0xab, 0x20, 0xfa, 0x4a, 0x32, 0x73, 0x53, 0xf3, 0x4b, 0x4b, 0x24, 0x98, 0xc0, 0x36, 0x68, 0x7d, 0xba, 0x27, 0xaf, 0x06, 0xb1, 0x81, 0x80, 0x06, - 0xa5, 0x20, 0x59, 0x84, 0x0a, 0x37, 0x24, 0x05, 0x21, 0x10, 0x79, 0x2b, 0x96, 0x17, 0x0b, 0xe4, - 0x19, 0x9d, 0xfc, 0x4f, 0x3c, 0x92, 0x63, 0xbc, 0xf0, 0x48, 0x8e, 0xf1, 0xc1, 0x23, 0x39, 0xc6, - 0x09, 0x8f, 0xe5, 0x18, 0x2e, 0x3c, 0x96, 0x63, 0xb8, 0xf1, 0x58, 0x8e, 0x21, 0xca, 0x34, 0x3d, - 0xb3, 0x24, 0xa3, 0x34, 0x49, 0x2f, 0x39, 0x3f, 0x57, 0x1f, 0x1a, 0x64, 0xc9, 0x19, 0x89, 0x99, - 0x79, 0x30, 0x8e, 0x7e, 0x05, 0x5a, 0x40, 0x97, 0x54, 0x16, 0xa4, 0x16, 0x27, 0xb1, 0x81, 0x43, - 0xcd, 0x18, 0x10, 0x00, 0x00, 0xff, 0xff, 0x67, 0xe2, 0x30, 0x84, 0x8e, 0x01, 0x00, 0x00, + 0xa5, 0x20, 0x59, 0x84, 0x0a, 0x37, 0x24, 0x05, 0x21, 0x10, 0x79, 0x21, 0x07, 0x2e, 0x3e, 0x24, + 0x23, 0x4a, 0x12, 0xd3, 0x25, 0x98, 0x15, 0x18, 0x35, 0x38, 0x9d, 0x24, 0x3f, 0xdd, 0x93, 0x17, + 0xc5, 0xb0, 0xa2, 0x24, 0x31, 0x5d, 0x29, 0x88, 0x17, 0x21, 0x10, 0x92, 0x98, 0x6e, 0xc5, 0xf2, + 0x62, 0x81, 0x3c, 0xa3, 0x93, 0xff, 0x89, 0x47, 0x72, 0x8c, 0x17, 0x1e, 0xc9, 0x31, 0x3e, 0x78, + 0x24, 0xc7, 0x38, 0xe1, 0xb1, 0x1c, 0xc3, 0x85, 0xc7, 0x72, 0x0c, 0x37, 0x1e, 0xcb, 0x31, 0x44, + 0x99, 0xa6, 0x67, 0x96, 0x64, 0x94, 0x26, 0xe9, 0x25, 0xe7, 0xe7, 0xea, 0x43, 0x03, 0x3d, 0x39, + 0x23, 0x31, 0x33, 0x0f, 0xc6, 0xd1, 0xaf, 0x40, 0x8b, 0xaa, 0x92, 0xca, 0x82, 0xd4, 0xe2, 0x24, + 0x36, 0x70, 0xb8, 0x1b, 0x03, 0x02, 0x00, 0x00, 0xff, 0xff, 0xf7, 0x78, 0xcb, 0x81, 0xd0, 0x01, + 0x00, 0x00, } func (this *Params) Equal(that interface{}) bool { @@ -139,6 +152,9 @@ func (this *Params) Equal(that interface{}) bool { if this.CheckpointFinalizationTimeout != that1.CheckpointFinalizationTimeout { return false } + if this.CheckpointTag != that1.CheckpointTag { + return false + } return true } func (m *Params) Marshal() (dAtA []byte, err error) { @@ -161,6 +177,13 @@ func (m *Params) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if len(m.CheckpointTag) > 0 { + i -= len(m.CheckpointTag) + copy(dAtA[i:], m.CheckpointTag) + i = encodeVarintParams(dAtA, i, uint64(len(m.CheckpointTag))) + i-- + dAtA[i] = 0x1a + } if m.CheckpointFinalizationTimeout != 0 { i = encodeVarintParams(dAtA, i, uint64(m.CheckpointFinalizationTimeout)) i-- @@ -197,6 +220,10 @@ func (m *Params) Size() (n int) { if m.CheckpointFinalizationTimeout != 0 { n += 1 + sovParams(uint64(m.CheckpointFinalizationTimeout)) } + l = len(m.CheckpointTag) + if l > 0 { + n += 1 + l + sovParams(uint64(l)) + } return n } @@ -273,6 +300,38 @@ func (m *Params) Unmarshal(dAtA []byte) error { break } } + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CheckpointTag", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowParams + } + 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 ErrInvalidLengthParams + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthParams + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.CheckpointTag = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipParams(dAtA[iNdEx:]) diff --git a/x/zoneconcierge/keeper/proof_epoch_submitted_test.go b/x/zoneconcierge/keeper/proof_epoch_submitted_test.go index 26e4e1d99..969ab86d6 100644 --- a/x/zoneconcierge/keeper/proof_epoch_submitted_test.go +++ b/x/zoneconcierge/keeper/proof_epoch_submitted_test.go @@ -1,6 +1,7 @@ package keeper_test import ( + "encoding/hex" "math/rand" "testing" @@ -60,10 +61,11 @@ func FuzzProofEpochSubmitted(f *testing.F) { // net param, babylonTag powLimit := chaincfg.SimNetParams.PowLimit - babylonTag := txformat.MainTag(0) + babylonTag := btcctypes.DefaultCheckpointTag + tagAsBytes, _ := hex.DecodeString(babylonTag) // verify - err = zckeeper.VerifyEpochSubmitted(rawCkpt, txsInfo, btcHeaders, powLimit, babylonTag) + err = zckeeper.VerifyEpochSubmitted(rawCkpt, txsInfo, btcHeaders, powLimit, txformat.BabylonTag(tagAsBytes)) require.NoError(t, err) }) } From 4d7654ea8fad54b4f86b9ad0df5a6b625dbb7e45 Mon Sep 17 00:00:00 2001 From: KonradStaniec Date: Wed, 26 Apr 2023 06:31:41 +0200 Subject: [PATCH 43/59] Add last block height to finalized epoch info (#361) --- wasmbinding/bindings/query.go | 21 ++++++---- wasmbinding/test/custom_query_test.go | 18 ++++++--- wasmbinding/testdata/Cargo.lock | 36 +++++++++--------- wasmbinding/testdata/artifacts/checksums.txt | 4 +- .../artifacts/checksums_intermediate.txt | 2 +- .../testdata/artifacts/testdata-aarch64.wasm | Bin 167071 -> 167091 bytes wasmbinding/testdata/artifacts/testdata.wasm | Bin 165873 -> 167093 bytes wasmbinding/wasm.go | 17 +++++++-- 8 files changed, 61 insertions(+), 37 deletions(-) diff --git a/wasmbinding/bindings/query.go b/wasmbinding/bindings/query.go index 5d1051994..7bef9606f 100644 --- a/wasmbinding/bindings/query.go +++ b/wasmbinding/bindings/query.go @@ -1,12 +1,12 @@ package bindings type BabylonQuery struct { - Epoch *struct{} `json:"epoch,omitempty"` - LatestFinalizedEpoch *struct{} `json:"latest_finalized_epoch,omitempty"` - BtcTip *struct{} `json:"btc_tip,omitempty"` - BtcBaseHeader *struct{} `json:"btc_base_header,omitempty"` - BtcHeaderByHash *BtcHeaderByHash `json:"btc_header_by_hash,omitempty"` - BtcHeaderByHeight *BtcHeaderByHeight `json:"btc_header_by_height,omitempty"` + Epoch *struct{} `json:"epoch,omitempty"` + LatestFinalizedEpochInfo *struct{} `json:"latest_finalized_epoch_info,omitempty"` + BtcTip *struct{} `json:"btc_tip,omitempty"` + BtcBaseHeader *struct{} `json:"btc_base_header,omitempty"` + BtcHeaderByHash *BtcHeaderByHash `json:"btc_header_by_hash,omitempty"` + BtcHeaderByHeight *BtcHeaderByHeight `json:"btc_header_by_height,omitempty"` } type BtcHeaderByHash struct { @@ -21,8 +21,13 @@ type CurrentEpochResponse struct { Epoch uint64 `json:"epoch"` } -type LatestFinalizedEpochResponse struct { - Epoch uint64 `json:"epoch"` +type LatestFinalizedEpochInfoResponse struct { + EpochInfo *FinalizedEpochInfo `json:"epoch_info,omitempty"` +} + +type FinalizedEpochInfo struct { + EpochNumber uint64 `json:"epoch_number"` + LastBlockHeight uint64 `json:"last_block_height"` } type BtcBlockHeader struct { diff --git a/wasmbinding/test/custom_query_test.go b/wasmbinding/test/custom_query_test.go index 03748b85a..3e2786a49 100644 --- a/wasmbinding/test/custom_query_test.go +++ b/wasmbinding/test/custom_query_test.go @@ -65,16 +65,20 @@ func TestFinalizedEpoch(t *testing.T) { contractAddress := deployTestContract(t, ctx, babylonApp, acc, pathToContract) query := bindings.BabylonQuery{ - LatestFinalizedEpoch: &struct{}{}, + LatestFinalizedEpochInfo: &struct{}{}, } // There is no finalized epoch yet so we require an error queryCustomErr(t, ctx, babylonApp, contractAddress, query) - _ = babylonApp.ZoneConciergeKeeper.Hooks().AfterRawCheckpointFinalized(ctx, 5) - resp := bindings.CurrentEpochResponse{} + epoch := babylonApp.EpochingKeeper.IncEpoch(ctx) + + _ = babylonApp.ZoneConciergeKeeper.Hooks().AfterRawCheckpointFinalized(ctx, epoch.EpochNumber) + + resp := bindings.LatestFinalizedEpochInfoResponse{} queryCustom(t, ctx, babylonApp, contractAddress, query, &resp) - require.Equal(t, resp.Epoch, uint64(5)) + require.Equal(t, resp.EpochInfo.EpochNumber, epoch.EpochNumber) + require.Equal(t, resp.EpochInfo.LastBlockHeight, epoch.GetLastBlockHeight()) } func TestQueryBtcTip(t *testing.T) { @@ -187,8 +191,12 @@ func TestQueryNonExistingHeader(t *testing.T) { } func setupAppWithContext(t *testing.T) (*app.BabylonApp, sdk.Context) { + return setupAppWithContextAndCustomHeight(t, 1) +} + +func setupAppWithContextAndCustomHeight(t *testing.T, height int64) (*app.BabylonApp, sdk.Context) { babylonApp := app.Setup(t, false) - ctx := babylonApp.BaseApp.NewContext(false, tmproto.Header{Height: 1, Time: time.Now().UTC()}) + ctx := babylonApp.BaseApp.NewContext(false, tmproto.Header{Height: height, Time: time.Now().UTC()}) return babylonApp, ctx } diff --git a/wasmbinding/testdata/Cargo.lock b/wasmbinding/testdata/Cargo.lock index 1a5e7aee3..6933a42cf 100644 --- a/wasmbinding/testdata/Cargo.lock +++ b/wasmbinding/testdata/Cargo.lock @@ -16,7 +16,7 @@ dependencies = [ [[package]] name = "babylon-bindings" version = "0.1.0" -source = "git+https://github.com/babylonchain/bindings?branch=main#c9a0b2e60203785f4ae21bca4ccde987e27e49e0" +source = "git+https://github.com/babylonchain/bindings?branch=main#7c209ab2cd289b9bad57958d5bc074cb8ded5a5c" dependencies = [ "cosmwasm-schema", "cosmwasm-std", @@ -27,7 +27,7 @@ dependencies = [ [[package]] name = "babylon-example" version = "0.1.0" -source = "git+https://github.com/babylonchain/bindings?branch=main#c9a0b2e60203785f4ae21bca4ccde987e27e49e0" +source = "git+https://github.com/babylonchain/bindings?branch=main#7c209ab2cd289b9bad57958d5bc074cb8ded5a5c" dependencies = [ "babylon-bindings", "cosmwasm-schema", @@ -94,9 +94,9 @@ checksum = "520fbf3c07483f94e3e3ca9d0cfd913d7718ef2483d2cfd91c0d9e91474ab913" [[package]] name = "cosmwasm-crypto" -version = "1.2.3" +version = "1.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f22add0f9b2a5416df98c1d0248a8d8eedb882c38fbf0c5052b64eebe865df6d" +checksum = "b76d2207945b8aa3ce0735da53ab9a74f75fe3e7794754c216a9edfa04e1e627" dependencies = [ "digest 0.10.6", "ed25519-zebra", @@ -107,18 +107,18 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.3" +version = "1.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2e64f710a18ef90d0a632cf27842e98ffc2d005a38a6f76c12fd0bc03bc1a2d" +checksum = "1dd07af7736164d2d8126dc67fdb33b1b5c54fb5a3190395c47f46d24fc6d592" dependencies = [ "syn 1.0.109", ] [[package]] name = "cosmwasm-schema" -version = "1.2.3" +version = "1.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe5ad2e23a971b9e4cd57b20cee3e2e79c33799bed4b128e473aca3702bfe5dd" +checksum = "3e9e92cdce475a91659d0dc4d17836a484fc534e80e787281aa4adde4cb1798b" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -129,9 +129,9 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.3" +version = "1.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2926d159a9bb1a716a592b40280f1663f2491a9de3b6da77c0933cee2a2655b8" +checksum = "69681bac3dbeb0b00990279e3ed39e3d4406b29f538b16b712f6771322a45048" dependencies = [ "proc-macro2", "quote", @@ -140,9 +140,9 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.3" +version = "1.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76fee88ff5bf7bef55bd37ac0619974701b99bf6bd4b16cf56ee8810718abd71" +checksum = "8d39f20967baeb94709123f7bba13a25ae2fa166bc5e7813f734914df3f8f6a1" dependencies = [ "base64", "cosmwasm-crypto", @@ -160,9 +160,9 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.3" +version = "1.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "639bc36408bc1ac45e3323166ceeb8f0b91b55a941c4ad59d389829002fbbd94" +checksum = "88f7944b5204c3a998f73248925a097ace887bdf01c2f70de00d8b92cd69e807" dependencies = [ "cosmwasm-std", "serde", @@ -170,9 +170,9 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.2.6" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "280a9f2d8b3a38871a3c8a46fb80db65e5e5ed97da80c4d08bf27fb63e35e181" +checksum = "3e4c1eaa2012c47becbbad2ab175484c2a84d1185b566fb2cc5b8707343dfe58" dependencies = [ "libc", ] @@ -404,9 +404,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.141" +version = "0.2.142" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3304a64d199bb964be99741b7a14d26972741915b3649639149b2479bb46f4b5" +checksum = "6a987beff54b60ffa6d51982e1aa1146bc42f19bd26be28b0586f252fccf5317" [[package]] name = "once_cell" diff --git a/wasmbinding/testdata/artifacts/checksums.txt b/wasmbinding/testdata/artifacts/checksums.txt index c260c026b..3378550b7 100644 --- a/wasmbinding/testdata/artifacts/checksums.txt +++ b/wasmbinding/testdata/artifacts/checksums.txt @@ -1,2 +1,2 @@ -85a05952497b1d42cedfd25d16057af25b0ac8e67040852efcdf106577a9f36a testdata-aarch64.wasm -364ac6b66b9677ea28cfe67c42a5c0ba6a63d955aa4ff28eacc2be5628611fdf testdata.wasm +68dda2e9227ae65bcf56a41201a9eda05002b7f19b97d50ce09c79f818771e8f testdata-aarch64.wasm +5afdc819d10798874793abc813c0dbb70dcf3cec05aa0e84e3128234f8f9f498 testdata.wasm diff --git a/wasmbinding/testdata/artifacts/checksums_intermediate.txt b/wasmbinding/testdata/artifacts/checksums_intermediate.txt index dfe43e681..91167e136 100644 --- a/wasmbinding/testdata/artifacts/checksums_intermediate.txt +++ b/wasmbinding/testdata/artifacts/checksums_intermediate.txt @@ -1 +1 @@ -cba16345ebd363489d35b12a796b1db9a8131e90abfe0391bb3cd84cbee77e22 ./target/wasm32-unknown-unknown/release/testdata.wasm +3f81b570cc1ec35e77e7ee5856cfe0596a934d0d9aae776313f247734b67e7a1 ./target/wasm32-unknown-unknown/release/testdata.wasm diff --git a/wasmbinding/testdata/artifacts/testdata-aarch64.wasm b/wasmbinding/testdata/artifacts/testdata-aarch64.wasm index e67313fbe55faebf2ddc6afaf20eccc017ba202b..c29e5f8d78d2f6c60855551e419300f83a54d3cb 100644 GIT binary patch delta 27417 zcmeHweSB5L@%NcM_bs{iCWpMgbM7@j0tAA*gf}rqM6gx`tJYd8AYdUu0s%#>njnby zTJ(U6MJ={ev7*vK4Jy`v_>O{#iWL=Fs#FlLQl*Oed}sIEo0|aY)Bc|4`R9?($)0_i zot>SXnVs2l{q>#ctM5!-b*X5g#D6B4WC$Y|Ff-DEK{K2Y4x2$T68{munm)geOv4QL z@i+M&YLHDc{if+hMFJpt2s40xrV%jkY6OFR!!!fnS0BfW9HC0_YQMHQw!xk zN`In{DEE)FhWggJwpq{t>TyB7WHqjc%3`lA#(NKdj$VWU$Of4zSf_K9j~vRdQnD~rVXvF z#sE>_#3MOjTR0DR*}_ORXK(ScC6O%7{_`o_xH!^@v#)#E&Jl~V4|&?>c zOu+Uzhc=|t9NOTHT)blSIV0^eMnv0t5#Z_ zlJ))wra;cy?%gZTrX8;RP_Y|*C`-M?<;K5Lojd8l?Rn4dY!B{5LIzxT=) zTa8M?s4)!8#Hw?ar{>Z9uGIXZ7u~fl-bDS}u`d^kO)t7vy*$WW`qI#Di3umrtk7sO zwqT>RAcu9P5nkqg{n8sJ9t6M&!x*3jMD5HUAOro``}BOz?39#>M9(5Y4x*PYUn#!-Mq;y zeeEKTe~z`F;Ga(SC-~=Bjj-z5U;D^j^YXVLweDpFY1^i6YqVpN`}rHktv+SzS=2>? ztHp|GCK{!ea3GR_SOg4)C3LTOqsZ1UkJWP1%d0YVt$vl4aoFyML{gUNeRkM*;W?z4F+R$0w>yjw_#fu`Q2N$&8COkz}qwN z_sX}=K(8F#3kmmn>us-BNcFn?FK4<_zQ}i<{iGb*d(S6bvIQj74x`TTHO8`SUzJf9 zGiB9tl<(fX$I9_X$w`X|7T11Xtz+@4Ykz6`P~da_z9&XLH@J7wkNvjg_!$3OFt4-y z6UD?MW01w^PVN9<*y*-^u;GI!b13GAxGSiu5Qgqz9lOiz+ef-14rZFCM9B?*Rr(X? zh2RK`;&ToF;}%F>$7lV8Y+r?#?&OY)@>~uZ3_6yFP*?{#u7I@E9Vd;1@wbbt6b1Itt&_qp%w$OqLw+tC*b z*nMX=Na3?~_5jk?>@4r*A0TSAeypvx1J)|CMTMwk(gYyDFkRtP)LGBEFYJ8f0-#YF z7fxWLB52P#;Imy(ir35MlyJc&qpngIJS87b?(7;-uHR0s5jl7hELqh&(l8IaK}3O( zOgTD4Wn&5$L`7YtY1Ej8tr*bf*ll@C-v>@e)MEtGLQ7WBKI|*}(c{PC+#eXYBfA&w8lJWS#H=#P zv8R5&t1{?!XhtlxBi0~vFd4e`3F^4;nzMm6@N=UJOlc- z{=+$Wt9Szht?d+1_ER&}*+J_;SL_~#W)pT#$KS2H>;L~kx91nN(AYtrd=&dXAPRf6 z7lntuLlnBd+FKHBCnmpL=B@l6m3i?nHn73AdAhIG9rN|5ZiXPyO=B)xAE=CwJub zOcP?xE%~^#2?vw(3}Ffu7%`y~a3F57R`DyXvVztYC0{ z@Y@-_CcD({0a(reLa6|RZko-VdnVLV0%mxC7-jn_%~8-u{-j0%>}tsR&i@+hp0%%- z!tUsOB@tUd@z|zSj{WXF_3@|(kO7P43Kq~hZEM$ zYXE@}7!l>HZs5&2*}$E;uRHe0oX-l~`}Y-xL1j<16}d0(gKBdR?CW;A2Mp>fz*-Kd zOpSp;6=E{1791^(>-suSU0fsxI4Q>W2GX=L)!_Cleac=de zXwOXBueGOt@j~hm3OL5dSXqSJ>H8}|`^EbxFT*zi6Sm758+oMz?tS|Qw)}u-ExBiW zQT!iq*XpTX-tvE$v+maNK7}>^8_qgDfMbvm$pmYa{?`oVp_b$y)=2-K!HBjJ3EA1C zVMs1Cafd=poG+E5~Eg&b2og1(uwHACQTkoNb#ts!wLW?e(VmQB zHA;9goUJUUYH&7QKy}W|@VYp=H_A1c)OGdzHMdboiD8p%0PQNnaKtR+48(Vm_eHMPDWg;P_Alo4C~PUiN4gx9ZWNfqUOTHtPJF6DBMA z&Epn}_)iE0=(mGm+?6PZ)LEC=!rj~tjOZ(ET|M-B!YId5=XC*+jB?kUdYA&0{ZIV(ArjU2d)oF$ygK@PmdT;Qu4 zAR;I~xDDm$&etlj4aEd#YRy73jYHOBJ+pQLQ9gDh_{kaOj()7Sd&%0~{f05e2<$>f zzoAN-bekVL zJ+c>QX-C?M&2oGRtgQWy6-KrlQQH0S!bs~8rIS#){D{(JD4o}#w0C3&)}Z}Jc~2B( zFH4r9GK8tEH(ck5zMV?JPGBbJbsV1zXT@f>;K@+}$=JCC;+ZtJ^Ys<(qzy&xpP$Ul z-t`(ow)G5oq8ki%%lZm8`sc#z=R4Ltt?S19xiD)*$GTyv+iFxTJZe?Ca$$pqHiB`U zD$m~iYKMVQZm&Pyo&8i{*1C>$8u*K-T6XlR($>PP-CH_9)V-#+hG-auEGc5HVlLTq zWJ8Rc1};@h-oEkjqcuJ)ySZcWGnzKPTVI&HS8+`WO`qjDC$cqJj9Ve$@>D|YB%P929i~{iv8?O!+%(cAB@@D}L(}ma zbDCCZsHv1+iy}~-!yk6r6c=fjsSTIuh7eV$4fpaQX0=$W`wO%RRATR)K=^JsO#k%K*Dv-ILC0d zazl=?uzv(Ys5}Q+LQYYgo#E`-zWVBW4%6`m-}TzTLg02PuiBv{C^YXquby-0H}AdG z4=$@RPhG?1V;DX7=xiy*{B6WHej#?zEo<%5$@6vUtO2c`BQleJ#H(q5;(M zZUKU+^1K4-efG0^Tea3!dU_S-SZgaieHZ6EJ)O$@hxVX6-MN;l(=izcvYYYFdRj5R zJfVP!#pA-A^H`}oSWI2R2hc;W!7e$j1kQCRzVO!eh1KCT?F;ffWdlN{88DnPM|dQg9{_hor!59*9*%g1`q(qhjLG@Wg5ns}BV@SR|U zSIdT;bWZ8}fX&uGzdA=*bZr_N3m*8A5L8&3`FS^W~JGG%)QQ z&IPRbLM|Id#qyb6Zi$4m$@_y)VWk)ZQ8*~!*I5JCi^^11#;^KsybTN&{4aF+PXdv z`h>9$S@Y#zpQg`4I}kA2oEBU^Ci zVnxeWTc{6-&s$~nYjnJq7RhT~qpL!9GfsZsggX{QC}qYZ=-uccW}=jdY=9^-HV?4-==_i4Fpq&h7bdp?v?Zbb)xrlv{REOxn9>!l|EXhGM5D^WkSY&&PX12U##8hZSKK zn$7{#dL)7~Qj_Q~mzh9n(=O`rg9Nw$4h-K04(1%Cf&<&}${@DrffKU%Lnx-kztg(x zn>wzXbyFJ&vu`}2_C{Sh{{xzvePI52<`X8XcMarSS@IzbO0DoNY`iNce@H(SHwd@s z;Vx;1xg&@z+=m`6lF{9?zulb;F;}={e|)|Dr424@UVWmzwb8P4FP%;DofE7g@> zbWp1Ml=AJm;}8_ZRFD^*6tXTt5cm*EaJo00-B2d0{*BDdU&v)yRIPMxR`Zt{kaDZ= zUfm~I51Rlaf4HB{&feyY)Yia|P|l<2khF4WSiT0Y{Ok$vtgGb5AJc%W%+cC~mlc`IS&shfX64f3=xF*>lDQfLZoa!LX z;sWP$rxfBU6R(J>N1al3dPLa+7_y@$T@R<&7E^o0a_gKo=d5pc@#fXkJPgVgQuFJP z=?_g)V;D>h9O5vnc8vX+{gYN*EDd-aK=|Abl>Km6A~?=IQ@8V;vQd0*A)wubI9mj) z6>uDKpci)*Ad5NRV8=rorWY~z+pCNMliFMwaQU_tZ(mQXK`G~ zf@2g0bGpNxTsD^7clTyCW#gJhN=Q2$tdbJa#-t}QO%br-@DJ{EAadrfG$z%U@Reew zd*KB%aP?`VZDR6)Ft~>&q-o$h?P+5b@<7OowSeve-!sBO&h921T8roq5fjf2!uiFa z2tQvZKoeYN(3cT-WOH1N$=5R!pCSN?1|T-piUUe!?8*mgvLM-a}N-vYt6PH?@%TYH608!~Fr z8p}s8e|@h6$wb^MX+k;4=To7pD!G`jNF-8tB475!jZ1h6{0M$r9@!A@r ze;BKZIX1E(6JgIa2CT+K6mLa`GKtlK4peVyKK){ey@37sTQ%`<+=ZDujaM12bEiq& zG)lv9j4?M*f|*A=22Jx8j2ogs>RQ58%*{b|94b7If2HV$>rm)aA%?P?N@HF|U)7Z7 zi3><9<2WE;#c|66m^4Aulqj5ocvD*nWJH4;P+SFS0@l5dM_vzRERK%E(l{x=0;;AV z4lxK7dI0l88ClHFz#C?x5REd&`A`t`=H@|B5t$?ymV;^R3kY!k0wjobg{jYZ9vecx^8KOZ6o>X$;AxRshHxIJkhplHuk)->V9?RqYJBqujAJfi z3#_^>&X>HPYT~AMGl|{$5Idnd*?JlUhpGEsXrj0$fks6N7G^agF*NEcQ$`#}7!K8E2x7S_ct*Hx1`QkwX$|6+`$yA|JQWv1*on2q9Yezc zTo*&U@C=I60eRaQ)aUen%x5zdLS!lQ6UGO7DtnNL?tIRbemKeyOG(s&-MJxHxyp!G z|6(bldkE)UnRzDlDenl9<$T9JvX?31u%Eru^irWx+0zs~A*AGt^JrAA5^{dM`{G`3 z&o4hYo9sfC%*U*b=VMKhbP64VPTtAlsC0Vj9C&k1ygnlDA47$fw!^H&2;niE{BqeD zbX-?9uzaA9FG-=JOgEyZHRLP`TiV!5fbrGJ-lmAj*|>W@2Vr3%?%Z^dC{UlV_fK(}2R)bvJUIXM85>NYz1K zEBu>ysntT}V4#A!D#PIQ#|i4lLKqN77P2H_;VMdvcJ^7PcL3IfmkJ z-B!rv^Jvh2%nm)H$KEV__&nBT0TWaS*wg#Yq3Uk8@^VMNYq>SKT*{U1|W z-hD?KCb9NzuL?_rN3bADgCtv*5f?Ze@cK45Y4PIa7??)OBZo^06v-lVj;gGRqE2mj;sM< ziK>Q9)##nZ*mauDw}<&I8a_Iy5SPb5OceS?D{at0MKU^8H?^yW5%+D~aWqaD3xXuEU`J?E zyf^tjQrvP>IOEz0Z5r+-aHakRW(kv ziQCg>qXnN}*t`J$#vxS=+)qhZGj zNe0!##kc_!i#Snzz5A$J35`4Mq=fm?ZWryvwwTqniD1hev4>W++e1y>CW6)OZKB$G zbYh-4jnS{wTj*rHg+}3CsG4J9p35l1Px#g_0IMp&p=uh(+6&6mOR3Ciw^Nwud~(%= zREBk73t3GYB=STOQ%o%rNb7u@oNI0U0O3t_jVCTva=J-Pb%iG`Sj?bM&2$x)VUqZZ zy`rbOfbSw<$~O}x+X*iVi5CnsP#22ig=4AUICZnX0)TLvv>XX6UmHNc933p>*VwU( zdh5>bX(?CAC&y7xnaf&aW0L^#5jz}0Mv=)A*+vM%W_HU(G-L@041-;E@l<}b`0?7mVhLC{15K(-tLnrHVxnn$aBVSACB6@_BOYZRr z_}nz@pyCh{F4Y?+QKh+Z?t1y?B$^s~o7Wj<9J16Kq!lk{NgPWD=auzulEW{iftkyg zQUz$bO4Q-Z*K*^<^b-Ul`WRrtqKcC~THE|Jl408{1he24v2~@KGnxAO z4ZGMT`PgJCCquqBnaYrSHJN^dn8=tZ2!@xeVBXN)Z7@8a3H;6~F5{TR!*z&RbZo)S z&}55!btFUU5|NZ!>S;hCw?MvBk56nrmusfde(?>--(5lvAZ-~vjVg$m(=_#-r0>+0;mLLiaKJC?YkXnYau*SFWE)0~3V{B+a7x5vh4# z7MUFC>D5d>RB*1ELq+tJlyhh}gWImNpURZ{G;A&uKaRCdy^9Pq-Nov7!%Q zI9Bk7uHb<*a6!=7%O?-!fmOFqw+{6|a6q#DlUwMP&~F%7juXzm6)`z4w?L-agM*;Mi1Fv!kg_~F2``}nhL2a{mH=Ns@v&j^q|ae>AlV=joFnL!tUgo@`>ig$)>LP6H3rlX4PP6Q3-%jVzVWAM3h$bH~XFTA)w{^CAGgyZg~ ztAJ|DvIoGQ0QT|k$;R%;c#uv+?u-XjuHiv?Gtm=)$(7*FL_E9&+?h$52Tn|sB2fGg zSTQ-4c$k)WtXL_Zd6=dqGA$Q8LcjOX=PkiCR7(Y)D%n?j(mXiywG~s!N0U$G*gw$( zknZU}(S71DwbVaK3y;>CkEdvzy%wLoe=c8LOUoj=aRq=Sqv@PHBsU9P zL&tzLl&?KOW7|4GM5<2CI_kxpW~`&Dj;#G^od((SNxIWqeBJt%=bxl3VJ-g#JiAq4 z21)A*`O#B!3T=~pT4`MWt#dJQ4~@0cJP(;>#uS$^oK<*1XbsvL6WPs~jq`Pt?B18g znV3?`Eq&=YDo(Zp*S2f;8Of@?kTv1{RLbpTkN$LZ&e58;tm}^}BHlfW{r{vob0NTA z@G0bZ%Rm1`dqhj~L2AThnM1hr5Y^W(w7YPreDe!hFK#&8a_5)S*QA3jFMmzBLL6%S z(=O4AhI42P8=c)j?5@J@BGw@4tL*h$31_nBF5-H&160e9P3$i^ND))sEkwL!wh(&- zC7p0f{o=h0&u_`DKv1^j`he&saPMVZNDQb*+@oe=m#n)vSf029t=xi%yDzdRO{}4P zEt}Is7c)hxeiac{;}iE^L`7*&Xi^hbsM~3KHkzS7PV&TV$XF>Iog-}&GEcRH` zF=7OF-7>=0o@fI9SEeX*U-%?MP;WLfCqlviEaTc&;s+Z)iq5=Lge#z;QK({A2A>&KR>iSYR^6&s zK1=<*XKEZvHSozSOLXh34sPm81AI=PVs6Qg6xgPg`P*nv6FzzbTky#MVPYM;;!6Dw z2>Id26!;<^(X4;6642KlaE|92)9N0O_l5?CxPcCDqC<$U1sHtfN0fu#g79W1{$W(* zo6l$)AcO(rpDj`93jvZmv6JYRj`&U_76W7Y<<*_U@qsa`=lWd-gFC&|C-tj^nEx-&SuUI*|@R&7Z`f zA&3MeNuO~fDXP}E?WA#ODy3XZ^PVuyh~%E^y_%x74PTa4kY#%D47&s@3Mg1ub}}R(r>tfy z-~~S*OjRTx@x2tFdVx@YJTwAF+{S87M#X!SYlK-FsAHN9dlN!GkO;SYQ#Y}ufUGjg=oToy$GbBx@v*&UW5>f zjWA^kkm8)y89A6$rFI0&5-a3{KbXK>I{xfR^|TA|#(oPxW}%F+`D>`lIZm%IEkpna zVL^3OJEEl@rf9`jAVYcsN&hTN%FgBuB7c-GM&utNuEJMh5Mvn}H!ERo&ybJgi?Rv$ zoE6>h1$-=IGDUpMsK5y(ykhnc#sJANRDC=G2#gy8F+&`Q&CnOXGT5Idv>Ng7PaUYb zKy*8mV+2YxEA>`V7tg>55VD>g;AQ358UoEMsnV?9sQ9uKxAY-6zyg#%Zp)QdrBOkZ zie*4Mq*x7LUC@ldeka8B!qnL6G zV+$$UA^AfTkbd430T3RjMo$7SG`B*8`}ka?vpXO?ef%j@kUzLB;txJe<@sVsW@ke2 zVt9xFXpIVEHeU%)N(7sp<@@v+V-h3p?SFM00F;X`<@n<|h_s$f_=*{HWv>eHr2)IB zu@MD9?Q~{erJ6iAE*{fL3V_G)??sH#dIz+F2D0Nd5TjbC@{n+bc^fgE-6Skb@zN7w z3rPh=M^YXO+UXD}b__r4#PNAtXJA8%EjAA0b6Gr1YjF6Gc?)7AaBLm);Dy6LEWCj^ zvkz9*nlLsBemY`CvB)k$SRXtK zq>1Ukdj_@-s{*0)KwgR-fc^nPa#MzNTgd5DiDHmq2vIW|;(Tq0uKeaP<+b-XP& zKC@lFM)0~#zpALtRuPNJ-;{{4-cMoV#L{GXsfhJSW04qAf(^f0krq#j8``Kev{C7# zfwCc-$W2U|U*!d*;<&D0$uuVpajpvWhnoTypOh35*!_08br{Z_Qn7Qudwg4=902P3I8wdY=5CO!Uvm(IpFU#w*aT zI8gTPEQVL9FH=DQw8dAe+-)0R1=TeYWVRyXXG01#c2xelvjFqR4V^_bet5@ZCFEI4 zL5bD)SGIQsRn+F=Bq0zxJubRO7Yp81m<~`t;5{bBBo3D*AO6(Q^WK9B5nCQm}BaKTg4qEFiJ&AT9{`?XVm@ zK;(D9Iza`IW3U=NW>e=xk>A8ky(aZe=u`%cZ5FbySPYUc$RWjMt#e-Cb7}}*?iT4b zb#c`>9g~UWC1KF%9t?3b7{57a3^5GVUm)%f$^`Wy%&AIG$HH<~7t#G(hzA>pmZF^X9F85g-{{fk6|LnEj5US z-`rJ1ERQs4xSPezqjE)8F`_BTM_Rr@5XAMXC?7bn2Au#n2$`fqKY$(rbnI!h3_O@^ z@G^j0ybN3qmo117qSZM)S>WqZHg6yj*)-7Wazx*t*V(=I^86-l%0K|V-Z6PyFarFh zSQl;<^Mu|nKz)zoI< zG5{m&%t}$@-Ocg(-;e%RREp|gqRFaCQQ+h2JMuuKI8Nf%G=AOxTTx4}!dGg-A=YJT z-g4!6K>6M7qEi-M6w-%*kZrSN6S|{^=ysH1e9^>b8m2E_*cTps18tlK%LC=$yra+; z?93jgJJeJ>siQO$2x7BP`Cfnr%f+8kr+@|~5A+ZN^08fcOBMN~2&|5g9 zsbA6n_RCRfiCVQf@sNC^kBC!9zSc*$5hhCz6$6=4GmaMnRY{UiD5;5RzZ@Es)LD0N zqnhX)+>aLozeKlGp3qm3b1BG)1?er9_dV)Le$!WEq$Sru-r8GKNt8uHi2>w!{ltVO z$SRms9XJQ)#ttReWbI3sCzU^sS)KjWEOow%)Abh2PT7JWDBscvsiP`y{|s;Yt6iD_ zp?iLRQJ$M|tSTGGXUIqUi_1-{tUPas7#avD2Em7pxB>XY5K)qzrtKE|Fr(Z#MC6o8 z)`)4IrGipe1-#-)BL?KM6UE>_RQdE|j~Y=-BuCbWi<{VWp)@_S1ltj;>GAt1|GB2u zh%)IQ9gl4##FZ*^AGtiOz1mmi7^`Guj%kFnd}p=4j3=qhG1Vqj?Q8A8ro;c9+MfuS zi(O%`TG0Q%lyGLk3S((y;>HII4{(9g%A*IY+ZA_l!4q8I=K?Sn7p&oeAQynQxZn}5 zh5TWS_=%h`Nc6@n;(G^)7t6!!CB!+)j}*>v_Kl>e-xajepql(P0QluE2aDDH)38P= zK)^JOL$QQ#2u-o|;Lg%UvA@kI_G_aUhs_Q~@zI(pqnMj&gBE5_Krj7;SJE;?Bw_4kTfCMzLQD7maosjHFSFdfqERW$ea)_fU~fQ8{_2 z=;u`kcg)!HkUC*=K@l;TGAl5teg>B(nCKFh&xfRp*zCy5we8bhcE1z0Qg3Hapv zlf-$}j%LWfo$!n}a365gd*4Z76r$cW!$mhrmt%*EtMmAVkNT0Yc+yK6gt)uvWKo_I zbZ`O&;lEXr-U zeY|K677Z=2jG@JNitrTTDZrC&8E2QajQ*Lp%oG!C`TRK1D}B3d8Ks6{OtkM9FB(g8 zVwQ0cvRC7Y<4NS_;Jv5(W~%6x+aIqHJU%=F@YLWLD2H4khR`56`x5a}_(od}%oKSd zaCzJ^LPFL~6=x0V*L!B;gx*swncmPiYi6&;nG4D-V;s8H_pjDcvD02d;|$WnQ^Xtwx4dP!GH zfm%>5ch44Qojx6TC#C(cWP6Ry*bey%z5Gb@Nz8f_-cQBj&H4vw*28|-%`#3y=|9p8 zBLnFV@PzR2gt&YK>iNIn4bv{0)HriW!!&zRV`D?(VB0WSyGd)B$jjS~Hr(n=w77U` z!)&fQ*i8tf-KOrit$98_~A}eRfpHo(-bx+(RDhk&~uPYMe45iC96UWn`k=S(7F- z0400+r5Dvtx*}O^RHHr*_2;73#Z&PA!$_Ic=t{W^upOpDVqt%X_mihwHf7?Zldd>_ zQe#7E-RY=H%saLG4EariD2}EUohiFb7e8uOG+JIiUG%L=Z8fF?Vj~(G)uJSjIZJ*x z9X^B&-7O=CrY|53Al=+u+A~C1JLt9Yv>BqufK=!|LetB}PrY=~@bS}_@)OmxZ2O`s z>?<)dV@wZAvBB6La^(yx!NMML`wTHmtmq+28u5kF?jEwX5sVz^DaSR6qH}uow2W-P zY_|l+k3u=`kCVpFnlM>Y-WZ3nFv`xERzIy__B2dPanjfc4HGA&;&`^)+$erp@DygY z4$otF9>ud7&ni4}*nC(c&J=OCSXd=@OcC>&KCH5g^8vXLPdc7NJ{{YjJS87SzA`2M zHu9ZQ^6z)Z@9vQQq(lA-oo`AGXo96v0Y*CHb35ew0047h0^xqh7p3G!AARwH{0OVU^68D!K}zS`M8m&dt)I?UG5CG&EiT z$!6Hqa`{xzt7>7jmaR6@v4D3X9zULjdbM1}^C;(?`yx`mY`7ejtQILP8!i{EBJXe> z)(y{9c!uIRoQr&J%aUJ+BEqj7t-eYO&+=Fxxg{s|S8PUC$)8>=I*WDv6?f5gDX)e; zJzG9?wHP_*#{=}hKS9a}jl+`=Rpaq~5uOQn5&{nr#h8T06L{m~&#w{nG)}&Ljrf$t zwLI4(e#r>^c#h~6zi9ll`U#iLoYip2?C~=%F^s)~EVca)Am#1#*&u1p1>ffkmbIMr z8!X4o6>e}v%xoGvW!l9JlcqOJm~0FKX&GqKWc%roaOHJy9N&OHkg`16gvg$Y_j!1(!!ul)9RABRn9_B4n5@D=9wD5lb)oH z=}+``+CYD!kLVd{rTk~^a1^qo}yj!A#K)`xi8Vnw2?N^U7UZH za_^)abVBa)^c=0^lFul&q;L;?il0ODBISQWU(*7S`vUDn52xQrxm#!}y+W^2|JUfx z^g3;$zt9`>CcQ;((;{)DxJoQkKWO-Ck*k{L-Xr)Yed)S~ysc-8#jmZKIVGce{GrEM zjcQSD$HF-wOW3!%*}`xa&K_8!YfHk}oPEd57KgJq`=p!g7B)HC>}Gp}GdcU&YTdRx zoWa@0-E2)b!r5DNHg5L}hdKY|qZ)c}IKQ%V84bX#S9 zhK%3x+B;KgcCK^AHLr9o|F(*jIgft(wOH`%x`+Oi8Ti?@=UNT>D0|!U=;mxAWKK|B z`OWc0$lkgUb$#sxFX=jal5N-@G9ZuVv8{T{MCEzNpj}jNW!U?lZwdM7F!f*bq6_G^ zgAAzh3J{>ddV6W2o^xop^u?ATL8|mjc#bPh<`K|pMIsYKD}TMczO9v?Td6#H#mo$Q z(FL;3AP76>)VPwT$~=Vz4&>qt=P-O!I164&$hN= z9~b*WwjVzqwiWxi*c-9~_}Sl99FU{KbX?!f&+%3UEzGi77)SXjIuOEx)=tu3`$H~kRM z#!d3=47$8W0!k#iQlu3G#?jSA^kJT4gyhIf%1;j4IqZ^6a$P1>uKS|-ej$G|nd+TI zcWlr4bWf|%&oGXSq%rq+?9ZHDw-3!umimAxO#ZVy&eM0EBKGfbYVRtNk4&OS0Gm#> zDu_DG%NAw7g{h==^v))y_w7U4irt=2%suVg)S;)Ho7UCdWea*tzB`Qu(rRhe(RZSS zWY&3*XsewYmsijeGV^?zLM=|=eYNz2bLM?7toz;Px017AZ&kmgueTa@#J-P{G$6-Y zZ?EF_r}&qPt;Mh5{W(?Otlit)nZCE^%*~w5w-0Yc!W@ovA9B%e8I}uxWmT}BOMNH^ z*P9n1G3(2WP>ErYWt0n}(lBh%WG{QO)u>0-_Ly^=>HioOzZnH~(451qjsa7AAx>IOOU_mw+K z{@HI}HM4@S%j#|YhTfS623o=bSr10lVXTbVMm1*G8fV`>M>}Qz?47*?<1#ZO>9*RL z{Lg;0&so0jgz!>KS2NSr&5m^-&&k|h7+%n^@IO$v`!5|JuSVhKltNimLjA(4Qc6^Z z-vDfJ`@(+N8{Ii6E@x&REO(dCfOT6}IFwb2O~oFL_0~eP88#+%|AFxW$=(A6;+Zt3 z+qLD+p|6Xa>vHF=FAKBxzS^N`sH)nFs;wQXs#VqKuL`rD z=(H+LDLQQLFlYH!W!XzQ0u6KQL;an!gN4~2zS3b--St_h+Sqy3YE&)hv?@)hNQ_#I zQA>)L>UbOXZ#iNJ`_NEo545>6p#IK>hYGV-cB~qX)!W%iI~E_KkaFYKh2g`BG+Do5 z7ase1R{RNOq)hvM=2}0BF~^N4GMkk7fK5wqNHYVP?EqJ5KsGE=05xmc%b4w1ouNm~ zB+xhQ0RIJuEJ&L6kj|subdA5tjWg{XoVX%qH@_d`U+y%yz`RgdDpuPxpJ#~l4t=Wi zunm&}_(ui|bq44U#o9qW%8)_(aZbF61v#@0ckOYfu1S?}ywnbzI*%Rh8sEzZ4!221 z2*XZ5)r#0$vf5Vk7PkzxL;Ow@VTag|N&$RI57BNbH6Vq0w}V{DklF3JT%{nFw%b&2vmT0BvZ24`0tAxJ~a^ogv)C%o{isHF20n1TwSPNv51S8r-r_fy6xucby6Wxi?>Rdj zcvI|o&uLlN!@JuIW~ z4Wn9(h}xa0BVYz^rRFh%t*QBqJDm3)J}xnX#qX;bELe5yPn^MW=d)FRPqbdituIP$ z+V{=fx%SadtljTxJW~?SsW#Z&_t)LJx`uuPYQaut_nIk5yDBl>f6JV69(e2%YvryV zn$((I$}rr#^M`=8?OgZy+6(Di-Bm62OViPKyn&nsBN>b>z(8ymBKMq8ZxbtUvNz)u zFzQte@_o%)cR8Q0J!;+G*8iMny>rat7Zt82Q7dY#>~dkoJa+D}Uc6TtInl7Q`SI#Z zA6FDa{hX9Uy-rq3*N|^0=p_pjYI&WZEnO+>{Gw$(t#e*$nTOwFpEz-_&&tuQkf49V$4`;vKy+~L-dncCY zZH#uYe3eFF)PtiI&5e3x*Vo9(@kYo_iwZtddcC!_$*<0*Z(Cjz_?$JHqU3Wj|5*2P zuVva^USTe%-roKXMg8NV;QDksmnW2Nd50QaK12|v?E%NI&8M1}-`~W!`Q>qOOsgrH zZu!c^9EHaSSw72GVO&__naFSUVHl9iYd^O=|h0EP(4_hMnUyxfXm%y-ZR?d{xg z5neL45JohE3!9>uC^@K0pgVk4Mzt7@0mSfV3^i$0^;VksTXf)@y*cJQ^<>y7eQ#X2 zMfErd`x@~%6W=I_>VZ}FRgBQY(A&w%92-dwr#ZFTN}T9ldO7zzmF3j^r8oqPSBRz> zV5f^Saz~6FcOLyq&ni}QnAS`^y9=TL&P|KLCE$a&vm)mGpjzM%Xi39v`J9uU?(Hmj zzo#?pl`Lo1`vccK_{ty1x%Zj0LSLD2l!5J?5ff!v@?jzO^FlT}GXMl|;F+E{6O^|0 zCa*K0wXCPNTGVO}K7VLGYAoDsx*Qi!m+&5Sf%}~ z!P}N*E+-In0e5|Td3}Y)sPQnRgI#=3Ey+BP(l#?J+gy zu|L@rSWphH1?**(F{H(ZUYs5}RyZSH8uDL&zVD@?JjG*W2B_cN59|zvt$22H+G-%V z(kO!fxbWEu?8Cj!F2V1r=YAFRYR2(8YoF^gI+3w5z(rPQYy@m-mhqBsum{T7MDW@m zT!W|VsSx348N4PQJ4bIp5E3Q&d=9#^=Bjm%W`g z`S)e-qW@Xh+xI8RU3b|33v%~$a^8C>U!IXE@|^IdFhp$OrtTRY_E%~hTLd<|@9mQv zXH%gUPF=4&`ccYrX1$h0-gWWU;FtN!%b6aCROh3YOP!IghvNRIP)39==3$-YRXS}i zta01NI?e0qG`uBrS}tB)Wrl%Sy|HMpGQ4rC)aQ0^m^%ojb|5rpm$t?k++|dW^iZ`J zZ+R;`8q=K@cFqOBLDI)sAOYa6JPF{`Z0SY5U+*Y%8n+aO zfL&Lg7CFndus(fqOV93ZU(lI8R;`%H%qWmlE-r`yAFNvaVRGhdDec(a$$Tp0Jin!M zSX&PntR7VlrMd@TiF<&r-e{GEe9qig2CvKA`2;zIZx{dfiOPw;_N#S|z0>7?i?9wbVFmuD2y5v7 z2vNCnO41Cgw*RMzY8#Qq`DE9K0vsJoE6jAO?60tEe+j4dufGd=GJFOJuh%*0gM5zw z@lO08PdOsk&j*$iPQ?dZ(b4!1x*k~#Yty;mgDZco>>M`GcmO5HvXP7VMH~(mn0BVJ z@{A%JlaR}bdF^iuh(8;r1v>_tuSi*PQ312boDuWDYVx3~-#gPjoK?U!UetpctDSxO zd*|a1pP|RsJ@~gFL~EP}|Mq9+_aB|kCQE^`Ct<>}>5t*zoaHw@4_N9g$hKYyq@CCD z>+_$V=g#&O3c|2|^&1ctbS*944|E4RmJey@)efGLKtaN`Wm7X@+7i|T)AoA@!#-gG zJSI|t{8 zI#+z!uM1WO7yAT^i8n8g?Q>c`E$y-jt?e2d7I3Kkkl$P32mbWD@ESPwRj^qoBzm2W3tmcxm_Ili61UXi^<-c(HaU2o*Vbo(}y07dYbF2_4xKfp89 za%myGKrIsrsG8^xa%VA(2`xgkc77d{{Yt1Ry!+E+!6!*~{l@l%{jwJ)3(z`{$fOQj4iEB4amIh}#G{BbXJ6LQOR8q+d(0HOkDb&GEh zRv-?4CC{p+Lb33mdB{Ka6pFyvM>i?C0=H;C%wh#|Bh(Y#rHGKBWf<1KFv zMSz0m02$6>|LQW#HzOn4>lYk=fq&%p`w)m>s4Ft(YfLQn!huJHhV>Kr=Vv;SYMEl#FO^6S(lhutDZ+^Ioz7&;ikO%xfH)F91#`W zxvD^^L&2|w&`|J|&5edd+>;o=D<{sQoOsxE%E6iqyG}X0Mv^*&`{X{9b_IYJUNHcm zB#S+AUi&+m3soCqO$(163fRFCu)6>b_N|{!D^Ye;K(l(WV6SpIxvTV6#to1cFB3*C zv6?15wrc@HuEQn{VvoG=J^+bP6K|$^%jT*uZzV;;a2fiPQ`BB~z2Y3jTv0@`gftan zc}bsP7=37;p-)a}qAu}{U{*GtBuwoTLA-;jB|}N42+js!I5~O!NvB8%)F|Nc^}+(+ zovk#c@$TTT0{puz`6w zxPHwrZ$cV~9|`*aBZQlOfbgj;wU_t>AyBU0%4A`9a*T~eXt>S=zbiMhY>2ysH zke7aYIJ2HHj_+ptR%oa(P`9r_0*u$z7=sY-GZt%Xi~wUnbvWa*E(D8S+i+kwt~YeB zB5SpvfoeY$J_776R`@_0Ch>IMW)5P~zHqiBF>!dsdF9HM#4e<}`^9hoNZrbGZF;7$ z1&aw`C*uq}5cG^ze}fpBLMfNPd{G7WM~@e@#u`W#$D zu%LsKx(_1HZNPMe_Y!#DkrZ$v2E}r*|KM-T1oO_|*xljB8TNK8$1~{%VoP%&C5K9tq3SC#p0m|;>1y0SR5=AFSG-!PrTt| z;#$BSECw76%XB$m?U8X%jy`({9GX6R6)_58%9{7t8$rPOm7UZpCXF1xzml4C6LWVD)(h=%n0cDC#5+g!=BnR|V@pyBz zUgS=}pX>q0QgH|K&5d+I@cL_5s=!$^@g^Ef`{Z>u(dp!sJ8z;~BwyY{6>*;CM9_v> z8-Ay_;$6@C3gWHeGZPeK(mC$qE$1sym+zG`USJm!c}uu&2=B-N86YvE5%j~#It?nK ziVt5h{Zh(|VGf2(Gcp9RNEN&S++9F_M}u0I_~pr0(6Bsp&Jp$=w%fes5(qMEqhG#v zC5`ZN9o8Main^Fq5Q72typ`zgbGh$QI{Ji<7#pAz^LAyTnrx{u0BdaffJRji6q&4t zdx=Q{H)WMZ*xb+ZB+=!&a_(hxbi8AiEYOc^gOUo7!yM+-heI#Zy+`vCQ#q^FAA@0s zeMguH9XrBC9Rbu42JCPoj2!VD<&$4Ny^zM|Dyiz%(~G%BNWZMQhRVLb%94Yxpm2oA zpz}@J%bVu^-c8Gwt(77ux6Xy}mma4A0h_WcPF2I+XB!dsl%R&h#&m*Z==4q&bxWKI zkNSW+$T6F77}ZqK3E<0d8W8`A0dZKy63ja_iHwb;b<%H#-Gd5t3GG|%A&?kqEaLW# z9IHcPXhOGf*&?={Guv8&aXW6fSKhaP3d>x(-CdIMgB}UF1CVjoR!>60!a4%7!;GNm zeiR0b02nYfCSOorX&B5Mnu^;Mjw5x^bOflT({`XL;6rtqqj`V@J6mbdiN>UP&KzrI!O#5#W7Y8%=JRce&|OPWQrZQ7xA6D^g|G_-x$k zR*Pk-8pe;F-f=v;tT`|Tk>b*blZ&H%=jdy5lzFk7GQy@w!t{83{y;DdD&A+WhZW%A z&lA)X)a5;Yosg1)NKeTD(J480#Iqrx+d+n6$Q7iJkA=gU(AL(PxEci~*zc)V)iCmZ zs2Z%CG8VWiVGJH&D(U^>X??}^=TVj~KV|=x6Wfv?L~N^Eax+fjDKx?ait-BV4|^gw zC0CfmRkldRQk)71bp}O>17{2&CPpj`8NCr!IvfO90Yk)vxnCM3^ z*Q$2R6?eG{$1az{aVdiV>EA#kKz`D*O*u*7|cfkpI9l*(rlrY(K%C4 zy)x)iDvMKC2DPBY1jUD9&dIxSu|Is)QOgIaT$#m~Q`-d;+xwGiuANaW+$FDf<;f~e zH>)MDbma-lArz_=ui-K*7QZohz2wCl?1iP@NLX|hUX~DV9B`qo3uNn!RB)7!&x+;f z2#2CFBsf4?=mbR4{vee83S0Luzs)=3pDuxmypy9)RXsYNs0BC}2HhON-w-hxH~KJm zM133o-*H&;|Nk=kYhnlYV*|~@I)s*mN|k0fB~u0`BuF@Ve>UlRn@cdfF(p_$P~`LZ1cR5H~YL>0U2 zN@9p6g1geZR>}zr4 zBUu(pz-)FG=}P%QGY#;ORcslu_%-MeTW-PCf@-8fibI_KX*739}8lFaxs^^{NFOM#Sve7WmhS{Piz zgGDe{{c?H&e*dHHqrr*7W;yjfdH^2&&~NaqB|2U52pv!2nnQBOqqugs?T|e5D2?X) zh}Am(i`BF$(b|!#-=C;#TEWdH5abB`1cV$TB;M*iUO zgUflYO#OfTGyM@8a`)>XNVl+AzW2IX_0`+xGEB8aya|FtXD7Wy79Egt-lCDnt2S;RT~td22b4T49<@l{dc&+K2_WFbJ{lC*pvFxBc;Uk)zw-*$|G7UlxHx>2* zQExv7!T8!o^ji~`iF|wQWqoNG<_mJsZo+wzr=`W<{RIl^KEKokhWiuJpMB}mL8GL zXEbTho_(n7t!Hg7+mFmLo+<7^?c}xRax7#4AB_{&q;kb@nt_crkD)Uu|2x$1O<*x1 zqy&FK%9mbSzLN__Pyu}>Ge=T^Tswj)@xF5eofZ;1^Zy|8@~Ds zg4S9`(pSMx6W5~8)Y5IBjni$aO@K7Zdu&Lhy$ljEo8>b$feo$vGBudaHcoSQ?TjY?hxNOU*e~3wE5OStb;da;uwH zgVV=QR6a3|&P(*yEPITn8F>lOpu*}sd>Vt>eXV?8JibSNyk-6bnj<{VUb#Vjavbf& z`rkdCjwZ2SgUmRQ`nze7JnKY=tp|8!eC53JL|TZMO*x6?CkmTecAZ2MSikf>g}M_K zdh)3doGK}n%TJ}N+PJv)X>=c&Z#j(yCJLKn+UXD}kGBjsozC+{nKf*~T&mWIm&*AY|u zmzvs(T|Vb^YZJ=-ZuwpL^%NRXkW%4(aQrTVhMf&}o)kRHuZ*p&QxTNGUol72?j*`v zP@YchKS2f|ndjjzDx`jaEN&G}(S0NJC&(?ATtKIi^kvh)?B$C#Ko}QbvyhlbzLdvh zQ%%opplpa+ZM@1yGzr!wcNb)pbp>b4XE{Sx?p3%Rtco_9Q=aJNe#8K6NBOyGa&* z-y|XGox9^bCGDen&q}C`+52Egw_N@eHB!s3_tU4M<%@%eDT(MH7TgR%W8N-ze@z<@ zbta&3MszdIv#={CcKSTUyVLsO{r6>rrT&$!hT;=6r z6-A5WKQly+a(@|)U$|+AWiwB5v+-=n3|em2hbx&eNG39^#eun>Y@< znkoDzMeII&V;ey@2d?!YArR-GLPZRA(W$J8_)yufo&&a&N8>)*!bKE-PnMa2ojN!t zs|d_wGzd3HcrIN31wuh!d$$h?Q6s3Jkg$1VP)Gz5(m^2z579v(ZGB=52zV00Ao%S} z`=8&*sw`3JHSL2?Us=k4?sRVCnv`cSm$FZZjS45>EAT!Q4S_(!46a)1XQ>JMAcyj>>E*&K!NM9ssL_lwBs8KUf?=&*oX>qSPO8!fHpZs~vy73OkxuTc&MwF-5>HNaUK3pqTw50g;< zV0#txz&;p!%nlNAJ=nwRIbt*zW8XH}KK8C7&v8gm!y~WC5yf&=kqGha!|<_@FgmTB z0S_HWRk_cT=uwV%O`ysp>LLzNHfVVlB`Ht&+?G*HeLCn8bcFDEL{#16bqXAc8hrbJ z@FAuukc!$+EQnvRMqU&X5O6*TC5q%Y^a-La0FO7|x%B24Rtablu$s0L z9mi95GwRhr1L+X4DomzL>R9PIHVD|nTblhYqSpw!522cl1QInJv7os{jaY z;khbaLB~Kt9;ESybU4`a;6fW8vPYiiLf^`vd7@t&e-Q;+#%LCpYt+=U36>cwr4aQ= z^)ZCw7?z1KVuc6^jTOWGPqT_A6vxuwrNna_zhSpgVdJ=JO|U&p(Qas6h+c6)%_c?A zDg+3Jy#yiXR6sH8pfJVR$p9o5Acc3Vo4))jWk-ZJTF43iwGEs%RNxJ_v#nRFViySnudg(nrRptp+uO% zj93so^PIVJPmqHvB05GY!gmgZLaPXOVJS0^V+x>~u)iv>iN6j_N2EiH(E{d5*Jl$9 z0*D+Y1QuUm^EaRjZenVmBnD%CO?+F)BZ9j5oQ?G{UiD>odh(JL06c<%vCQf?la3+~ zwdyopvKLFnCzD&}bCbotSV5J9xcT zRK=dCDRMxYRUZdyB*h&LI0+fsnYeRVmW3Faz#oq*mvY<(Vz-bkg4W^oShuo0)b|k_ zhX;A;#^GU~Fx8AvAgKkd&;s6YU|J%-69U=Gf3GLNUpnO?dM@How-ZWmWDYf0hOlJu zl^gRp?oR0;h!NH=b83t_9@~{D%Ad#7!lVR>l9%U*s1}du%x@|lkH$hoTe*#mC&PtYtNii^~d^sS!w5qGU8)`b1&bm5Xxh z8j`YT!17OmX@*b6kS)N(bOr-470y$w6^^pow97L>c3%Q}S3-QXCvtUUuu9QL{5FjN9 z5T>~zKw<&}Gpmnfz;jB)fzr7LKkRUg0TylY%VKd}=F{xow_qtlud*>bqeMh|;UeDN zDe9TW;BmFL>(>mtzNKGr<}Mf8L^LcPFA?Xu-!|vKM(tWEqFG7?BV-Q(5T87!#SqX| zDssXhgm`*@03bXh=ah=0dU%;7+~{QHM)mnOqLY<$!xHN8?elert1lJ1svl>^TN$Q+ zyFN^mC$Lq8`=Jw$y%|!P>^6trbI1#J`)%zix`qoFtseUzOox2=byqPcr%0D9fwwM4 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 VH=9T=l<^zjByrdH#tq`V{{!_&q@4f& diff --git a/wasmbinding/testdata/artifacts/testdata.wasm b/wasmbinding/testdata/artifacts/testdata.wasm index 089e18c9f1e20cdb1e32d617e403341f5c6c47ef..37894a87084015b7354d6df2993e5a8784c1b7b1 100644 GIT binary patch delta 59956 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 J&$y`a{{X<8A`k!o delta 58896 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 Kz?G&<$^QfB6lzWY diff --git a/wasmbinding/wasm.go b/wasmbinding/wasm.go index da76d93ce..41e78cff5 100644 --- a/wasmbinding/wasm.go +++ b/wasmbinding/wasm.go @@ -56,15 +56,26 @@ func CustomQuerier(qp *QueryPlugin) func(ctx sdk.Context, request json.RawMessag } return bz, nil - case contractQuery.LatestFinalizedEpoch != nil: + case contractQuery.LatestFinalizedEpochInfo != nil: epoch, err := qp.zcKeeper.GetFinalizedEpoch(ctx) if err != nil { return nil, err } - res := bindings.LatestFinalizedEpochResponse{ - Epoch: epoch, + epochInfo, err := qp.epochingKeeper.GetHistoricalEpoch(ctx, epoch) + + if err != nil { + // Here something went really wrong with our data model. If epoch is finalized + // it should always be known by epoching module + panic(fmt.Sprintf("Finalized epoch %d not known by epoching module", epoch)) + } + + res := bindings.LatestFinalizedEpochInfoResponse{ + EpochInfo: &bindings.FinalizedEpochInfo{ + EpochNumber: epoch, + LastBlockHeight: epochInfo.GetLastBlockHeight(), + }, } bz, err := json.Marshal(res) From d9c48ebd8948c8318fe4f643cc32cf7abbcfc910 Mon Sep 17 00:00:00 2001 From: Vitalis Salis Date: Wed, 26 Apr 2023 07:37:21 +0300 Subject: [PATCH 44/59] chore: Update runc and docker dependencies due to security alerts (#364) --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index f6139242f..88d8dc22c 100644 --- a/go.mod +++ b/go.mod @@ -148,7 +148,7 @@ require ( github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect github.com/docker/cli v20.10.21+incompatible // indirect github.com/docker/distribution v2.8.1+incompatible // indirect - github.com/docker/docker v20.10.21+incompatible // indirect + github.com/docker/docker v20.10.24+incompatible // indirect github.com/docker/go-connections v0.4.0 // indirect github.com/docker/go-units v0.5.0 // indirect github.com/felixge/httpsnoop v1.0.2 // indirect @@ -175,7 +175,7 @@ require ( github.com/moby/term v0.0.0-20221120202655-abb19827d345 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.1.0-rc2 // indirect - github.com/opencontainers/runc v1.1.4 // indirect + github.com/opencontainers/runc v1.1.5 // indirect github.com/pelletier/go-toml/v2 v2.0.6 // indirect github.com/sirupsen/logrus v1.9.0 // indirect github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c // indirect diff --git a/go.sum b/go.sum index 84bf7b61c..43de9899c 100644 --- a/go.sum +++ b/go.sum @@ -410,8 +410,8 @@ github.com/docker/cli v20.10.21+incompatible h1:qVkgyYUnOLQ98LtXBrwd/duVqPT2X4SH github.com/docker/cli v20.10.21+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/distribution v2.8.1+incompatible h1:Q50tZOPR6T/hjNsyc9g8/syEs6bk8XXApsHjKukMl68= github.com/docker/distribution v2.8.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v20.10.21+incompatible h1:UTLdBmHk3bEY+w8qeO5KttOhy6OmXWsl/FEet9Uswog= -github.com/docker/docker v20.10.21+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v20.10.24+incompatible h1:Ugvxm7a8+Gz6vqQYQQ2W7GYq5EUPaAiuPgIfVyI3dYE= +github.com/docker/docker v20.10.24+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= @@ -841,8 +841,8 @@ github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8 github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.1.0-rc2 h1:2zx/Stx4Wc5pIPDvIxHXvXtQFW/7XWJGmnM7r3wg034= github.com/opencontainers/image-spec v1.1.0-rc2/go.mod h1:3OVijpioIKYWTqjiG0zfF6wvoJ4fAXGbjdZuI2NgsRQ= -github.com/opencontainers/runc v1.1.4 h1:nRCz/8sKg6K6jgYAFLDlXzPeITBZJyX28DBVhWD+5dg= -github.com/opencontainers/runc v1.1.4/go.mod h1:1J5XiS+vdZ3wCyZybsuxXZWGrgSr8fFJHLXuG2PsnNg= +github.com/opencontainers/runc v1.1.5 h1:L44KXEpKmfWDcS02aeGm8QNTFXTo2D+8MYGDIJ/GDEs= +github.com/opencontainers/runc v1.1.5/go.mod h1:1J5XiS+vdZ3wCyZybsuxXZWGrgSr8fFJHLXuG2PsnNg= github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/selinux v1.10.0/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI= github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= From 795d7066ea94b7b6fb94fc2cc4ff89bf464f6636 Mon Sep 17 00:00:00 2001 From: Vitalis Salis Date: Wed, 26 Apr 2023 10:00:14 +0300 Subject: [PATCH 45/59] chore: Replace deprecated `rand.Seed` with dedicated datagen random generators (#363) --- test/e2e/configurer/chain/commands.go | 14 ++- test/integration_test.go | 27 ++--- test/utils.go | 21 ++-- testutil/datagen/btc_blockchain.go | 32 +++--- testutil/datagen/btc_header_info.go | 86 ++++++++-------- testutil/datagen/btc_header_tree.go | 40 ++++---- testutil/datagen/btc_transaction.go | 99 +++++++++---------- testutil/datagen/datagen.go | 22 ++--- testutil/datagen/epoching.go | 24 ++--- testutil/datagen/fuzz.go | 4 +- testutil/datagen/raw_checkpoint.go | 54 +++++----- testutil/datagen/tendermint.go | 9 +- types/btc_header_bytes_test.go | 42 ++++---- types/btc_header_hash_bytes_test.go | 48 ++++----- wasmbinding/test/custom_query_test.go | 5 +- .../keeper/grpc_query_params_test.go | 8 +- x/btccheckpoint/keeper/msg_server_test.go | 90 ++++++++--------- .../keeper/base_btc_header_test.go | 4 +- x/btclightclient/keeper/grpc_query_test.go | 75 +++++++------- x/btclightclient/keeper/keeper_test.go | 54 +++++----- x/btclightclient/keeper/msg_server_test.go | 16 +-- x/btclightclient/keeper/state_test.go | 78 +++++++-------- x/btclightclient/keeper/utils_test.go | 11 ++- .../types/btc_header_info_test.go | 6 +- x/btclightclient/types/keys_test.go | 10 +- x/btclightclient/types/msgs_test.go | 10 +- x/btclightclient/types/querier_test.go | 4 +- x/btclightclient/types/work_test.go | 6 +- x/checkpointing/keeper/grpc_query_bls_test.go | 8 +- .../keeper/grpc_query_checkpoint_test.go | 39 ++++---- x/checkpointing/keeper/keeper_test.go | 39 ++++---- x/checkpointing/keeper/msg_server_test.go | 64 ++++++------ x/checkpointing/keeper/val_bls_set_test.go | 8 +- x/checkpointing/types/types_test.go | 8 +- x/epoching/keeper/apphash_chain_test.go | 8 +- x/epoching/keeper/epoch_msg_queue_test.go | 55 ++++------- .../keeper/epoch_slashed_val_set_test.go | 15 ++- x/epoching/keeper/epoch_val_set_test.go | 13 +-- x/epoching/keeper/epochs_test.go | 8 +- x/epoching/keeper/grpc_query_test.go | 38 +++---- x/epoching/keeper/msg_server_test.go | 11 ++- x/epoching/testepoching/helper.go | 11 ++- x/epoching/types/epoching_test.go | 34 ++----- x/monitor/keeper/grpc_query_test.go | 22 ++--- .../keeper/canonical_chain_indexer_test.go | 18 ++-- .../keeper/epoch_chain_info_indexer_test.go | 24 ++--- x/zoneconcierge/keeper/fork_indexer_test.go | 8 +- x/zoneconcierge/keeper/grpc_query_test.go | 88 ++++++++--------- x/zoneconcierge/keeper/keeper_test.go | 17 ++-- .../keeper/proof_epoch_sealed_test.go | 12 +-- .../keeper/proof_epoch_submitted_test.go | 14 +-- x/zoneconcierge/keeper/query_kvstore_test.go | 40 +++----- 52 files changed, 742 insertions(+), 759 deletions(-) diff --git a/test/e2e/configurer/chain/commands.go b/test/e2e/configurer/chain/commands.go index 1af0ba31e..5023c1aa6 100644 --- a/test/e2e/configurer/chain/commands.go +++ b/test/e2e/configurer/chain/commands.go @@ -4,6 +4,8 @@ import ( "encoding/hex" "encoding/json" "fmt" + "math/rand" + "time" btccheckpointtypes "github.com/babylonchain/babylon/x/btccheckpoint/types" cttypes "github.com/babylonchain/babylon/x/checkpointing/types" @@ -60,11 +62,11 @@ func (n *NodeConfig) SendHeaderHex(headerHex string) { n.LogActionF("successfully inserted header %s", headerHex) } -func (n *NodeConfig) InsertNewEmptyBtcHeader() *blc.BTCHeaderInfo { +func (n *NodeConfig) InsertNewEmptyBtcHeader(r *rand.Rand) *blc.BTCHeaderInfo { tip, err := n.QueryTip() require.NoError(n.t, err) n.t.Logf("Retrieved current tip of btc headerchain. Height: %d", tip.Height) - child := datagen.GenRandomValidBTCHeaderInfoWithParent(*tip) + child := datagen.GenRandomValidBTCHeaderInfoWithParent(r, *tip) n.SendHeaderHex(child.Header.MarshalHex()) n.WaitUntilBtcHeight(tip.Height + 1) return child @@ -97,6 +99,8 @@ func (n *NodeConfig) InsertProofs(p1 *btccheckpointtypes.BTCSpvProof, p2 *btcche func (n *NodeConfig) FinalizeSealedEpochs(startingEpoch uint64, lastEpoch uint64) { n.LogActionF("start finalizing epoch starting from %d", startingEpoch) + // Random source for the generation of BTC data + r := rand.New(rand.NewSource(time.Now().Unix())) madeProgress := false currEpoch := startingEpoch @@ -135,9 +139,9 @@ func (n *NodeConfig) FinalizeSealedEpochs(startingEpoch uint64, lastEpoch uint64 require.NoError(n.t, err) - opReturn1 := datagen.CreateBlockWithTransaction(currentBtcTip.Header.ToBlockHeader(), p1) + opReturn1 := datagen.CreateBlockWithTransaction(r, currentBtcTip.Header.ToBlockHeader(), p1) - opReturn2 := datagen.CreateBlockWithTransaction(opReturn1.HeaderBytes.ToBlockHeader(), p2) + opReturn2 := datagen.CreateBlockWithTransaction(r, opReturn1.HeaderBytes.ToBlockHeader(), p2) n.InsertHeader(&opReturn1.HeaderBytes) n.InsertHeader(&opReturn2.HeaderBytes) @@ -159,7 +163,7 @@ func (n *NodeConfig) FinalizeSealedEpochs(startingEpoch uint64, lastEpoch uint64 // checkpoints for i := 0; i < initialization.BabylonBtcFinalizationPeriod; i++ { - n.InsertNewEmptyBtcHeader() + n.InsertNewEmptyBtcHeader(r) } } } diff --git a/test/integration_test.go b/test/integration_test.go index 5d6d76793..400ec9abb 100644 --- a/test/integration_test.go +++ b/test/integration_test.go @@ -8,6 +8,7 @@ import ( "encoding/hex" "errors" "fmt" + "math/rand" "os" "testing" "time" @@ -186,6 +187,7 @@ func TestNodeProgress(t *testing.T) { } func TestSendTx(t *testing.T) { + r := rand.New(rand.NewSource(time.Now().Unix())) // TODO fix hard coded paths node0dataPath := "../.testnets/node0/babylond" node0genesisPath := "../.testnets/node0/babylond/config/genesis.json" @@ -197,7 +199,7 @@ func TestSendTx(t *testing.T) { } tip1 := sender.GetBtcTip() - err = sender.insertNEmptyBTCHeaders(1) + err = sender.insertNEmptyBTCHeaders(r, 1) if err != nil { t.Fatalf("could not insert new btc header") @@ -211,6 +213,7 @@ func TestSendTx(t *testing.T) { } func TestFailInvalidBTCTransactions(t *testing.T) { + r := rand.New(rand.NewSource(time.Now().Unix())) // TODO fix hard coded paths node0dataPath := "../.testnets/node0/babylond" node0genesisPath := "../.testnets/node0/babylond/config/genesis.json" @@ -221,30 +224,30 @@ func TestFailInvalidBTCTransactions(t *testing.T) { panic("failed to init sender") } - hInfo := datagen.GenRandomBTCHeaderInfoWithInvalidHeader(chaincfg.SimNetParams.PowLimit) + hInfo := datagen.GenRandomBTCHeaderInfoWithInvalidHeader(r, chaincfg.SimNetParams.PowLimit) - r, err := sender.SendBtcHeadersTransaction([]bbn.BTCHeaderBytes{*hInfo.Header}) + resp, err := sender.SendBtcHeadersTransaction([]bbn.BTCHeaderBytes{*hInfo.Header}) if err != nil { t.Fatalf("could not insert new btc header") } - if r.TxResponse.Code != 1105 || r.TxResponse.Codespace != "btclightclient" { + if resp.TxResponse.Code != 1105 || resp.TxResponse.Codespace != "btclightclient" { t.Fatalf("submitting invalid header should result with error") } currentTip := sender.GetBtcTip() // bogus submissions - firstSubmission := datagen.CreateBlockWithTransaction(currentTip.Header.ToBlockHeader(), []byte{1}) + firstSubmission := datagen.CreateBlockWithTransaction(r, currentTip.Header.ToBlockHeader(), []byte{1}) - secondSubmission := datagen.CreateBlockWithTransaction(firstSubmission.HeaderBytes.ToBlockHeader(), []byte{1}) + secondSubmission := datagen.CreateBlockWithTransaction(r, firstSubmission.HeaderBytes.ToBlockHeader(), []byte{1}) // At this point light client chain should be 3 long and inserting spv proofs // should succeed - r, _ = sender.insertSpvProof(firstSubmission.SpvProof, secondSubmission.SpvProof) + resp, _ = sender.insertSpvProof(firstSubmission.SpvProof, secondSubmission.SpvProof) - if r.TxResponse.Codespace != "btccheckpoint" || r.TxResponse.Code != 1100 { + if resp.TxResponse.Codespace != "btccheckpoint" || resp.TxResponse.Code != 1100 { t.Fatalf("submitting invalid proof should result with error") } } @@ -265,6 +268,7 @@ func getCheckpoint(t *testing.T, conn *grpc.ClientConn, epoch uint64) *checkpoin } func TestSubmitCheckpoint(t *testing.T) { + r := rand.New(rand.NewSource(time.Now().Unix())) node0dataPath := "../.testnets/node0/babylond" node0genesisPath := "../.testnets/node0/babylond/config/genesis.json" @@ -303,9 +307,9 @@ func TestSubmitCheckpoint(t *testing.T) { currentTip := sender.GetBtcTip() - firstSubmission := datagen.CreateBlockWithTransaction(currentTip.Header.ToBlockHeader(), p1) + firstSubmission := datagen.CreateBlockWithTransaction(r, currentTip.Header.ToBlockHeader(), p1) - secondSubmission := datagen.CreateBlockWithTransaction(firstSubmission.HeaderBytes.ToBlockHeader(), p2) + secondSubmission := datagen.CreateBlockWithTransaction(r, firstSubmission.HeaderBytes.ToBlockHeader(), p2) // first insert all headers err = sender.insertBTCHeaders( @@ -340,6 +344,7 @@ func TestSubmitCheckpoint(t *testing.T) { } func TestConfirmCheckpoint(t *testing.T) { + r := rand.New(rand.NewSource(time.Now().Unix())) node0dataPath := "../.testnets/node0/babylond" node0genesisPath := "../.testnets/node0/babylond/config/genesis.json" @@ -353,7 +358,7 @@ func TestConfirmCheckpoint(t *testing.T) { panic("failed to init sender") } - err = sender.insertNEmptyBTCHeaders(2) + err = sender.insertNEmptyBTCHeaders(r, 2) if err != nil { t.Fatalf("Could not insert two headers. Err: %s", err) diff --git a/test/utils.go b/test/utils.go index 240593297..4223bc7d2 100644 --- a/test/utils.go +++ b/test/utils.go @@ -4,6 +4,7 @@ import ( "context" "errors" "fmt" + "math/rand" "time" tm "github.com/cosmos/cosmos-sdk/client/grpc/tmservice" @@ -146,7 +147,7 @@ func (b *TestTxSender) SendBtcHeadersTransaction(headers []bbn.BTCHeaderBytes) ( return sender.BroadcastTx(context.Background(), &req) } -func GenerateNEmptyHeaders(tip *bbn.BTCHeaderBytes, n uint64) []bbn.BTCHeaderBytes { +func GenerateNEmptyHeaders(r *rand.Rand, tip *bbn.BTCHeaderBytes, n uint64) []bbn.BTCHeaderBytes { var headers []bbn.BTCHeaderBytes if n == 0 { @@ -156,9 +157,9 @@ func GenerateNEmptyHeaders(tip *bbn.BTCHeaderBytes, n uint64) []bbn.BTCHeaderByt for i := uint64(0); i < n; i++ { if i == 0 { // first new header, need to use tip as base - headers = append(headers, generateEmptyChildHeaderBytes(tip)) + headers = append(headers, generateEmptyChildHeaderBytes(r, tip)) } else { - headers = append(headers, generateEmptyChildHeaderBytes(&headers[i-1])) + headers = append(headers, generateEmptyChildHeaderBytes(r, &headers[i-1])) } } @@ -246,9 +247,9 @@ func (b *TestTxSender) insertBTCHeaders(currentTip uint64, headers []bbn.BTCHead } //nolint:unused -func (b *TestTxSender) insertNEmptyBTCHeaders(n uint64) error { +func (b *TestTxSender) insertNEmptyBTCHeaders(r *rand.Rand, n uint64) error { currentTip := b.GetBtcTip() - headers := GenerateNEmptyHeaders(currentTip.Header, n) + headers := GenerateNEmptyHeaders(r, currentTip.Header, n) err := b.insertBTCHeaders(currentTip.Height, headers) @@ -259,8 +260,8 @@ func (b *TestTxSender) insertNEmptyBTCHeaders(n uint64) error { return nil } -func generateEmptyChildHeader(bh *wire.BlockHeader) *wire.BlockHeader { - randHeader := datagen.GenRandomBtcdHeader() +func generateEmptyChildHeader(r *rand.Rand, bh *wire.BlockHeader) *wire.BlockHeader { + randHeader := datagen.GenRandomBtcdHeader(r) randHeader.Version = bh.Version randHeader.PrevBlock = bh.BlockHash() @@ -271,8 +272,8 @@ func generateEmptyChildHeader(bh *wire.BlockHeader) *wire.BlockHeader { return randHeader } -func generateEmptyChildHeaderBytes(bh *bbn.BTCHeaderBytes) bbn.BTCHeaderBytes { - childHeader := generateEmptyChildHeader(bh.ToBlockHeader()) +func generateEmptyChildHeaderBytes(r *rand.Rand, bh *bbn.BTCHeaderBytes) bbn.BTCHeaderBytes { + childHeader := generateEmptyChildHeader(r, bh.ToBlockHeader()) return bbn.NewBTCHeaderBytesFromBlockHeader(childHeader) } @@ -286,7 +287,7 @@ func LatestHeight(c *grpc.ClientConn) (int64, error) { return 0, err } - return latestResponse.Block.Header.Height, nil //nolint:staticcheck // deprecated call, suggests to use sdk_block instead + return latestResponse.SdkBlock.Header.Height, nil //nolint:staticcheck // deprecated call, suggests to use sdk_block instead } func WaitForHeight(c *grpc.ClientConn, h int64) (int64, error) { diff --git a/testutil/datagen/btc_blockchain.go b/testutil/datagen/btc_blockchain.go index efc3ff7bb..1beb797cd 100644 --- a/testutil/datagen/btc_blockchain.go +++ b/testutil/datagen/btc_blockchain.go @@ -17,20 +17,20 @@ import ( // - when numBabylonTxs == 1, it generates a BTC block with 2 random txs and a Babylon tx. // - when numBabylonTxs == 2, it generates a BTC block with 1 random tx and 2 Babylon txs that constitute a raw BTC checkpoint. // When numBabylonTxs == 2, the function will return the BTC raw checkpoint as well. -func GenRandomBtcdBlock(numBabylonTxs int, prevHash *chainhash.Hash) (*wire.MsgBlock, *btctxformatter.RawBtcCheckpoint) { +func GenRandomBtcdBlock(r *rand.Rand, numBabylonTxs int, prevHash *chainhash.Hash) (*wire.MsgBlock, *btctxformatter.RawBtcCheckpoint) { var ( - randomTxs []*wire.MsgTx = []*wire.MsgTx{GenRandomTx(), GenRandomTx()} + randomTxs []*wire.MsgTx = []*wire.MsgTx{GenRandomTx(r), GenRandomTx(r)} rawCkpt *btctxformatter.RawBtcCheckpoint = nil ) if numBabylonTxs == 2 { - randomTxs, rawCkpt = GenRandomBabylonTxPair() + randomTxs, rawCkpt = GenRandomBabylonTxPair(r) } else if numBabylonTxs == 1 { - bbnTxs, _ := GenRandomBabylonTxPair() - idx := rand.Intn(2) + bbnTxs, _ := GenRandomBabylonTxPair(r) + idx := r.Intn(2) randomTxs[idx] = bbnTxs[idx] } - coinbaseTx := createCoinbaseTx(rand.Int31(), &chaincfg.SimNetParams) + coinbaseTx := createCoinbaseTx(r.Int31(), &chaincfg.SimNetParams) msgTxs := []*wire.MsgTx{coinbaseTx} msgTxs = append(msgTxs, randomTxs...) @@ -40,7 +40,7 @@ func GenRandomBtcdBlock(numBabylonTxs int, prevHash *chainhash.Hash) (*wire.MsgB difficulty, _ := new(big.Int).SetString("7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 16) workBits := blockchain.BigToCompact(difficulty) - header := GenRandomBtcdHeader() + header := GenRandomBtcdHeader(r) header.MerkleRoot = merkleRoot header.Bits = workBits if prevHash != nil { @@ -61,7 +61,7 @@ func GenRandomBtcdBlock(numBabylonTxs int, prevHash *chainhash.Hash) (*wire.MsgB // - has `oneTxThreshold` probability of including 1 Babylon tx that does not has any match // - has `twoTxThreshold - oneTxThreshold` probability of including 2 Babylon txs that constitute a checkpoint // - has `1 - twoTxThreshold` probability of including no Babylon tx -func GenRandomBtcdBlockchainWithBabylonTx(n uint64, oneTxThreshold float32, twoTxThreshold float32) ([]*wire.MsgBlock, int, []*btctxformatter.RawBtcCheckpoint) { +func GenRandomBtcdBlockchainWithBabylonTx(r *rand.Rand, n uint64, oneTxThreshold float32, twoTxThreshold float32) ([]*wire.MsgBlock, int, []*btctxformatter.RawBtcCheckpoint) { blocks := []*wire.MsgBlock{} numCkptSegs := 0 rawCkpts := []*btctxformatter.RawBtcCheckpoint{} @@ -76,7 +76,7 @@ func GenRandomBtcdBlockchainWithBabylonTx(n uint64, oneTxThreshold float32, twoT } // genesis block - genesisBlock, rawCkpt := GenRandomBtcdBlock(0, nil) + genesisBlock, rawCkpt := GenRandomBtcdBlock(r, 0, nil) blocks = append(blocks, genesisBlock) rawCkpts = append(rawCkpts, rawCkpt) @@ -84,14 +84,14 @@ func GenRandomBtcdBlockchainWithBabylonTx(n uint64, oneTxThreshold float32, twoT for i := uint64(1); i < n; i++ { var msgBlock *wire.MsgBlock prevHash := blocks[len(blocks)-1].BlockHash() - if rand.Float32() < oneTxThreshold { - msgBlock, rawCkpt = GenRandomBtcdBlock(1, &prevHash) + if r.Float32() < oneTxThreshold { + msgBlock, rawCkpt = GenRandomBtcdBlock(r, 1, &prevHash) numCkptSegs += 1 - } else if rand.Float32() < twoTxThreshold { - msgBlock, rawCkpt = GenRandomBtcdBlock(2, &prevHash) + } else if r.Float32() < twoTxThreshold { + msgBlock, rawCkpt = GenRandomBtcdBlock(r, 2, &prevHash) numCkptSegs += 2 } else { - msgBlock, rawCkpt = GenRandomBtcdBlock(0, &prevHash) + msgBlock, rawCkpt = GenRandomBtcdBlock(r, 0, &prevHash) } blocks = append(blocks, msgBlock) @@ -101,8 +101,8 @@ func GenRandomBtcdBlockchainWithBabylonTx(n uint64, oneTxThreshold float32, twoT } // GenRandomBtcdHash generates a random hash in type `chainhash.Hash`, without any hash operations -func GenRandomBtcdHash() chainhash.Hash { - hash, err := chainhash.NewHashFromStr(GenRandomHexStr(32)) +func GenRandomBtcdHash(r *rand.Rand) chainhash.Hash { + hash, err := chainhash.NewHashFromStr(GenRandomHexStr(r, 32)) if err != nil { panic(err) } diff --git a/testutil/datagen/btc_header_info.go b/testutil/datagen/btc_header_info.go index 8bc5d4fff..4c7d1b378 100644 --- a/testutil/datagen/btc_header_info.go +++ b/testutil/datagen/btc_header_info.go @@ -1,9 +1,6 @@ package datagen import ( - "math/big" - "math/rand" - "time" sdkmath "cosmossdk.io/math" bbn "github.com/babylonchain/babylon/types" btclightclienttypes "github.com/babylonchain/babylon/x/btclightclient/types" @@ -11,15 +8,18 @@ import ( "github.com/btcsuite/btcd/chaincfg/chainhash" "github.com/btcsuite/btcd/wire" sdk "github.com/cosmos/cosmos-sdk/types" + "math/big" + "math/rand" + "time" ) -func GenRandomBtcdHeader() *wire.BlockHeader { - version := GenRandomBTCHeaderVersion() - bits := GenRandomBTCHeaderBits() - nonce := GenRandomBTCHeaderNonce() - prevBlock := GenRandomBTCHeaderPrevBlock() - merkleRoot := GenRandomBTCHeaderMerkleRoot() - timestamp := GenRandomBTCHeaderTimestamp() +func GenRandomBtcdHeader(r *rand.Rand) *wire.BlockHeader { + version := GenRandomBTCHeaderVersion(r) + bits := GenRandomBTCHeaderBits(r) + nonce := GenRandomBTCHeaderNonce(r) + prevBlock := GenRandomBTCHeaderPrevBlock(r) + merkleRoot := GenRandomBTCHeaderMerkleRoot(r) + timestamp := GenRandomBTCHeaderTimestamp(r) header := &wire.BlockHeader{ Version: version, @@ -33,12 +33,12 @@ func GenRandomBtcdHeader() *wire.BlockHeader { } // GenRandomBTCHeaderBits constructs a random uint32 corresponding to BTC header difficulty bits -func GenRandomBTCHeaderBits() uint32 { +func GenRandomBTCHeaderBits(r *rand.Rand) uint32 { // Instead of navigating through all the different signs and bit constructing // of the workBits, we can resort to having a uint64 (instead of the maximum of 2^256). // First, generate an integer, convert it into a big.Int and then into compact form. - difficulty := rand.Uint64() + difficulty := r.Uint64() if difficulty == 0 { difficulty += 1 } @@ -49,33 +49,33 @@ func GenRandomBTCHeaderBits() uint32 { } // GenRandomBTCHeaderPrevBlock constructs a random BTCHeaderHashBytes instance -func GenRandomBTCHeaderPrevBlock() *bbn.BTCHeaderHashBytes { - hex := GenRandomHexStr(bbn.BTCHeaderHashLen) +func GenRandomBTCHeaderPrevBlock(r *rand.Rand) *bbn.BTCHeaderHashBytes { + hex := GenRandomHexStr(r, bbn.BTCHeaderHashLen) hashBytes, _ := bbn.NewBTCHeaderHashBytesFromHex(hex) return &hashBytes } // GenRandomBTCHeaderMerkleRoot generates a random hex string corresponding to a merkle root -func GenRandomBTCHeaderMerkleRoot() *chainhash.Hash { +func GenRandomBTCHeaderMerkleRoot(r *rand.Rand) *chainhash.Hash { // TODO: the length should become a constant and the merkle root should have a custom type - chHash, _ := chainhash.NewHashFromStr(GenRandomHexStr(32)) + chHash, _ := chainhash.NewHashFromStr(GenRandomHexStr(r, 32)) return chHash } // GenRandomBTCHeaderTimestamp generates a random BTC header timestamp -func GenRandomBTCHeaderTimestamp() time.Time { - randomTime := rand.Int63n(time.Now().Unix()) +func GenRandomBTCHeaderTimestamp(r *rand.Rand) time.Time { + randomTime := r.Int63n(time.Now().Unix()) return time.Unix(randomTime, 0) } // GenRandomBTCHeaderVersion generates a random version integer -func GenRandomBTCHeaderVersion() int32 { - return rand.Int31() +func GenRandomBTCHeaderVersion(r *rand.Rand) int32 { + return r.Int31() } // GenRandomBTCHeaderNonce generates a random BTC header nonce -func GenRandomBTCHeaderNonce() uint32 { - return rand.Uint32() +func GenRandomBTCHeaderNonce(r *rand.Rand) uint32 { + return r.Uint32() } // GenRandomBTCHeaderBytes generates a random BTCHeaderBytes object @@ -85,8 +85,8 @@ func GenRandomBTCHeaderNonce() uint32 { // `Timestamp` attribute will be later than the parent's `Timestamp`. // If the `bitsBig` argument is not `nil`, then the `Bits` attribute // of the BTC header will point to the compact form of big integer. -func GenRandomBTCHeaderBytes(parent *btclightclienttypes.BTCHeaderInfo, bitsBig *sdkmath.Uint) bbn.BTCHeaderBytes { - btcdHeader := GenRandomBtcdHeader() +func GenRandomBTCHeaderBytes(r *rand.Rand, parent *btclightclienttypes.BTCHeaderInfo, bitsBig *sdkmath.Uint) bbn.BTCHeaderBytes { + btcdHeader := GenRandomBtcdHeader(r) if bitsBig != nil { btcdHeader.Bits = blockchain.BigToCompact(bitsBig.BigInt()) @@ -97,8 +97,8 @@ func GenRandomBTCHeaderBytes(parent *btclightclienttypes.BTCHeaderInfo, bitsBig // The time should be more recent than the parent time // Typical BTC header difference is 10 mins with some fluctuations // The header timestamp is going to be the time of the parent + 10 mins +- 0-59 seconds - seconds := rand.Intn(60) - if OneInN(2) { // 50% of the times subtract the seconds + seconds := r.Intn(60) + if OneInN(r, 2) { // 50% of the times subtract the seconds seconds = -1 * seconds } btcdHeader.Timestamp = parent.Header.Time().Add(time.Minute*10 + time.Duration(seconds)*time.Second) @@ -108,15 +108,15 @@ func GenRandomBTCHeaderBytes(parent *btclightclienttypes.BTCHeaderInfo, bitsBig } // GenRandomBTCHeight returns a random uint64 -func GenRandomBTCHeight() uint64 { - return rand.Uint64() +func GenRandomBTCHeight(r *rand.Rand) uint64 { + return r.Uint64() } // GenRandomBTCHeaderInfoWithParentAndBits generates a BTCHeaderInfo object in which the `header.PrevBlock` points to the `parent` // and the `Work` property points to the accumulated work (parent.Work + header.Work). Less bits as a parameter, means more difficulty. -func GenRandomBTCHeaderInfoWithParentAndBits(parent *btclightclienttypes.BTCHeaderInfo, bits *sdkmath.Uint) *btclightclienttypes.BTCHeaderInfo { - header := GenRandomBTCHeaderBytes(parent, bits) - height := GenRandomBTCHeight() +func GenRandomBTCHeaderInfoWithParentAndBits(r *rand.Rand, parent *btclightclienttypes.BTCHeaderInfo, bits *sdkmath.Uint) *btclightclienttypes.BTCHeaderInfo { + header := GenRandomBTCHeaderBytes(r, parent, bits) + height := GenRandomBTCHeight(r) if parent != nil { height = parent.Height + 1 } @@ -136,16 +136,16 @@ func GenRandomBTCHeaderInfoWithParentAndBits(parent *btclightclienttypes.BTCHead // GenRandomBTCHeaderInfoWithParent generates a random BTCHeaderInfo object // in which the parent points to the `parent` parameter. -func GenRandomBTCHeaderInfoWithParent(parent *btclightclienttypes.BTCHeaderInfo) *btclightclienttypes.BTCHeaderInfo { - return GenRandomBTCHeaderInfoWithParentAndBits(parent, nil) +func GenRandomBTCHeaderInfoWithParent(r *rand.Rand, parent *btclightclienttypes.BTCHeaderInfo) *btclightclienttypes.BTCHeaderInfo { + return GenRandomBTCHeaderInfoWithParentAndBits(r, parent, nil) } // GenRandomValidBTCHeaderInfoWithParent generates random BTCHeaderInfo object // with valid proof of work. // WARNING: if parent is from network with a lot of work (mainnet) it may never finish // use only with simnet headers -func GenRandomValidBTCHeaderInfoWithParent(parent btclightclienttypes.BTCHeaderInfo) *btclightclienttypes.BTCHeaderInfo { - randHeader := GenRandomBtcdHeader() +func GenRandomValidBTCHeaderInfoWithParent(r *rand.Rand, parent btclightclienttypes.BTCHeaderInfo) *btclightclienttypes.BTCHeaderInfo { + randHeader := GenRandomBtcdHeader(r) parentHeader := parent.Header.ToBlockHeader() randHeader.Version = parentHeader.Version @@ -167,19 +167,19 @@ func GenRandomValidBTCHeaderInfoWithParent(parent btclightclienttypes.BTCHeaderI } } -func GenRandomBTCHeaderInfoWithBits(bits *sdkmath.Uint) *btclightclienttypes.BTCHeaderInfo { - return GenRandomBTCHeaderInfoWithParentAndBits(nil, bits) +func GenRandomBTCHeaderInfoWithBits(r *rand.Rand, bits *sdkmath.Uint) *btclightclienttypes.BTCHeaderInfo { + return GenRandomBTCHeaderInfoWithParentAndBits(r, nil, bits) } // GenRandomBTCHeaderInfo generates a random BTCHeaderInfo object -func GenRandomBTCHeaderInfo() *btclightclienttypes.BTCHeaderInfo { - return GenRandomBTCHeaderInfoWithParent(nil) +func GenRandomBTCHeaderInfo(r *rand.Rand) *btclightclienttypes.BTCHeaderInfo { + return GenRandomBTCHeaderInfoWithParent(r, nil) } -func GenRandomBTCHeaderInfoWithInvalidHeader(powLimit *big.Int) *btclightclienttypes.BTCHeaderInfo { +func GenRandomBTCHeaderInfoWithInvalidHeader(r *rand.Rand, powLimit *big.Int) *btclightclienttypes.BTCHeaderInfo { var tries = 0 for { - info := GenRandomBTCHeaderInfo() + info := GenRandomBTCHeaderInfo(r) err := bbn.ValidateBTCHeader(info.Header.ToBlockHeader(), powLimit) @@ -196,10 +196,10 @@ func GenRandomBTCHeaderInfoWithInvalidHeader(powLimit *big.Int) *btclightclientt } // MutateHash takes a hash as a parameter, copies it, modifies the copy, and returns the copy. -func MutateHash(hash *bbn.BTCHeaderHashBytes) *bbn.BTCHeaderHashBytes { +func MutateHash(r *rand.Rand, hash *bbn.BTCHeaderHashBytes) *bbn.BTCHeaderHashBytes { mutatedBytes := make([]byte, bbn.BTCHeaderHashLen) // Retrieve a random byte index - idx := RandomInt(bbn.BTCHeaderHashLen) + idx := RandomInt(r, bbn.BTCHeaderHashLen) copy(mutatedBytes, hash.MustMarshal()) // Add one to the index mutatedBytes[idx] += 1 diff --git a/testutil/datagen/btc_header_tree.go b/testutil/datagen/btc_header_tree.go index 5650c04d4..43151da0c 100644 --- a/testutil/datagen/btc_header_tree.go +++ b/testutil/datagen/btc_header_tree.go @@ -3,6 +3,7 @@ package datagen import ( blctypes "github.com/babylonchain/babylon/x/btclightclient/types" sdk "github.com/cosmos/cosmos-sdk/types" + "math/rand" ) type BTCHeaderTree struct { @@ -66,23 +67,26 @@ func (t *BTCHeaderTree) GetMainChain() []*blctypes.BTCHeaderInfo { // RandNumChildren randomly generates 0-2 children with the following probabilities: // If zeroChildrenAllowed is not set: -// 1 child: 75% -// 2 children: 25% +// +// 1 child: 75% +// 2 children: 25% +// // Otherwise, -// 0 children: 25% -// 1 child: 50% -// 2 children: 25% -func (t *BTCHeaderTree) RandNumChildren(zeroChildrenAllowed bool) int { +// +// 0 children: 25% +// 1 child: 50% +// 2 children: 25% +func (t *BTCHeaderTree) RandNumChildren(r *rand.Rand, zeroChildrenAllowed bool) int { // Randomly identify the number of children numChildren := 0 // If the flag is not set, then we need to generate a child for sure if !zeroChildrenAllowed { numChildren = 1 // 75% chance of 1 child now } - if OneInN(2) { + if OneInN(r, 2) { // 50% of the times, one child numChildren = 1 - } else if OneInN(2) { + } else if OneInN(r, 2) { // 25% of the times, 2 children // Implies that 25% of the times 0 children numChildren = 2 @@ -97,7 +101,7 @@ func (t *BTCHeaderTree) RandNumChildren(zeroChildrenAllowed bool) int { // For each node that is generated, the callback function is invoked in order to identify // whether we should continue generating or not as well as help with maintenance // tasks (e.g. inserting headers into keeper storage). -func (t *BTCHeaderTree) GenRandomBTCHeaderTree(minHeight uint64, maxHeight uint64, +func (t *BTCHeaderTree) GenRandomBTCHeaderTree(r *rand.Rand, minHeight uint64, maxHeight uint64, parent *blctypes.BTCHeaderInfo, callback func(info *blctypes.BTCHeaderInfo) bool) { if maxHeight == 0 { @@ -108,8 +112,8 @@ func (t *BTCHeaderTree) GenRandomBTCHeaderTree(minHeight uint64, maxHeight uint6 const maxRetries = 3 retries := 0 // Generate the children of the parent - for i := 0; i < t.RandNumChildren(minHeight <= 1); i++ { - childInfo := GenRandomBTCHeaderInfoWithParent(parent) + for i := 0; i < t.RandNumChildren(r, minHeight <= 1); i++ { + childInfo := GenRandomBTCHeaderInfoWithParent(r, parent) // Rare occasion that we get the same hash, skip if t.Contains(childInfo) { @@ -128,14 +132,14 @@ func (t *BTCHeaderTree) GenRandomBTCHeaderTree(minHeight uint64, maxHeight uint6 } if callback(childInfo) { t.Add(childInfo, parent) - t.GenRandomBTCHeaderTree(childMinHeight, maxHeight-1, childInfo, callback) + t.GenRandomBTCHeaderTree(r, childMinHeight, maxHeight-1, childInfo, callback) } } } // RandomNode selects a random header from the list of nodes -func (t *BTCHeaderTree) RandomNode() *blctypes.BTCHeaderInfo { - randIdx := RandomInt(len(t.headers)) +func (t *BTCHeaderTree) RandomNode(r *rand.Rand) *blctypes.BTCHeaderInfo { + randIdx := RandomInt(r, len(t.headers)) var idx uint64 = 0 for _, node := range t.headers { if idx == randIdx { @@ -178,9 +182,9 @@ func (t *BTCHeaderTree) GetNodeAncestry(node *blctypes.BTCHeaderInfo) []*blctype // RandomAncestor retrieves the ancestry list and returns an ancestor from it. // Can include the node itself. -func (t *BTCHeaderTree) RandomAncestor(node *blctypes.BTCHeaderInfo) *blctypes.BTCHeaderInfo { +func (t *BTCHeaderTree) RandomAncestor(r *rand.Rand, node *blctypes.BTCHeaderInfo) *blctypes.BTCHeaderInfo { ancestry := t.GetNodeAncestry(node) - idx := RandomInt(len(ancestry)) + idx := RandomInt(r, len(ancestry)) return ancestry[idx] } @@ -228,9 +232,9 @@ func (t *BTCHeaderTree) GetNodeDescendants(node *blctypes.BTCHeaderInfo) []*blct } // RandomDescendant returns a random descendant of the node -func (t *BTCHeaderTree) RandomDescendant(node *blctypes.BTCHeaderInfo) *blctypes.BTCHeaderInfo { +func (t *BTCHeaderTree) RandomDescendant(r *rand.Rand, node *blctypes.BTCHeaderInfo) *blctypes.BTCHeaderInfo { descendants := t.GetNodeDescendants(node) - idx := RandomInt(len(descendants)) + idx := RandomInt(r, len(descendants)) return descendants[idx] } diff --git a/testutil/datagen/btc_transaction.go b/testutil/datagen/btc_transaction.go index 7156aa610..b9e86c45a 100644 --- a/testutil/datagen/btc_transaction.go +++ b/testutil/datagen/btc_transaction.go @@ -164,14 +164,9 @@ func createCoinbaseTx(blockHeight int32, params *chaincfg.Params) *wire.MsgTx { return tx } -func uniqueOpReturnScript() []byte { - rand, err := wire.RandomUint64() - if err != nil { - panic(err) - } - +func uniqueOpReturnScript(r *rand.Rand) []byte { data := make([]byte, 8) - binary.LittleEndian.PutUint64(data[0:8], rand) + binary.LittleEndian.PutUint64(data[0:8], r.Uint64()) return opReturnScript(data) } @@ -180,11 +175,11 @@ type spendableOut struct { amount btcutil.Amount } -func randOutPoint() wire.OutPoint { - hash, _ := chainhash.NewHash(GenRandomByteArray(chainhash.HashSize)) +func randOutPoint(r *rand.Rand) wire.OutPoint { + hash, _ := chainhash.NewHash(GenRandomByteArray(r, chainhash.HashSize)) // TODO this will be deterministic without seed but for now it is not that // important - idx := rand.Uint32() + idx := r.Uint32() return wire.OutPoint{ Hash: *hash, @@ -192,8 +187,8 @@ func randOutPoint() wire.OutPoint { } } -func makeSpendableOutWithRandOutPoint(amount btcutil.Amount) spendableOut { - out := randOutPoint() +func makeSpendableOutWithRandOutPoint(r *rand.Rand, amount btcutil.Amount) spendableOut { + out := randOutPoint(r) return spendableOut{ prevOut: out, @@ -201,7 +196,7 @@ func makeSpendableOutWithRandOutPoint(amount btcutil.Amount) spendableOut { } } -func createSpendTx(spend *spendableOut, fee btcutil.Amount) *wire.MsgTx { +func createSpendTx(r *rand.Rand, spend *spendableOut, fee btcutil.Amount) *wire.MsgTx { spendTx := wire.NewMsgTx(int32(tranasctionVersion)) spendTx.AddTxIn(&wire.TxIn{ PreviousOutPoint: spend.prevOut, @@ -212,7 +207,7 @@ func createSpendTx(spend *spendableOut, fee btcutil.Amount) *wire.MsgTx { opTrueScript)) // uniqueOpReturnScript is needed so that each transactions is different have // different hash - spendTx.AddTxOut(wire.NewTxOut(0, uniqueOpReturnScript())) + spendTx.AddTxOut(wire.NewTxOut(0, uniqueOpReturnScript(r))) return spendTx } @@ -231,8 +226,8 @@ func createSpendOpReturnTx(spend *spendableOut, fee btcutil.Amount, data []byte) return spendTx } -func CreatOpReturnTransaction(babylonData []byte) *wire.MsgTx { - out := makeSpendableOutWithRandOutPoint(1000) +func CreatOpReturnTransaction(r *rand.Rand, babylonData []byte) *wire.MsgTx { + out := makeSpendableOutWithRandOutPoint(r, 1000) tx := createSpendOpReturnTx(&out, lowFee, babylonData) return tx } @@ -244,6 +239,7 @@ type BlockCreationResult struct { } func CreateBlock( + r *rand.Rand, height uint32, numTx uint32, babylonOpReturnIdx uint32, @@ -261,17 +257,17 @@ func CreateBlock( tx := createCoinbaseTx(int32(height), &chaincfg.SimNetParams) transactions = append(transactions, tx) } else if i == babylonOpReturnIdx { - out := makeSpendableOutWithRandOutPoint(1000) + out := makeSpendableOutWithRandOutPoint(r, 1000) tx := createSpendOpReturnTx(&out, lowFee, babylonData) transactions = append(transactions, tx) } else { - out := makeSpendableOutWithRandOutPoint(1000) - tx := createSpendTx(&out, lowFee) + out := makeSpendableOutWithRandOutPoint(r, 1000) + tx := createSpendTx(r, &out, lowFee) transactions = append(transactions, tx) } } - btcHeader := GenRandomBtcdHeader() + btcHeader := GenRandomBtcdHeader(r) // setting SimNetParams so that block can be easily solved btcHeader.Bits = chaincfg.SimNetParams.GenesisBlock.Header.Bits @@ -305,6 +301,7 @@ type BtcHeaderWithProof struct { } func CreateBlockWithTransaction( + r *rand.Rand, ph *wire.BlockHeader, babylonData []byte, ) *BtcHeaderWithProof { @@ -312,9 +309,9 @@ func CreateBlockWithTransaction( var transactions []*wire.MsgTx // height does not matter here, as it is used only for calculation of reward transactions = append(transactions, createCoinbaseTx(int32(889), &chaincfg.SimNetParams)) - transactions = append(transactions, CreatOpReturnTransaction(babylonData)) + transactions = append(transactions, CreatOpReturnTransaction(r, babylonData)) - randHeader := GenRandomBtcdHeader() + randHeader := GenRandomBtcdHeader(r) randHeader.Version = ph.Version randHeader.PrevBlock = ph.BlockHash() randHeader.Bits = ph.Bits @@ -343,24 +340,24 @@ func CreateBlockWithTransaction( } } -func GenRandomTx() *wire.MsgTx { +func GenRandomTx(r *rand.Rand) *wire.MsgTx { // structure of the below tx is from https://github.com/btcsuite/btcd/blob/master/wire/msgtx_test.go tx := &wire.MsgTx{ Version: 1, TxIn: []*wire.TxIn{ { PreviousOutPoint: wire.OutPoint{ - Hash: GenRandomBtcdHash(), - Index: rand.Uint32(), + Hash: GenRandomBtcdHash(r), + Index: r.Uint32(), }, - SignatureScript: GenRandomByteArray(10), - Sequence: rand.Uint32(), + SignatureScript: GenRandomByteArray(r, 10), + Sequence: r.Uint32(), }, }, TxOut: []*wire.TxOut{ { - Value: rand.Int63(), - PkScript: GenRandomByteArray(80), + Value: r.Int63(), + PkScript: GenRandomByteArray(r, 80), }, }, LockTime: 0, @@ -369,13 +366,13 @@ func GenRandomTx() *wire.MsgTx { return tx } -func GenRandomBabylonTxPair() ([]*wire.MsgTx, *btctxformatter.RawBtcCheckpoint) { - txs := []*wire.MsgTx{GenRandomTx(), GenRandomTx()} +func GenRandomBabylonTxPair(r *rand.Rand) ([]*wire.MsgTx, *btctxformatter.RawBtcCheckpoint) { + txs := []*wire.MsgTx{GenRandomTx(r), GenRandomTx(r)} builder := txscript.NewScriptBuilder() // fake a raw checkpoint - rawBTCCkpt := GetRandomRawBtcCheckpoint() - tag := GenRandomByteArray(4) + rawBTCCkpt := GetRandomRawBtcCheckpoint(r) + tag := GenRandomByteArray(r, 4) // encode raw checkpoint to two halves firstHalf, secondHalf, err := btctxformatter.EncodeCheckpointData( btctxformatter.BabylonTag(tag), @@ -404,9 +401,9 @@ func GenRandomBabylonTxPair() ([]*wire.MsgTx, *btctxformatter.RawBtcCheckpoint) return txs, rawBTCCkpt } -func GenRandomBabylonTx() *wire.MsgTx { - txs, _ := GenRandomBabylonTxPair() - idx := rand.Intn(2) +func GenRandomBabylonTx(r *rand.Rand) *wire.MsgTx { + txs, _ := GenRandomBabylonTxPair(r) + idx := r.Intn(2) return txs[idx] } @@ -459,13 +456,13 @@ func GenerateMessageWithRandomSubmitter(blockResults []*BlockCreationResult) *bt return &msg } -func getRandomCheckpointDataForEpoch(e uint64) testCheckpointData { +func getRandomCheckpointDataForEpoch(r *rand.Rand, e uint64) testCheckpointData { return testCheckpointData{ epoch: e, - lastCommitHash: GenRandomByteArray(txformat.LastCommitHashLength), - bitmap: GenRandomByteArray(txformat.BitMapLength), - blsSig: GenRandomByteArray(txformat.BlsSigLength), - submitterAddress: GenRandomByteArray(txformat.AddressLength), + lastCommitHash: GenRandomByteArray(r, txformat.LastCommitHashLength), + bitmap: GenRandomByteArray(r, txformat.BitMapLength), + blsSig: GenRandomByteArray(r, txformat.BlsSigLength), + submitterAddress: GenRandomByteArray(r, txformat.AddressLength), } } @@ -502,8 +499,8 @@ func getExpectedOpReturn(tag txformat.BabylonTag, f []byte, s []byte) []byte { return connected } -func RandomRawCheckpointDataForEpoch(e uint64) (*TestRawCheckpointData, *txformat.RawBtcCheckpoint) { - checkpointData := getRandomCheckpointDataForEpoch(e) +func RandomRawCheckpointDataForEpoch(r *rand.Rand, e uint64) (*TestRawCheckpointData, *txformat.RawBtcCheckpoint) { + checkpointData := getRandomCheckpointDataForEpoch(r, e) rawBTCCkpt := &txformat.RawBtcCheckpoint{ Epoch: checkpointData.epoch, LastCommitHash: checkpointData.lastCommitHash, @@ -534,25 +531,25 @@ func EncodeRawCkptToTestData(rawBTCCkpt *txformat.RawBtcCheckpoint) *TestRawChec } // test helper to generate random number int in range, min and max must be non-negative -func numInRange(min int, max int) int { +func numInRange(r *rand.Rand, min int, max int) int { if min < 0 || max < 0 || min >= max { panic("min and max maust be positve numbers. min must be smaller than max") } - return rand.Intn(max-min) + min + return r.Intn(max-min) + min } -func GenerateMessageWithRandomSubmitterForEpoch(epoch uint64) *btcctypes.MsgInsertBTCSpvProof { +func GenerateMessageWithRandomSubmitterForEpoch(r *rand.Rand, epoch uint64) *btcctypes.MsgInsertBTCSpvProof { numTransactions := 100 - tx1 := numInRange(1, 99) + tx1 := numInRange(r, 1, 99) - tx2 := numInRange(1, 99) + tx2 := numInRange(r, 1, 99) // in those tests epoch is not important - raw, _ := RandomRawCheckpointDataForEpoch(epoch) + raw, _ := RandomRawCheckpointDataForEpoch(r, epoch) - blck1 := CreateBlock(0, uint32(numTransactions), uint32(tx1), raw.FirstPart) + blck1 := CreateBlock(r, 0, uint32(numTransactions), uint32(tx1), raw.FirstPart) - blck2 := CreateBlock(0, uint32(numTransactions), uint32(tx2), raw.SecondPart) + blck2 := CreateBlock(r, 0, uint32(numTransactions), uint32(tx2), raw.SecondPart) msg := GenerateMessageWithRandomSubmitter([]*BlockCreationResult{blck1, blck2}) diff --git a/testutil/datagen/datagen.go b/testutil/datagen/datagen.go index 1c4ac4718..d38fdf18d 100644 --- a/testutil/datagen/datagen.go +++ b/testutil/datagen/datagen.go @@ -5,32 +5,32 @@ import ( "math/rand" ) -func GenRandomByteArray(length uint64) []byte { +func GenRandomByteArray(r *rand.Rand, length uint64) []byte { newHeaderBytes := make([]byte, length) - rand.Read(newHeaderBytes) + r.Read(newHeaderBytes) return newHeaderBytes } -func GenRandomHexStr(length uint64) string { - randBytes := GenRandomByteArray(length) +func GenRandomHexStr(r *rand.Rand, length uint64) string { + randBytes := GenRandomByteArray(r, length) return hex.EncodeToString(randBytes) } -func OneInN(n int) bool { - return RandomInt(n) == 0 +func OneInN(r *rand.Rand, n int) bool { + return RandomInt(r, n) == 0 } -func RandomInt(rng int) uint64 { - return uint64(rand.Intn(rng)) +func RandomInt(r *rand.Rand, rng int) uint64 { + return uint64(r.Intn(rng)) } -func RandomIntOtherThan(x int, rng int) uint64 { +func RandomIntOtherThan(r *rand.Rand, x int, rng int) uint64 { if rng == 1 && x == 0 { panic("There is no other int") } - res := RandomInt(rng) + res := RandomInt(r, rng) for res == uint64(x) { - res = RandomInt(rng) + res = RandomInt(r, rng) } return res } diff --git a/testutil/datagen/epoching.go b/testutil/datagen/epoching.go index 78f71662c..4b44d4c69 100644 --- a/testutil/datagen/epoching.go +++ b/testutil/datagen/epoching.go @@ -6,9 +6,9 @@ import ( epochingtypes "github.com/babylonchain/babylon/x/epoching/types" ) -// firstBlockHeight returns the height of the first block of a given epoch and epoch interval +// getFirstBlockHeight returns the height of the first block of a given epoch and epoch interval // NOTE: this is only a function for testing and assumes static epoch interval -func firstBlockHeight(epochNumber uint64, epochInterval uint64) uint64 { +func getFirstBlockHeight(epochNumber uint64, epochInterval uint64) uint64 { if epochNumber == 0 { return 0 } else { @@ -16,27 +16,27 @@ func firstBlockHeight(epochNumber uint64, epochInterval uint64) uint64 { } } -func GenRandomEpochNum() uint64 { - epochNum := rand.Int63n(100) +func GenRandomEpochNum(r *rand.Rand) uint64 { + epochNum := r.Int63n(100) return uint64(epochNum) } -func GenRandomEpochInterval() uint64 { - epochInterval := rand.Int63n(10) + 2 // interval should be at least 2 +func GenRandomEpochInterval(r *rand.Rand) uint64 { + epochInterval := r.Int63n(10) + 2 // interval should be at least 2 return uint64(epochInterval) } -func GenRandomEpoch() *epochingtypes.Epoch { - epochNum := GenRandomEpochNum() - epochInterval := GenRandomEpochInterval() - firstBlockHeight := firstBlockHeight(epochNum, epochInterval) - lastBlockHeader := GenRandomTMHeader("test-chain", firstBlockHeight+epochInterval-1) +func GenRandomEpoch(r *rand.Rand) *epochingtypes.Epoch { + epochNum := GenRandomEpochNum(r) + epochInterval := GenRandomEpochInterval(r) + firstBlockHeight := getFirstBlockHeight(epochNum, epochInterval) + lastBlockHeader := GenRandomTMHeader(r, "test-chain", firstBlockHeight+epochInterval-1) epoch := epochingtypes.NewEpoch( epochNum, epochInterval, firstBlockHeight, lastBlockHeader, ) - epoch.SealerHeader = GenRandomTMHeader("test-chain", firstBlockHeight+epochInterval+1) // 2nd block in the next epoch + epoch.SealerHeader = GenRandomTMHeader(r, "test-chain", firstBlockHeight+epochInterval+1) // 2nd block in the next epoch return &epoch } diff --git a/testutil/datagen/fuzz.go b/testutil/datagen/fuzz.go index 4eb59418d..8653db974 100644 --- a/testutil/datagen/fuzz.go +++ b/testutil/datagen/fuzz.go @@ -8,9 +8,9 @@ import ( func AddRandomSeedsToFuzzer(f *testing.F, num uint) { // Seed based on the current time - rand.Seed(time.Now().Unix()) + r := rand.New(rand.NewSource(time.Now().Unix())) var idx uint for idx = 0; idx < num; idx++ { - f.Add(rand.Int63()) + f.Add(r.Int63()) } } diff --git a/testutil/datagen/raw_checkpoint.go b/testutil/datagen/raw_checkpoint.go index 97471c3b3..3b5f4954c 100644 --- a/testutil/datagen/raw_checkpoint.go +++ b/testutil/datagen/raw_checkpoint.go @@ -13,8 +13,8 @@ import ( // GenRandomBitmap generates a random bitmap for the validator set // It returns a random bitmap and the number of validators in the subset -func GenRandomBitmap() (bitmap.Bitmap, int) { - bmBytes := GenRandomByteArray(txformat.BitMapLength) +func GenRandomBitmap(r *rand.Rand) (bitmap.Bitmap, int) { + bmBytes := GenRandomByteArray(r, txformat.BitMapLength) bm := bitmap.Bitmap(bmBytes) numSubset := 0 for i := 0; i < bm.Len(); i++ { @@ -25,31 +25,31 @@ func GenRandomBitmap() (bitmap.Bitmap, int) { return bm, numSubset } -func GetRandomRawBtcCheckpoint() *btctxformatter.RawBtcCheckpoint { - rawCkpt := GenRandomRawCheckpoint() +func GetRandomRawBtcCheckpoint(r *rand.Rand) *btctxformatter.RawBtcCheckpoint { + rawCkpt := GenRandomRawCheckpoint(r) return &btctxformatter.RawBtcCheckpoint{ Epoch: rawCkpt.EpochNum, LastCommitHash: *rawCkpt.LastCommitHash, BitMap: rawCkpt.Bitmap, - SubmitterAddress: GenRandomByteArray(btctxformatter.AddressLength), + SubmitterAddress: GenRandomByteArray(r, btctxformatter.AddressLength), BlsSig: rawCkpt.BlsMultiSig.Bytes(), } } -func GenRandomRawCheckpointWithMeta() *types.RawCheckpointWithMeta { +func GenRandomRawCheckpointWithMeta(r *rand.Rand) *types.RawCheckpointWithMeta { ckptWithMeta := &types.RawCheckpointWithMeta{ - Ckpt: GenRandomRawCheckpoint(), - Status: GenRandomStatus(), + Ckpt: GenRandomRawCheckpoint(r), + Status: GenRandomStatus(r), PowerSum: 0, } return ckptWithMeta } -func GenRandomRawCheckpoint() *types.RawCheckpoint { - randomHashBytes := GenRandomLastCommitHash() - randomBLSSig := GenRandomBlsMultiSig() +func GenRandomRawCheckpoint(r *rand.Rand) *types.RawCheckpoint { + randomHashBytes := GenRandomLastCommitHash(r) + randomBLSSig := GenRandomBlsMultiSig(r) return &types.RawCheckpoint{ - EpochNum: GenRandomEpochNum(), + EpochNum: GenRandomEpochNum(r), LastCommitHash: &randomHashBytes, Bitmap: bitmap.New(types.BitmapBits), BlsMultiSig: &randomBLSSig, @@ -57,10 +57,10 @@ func GenRandomRawCheckpoint() *types.RawCheckpoint { } // GenRandomSequenceRawCheckpointsWithMeta generates random checkpoints from epoch 0 to a random epoch -func GenRandomSequenceRawCheckpointsWithMeta() []*types.RawCheckpointWithMeta { +func GenRandomSequenceRawCheckpointsWithMeta(r *rand.Rand) []*types.RawCheckpointWithMeta { var topEpoch, finalEpoch uint64 - epoch1 := GenRandomEpochNum() - epoch2 := GenRandomEpochNum() + epoch1 := GenRandomEpochNum(r) + epoch2 := GenRandomEpochNum(r) if epoch1 > epoch2 { topEpoch = epoch1 finalEpoch = epoch2 @@ -70,7 +70,7 @@ func GenRandomSequenceRawCheckpointsWithMeta() []*types.RawCheckpointWithMeta { } var checkpoints []*types.RawCheckpointWithMeta for e := uint64(0); e <= topEpoch; e++ { - ckpt := GenRandomRawCheckpointWithMeta() + ckpt := GenRandomRawCheckpointWithMeta(r) ckpt.Ckpt.EpochNum = e if e <= finalEpoch { ckpt.Status = types.Finalized @@ -81,10 +81,10 @@ func GenRandomSequenceRawCheckpointsWithMeta() []*types.RawCheckpointWithMeta { return checkpoints } -func GenSequenceRawCheckpointsWithMeta(tipEpoch uint64) []*types.RawCheckpointWithMeta { +func GenSequenceRawCheckpointsWithMeta(r *rand.Rand, tipEpoch uint64) []*types.RawCheckpointWithMeta { ckpts := make([]*types.RawCheckpointWithMeta, int(tipEpoch)+1) for e := uint64(0); e <= tipEpoch; e++ { - ckpt := GenRandomRawCheckpointWithMeta() + ckpt := GenRandomRawCheckpointWithMeta(r) ckpt.Ckpt.EpochNum = e ckpts[int(e)] = ckpt } @@ -101,13 +101,13 @@ func GenerateBLSSigs(keys []bls12381.PrivateKey, msg []byte) []bls12381.Signatur return sigs } -func GenerateLegitimateRawCheckpoint(privKeys []bls12381.PrivateKey) *types.RawCheckpoint { +func GenerateLegitimateRawCheckpoint(r *rand.Rand, privKeys []bls12381.PrivateKey) *types.RawCheckpoint { // number of validators, at least 4 n := len(privKeys) // ensure sufficient signers signerNum := n/3 + 1 - epochNum := GenRandomEpochNum() - lch := GenRandomLastCommitHash() + epochNum := GenRandomEpochNum(r) + lch := GenRandomLastCommitHash(r) msgBytes := types.GetSignBytes(epochNum, lch) sigs := GenerateBLSSigs(privKeys[:signerNum], msgBytes) multiSig, _ := bls12381.AggrSigList(sigs) @@ -125,15 +125,15 @@ func GenerateLegitimateRawCheckpoint(privKeys []bls12381.PrivateKey) *types.RawC return btcCheckpoint } -func GenRandomLastCommitHash() types.LastCommitHash { - return GenRandomByteArray(types.HashSize) +func GenRandomLastCommitHash(r *rand.Rand) types.LastCommitHash { + return GenRandomByteArray(r, types.HashSize) } -func GenRandomBlsMultiSig() bls12381.Signature { - return GenRandomByteArray(bls12381.SignatureSize) +func GenRandomBlsMultiSig(r *rand.Rand) bls12381.Signature { + return GenRandomByteArray(r, bls12381.SignatureSize) } // GenRandomStatus generates random status except for Finalized -func GenRandomStatus() types.CheckpointStatus { - return types.CheckpointStatus(rand.Int31n(int32(len(types.CheckpointStatus_name) - 1))) +func GenRandomStatus(r *rand.Rand) types.CheckpointStatus { + return types.CheckpointStatus(r.Int31n(int32(len(types.CheckpointStatus_name) - 1))) } diff --git a/testutil/datagen/tendermint.go b/testutil/datagen/tendermint.go index 186f65cec..928bb3f4f 100644 --- a/testutil/datagen/tendermint.go +++ b/testutil/datagen/tendermint.go @@ -1,6 +1,7 @@ package datagen import ( + "math/rand" "time" extendedkeeper "github.com/babylonchain/babylon/x/zoneconcierge/extended-client-keeper" @@ -8,22 +9,22 @@ import ( ibctmtypes "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" ) -func GenRandomTMHeader(chainID string, height uint64) *tmproto.Header { +func GenRandomTMHeader(r *rand.Rand, chainID string, height uint64) *tmproto.Header { return &tmproto.Header{ ChainID: chainID, Height: int64(height), Time: time.Now(), - LastCommitHash: GenRandomByteArray(32), + LastCommitHash: GenRandomByteArray(r, 32), } } -func GenRandomIBCTMHeader(chainID string, height uint64) *ibctmtypes.Header { +func GenRandomIBCTMHeader(r *rand.Rand, chainID string, height uint64) *ibctmtypes.Header { return &ibctmtypes.Header{ SignedHeader: &tmproto.SignedHeader{ Header: &tmproto.Header{ ChainID: chainID, Height: int64(height), - LastCommitHash: GenRandomByteArray(32), + LastCommitHash: GenRandomByteArray(r, 32), }, }, } diff --git a/types/btc_header_bytes_test.go b/types/btc_header_bytes_test.go index 9093c671a..21fa5088d 100644 --- a/types/btc_header_bytes_test.go +++ b/types/btc_header_bytes_test.go @@ -14,12 +14,12 @@ func FuzzBTCHeaderBytesBytesOps(f *testing.F) { datagen.AddRandomSeedsToFuzzer(f, 100) f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) + r := rand.New(rand.NewSource(seed)) invalidHeader := false - bz := datagen.GenRandomByteArray(types.BTCHeaderLen) - if datagen.OneInN(10) { - bz = datagen.GenRandomByteArray(datagen.RandomIntOtherThan(types.BTCHeaderLen, 10*types.BTCHeaderLen)) + bz := datagen.GenRandomByteArray(r, types.BTCHeaderLen) + if datagen.OneInN(r, 10) { + bz = datagen.GenRandomByteArray(r, datagen.RandomIntOtherThan(r, types.BTCHeaderLen, 10*types.BTCHeaderLen)) invalidHeader = true } @@ -80,16 +80,16 @@ func FuzzBTCHeaderBytesHexOps(f *testing.F) { datagen.AddRandomSeedsToFuzzer(f, 100) f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) + r := rand.New(rand.NewSource(seed)) invalidHeader := false // 2 hex chars per byte - hex := datagen.GenRandomHexStr(types.BTCHeaderLen) - if datagen.OneInN(10) { - if datagen.OneInN(2) { - hex = datagen.GenRandomHexStr(datagen.RandomIntOtherThan(types.BTCHeaderLen, 10*types.BTCHeaderLen)) + hex := datagen.GenRandomHexStr(r, types.BTCHeaderLen) + if datagen.OneInN(r, 10) { + if datagen.OneInN(r, 2) { + hex = datagen.GenRandomHexStr(r, datagen.RandomIntOtherThan(r, types.BTCHeaderLen, 10*types.BTCHeaderLen)) } else { - hex = string(datagen.GenRandomByteArray(types.BTCHeaderLen * 2)) + hex = string(datagen.GenRandomByteArray(r, types.BTCHeaderLen*2)) } invalidHeader = true } @@ -123,16 +123,16 @@ func FuzzBTCHeaderBytesJSONOps(f *testing.F) { datagen.AddRandomSeedsToFuzzer(f, 100) f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) + r := rand.New(rand.NewSource(seed)) invalidHeader := false // 2 hex chars per byte - hex := datagen.GenRandomHexStr(types.BTCHeaderLen) - if datagen.OneInN(10) { - if datagen.OneInN(2) { - hex = datagen.GenRandomHexStr(datagen.RandomIntOtherThan(types.BTCHeaderLen, 10*types.BTCHeaderLen)) + hex := datagen.GenRandomHexStr(r, types.BTCHeaderLen) + if datagen.OneInN(r, 10) { + if datagen.OneInN(r, 2) { + hex = datagen.GenRandomHexStr(r, datagen.RandomIntOtherThan(r, types.BTCHeaderLen, 10*types.BTCHeaderLen)) } else { - hex = string(datagen.GenRandomByteArray(types.BTCHeaderLen * 2)) + hex = string(datagen.GenRandomByteArray(r, types.BTCHeaderLen*2)) } invalidHeader = true } @@ -174,8 +174,8 @@ func FuzzBTCHeaderBytesBtcdBlockOps(f *testing.F) { datagen.AddRandomSeedsToFuzzer(f, 100) f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) - btcdHeader := datagen.GenRandomBtcdHeader() + r := rand.New(rand.NewSource(seed)) + btcdHeader := datagen.GenRandomBtcdHeader(r) var hb types.BTCHeaderBytes hb.FromBlockHeader(btcdHeader) @@ -195,12 +195,12 @@ func FuzzBTCHeaderBytesBtcdBlockOps(f *testing.F) { func FuzzBTCHeaderBytesOperators(f *testing.F) { datagen.AddRandomSeedsToFuzzer(f, 100) f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) + r := rand.New(rand.NewSource(seed)) - parent := datagen.GenRandomBTCHeaderInfo() + parent := datagen.GenRandomBTCHeaderInfo(r) hb := parent.Header hb2 := types.NewBTCHeaderBytesFromBlockHeader(hb.ToBlockHeader()) - hbChild := datagen.GenRandomBTCHeaderBytes(parent, nil) + hbChild := datagen.GenRandomBTCHeaderBytes(r, parent, nil) if !hb.Eq(hb) { t.Errorf("BTCHeaderBytes object does not equal itself") diff --git a/types/btc_header_hash_bytes_test.go b/types/btc_header_hash_bytes_test.go index 7395bf936..7d4bd514f 100644 --- a/types/btc_header_hash_bytes_test.go +++ b/types/btc_header_hash_bytes_test.go @@ -15,14 +15,14 @@ func FuzzBTCHeaderHashBytesBytesOps(f *testing.F) { datagen.AddRandomSeedsToFuzzer(f, 100) f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) + r := rand.New(rand.NewSource(seed)) invalidHash := false - bz := datagen.GenRandomByteArray(types.BTCHeaderHashLen) + bz := datagen.GenRandomByteArray(r, types.BTCHeaderHashLen) // 1/10 times generate an invalid size - if datagen.OneInN(10) { - bzSz := datagen.RandomIntOtherThan(types.BTCHeaderHashLen, types.BTCHeaderHashLen*10) - bz = datagen.GenRandomByteArray(bzSz) + if datagen.OneInN(r, 10) { + bzSz := datagen.RandomIntOtherThan(r, types.BTCHeaderHashLen, types.BTCHeaderHashLen*10) + bz = datagen.GenRandomByteArray(r, bzSz) invalidHash = true } @@ -83,19 +83,19 @@ func FuzzBTCHeaderHashBytesHexOps(f *testing.F) { datagen.AddRandomSeedsToFuzzer(f, 100) f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) + r := rand.New(rand.NewSource(seed)) invalidHash := false - hex := datagen.GenRandomHexStr(types.BTCHeaderHashLen) + hex := datagen.GenRandomHexStr(r, types.BTCHeaderHashLen) // 1/4 times generate an invalid hash - if datagen.OneInN(10) { - if datagen.OneInN(2) { + if datagen.OneInN(r, 10) { + if datagen.OneInN(r, 2) { // 1/4 times generate an invalid hash size - bzSz := datagen.RandomIntOtherThan(types.BTCHeaderHashLen, types.BTCHeaderHashLen*20) - hex = datagen.GenRandomHexStr(bzSz) + bzSz := datagen.RandomIntOtherThan(r, types.BTCHeaderHashLen, types.BTCHeaderHashLen*20) + hex = datagen.GenRandomHexStr(r, bzSz) } else { // 1/4 times generate an invalid hex - hex = string(datagen.GenRandomByteArray(types.BTCHeaderHashLen * 2)) + hex = string(datagen.GenRandomByteArray(r, types.BTCHeaderHashLen*2)) } invalidHash = true } @@ -129,19 +129,19 @@ func FuzzBTCHeaderHashBytesJSONOps(f *testing.F) { datagen.AddRandomSeedsToFuzzer(f, 100) f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) + r := rand.New(rand.NewSource(seed)) invalidHash := false - hex := datagen.GenRandomHexStr(types.BTCHeaderHashLen) + hex := datagen.GenRandomHexStr(r, types.BTCHeaderHashLen) // 1/4 times generate an invalid hash - if datagen.OneInN(10) { - if datagen.OneInN(2) { + if datagen.OneInN(r, 10) { + if datagen.OneInN(r, 2) { // 1/4 times generate an invalid hash size - bzSz := datagen.RandomIntOtherThan(types.BTCHeaderHashLen, types.BTCHeaderHashLen*20) - hex = datagen.GenRandomHexStr(bzSz) + bzSz := datagen.RandomIntOtherThan(r, types.BTCHeaderHashLen, types.BTCHeaderHashLen*20) + hex = datagen.GenRandomHexStr(r, bzSz) } else { // 1/4 times generate an invalid hex - hex = string(datagen.GenRandomByteArray(types.BTCHeaderHashLen * 2)) + hex = string(datagen.GenRandomByteArray(r, types.BTCHeaderHashLen*2)) } invalidHash = true } @@ -183,9 +183,9 @@ func FuzzBTCHeaderHashBytesJSONOps(f *testing.F) { func FuzzHeaderHashBytesChainhashOps(f *testing.F) { datagen.AddRandomSeedsToFuzzer(f, 100) f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) + r := rand.New(rand.NewSource(seed)) - hexHash := datagen.GenRandomHexStr(types.BTCHeaderHashLen) + hexHash := datagen.GenRandomHexStr(r, types.BTCHeaderHashLen) chHash, _ := chainhash.NewHashFromStr(hexHash) var hbb types.BTCHeaderHashBytes @@ -206,10 +206,10 @@ func FuzzHeaderHashBytesChainhashOps(f *testing.F) { func FuzzHeaderHashBytesOperators(f *testing.F) { datagen.AddRandomSeedsToFuzzer(f, 100) f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) + r := rand.New(rand.NewSource(seed)) - hexHash := datagen.GenRandomHexStr(types.BTCHeaderHashLen) - hexHash2 := datagen.GenRandomHexStr(types.BTCHeaderHashLen) + hexHash := datagen.GenRandomHexStr(r, types.BTCHeaderHashLen) + hexHash2 := datagen.GenRandomHexStr(r, types.BTCHeaderHashLen) chHash, _ := chainhash.NewHashFromStr(hexHash) var hbb, hbb2 types.BTCHeaderHashBytes diff --git a/wasmbinding/test/custom_query_test.go b/wasmbinding/test/custom_query_test.go index 3e2786a49..359da5b20 100644 --- a/wasmbinding/test/custom_query_test.go +++ b/wasmbinding/test/custom_query_test.go @@ -2,6 +2,7 @@ package wasmbinding import ( "encoding/json" + "math/rand" "os" "runtime" "testing" @@ -180,9 +181,11 @@ func TestQueryNonExistingHeader(t *testing.T) { queryCustom(t, ctx, babylonApp, contractAddress, queryNonExisitingHeight, &resp) require.Nil(t, resp.HeaderInfo) + // Random source for the generation of BTC hash + r := rand.New(rand.NewSource(time.Now().Unix())) queryNonExisitingHash := bindings.BabylonQuery{ BtcHeaderByHash: &bindings.BtcHeaderByHash{ - Hash: datagen.GenRandomBtcdHash().String(), + Hash: datagen.GenRandomBtcdHash(r).String(), }, } resp1 := bindings.BtcHeaderQueryResponse{} diff --git a/x/btccheckpoint/keeper/grpc_query_params_test.go b/x/btccheckpoint/keeper/grpc_query_params_test.go index f12ae45f6..ac8e19de5 100644 --- a/x/btccheckpoint/keeper/grpc_query_params_test.go +++ b/x/btccheckpoint/keeper/grpc_query_params_test.go @@ -20,7 +20,7 @@ func FuzzParamsQuery(f *testing.F) { f.Add(uint64(22222), uint64(12333), int64(101)) f.Fuzz(func(t *testing.T, btcConfirmationDepth uint64, checkpointFinalizationTimeout uint64, seed int64) { - rand.Seed(seed) + r := rand.New(rand.NewSource(seed)) // params generated by fuzzer params := types.DefaultParams() @@ -32,7 +32,7 @@ func FuzzParamsQuery(f *testing.F) { if btcConfirmationDepth == 0 { // validation should not pass with zero EpochInterval require.Error(t, params.Validate()) - params.BtcConfirmationDepth = uint64(rand.Int()) + params.BtcConfirmationDepth = uint64(r.Int()) } // test the case of CheckpointFinalizationTimeout == 0 @@ -40,7 +40,7 @@ func FuzzParamsQuery(f *testing.F) { if checkpointFinalizationTimeout == 0 { // validation should not pass with zero EpochInterval require.Error(t, params.Validate()) - params.CheckpointFinalizationTimeout = uint64(rand.Int()) + params.CheckpointFinalizationTimeout = uint64(r.Int()) } if btcConfirmationDepth >= checkpointFinalizationTimeout { @@ -56,7 +56,7 @@ func FuzzParamsQuery(f *testing.F) { wctx := sdk.WrapSDKContext(ctx) // if setParamsFlag == 0, set params - setParamsFlag := rand.Intn(2) + setParamsFlag := r.Intn(2) if setParamsFlag == 0 { if err := keeper.SetParams(ctx, params); err != nil { panic(err) diff --git a/x/btccheckpoint/keeper/msg_server_test.go b/x/btccheckpoint/keeper/msg_server_test.go index d473af083..39eefb98c 100644 --- a/x/btccheckpoint/keeper/msg_server_test.go +++ b/x/btccheckpoint/keeper/msg_server_test.go @@ -81,13 +81,13 @@ func (k *TestKeepers) onTipChange() { } func TestRejectDuplicatedSubmission(t *testing.T) { - rand.Seed(time.Now().Unix()) + r := rand.New(rand.NewSource(time.Now().Unix())) epoch := uint64(1) - raw, _ := dg.RandomRawCheckpointDataForEpoch(epoch) + raw, _ := dg.RandomRawCheckpointDataForEpoch(r, epoch) - blck1 := dg.CreateBlock(1, 7, 7, raw.FirstPart) + blck1 := dg.CreateBlock(r, 1, 7, 7, raw.FirstPart) - blck2 := dg.CreateBlock(2, 14, 3, raw.SecondPart) + blck2 := dg.CreateBlock(r, 2, 14, 3, raw.SecondPart) tk := InitTestKeepers(t) @@ -116,12 +116,12 @@ func TestRejectDuplicatedSubmission(t *testing.T) { } func TestRejectUnknownToBtcLightClient(t *testing.T) { - rand.Seed(time.Now().Unix()) + r := rand.New(rand.NewSource(time.Now().Unix())) epoch := uint64(1) - raw, _ := dg.RandomRawCheckpointDataForEpoch(epoch) + raw, _ := dg.RandomRawCheckpointDataForEpoch(r, epoch) - blck1 := dg.CreateBlock(1, 7, 7, raw.FirstPart) - blck2 := dg.CreateBlock(2, 14, 3, raw.SecondPart) + blck1 := dg.CreateBlock(r, 1, 7, 7, raw.FirstPart) + blck2 := dg.CreateBlock(r, 2, 14, 3, raw.SecondPart) tk := InitTestKeepers(t) @@ -140,12 +140,12 @@ func TestRejectUnknownToBtcLightClient(t *testing.T) { } func TestRejectSubmissionsNotOnMainchain(t *testing.T) { - rand.Seed(time.Now().Unix()) + r := rand.New(rand.NewSource(time.Now().Unix())) epoch := uint64(1) - raw, _ := dg.RandomRawCheckpointDataForEpoch(epoch) + raw, _ := dg.RandomRawCheckpointDataForEpoch(r, epoch) - blck1 := dg.CreateBlock(1, 7, 7, raw.FirstPart) - blck2 := dg.CreateBlock(2, 14, 3, raw.SecondPart) + blck1 := dg.CreateBlock(r, 1, 7, 7, raw.FirstPart) + blck2 := dg.CreateBlock(r, 2, 14, 3, raw.SecondPart) tk := InitTestKeepers(t) @@ -177,11 +177,11 @@ func TestRejectSubmissionsNotOnMainchain(t *testing.T) { } func TestSubmitValidNewCheckpoint(t *testing.T) { - rand.Seed(time.Now().Unix()) + r := rand.New(rand.NewSource(time.Now().Unix())) epoch := uint64(1) - raw, rawBtcCheckpoint := dg.RandomRawCheckpointDataForEpoch(epoch) - blck1 := dg.CreateBlock(1, 7, 7, raw.FirstPart) - blck2 := dg.CreateBlock(2, 14, 3, raw.SecondPart) + raw, rawBtcCheckpoint := dg.RandomRawCheckpointDataForEpoch(r, epoch) + blck1 := dg.CreateBlock(r, 1, 7, 7, raw.FirstPart) + blck2 := dg.CreateBlock(r, 2, 14, 3, raw.SecondPart) // here we will only have valid unconfirmed submissions tk := InitTestKeepers(t) @@ -243,11 +243,11 @@ func TestSubmitValidNewCheckpoint(t *testing.T) { } func TestRejectSubmissionWithoutSubmissionsForPreviousEpoch(t *testing.T) { - rand.Seed(time.Now().Unix()) + r := rand.New(rand.NewSource(time.Now().Unix())) epoch := uint64(2) - raw, _ := dg.RandomRawCheckpointDataForEpoch(epoch) - blck1 := dg.CreateBlock(1, 7, 7, raw.FirstPart) - blck2 := dg.CreateBlock(2, 14, 3, raw.SecondPart) + raw, _ := dg.RandomRawCheckpointDataForEpoch(r, epoch) + blck1 := dg.CreateBlock(r, 1, 7, 7, raw.FirstPart) + blck2 := dg.CreateBlock(r, 2, 14, 3, raw.SecondPart) // here we will only have valid unconfirmed submissions tk := InitTestKeepers(t) @@ -269,11 +269,11 @@ func TestRejectSubmissionWithoutSubmissionsForPreviousEpoch(t *testing.T) { } func TestRejectSubmissionWithoutAncestorsOnMainchainInPreviousEpoch(t *testing.T) { - rand.Seed(time.Now().Unix()) + r := rand.New(rand.NewSource(time.Now().Unix())) epoch := uint64(1) - raw, _ := dg.RandomRawCheckpointDataForEpoch(epoch) - epoch1Block1 := dg.CreateBlock(1, 7, 7, raw.FirstPart) - epoch1Block2 := dg.CreateBlock(2, 14, 3, raw.SecondPart) + raw, _ := dg.RandomRawCheckpointDataForEpoch(r, epoch) + epoch1Block1 := dg.CreateBlock(r, 1, 7, 7, raw.FirstPart) + epoch1Block2 := dg.CreateBlock(r, 2, 14, 3, raw.SecondPart) // here we will only have valid unconfirmed submissions tk := InitTestKeepers(t) @@ -288,9 +288,9 @@ func TestRejectSubmissionWithoutAncestorsOnMainchainInPreviousEpoch(t *testing.T require.NoErrorf(t, err, "Unexpected message processing error: %v", err) epoch2 := uint64(2) - raw2, _ := dg.RandomRawCheckpointDataForEpoch(epoch2) - epoch2Block1 := dg.CreateBlock(1, 19, 2, raw2.FirstPart) - epoch2Block2 := dg.CreateBlock(2, 14, 7, raw2.SecondPart) + raw2, _ := dg.RandomRawCheckpointDataForEpoch(r, epoch2) + epoch2Block1 := dg.CreateBlock(r, 1, 19, 2, raw2.FirstPart) + epoch2Block2 := dg.CreateBlock(r, 2, 14, 7, raw2.SecondPart) msg2 := dg.GenerateMessageWithRandomSubmitter([]*dg.BlockCreationResult{epoch2Block1, epoch2Block2}) // Both headers are deeper than epoch 1 submission, fail @@ -343,40 +343,40 @@ func TestRejectSubmissionWithoutAncestorsOnMainchainInPreviousEpoch(t *testing.T } func TestClearChildEpochsWhenNoParenNotOnMainChain(t *testing.T) { - rand.Seed(time.Now().Unix()) + r := rand.New(rand.NewSource(time.Now().Unix())) tk := InitTestKeepers(t) - msg1 := dg.GenerateMessageWithRandomSubmitterForEpoch(1) + msg1 := dg.GenerateMessageWithRandomSubmitterForEpoch(r, 1) tk.BTCLightClient.SetDepth(b1Hash(msg1), int64(5)) tk.BTCLightClient.SetDepth(b2Hash(msg1), int64(4)) _, err := tk.insertProofMsg(msg1) require.NoError(t, err, "failed to insert submission for epoch 1") - msg1a := dg.GenerateMessageWithRandomSubmitterForEpoch(1) + msg1a := dg.GenerateMessageWithRandomSubmitterForEpoch(r, 1) tk.BTCLightClient.SetDepth(b1Hash(msg1a), int64(4)) tk.BTCLightClient.SetDepth(b2Hash(msg1a), int64(5)) _, err = tk.insertProofMsg(msg1a) require.NoError(t, err, "failed to insert submission for epoch 1") - msg2 := dg.GenerateMessageWithRandomSubmitterForEpoch(2) + msg2 := dg.GenerateMessageWithRandomSubmitterForEpoch(r, 2) tk.BTCLightClient.SetDepth(b1Hash(msg2), int64(3)) tk.BTCLightClient.SetDepth(b2Hash(msg2), int64(2)) _, err = tk.insertProofMsg(msg2) require.NoError(t, err, "failed to insert submission for epoch 2") - msg2a := dg.GenerateMessageWithRandomSubmitterForEpoch(2) + msg2a := dg.GenerateMessageWithRandomSubmitterForEpoch(r, 2) tk.BTCLightClient.SetDepth(b1Hash(msg2a), int64(3)) tk.BTCLightClient.SetDepth(b2Hash(msg2a), int64(2)) _, err = tk.insertProofMsg(msg2a) require.NoError(t, err, "failed to insert submission for epoch 2") - msg3 := dg.GenerateMessageWithRandomSubmitterForEpoch(3) + msg3 := dg.GenerateMessageWithRandomSubmitterForEpoch(r, 3) tk.BTCLightClient.SetDepth(b1Hash(msg3), int64(1)) tk.BTCLightClient.SetDepth(b2Hash(msg3), int64(0)) _, err = tk.insertProofMsg(msg3) require.NoError(t, err, "failed to insert submission for epoch 3") - msg3a := dg.GenerateMessageWithRandomSubmitterForEpoch(3) + msg3a := dg.GenerateMessageWithRandomSubmitterForEpoch(r, 3) tk.BTCLightClient.SetDepth(b1Hash(msg3a), int64(1)) tk.BTCLightClient.SetDepth(b2Hash(msg3a), int64(0)) _, err = tk.insertProofMsg(msg3a) @@ -427,24 +427,24 @@ func TestClearChildEpochsWhenNoParenNotOnMainChain(t *testing.T) { } func TestLeaveOnlyBestSubmissionWhenEpochFinalized(t *testing.T) { - rand.Seed(time.Now().Unix()) + r := rand.New(rand.NewSource(time.Now().Unix())) tk := InitTestKeepers(t) defaultParams := btcctypes.DefaultParams() wDeep := defaultParams.CheckpointFinalizationTimeout - msg1 := dg.GenerateMessageWithRandomSubmitterForEpoch(1) + msg1 := dg.GenerateMessageWithRandomSubmitterForEpoch(r, 1) tk.BTCLightClient.SetDepth(b1Hash(msg1), int64(1)) tk.BTCLightClient.SetDepth(b2Hash(msg1), int64(0)) _, err := tk.insertProofMsg(msg1) require.NoError(t, err, "failed to insert submission") - msg2 := dg.GenerateMessageWithRandomSubmitterForEpoch(1) + msg2 := dg.GenerateMessageWithRandomSubmitterForEpoch(r, 1) tk.BTCLightClient.SetDepth(b1Hash(msg2), int64(1)) tk.BTCLightClient.SetDepth(b2Hash(msg2), int64(0)) _, err = tk.insertProofMsg(msg2) require.NoError(t, err, "failed to insert submission") - msg3 := dg.GenerateMessageWithRandomSubmitterForEpoch(1) + msg3 := dg.GenerateMessageWithRandomSubmitterForEpoch(r, 1) tk.BTCLightClient.SetDepth(b1Hash(msg3), int64(1)) tk.BTCLightClient.SetDepth(b2Hash(msg3), int64(0)) _, err = tk.insertProofMsg(msg3) @@ -476,18 +476,18 @@ func TestLeaveOnlyBestSubmissionWhenEpochFinalized(t *testing.T) { } func TestTxIdxShouldBreakTies(t *testing.T) { - rand.Seed(time.Now().Unix()) + r := rand.New(rand.NewSource(time.Now().Unix())) tk := InitTestKeepers(t) defaultParams := btcctypes.DefaultParams() wDeep := defaultParams.CheckpointFinalizationTimeout - msg1 := dg.GenerateMessageWithRandomSubmitterForEpoch(1) + msg1 := dg.GenerateMessageWithRandomSubmitterForEpoch(r, 1) tk.BTCLightClient.SetDepth(b1Hash(msg1), int64(1)) tk.BTCLightClient.SetDepth(b2Hash(msg1), int64(0)) _, err := tk.insertProofMsg(msg1) require.NoError(t, err, "failed to insert submission") - msg2 := dg.GenerateMessageWithRandomSubmitterForEpoch(1) + msg2 := dg.GenerateMessageWithRandomSubmitterForEpoch(r, 1) tk.BTCLightClient.SetDepth(b1Hash(msg2), int64(1)) tk.BTCLightClient.SetDepth(b2Hash(msg2), int64(0)) _, err = tk.insertProofMsg(msg2) @@ -525,15 +525,15 @@ func TestTxIdxShouldBreakTies(t *testing.T) { } func TestStateTransitionOfValidSubmission(t *testing.T) { - rand.Seed(time.Now().Unix()) + r := rand.New(rand.NewSource(time.Now().Unix())) epoch := uint64(1) defaultParams := btcctypes.DefaultParams() kDeep := defaultParams.BtcConfirmationDepth wDeep := defaultParams.CheckpointFinalizationTimeout - raw, _ := dg.RandomRawCheckpointDataForEpoch(epoch) + raw, _ := dg.RandomRawCheckpointDataForEpoch(r, epoch) - blck1 := dg.CreateBlock(1, 7, 7, raw.FirstPart) - blck2 := dg.CreateBlock(2, 14, 3, raw.SecondPart) + blck1 := dg.CreateBlock(r, 1, 7, 7, raw.FirstPart) + blck2 := dg.CreateBlock(r, 2, 14, 3, raw.SecondPart) tk := InitTestKeepers(t) diff --git a/x/btclightclient/keeper/base_btc_header_test.go b/x/btclightclient/keeper/base_btc_header_test.go index a7c2bdd86..dfe1fa824 100644 --- a/x/btclightclient/keeper/base_btc_header_test.go +++ b/x/btclightclient/keeper/base_btc_header_test.go @@ -19,13 +19,13 @@ func FuzzKeeperBaseBTCHeader(f *testing.F) { */ datagen.AddRandomSeedsToFuzzer(f, 100) f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) + r := rand.New(rand.NewSource(seed)) blcKeeper, ctx := keeper.BTCLightClientKeeper(t) retrievedHeaderInfo := blcKeeper.GetBaseBTCHeader(ctx) if retrievedHeaderInfo != nil { t.Errorf("GetBaseBTCHeader returned a header without one being set") } - headerInfo1 := datagen.GenRandomBTCHeaderInfo() + headerInfo1 := datagen.GenRandomBTCHeaderInfo(r) blcKeeper.SetBaseBTCHeader(ctx, *headerInfo1) retrievedHeaderInfo = blcKeeper.GetBaseBTCHeader(ctx) if retrievedHeaderInfo == nil { diff --git a/x/btclightclient/keeper/grpc_query_test.go b/x/btclightclient/keeper/grpc_query_test.go index 2e1caf695..dc2f18cff 100644 --- a/x/btclightclient/keeper/grpc_query_test.go +++ b/x/btclightclient/keeper/grpc_query_test.go @@ -35,7 +35,7 @@ func FuzzHashesQuery(f *testing.F) { */ datagen.AddRandomSeedsToFuzzer(f, 100) f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) + r := rand.New(rand.NewSource(seed)) blcKeeper, ctx := testkeeper.BTCLightClientKeeper(t) sdkCtx := sdk.WrapSDKContext(ctx) @@ -50,9 +50,9 @@ func FuzzHashesQuery(f *testing.F) { // Test pagination key being invalid // We want the key to have a positive length - bzSz := datagen.RandomIntOtherThan(bbn.BTCHeaderHashLen-1, bbn.BTCHeaderHashLen*10) + 1 - key := datagen.GenRandomByteArray(bzSz) - pagination := constructRequestWithKey(key) + bzSz := datagen.RandomIntOtherThan(r, bbn.BTCHeaderHashLen-1, bbn.BTCHeaderHashLen*10) + 1 + key := datagen.GenRandomByteArray(r, bzSz) + pagination := constructRequestWithKey(r, key) hashesRequest := types.NewQueryHashesRequest(pagination) resp, err = blcKeeper.Hashes(sdkCtx, hashesRequest) if resp != nil { @@ -63,14 +63,14 @@ func FuzzHashesQuery(f *testing.F) { } // Generate a random tree of headers - tree := genRandomTree(blcKeeper, ctx, 1, 10) + tree := genRandomTree(r, blcKeeper, ctx, 1, 10) // Get the headers map headersMap := tree.GetHeadersMap() // Generate a random limit treeSize := uint64(tree.Size()) - limit := uint64(rand.Int63n(int64(tree.Size())) + 1) + limit := uint64(r.Int63n(int64(tree.Size())) + 1) // Generate a page request with a limit and a nil key - pagination = constructRequestWithLimit(limit) + pagination = constructRequestWithLimit(r, limit) // Generate the initial query hashesRequest = types.NewQueryHashesRequest(pagination) // Construct a mapping from the hashes found to a boolean value @@ -103,7 +103,7 @@ func FuzzHashesQuery(f *testing.F) { } // Construct the next page request - pagination = constructRequestWithKeyAndLimit(resp.Pagination.NextKey, limit) + pagination = constructRequestWithKeyAndLimit(r, resp.Pagination.NextKey, limit) hashesRequest = types.NewQueryHashesRequest(pagination) } @@ -125,7 +125,7 @@ func FuzzContainsQuery(f *testing.F) { */ datagen.AddRandomSeedsToFuzzer(f, 100) f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) + r := rand.New(rand.NewSource(seed)) blcKeeper, ctx := testkeeper.BTCLightClientKeeper(t) sdkCtx := sdk.WrapSDKContext(ctx) @@ -139,10 +139,10 @@ func FuzzContainsQuery(f *testing.F) { } // Generate a random tree of headers and insert it into storage - tree := genRandomTree(blcKeeper, ctx, 1, 10) + tree := genRandomTree(r, blcKeeper, ctx, 1, 10) // Test with a non-existent header - query, _ := types.NewQueryContainsRequest(datagen.GenRandomBTCHeaderInfo().Hash.MarshalHex()) + query, _ := types.NewQueryContainsRequest(datagen.GenRandomBTCHeaderInfo(r).Hash.MarshalHex()) resp, err = blcKeeper.Contains(sdkCtx, query) if err != nil { t.Errorf("Valid input let to an error: %s", err) @@ -155,7 +155,7 @@ func FuzzContainsQuery(f *testing.F) { } // Test with an existing header - query, _ = types.NewQueryContainsRequest(tree.RandomNode().Hash.MarshalHex()) + query, _ = types.NewQueryContainsRequest(tree.RandomNode(r).Hash.MarshalHex()) resp, err = blcKeeper.Contains(sdkCtx, query) if err != nil { t.Errorf("Valid input let to an error: %s", err) @@ -187,7 +187,7 @@ func FuzzMainChainQuery(f *testing.F) { */ datagen.AddRandomSeedsToFuzzer(f, 100) f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) + r := rand.New(rand.NewSource(seed)) blcKeeper, ctx := testkeeper.BTCLightClientKeeper(t) sdkCtx := sdk.WrapSDKContext(ctx) @@ -202,9 +202,9 @@ func FuzzMainChainQuery(f *testing.F) { // Test pagination key being invalid // We want the key to have a positive length - bzSz := datagen.RandomIntOtherThan(bbn.BTCHeaderHashLen-1, bbn.BTCHeaderHashLen*10) + 1 - key := datagen.GenRandomByteArray(bzSz) - pagination := constructRequestWithKey(key) + bzSz := datagen.RandomIntOtherThan(r, bbn.BTCHeaderHashLen-1, bbn.BTCHeaderHashLen*10) + 1 + key := datagen.GenRandomByteArray(r, bzSz) + pagination := constructRequestWithKey(r, key) mainchainRequest := types.NewQueryMainChainRequest(pagination) resp, err = blcKeeper.MainChain(sdkCtx, mainchainRequest) if resp != nil { @@ -215,10 +215,10 @@ func FuzzMainChainQuery(f *testing.F) { } // Generate a random tree of headers and insert it into storage - tree := genRandomTree(blcKeeper, ctx, 1, 10) + tree := genRandomTree(r, blcKeeper, ctx, 1, 10) // Check whether the key being set to an element that does not exist leads to an error - pagination = constructRequestWithKey(datagen.GenRandomBTCHeaderInfo().Hash.MustMarshal()) + pagination = constructRequestWithKey(r, datagen.GenRandomBTCHeaderInfo(r).Hash.MustMarshal()) mainchainRequest = types.NewQueryMainChainRequest(pagination) resp, err = blcKeeper.MainChain(sdkCtx, mainchainRequest) if resp != nil { @@ -233,13 +233,13 @@ func FuzzMainChainQuery(f *testing.F) { // Check whether the key being set to a non-mainchain element leads to an error // Select a random header - header := tree.RandomNode() + header := tree.RandomNode(r) // Get the tip tip := tree.GetTip() // if the header is not on the mainchain, we can test our assumption // if it is, randomness will ensure that it does on another test case if !tree.IsOnNodeChain(tip, header) { - pagination = constructRequestWithKeyAndLimit(header.Hash.MustMarshal(), uint64(len(mainchain))) + pagination = constructRequestWithKeyAndLimit(r, header.Hash.MustMarshal(), uint64(len(mainchain))) mainchainRequest = types.NewQueryMainChainRequest(pagination) resp, err = blcKeeper.MainChain(sdkCtx, mainchainRequest) if resp != nil { @@ -254,13 +254,13 @@ func FuzzMainChainQuery(f *testing.F) { mcIdx := 0 // Generate a random limit mcSize := uint64(len(mainchain)) - limit := uint64(rand.Int63n(int64(len(mainchain))) + 1) + limit := uint64(r.Int63n(int64(len(mainchain))) + 1) // 50% of the time, do a reverse request // Generate a page request with a limit and a nil key - pagination = constructRequestWithLimit(limit) + pagination = constructRequestWithLimit(r, limit) reverse := false - if datagen.OneInN(2) { + if datagen.OneInN(r, 2) { reverse = true pagination.Reverse = true } @@ -298,7 +298,7 @@ func FuzzMainChainQuery(f *testing.F) { } // Construct the next page request - pagination = constructRequestWithKeyAndLimit(resp.Pagination.NextKey, limit) + pagination = constructRequestWithKeyAndLimit(r, resp.Pagination.NextKey, limit) if reverse { pagination.Reverse = true } @@ -318,7 +318,7 @@ func FuzzTipQuery(f *testing.F) { */ datagen.AddRandomSeedsToFuzzer(f, 100) f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) + r := rand.New(rand.NewSource(seed)) blcKeeper, ctx := testkeeper.BTCLightClientKeeper(t) sdkCtx := sdk.WrapSDKContext(ctx) @@ -331,10 +331,9 @@ func FuzzTipQuery(f *testing.F) { t.Errorf("Nil input led to a nil error") } - tree := genRandomTree(blcKeeper, ctx, 1, 10) + tree := genRandomTree(r, blcKeeper, ctx, 1, 10) - query := types.NewQueryTipRequest() - resp, err = blcKeeper.Tip(sdkCtx, query) + resp, err = blcKeeper.Tip(sdkCtx, types.NewQueryTipRequest()) if err != nil { t.Errorf("valid input led to an error: %s", err) } @@ -358,7 +357,7 @@ func FuzzBaseHeaderQuery(f *testing.F) { */ datagen.AddRandomSeedsToFuzzer(f, 100) f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) + r := rand.New(rand.NewSource(seed)) blcKeeper, ctx := testkeeper.BTCLightClientKeeper(t) sdkCtx := sdk.WrapSDKContext(ctx) @@ -371,11 +370,9 @@ func FuzzBaseHeaderQuery(f *testing.F) { t.Errorf("Nil input led to a nil error") } - tree := genRandomTree(blcKeeper, ctx, 1, 10) + tree := genRandomTree(r, blcKeeper, ctx, 1, 10) - query := types.NewQueryBaseHeaderRequest() - - resp, err = blcKeeper.BaseHeader(sdkCtx, query) + resp, err = blcKeeper.BaseHeader(sdkCtx, types.NewQueryBaseHeaderRequest()) if err != nil { t.Errorf("valid input led to an error: %s", err) } @@ -389,10 +386,10 @@ func FuzzBaseHeaderQuery(f *testing.F) { } // Constructors for PageRequest objects -func constructRequestWithKeyAndLimit(key []byte, limit uint64) *query.PageRequest { +func constructRequestWithKeyAndLimit(r *rand.Rand, key []byte, limit uint64) *query.PageRequest { // If limit is 0, set one randomly if limit == 0 { - limit = uint64(rand.Int63() + 1) // Use Int63 instead of Uint64 to avoid overflows + limit = uint64(r.Int63() + 1) // Use Int63 instead of Uint64 to avoid overflows } return &query.PageRequest{ Key: key, @@ -403,10 +400,10 @@ func constructRequestWithKeyAndLimit(key []byte, limit uint64) *query.PageReques } } -func constructRequestWithLimit(limit uint64) *query.PageRequest { - return constructRequestWithKeyAndLimit(nil, limit) +func constructRequestWithLimit(r *rand.Rand, limit uint64) *query.PageRequest { + return constructRequestWithKeyAndLimit(r, nil, limit) } -func constructRequestWithKey(key []byte) *query.PageRequest { - return constructRequestWithKeyAndLimit(key, 0) +func constructRequestWithKey(r *rand.Rand, key []byte) *query.PageRequest { + return constructRequestWithKeyAndLimit(r, key, 0) } diff --git a/x/btclightclient/keeper/keeper_test.go b/x/btclightclient/keeper/keeper_test.go index 61fb9d166..02c5fc427 100644 --- a/x/btclightclient/keeper/keeper_test.go +++ b/x/btclightclient/keeper/keeper_test.go @@ -26,10 +26,10 @@ func FuzzKeeperIsHeaderKDeep(f *testing.F) { */ datagen.AddRandomSeedsToFuzzer(f, 100) f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) + r := rand.New(rand.NewSource(seed)) blcKeeper, ctx := testkeeper.BTCLightClientKeeper(t) - depth := rand.Uint64() + depth := r.Uint64() // Test nil input isDeep, err := blcKeeper.IsHeaderKDeep(ctx, nil, depth) @@ -41,7 +41,7 @@ func FuzzKeeperIsHeaderKDeep(f *testing.F) { } // Test header not existing - nonExistentHeader := datagen.GenRandomBTCHeaderBytes(nil, nil) + nonExistentHeader := datagen.GenRandomBTCHeaderBytes(r, nil, nil) isDeep, err = blcKeeper.IsHeaderKDeep(ctx, nonExistentHeader.Hash(), depth) if err == nil { t.Errorf("Non existent header led to nil error") @@ -51,9 +51,9 @@ func FuzzKeeperIsHeaderKDeep(f *testing.F) { } // Generate a random tree of headers with at least one node - tree := genRandomTree(blcKeeper, ctx, 1, 10) + tree := genRandomTree(r, blcKeeper, ctx, 1, 10) // Get a random header from the tree - header := tree.RandomNode() + header := tree.RandomNode(r) // Get the tip of the chain and check whether the header is on the chain that it defines // In that case, the true/false result depends on the depth parameter that we provide. // Otherwise, the result should always be false, regardless of the parameter. @@ -61,7 +61,7 @@ func FuzzKeeperIsHeaderKDeep(f *testing.F) { if tree.IsOnNodeChain(tip, header) { mainchain := tree.GetMainChain() // Select a random depth based on the main-chain length - randDepth := uint64(rand.Int63n(int64(len(mainchain)))) + randDepth := uint64(r.Int63n(int64(len(mainchain)))) isDeep, err = blcKeeper.IsHeaderKDeep(ctx, header.Hash, randDepth) // Identify whether the function should return true or false headerDepth := tip.Height - header.Height @@ -75,7 +75,7 @@ func FuzzKeeperIsHeaderKDeep(f *testing.F) { } } else { // The depth provided does not matter, we should always get false. - randDepth := rand.Uint64() + randDepth := r.Uint64() isDeep, err = blcKeeper.IsHeaderKDeep(ctx, header.Hash, randDepth) if err != nil { t.Errorf("Existent header led to a non-nil error %s", err) @@ -103,7 +103,7 @@ func FuzzKeeperMainChainDepth(f *testing.F) { */ datagen.AddRandomSeedsToFuzzer(f, 100) f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) + r := rand.New(rand.NewSource(seed)) blcKeeper, ctx := testkeeper.BTCLightClientKeeper(t) // Test nil input @@ -116,7 +116,7 @@ func FuzzKeeperMainChainDepth(f *testing.F) { } // Test header not existing - nonExistentHeader := datagen.GenRandomBTCHeaderBytes(nil, nil) + nonExistentHeader := datagen.GenRandomBTCHeaderBytes(r, nil, nil) depth, err = blcKeeper.MainChainDepth(ctx, nonExistentHeader.Hash()) if err == nil { t.Errorf("Non existent header led to nil error") @@ -126,9 +126,9 @@ func FuzzKeeperMainChainDepth(f *testing.F) { } // Generate a random tree of headers with at least one node - tree := genRandomTree(blcKeeper, ctx, 1, 10) + tree := genRandomTree(r, blcKeeper, ctx, 1, 10) // Get a random header from the tree - header := tree.RandomNode() + header := tree.RandomNode(r) // Get the tip of the chain and check whether the header is on the chain that it defines // In that case, the depth result depends on the depth of the header on the mainchain. // Otherwise, the result should always be -1 @@ -168,7 +168,7 @@ func FuzzKeeperBlockHeight(f *testing.F) { */ datagen.AddRandomSeedsToFuzzer(f, 100) f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) + r := rand.New(rand.NewSource(seed)) blcKeeper, ctx := testkeeper.BTCLightClientKeeper(t) // Test nil input @@ -181,7 +181,7 @@ func FuzzKeeperBlockHeight(f *testing.F) { } // Test header not existing - nonExistentHeader := datagen.GenRandomBTCHeaderBytes(nil, nil) + nonExistentHeader := datagen.GenRandomBTCHeaderBytes(r, nil, nil) height, err = blcKeeper.BlockHeight(ctx, nonExistentHeader.Hash()) if err == nil { t.Errorf("Non existent header led to nil error") @@ -190,8 +190,8 @@ func FuzzKeeperBlockHeight(f *testing.F) { t.Errorf("Non existing header led to a result that is not -1") } - tree := genRandomTree(blcKeeper, ctx, 1, 10) - header := tree.RandomNode() + tree := genRandomTree(r, blcKeeper, ctx, 1, 10) + header := tree.RandomNode(r) height, err = blcKeeper.BlockHeight(ctx, header.Hash) if err != nil { t.Errorf("Existent header led to an error") @@ -216,11 +216,11 @@ func FuzzKeeperIsAncestor(f *testing.F) { */ datagen.AddRandomSeedsToFuzzer(f, 100) f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) + r := rand.New(rand.NewSource(seed)) blcKeeper, ctx := testkeeper.BTCLightClientKeeper(t) - nonExistentParent := datagen.GenRandomBTCHeaderInfo() - nonExistentChild := datagen.GenRandomBTCHeaderInfo() + nonExistentParent := datagen.GenRandomBTCHeaderInfo(r) + nonExistentChild := datagen.GenRandomBTCHeaderInfo(r) // nil inputs test isAncestor, err := blcKeeper.IsAncestor(ctx, nil, nil) @@ -255,9 +255,9 @@ func FuzzKeeperIsAncestor(f *testing.F) { } // Generate random tree of headers - tree := genRandomTree(blcKeeper, ctx, 1, 10) - header := tree.RandomNode() - ancestor := tree.RandomNode() + tree := genRandomTree(r, blcKeeper, ctx, 1, 10) + header := tree.RandomNode(r) + ancestor := tree.RandomNode(r) if ancestor.Eq(header) { // Same headers test @@ -322,9 +322,9 @@ func FuzzKeeperInsertHeader(f *testing.F) { */ datagen.AddRandomSeedsToFuzzer(f, 100) f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) + r := rand.New(rand.NewSource(seed)) blcKeeper, ctx := testkeeper.BTCLightClientKeeper(t) - tree := genRandomTree(blcKeeper, ctx, 1, 10) + tree := genRandomTree(r, blcKeeper, ctx, 1, 10) // Test nil input err := blcKeeper.InsertHeader(ctx, nil) @@ -332,13 +332,13 @@ func FuzzKeeperInsertHeader(f *testing.F) { t.Errorf("Nil input led to nil error") } - existingHeader := tree.RandomNode() + existingHeader := tree.RandomNode(r) err = blcKeeper.InsertHeader(ctx, existingHeader.Header) if err == nil { t.Errorf("Existing header led to nil error") } - nonExistentHeader := datagen.GenRandomBTCHeaderInfo() + nonExistentHeader := datagen.GenRandomBTCHeaderInfo(r) err = blcKeeper.InsertHeader(ctx, nonExistentHeader.Header) if err == nil { t.Errorf("Header with non-existent parent led to nil error") @@ -349,8 +349,8 @@ func FuzzKeeperInsertHeader(f *testing.F) { blcKeeper.SetHooks(mockHooks) // Select a random header and build a header on top of it - parentHeader := tree.RandomNode() - header := datagen.GenRandomBTCHeaderInfoWithParent(parentHeader) + parentHeader := tree.RandomNode(r) + header := datagen.GenRandomBTCHeaderInfoWithParent(r, parentHeader) // Assign a new event manager // We do this because the tree building might have led to events getting sent diff --git a/x/btclightclient/keeper/msg_server_test.go b/x/btclightclient/keeper/msg_server_test.go index d600d59f1..e4f7bd742 100644 --- a/x/btclightclient/keeper/msg_server_test.go +++ b/x/btclightclient/keeper/msg_server_test.go @@ -43,7 +43,7 @@ func FuzzMsgServerInsertHeader(f *testing.F) { */ datagen.AddRandomSeedsToFuzzer(f, 100) f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) + r := rand.New(rand.NewSource(seed)) _, blcKeeper, sdkCtx := setupMsgServer(t) defaultParams := chaincfg.MainNetParams @@ -74,7 +74,7 @@ func FuzzMsgServerInsertHeader(f *testing.F) { } // If the header has a parent that does not exist, (nil, error) is returned - headerParentNotExists := datagen.GenRandomBTCHeaderInfo().Header + headerParentNotExists := datagen.GenRandomBTCHeaderInfo(r).Header msg = &types.MsgInsertHeader{Header: headerParentNotExists} resp, err = keeper.MsgInsertHeaderWrapped(sdkCtx, *blcKeeper, msg, *powLimit, reduceMinDifficulty, retargetAdjustmentFactor, false) @@ -87,21 +87,21 @@ func FuzzMsgServerInsertHeader(f *testing.F) { ctx := sdk.UnwrapSDKContext(sdkCtx) // Construct a tree and insert it into storage - tree := genRandomTree(blcKeeper, ctx, uint64(2), 10) - parentHeader := tree.RandomNode() + tree := genRandomTree(r, blcKeeper, ctx, uint64(2), 10) + parentHeader := tree.RandomNode(r) // Do not work with different cases. Select a random integer between 1-retargetAdjustmentFactor+1 // 1/retargetAdjustmentFactor times, the work is going to be invalid parentHeaderDifficulty := parentHeader.Header.Difficulty() // Avoid retargetAdjustmentFactor itself, since the many conversions might lead to inconsistencies - mul := datagen.RandomInt(int(retargetAdjustmentFactor-1)) + 1 - if datagen.OneInN(10) { // Give an invalid mul sometimes + mul := datagen.RandomInt(r, int(retargetAdjustmentFactor-1)) + 1 + if datagen.OneInN(r, 10) { // Give an invalid mul sometimes mul = uint64(retargetAdjustmentFactor + 1) } headerDifficultyMul := sdkmath.NewUintFromBigInt(new(big.Int).Mul(parentHeaderDifficulty, big.NewInt(int64(mul)))) headerDifficultyDiv := sdkmath.NewUintFromBigInt(new(big.Int).Div(parentHeaderDifficulty, big.NewInt(int64(mul)))) // Do tests - headerMoreWork := datagen.GenRandomBTCHeaderInfoWithParentAndBits(parentHeader, &headerDifficultyMul) + headerMoreWork := datagen.GenRandomBTCHeaderInfoWithParentAndBits(r, parentHeader, &headerDifficultyMul) msg = &types.MsgInsertHeader{Header: headerMoreWork.Header} resp, err = keeper.MsgInsertHeaderWrapped(sdkCtx, *blcKeeper, msg, *powLimit, reduceMinDifficulty, retargetAdjustmentFactor, false) @@ -115,7 +115,7 @@ func FuzzMsgServerInsertHeader(f *testing.F) { t.Errorf("Valid header work led to an error") } - headerLessWork := datagen.GenRandomBTCHeaderInfoWithParentAndBits(parentHeader, &headerDifficultyDiv) + headerLessWork := datagen.GenRandomBTCHeaderInfoWithParentAndBits(r, parentHeader, &headerDifficultyDiv) msg = &types.MsgInsertHeader{Header: headerLessWork.Header} resp, err = keeper.MsgInsertHeaderWrapped(sdkCtx, *blcKeeper, msg, *powLimit, reduceMinDifficulty, retargetAdjustmentFactor, false) diff --git a/x/btclightclient/keeper/state_test.go b/x/btclightclient/keeper/state_test.go index 5cedc2889..f6dcc7893 100644 --- a/x/btclightclient/keeper/state_test.go +++ b/x/btclightclient/keeper/state_test.go @@ -35,11 +35,11 @@ func FuzzHeadersStateCreateHeader(f *testing.F) { */ datagen.AddRandomSeedsToFuzzer(f, 100) f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) + r := rand.New(rand.NewSource(seed)) blcKeeper, ctx := testkeeper.BTCLightClientKeeper(t) // Generate a tree with a single root node - tree := genRandomTree(blcKeeper, ctx, 1, 1) + tree := genRandomTree(r, blcKeeper, ctx, 1, 1) baseHeader := tree.GetRoot() // Test whether the tip and storages are set @@ -77,7 +77,7 @@ func FuzzHeadersStateCreateHeader(f *testing.F) { mostDifficulty := sdk.NewUint(10) lessDifficulty := mostDifficulty.Add(sdk.NewUint(1)) // Create an object that builds on top of base header - childMostWork := datagen.GenRandomBTCHeaderInfoWithParentAndBits(baseHeader, &mostDifficulty) + childMostWork := datagen.GenRandomBTCHeaderInfoWithParentAndBits(r, baseHeader, &mostDifficulty) blcKeeper.HeadersState(ctx).CreateHeader(childMostWork) // Check whether the tip was updated tip = blcKeeper.HeadersState(ctx).GetTip() @@ -88,7 +88,7 @@ func FuzzHeadersStateCreateHeader(f *testing.F) { t.Errorf("Tip did not get properly updated") } - childEqualWork := datagen.GenRandomBTCHeaderInfoWithParentAndBits(baseHeader, &mostDifficulty) + childEqualWork := datagen.GenRandomBTCHeaderInfoWithParentAndBits(r, baseHeader, &mostDifficulty) blcKeeper.HeadersState(ctx).CreateHeader(childEqualWork) // Check whether the tip was updated tip = blcKeeper.HeadersState(ctx).GetTip() @@ -96,7 +96,7 @@ func FuzzHeadersStateCreateHeader(f *testing.F) { t.Errorf("Tip got updated when it shouldn't") } - childLessWork := datagen.GenRandomBTCHeaderInfoWithParentAndBits(baseHeader, &lessDifficulty) + childLessWork := datagen.GenRandomBTCHeaderInfoWithParentAndBits(r, baseHeader, &lessDifficulty) blcKeeper.HeadersState(ctx).CreateHeader(childLessWork) // Check whether the tip was updated tip = blcKeeper.HeadersState(ctx).GetTip() @@ -130,11 +130,11 @@ func FuzzHeadersStateTipOps(f *testing.F) { */ datagen.AddRandomSeedsToFuzzer(f, 100) f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) + r := rand.New(rand.NewSource(seed)) blcKeeper, ctx := testkeeper.BTCLightClientKeeper(t) - headerInfo1 := datagen.GenRandomBTCHeaderInfo() - headerInfo2 := datagen.GenRandomBTCHeaderInfo() + headerInfo1 := datagen.GenRandomBTCHeaderInfo(r) + headerInfo2 := datagen.GenRandomBTCHeaderInfo(r) retrievedHeaderInfo := blcKeeper.HeadersState(ctx).GetTip() if retrievedHeaderInfo != nil { @@ -198,11 +198,11 @@ func FuzzHeadersStateGetHeaderOps(f *testing.F) { */ datagen.AddRandomSeedsToFuzzer(f, 100) f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) + r := rand.New(rand.NewSource(seed)) blcKeeper, ctx := testkeeper.BTCLightClientKeeper(t) - headerInfo := datagen.GenRandomBTCHeaderInfo() - wrongHash := datagen.MutateHash(headerInfo.Hash) - wrongHeight := headerInfo.Height + datagen.RandomInt(10) + 1 + headerInfo := datagen.GenRandomBTCHeaderInfo(r) + wrongHash := datagen.MutateHash(r, headerInfo.Hash) + wrongHeight := headerInfo.Height + datagen.RandomInt(r, 10) + 1 // ****** HeaderExists tests ****** if blcKeeper.HeadersState(ctx).HeaderExists(nil) { @@ -292,7 +292,7 @@ func FuzzHeadersStateGetBaseBTCHeader(f *testing.F) { */ datagen.AddRandomSeedsToFuzzer(f, 100) f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) + r := rand.New(rand.NewSource(seed)) blcKeeper, ctx := testkeeper.BTCLightClientKeeper(t) nilBaseHeader := blcKeeper.HeadersState(ctx).GetBaseBTCHeader() @@ -300,7 +300,7 @@ func FuzzHeadersStateGetBaseBTCHeader(f *testing.F) { t.Errorf("Non-existent base BTC header led to non-nil return") } - tree := genRandomTree(blcKeeper, ctx, 1, 10) + tree := genRandomTree(r, blcKeeper, ctx, 1, 10) expectedBaseHeader := tree.GetRoot() gotBaseHeader := blcKeeper.HeadersState(ctx).GetBaseBTCHeader() @@ -325,23 +325,23 @@ func FuzzHeadersStateHeadersByHeight(f *testing.F) { */ datagen.AddRandomSeedsToFuzzer(f, 100) f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) + r := rand.New(rand.NewSource(seed)) blcKeeper, ctx := testkeeper.BTCLightClientKeeper(t) maxHeaders := 256 // maximum 255 headers with particular height - numHeaders := datagen.RandomInt(maxHeaders) + numHeaders := datagen.RandomInt(r, maxHeaders) // This will contain a mapping between all the header hashes that were created // and a boolean value. hashCount := make(map[string]bool) // Setup a tree with a single header - tree := genRandomTree(blcKeeper, ctx, 1, 1) + tree := genRandomTree(r, blcKeeper, ctx, 1, 1) baseHeader := tree.GetRoot() height := baseHeader.Height + 1 // Generate numHeaders with particular height var i uint64 for i = 0; i < numHeaders; i++ { - headerInfo := datagen.GenRandomBTCHeaderInfoWithParent(baseHeader) + headerInfo := datagen.GenRandomBTCHeaderInfoWithParent(r, baseHeader) hashCount[headerInfo.Hash.MarshalHex()] = true blcKeeper.InsertHeader(ctx, headerInfo.Header) //nolint:errcheck } @@ -354,7 +354,7 @@ func FuzzHeadersStateHeadersByHeight(f *testing.F) { t.Errorf("HeadersByHeight returned header that was not created") } hashCount[header.Hash.MarshalHex()] = true - if datagen.OneInN(maxHeaders) { + if datagen.OneInN(r, maxHeaders) { // Only set it once if stopHeight != 0 { stopHeight = headersAdded @@ -395,10 +395,10 @@ func FuzzHeadersStateGetMainChain(f *testing.F) { */ datagen.AddRandomSeedsToFuzzer(f, 100) f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) + r := rand.New(rand.NewSource(seed)) blcKeeper, ctx := testkeeper.BTCLightClientKeeper(t) - tree := genRandomTree(blcKeeper, ctx, 1, 10) + tree := genRandomTree(r, blcKeeper, ctx, 1, 10) expectedMainChain := tree.GetMainChain() gotMainChain := blcKeeper.HeadersState(ctx).GetMainChain() @@ -413,7 +413,7 @@ func FuzzHeadersStateGetMainChain(f *testing.F) { } // depth is a random integer - upToDepth := datagen.RandomInt(len(expectedMainChain)) + upToDepth := datagen.RandomInt(r, len(expectedMainChain)) expectedMainChainUpTo := expectedMainChain[:upToDepth+1] gotMainChainUpTo := blcKeeper.HeadersState(ctx).GetMainChainUpTo(upToDepth) if len(expectedMainChainUpTo) != len(gotMainChainUpTo) { @@ -442,16 +442,16 @@ func FuzzHeadersStateGetHighestCommonAncestor(f *testing.F) { */ datagen.AddRandomSeedsToFuzzer(f, 100) f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) + r := rand.New(rand.NewSource(seed)) blcKeeper, ctx := testkeeper.BTCLightClientKeeper(t) // Generate a random tree with at least one node - tree := genRandomTree(blcKeeper, ctx, 1, 10) + tree := genRandomTree(r, blcKeeper, ctx, 1, 10) // Retrieve a random common ancestor - commonAncestor := tree.RandomNode() + commonAncestor := tree.RandomNode(r) // Generate two child nodes for the common ancestor - childRoot1 := datagen.GenRandomBTCHeaderInfoWithParent(commonAncestor) - childRoot2 := datagen.GenRandomBTCHeaderInfoWithParent(commonAncestor) + childRoot1 := datagen.GenRandomBTCHeaderInfoWithParent(r, commonAncestor) + childRoot2 := datagen.GenRandomBTCHeaderInfoWithParent(r, commonAncestor) if tree.Contains(childRoot1) || tree.Contains(childRoot2) { // Unlucky case where we get the same hash. Should be extremely rare. // Instead of adding extra complexity to this test case, just skip it @@ -465,12 +465,12 @@ func FuzzHeadersStateGetHighestCommonAncestor(f *testing.F) { tree.Add(childRoot2, commonAncestor) // Generate subtrees rooted at the descendant nodes - genRandomTreeWithParent(blcKeeper, ctx, 1, 10, childRoot1, tree) - genRandomTreeWithParent(blcKeeper, ctx, 1, 10, childRoot2, tree) + genRandomTreeWithParent(r, blcKeeper, ctx, 1, 10, childRoot1, tree) + genRandomTreeWithParent(r, blcKeeper, ctx, 1, 10, childRoot2, tree) // Get a random descendant from each of the subtrees - descendant1 := tree.RandomDescendant(childRoot1) - descendant2 := tree.RandomDescendant(childRoot2) + descendant1 := tree.RandomDescendant(r, childRoot1) + descendant2 := tree.RandomDescendant(r, childRoot2) retrievedHighestCommonAncestor := blcKeeper.HeadersState(ctx).GetHighestCommonAncestor(descendant1, descendant2) if retrievedHighestCommonAncestor == nil { @@ -496,17 +496,17 @@ func FuzzHeadersStateGetInOrderAncestorsUntil(f *testing.F) { */ datagen.AddRandomSeedsToFuzzer(f, 100) f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) + r := rand.New(rand.NewSource(seed)) blcKeeper, ctx := testkeeper.BTCLightClientKeeper(t) // Generate a tree of any size. // We can work with even one header, since this should lead to an empty result. - tree := genRandomTree(blcKeeper, ctx, 1, 10) + tree := genRandomTree(r, blcKeeper, ctx, 1, 10) // Get a random header from the tree - descendant := tree.RandomNode() + descendant := tree.RandomNode(r) // Get a random ancestor from it - ancestor := tree.RandomAncestor(descendant) + ancestor := tree.RandomAncestor(r, descendant) // Get the ancestry of the descendant. // It is in reverse order from the one that GetInOrderAncestorsUntil returns, since it starts with the descendant. expectedAncestorsReverse := tree.GetNodeAncestryUpTo(descendant, ancestor) @@ -537,12 +537,12 @@ func FuzzHeadersStateGetHeaderAncestryUpTo(f *testing.F) { */ datagen.AddRandomSeedsToFuzzer(f, 100) f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) + r := rand.New(rand.NewSource(seed)) blcKeeper, ctx := testkeeper.BTCLightClientKeeper(t) - tree := genRandomTree(blcKeeper, ctx, 1, 10) + tree := genRandomTree(r, blcKeeper, ctx, 1, 10) - descendant := tree.RandomNode() - ancestor := tree.RandomAncestor(descendant) + descendant := tree.RandomNode(r) + ancestor := tree.RandomAncestor(r, descendant) ancestors := blcKeeper.HeadersState(ctx).GetHeaderAncestryUpTo(descendant, descendant.Height-ancestor.Height) // Use the parent of the ancestor since UpTo does not include the ancestor in the result diff --git a/x/btclightclient/keeper/utils_test.go b/x/btclightclient/keeper/utils_test.go index cb26b33a9..e8cab00ea 100644 --- a/x/btclightclient/keeper/utils_test.go +++ b/x/btclightclient/keeper/utils_test.go @@ -6,6 +6,7 @@ import ( "github.com/babylonchain/babylon/x/btclightclient/keeper" "github.com/babylonchain/babylon/x/btclightclient/types" sdk "github.com/cosmos/cosmos-sdk/types" + "math/rand" ) // Mock hooks interface @@ -50,28 +51,28 @@ func (m *MockHooks) AfterBTCHeaderInserted(_ sdk.Context, headerInfo *types.BTCH // of the tree that is generated. For example, a `minTreeHeight` of 1, // means that the tree should have at least one node (the root), while // a `maxTreeHeight` of 4, denotes that the maximum height of the tree should be 4. -func genRandomTree(k *keeper.Keeper, ctx sdk.Context, minHeight uint64, maxHeight uint64) *datagen.BTCHeaderTree { +func genRandomTree(r *rand.Rand, k *keeper.Keeper, ctx sdk.Context, minHeight uint64, maxHeight uint64) *datagen.BTCHeaderTree { tree := datagen.NewBTCHeaderTree() // Generate the root for the tree - root := datagen.GenRandomBTCHeaderInfo() + root := datagen.GenRandomBTCHeaderInfo(r) tree.Add(root, nil) k.SetBaseBTCHeader(ctx, *root) - genRandomTreeWithParent(k, ctx, minHeight-1, maxHeight-1, root, tree) + genRandomTreeWithParent(r, k, ctx, minHeight-1, maxHeight-1, root, tree) return tree } // genRandomTreeWithParent is a utility function for inserting the headers // While the tree is generated, the headers that are generated for it are inserted into storage. -func genRandomTreeWithParent(k *keeper.Keeper, ctx sdk.Context, minHeight uint64, +func genRandomTreeWithParent(r *rand.Rand, k *keeper.Keeper, ctx sdk.Context, minHeight uint64, maxHeight uint64, root *types.BTCHeaderInfo, tree *datagen.BTCHeaderTree) { if minHeight > maxHeight { panic("Min height more than max height") } - tree.GenRandomBTCHeaderTree(minHeight, maxHeight, root, func(header *types.BTCHeaderInfo) bool { + tree.GenRandomBTCHeaderTree(r, minHeight, maxHeight, root, func(header *types.BTCHeaderInfo) bool { err := k.InsertHeader(ctx, header.Header) if err != nil { panic(fmt.Sprintf("header insertion failed: %s", err)) diff --git a/x/btclightclient/types/btc_header_info_test.go b/x/btclightclient/types/btc_header_info_test.go index eb82a5021..1fd6eed5d 100644 --- a/x/btclightclient/types/btc_header_info_test.go +++ b/x/btclightclient/types/btc_header_info_test.go @@ -17,11 +17,11 @@ func FuzzNewHeaderInfo(f *testing.F) { f.Fuzz(func(t *testing.T, seed int64) { // If either of the hash strings is not of appropriate length // or not valid hex, generate a random hex randomly - rand.Seed(seed) + r := rand.New(rand.NewSource(seed)) // Get the expected header bytes - expectedHeaderBytes := datagen.GenRandomBTCHeaderInfo().Header + expectedHeaderBytes := datagen.GenRandomBTCHeaderInfo(r).Header expectedHeaderHashBytes := expectedHeaderBytes.Hash() - height := datagen.GenRandomBTCHeight() + height := datagen.GenRandomBTCHeight(r) work := sdkmath.NewUintFromBigInt(expectedHeaderBytes.Difficulty()) headerInfo := types.NewBTCHeaderInfo(expectedHeaderBytes, expectedHeaderHashBytes, height, &work) diff --git a/x/btclightclient/types/keys_test.go b/x/btclightclient/types/keys_test.go index 39d4d2bc9..c41199768 100644 --- a/x/btclightclient/types/keys_test.go +++ b/x/btclightclient/types/keys_test.go @@ -15,9 +15,9 @@ func FuzzHeadersObjectKey(f *testing.F) { datagen.AddRandomSeedsToFuzzer(f, 100) f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) - hexHash := datagen.GenRandomHexStr(bbn.BTCHeaderHashLen) - height := rand.Uint64() + r := rand.New(rand.NewSource(seed)) + hexHash := datagen.GenRandomHexStr(r, bbn.BTCHeaderHashLen) + height := r.Uint64() // get chainhash and height heightBytes := sdk.Uint64ToBigEndian(height) headerHash, _ := bbn.NewBTCHeaderHashBytesFromHex(hexHash) @@ -39,8 +39,8 @@ func FuzzHeadersObjectHeightAndWorkKey(f *testing.F) { datagen.AddRandomSeedsToFuzzer(f, 100) f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) - hexHash := datagen.GenRandomHexStr(bbn.BTCHeaderHashLen) + r := rand.New(rand.NewSource(seed)) + hexHash := datagen.GenRandomHexStr(r, bbn.BTCHeaderHashLen) headerHash, _ := bbn.NewBTCHeaderHashBytesFromHex(hexHash) headerHashBytes := headerHash.MustMarshal() diff --git a/x/btclightclient/types/msgs_test.go b/x/btclightclient/types/msgs_test.go index 02b72036e..3eebe72c5 100644 --- a/x/btclightclient/types/msgs_test.go +++ b/x/btclightclient/types/msgs_test.go @@ -19,11 +19,11 @@ func FuzzMsgInsertHeader(f *testing.F) { datagen.AddRandomSeedsToFuzzer(f, 100) f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) + r := rand.New(rand.NewSource(seed)) errorKind := 0 - addressBytes := datagen.GenRandomByteArray(1 + uint64(rand.Intn(255))) - headerBytes := datagen.GenRandomBTCHeaderInfo().Header + addressBytes := datagen.GenRandomByteArray(r, 1+uint64(r.Intn(255))) + headerBytes := datagen.GenRandomBTCHeaderInfo(r).Header headerHex := headerBytes.MarshalHex() // Get the signer structure @@ -31,7 +31,7 @@ func FuzzMsgInsertHeader(f *testing.F) { signer.Unmarshal(addressBytes) //nolint:errcheck // this is a test // Perform modifications on the header - errorKind = rand.Intn(2) + errorKind = r.Intn(2) var bitsBig sdkmath.Uint switch errorKind { case 0: @@ -46,7 +46,7 @@ func FuzzMsgInsertHeader(f *testing.F) { } // Generate a header with the provided modifications - newHeader := datagen.GenRandomBTCHeaderInfoWithBits(&bitsBig).Header + newHeader := datagen.GenRandomBTCHeaderInfoWithBits(r, &bitsBig).Header newHeaderHex := newHeader.MarshalHex() // Check whether the hash is still bigger than the maximum allowed diff --git a/x/btclightclient/types/querier_test.go b/x/btclightclient/types/querier_test.go index 34a9302cf..a8a292501 100644 --- a/x/btclightclient/types/querier_test.go +++ b/x/btclightclient/types/querier_test.go @@ -33,8 +33,8 @@ func TestNewQueryHashesRequest(t *testing.T) { func FuzzNewQueryContainsRequest(f *testing.F) { datagen.AddRandomSeedsToFuzzer(f, 100) f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) - hexHash := datagen.GenRandomHexStr(bbn.BTCHeaderHashLen) + r := rand.New(rand.NewSource(seed)) + hexHash := datagen.GenRandomHexStr(r, bbn.BTCHeaderHashLen) btcHeaderHashBytes, _ := bbn.NewBTCHeaderHashBytesFromHex(hexHash) diff --git a/x/btclightclient/types/work_test.go b/x/btclightclient/types/work_test.go index df694329e..ef760c07c 100644 --- a/x/btclightclient/types/work_test.go +++ b/x/btclightclient/types/work_test.go @@ -11,9 +11,9 @@ import ( func FuzzCumulativeWork(f *testing.F) { datagen.AddRandomSeedsToFuzzer(f, 100) f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) - numa := rand.Uint64() - numb := rand.Uint64() + r := rand.New(rand.NewSource(seed)) + numa := r.Uint64() + numb := r.Uint64() biga := sdk.NewUint(numa) bigb := sdk.NewUint(numb) diff --git a/x/checkpointing/keeper/grpc_query_bls_test.go b/x/checkpointing/keeper/grpc_query_bls_test.go index e530904cb..322d7eb32 100644 --- a/x/checkpointing/keeper/grpc_query_bls_test.go +++ b/x/checkpointing/keeper/grpc_query_bls_test.go @@ -22,7 +22,7 @@ import ( func FuzzQueryBLSKeySet(f *testing.F) { datagen.AddRandomSeedsToFuzzer(f, 10) f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) + r := rand.New(rand.NewSource(seed)) // a genesis validator is generated for setup helper := testepoching.NewHelper(t) ek := helper.EpochingKeeper @@ -36,7 +36,7 @@ func FuzzQueryBLSKeySet(f *testing.F) { require.NoError(t, err) // BeginBlock of block 1, and thus entering epoch 1 - ctx := helper.BeginBlock() + ctx := helper.BeginBlock(r) epoch := ek.GetEpoch(ctx) require.Equal(t, uint64(1), epoch.EpochNumber) @@ -52,7 +52,7 @@ func FuzzQueryBLSKeySet(f *testing.F) { require.Equal(t, res.ValidatorWithBlsKeys[0].ValidatorAddress, genesisVal.GetValAddressStr()) // add n new validators via MsgWrappedCreateValidator - n := rand.Intn(3) + 1 + n := r.Intn(3) + 1 addrs := app.AddTestAddrs(helper.App, helper.Ctx, n, sdk.NewInt(100000000)) wcvMsgs := make([]*types.MsgWrappedCreateValidator, n) @@ -69,7 +69,7 @@ func FuzzQueryBLSKeySet(f *testing.F) { // go to BeginBlock of block 11, and thus entering epoch 2 for i := uint64(0); i < ek.GetParams(ctx).EpochInterval; i++ { - ctx = helper.GenAndApplyEmptyBlock() + ctx = helper.GenAndApplyEmptyBlock(r) } epoch = ek.GetEpoch(ctx) require.Equal(t, uint64(2), epoch.EpochNumber) diff --git a/x/checkpointing/keeper/grpc_query_checkpoint_test.go b/x/checkpointing/keeper/grpc_query_checkpoint_test.go index 6f6f08e54..b97a4de40 100644 --- a/x/checkpointing/keeper/grpc_query_checkpoint_test.go +++ b/x/checkpointing/keeper/grpc_query_checkpoint_test.go @@ -20,14 +20,14 @@ import ( ) func FuzzQueryEpoch(f *testing.F) { - datagen.AddRandomSeedsToFuzzer(f, 1) + datagen.AddRandomSeedsToFuzzer(f, 100) f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) + r := rand.New(rand.NewSource(seed)) ckptKeeper, ctx, _ := testkeeper.CheckpointingKeeper(t, nil, nil, client.Context{}) sdkCtx := sdk.WrapSDKContext(ctx) // test querying a raw checkpoint with epoch number - mockCkptWithMeta := datagen.GenRandomRawCheckpointWithMeta() + mockCkptWithMeta := datagen.GenRandomRawCheckpointWithMeta(r) err := ckptKeeper.AddRawCheckpoint( ctx, mockCkptWithMeta, @@ -48,12 +48,12 @@ func FuzzQueryEpoch(f *testing.F) { } func FuzzQueryStatusCount(f *testing.F) { - datagen.AddRandomSeedsToFuzzer(f, 1) + datagen.AddRandomSeedsToFuzzer(f, 100) f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) + r := rand.New(rand.NewSource(seed)) // test querying recent epoch counts with each status in recent epochs - checkpoints := datagen.GenRandomSequenceRawCheckpointsWithMeta() + checkpoints := datagen.GenRandomSequenceRawCheckpointsWithMeta(r) tipEpoch := checkpoints[len(checkpoints)-1].Ckpt.EpochNum ctrl := gomock.NewController(t) defer ctrl.Finish() @@ -62,7 +62,7 @@ func FuzzQueryStatusCount(f *testing.F) { ckptKeeper, ctx, _ := testkeeper.CheckpointingKeeper(t, ek, nil, client.Context{}) sdkCtx := sdk.WrapSDKContext(ctx) expectedCounts := make(map[string]uint64) - epochCount := uint64(rand.Int63n(int64(tipEpoch))) + epochCount := uint64(r.Int63n(int64(tipEpoch))) for e, ckpt := range checkpoints { err := ckptKeeper.AddRawCheckpoint( ctx, @@ -89,17 +89,17 @@ func FuzzQueryStatusCount(f *testing.F) { func FuzzQueryLastCheckpointWithStatus(f *testing.F) { datagen.AddRandomSeedsToFuzzer(f, 10) f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) + r := rand.New(rand.NewSource(seed)) // test querying recent epoch counts with each status in recent epochs - tipEpoch := datagen.RandomInt(100) + 10 + tipEpoch := datagen.RandomInt(r, 100) + 10 ctrl := gomock.NewController(t) defer ctrl.Finish() ek := mocks.NewMockEpochingKeeper(ctrl) ek.EXPECT().GetEpoch(gomock.Any()).Return(&epochingtypes.Epoch{EpochNumber: tipEpoch}).AnyTimes() ckptKeeper, ctx, _ := testkeeper.CheckpointingKeeper(t, ek, nil, client.Context{}) - checkpoints := datagen.GenSequenceRawCheckpointsWithMeta(tipEpoch) - finalizedEpoch := datagen.RandomInt(int(tipEpoch)) + checkpoints := datagen.GenSequenceRawCheckpointsWithMeta(r, tipEpoch) + finalizedEpoch := datagen.RandomInt(r, int(tipEpoch)) for e := uint64(0); e < tipEpoch; e++ { if e <= finalizedEpoch { checkpoints[int(e)].Status = types.Finalized @@ -129,20 +129,20 @@ func FuzzQueryLastCheckpointWithStatus(f *testing.F) { }) } -//func TestQueryRawCheckpointList(t *testing.T) { +// func TestQueryRawCheckpointList(t *testing.T) { func FuzzQueryRawCheckpointList(f *testing.F) { datagen.AddRandomSeedsToFuzzer(f, 10) f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) + r := rand.New(rand.NewSource(seed)) - tipEpoch := datagen.RandomInt(10) + 10 + tipEpoch := datagen.RandomInt(r, 10) + 10 ctrl := gomock.NewController(t) defer ctrl.Finish() ek := mocks.NewMockEpochingKeeper(ctrl) ek.EXPECT().GetEpoch(gomock.Any()).Return(&epochingtypes.Epoch{EpochNumber: tipEpoch}).AnyTimes() ckptKeeper, ctx, _ := testkeeper.CheckpointingKeeper(t, ek, nil, client.Context{}) - checkpoints := datagen.GenSequenceRawCheckpointsWithMeta(tipEpoch) - finalizedEpoch := datagen.RandomInt(int(tipEpoch)) + checkpoints := datagen.GenSequenceRawCheckpointsWithMeta(r, tipEpoch) + finalizedEpoch := datagen.RandomInt(r, int(tipEpoch)) // add Sealed and Finalized checkpoints for e := uint64(0); e <= tipEpoch; e++ { @@ -156,21 +156,22 @@ func FuzzQueryRawCheckpointList(f *testing.F) { } finalizedCheckpoints := checkpoints[:finalizedEpoch+1] - testRawCheckpointListWithType(t, ckptKeeper, ctx, finalizedCheckpoints, 0, types.Finalized) + testRawCheckpointListWithType(t, r, ckptKeeper, ctx, finalizedCheckpoints, 0, types.Finalized) sealedCheckpoints := checkpoints[finalizedEpoch+1:] - testRawCheckpointListWithType(t, ckptKeeper, ctx, sealedCheckpoints, finalizedEpoch+1, types.Sealed) + testRawCheckpointListWithType(t, r, ckptKeeper, ctx, sealedCheckpoints, finalizedEpoch+1, types.Sealed) }) } func testRawCheckpointListWithType( t *testing.T, + r *rand.Rand, ckptKeeper *keeper.Keeper, ctx context.Context, checkpointList []*types.RawCheckpointWithMeta, baseEpoch uint64, status types.CheckpointStatus, ) { - limit := datagen.RandomInt(len(checkpointList)+1) + 1 + limit := datagen.RandomInt(r, len(checkpointList)+1) + 1 pagination := &query.PageRequest{Limit: limit, CountTotal: true} req := types.NewQueryRawCheckpointListRequest(pagination, status) diff --git a/x/checkpointing/keeper/keeper_test.go b/x/checkpointing/keeper/keeper_test.go index c6f15987e..84c3ec822 100644 --- a/x/checkpointing/keeper/keeper_test.go +++ b/x/checkpointing/keeper/keeper_test.go @@ -27,7 +27,7 @@ import ( func FuzzKeeperAddRawCheckpoint(f *testing.F) { datagen.AddRandomSeedsToFuzzer(f, 1) f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) + r := rand.New(rand.NewSource(seed)) ckptKeeper, ctx, _ := testkeeper.CheckpointingKeeper(t, nil, nil, client.Context{}) // test nil raw checkpoint @@ -35,7 +35,7 @@ func FuzzKeeperAddRawCheckpoint(f *testing.F) { require.Errorf(t, err, "add a nil raw checkpoint") // test random raw checkpoint - mockCkptWithMeta := datagen.GenRandomRawCheckpointWithMeta() + mockCkptWithMeta := datagen.GenRandomRawCheckpointWithMeta(r) ckpt, err := ckptKeeper.GetRawCheckpoint(ctx, mockCkptWithMeta.Ckpt.EpochNum) require.Nil(t, ckpt) require.Errorf(t, err, "raw checkpoint does not exist") @@ -53,7 +53,7 @@ func FuzzKeeperAddRawCheckpoint(f *testing.F) { _, err = ckptKeeper.BuildRawCheckpoint( ctx, mockCkptWithMeta.Ckpt.EpochNum, - datagen.GenRandomLastCommitHash(), + datagen.GenRandomLastCommitHash(r), ) require.Errorf(t, err, "raw checkpoint with the same epoch already exists") }) @@ -64,7 +64,7 @@ func FuzzKeeperAddRawCheckpoint(f *testing.F) { func FuzzKeeperSetCheckpointStatus(f *testing.F) { datagen.AddRandomSeedsToFuzzer(f, 1) f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) + r := rand.New(rand.NewSource(seed)) ctrl := gomock.NewController(t) defer ctrl.Finish() @@ -72,7 +72,7 @@ func FuzzKeeperSetCheckpointStatus(f *testing.F) { ckptKeeper, ctx, _ := testkeeper.CheckpointingKeeper(t, ek, nil, client.Context{}) /* new accumulating checkpoint*/ - mockCkptWithMeta := datagen.GenRandomRawCheckpointWithMeta() + mockCkptWithMeta := datagen.GenRandomRawCheckpointWithMeta(r) mockCkptWithMeta.Status = types.Accumulating mockCkptWithMeta.RecordStateUpdate(ctx, types.Accumulating) epoch := mockCkptWithMeta.Ckpt.EpochNum @@ -98,7 +98,7 @@ func FuzzKeeperSetCheckpointStatus(f *testing.F) { require.Equal(t, curStateUpdate(ctx, types.Accumulating), mockCkptWithMeta.Lifecycle[0]) /* Accumulating -> Sealed */ - ctx = updateRandomCtx(ctx) + ctx = updateRandomCtx(r, ctx) mockCkptWithMeta.Status = types.Sealed mockCkptWithMeta.RecordStateUpdate(ctx, types.Sealed) err = ckptKeeper.UpdateCheckpoint(ctx, mockCkptWithMeta) @@ -114,7 +114,7 @@ func FuzzKeeperSetCheckpointStatus(f *testing.F) { require.Equal(t, curStateUpdate(ctx, types.Sealed), mockCkptWithMeta.Lifecycle[1]) /* Sealed -> Submitted */ - ctx = updateRandomCtx(ctx) + ctx = updateRandomCtx(r, ctx) ckptKeeper.SetCheckpointSubmitted(ctx, epoch) // ensure status is updated status, err = ckptKeeper.GetStatus(ctx, epoch) @@ -127,7 +127,7 @@ func FuzzKeeperSetCheckpointStatus(f *testing.F) { require.Equal(t, curStateUpdate(ctx, types.Submitted), mockCkptWithMeta.Lifecycle[2]) /* Submitted -> Confirmed */ - ctx = updateRandomCtx(ctx) + ctx = updateRandomCtx(r, ctx) ckptKeeper.SetCheckpointConfirmed(ctx, epoch) // ensure status is updated status, err = ckptKeeper.GetStatus(ctx, epoch) @@ -140,7 +140,7 @@ func FuzzKeeperSetCheckpointStatus(f *testing.F) { require.Equal(t, curStateUpdate(ctx, types.Confirmed), mockCkptWithMeta.Lifecycle[3]) /* Confirmed -> Finalized */ - ctx = updateRandomCtx(ctx) + ctx = updateRandomCtx(r, ctx) ckptKeeper.SetCheckpointFinalized(ctx, epoch) // ensure status is updated status, err = ckptKeeper.GetStatus(ctx, epoch) @@ -161,7 +161,7 @@ func FuzzKeeperSetCheckpointStatus(f *testing.F) { func FuzzKeeperCheckpointEpoch(f *testing.F) { datagen.AddRandomSeedsToFuzzer(f, 1) f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) + r := rand.New(rand.NewSource(seed)) ctrl := gomock.NewController(t) defer ctrl.Finish() @@ -177,7 +177,7 @@ func FuzzKeeperCheckpointEpoch(f *testing.F) { // add local checkpoint, signed by the first validator bm := bitmap.New(types.BitmapBits) bm.Set(0, true) - localCkptWithMeta := datagen.GenRandomRawCheckpointWithMeta() + localCkptWithMeta := datagen.GenRandomRawCheckpointWithMeta(r) localCkptWithMeta.Status = types.Sealed localCkptWithMeta.PowerSum = 10 localCkptWithMeta.Ckpt.Bitmap = bm @@ -191,6 +191,7 @@ func FuzzKeeperCheckpointEpoch(f *testing.F) { // 1. check valid checkpoint rawBtcCheckpoint := makeBtcCkptBytes( + r, localCkptWithMeta.Ckpt.EpochNum, localCkptWithMeta.Ckpt.LastCommitHash.MustMarshal(), localCkptWithMeta.Ckpt.Bitmap, @@ -203,19 +204,21 @@ func FuzzKeeperCheckpointEpoch(f *testing.F) { // 2. check a checkpoint with invalid sig rawBtcCheckpoint = makeBtcCkptBytes( + r, localCkptWithMeta.Ckpt.EpochNum, localCkptWithMeta.Ckpt.LastCommitHash.MustMarshal(), localCkptWithMeta.Ckpt.Bitmap, - datagen.GenRandomByteArray(btctxformatter.BlsSigLength), + datagen.GenRandomByteArray(r, btctxformatter.BlsSigLength), t, ) err = ckptKeeper.VerifyCheckpoint(ctx, *rawBtcCheckpoint) require.ErrorIs(t, err, types.ErrInvalidRawCheckpoint) // 3. check a conflicting checkpoint; signed on a random lastcommithash - conflictLastCommitHash := datagen.GenRandomByteArray(btctxformatter.LastCommitHashLength) + conflictLastCommitHash := datagen.GenRandomByteArray(r, btctxformatter.LastCommitHashLength) msgBytes = types.GetSignBytes(localCkptWithMeta.Ckpt.EpochNum, conflictLastCommitHash) rawBtcCheckpoint = makeBtcCkptBytes( + r, localCkptWithMeta.Ckpt.EpochNum, conflictLastCommitHash, localCkptWithMeta.Ckpt.Bitmap, @@ -228,10 +231,10 @@ func FuzzKeeperCheckpointEpoch(f *testing.F) { }) } -func makeBtcCkptBytes(epoch uint64, lch []byte, bitmap []byte, blsSig []byte, t *testing.T) *btctxformatter.RawBtcCheckpoint { - tag := datagen.GenRandomByteArray(btctxformatter.TagLength) +func makeBtcCkptBytes(r *rand.Rand, epoch uint64, lch []byte, bitmap []byte, blsSig []byte, t *testing.T) *btctxformatter.RawBtcCheckpoint { + tag := datagen.GenRandomByteArray(r, btctxformatter.TagLength) babylonTag := btctxformatter.BabylonTag(tag[:btctxformatter.TagLength]) - address := datagen.GenRandomByteArray(btctxformatter.AddressLength) + address := datagen.GenRandomByteArray(r, btctxformatter.AddressLength) rawBTCCkpt := &btctxformatter.RawBtcCheckpoint{ Epoch: epoch, @@ -268,7 +271,7 @@ func curStateUpdate(ctx sdk.Context, status types.CheckpointStatus) *types.Check } } -func updateRandomCtx(ctx sdk.Context) sdk.Context { - header := datagen.GenRandomTMHeader("test", datagen.RandomInt(1000)) +func updateRandomCtx(r *rand.Rand, ctx sdk.Context) sdk.Context { + header := datagen.GenRandomTMHeader(r, "test", datagen.RandomInt(r, 1000)) return ctx.WithBlockHeader(*header) } diff --git a/x/checkpointing/keeper/msg_server_test.go b/x/checkpointing/keeper/msg_server_test.go index d20caf652..cf68639f3 100644 --- a/x/checkpointing/keeper/msg_server_test.go +++ b/x/checkpointing/keeper/msg_server_test.go @@ -29,7 +29,7 @@ func FuzzWrappedCreateValidator_InsufficientTokens(f *testing.F) { datagen.AddRandomSeedsToFuzzer(f, 4) f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) + r := rand.New(rand.NewSource(seed)) // a genesis validator is generate for setup helper := testepoching.NewHelper(t) @@ -38,11 +38,11 @@ func FuzzWrappedCreateValidator_InsufficientTokens(f *testing.F) { msgServer := checkpointingkeeper.NewMsgServerImpl(ck) // BeginBlock of block 1, and thus entering epoch 1 - ctx := helper.BeginBlock() + ctx := helper.BeginBlock(r) epoch := ek.GetEpoch(ctx) require.Equal(t, uint64(1), epoch.EpochNumber) - n := rand.Intn(3) + 1 + n := r.Intn(3) + 1 addrs := app.AddTestAddrs(helper.App, helper.Ctx, n, sdk.NewInt(100000000)) // add n new validators with zero voting power via MsgWrappedCreateValidator @@ -64,7 +64,7 @@ func FuzzWrappedCreateValidator_InsufficientTokens(f *testing.F) { // go to BeginBlock of block 11, and thus entering epoch 2 for i := uint64(0); i < ek.GetParams(ctx).EpochInterval; i++ { - ctx = helper.GenAndApplyEmptyBlock() + ctx = helper.GenAndApplyEmptyBlock(r) } epoch = ek.GetEpoch(ctx) require.Equal(t, uint64(2), epoch.EpochNumber) @@ -104,7 +104,7 @@ func FuzzWrappedCreateValidator_InsufficientBalance(f *testing.F) { datagen.AddRandomSeedsToFuzzer(f, 4) f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) + r := rand.New(rand.NewSource(seed)) // a genesis validator is generate for setup helper := testepoching.NewHelper(t) @@ -113,19 +113,19 @@ func FuzzWrappedCreateValidator_InsufficientBalance(f *testing.F) { msgServer := checkpointingkeeper.NewMsgServerImpl(ck) // BeginBlock of block 1, and thus entering epoch 1 - ctx := helper.BeginBlock() + ctx := helper.BeginBlock(r) epoch := ek.GetEpoch(ctx) require.Equal(t, uint64(1), epoch.EpochNumber) - n := rand.Intn(3) + 1 - balance := rand.Int63n(100) + n := r.Intn(3) + 1 + balance := r.Int63n(100) addrs := app.AddTestAddrs(helper.App, helper.Ctx, n, sdk.NewInt(balance)) // add n new validators with value more than the delegator balance via MsgWrappedCreateValidator wcvMsgs := make([]*types.MsgWrappedCreateValidator, n) for i := 0; i < n; i++ { // make sure the value is more than the balance - value := sdk.NewInt(balance).Add(sdk.NewInt(rand.Int63n(100))) + value := sdk.NewInt(balance).Add(sdk.NewInt(r.Int63n(100))) msg, err := buildMsgWrappedCreateValidatorWithAmount(addrs[i], value) require.NoError(t, err) wcvMsgs[i] = msg @@ -144,7 +144,7 @@ func FuzzWrappedCreateValidator(f *testing.F) { datagen.AddRandomSeedsToFuzzer(f, 4) f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) + r := rand.New(rand.NewSource(seed)) // a genesis validator is generate for setup helper := testepoching.NewHelper(t) @@ -153,12 +153,12 @@ func FuzzWrappedCreateValidator(f *testing.F) { msgServer := checkpointingkeeper.NewMsgServerImpl(ck) // BeginBlock of block 1, and thus entering epoch 1 - ctx := helper.BeginBlock() + ctx := helper.BeginBlock(r) epoch := ek.GetEpoch(ctx) require.Equal(t, uint64(1), epoch.EpochNumber) // add n new validators via MsgWrappedCreateValidator - n := rand.Intn(3) + n := r.Intn(3) addrs := app.AddTestAddrs(helper.App, helper.Ctx, n, sdk.NewInt(100000000)) wcvMsgs := make([]*types.MsgWrappedCreateValidator, n) @@ -179,7 +179,7 @@ func FuzzWrappedCreateValidator(f *testing.F) { // go to BeginBlock of block 11, and thus entering epoch 2 for i := uint64(0); i < ek.GetParams(ctx).EpochInterval; i++ { - ctx = helper.GenAndApplyEmptyBlock() + ctx = helper.GenAndApplyEmptyBlock(r) } epoch = ek.GetEpoch(ctx) require.Equal(t, uint64(2), epoch.EpochNumber) @@ -211,7 +211,7 @@ func FuzzAddBlsSig_NoError(f *testing.F) { datagen.AddRandomSeedsToFuzzer(f, 4) f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) + r := rand.New(rand.NewSource(seed)) helper := testepoching.NewHelperWithValSet(t) ek := helper.EpochingKeeper @@ -219,13 +219,13 @@ func FuzzAddBlsSig_NoError(f *testing.F) { msgServer := checkpointingkeeper.NewMsgServerImpl(ck) // BeginBlock of block 1, and thus entering epoch 1 - ctx := helper.BeginBlock() + ctx := helper.BeginBlock(r) epoch := ek.GetEpoch(ctx) require.Equal(t, uint64(1), epoch.EpochNumber) // apply 2 blocks to ensure that a raw checkpoint for the previous epoch is built for i := uint64(0); i < 2; i++ { - ctx = helper.GenAndApplyEmptyBlock() + ctx = helper.GenAndApplyEmptyBlock(r) } endingEpoch := ek.GetEpoch(ctx).EpochNumber - 1 _, err := ck.GetRawCheckpoint(ctx, endingEpoch) @@ -262,7 +262,7 @@ func FuzzAddBlsSig_NotInValSet(f *testing.F) { datagen.AddRandomSeedsToFuzzer(f, 4) f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) + r := rand.New(rand.NewSource(seed)) helper := testepoching.NewHelperWithValSet(t) ek := helper.EpochingKeeper @@ -270,10 +270,10 @@ func FuzzAddBlsSig_NotInValSet(f *testing.F) { msgServer := checkpointingkeeper.NewMsgServerImpl(ck) // BeginBlock of block 1, and thus entering epoch 1 - ctx := helper.BeginBlock() + ctx := helper.BeginBlock(r) // apply 2 blocks to ensure that a raw checkpoint for the previous epoch is built for i := uint64(0); i < 2; i++ { - ctx = helper.GenAndApplyEmptyBlock() + ctx = helper.GenAndApplyEmptyBlock(r) } endingEpoch := ek.GetEpoch(ctx).EpochNumber - 1 _, err := ck.GetRawCheckpoint(ctx, endingEpoch) @@ -298,7 +298,7 @@ func FuzzAddBlsSig_CkptNotExist(f *testing.F) { datagen.AddRandomSeedsToFuzzer(f, 4) f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) + r := rand.New(rand.NewSource(seed)) helper := testepoching.NewHelperWithValSet(t) ek := helper.EpochingKeeper @@ -306,13 +306,13 @@ func FuzzAddBlsSig_CkptNotExist(f *testing.F) { msgServer := checkpointingkeeper.NewMsgServerImpl(ck) // BeginBlock of block 1, and thus entering epoch 1 - ctx := helper.BeginBlock() + ctx := helper.BeginBlock(r) epoch := ek.GetEpoch(ctx) require.Equal(t, uint64(1), epoch.EpochNumber) // build BLS signature from a random validator of the validator set n := len(helper.ValBlsPrivKeys) - i := rand.Intn(n) + i := r.Intn(n) lch := ctx.BlockHeader().LastCommitHash blsPrivKey := helper.ValBlsPrivKeys[i].BlsKey addr := helper.ValBlsPrivKeys[i].Address @@ -333,7 +333,7 @@ func FuzzAddBlsSig_WrongLastCommitHash(f *testing.F) { datagen.AddRandomSeedsToFuzzer(f, 4) f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) + r := rand.New(rand.NewSource(seed)) helper := testepoching.NewHelperWithValSet(t) ek := helper.EpochingKeeper @@ -341,12 +341,12 @@ func FuzzAddBlsSig_WrongLastCommitHash(f *testing.F) { msgServer := checkpointingkeeper.NewMsgServerImpl(ck) // BeginBlock of block 1, and thus entering epoch 1 - ctx := helper.BeginBlock() + ctx := helper.BeginBlock(r) epoch := ek.GetEpoch(ctx) require.Equal(t, uint64(1), epoch.EpochNumber) // apply 2 blocks to ensure that a raw checkpoint for the previous epoch is built for i := uint64(0); i < 2; i++ { - ctx = helper.GenAndApplyEmptyBlock() + ctx = helper.GenAndApplyEmptyBlock(r) } endingEpoch := ek.GetEpoch(ctx).EpochNumber - 1 _, err := ck.GetRawCheckpoint(ctx, endingEpoch) @@ -354,9 +354,9 @@ func FuzzAddBlsSig_WrongLastCommitHash(f *testing.F) { // build BLS sig from a random validator n := len(helper.ValBlsPrivKeys) - i := rand.Intn(n) + i := r.Intn(n) // inject random last commit hash - lch := datagen.GenRandomLastCommitHash() + lch := datagen.GenRandomLastCommitHash(r) blsPrivKey := helper.ValBlsPrivKeys[i].BlsKey addr := helper.ValBlsPrivKeys[i].Address signBytes := types.GetSignBytes(endingEpoch, lch) @@ -375,7 +375,7 @@ func FuzzAddBlsSig_InvalidSignature(f *testing.F) { datagen.AddRandomSeedsToFuzzer(f, 4) f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) + r := rand.New(rand.NewSource(seed)) helper := testepoching.NewHelperWithValSet(t) ek := helper.EpochingKeeper @@ -383,12 +383,12 @@ func FuzzAddBlsSig_InvalidSignature(f *testing.F) { msgServer := checkpointingkeeper.NewMsgServerImpl(ck) // BeginBlock of block 1, and thus entering epoch 1 - ctx := helper.BeginBlock() + ctx := helper.BeginBlock(r) epoch := ek.GetEpoch(ctx) require.Equal(t, uint64(1), epoch.EpochNumber) // apply 2 blocks to ensure that a raw checkpoint for the previous epoch is built for i := uint64(0); i < 2; i++ { - ctx = helper.GenAndApplyEmptyBlock() + ctx = helper.GenAndApplyEmptyBlock(r) } endingEpoch := ek.GetEpoch(ctx).EpochNumber - 1 _, err := ck.GetRawCheckpoint(ctx, endingEpoch) @@ -396,11 +396,11 @@ func FuzzAddBlsSig_InvalidSignature(f *testing.F) { // build BLS sig from a random validator n := len(helper.ValBlsPrivKeys) - i := rand.Intn(n) + i := r.Intn(n) // inject random last commit hash lch := ctx.BlockHeader().LastCommitHash addr := helper.ValBlsPrivKeys[i].Address - blsSig := datagen.GenRandomBlsMultiSig() + blsSig := datagen.GenRandomBlsMultiSig(r) msg := types.NewMsgAddBlsSig(sdk.AccAddress(addr), endingEpoch, lch, blsSig, addr) // add the BLS signature message diff --git a/x/checkpointing/keeper/val_bls_set_test.go b/x/checkpointing/keeper/val_bls_set_test.go index d7ec3993d..13aaa7939 100644 --- a/x/checkpointing/keeper/val_bls_set_test.go +++ b/x/checkpointing/keeper/val_bls_set_test.go @@ -17,7 +17,7 @@ import ( func FuzzGetValidatorBlsKeySet(f *testing.F) { datagen.AddRandomSeedsToFuzzer(f, 10) f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) + r := rand.New(rand.NewSource(seed)) // a genesis validator is generated for setup helper := testepoching.NewHelper(t) ek := helper.EpochingKeeper @@ -30,7 +30,7 @@ func FuzzGetValidatorBlsKeySet(f *testing.F) { require.NoError(t, err) // BeginBlock of block 1, and thus entering epoch 1 - ctx := helper.BeginBlock() + ctx := helper.BeginBlock(r) epoch := ek.GetEpoch(ctx) require.Equal(t, uint64(1), epoch.EpochNumber) @@ -41,7 +41,7 @@ func FuzzGetValidatorBlsKeySet(f *testing.F) { require.Equal(t, uint64(genesisVal.Power), valBlsSet.ValSet[0].VotingPower) // add n new validators via MsgWrappedCreateValidator - n := rand.Intn(10) + 1 + n := r.Intn(10) + 1 addrs := app.AddTestAddrs(helper.App, helper.Ctx, n, sdk.NewInt(100000000)) wcvMsgs := make([]*types.MsgWrappedCreateValidator, n) @@ -58,7 +58,7 @@ func FuzzGetValidatorBlsKeySet(f *testing.F) { // go to BeginBlock of block 11, and thus entering epoch 2 for i := uint64(0); i < ek.GetParams(ctx).EpochInterval; i++ { - ctx = helper.GenAndApplyEmptyBlock() + ctx = helper.GenAndApplyEmptyBlock(r) } epoch = ek.GetEpoch(ctx) require.Equal(t, uint64(2), epoch.EpochNumber) diff --git a/x/checkpointing/types/types_test.go b/x/checkpointing/types/types_test.go index 388ff3183..d6d06a1f3 100644 --- a/x/checkpointing/types/types_test.go +++ b/x/checkpointing/types/types_test.go @@ -1,7 +1,9 @@ package types_test import ( + "math/rand" "testing" + "time" "github.com/cosmos/cosmos-sdk/client" "github.com/stretchr/testify/require" @@ -13,11 +15,12 @@ import ( // a single validator func TestRawCheckpointWithMeta_Accumulate1(t *testing.T) { + r := rand.New(rand.NewSource(time.Now().Unix())) epochNum := uint64(2) n := 1 totalPower := int64(10) ckptkeeper, ctx, _ := testkeeper.CheckpointingKeeper(t, nil, nil, client.Context{}) - lch := datagen.GenRandomLastCommitHash() + lch := datagen.GenRandomLastCommitHash(r) msg := types.GetSignBytes(epochNum, lch) blsPubkeys, blsSigs := datagen.GenRandomPubkeysAndSigs(n, msg) ckpt, err := ckptkeeper.BuildRawCheckpoint(ctx, epochNum, lch) @@ -35,11 +38,12 @@ func TestRawCheckpointWithMeta_Accumulate1(t *testing.T) { // 4 validators func TestRawCheckpointWithMeta_Accumulate4(t *testing.T) { + r := rand.New(rand.NewSource(time.Now().Unix())) epochNum := uint64(2) n := 4 totalPower := int64(10) * int64(n) ckptkeeper, ctx, _ := testkeeper.CheckpointingKeeper(t, nil, nil, client.Context{}) - lch := datagen.GenRandomLastCommitHash() + lch := datagen.GenRandomLastCommitHash(r) msg := types.GetSignBytes(epochNum, lch) blsPubkeys, blsSigs := datagen.GenRandomPubkeysAndSigs(n, msg) ckpt, err := ckptkeeper.BuildRawCheckpoint(ctx, epochNum, lch) diff --git a/x/epoching/keeper/apphash_chain_test.go b/x/epoching/keeper/apphash_chain_test.go index 2998b6d97..15cae8998 100644 --- a/x/epoching/keeper/apphash_chain_test.go +++ b/x/epoching/keeper/apphash_chain_test.go @@ -15,7 +15,7 @@ func FuzzAppHashChain(f *testing.F) { datagen.AddRandomSeedsToFuzzer(f, 10) f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) + r := rand.New(rand.NewSource(seed)) helper := testepoching.NewHelper(t) ctx, k := helper.Ctx, helper.EpochingKeeper @@ -25,7 +25,7 @@ func FuzzAppHashChain(f *testing.F) { require.Equal(t, epoch.FirstBlockHeight, uint64(0)) // set a random epoch interval - epochInterval := rand.Uint64()%100 + 2 // the epoch interval should at at least 2 + epochInterval := r.Uint64()%100 + 2 // the epoch interval should at at least 2 params := types.Params{ EpochInterval: epochInterval, @@ -39,7 +39,7 @@ func FuzzAppHashChain(f *testing.F) { expectedHeight := epochInterval expectedAppHashs := [][]byte{} for i := uint64(0); i < expectedHeight; i++ { - ctx = helper.GenAndApplyEmptyBlock() + ctx = helper.GenAndApplyEmptyBlock(r) expectedAppHashs = append(expectedAppHashs, ctx.BlockHeader().AppHash) } // ensure epoch number is 1 @@ -52,7 +52,7 @@ func FuzzAppHashChain(f *testing.F) { require.Equal(t, expectedAppHashs, appHashs) // ensure prover and verifier are correct - randomHeightInEpoch := uint64(rand.Intn(int(expectedHeight)) + 1) + randomHeightInEpoch := uint64(r.Intn(int(expectedHeight)) + 1) randomAppHash, err := k.GetAppHash(ctx, randomHeightInEpoch) require.NoError(t, err) proof, err := k.ProveAppHashInEpoch(ctx, randomHeightInEpoch, epoch.EpochNumber) diff --git a/x/epoching/keeper/epoch_msg_queue_test.go b/x/epoching/keeper/epoch_msg_queue_test.go index bac8bf16d..ae3718dd3 100644 --- a/x/epoching/keeper/epoch_msg_queue_test.go +++ b/x/epoching/keeper/epoch_msg_queue_test.go @@ -1,6 +1,7 @@ package keeper_test import ( + "github.com/babylonchain/babylon/testutil/datagen" "math/rand" "testing" @@ -19,13 +20,9 @@ var ( // FuzzEnqueueMsg tests EnqueueMsg. It enqueues some wrapped msgs, and check if the message queue includes the enqueued msgs or not func FuzzEnqueueMsg(f *testing.F) { - f.Add(int64(11111)) - f.Add(int64(22222)) - f.Add(int64(55555)) - f.Add(int64(12312)) - + datagen.AddRandomSeedsToFuzzer(f, 100) f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) + r := rand.New(rand.NewSource(seed)) helper := testepoching.NewHelper(t) ctx, keeper := helper.Ctx, helper.EpochingKeeper @@ -35,7 +32,7 @@ func FuzzEnqueueMsg(f *testing.F) { // enter the 1st block and thus epoch 1 // Note that the genesis block does not trigger BeginBlock or EndBlock - ctx = helper.GenAndApplyEmptyBlock() + ctx = helper.GenAndApplyEmptyBlock(r) epoch := keeper.GetEpoch(ctx) require.Equal(t, uint64(1), epoch.EpochNumber) // ensure that the epoch msg queue is correct at epoch 1 @@ -43,7 +40,7 @@ func FuzzEnqueueMsg(f *testing.F) { require.Equal(t, uint64(0), keeper.GetCurrentQueueLength(ctx)) // Enqueue a random number of msgs - numQueuedMsgs := rand.Uint64() % 100 + numQueuedMsgs := datagen.RandomInt(r, 100) for i := uint64(0); i < numQueuedMsgs; i++ { msg := types.QueuedMessage{ TxId: sdk.Uint64ToBigEndian(i), @@ -66,13 +63,9 @@ func FuzzEnqueueMsg(f *testing.F) { // FuzzHandleQueuedMsg_MsgWrappedDelegate tests HandleQueueMsg over MsgWrappedDelegate. // It enqueues some MsgWrappedDelegate, enters a new epoch (which triggers HandleQueueMsg), and check if the newly delegated tokens take effect or not func FuzzHandleQueuedMsg_MsgWrappedDelegate(f *testing.F) { - f.Add(int64(11111)) - f.Add(int64(22222)) - f.Add(int64(55555)) - f.Add(int64(12312)) - + datagen.AddRandomSeedsToFuzzer(f, 100) f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) + r := rand.New(rand.NewSource(seed)) helper := testepoching.NewHelperWithValSet(t) ctx, keeper, genAccs := helper.Ctx, helper.EpochingKeeper, helper.GenAccs @@ -84,7 +77,7 @@ func FuzzHandleQueuedMsg_MsgWrappedDelegate(f *testing.F) { genAddr := genAccs[0].GetAddress() // BeginBlock of block 1, and thus entering epoch 1 - ctx = helper.BeginBlock() + ctx = helper.BeginBlock(r) epoch := keeper.GetEpoch(ctx) require.Equal(t, uint64(1), epoch.EpochNumber) @@ -102,7 +95,7 @@ func FuzzHandleQueuedMsg_MsgWrappedDelegate(f *testing.F) { require.Equal(t, uint64(0), lc.ValLife[0].BlockHeight) // delegate a random amount of tokens to the validator - numNewDels := rand.Int63n(1000) + 1 + numNewDels := r.Int63n(1000) + 1 for i := int64(0); i < numNewDels; i++ { helper.WrappedDelegate(genAddr, val, coinWithOnePower.Amount) } @@ -115,7 +108,7 @@ func FuzzHandleQueuedMsg_MsgWrappedDelegate(f *testing.F) { // go to BeginBlock of block 11, and thus entering epoch 2 for i := uint64(0); i < params.EpochInterval; i++ { - ctx = helper.GenAndApplyEmptyBlock() + ctx = helper.GenAndApplyEmptyBlock(r) } epoch = keeper.GetEpoch(ctx) require.Equal(t, uint64(2), epoch.EpochNumber) @@ -134,13 +127,9 @@ func FuzzHandleQueuedMsg_MsgWrappedDelegate(f *testing.F) { // FuzzHandleQueuedMsg_MsgWrappedUndelegate tests HandleQueueMsg over MsgWrappedUndelegate. // It enqueues some MsgWrappedUndelegate, enters a new epoch (which triggers HandleQueueMsg), and check if the tokens become unbonding or not func FuzzHandleQueuedMsg_MsgWrappedUndelegate(f *testing.F) { - f.Add(int64(11111)) - f.Add(int64(22222)) - f.Add(int64(55555)) - f.Add(int64(12312)) - + datagen.AddRandomSeedsToFuzzer(f, 100) f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) + r := rand.New(rand.NewSource(seed)) helper := testepoching.NewHelperWithValSet(t) _, keeper, genAccs := helper.Ctx, helper.EpochingKeeper, helper.GenAccs @@ -151,7 +140,7 @@ func FuzzHandleQueuedMsg_MsgWrappedUndelegate(f *testing.F) { genAddr := genAccs[0].GetAddress() // BeginBlock of block 1, and thus entering epoch 1 - ctx := helper.BeginBlock() + ctx := helper.BeginBlock(r) epoch := keeper.GetEpoch(ctx) require.Equal(t, uint64(1), epoch.EpochNumber) @@ -171,7 +160,7 @@ func FuzzHandleQueuedMsg_MsgWrappedUndelegate(f *testing.F) { // Note that for any pair of delegator and validator, there can be `<=DefaultMaxEntries=7` concurrent undelegations at any time slot // Otherwise, only `DefaultMaxEntries` undelegations will be processed at this height and the rest will be rejected // See https://github.com/cosmos/cosmos-sdk/blob/v0.45.5/x/staking/keeper/delegation.go#L814-L816 - numNewUndels := rand.Int63n(7) + 1 + numNewUndels := r.Int63n(7) + 1 for i := int64(0); i < numNewUndels; i++ { helper.WrappedUndelegate(genAddr, val, coinWithOnePower.Amount) } @@ -184,7 +173,7 @@ func FuzzHandleQueuedMsg_MsgWrappedUndelegate(f *testing.F) { // enter epoch 2 for i := uint64(0); i < keeper.GetParams(ctx).EpochInterval; i++ { - ctx = helper.GenAndApplyEmptyBlock() + ctx = helper.GenAndApplyEmptyBlock(r) } epoch = keeper.GetEpoch(ctx) require.Equal(t, uint64(2), epoch.EpochNumber) @@ -212,13 +201,9 @@ func FuzzHandleQueuedMsg_MsgWrappedUndelegate(f *testing.F) { // FuzzHandleQueuedMsg_MsgWrappedBeginRedelegate tests HandleQueueMsg over MsgWrappedBeginRedelegate. // It enqueues some MsgWrappedBeginRedelegate, enters a new epoch (which triggers HandleQueueMsg), and check if the tokens become unbonding or not func FuzzHandleQueuedMsg_MsgWrappedBeginRedelegate(f *testing.F) { - f.Add(int64(11111)) - f.Add(int64(22222)) - f.Add(int64(55555)) - f.Add(int64(12312)) - + datagen.AddRandomSeedsToFuzzer(f, 100) f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) + r := rand.New(rand.NewSource(seed)) helper := testepoching.NewHelperWithValSet(t) _, keeper, genAccs := helper.Ctx, helper.EpochingKeeper, helper.GenAccs @@ -229,7 +214,7 @@ func FuzzHandleQueuedMsg_MsgWrappedBeginRedelegate(f *testing.F) { genAddr := genAccs[0].GetAddress() // BeginBlock of block 1, and thus entering epoch 1 - ctx := helper.BeginBlock() + ctx := helper.BeginBlock(r) epoch := keeper.GetEpoch(ctx) require.Equal(t, uint64(1), epoch.EpochNumber) @@ -256,7 +241,7 @@ func FuzzHandleQueuedMsg_MsgWrappedBeginRedelegate(f *testing.F) { // redelegate a random amount of tokens from val1 to val2 // same as undelegation, there can be `<=DefaultMaxEntries=7` concurrent redelegation requests for any tuple (delegatorAddr, srcValidatorAddr, dstValidatorAddr) // See https://github.com/cosmos/cosmos-sdk/blob/v0.45.5/x/staking/keeper/delegation.go#L908-L910 - numNewRedels := rand.Int63n(7) + 1 + numNewRedels := r.Int63n(7) + 1 for i := int64(0); i < numNewRedels; i++ { helper.WrappedBeginRedelegate(genAddr, val1, val2, coinWithOnePower.Amount) } @@ -269,7 +254,7 @@ func FuzzHandleQueuedMsg_MsgWrappedBeginRedelegate(f *testing.F) { // enter epoch 2 for i := uint64(0); i < keeper.GetParams(ctx).EpochInterval; i++ { - ctx = helper.GenAndApplyEmptyBlock() + ctx = helper.GenAndApplyEmptyBlock(r) } epoch = keeper.GetEpoch(ctx) require.Equal(t, uint64(2), epoch.EpochNumber) diff --git a/x/epoching/keeper/epoch_slashed_val_set_test.go b/x/epoching/keeper/epoch_slashed_val_set_test.go index d7e8d2d01..45078be72 100644 --- a/x/epoching/keeper/epoch_slashed_val_set_test.go +++ b/x/epoching/keeper/epoch_slashed_val_set_test.go @@ -1,6 +1,7 @@ package keeper_test import ( + "github.com/babylonchain/babylon/testutil/datagen" "math/rand" "sort" "testing" @@ -12,23 +13,19 @@ import ( ) func FuzzSlashedValSet(f *testing.F) { - f.Add(int64(11111)) - f.Add(int64(22222)) - f.Add(int64(55555)) - f.Add(int64(12312)) - + datagen.AddRandomSeedsToFuzzer(f, 100) f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) + r := rand.New(rand.NewSource(seed)) helper := testepoching.NewHelperWithValSet(t) ctx, keeper, stakingKeeper := helper.Ctx, helper.EpochingKeeper, helper.StakingKeeper getValSet := keeper.GetValidatorSet(ctx, 0) // slash a random subset of validators - numSlashed := rand.Intn(len(getValSet)) + numSlashed := r.Intn(len(getValSet)) excpectedSlashedVals := []sdk.ValAddress{} for i := 0; i < numSlashed; i++ { - idx := rand.Intn(len(getValSet)) + idx := r.Intn(len(getValSet)) slashedVal := getValSet[idx] stakingKeeper.Slash(ctx, sdk.ConsAddress(slashedVal.Addr), 0, slashedVal.Power, sdk.OneDec()) // add the slashed validator to the slashed validator set @@ -47,7 +44,7 @@ func FuzzSlashedValSet(f *testing.F) { } // go to the 1st block and thus epoch 1 - ctx = helper.GenAndApplyEmptyBlock() + ctx = helper.GenAndApplyEmptyBlock(r) epochNumber := keeper.GetEpoch(ctx).EpochNumber require.Equal(t, uint64(1), epochNumber) // no validator is slashed in epoch 1 diff --git a/x/epoching/keeper/epoch_val_set_test.go b/x/epoching/keeper/epoch_val_set_test.go index 59bf4b3fe..db2579e5f 100644 --- a/x/epoching/keeper/epoch_val_set_test.go +++ b/x/epoching/keeper/epoch_val_set_test.go @@ -1,6 +1,7 @@ package keeper_test import ( + "github.com/babylonchain/babylon/testutil/datagen" "math/rand" "testing" @@ -10,13 +11,9 @@ import ( ) func FuzzEpochValSet(f *testing.F) { - f.Add(int64(11111)) - f.Add(int64(22222)) - f.Add(int64(55555)) - f.Add(int64(12312)) - + datagen.AddRandomSeedsToFuzzer(f, 100) f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) + r := rand.New(rand.NewSource(seed)) helper := testepoching.NewHelperWithValSet(t) ctx, keeper := helper.Ctx, helper.EpochingKeeper @@ -30,9 +27,9 @@ func FuzzEpochValSet(f *testing.F) { } // generate a random number of new blocks - numIncBlocks := rand.Uint64()%1000 + 1 + numIncBlocks := r.Uint64()%1000 + 1 for i := uint64(0); i < numIncBlocks; i++ { - ctx = helper.GenAndApplyEmptyBlock() + ctx = helper.GenAndApplyEmptyBlock(r) } // check whether the validator set remains the same or not diff --git a/x/epoching/keeper/epochs_test.go b/x/epoching/keeper/epochs_test.go index 78577e7ae..3a864a5ea 100644 --- a/x/epoching/keeper/epochs_test.go +++ b/x/epoching/keeper/epochs_test.go @@ -14,7 +14,7 @@ func FuzzEpochs(f *testing.F) { datagen.AddRandomSeedsToFuzzer(f, 10) f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) + r := rand.New(rand.NewSource(seed)) helper := testepoching.NewHelper(t) ctx, keeper := helper.Ctx, helper.EpochingKeeper @@ -24,7 +24,7 @@ func FuzzEpochs(f *testing.F) { require.Equal(t, epoch.FirstBlockHeight, uint64(0)) // set a random epoch interval - epochInterval := rand.Uint64()%100 + 2 // the epoch interval should at at least 2 + epochInterval := r.Uint64()%100 + 2 // the epoch interval should at at least 2 params := types.Params{ EpochInterval: epochInterval, @@ -35,9 +35,9 @@ func FuzzEpochs(f *testing.F) { } // increment a random number of new blocks - numIncBlocks := rand.Uint64()%1000 + 1 + numIncBlocks := r.Uint64()%1000 + 1 for i := uint64(0); i < numIncBlocks; i++ { - ctx = helper.GenAndApplyEmptyBlock() + ctx = helper.GenAndApplyEmptyBlock(r) } // ensure that the epoch info is still correct diff --git a/x/epoching/keeper/grpc_query_test.go b/x/epoching/keeper/grpc_query_test.go index c4aac2066..6689b04ea 100644 --- a/x/epoching/keeper/grpc_query_test.go +++ b/x/epoching/keeper/grpc_query_test.go @@ -22,11 +22,11 @@ func FuzzParamsQuery(f *testing.F) { datagen.AddRandomSeedsToFuzzer(f, 10) f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) + r := rand.New(rand.NewSource(seed)) // params generated by fuzzer params := types.DefaultParams() - epochInterval := datagen.RandomInt(20) + epochInterval := datagen.RandomInt(r, 20) params.EpochInterval = epochInterval // test the case of EpochInterval < 2 @@ -34,14 +34,14 @@ func FuzzParamsQuery(f *testing.F) { if epochInterval < 2 { // validation should not pass with EpochInterval < 2 require.Error(t, params.Validate()) - params.EpochInterval = uint64(rand.Int()) + params.EpochInterval = uint64(r.Int()) } helper := testepoching.NewHelper(t) ctx, keeper, queryClient := helper.Ctx, helper.EpochingKeeper, helper.QueryClient wctx := sdk.WrapSDKContext(ctx) // if setParamsFlag == 0, set params - setParamsFlag := rand.Intn(2) + setParamsFlag := r.Intn(2) if setParamsFlag == 0 { if err := keeper.SetParams(ctx, params); err != nil { panic(err) @@ -67,9 +67,9 @@ func FuzzCurrentEpoch(f *testing.F) { datagen.AddRandomSeedsToFuzzer(f, 10) f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) + r := rand.New(rand.NewSource(seed)) - increment := datagen.RandomInt(100) + increment := datagen.RandomInt(r, 100) helper := testepoching.NewHelper(t) ctx, keeper, queryClient := helper.Ctx, helper.EpochingKeeper, helper.QueryClient @@ -78,7 +78,7 @@ func FuzzCurrentEpoch(f *testing.F) { epochInterval := keeper.GetParams(ctx).EpochInterval for i := uint64(0); i < increment; i++ { // this ensures that IncEpoch is invoked only at the first header of each epoch - ctx = ctx.WithBlockHeader(*datagen.GenRandomTMHeader("chain-test", i*epochInterval+1)) + ctx = ctx.WithBlockHeader(*datagen.GenRandomTMHeader(r, "chain-test", i*epochInterval+1)) wctx = sdk.WrapSDKContext(ctx) keeper.IncEpoch(ctx) } @@ -94,9 +94,9 @@ func FuzzEpochsInfo(f *testing.F) { datagen.AddRandomSeedsToFuzzer(f, 10) f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) - numEpochs := datagen.RandomInt(10) + 1 - limit := datagen.RandomInt(10) + 1 + r := rand.New(rand.NewSource(seed)) + numEpochs := datagen.RandomInt(r, 10) + 1 + limit := datagen.RandomInt(r, 10) + 1 helper := testepoching.NewHelper(t) ctx, keeper, queryClient := helper.Ctx, helper.EpochingKeeper, helper.QueryClient @@ -106,7 +106,7 @@ func FuzzEpochsInfo(f *testing.F) { epochInterval := keeper.GetParams(ctx).EpochInterval for i := uint64(0); i < numEpochs-1; i++ { for j := uint64(0); j < epochInterval; j++ { - helper.GenAndApplyEmptyBlock() + helper.GenAndApplyEmptyBlock(r) } } @@ -134,9 +134,9 @@ func FuzzEpochMsgsQuery(f *testing.F) { datagen.AddRandomSeedsToFuzzer(f, 10) f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) - numMsgs := uint64(rand.Int() % 100) - limit := uint64(rand.Int()%100) + 1 + r := rand.New(rand.NewSource(seed)) + numMsgs := uint64(r.Int() % 100) + limit := uint64(r.Int()%100) + 1 txidsMap := map[string]bool{} helper := testepoching.NewHelper(t) @@ -144,7 +144,7 @@ func FuzzEpochMsgsQuery(f *testing.F) { wctx := sdk.WrapSDKContext(ctx) // enque a random number of msgs with random txids for i := uint64(0); i < numMsgs; i++ { - txid := datagen.GenRandomByteArray(32) + txid := datagen.GenRandomByteArray(r, 32) txidsMap[string(txid)] = true queuedMsg := types.QueuedMessage{ TxId: txid, @@ -186,12 +186,12 @@ func FuzzEpochValSetQuery(f *testing.F) { datagen.AddRandomSeedsToFuzzer(f, 10) f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) + r := rand.New(rand.NewSource(seed)) helper := testepoching.NewHelperWithValSet(t) ctx, queryClient := helper.Ctx, helper.QueryClient - limit := uint64(rand.Int() % 100) + limit := uint64(r.Int() % 100) req := &types.QueryEpochValSetRequest{ EpochNum: 0, Pagination: &query.PageRequest{ @@ -203,9 +203,9 @@ func FuzzEpochValSetQuery(f *testing.F) { require.NoError(t, err) // generate a random number of new blocks - numIncBlocks := rand.Uint64()%1000 + 1 + numIncBlocks := r.Uint64()%1000 + 1 for i := uint64(0); i < numIncBlocks; i++ { - ctx = helper.GenAndApplyEmptyBlock() + ctx = helper.GenAndApplyEmptyBlock(r) } // check whether the validator set remains the same or not diff --git a/x/epoching/keeper/msg_server_test.go b/x/epoching/keeper/msg_server_test.go index cf77d4c8d..46057efe5 100644 --- a/x/epoching/keeper/msg_server_test.go +++ b/x/epoching/keeper/msg_server_test.go @@ -1,7 +1,9 @@ package keeper_test import ( + "math/rand" "testing" + "time" "github.com/babylonchain/babylon/x/epoching/testepoching" "github.com/babylonchain/babylon/x/epoching/types" @@ -12,10 +14,11 @@ import ( // TODO (fuzz tests): replace the following tests with fuzz ones func TestMsgWrappedDelegate(t *testing.T) { + r := rand.New(rand.NewSource(time.Now().Unix())) helper := testepoching.NewHelper(t) msgSrvr := helper.MsgSrvr // enter 1st epoch, in which BBN starts handling validator-related msgs - ctx := helper.GenAndApplyEmptyBlock() + ctx := helper.GenAndApplyEmptyBlock(r) wctx := sdk.WrapSDKContext(ctx) testCases := []struct { @@ -41,10 +44,11 @@ func TestMsgWrappedDelegate(t *testing.T) { } func TestMsgWrappedUndelegate(t *testing.T) { + r := rand.New(rand.NewSource(time.Now().Unix())) helper := testepoching.NewHelper(t) msgSrvr := helper.MsgSrvr // enter 1st epoch, in which BBN starts handling validator-related msgs - ctx := helper.GenAndApplyEmptyBlock() + ctx := helper.GenAndApplyEmptyBlock(r) wctx := sdk.WrapSDKContext(ctx) testCases := []struct { @@ -70,10 +74,11 @@ func TestMsgWrappedUndelegate(t *testing.T) { } func TestMsgWrappedBeginRedelegate(t *testing.T) { + r := rand.New(rand.NewSource(time.Now().Unix())) helper := testepoching.NewHelper(t) msgSrvr := helper.MsgSrvr // enter 1st epoch, in which BBN starts handling validator-related msgs - ctx := helper.GenAndApplyEmptyBlock() + ctx := helper.GenAndApplyEmptyBlock(r) wctx := sdk.WrapSDKContext(ctx) testCases := []struct { diff --git a/x/epoching/testepoching/helper.go b/x/epoching/testepoching/helper.go index 104db01bf..44ac8672f 100644 --- a/x/epoching/testepoching/helper.go +++ b/x/epoching/testepoching/helper.go @@ -1,6 +1,7 @@ package testepoching import ( + "math/rand" "testing" "github.com/babylonchain/babylon/crypto/bls12381" @@ -127,7 +128,7 @@ func NewHelperWithValSet(t *testing.T) *Helper { } // GenAndApplyEmptyBlock generates a new empty block and appends it to the current blockchain -func (h *Helper) GenAndApplyEmptyBlock() sdk.Context { +func (h *Helper) GenAndApplyEmptyBlock(r *rand.Rand) sdk.Context { newHeight := h.App.LastBlockHeight() + 1 valSet := h.StakingKeeper.GetLastValidators(h.Ctx) valhash := CalculateValHash(valSet) @@ -135,8 +136,8 @@ func (h *Helper) GenAndApplyEmptyBlock() sdk.Context { Height: newHeight, ValidatorsHash: valhash, NextValidatorsHash: valhash, - AppHash: datagen.GenRandomByteArray(32), - LastCommitHash: datagen.GenRandomLastCommitHash(), + AppHash: datagen.GenRandomByteArray(r, 32), + LastCommitHash: datagen.GenRandomLastCommitHash(r), } h.App.BeginBlock(abci.RequestBeginBlock{Header: newHeader}) @@ -147,13 +148,13 @@ func (h *Helper) GenAndApplyEmptyBlock() sdk.Context { return h.Ctx } -func (h *Helper) BeginBlock() sdk.Context { +func (h *Helper) BeginBlock(r *rand.Rand) sdk.Context { newHeight := h.App.LastBlockHeight() + 1 valSet := h.StakingKeeper.GetLastValidators(h.Ctx) valhash := CalculateValHash(valSet) newHeader := tmproto.Header{ Height: newHeight, - AppHash: datagen.GenRandomByteArray(32), + AppHash: datagen.GenRandomByteArray(r, 32), ValidatorsHash: valhash, NextValidatorsHash: valhash, } diff --git a/x/epoching/types/epoching_test.go b/x/epoching/types/epoching_test.go index 8d663a188..e28b98e48 100644 --- a/x/epoching/types/epoching_test.go +++ b/x/epoching/types/epoching_test.go @@ -1,6 +1,7 @@ package types_test import ( + "github.com/babylonchain/babylon/testutil/datagen" "math/rand" "testing" @@ -9,24 +10,14 @@ import ( ) func FuzzEpoch(f *testing.F) { - f.Add(int64(11111)) - f.Add(int64(22222)) - f.Add(int64(55555)) - + datagen.AddRandomSeedsToFuzzer(f, 100) f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) + r := rand.New(rand.NewSource(seed)) // generate a random epoch - epochNumber := rand.Uint64() + 1 - curEpochInterval := rand.Uint64()%100 + 2 - firstBlockHeight := rand.Uint64() + 1 - - // genesis block case with some probability - genesisFlag := rand.Uint64()%100 < 10 - if genesisFlag { - epochNumber = 0 - firstBlockHeight = 0 - } + epochNumber := uint64(r.Int63()) + 1 + curEpochInterval := r.Uint64()%100 + 2 + firstBlockHeight := r.Uint64() + 1 e := types.Epoch{ EpochNumber: epochNumber, @@ -34,14 +25,9 @@ func FuzzEpoch(f *testing.F) { FirstBlockHeight: firstBlockHeight, } - if genesisFlag { - require.Equal(t, uint64(0), e.GetLastBlockHeight()) - require.Equal(t, uint64(0), e.GetSecondBlockHeight()) - } else { - lastBlockHeight := firstBlockHeight + curEpochInterval - 1 - require.Equal(t, lastBlockHeight, e.GetLastBlockHeight()) - secondBlockheight := firstBlockHeight + 1 - require.Equal(t, secondBlockheight, e.GetSecondBlockHeight()) - } + lastBlockHeight := firstBlockHeight + curEpochInterval - 1 + require.Equal(t, lastBlockHeight, e.GetLastBlockHeight()) + secondBlockheight := firstBlockHeight + 1 + require.Equal(t, secondBlockheight, e.GetSecondBlockHeight()) }) } diff --git a/x/monitor/keeper/grpc_query_test.go b/x/monitor/keeper/grpc_query_test.go index 0fbd71500..c4775ddf7 100644 --- a/x/monitor/keeper/grpc_query_test.go +++ b/x/monitor/keeper/grpc_query_test.go @@ -20,7 +20,7 @@ import ( func FuzzQueryEndedEpochBtcHeight(f *testing.F) { datagen.AddRandomSeedsToFuzzer(f, 10) f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) + r := rand.New(rand.NewSource(seed)) // a genesis validator is generated for setup helper := testepoching.NewHelper(t) lck := helper.App.BTCLightClientKeeper @@ -31,7 +31,7 @@ func FuzzQueryEndedEpochBtcHeight(f *testing.F) { queryClient := types.NewQueryClient(queryHelper) // BeginBlock of block 1, and thus entering epoch 1 - ctx := helper.BeginBlock() + ctx := helper.BeginBlock(r) epoch := ek.GetEpoch(ctx) require.Equal(t, uint64(1), epoch.EpochNumber) @@ -39,7 +39,7 @@ func FuzzQueryEndedEpochBtcHeight(f *testing.F) { tree := datagen.NewBTCHeaderTree() root := lck.GetBaseBTCHeader(ctx) tree.Add(root, nil) - tree.GenRandomBTCHeaderTree(1, 10, root, func(header *btclightclienttypes.BTCHeaderInfo) bool { + tree.GenRandomBTCHeaderTree(r, 1, 10, root, func(header *btclightclienttypes.BTCHeaderInfo) bool { err := lck.InsertHeader(ctx, header.Header) require.NoError(t, err) return true @@ -50,7 +50,7 @@ func FuzzQueryEndedEpochBtcHeight(f *testing.F) { // go to BeginBlock of block 11, and thus entering epoch 2 for i := uint64(0); i < ek.GetParams(ctx).EpochInterval; i++ { - ctx = helper.GenAndApplyEmptyBlock() + ctx = helper.GenAndApplyEmptyBlock(r) } epoch = ek.GetEpoch(ctx) require.Equal(t, uint64(2), epoch.EpochNumber) @@ -76,7 +76,7 @@ func FuzzQueryEndedEpochBtcHeight(f *testing.F) { func FuzzQueryReportedCheckpointBtcHeight(f *testing.F) { datagen.AddRandomSeedsToFuzzer(f, 10) f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) + r := rand.New(rand.NewSource(seed)) // a genesis validator is generated for setup helper := testepoching.NewHelper(t) ctl := gomock.NewController(t) @@ -92,7 +92,7 @@ func FuzzQueryReportedCheckpointBtcHeight(f *testing.F) { queryClient := types.NewQueryClient(queryHelper) // BeginBlock of block 1, and thus entering epoch 1 - ctx := helper.BeginBlock() + ctx := helper.BeginBlock(r) epoch := ek.GetEpoch(ctx) require.Equal(t, uint64(1), epoch.EpochNumber) @@ -100,14 +100,14 @@ func FuzzQueryReportedCheckpointBtcHeight(f *testing.F) { tree := datagen.NewBTCHeaderTree() root := lck.GetBaseBTCHeader(ctx) tree.Add(root, nil) - tree.GenRandomBTCHeaderTree(1, 10, root, func(header *btclightclienttypes.BTCHeaderInfo) bool { + tree.GenRandomBTCHeaderTree(r, 1, 10, root, func(header *btclightclienttypes.BTCHeaderInfo) bool { err := lck.InsertHeader(ctx, header.Header) require.NoError(t, err) return true }) // Add checkpoint - valBlsSet, privKeys := datagen.GenerateValidatorSetWithBLSPrivKeys(int(datagen.RandomIntOtherThan(0, 10))) + valBlsSet, privKeys := datagen.GenerateValidatorSetWithBLSPrivKeys(int(datagen.RandomIntOtherThan(r, 0, 10))) valSet := make([]types2.Validator, len(valBlsSet.ValSet)) for i, val := range valBlsSet.ValSet { valSet[i] = types2.Validator{ @@ -117,7 +117,7 @@ func FuzzQueryReportedCheckpointBtcHeight(f *testing.F) { err := ck.CreateRegistration(ctx, val.BlsPubKey, []byte(val.ValidatorAddress)) require.NoError(t, err) } - mockCkptWithMeta := &ckpttypes.RawCheckpointWithMeta{Ckpt: datagen.GenerateLegitimateRawCheckpoint(privKeys)} + mockCkptWithMeta := &ckpttypes.RawCheckpointWithMeta{Ckpt: datagen.GenerateLegitimateRawCheckpoint(r, privKeys)} mockEk.EXPECT().GetValidatorSet(gomock.Any(), gomock.Eq(mockCkptWithMeta.Ckpt.EpochNum)).Return(valSet).AnyTimes() // make sure voting power is always sufficient mockEk.EXPECT().GetTotalVotingPower(gomock.Any(), gomock.Eq(mockCkptWithMeta.Ckpt.EpochNum)).Return(int64(0)).AnyTimes() @@ -132,7 +132,7 @@ func FuzzQueryReportedCheckpointBtcHeight(f *testing.F) { Epoch: mockCkptWithMeta.Ckpt.EpochNum, LastCommitHash: *mockCkptWithMeta.Ckpt.LastCommitHash, BitMap: mockCkptWithMeta.Ckpt.Bitmap, - SubmitterAddress: datagen.GenRandomByteArray(btctxformatter.AddressLength), + SubmitterAddress: datagen.GenRandomByteArray(r, btctxformatter.AddressLength), BlsSig: *mockCkptWithMeta.Ckpt.BlsMultiSig, } err = ck.VerifyCheckpoint(ctx, btcCkpt) @@ -148,7 +148,7 @@ func FuzzQueryReportedCheckpointBtcHeight(f *testing.F) { // query not reported checkpoint BTC light client height, should expect an ErrCheckpointNotReported req = types.QueryReportedCheckpointBtcHeightRequest{ - CkptHash: datagen.GenRandomHexStr(32), + CkptHash: datagen.GenRandomHexStr(r, 32), } _, err = queryClient.ReportedCheckpointBtcHeight(ctx, &req) require.ErrorIs(t, err, types.ErrCheckpointNotReported) diff --git a/x/zoneconcierge/keeper/canonical_chain_indexer_test.go b/x/zoneconcierge/keeper/canonical_chain_indexer_test.go index 4248fb530..365854120 100644 --- a/x/zoneconcierge/keeper/canonical_chain_indexer_test.go +++ b/x/zoneconcierge/keeper/canonical_chain_indexer_test.go @@ -12,7 +12,7 @@ func FuzzCanonicalChainIndexer(f *testing.F) { datagen.AddRandomSeedsToFuzzer(f, 10) f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) + r := rand.New(rand.NewSource(seed)) _, babylonChain, czChain, babylonApp := SetupTest(t) zcKeeper := babylonApp.ZoneConciergeKeeper @@ -21,8 +21,8 @@ func FuzzCanonicalChainIndexer(f *testing.F) { hooks := zcKeeper.Hooks() // simulate a random number of blocks - numHeaders := datagen.RandomInt(100) + 1 - headers := SimulateHeadersViaHook(ctx, hooks, czChain.ChainID, 0, numHeaders) + numHeaders := datagen.RandomInt(r, 100) + 1 + headers := SimulateHeadersViaHook(ctx, r, hooks, czChain.ChainID, 0, numHeaders) // check if the canonical chain index is correct or not for i := uint64(0); i < numHeaders; i++ { @@ -48,7 +48,7 @@ func FuzzFindClosestHeader(f *testing.F) { datagen.AddRandomSeedsToFuzzer(f, 10) f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) + r := rand.New(rand.NewSource(seed)) _, babylonChain, czChain, babylonApp := SetupTest(t) zcKeeper := babylonApp.ZoneConciergeKeeper @@ -61,22 +61,22 @@ func FuzzFindClosestHeader(f *testing.F) { require.Error(t, err) // simulate a random number of blocks - numHeaders := datagen.RandomInt(100) + 1 - headers := SimulateHeadersViaHook(ctx, hooks, czChain.ChainID, 0, numHeaders) + numHeaders := datagen.RandomInt(r, 100) + 1 + headers := SimulateHeadersViaHook(ctx, r, hooks, czChain.ChainID, 0, numHeaders) header, err := zcKeeper.FindClosestHeader(ctx, czChain.ChainID, numHeaders) require.NoError(t, err) require.Equal(t, headers[len(headers)-1].Header.LastCommitHash, header.Hash) // skip a non-zero number of headers in between, in order to create a gap of non-timestamped headers - gap := datagen.RandomInt(10) + 1 + gap := datagen.RandomInt(r, 10) + 1 // simulate a random number of blocks // where the new batch of headers has a gap with the previous batch - SimulateHeadersViaHook(ctx, hooks, czChain.ChainID, numHeaders+gap+1, numHeaders) + SimulateHeadersViaHook(ctx, r, hooks, czChain.ChainID, numHeaders+gap+1, numHeaders) // get a random height that is in this gap - randomHeightInGap := datagen.RandomInt(int(gap+1)) + numHeaders + randomHeightInGap := datagen.RandomInt(r, int(gap+1)) + numHeaders // find the closest header with the given randomHeightInGap header, err = zcKeeper.FindClosestHeader(ctx, czChain.ChainID, randomHeightInGap) require.NoError(t, err) diff --git a/x/zoneconcierge/keeper/epoch_chain_info_indexer_test.go b/x/zoneconcierge/keeper/epoch_chain_info_indexer_test.go index 7dcdd3465..db7f71cfe 100644 --- a/x/zoneconcierge/keeper/epoch_chain_info_indexer_test.go +++ b/x/zoneconcierge/keeper/epoch_chain_info_indexer_test.go @@ -13,7 +13,7 @@ func FuzzEpochChainInfoIndexer(f *testing.F) { datagen.AddRandomSeedsToFuzzer(f, 10) f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) + r := rand.New(rand.NewSource(seed)) _, babylonChain, czChain, babylonApp := SetupTest(t) zcKeeper := babylonApp.ZoneConciergeKeeper @@ -23,15 +23,15 @@ func FuzzEpochChainInfoIndexer(f *testing.F) { hooks := zcKeeper.Hooks() // enter a random epoch - epochNum := datagen.RandomInt(10) + epochNum := datagen.RandomInt(r, 10) for j := uint64(0); j < epochNum; j++ { epochingKeeper.IncEpoch(ctx) } // invoke the hook a random number of times to simulate a random number of blocks - numHeaders := datagen.RandomInt(100) + 1 - numForkHeaders := datagen.RandomInt(10) + 1 - SimulateHeadersAndForksViaHook(ctx, hooks, czChain.ChainID, 0, numHeaders, numForkHeaders) + numHeaders := datagen.RandomInt(r, 100) + 1 + numForkHeaders := datagen.RandomInt(r, 10) + 1 + SimulateHeadersAndForksViaHook(ctx, r, hooks, czChain.ChainID, 0, numHeaders, numForkHeaders) // end this epoch hooks.AfterEpochEnds(ctx, epochNum) @@ -49,7 +49,7 @@ func FuzzGetEpochHeaders(f *testing.F) { datagen.AddRandomSeedsToFuzzer(f, 10) f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) + r := rand.New(rand.NewSource(seed)) _, babylonChain, czChain, babylonApp := SetupTest(t) zcKeeper := babylonApp.ZoneConciergeKeeper @@ -58,9 +58,9 @@ func FuzzGetEpochHeaders(f *testing.F) { ctx := babylonChain.GetContext() hooks := zcKeeper.Hooks() - numReqs := datagen.RandomInt(5) + 1 + numReqs := datagen.RandomInt(r, 5) + 1 - epochNumList := []uint64{datagen.RandomInt(10) + 1} + epochNumList := []uint64{datagen.RandomInt(r, 10) + 1} nextHeightList := []uint64{0} numHeadersList := []uint64{} expectedHeadersMap := map[uint64][]*ibctmtypes.Header{} @@ -82,10 +82,10 @@ func FuzzGetEpochHeaders(f *testing.F) { } // generate a random number of headers and fork headers - numHeadersList = append(numHeadersList, datagen.RandomInt(100)+1) - numForkHeadersList = append(numForkHeadersList, datagen.RandomInt(10)+1) + numHeadersList = append(numHeadersList, datagen.RandomInt(r, 100)+1) + numForkHeadersList = append(numForkHeadersList, datagen.RandomInt(r, 10)+1) // trigger hooks to append these headers and fork headers - expectedHeaders, _ := SimulateHeadersAndForksViaHook(ctx, hooks, czChain.ChainID, nextHeightList[i], numHeadersList[i], numForkHeadersList[i]) + expectedHeaders, _ := SimulateHeadersAndForksViaHook(ctx, r, hooks, czChain.ChainID, nextHeightList[i], numHeadersList[i], numForkHeadersList[i]) expectedHeadersMap[epochNum] = expectedHeaders // prepare nextHeight for the next request nextHeightList = append(nextHeightList, nextHeightList[i]+numHeadersList[i]) @@ -93,7 +93,7 @@ func FuzzGetEpochHeaders(f *testing.F) { // simulate the scenario that a random epoch has ended hooks.AfterEpochEnds(ctx, epochNum) // prepare epochNum for the next request - epochNumList = append(epochNumList, epochNum+datagen.RandomInt(10)+1) + epochNumList = append(epochNumList, epochNum+datagen.RandomInt(r, 10)+1) } // attest the correctness of epoch info for each tested epoch diff --git a/x/zoneconcierge/keeper/fork_indexer_test.go b/x/zoneconcierge/keeper/fork_indexer_test.go index b6a8a28f4..769df4db5 100644 --- a/x/zoneconcierge/keeper/fork_indexer_test.go +++ b/x/zoneconcierge/keeper/fork_indexer_test.go @@ -12,7 +12,7 @@ func FuzzForkIndexer(f *testing.F) { datagen.AddRandomSeedsToFuzzer(f, 10) f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) + r := rand.New(rand.NewSource(seed)) _, babylonChain, czChain, babylonApp := SetupTest(t) zcKeeper := babylonApp.ZoneConciergeKeeper @@ -21,9 +21,9 @@ func FuzzForkIndexer(f *testing.F) { hooks := zcKeeper.Hooks() // invoke the hook a random number of times to simulate a random number of blocks - numHeaders := datagen.RandomInt(100) + 1 - numForkHeaders := datagen.RandomInt(10) + 1 - _, forkHeaders := SimulateHeadersAndForksViaHook(ctx, hooks, czChain.ChainID, 0, numHeaders, numForkHeaders) + numHeaders := datagen.RandomInt(r, 100) + 1 + numForkHeaders := datagen.RandomInt(r, 10) + 1 + _, forkHeaders := SimulateHeadersAndForksViaHook(ctx, r, hooks, czChain.ChainID, 0, numHeaders, numForkHeaders) // check if the fork is updated or not forks := zcKeeper.GetForks(ctx, czChain.ChainID, numHeaders-1) diff --git a/x/zoneconcierge/keeper/grpc_query_test.go b/x/zoneconcierge/keeper/grpc_query_test.go index e07de8a64..5903cdfb3 100644 --- a/x/zoneconcierge/keeper/grpc_query_test.go +++ b/x/zoneconcierge/keeper/grpc_query_test.go @@ -22,7 +22,7 @@ func FuzzChainList(f *testing.F) { datagen.AddRandomSeedsToFuzzer(f, 10) f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) + r := rand.New(rand.NewSource(seed)) _, babylonChain, _, babylonApp := SetupTest(t) zcKeeper := babylonApp.ZoneConciergeKeeper @@ -31,22 +31,22 @@ func FuzzChainList(f *testing.F) { hooks := zcKeeper.Hooks() // invoke the hook a random number of times with random chain IDs - numHeaders := datagen.RandomInt(100) + 1 + numHeaders := datagen.RandomInt(r, 100) + 1 allChainIDs := []string{} for i := uint64(0); i < numHeaders; i++ { var chainID string // simulate the scenario that some headers belong to the same chain - if i > 0 && datagen.OneInN(2) { - chainID = allChainIDs[rand.Intn(len(allChainIDs))] + if i > 0 && datagen.OneInN(r, 2) { + chainID = allChainIDs[r.Intn(len(allChainIDs))] } else { - chainID = datagen.GenRandomHexStr(30) + chainID = datagen.GenRandomHexStr(r, 30) allChainIDs = append(allChainIDs, chainID) } - header := datagen.GenRandomIBCTMHeader(chainID, 0) - hooks.AfterHeaderWithValidCommit(ctx, datagen.GenRandomByteArray(32), datagen.HeaderToHeaderInfo(header), false) + header := datagen.GenRandomIBCTMHeader(r, chainID, 0) + hooks.AfterHeaderWithValidCommit(ctx, datagen.GenRandomByteArray(r, 32), datagen.HeaderToHeaderInfo(header), false) } - limit := datagen.RandomInt(len(allChainIDs)) + 1 + limit := datagen.RandomInt(r, len(allChainIDs)) + 1 // make query to get actual chain IDs resp, err := zcKeeper.ChainList(ctx, &zctypes.QueryChainListRequest{ @@ -69,7 +69,7 @@ func FuzzChainInfo(f *testing.F) { datagen.AddRandomSeedsToFuzzer(f, 10) f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) + r := rand.New(rand.NewSource(seed)) _, babylonChain, czChain, babylonApp := SetupTest(t) zcKeeper := babylonApp.ZoneConciergeKeeper @@ -78,9 +78,9 @@ func FuzzChainInfo(f *testing.F) { hooks := zcKeeper.Hooks() // invoke the hook a random number of times to simulate a random number of blocks - numHeaders := datagen.RandomInt(100) + 1 - numForkHeaders := datagen.RandomInt(10) + 1 - SimulateHeadersAndForksViaHook(ctx, hooks, czChain.ChainID, 0, numHeaders, numForkHeaders) + numHeaders := datagen.RandomInt(r, 100) + 1 + numForkHeaders := datagen.RandomInt(r, 10) + 1 + SimulateHeadersAndForksViaHook(ctx, r, hooks, czChain.ChainID, 0, numHeaders, numForkHeaders) // check if the chain info of is recorded or not resp, err := zcKeeper.ChainInfo(ctx, &zctypes.QueryChainInfoRequest{ChainId: czChain.ChainID}) @@ -95,7 +95,7 @@ func FuzzHeader(f *testing.F) { datagen.AddRandomSeedsToFuzzer(f, 10) f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) + r := rand.New(rand.NewSource(seed)) _, babylonChain, czChain, babylonApp := SetupTest(t) zcKeeper := babylonApp.ZoneConciergeKeeper @@ -104,12 +104,12 @@ func FuzzHeader(f *testing.F) { hooks := zcKeeper.Hooks() // invoke the hook a random number of times to simulate a random number of blocks - numHeaders := datagen.RandomInt(100) + 2 - numForkHeaders := datagen.RandomInt(10) + 1 - headers, forkHeaders := SimulateHeadersAndForksViaHook(ctx, hooks, czChain.ChainID, 0, numHeaders, numForkHeaders) + numHeaders := datagen.RandomInt(r, 100) + 2 + numForkHeaders := datagen.RandomInt(r, 10) + 1 + headers, forkHeaders := SimulateHeadersAndForksViaHook(ctx, r, hooks, czChain.ChainID, 0, numHeaders, numForkHeaders) // find header at a random height and assert correctness against the expected header - randomHeight := datagen.RandomInt(int(numHeaders - 1)) + randomHeight := datagen.RandomInt(r, int(numHeaders-1)) resp, err := zcKeeper.Header(ctx, &zctypes.QueryHeaderRequest{ChainId: czChain.ChainID, Height: randomHeight}) require.NoError(t, err) require.Equal(t, headers[randomHeight].Header.LastCommitHash, resp.Header.Hash) @@ -130,7 +130,7 @@ func FuzzEpochChainInfo(f *testing.F) { datagen.AddRandomSeedsToFuzzer(f, 10) f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) + r := rand.New(rand.NewSource(seed)) _, babylonChain, czChain, babylonApp := SetupTest(t) zcKeeper := babylonApp.ZoneConciergeKeeper @@ -138,9 +138,9 @@ func FuzzEpochChainInfo(f *testing.F) { ctx := babylonChain.GetContext() hooks := zcKeeper.Hooks() - numReqs := datagen.RandomInt(5) + 1 + numReqs := datagen.RandomInt(r, 5) + 1 - epochNumList := []uint64{datagen.RandomInt(10) + 1} + epochNumList := []uint64{datagen.RandomInt(r, 10) + 1} nextHeightList := []uint64{0} numHeadersList := []uint64{} numForkHeadersList := []uint64{} @@ -149,17 +149,17 @@ func FuzzEpochChainInfo(f *testing.F) { // consecutive epoch infos do not affect each other. for i := uint64(0); i < numReqs; i++ { // generate a random number of headers and fork headers - numHeadersList = append(numHeadersList, datagen.RandomInt(100)+1) - numForkHeadersList = append(numForkHeadersList, datagen.RandomInt(10)+1) + numHeadersList = append(numHeadersList, datagen.RandomInt(r, 100)+1) + numForkHeadersList = append(numForkHeadersList, datagen.RandomInt(r, 10)+1) // trigger hooks to append these headers and fork headers - SimulateHeadersAndForksViaHook(ctx, hooks, czChain.ChainID, nextHeightList[i], numHeadersList[i], numForkHeadersList[i]) + SimulateHeadersAndForksViaHook(ctx, r, hooks, czChain.ChainID, nextHeightList[i], numHeadersList[i], numForkHeadersList[i]) // prepare nextHeight for the next request nextHeightList = append(nextHeightList, nextHeightList[i]+numHeadersList[i]) // simulate the scenario that a random epoch has ended hooks.AfterEpochEnds(ctx, epochNumList[i]) // prepare epochNum for the next request - epochNumList = append(epochNumList, epochNumList[i]+datagen.RandomInt(10)+1) + epochNumList = append(epochNumList, epochNumList[i]+datagen.RandomInt(r, 10)+1) } // attest the correctness of epoch info for each tested epoch @@ -177,7 +177,7 @@ func FuzzListHeaders(f *testing.F) { datagen.AddRandomSeedsToFuzzer(f, 10) f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) + r := rand.New(rand.NewSource(seed)) _, babylonChain, czChain, babylonApp := SetupTest(t) zcKeeper := babylonApp.ZoneConciergeKeeper @@ -186,12 +186,12 @@ func FuzzListHeaders(f *testing.F) { hooks := zcKeeper.Hooks() // invoke the hook a random number of times to simulate a random number of blocks - numHeaders := datagen.RandomInt(100) + 1 - numForkHeaders := datagen.RandomInt(10) + 1 - headers, _ := SimulateHeadersAndForksViaHook(ctx, hooks, czChain.ChainID, 0, numHeaders, numForkHeaders) + numHeaders := datagen.RandomInt(r, 100) + 1 + numForkHeaders := datagen.RandomInt(r, 10) + 1 + headers, _ := SimulateHeadersAndForksViaHook(ctx, r, hooks, czChain.ChainID, 0, numHeaders, numForkHeaders) // a request with randomised pagination - limit := datagen.RandomInt(int(numHeaders)) + 1 + limit := datagen.RandomInt(r, int(numHeaders)) + 1 req := &zctypes.QueryListHeadersRequest{ ChainId: czChain.ChainID, Pagination: &query.PageRequest{ @@ -211,7 +211,7 @@ func FuzzListEpochHeaders(f *testing.F) { datagen.AddRandomSeedsToFuzzer(f, 10) f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) + r := rand.New(rand.NewSource(seed)) _, babylonChain, czChain, babylonApp := SetupTest(t) zcKeeper := babylonApp.ZoneConciergeKeeper @@ -220,9 +220,9 @@ func FuzzListEpochHeaders(f *testing.F) { ctx := babylonChain.GetContext() hooks := zcKeeper.Hooks() - numReqs := datagen.RandomInt(5) + 1 + numReqs := datagen.RandomInt(r, 5) + 1 - epochNumList := []uint64{datagen.RandomInt(10) + 1} + epochNumList := []uint64{datagen.RandomInt(r, 10) + 1} nextHeightList := []uint64{0} numHeadersList := []uint64{} expectedHeadersMap := map[uint64][]*ibctmtypes.Header{} @@ -244,10 +244,10 @@ func FuzzListEpochHeaders(f *testing.F) { } // generate a random number of headers and fork headers - numHeadersList = append(numHeadersList, datagen.RandomInt(100)+1) - numForkHeadersList = append(numForkHeadersList, datagen.RandomInt(10)+1) + numHeadersList = append(numHeadersList, datagen.RandomInt(r, 100)+1) + numForkHeadersList = append(numForkHeadersList, datagen.RandomInt(r, 10)+1) // trigger hooks to append these headers and fork headers - expectedHeaders, _ := SimulateHeadersAndForksViaHook(ctx, hooks, czChain.ChainID, nextHeightList[i], numHeadersList[i], numForkHeadersList[i]) + expectedHeaders, _ := SimulateHeadersAndForksViaHook(ctx, r, hooks, czChain.ChainID, nextHeightList[i], numHeadersList[i], numForkHeadersList[i]) expectedHeadersMap[epochNum] = expectedHeaders // prepare nextHeight for the next request nextHeightList = append(nextHeightList, nextHeightList[i]+numHeadersList[i]) @@ -255,7 +255,7 @@ func FuzzListEpochHeaders(f *testing.F) { // simulate the scenario that a random epoch has ended hooks.AfterEpochEnds(ctx, epochNum) // prepare epochNum for the next request - epochNumList = append(epochNumList, epochNum+datagen.RandomInt(10)+1) + epochNumList = append(epochNumList, epochNum+datagen.RandomInt(r, 10)+1) } // attest the correctness of epoch info for each tested epoch @@ -283,16 +283,16 @@ func FuzzFinalizedChainInfo(f *testing.F) { datagen.AddRandomSeedsToFuzzer(f, 10) f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) + r := rand.New(rand.NewSource(seed)) ctrl := gomock.NewController(t) defer ctrl.Finish() - czChainIDLen := datagen.RandomInt(50) + 1 - czChainID := string(datagen.GenRandomByteArray(czChainIDLen)) + czChainIDLen := datagen.RandomInt(r, 50) + 1 + czChainID := string(datagen.GenRandomByteArray(r, czChainIDLen)) // simulate the scenario that a random epoch has ended and finalised - epoch := datagen.GenRandomEpoch() + epoch := datagen.GenRandomEpoch(r) // mock checkpointing keeper // TODO: tests with a set of validators @@ -300,7 +300,7 @@ func FuzzFinalizedChainInfo(f *testing.F) { checkpointingKeeper.EXPECT().GetBLSPubKeySet(gomock.Any(), gomock.Eq(epoch.EpochNumber)).Return([]*checkpointingtypes.ValidatorWithBlsKey{}, nil).AnyTimes() // mock btccheckpoint keeper // TODO: test with BTCSpvProofs - randomRawCkpt := datagen.GenRandomRawCheckpoint() + randomRawCkpt := datagen.GenRandomRawCheckpoint(r) randomRawCkpt.EpochNum = epoch.EpochNumber btccKeeper := zctypes.NewMockBtcCheckpointKeeper(ctrl) checkpointingKeeper.EXPECT().GetRawCheckpoint(gomock.Any(), gomock.Eq(epoch.EpochNumber)).Return( @@ -335,9 +335,9 @@ func FuzzFinalizedChainInfo(f *testing.F) { hooks := zcKeeper.Hooks() // invoke the hook a random number of times to simulate a random number of blocks - numHeaders := datagen.RandomInt(100) + 1 - numForkHeaders := datagen.RandomInt(10) + 1 - SimulateHeadersAndForksViaHook(ctx, hooks, czChainID, 0, numHeaders, numForkHeaders) + numHeaders := datagen.RandomInt(r, 100) + 1 + numForkHeaders := datagen.RandomInt(r, 10) + 1 + SimulateHeadersAndForksViaHook(ctx, r, hooks, czChainID, 0, numHeaders, numForkHeaders) hooks.AfterEpochEnds(ctx, epoch.EpochNumber) err := hooks.AfterRawCheckpointFinalized(ctx, epoch.EpochNumber) diff --git a/x/zoneconcierge/keeper/keeper_test.go b/x/zoneconcierge/keeper/keeper_test.go index 421f36c15..eb1b63dc1 100644 --- a/x/zoneconcierge/keeper/keeper_test.go +++ b/x/zoneconcierge/keeper/keeper_test.go @@ -2,6 +2,7 @@ package keeper_test import ( "encoding/json" + "math/rand" "testing" sdk "github.com/cosmos/cosmos-sdk/types" @@ -35,32 +36,32 @@ func SetupTest(t *testing.T) (*ibctesting.Coordinator, *ibctesting.TestChain, *i } // SimulateHeadersViaHook generates a non-zero number of canonical headers via the hook -func SimulateHeadersViaHook(ctx sdk.Context, hooks zckeeper.Hooks, chainID string, startHeight uint64, numHeaders uint64) []*ibctmtypes.Header { +func SimulateHeadersViaHook(ctx sdk.Context, r *rand.Rand, hooks zckeeper.Hooks, chainID string, startHeight uint64, numHeaders uint64) []*ibctmtypes.Header { headers := []*ibctmtypes.Header{} // invoke the hook a number of times to simulate a number of blocks for i := uint64(0); i < numHeaders; i++ { - header := datagen.GenRandomIBCTMHeader(chainID, startHeight+i) - hooks.AfterHeaderWithValidCommit(ctx, datagen.GenRandomByteArray(32), datagen.HeaderToHeaderInfo(header), false) + header := datagen.GenRandomIBCTMHeader(r, chainID, startHeight+i) + hooks.AfterHeaderWithValidCommit(ctx, datagen.GenRandomByteArray(r, 32), datagen.HeaderToHeaderInfo(header), false) headers = append(headers, header) } return headers } // SimulateHeadersViaHook generates a random non-zero number of canonical headers and fork headers via the hook -func SimulateHeadersAndForksViaHook(ctx sdk.Context, hooks zckeeper.Hooks, chainID string, startHeight uint64, numHeaders uint64, numForkHeaders uint64) ([]*ibctmtypes.Header, []*ibctmtypes.Header) { +func SimulateHeadersAndForksViaHook(ctx sdk.Context, r *rand.Rand, hooks zckeeper.Hooks, chainID string, startHeight uint64, numHeaders uint64, numForkHeaders uint64) ([]*ibctmtypes.Header, []*ibctmtypes.Header) { headers := []*ibctmtypes.Header{} // invoke the hook a number of times to simulate a number of blocks for i := uint64(0); i < numHeaders; i++ { - header := datagen.GenRandomIBCTMHeader(chainID, startHeight+i) - hooks.AfterHeaderWithValidCommit(ctx, datagen.GenRandomByteArray(32), datagen.HeaderToHeaderInfo(header), false) + header := datagen.GenRandomIBCTMHeader(r, chainID, startHeight+i) + hooks.AfterHeaderWithValidCommit(ctx, datagen.GenRandomByteArray(r, 32), datagen.HeaderToHeaderInfo(header), false) headers = append(headers, header) } // generate a number of fork headers forkHeaders := []*ibctmtypes.Header{} for i := uint64(0); i < numForkHeaders; i++ { - header := datagen.GenRandomIBCTMHeader(chainID, startHeight+numHeaders-1) - hooks.AfterHeaderWithValidCommit(ctx, datagen.GenRandomByteArray(32), datagen.HeaderToHeaderInfo(header), true) + header := datagen.GenRandomIBCTMHeader(r, chainID, startHeight+numHeaders-1) + hooks.AfterHeaderWithValidCommit(ctx, datagen.GenRandomByteArray(r, 32), datagen.HeaderToHeaderInfo(header), true) forkHeaders = append(forkHeaders, header) } return headers, forkHeaders diff --git a/x/zoneconcierge/keeper/proof_epoch_sealed_test.go b/x/zoneconcierge/keeper/proof_epoch_sealed_test.go index a357bff78..e29c6eae6 100644 --- a/x/zoneconcierge/keeper/proof_epoch_sealed_test.go +++ b/x/zoneconcierge/keeper/proof_epoch_sealed_test.go @@ -41,20 +41,20 @@ func FuzzProofEpochSealed_BLSSig(f *testing.F) { datagen.AddRandomSeedsToFuzzer(f, 10) f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) + r := rand.New(rand.NewSource(seed)) ctrl := gomock.NewController(t) defer ctrl.Finish() // generate a random epoch - epoch := datagen.GenRandomEpoch() + epoch := datagen.GenRandomEpoch(r) // generate a random validator set with 100 validators numVals := 100 valSet, blsSKs := datagen.GenerateValidatorSetWithBLSPrivKeys(numVals) // sample a validator subset, which may or may not reach a quorum - bm, numSubSet := datagen.GenRandomBitmap() + bm, numSubSet := datagen.GenRandomBitmap(r) _, subsetPower, err := valSet.FindSubsetWithPowerSum(bm) require.NoError(t, err) @@ -107,8 +107,7 @@ func FuzzProofEpochSealed_Epoch(f *testing.F) { datagen.AddRandomSeedsToFuzzer(f, 10) f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) - + // r := rand.New(rand.NewSource(seed)) }) } @@ -117,7 +116,6 @@ func FuzzProofEpochSealed_ValSet(f *testing.F) { datagen.AddRandomSeedsToFuzzer(f, 10) f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) - + // r := rand.New(rand.NewSource(seed)) }) } diff --git a/x/zoneconcierge/keeper/proof_epoch_submitted_test.go b/x/zoneconcierge/keeper/proof_epoch_submitted_test.go index 969ab86d6..c8cacc3c5 100644 --- a/x/zoneconcierge/keeper/proof_epoch_submitted_test.go +++ b/x/zoneconcierge/keeper/proof_epoch_submitted_test.go @@ -19,22 +19,22 @@ func FuzzProofEpochSubmitted(f *testing.F) { datagen.AddRandomSeedsToFuzzer(f, 10) f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) + r := rand.New(rand.NewSource(seed)) // generate random epoch, random rawBtcCkpt and random rawCkpt - epoch := datagen.GenRandomEpoch() - rawBtcCkpt := datagen.GetRandomRawBtcCheckpoint() + epoch := datagen.GenRandomEpoch(r) + rawBtcCkpt := datagen.GetRandomRawBtcCheckpoint(r) rawBtcCkpt.Epoch = epoch.EpochNumber rawCkpt, err := checkpointingtypes.FromBTCCkptToRawCkpt(rawBtcCkpt) require.NoError(t, err) // encode ckpt to BTC txs in BTC blocks testRawCkptData := datagen.EncodeRawCkptToTestData(rawBtcCkpt) - idxs := []uint64{datagen.RandomInt(5) + 1, datagen.RandomInt(5) + 1} - offsets := []uint64{datagen.RandomInt(5) + 1, datagen.RandomInt(5) + 1} + idxs := []uint64{datagen.RandomInt(r, 5) + 1, datagen.RandomInt(r, 5) + 1} + offsets := []uint64{datagen.RandomInt(r, 5) + 1, datagen.RandomInt(r, 5) + 1} btcBlocks := []*datagen.BlockCreationResult{ - datagen.CreateBlock(1, uint32(idxs[0]+offsets[0]), uint32(idxs[0]), testRawCkptData.FirstPart), - datagen.CreateBlock(2, uint32(idxs[1]+offsets[1]), uint32(idxs[1]), testRawCkptData.SecondPart), + datagen.CreateBlock(r, 1, uint32(idxs[0]+offsets[0]), uint32(idxs[0]), testRawCkptData.FirstPart), + datagen.CreateBlock(r, 2, uint32(idxs[1]+offsets[1]), uint32(idxs[1]), testRawCkptData.SecondPart), } // create MsgInsertBtcSpvProof for the rawCkpt msgInsertBtcSpvProof := datagen.GenerateMessageWithRandomSubmitter([]*datagen.BlockCreationResult{btcBlocks[0], btcBlocks[1]}) diff --git a/x/zoneconcierge/keeper/query_kvstore_test.go b/x/zoneconcierge/keeper/query_kvstore_test.go index c4fa20087..7134afadf 100644 --- a/x/zoneconcierge/keeper/query_kvstore_test.go +++ b/x/zoneconcierge/keeper/query_kvstore_test.go @@ -1,41 +1,33 @@ package keeper_test import ( - "math/rand" "testing" - "github.com/babylonchain/babylon/testutil/datagen" epochingtypes "github.com/babylonchain/babylon/x/epoching/types" zckeeper "github.com/babylonchain/babylon/x/zoneconcierge/keeper" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/stretchr/testify/require" ) -func FuzzQueryStore(f *testing.F) { - datagen.AddRandomSeedsToFuzzer(f, 10) +func TestQueryStore(t *testing.T) { + _, babylonChain, _, babylonApp := SetupTest(t) + zcKeeper := babylonApp.ZoneConciergeKeeper - f.Fuzz(func(t *testing.T, seed int64) { - rand.Seed(seed) + babylonChain.NextBlock() + babylonChain.NextBlock() - _, babylonChain, _, babylonApp := SetupTest(t) - zcKeeper := babylonApp.ZoneConciergeKeeper + ctx := babylonChain.GetContext() - babylonChain.NextBlock() - babylonChain.NextBlock() + epochQueryKey := append(epochingtypes.EpochInfoKey, sdk.Uint64ToBigEndian(1)...) + // NOTE: QueryStore will use ctx.BlockHeight() - 1 as the height for ABCI query + // This is because the ABCI query will return the inclusion proof corresponding + // to the NEXT block rather than the given block. + key, value, proof, err := zcKeeper.QueryStore(epochingtypes.StoreKey, epochQueryKey, ctx.BlockHeight()) - ctx := babylonChain.GetContext() + require.NoError(t, err) + require.NotNil(t, proof) + require.Equal(t, epochQueryKey, key) - epochQueryKey := append(epochingtypes.EpochInfoKey, sdk.Uint64ToBigEndian(1)...) - // NOTE: QueryStore will use ctx.BlockHeight() - 1 as the height for ABCI query - // This is because the ABCI query will return the inclusion proof corresponding - // to the NEXT block rather than the given block. - key, value, proof, err := zcKeeper.QueryStore(epochingtypes.StoreKey, epochQueryKey, ctx.BlockHeight()) - - require.NoError(t, err) - require.NotNil(t, proof) - require.Equal(t, epochQueryKey, key) - - err = zckeeper.VerifyStore(ctx.BlockHeader().AppHash, epochingtypes.StoreKey, key, value, proof) - require.NoError(t, err) - }) + err = zckeeper.VerifyStore(ctx.BlockHeader().AppHash, epochingtypes.StoreKey, key, value, proof) + require.NoError(t, err) } From a0b59273ec09aedfb91750af113ba7e13cc1e031 Mon Sep 17 00:00:00 2001 From: Vitalis Salis Date: Fri, 28 Apr 2023 10:06:15 +0300 Subject: [PATCH 46/59] chore: Bump Cosmos SDK to v0.47.2 and minor bug fix (#366) --- go.mod | 6 +++--- go.sum | 12 ++++++------ testutil/datagen/raw_checkpoint.go | 5 ++++- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/go.mod b/go.mod index 88d8dc22c..d71a4bd01 100644 --- a/go.mod +++ b/go.mod @@ -5,9 +5,9 @@ module github.com/babylonchain/babylon require ( github.com/CosmWasm/wasmd v0.40.0-rc.1 github.com/btcsuite/btcd v0.23.4 - github.com/cometbft/cometbft v0.37.0 + github.com/cometbft/cometbft v0.37.1 github.com/cometbft/cometbft-db v0.7.0 - github.com/cosmos/cosmos-sdk v0.47.1 + github.com/cosmos/cosmos-sdk v0.47.2 github.com/golang/protobuf v1.5.3 github.com/gorilla/mux v1.8.0 github.com/grpc-ecosystem/grpc-gateway v1.16.0 @@ -163,7 +163,7 @@ require ( github.com/googleapis/enterprise-certificate-proxy v0.2.3 // indirect github.com/googleapis/gax-go/v2 v2.7.0 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect - github.com/hashicorp/go-getter v1.7.0 // indirect + github.com/hashicorp/go-getter v1.7.1 // indirect github.com/hashicorp/go-safetemp v1.0.0 // indirect github.com/hashicorp/go-version v1.6.0 // indirect github.com/huandu/skiplist v1.2.0 // indirect diff --git a/go.sum b/go.sum index 43de9899c..f9161abe8 100644 --- a/go.sum +++ b/go.sum @@ -333,8 +333,8 @@ github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:z github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/coinbase/rosetta-sdk-go/types v1.0.0 h1:jpVIwLcPoOeCR6o1tU+Xv7r5bMONNbHU7MuEHboiFuA= github.com/coinbase/rosetta-sdk-go/types v1.0.0/go.mod h1:eq7W2TMRH22GTW0N0beDnN931DW0/WOI1R2sdHNHG4c= -github.com/cometbft/cometbft v0.37.0 h1:M005vBaSaugvYYmNZwJOopynQSjwLoDTwflnQ/I/eYk= -github.com/cometbft/cometbft v0.37.0/go.mod h1:Y2MMMN//O5K4YKd8ze4r9jmk4Y7h0ajqILXbH5JQFVs= +github.com/cometbft/cometbft v0.37.1 h1:KLxkQTK2hICXYq21U2hn1W5hOVYUdQgDQ1uB+90xPIg= +github.com/cometbft/cometbft v0.37.1/go.mod h1:Y2MMMN//O5K4YKd8ze4r9jmk4Y7h0ajqILXbH5JQFVs= github.com/cometbft/cometbft-db v0.7.0 h1:uBjbrBx4QzU0zOEnU8KxoDl18dMNgDh+zZRUE0ucsbo= github.com/cometbft/cometbft-db v0.7.0/go.mod h1:yiKJIm2WKrt6x8Cyxtq9YTEcIMPcEe4XPxhgX59Fzf0= github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= @@ -350,8 +350,8 @@ github.com/cosmos/btcutil v1.0.5 h1:t+ZFcX77LpKtDBhjucvnOH8C2l2ioGsBNEQ3jef8xFk= github.com/cosmos/btcutil v1.0.5/go.mod h1:IyB7iuqZMJlthe2tkIFL33xPyzbFYP0XVdS8P5lUPis= github.com/cosmos/cosmos-proto v1.0.0-beta.2 h1:X3OKvWgK9Gsejo0F1qs5l8Qn6xJV/AzgIWR2wZ8Nua8= github.com/cosmos/cosmos-proto v1.0.0-beta.2/go.mod h1:+XRCLJ14pr5HFEHIUcn51IKXD1Fy3rkEQqt4WqmN4V0= -github.com/cosmos/cosmos-sdk v0.47.1 h1:HnaCYtaAMWZp1SdlwwE1mPJ8kFlZ/TuEJ/ciNXH6Uno= -github.com/cosmos/cosmos-sdk v0.47.1/go.mod h1:14tO5KQaTrl2q3OxBnDRfue7TRN9zkXS0cLutrSqkOo= +github.com/cosmos/cosmos-sdk v0.47.2 h1:9rSriCoiJD+4F+tEDobyM8V7HF5BtY5Ef4VYNig96s0= +github.com/cosmos/cosmos-sdk v0.47.2/go.mod h1:zYzgI8w8hhotXTSoGbbSOAKfpJTx4wOy4XgbaKhtRtc= github.com/cosmos/cosmos-sdk/ics23/go v0.8.0 h1:iKclrn3YEOwk4jQHT2ulgzuXyxmzmPczUalMwW4XH9k= github.com/cosmos/cosmos-sdk/ics23/go v0.8.0/go.mod h1:2a4dBq88TUoqoWAU5eu0lGvpFP3wWDPgdHPargtyw30= github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d/go.mod h1:tSxLoYXyBmiFeKpvmq4dzayMdCjCnu8uqmCysIGBT2Y= @@ -655,8 +655,8 @@ github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtng github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hashicorp/go-getter v1.7.0 h1:bzrYP+qu/gMrL1au7/aDvkoOVGUJpeKBgbqRHACAFDY= -github.com/hashicorp/go-getter v1.7.0/go.mod h1:W7TalhMmbPmsSMdNjD0ZskARur/9GJ17cfHTRtXV744= +github.com/hashicorp/go-getter v1.7.1 h1:SWiSWN/42qdpR0MdhaOc/bLR48PLuP1ZQtYLRlM69uY= +github.com/hashicorp/go-getter v1.7.1/go.mod h1:W7TalhMmbPmsSMdNjD0ZskARur/9GJ17cfHTRtXV744= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= diff --git a/testutil/datagen/raw_checkpoint.go b/testutil/datagen/raw_checkpoint.go index 3b5f4954c..37cb771bf 100644 --- a/testutil/datagen/raw_checkpoint.go +++ b/testutil/datagen/raw_checkpoint.go @@ -64,9 +64,12 @@ func GenRandomSequenceRawCheckpointsWithMeta(r *rand.Rand) []*types.RawCheckpoin if epoch1 > epoch2 { topEpoch = epoch1 finalEpoch = epoch2 - } else { + } else if epoch1 < epoch2 { topEpoch = epoch2 finalEpoch = epoch1 + } else { // In the case they are equal, make the topEpoch one more + topEpoch = epoch1 + 1 + finalEpoch = epoch2 } var checkpoints []*types.RawCheckpointWithMeta for e := uint64(0); e <= topEpoch; e++ { From 6f1427118b5eee19eb86398519a9ed082afec511 Mon Sep 17 00:00:00 2001 From: Gurjot Singh <111540954+gusin13@users.noreply.github.com> Date: Fri, 28 Apr 2023 13:09:37 +0530 Subject: [PATCH 47/59] feat: support multiple chain ids in zoneconcierge chains info api (#362) * new proto files * accept repeated str * add query cmd * logic * swag file * add cli query for /babylon/zoneconcierge/v1/chain_info/{chain_id} * extend chain info api * update swag * typo * remove from e2e dir * update docstring Co-authored-by: Vitalis Salis * check if chain id empty * make chain id slice in loop * ctx suggestion Co-authored-by: Runchao Han * don't perform any query if chain empty * arb args * add check for max query and dups * improve comments * add e2e test * update protover * revert back to 12.0 --------- Co-authored-by: Vitalis Salis Co-authored-by: Runchao Han --- client/docs/swagger-ui/swagger.yaml | 2397 +++++++++----------- proto/babylon/zoneconcierge/v1/query.proto | 15 +- test/e2e/configurer/chain/queries.go | 9 +- test/e2e/e2e_test.go | 5 + x/zoneconcierge/client/cli/query.go | 27 +- x/zoneconcierge/keeper/grpc_query.go | 45 +- x/zoneconcierge/keeper/grpc_query_test.go | 56 +- x/zoneconcierge/types/query.pb.go | 335 +-- x/zoneconcierge/types/query.pb.gw.go | 70 +- 9 files changed, 1327 insertions(+), 1632 deletions(-) diff --git a/client/docs/swagger-ui/swagger.yaml b/client/docs/swagger-ui/swagger.yaml index 5d1af6845..7ded4d2d7 100644 --- a/client/docs/swagger-ui/swagger.yaml +++ b/client/docs/swagger-ui/swagger.yaml @@ -287,6 +287,13 @@ paths: has dishonest majority and is stalling checkpoints (w in research paper) + checkpoint_tag: + type: string + title: >- + 4byte tag in hex format, required to be present in the + OP_RETURN transaction + + related to babylon description: >- QueryParamsResponse is response type for the Query/Params RPC method. @@ -1088,46 +1095,6 @@ paths: type: boolean tags: - Query - /babylon/btclightclient/v1/params: - get: - summary: Parameters queries the parameters of the module. - operationId: BtcLightClientParams - responses: - '200': - description: A successful response. - schema: - type: object - properties: - params: - description: params holds all the parameters of this module. - type: object - description: >- - QueryParamsResponse is response type for the Query/Params RPC - method. - default: - description: An unexpected error response. - schema: - type: object - properties: - error: - type: string - code: - type: integer - format: int32 - message: - type: string - details: - type: array - items: - type: object - properties: - type_url: - type: string - value: - type: string - format: byte - tags: - - Query /babylon/btclightclient/v1/tip: get: summary: Tip return best header on canonical chain @@ -1327,10 +1294,6 @@ paths: if (any.is(Foo.class)) { foo = any.unpack(Foo.class); } - // or ... - if (any.isSameTypeAs(Foo.getDefaultInstance())) { - foo = any.unpack(Foo.getDefaultInstance()); - } Example 3: Pack and unpack a message in Python. @@ -1370,6 +1333,7 @@ paths: name "y.z". + JSON @@ -1583,10 +1547,6 @@ paths: if (any.is(Foo.class)) { foo = any.unpack(Foo.class); } - // or ... - if (any.isSameTypeAs(Foo.getDefaultInstance())) { - foo = any.unpack(Foo.getDefaultInstance()); - } Example 3: Pack and unpack a message in Python. @@ -1626,6 +1586,7 @@ paths: name "y.z". + JSON @@ -2029,10 +1990,6 @@ paths: if (any.is(Foo.class)) { foo = any.unpack(Foo.class); } - // or ... - if (any.isSameTypeAs(Foo.getDefaultInstance())) { - foo = any.unpack(Foo.getDefaultInstance()); - } Example 3: Pack and unpack a message in Python. @@ -2072,6 +2029,7 @@ paths: name "y.z". + JSON @@ -2490,10 +2448,6 @@ paths: if (any.is(Foo.class)) { foo = any.unpack(Foo.class); } - // or ... - if (any.isSameTypeAs(Foo.getDefaultInstance())) { - foo = any.unpack(Foo.getDefaultInstance()); - } Example 3: Pack and unpack a message in Python. @@ -2533,6 +2487,7 @@ paths: name "y.z". + JSON @@ -2774,10 +2729,6 @@ paths: if (any.is(Foo.class)) { foo = any.unpack(Foo.class); } - // or ... - if (any.isSameTypeAs(Foo.getDefaultInstance())) { - foo = any.unpack(Foo.getDefaultInstance()); - } Example 3: Pack and unpack a message in Python. @@ -2817,6 +2768,7 @@ paths: name "y.z". + JSON @@ -3116,10 +3068,6 @@ paths: if (any.is(Foo.class)) { foo = any.unpack(Foo.class); } - // or ... - if (any.isSameTypeAs(Foo.getDefaultInstance())) { - foo = any.unpack(Foo.getDefaultInstance()); - } Example 3: Pack and unpack a message in Python. @@ -3159,6 +3107,7 @@ paths: name "y.z". + JSON @@ -3435,10 +3384,6 @@ paths: if (any.is(Foo.class)) { foo = any.unpack(Foo.class); } - // or ... - if (any.isSameTypeAs(Foo.getDefaultInstance())) { - foo = any.unpack(Foo.getDefaultInstance()); - } Example 3: Pack and unpack a message in Python. @@ -3478,6 +3423,7 @@ paths: name "y.z". + JSON @@ -3793,10 +3739,6 @@ paths: if (any.is(Foo.class)) { foo = any.unpack(Foo.class); } - // or ... - if (any.isSameTypeAs(Foo.getDefaultInstance())) { - foo = any.unpack(Foo.getDefaultInstance()); - } Example 3: Pack and unpack a message in Python. @@ -3837,6 +3779,7 @@ paths: name "y.z". + JSON @@ -4142,10 +4085,6 @@ paths: if (any.is(Foo.class)) { foo = any.unpack(Foo.class); } - // or ... - if (any.isSameTypeAs(Foo.getDefaultInstance())) { - foo = any.unpack(Foo.getDefaultInstance()); - } Example 3: Pack and unpack a message in Python. @@ -4185,6 +4124,7 @@ paths: name "y.z". + JSON @@ -4430,10 +4370,6 @@ paths: if (any.is(Foo.class)) { foo = any.unpack(Foo.class); } - // or ... - if (any.isSameTypeAs(Foo.getDefaultInstance())) { - foo = any.unpack(Foo.getDefaultInstance()); - } Example 3: Pack and unpack a message in Python. @@ -4473,6 +4409,7 @@ paths: name "y.z". + JSON @@ -4682,10 +4619,6 @@ paths: if (any.is(Foo.class)) { foo = any.unpack(Foo.class); } - // or ... - if (any.isSameTypeAs(Foo.getDefaultInstance())) { - foo = any.unpack(Foo.getDefaultInstance()); - } Example 3: Pack and unpack a message in Python. @@ -4725,6 +4658,7 @@ paths: name "y.z". + JSON @@ -5118,46 +5052,6 @@ paths: - CKPT_STATUS_FINALIZED tags: - Query - /babylon/checkpointing/v1/params: - get: - summary: Parameters queries the parameters of the module. - operationId: CheckpointingParams - responses: - '200': - description: A successful response. - schema: - type: object - properties: - params: - description: params holds all the parameters of this module. - type: object - description: >- - QueryParamsResponse is response type for the Query/Params RPC - method. - default: - description: An unexpected error response. - schema: - type: object - properties: - error: - type: string - code: - type: integer - format: int32 - message: - type: string - details: - type: array - items: - type: object - properties: - type_url: - type: string - value: - type: string - format: byte - tags: - - Query /babylon/checkpointing/v1/raw_checkpoint/{epoch_num}: get: summary: RawCheckpoint queries a checkpoints at a given epoch number. @@ -5567,10 +5461,12 @@ paths: type: boolean tags: - Query - /babylon/zoneconcierge/v1/chain_info/{chain_id}: + /babylon/zoneconcierge/v1/chain_info/{chain_id}/epochs/{epoch_num}: get: - summary: ChainInfo queries the latest info of a chain in Babylon's view - operationId: ChainInfo + summary: |- + EpochChainInfo queries the latest info of a chain in a given epoch of + Babylon's view + operationId: EpochChainInfo responses: '200': description: A successful response. @@ -5875,8 +5771,10 @@ paths: canonical chain description: >- - QueryChainInfoResponse is response type for the Query/ChainInfo - RPC method. + QueryEpochChainInfoResponse is response type for the + Query/EpochChainInfo RPC + + method. default: description: An unexpected error response. schema: @@ -5990,10 +5888,6 @@ paths: if (any.is(Foo.class)) { foo = any.unpack(Foo.class); } - // or ... - if (any.isSameTypeAs(Foo.getDefaultInstance())) { - foo = any.unpack(Foo.getDefaultInstance()); - } Example 3: Pack and unpack a message in Python. @@ -6033,6 +5927,7 @@ paths: name "y.z". + JSON @@ -6076,321 +5971,298 @@ paths: in: path required: true type: string + - name: epoch_num + in: path + required: true + type: string + format: uint64 tags: - Query - /babylon/zoneconcierge/v1/chain_info/{chain_id}/epochs/{epoch_num}: + /babylon/zoneconcierge/v1/chain_info/{chain_id}/header/{height}: get: - summary: |- - EpochChainInfo queries the latest info of a chain in a given epoch of - Babylon's view - operationId: EpochChainInfo + summary: Header queries the CZ header and fork headers at a given height. + operationId: Header responses: '200': description: A successful response. schema: type: object properties: - chain_info: - title: chain_info is the info of the CZ + header: type: object properties: chain_id: type: string - title: chain_id is the ID of the chain - latest_header: - title: latest_header is the latest header in CZ's canonical chain + title: chain_id is the unique ID of the chain + hash: + type: string + format: byte + title: hash is the hash of this header + height: + type: string + format: uint64 + title: >- + height is the height of this header on CZ ledger + + (hash, height) jointly provides the position of the header + on CZ ledger + babylon_header: + title: >- + babylon_header is the header of the babylon block that + includes this CZ + + header type: object properties: + version: + title: basic block info + type: object + properties: + block: + type: string + format: uint64 + app: + type: string + format: uint64 + description: >- + Consensus captures the consensus rules for processing + a block in the blockchain, + + including all blockchain data structures and the rules + of the application's + + state transition machine. chain_id: type: string - title: chain_id is the unique ID of the chain - hash: - type: string - format: byte - title: hash is the hash of this header height: type: string - format: uint64 - title: >- - height is the height of this header on CZ ledger - - (hash, height) jointly provides the position of the - header on CZ ledger - babylon_header: - title: >- - babylon_header is the header of the babylon block that - includes this CZ - - header + format: int64 + time: + type: string + format: date-time + last_block_id: + title: prev block info type: object properties: - version: - title: basic block info - type: object - properties: - block: - type: string - format: uint64 - app: - type: string - format: uint64 - description: >- - Consensus captures the consensus rules for - processing a block in the blockchain, - - including all blockchain data structures and the - rules of the application's - - state transition machine. - chain_id: - type: string - height: - type: string - format: int64 - time: + hash: type: string - format: date-time - last_block_id: - title: prev block info + format: byte + part_set_header: type: object properties: + total: + type: integer + format: int64 hash: type: string format: byte - part_set_header: - type: object - properties: - total: - type: integer - format: int64 - hash: - type: string - format: byte - title: PartsetHeader - last_commit_hash: - type: string - format: byte - title: hashes of block data - data_hash: - type: string - format: byte - validators_hash: - type: string - format: byte - title: hashes from the app output from the prev block - next_validators_hash: - type: string - format: byte - consensus_hash: - type: string - format: byte - app_hash: - type: string - format: byte - last_results_hash: - type: string - format: byte - evidence_hash: - type: string - format: byte - title: consensus info - proposer_address: - type: string - format: byte - description: Header defines the structure of a block header. - babylon_epoch: + title: PartsetHeader + last_commit_hash: type: string - format: uint64 - title: >- - epoch is the epoch number of this header on Babylon - ledger - babylon_tx_hash: + format: byte + title: hashes of block data + data_hash: type: string format: byte - title: >- - babylon_tx_hash is the hash of the tx that includes - this header + validators_hash: + type: string + format: byte + title: hashes from the app output from the prev block + next_validators_hash: + type: string + format: byte + consensus_hash: + type: string + format: byte + app_hash: + type: string + format: byte + last_results_hash: + type: string + format: byte + evidence_hash: + type: string + format: byte + title: consensus info + proposer_address: + type: string + format: byte + description: Header defines the structure of a block header. + babylon_epoch: + type: string + format: uint64 + title: epoch is the epoch number of this header on Babylon ledger + babylon_tx_hash: + type: string + format: byte + title: >- + babylon_tx_hash is the hash of the tx that includes this + header - (babylon_block_height, babylon_tx_hash) jointly - provides the position of + (babylon_block_height, babylon_tx_hash) jointly provides + the position of - the header on Babylon ledger - latest_forks: - title: >- - latest_forks is the latest forks, formed as a series of - IndexedHeader (from + the header on Babylon ledger + title: IndexedHeader is the metadata of a CZ header + fork_headers: + type: object + properties: + headers: + type: array + items: + type: object + properties: + chain_id: + type: string + title: chain_id is the unique ID of the chain + hash: + type: string + format: byte + title: hash is the hash of this header + height: + type: string + format: uint64 + title: >- + height is the height of this header on CZ ledger - low to high) - type: object - properties: - headers: - type: array - items: + (hash, height) jointly provides the position of the + header on CZ ledger + babylon_header: + title: >- + babylon_header is the header of the babylon block + that includes this CZ + + header type: object properties: + version: + title: basic block info + type: object + properties: + block: + type: string + format: uint64 + app: + type: string + format: uint64 + description: >- + Consensus captures the consensus rules for + processing a block in the blockchain, + + including all blockchain data structures and the + rules of the application's + + state transition machine. chain_id: type: string - title: chain_id is the unique ID of the chain - hash: - type: string - format: byte - title: hash is the hash of this header height: type: string - format: uint64 - title: >- - height is the height of this header on CZ ledger - - (hash, height) jointly provides the position of - the header on CZ ledger - babylon_header: - title: >- - babylon_header is the header of the babylon - block that includes this CZ - - header + format: int64 + time: + type: string + format: date-time + last_block_id: + title: prev block info type: object properties: - version: - title: basic block info - type: object - properties: - block: - type: string - format: uint64 - app: - type: string - format: uint64 - description: >- - Consensus captures the consensus rules for - processing a block in the blockchain, - - including all blockchain data structures and - the rules of the application's - - state transition machine. - chain_id: - type: string - height: - type: string - format: int64 - time: + hash: type: string - format: date-time - last_block_id: - title: prev block info + format: byte + part_set_header: type: object properties: + total: + type: integer + format: int64 hash: type: string format: byte - part_set_header: - type: object - properties: - total: - type: integer - format: int64 - hash: - type: string - format: byte - title: PartsetHeader - last_commit_hash: - type: string - format: byte - title: hashes of block data - data_hash: - type: string - format: byte - validators_hash: - type: string - format: byte - title: >- - hashes from the app output from the prev - block - next_validators_hash: - type: string - format: byte - consensus_hash: - type: string - format: byte - app_hash: - type: string - format: byte - last_results_hash: - type: string - format: byte - evidence_hash: - type: string - format: byte - title: consensus info - proposer_address: - type: string - format: byte - description: Header defines the structure of a block header. - babylon_epoch: + title: PartsetHeader + last_commit_hash: type: string - format: uint64 - title: >- - epoch is the epoch number of this header on - Babylon ledger - babylon_tx_hash: + format: byte + title: hashes of block data + data_hash: type: string format: byte - title: >- - babylon_tx_hash is the hash of the tx that - includes this header - - (babylon_block_height, babylon_tx_hash) jointly - provides the position of - - the header on Babylon ledger - title: IndexedHeader is the metadata of a CZ header - title: >- - blocks is the list of non-canonical indexed headers at - the same height - description: >- - Forks is a list of non-canonical `IndexedHeader`s at the - same height. - - For example, assuming the following blockchain - - ``` - - A <- B <- C <- D <- E - \ -- D1 - \ -- D2 - ``` + validators_hash: + type: string + format: byte + title: hashes from the app output from the prev block + next_validators_hash: + type: string + format: byte + consensus_hash: + type: string + format: byte + app_hash: + type: string + format: byte + last_results_hash: + type: string + format: byte + evidence_hash: + type: string + format: byte + title: consensus info + proposer_address: + type: string + format: byte + description: Header defines the structure of a block header. + babylon_epoch: + type: string + format: uint64 + title: >- + epoch is the epoch number of this header on Babylon + ledger + babylon_tx_hash: + type: string + format: byte + title: >- + babylon_tx_hash is the hash of the tx that includes + this header - Then the fork will be {[D1, D2]} where each item is in - struct `IndexedBlock`. + (babylon_block_height, babylon_tx_hash) jointly + provides the position of + the header on Babylon ledger + title: IndexedHeader is the metadata of a CZ header + title: >- + blocks is the list of non-canonical indexed headers at the + same height + description: >- + Forks is a list of non-canonical `IndexedHeader`s at the same + height. - Note that each `IndexedHeader` in the fork should have a - valid quorum + For example, assuming the following blockchain - certificate. Such forks exist since Babylon considers CZs - might have + ``` - dishonest majority. Also note that the IBC-Go - implementation will only + A <- B <- C <- D <- E + \ -- D1 + \ -- D2 + ``` - consider the first header in a fork valid, since the - subsequent headers + Then the fork will be {[D1, D2]} where each item is in struct + `IndexedBlock`. - cannot be verified without knowing the validator set in - the previous header. - timestamped_headers_count: - type: string - format: uint64 - title: >- - timestamped_headers_count is the number of timestamped - headers in CZ's - canonical chain - description: >- - QueryEpochChainInfoResponse is response type for the - Query/EpochChainInfo RPC + Note that each `IndexedHeader` in the fork should have a valid + quorum + + certificate. Such forks exist since Babylon considers CZs + might have + + dishonest majority. Also note that the IBC-Go implementation + will only + consider the first header in a fork valid, since the + subsequent headers + + cannot be verified without knowing the validator set in the + previous header. + description: >- + QueryHeaderResponse is response type for the Query/Header RPC method. default: description: An unexpected error response. @@ -6505,10 +6377,6 @@ paths: if (any.is(Foo.class)) { foo = any.unpack(Foo.class); } - // or ... - if (any.isSameTypeAs(Foo.getDefaultInstance())) { - foo = any.unpack(Foo.getDefaultInstance()); - } Example 3: Pack and unpack a message in Python. @@ -6548,6 +6416,7 @@ paths: name "y.z". + JSON @@ -6591,327 +6460,90 @@ paths: in: path required: true type: string - - name: epoch_num + - name: height in: path required: true type: string format: uint64 tags: - Query - /babylon/zoneconcierge/v1/chain_info/{chain_id}/header/{height}: + /babylon/zoneconcierge/v1/chains: get: - summary: Header queries the CZ header and fork headers at a given height. - operationId: Header + summary: ChainList queries the list of chains that checkpoint to Babylon + operationId: ChainList responses: '200': description: A successful response. schema: type: object properties: - header: + chain_ids: + type: array + items: + type: string + title: >- + chain_ids are IDs of the chains in ascending alphabetical + order + pagination: + title: pagination defines the pagination in the response type: object properties: - chain_id: - type: string - title: chain_id is the unique ID of the chain - hash: + next_key: type: string format: byte - title: hash is the hash of this header - height: + description: |- + next_key is the key to be passed to PageRequest.key to + query the next page most efficiently. It will be empty if + there are no more results. + total: type: string format: uint64 title: >- - height is the height of this header on CZ ledger + total is total number of results available if + PageRequest.count_total - (hash, height) jointly provides the position of the header - on CZ ledger - babylon_header: - title: >- - babylon_header is the header of the babylon block that - includes this CZ + was set, its value is undefined otherwise + description: >- + PageResponse is to be embedded in gRPC response messages where + the - header - type: object - properties: - version: - title: basic block info - type: object - properties: - block: - type: string - format: uint64 - app: - type: string - format: uint64 - description: >- - Consensus captures the consensus rules for processing - a block in the blockchain, + corresponding request message has used PageRequest. - including all blockchain data structures and the rules - of the application's + message SomeResponse { + repeated Bar results = 1; + PageResponse page = 2; + } + title: >- + QueryChainListResponse is response type for the Query/ChainList + RPC method + default: + description: An unexpected error response. + schema: + type: object + properties: + error: + type: string + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + type_url: + type: string + description: >- + A URL/resource name that uniquely identifies the type of + the serialized - state transition machine. - chain_id: - type: string - height: - type: string - format: int64 - time: - type: string - format: date-time - last_block_id: - title: prev block info - type: object - properties: - hash: - type: string - format: byte - part_set_header: - type: object - properties: - total: - type: integer - format: int64 - hash: - type: string - format: byte - title: PartsetHeader - last_commit_hash: - type: string - format: byte - title: hashes of block data - data_hash: - type: string - format: byte - validators_hash: - type: string - format: byte - title: hashes from the app output from the prev block - next_validators_hash: - type: string - format: byte - consensus_hash: - type: string - format: byte - app_hash: - type: string - format: byte - last_results_hash: - type: string - format: byte - evidence_hash: - type: string - format: byte - title: consensus info - proposer_address: - type: string - format: byte - description: Header defines the structure of a block header. - babylon_epoch: - type: string - format: uint64 - title: epoch is the epoch number of this header on Babylon ledger - babylon_tx_hash: - type: string - format: byte - title: >- - babylon_tx_hash is the hash of the tx that includes this - header + protocol buffer message. This string must contain at + least - (babylon_block_height, babylon_tx_hash) jointly provides - the position of - - the header on Babylon ledger - title: IndexedHeader is the metadata of a CZ header - fork_headers: - type: object - properties: - headers: - type: array - items: - type: object - properties: - chain_id: - type: string - title: chain_id is the unique ID of the chain - hash: - type: string - format: byte - title: hash is the hash of this header - height: - type: string - format: uint64 - title: >- - height is the height of this header on CZ ledger - - (hash, height) jointly provides the position of the - header on CZ ledger - babylon_header: - title: >- - babylon_header is the header of the babylon block - that includes this CZ - - header - type: object - properties: - version: - title: basic block info - type: object - properties: - block: - type: string - format: uint64 - app: - type: string - format: uint64 - description: >- - Consensus captures the consensus rules for - processing a block in the blockchain, - - including all blockchain data structures and the - rules of the application's - - state transition machine. - chain_id: - type: string - height: - type: string - format: int64 - time: - type: string - format: date-time - last_block_id: - title: prev block info - type: object - properties: - hash: - type: string - format: byte - part_set_header: - type: object - properties: - total: - type: integer - format: int64 - hash: - type: string - format: byte - title: PartsetHeader - last_commit_hash: - type: string - format: byte - title: hashes of block data - data_hash: - type: string - format: byte - validators_hash: - type: string - format: byte - title: hashes from the app output from the prev block - next_validators_hash: - type: string - format: byte - consensus_hash: - type: string - format: byte - app_hash: - type: string - format: byte - last_results_hash: - type: string - format: byte - evidence_hash: - type: string - format: byte - title: consensus info - proposer_address: - type: string - format: byte - description: Header defines the structure of a block header. - babylon_epoch: - type: string - format: uint64 - title: >- - epoch is the epoch number of this header on Babylon - ledger - babylon_tx_hash: - type: string - format: byte - title: >- - babylon_tx_hash is the hash of the tx that includes - this header - - (babylon_block_height, babylon_tx_hash) jointly - provides the position of - - the header on Babylon ledger - title: IndexedHeader is the metadata of a CZ header - title: >- - blocks is the list of non-canonical indexed headers at the - same height - description: >- - Forks is a list of non-canonical `IndexedHeader`s at the same - height. - - For example, assuming the following blockchain - - ``` - - A <- B <- C <- D <- E - \ -- D1 - \ -- D2 - ``` - - Then the fork will be {[D1, D2]} where each item is in struct - `IndexedBlock`. - - - Note that each `IndexedHeader` in the fork should have a valid - quorum - - certificate. Such forks exist since Babylon considers CZs - might have - - dishonest majority. Also note that the IBC-Go implementation - will only - - consider the first header in a fork valid, since the - subsequent headers - - cannot be verified without knowing the validator set in the - previous header. - description: >- - QueryParamsResponse is response type for the Query/Header RPC - method. - default: - description: An unexpected error response. - schema: - type: object - properties: - error: - type: string - code: - type: integer - format: int32 - message: - type: string - details: - type: array - items: - type: object - properties: - type_url: - type: string - description: >- - A URL/resource name that uniquely identifies the type of - the serialized - - protocol buffer message. This string must contain at - least - - one "/" character. The last segment of the URL's path - must represent + one "/" character. The last segment of the URL's path + must represent the fully qualified name of the type (as in @@ -6997,10 +6629,6 @@ paths: if (any.is(Foo.class)) { foo = any.unpack(Foo.class); } - // or ... - if (any.isSameTypeAs(Foo.getDefaultInstance())) { - foo = any.unpack(Foo.getDefaultInstance()); - } Example 3: Pack and unpack a message in Python. @@ -7040,6 +6668,7 @@ paths: name "y.z". + JSON @@ -7079,66 +6708,381 @@ paths: "value": "1.212s" } parameters: - - name: chain_id - in: path - required: true + - name: pagination.key + description: |- + key is a value returned in PageResponse.next_key to begin + querying the next page most efficiently. Only one of offset or key + should be set. + in: query + required: false type: string - - name: height - in: path - required: true + format: byte + - name: pagination.offset + description: >- + offset is a numeric offset that can be used when key is unavailable. + + It is less efficient than using key. Only one of offset or key + should + + be set. + in: query + required: false + type: string + format: uint64 + - name: pagination.limit + description: >- + limit is the total number of results to be returned in the result + page. + + If left empty it will default to a value to be set by each app. + in: query + required: false type: string format: uint64 + - name: pagination.count_total + description: >- + count_total is set to true to indicate that the result set should + include + + a count of the total number of items available for pagination in + UIs. + + count_total is only respected when offset is used. It is ignored + when key + + is set. + in: query + required: false + type: boolean + - name: pagination.reverse + description: >- + reverse is set to true if results are to be returned in the + descending order. + + + Since: cosmos-sdk 0.43 + in: query + required: false + type: boolean tags: - Query - /babylon/zoneconcierge/v1/chains: + /babylon/zoneconcierge/v1/chains_info: get: - summary: ChainList queries the list of chains that checkpoint to Babylon - operationId: ChainList + summary: ChainInfo queries the latest info of a chain in Babylon's view + operationId: ChainsInfo responses: '200': description: A successful response. schema: type: object properties: - chain_ids: + chains_info: type: array items: - type: string - title: >- - chain_ids are IDs of the chains in ascending alphabetical - order - pagination: - title: pagination defines the pagination in the response - type: object - properties: - next_key: - type: string - format: byte - description: |- - next_key is the key to be passed to PageRequest.key to - query the next page most efficiently. It will be empty if - there are no more results. - total: - type: string - format: uint64 - title: >- - total is total number of results available if - PageRequest.count_total + type: object + properties: + chain_id: + type: string + title: chain_id is the ID of the chain + latest_header: + title: >- + latest_header is the latest header in CZ's canonical + chain + type: object + properties: + chain_id: + type: string + title: chain_id is the unique ID of the chain + hash: + type: string + format: byte + title: hash is the hash of this header + height: + type: string + format: uint64 + title: >- + height is the height of this header on CZ ledger - was set, its value is undefined otherwise - description: >- - PageResponse is to be embedded in gRPC response messages where - the + (hash, height) jointly provides the position of the + header on CZ ledger + babylon_header: + title: >- + babylon_header is the header of the babylon block + that includes this CZ - corresponding request message has used PageRequest. + header + type: object + properties: + version: + title: basic block info + type: object + properties: + block: + type: string + format: uint64 + app: + type: string + format: uint64 + description: >- + Consensus captures the consensus rules for + processing a block in the blockchain, - message SomeResponse { - repeated Bar results = 1; - PageResponse page = 2; - } - title: >- - QueryChainListResponse is response type for the Query/ChainList - RPC method + including all blockchain data structures and the + rules of the application's + + state transition machine. + chain_id: + type: string + height: + type: string + format: int64 + time: + type: string + format: date-time + last_block_id: + title: prev block info + type: object + properties: + hash: + type: string + format: byte + part_set_header: + type: object + properties: + total: + type: integer + format: int64 + hash: + type: string + format: byte + title: PartsetHeader + last_commit_hash: + type: string + format: byte + title: hashes of block data + data_hash: + type: string + format: byte + validators_hash: + type: string + format: byte + title: hashes from the app output from the prev block + next_validators_hash: + type: string + format: byte + consensus_hash: + type: string + format: byte + app_hash: + type: string + format: byte + last_results_hash: + type: string + format: byte + evidence_hash: + type: string + format: byte + title: consensus info + proposer_address: + type: string + format: byte + description: Header defines the structure of a block header. + babylon_epoch: + type: string + format: uint64 + title: >- + epoch is the epoch number of this header on Babylon + ledger + babylon_tx_hash: + type: string + format: byte + title: >- + babylon_tx_hash is the hash of the tx that includes + this header + + (babylon_block_height, babylon_tx_hash) jointly + provides the position of + + the header on Babylon ledger + latest_forks: + title: >- + latest_forks is the latest forks, formed as a series of + IndexedHeader (from + + low to high) + type: object + properties: + headers: + type: array + items: + type: object + properties: + chain_id: + type: string + title: chain_id is the unique ID of the chain + hash: + type: string + format: byte + title: hash is the hash of this header + height: + type: string + format: uint64 + title: >- + height is the height of this header on CZ + ledger + + (hash, height) jointly provides the position + of the header on CZ ledger + babylon_header: + title: >- + babylon_header is the header of the babylon + block that includes this CZ + + header + type: object + properties: + version: + title: basic block info + type: object + properties: + block: + type: string + format: uint64 + app: + type: string + format: uint64 + description: >- + Consensus captures the consensus rules for + processing a block in the blockchain, + + including all blockchain data structures + and the rules of the application's + + state transition machine. + chain_id: + type: string + height: + type: string + format: int64 + time: + type: string + format: date-time + last_block_id: + title: prev block info + type: object + properties: + hash: + type: string + format: byte + part_set_header: + type: object + properties: + total: + type: integer + format: int64 + hash: + type: string + format: byte + title: PartsetHeader + last_commit_hash: + type: string + format: byte + title: hashes of block data + data_hash: + type: string + format: byte + validators_hash: + type: string + format: byte + title: >- + hashes from the app output from the prev + block + next_validators_hash: + type: string + format: byte + consensus_hash: + type: string + format: byte + app_hash: + type: string + format: byte + last_results_hash: + type: string + format: byte + evidence_hash: + type: string + format: byte + title: consensus info + proposer_address: + type: string + format: byte + description: >- + Header defines the structure of a block + header. + babylon_epoch: + type: string + format: uint64 + title: >- + epoch is the epoch number of this header on + Babylon ledger + babylon_tx_hash: + type: string + format: byte + title: >- + babylon_tx_hash is the hash of the tx that + includes this header + + (babylon_block_height, babylon_tx_hash) + jointly provides the position of + + the header on Babylon ledger + title: IndexedHeader is the metadata of a CZ header + title: >- + blocks is the list of non-canonical indexed headers + at the same height + description: >- + Forks is a list of non-canonical `IndexedHeader`s at the + same height. + + For example, assuming the following blockchain + + ``` + + A <- B <- C <- D <- E + \ -- D1 + \ -- D2 + ``` + + Then the fork will be {[D1, D2]} where each item is in + struct `IndexedBlock`. + + + Note that each `IndexedHeader` in the fork should have a + valid quorum + + certificate. Such forks exist since Babylon considers + CZs might have + + dishonest majority. Also note that the IBC-Go + implementation will only + + consider the first header in a fork valid, since the + subsequent headers + + cannot be verified without knowing the validator set in + the previous header. + timestamped_headers_count: + type: string + format: uint64 + title: >- + timestamped_headers_count is the number of timestamped + headers in CZ's + + canonical chain + title: ChainInfo is the information of a CZ + description: >- + QueryChainsInfoResponse is response type for the Query/ChainsInfo + RPC method. default: description: An unexpected error response. schema: @@ -7252,10 +7196,6 @@ paths: if (any.is(Foo.class)) { foo = any.unpack(Foo.class); } - // or ... - if (any.isSameTypeAs(Foo.getDefaultInstance())) { - foo = any.unpack(Foo.getDefaultInstance()); - } Example 3: Pack and unpack a message in Python. @@ -7295,6 +7235,7 @@ paths: name "y.z". + JSON @@ -7334,62 +7275,13 @@ paths: "value": "1.212s" } parameters: - - name: pagination.key - description: |- - key is a value returned in PageResponse.next_key to begin - querying the next page most efficiently. Only one of offset or key - should be set. - in: query - required: false - type: string - format: byte - - name: pagination.offset - description: >- - offset is a numeric offset that can be used when key is unavailable. - - It is less efficient than using key. Only one of offset or key - should - - be set. - in: query - required: false - type: string - format: uint64 - - name: pagination.limit - description: >- - limit is the total number of results to be returned in the result - page. - - If left empty it will default to a value to be set by each app. + - name: chain_ids in: query required: false - type: string - format: uint64 - - name: pagination.count_total - description: >- - count_total is set to true to indicate that the result set should - include - - a count of the total number of items available for pagination in - UIs. - - count_total is only respected when offset is used. It is ignored - when key - - is set. - in: query - required: false - type: boolean - - name: pagination.reverse - description: >- - reverse is set to true if results are to be returned in the - descending order. - - - Since: cosmos-sdk 0.43 - in: query - required: false - type: boolean + type: array + items: + type: string + collectionFormat: multi tags: - Query /babylon/zoneconcierge/v1/finalized_chain_info/{chain_id}: @@ -7405,7 +7297,6 @@ paths: type: object properties: finalized_chain_info: - title: finalized_chain_info is the info of the CZ type: object properties: chain_id: @@ -7701,6 +7592,7 @@ paths: headers in CZ's canonical chain + title: ChainInfo is the information of a CZ epoch_info: title: epoch_info is the metadata of the last BTC-finalised epoch type: object @@ -8286,10 +8178,6 @@ paths: if (any.is(Foo.class)) { foo = any.unpack(Foo.class); } - // or ... - if (any.isSameTypeAs(Foo.getDefaultInstance())) { - foo = any.unpack(Foo.getDefaultInstance()); - } Example 3: Pack and unpack a message in Python. @@ -8329,6 +8217,7 @@ paths: name "y.z". + JSON @@ -8397,7 +8286,6 @@ paths: type: object properties: finalized_chain_info: - title: finalized_chain_info is the info of the CZ type: object properties: chain_id: @@ -8693,6 +8581,7 @@ paths: headers in CZ's canonical chain + title: ChainInfo is the information of a CZ epoch_info: title: epoch_info is the metadata of the last BTC-finalised epoch type: object @@ -9280,10 +9169,6 @@ paths: if (any.is(Foo.class)) { foo = any.unpack(Foo.class); } - // or ... - if (any.isSameTypeAs(Foo.getDefaultInstance())) { - foo = any.unpack(Foo.getDefaultInstance()); - } Example 3: Pack and unpack a message in Python. @@ -9323,6 +9208,7 @@ paths: name "y.z". + JSON @@ -9668,10 +9554,6 @@ paths: if (any.is(Foo.class)) { foo = any.unpack(Foo.class); } - // or ... - if (any.isSameTypeAs(Foo.getDefaultInstance())) { - foo = any.unpack(Foo.getDefaultInstance()); - } Example 3: Pack and unpack a message in Python. @@ -9711,6 +9593,7 @@ paths: name "y.z". + JSON @@ -10063,10 +9946,6 @@ paths: if (any.is(Foo.class)) { foo = any.unpack(Foo.class); } - // or ... - if (any.isSameTypeAs(Foo.getDefaultInstance())) { - foo = any.unpack(Foo.getDefaultInstance()); - } Example 3: Pack and unpack a message in Python. @@ -10106,6 +9985,7 @@ paths: name "y.z". + JSON @@ -10156,218 +10036,6 @@ paths: format: uint64 tags: - Query - /babylon/zoneconcierge/v1/params: - get: - summary: Parameters queries the parameters of the module. - operationId: ZoneConciergeParams - responses: - '200': - description: A successful response. - schema: - type: object - properties: - params: - description: params holds all the parameters of this module. - type: object - description: >- - QueryParamsResponse is response type for the Query/Params RPC - method. - default: - description: An unexpected error response. - schema: - type: object - properties: - error: - type: string - code: - type: integer - format: int32 - message: - type: string - details: - type: array - items: - type: object - properties: - type_url: - type: string - description: >- - A URL/resource name that uniquely identifies the type of - the serialized - - protocol buffer message. This string must contain at - least - - one "/" character. The last segment of the URL's path - must represent - - the fully qualified name of the type (as in - - `path/google.protobuf.Duration`). The name should be in - a canonical form - - (e.g., leading "." is not accepted). - - - In practice, teams usually precompile into the binary - all types that they - - expect it to use in the context of Any. However, for - URLs which use the - - scheme `http`, `https`, or no scheme, one can optionally - set up a type - - server that maps type URLs to message definitions as - follows: - - - * If no scheme is provided, `https` is assumed. - - * An HTTP GET on the URL must yield a - [google.protobuf.Type][] - value in binary format, or produce an error. - * Applications are allowed to cache lookup results based - on the - URL, or have them precompiled into a binary to avoid any - lookup. Therefore, binary compatibility needs to be preserved - on changes to types. (Use versioned type names to manage - breaking changes.) - - Note: this functionality is not currently available in - the official - - protobuf release, and it is not used for type URLs - beginning with - - type.googleapis.com. - - - Schemes other than `http`, `https` (or the empty scheme) - might be - - used with implementation specific semantics. - value: - type: string - format: byte - description: >- - Must be a valid serialized protocol buffer of the above - specified type. - description: >- - `Any` contains an arbitrary serialized protocol buffer - message along with a - - URL that describes the type of the serialized message. - - - Protobuf library provides support to pack/unpack Any values - in the form - - of utility functions or additional generated methods of the - Any type. - - - Example 1: Pack and unpack a message in C++. - - Foo foo = ...; - Any any; - any.PackFrom(foo); - ... - if (any.UnpackTo(&foo)) { - ... - } - - Example 2: Pack and unpack a message in Java. - - Foo foo = ...; - Any any = Any.pack(foo); - ... - if (any.is(Foo.class)) { - foo = any.unpack(Foo.class); - } - // or ... - if (any.isSameTypeAs(Foo.getDefaultInstance())) { - foo = any.unpack(Foo.getDefaultInstance()); - } - - Example 3: Pack and unpack a message in Python. - - foo = Foo(...) - any = Any() - any.Pack(foo) - ... - if any.Is(Foo.DESCRIPTOR): - any.Unpack(foo) - ... - - Example 4: Pack and unpack a message in Go - - foo := &pb.Foo{...} - any, err := anypb.New(foo) - if err != nil { - ... - } - ... - foo := &pb.Foo{} - if err := any.UnmarshalTo(foo); err != nil { - ... - } - - The pack methods provided by protobuf library will by - default use - - 'type.googleapis.com/full.type.name' as the type URL and the - unpack - - methods only use the fully qualified type name after the - last '/' - - in the type URL, for example "foo.bar.com/x/y.z" will yield - type - - name "y.z". - - - JSON - - - The JSON representation of an `Any` value uses the regular - - representation of the deserialized, embedded message, with - an - - additional field `@type` which contains the type URL. - Example: - - package google.profile; - message Person { - string first_name = 1; - string last_name = 2; - } - - { - "@type": "type.googleapis.com/google.profile.Person", - "firstName": , - "lastName": - } - - If the embedded message type is well-known and has a custom - JSON - - representation, that representation will be embedded adding - a field - - `value` which holds the custom JSON in addition to the - `@type` - - field. Example (for message [google.protobuf.Duration][]): - - { - "@type": "type.googleapis.com/google.protobuf.Duration", - "value": "1.212s" - } - tags: - - Query definitions: babylon.btccheckpoint.v1.BTCCheckpointInfo: type: object @@ -10534,6 +10202,13 @@ definitions: has dishonest majority and is stalling checkpoints (w in research paper) + checkpoint_tag: + type: string + title: >- + 4byte tag in hex format, required to be present in the OP_RETURN + transaction + + related to babylon description: Params defines the parameters for the module. babylon.btccheckpoint.v1.QueryBtcCheckpointInfoResponse: type: object @@ -10910,6 +10585,13 @@ definitions: has dishonest majority and is stalling checkpoints (w in research paper) + checkpoint_tag: + type: string + title: >- + 4byte tag in hex format, required to be present in the OP_RETURN + transaction + + related to babylon description: QueryParamsResponse is response type for the Query/Params RPC method. babylon.btccheckpoint.v1.SubmissionKey: type: object @@ -11170,10 +10852,6 @@ definitions: if (any.is(Foo.class)) { foo = any.unpack(Foo.class); } - // or ... - if (any.isSameTypeAs(Foo.getDefaultInstance())) { - foo = any.unpack(Foo.getDefaultInstance()); - } Example 3: Pack and unpack a message in Python. @@ -11209,6 +10887,7 @@ definitions: name "y.z". + JSON @@ -11349,10 +11028,6 @@ definitions: if (any.is(Foo.class)) { foo = any.unpack(Foo.class); } - // or ... - if (any.isSameTypeAs(Foo.getDefaultInstance())) { - foo = any.unpack(Foo.getDefaultInstance()); - } Example 3: Pack and unpack a message in Python. @@ -11388,6 +11063,7 @@ definitions: name "y.z". + JSON @@ -11447,9 +11123,6 @@ definitions: - Total work spent on the header. This is the sum of the work corresponding to the header Bits field and the total work of the header. - babylon.btclightclient.v1.Params: - type: object - description: Params defines the parameters for the module. babylon.btclightclient.v1.QueryBaseHeaderResponse: type: object properties: @@ -11593,13 +11266,6 @@ definitions: description: >- QueryMainChainResponse is response type for the Query/MainChain RPC method. - babylon.btclightclient.v1.QueryParamsResponse: - type: object - properties: - params: - description: params holds all the parameters of this module. - type: object - description: QueryParamsResponse is response type for the Query/Params RPC method. babylon.btclightclient.v1.QueryTipResponse: type: object properties: @@ -12360,10 +12026,6 @@ definitions: if (any.is(Foo.class)) { foo = any.unpack(Foo.class); } - // or ... - if (any.isSameTypeAs(Foo.getDefaultInstance())) { - foo = any.unpack(Foo.getDefaultInstance()); - } Example 3: Pack and unpack a message in Python. @@ -12403,6 +12065,7 @@ definitions: name "y.z". + JSON @@ -13049,10 +12712,6 @@ definitions: if (any.is(Foo.class)) { foo = any.unpack(Foo.class); } - // or ... - if (any.isSameTypeAs(Foo.getDefaultInstance())) { - foo = any.unpack(Foo.getDefaultInstance()); - } Example 3: Pack and unpack a message in Python. @@ -13092,6 +12751,7 @@ definitions: name "y.z". + JSON @@ -13509,10 +13169,6 @@ definitions: if (any.is(Foo.class)) { foo = any.unpack(Foo.class); } - // or ... - if (any.isSameTypeAs(Foo.getDefaultInstance())) { - foo = any.unpack(Foo.getDefaultInstance()); - } Example 3: Pack and unpack a message in Python. @@ -13549,6 +13205,7 @@ definitions: name "y.z". + JSON @@ -13870,10 +13527,6 @@ definitions: if (any.is(Foo.class)) { foo = any.unpack(Foo.class); } - // or ... - if (any.isSameTypeAs(Foo.getDefaultInstance())) { - foo = any.unpack(Foo.getDefaultInstance()); - } Example 3: Pack and unpack a message in Python. @@ -13913,6 +13566,7 @@ definitions: name "y.z". + JSON @@ -14359,10 +14013,6 @@ definitions: if (any.is(Foo.class)) { foo = any.unpack(Foo.class); } - // or ... - if (any.isSameTypeAs(Foo.getDefaultInstance())) { - foo = any.unpack(Foo.getDefaultInstance()); - } Example 3: Pack and unpack a message in Python. @@ -14398,6 +14048,7 @@ definitions: name "y.z". + JSON @@ -14664,9 +14315,6 @@ definitions: - CKPT_STATUS_SUBMITTED: SUBMITTED defines a checkpoint that is included on BTC. - CKPT_STATUS_CONFIRMED: CONFIRMED defines a checkpoint that is k-deep on BTC. - CKPT_STATUS_FINALIZED: FINALIZED defines a checkpoint that is w-deep on BTC. - babylon.checkpointing.v1.Params: - type: object - description: Params defines the parameters for the module. babylon.checkpointing.v1.QueryBlsPublicKeyListResponse: type: object properties: @@ -14769,13 +14417,6 @@ definitions: description: |- QueryLastCheckpointWithStatusResponse is the response type for the Query/LastCheckpointWithStatus RPC method. - babylon.checkpointing.v1.QueryParamsResponse: - type: object - properties: - params: - description: params holds all the parameters of this module. - type: object - description: QueryParamsResponse is response type for the Query/Params RPC method. babylon.checkpointing.v1.QueryRawCheckpointListResponse: type: object properties: @@ -15749,9 +15390,6 @@ definitions: the header on Babylon ledger title: IndexedHeader is the metadata of a CZ header - babylon.zoneconcierge.v1.Params: - type: object - description: Params defines the parameters for the module. babylon.zoneconcierge.v1.ProofEpochSealed: type: object properties: @@ -16066,341 +15704,343 @@ definitions: title: |- ProofFinalizedChainInfo is a set of proofs that attest a chain info is BTC-finalised - babylon.zoneconcierge.v1.QueryChainInfoResponse: + babylon.zoneconcierge.v1.QueryChainListResponse: type: object properties: - chain_info: - title: chain_info is the info of the CZ + chain_ids: + type: array + items: + type: string + title: chain_ids are IDs of the chains in ascending alphabetical order + pagination: + title: pagination defines the pagination in the response type: object properties: - chain_id: + next_key: type: string - title: chain_id is the ID of the chain - latest_header: - title: latest_header is the latest header in CZ's canonical chain - type: object - properties: - chain_id: - type: string - title: chain_id is the unique ID of the chain - hash: - type: string - format: byte - title: hash is the hash of this header - height: - type: string - format: uint64 - title: >- - height is the height of this header on CZ ledger - - (hash, height) jointly provides the position of the header on - CZ ledger - babylon_header: - title: >- - babylon_header is the header of the babylon block that - includes this CZ - - header - type: object - properties: - version: - title: basic block info - type: object - properties: - block: - type: string - format: uint64 - app: - type: string - format: uint64 - description: >- - Consensus captures the consensus rules for processing a - block in the blockchain, - - including all blockchain data structures and the rules of - the application's + format: byte + description: |- + next_key is the key to be passed to PageRequest.key to + query the next page most efficiently. It will be empty if + there are no more results. + total: + type: string + format: uint64 + title: >- + total is total number of results available if + PageRequest.count_total - state transition machine. - chain_id: - type: string - height: - type: string - format: int64 - time: - type: string - format: date-time - last_block_id: - title: prev block info - type: object - properties: - hash: - type: string - format: byte - part_set_header: - type: object - properties: - total: - type: integer - format: int64 - hash: - type: string - format: byte - title: PartsetHeader - last_commit_hash: - type: string - format: byte - title: hashes of block data - data_hash: - type: string - format: byte - validators_hash: - type: string - format: byte - title: hashes from the app output from the prev block - next_validators_hash: - type: string - format: byte - consensus_hash: - type: string - format: byte - app_hash: - type: string - format: byte - last_results_hash: - type: string - format: byte - evidence_hash: - type: string - format: byte - title: consensus info - proposer_address: - type: string - format: byte - description: Header defines the structure of a block header. - babylon_epoch: - type: string - format: uint64 - title: epoch is the epoch number of this header on Babylon ledger - babylon_tx_hash: - type: string - format: byte - title: >- - babylon_tx_hash is the hash of the tx that includes this - header + was set, its value is undefined otherwise + description: |- + PageResponse is to be embedded in gRPC response messages where the + corresponding request message has used PageRequest. - (babylon_block_height, babylon_tx_hash) jointly provides the - position of + message SomeResponse { + repeated Bar results = 1; + PageResponse page = 2; + } + title: QueryChainListResponse is response type for the Query/ChainList RPC method + babylon.zoneconcierge.v1.QueryChainsInfoResponse: + type: object + properties: + chains_info: + type: array + items: + type: object + properties: + chain_id: + type: string + title: chain_id is the ID of the chain + latest_header: + title: latest_header is the latest header in CZ's canonical chain + type: object + properties: + chain_id: + type: string + title: chain_id is the unique ID of the chain + hash: + type: string + format: byte + title: hash is the hash of this header + height: + type: string + format: uint64 + title: >- + height is the height of this header on CZ ledger - the header on Babylon ledger - latest_forks: - title: >- - latest_forks is the latest forks, formed as a series of - IndexedHeader (from + (hash, height) jointly provides the position of the header + on CZ ledger + babylon_header: + title: >- + babylon_header is the header of the babylon block that + includes this CZ - low to high) - type: object - properties: - headers: - type: array - items: + header type: object properties: + version: + title: basic block info + type: object + properties: + block: + type: string + format: uint64 + app: + type: string + format: uint64 + description: >- + Consensus captures the consensus rules for processing a + block in the blockchain, + + including all blockchain data structures and the rules + of the application's + + state transition machine. chain_id: type: string - title: chain_id is the unique ID of the chain - hash: - type: string - format: byte - title: hash is the hash of this header height: type: string - format: uint64 - title: >- - height is the height of this header on CZ ledger - - (hash, height) jointly provides the position of the - header on CZ ledger - babylon_header: - title: >- - babylon_header is the header of the babylon block that - includes this CZ - - header + format: int64 + time: + type: string + format: date-time + last_block_id: + title: prev block info type: object properties: - version: - title: basic block info - type: object - properties: - block: - type: string - format: uint64 - app: - type: string - format: uint64 - description: >- - Consensus captures the consensus rules for - processing a block in the blockchain, - - including all blockchain data structures and the - rules of the application's - - state transition machine. - chain_id: - type: string - height: - type: string - format: int64 - time: + hash: type: string - format: date-time - last_block_id: - title: prev block info + format: byte + part_set_header: type: object properties: - hash: - type: string - format: byte - part_set_header: - type: object - properties: - total: - type: integer - format: int64 - hash: - type: string - format: byte - title: PartsetHeader - last_commit_hash: - type: string - format: byte - title: hashes of block data - data_hash: - type: string - format: byte - validators_hash: - type: string - format: byte - title: hashes from the app output from the prev block - next_validators_hash: - type: string - format: byte - consensus_hash: - type: string - format: byte - app_hash: - type: string - format: byte - last_results_hash: - type: string - format: byte - evidence_hash: - type: string - format: byte - title: consensus info - proposer_address: - type: string - format: byte - description: Header defines the structure of a block header. - babylon_epoch: + total: + type: integer + format: int64 + hash: + type: string + format: byte + title: PartsetHeader + last_commit_hash: type: string - format: uint64 - title: >- - epoch is the epoch number of this header on Babylon - ledger - babylon_tx_hash: + format: byte + title: hashes of block data + data_hash: type: string format: byte - title: >- - babylon_tx_hash is the hash of the tx that includes this - header + validators_hash: + type: string + format: byte + title: hashes from the app output from the prev block + next_validators_hash: + type: string + format: byte + consensus_hash: + type: string + format: byte + app_hash: + type: string + format: byte + last_results_hash: + type: string + format: byte + evidence_hash: + type: string + format: byte + title: consensus info + proposer_address: + type: string + format: byte + description: Header defines the structure of a block header. + babylon_epoch: + type: string + format: uint64 + title: epoch is the epoch number of this header on Babylon ledger + babylon_tx_hash: + type: string + format: byte + title: >- + babylon_tx_hash is the hash of the tx that includes this + header - (babylon_block_height, babylon_tx_hash) jointly provides - the position of + (babylon_block_height, babylon_tx_hash) jointly provides the + position of - the header on Babylon ledger - title: IndexedHeader is the metadata of a CZ header - title: >- - blocks is the list of non-canonical indexed headers at the - same height - description: >- - Forks is a list of non-canonical `IndexedHeader`s at the same - height. + the header on Babylon ledger + latest_forks: + title: >- + latest_forks is the latest forks, formed as a series of + IndexedHeader (from - For example, assuming the following blockchain + low to high) + type: object + properties: + headers: + type: array + items: + type: object + properties: + chain_id: + type: string + title: chain_id is the unique ID of the chain + hash: + type: string + format: byte + title: hash is the hash of this header + height: + type: string + format: uint64 + title: >- + height is the height of this header on CZ ledger - ``` + (hash, height) jointly provides the position of the + header on CZ ledger + babylon_header: + title: >- + babylon_header is the header of the babylon block that + includes this CZ - A <- B <- C <- D <- E - \ -- D1 - \ -- D2 - ``` + header + type: object + properties: + version: + title: basic block info + type: object + properties: + block: + type: string + format: uint64 + app: + type: string + format: uint64 + description: >- + Consensus captures the consensus rules for + processing a block in the blockchain, - Then the fork will be {[D1, D2]} where each item is in struct - `IndexedBlock`. + including all blockchain data structures and the + rules of the application's + + state transition machine. + chain_id: + type: string + height: + type: string + format: int64 + time: + type: string + format: date-time + last_block_id: + title: prev block info + type: object + properties: + hash: + type: string + format: byte + part_set_header: + type: object + properties: + total: + type: integer + format: int64 + hash: + type: string + format: byte + title: PartsetHeader + last_commit_hash: + type: string + format: byte + title: hashes of block data + data_hash: + type: string + format: byte + validators_hash: + type: string + format: byte + title: hashes from the app output from the prev block + next_validators_hash: + type: string + format: byte + consensus_hash: + type: string + format: byte + app_hash: + type: string + format: byte + last_results_hash: + type: string + format: byte + evidence_hash: + type: string + format: byte + title: consensus info + proposer_address: + type: string + format: byte + description: Header defines the structure of a block header. + babylon_epoch: + type: string + format: uint64 + title: >- + epoch is the epoch number of this header on Babylon + ledger + babylon_tx_hash: + type: string + format: byte + title: >- + babylon_tx_hash is the hash of the tx that includes + this header + (babylon_block_height, babylon_tx_hash) jointly + provides the position of - Note that each `IndexedHeader` in the fork should have a valid - quorum + the header on Babylon ledger + title: IndexedHeader is the metadata of a CZ header + title: >- + blocks is the list of non-canonical indexed headers at the + same height + description: >- + Forks is a list of non-canonical `IndexedHeader`s at the same + height. - certificate. Such forks exist since Babylon considers CZs might - have + For example, assuming the following blockchain - dishonest majority. Also note that the IBC-Go implementation will - only + ``` - consider the first header in a fork valid, since the subsequent - headers + A <- B <- C <- D <- E + \ -- D1 + \ -- D2 + ``` - cannot be verified without knowing the validator set in the - previous header. - timestamped_headers_count: - type: string - format: uint64 - title: >- - timestamped_headers_count is the number of timestamped headers in - CZ's + Then the fork will be {[D1, D2]} where each item is in struct + `IndexedBlock`. - canonical chain - description: >- - QueryChainInfoResponse is response type for the Query/ChainInfo RPC - method. - babylon.zoneconcierge.v1.QueryChainListResponse: - type: object - properties: - chain_ids: - type: array - items: - type: string - title: chain_ids are IDs of the chains in ascending alphabetical order - pagination: - title: pagination defines the pagination in the response - type: object - properties: - next_key: - type: string - format: byte - description: |- - next_key is the key to be passed to PageRequest.key to - query the next page most efficiently. It will be empty if - there are no more results. - total: - type: string - format: uint64 - title: >- - total is total number of results available if - PageRequest.count_total - was set, its value is undefined otherwise - description: |- - PageResponse is to be embedded in gRPC response messages where the - corresponding request message has used PageRequest. + Note that each `IndexedHeader` in the fork should have a valid + quorum - message SomeResponse { - repeated Bar results = 1; - PageResponse page = 2; - } - title: QueryChainListResponse is response type for the Query/ChainList RPC method + certificate. Such forks exist since Babylon considers CZs might + have + + dishonest majority. Also note that the IBC-Go implementation + will only + + consider the first header in a fork valid, since the subsequent + headers + + cannot be verified without knowing the validator set in the + previous header. + timestamped_headers_count: + type: string + format: uint64 + title: >- + timestamped_headers_count is the number of timestamped headers + in CZ's + + canonical chain + title: ChainInfo is the information of a CZ + description: >- + QueryChainsInfoResponse is response type for the Query/ChainsInfo RPC + method. babylon.zoneconcierge.v1.QueryEpochChainInfoResponse: type: object properties: @@ -16706,7 +16346,6 @@ definitions: type: object properties: finalized_chain_info: - title: finalized_chain_info is the info of the CZ type: object properties: chain_id: @@ -16998,6 +16637,7 @@ definitions: CZ's canonical chain + title: ChainInfo is the information of a CZ epoch_info: title: epoch_info is the metadata of the last BTC-finalised epoch type: object @@ -17467,7 +17107,6 @@ definitions: type: object properties: finalized_chain_info: - title: finalized_chain_info is the info of the CZ type: object properties: chain_id: @@ -17759,6 +17398,7 @@ definitions: CZ's canonical chain + title: ChainInfo is the information of a CZ epoch_info: title: epoch_info is the metadata of the last BTC-finalised epoch type: object @@ -18493,7 +18133,7 @@ definitions: cannot be verified without knowing the validator set in the previous header. - description: QueryParamsResponse is response type for the Query/Header RPC method. + description: QueryHeaderResponse is response type for the Query/Header RPC method. babylon.zoneconcierge.v1.QueryListEpochHeadersResponse: type: object properties: @@ -18771,13 +18411,6 @@ definitions: description: |- QueryListHeadersResponse is response type for the Query/ListHeaders RPC method. - babylon.zoneconcierge.v1.QueryParamsResponse: - type: object - properties: - params: - description: params holds all the parameters of this module. - type: object - description: QueryParamsResponse is response type for the Query/Params RPC method. tendermint.crypto.Proof: type: object properties: diff --git a/proto/babylon/zoneconcierge/v1/query.proto b/proto/babylon/zoneconcierge/v1/query.proto index 06a0d4b27..0a33dea00 100644 --- a/proto/babylon/zoneconcierge/v1/query.proto +++ b/proto/babylon/zoneconcierge/v1/query.proto @@ -22,9 +22,9 @@ service Query { option (google.api.http).get = "/babylon/zoneconcierge/v1/chains"; } // ChainInfo queries the latest info of a chain in Babylon's view - rpc ChainInfo(QueryChainInfoRequest) returns (QueryChainInfoResponse) { + rpc ChainsInfo(QueryChainsInfoRequest) returns (QueryChainsInfoResponse) { option (google.api.http).get = - "/babylon/zoneconcierge/v1/chain_info/{chain_id}"; + "/babylon/zoneconcierge/v1/chains_info"; } // EpochChainInfo queries the latest info of a chain in a given epoch of // Babylon's view @@ -88,13 +88,12 @@ message QueryChainListResponse { cosmos.base.query.v1beta1.PageResponse pagination = 2; } -// QueryChainInfoRequest is request type for the Query/ChainInfo RPC method. -message QueryChainInfoRequest { string chain_id = 1; } +// QueryChainsInfoRequest is request type for the Query/ChainsInfo RPC method. +message QueryChainsInfoRequest { repeated string chain_ids = 1; } -// QueryChainInfoResponse is response type for the Query/ChainInfo RPC method. -message QueryChainInfoResponse { - // chain_info is the info of the CZ - babylon.zoneconcierge.v1.ChainInfo chain_info = 1; +// QueryChainsInfoResponse is response type for the Query/ChainsInfo RPC method. +message QueryChainsInfoResponse { + repeated babylon.zoneconcierge.v1.ChainInfo chains_info = 1; } // QueryEpochChainInfoRequest is request type for the Query/EpochChainInfo RPC diff --git a/test/e2e/configurer/chain/queries.go b/test/e2e/configurer/chain/queries.go index 438df18aa..58af85ccb 100644 --- a/test/e2e/configurer/chain/queries.go +++ b/test/e2e/configurer/chain/queries.go @@ -209,15 +209,14 @@ func (n *NodeConfig) QueryCheckpointChains() (*[]string, error) { return &chainsResponse.ChainIds, nil } -func (n *NodeConfig) QueryCheckpointChainInfo(chainId string) (*zctypes.ChainInfo, error) { - infoPath := fmt.Sprintf("/babylon/zoneconcierge/v1/chain_info/%s", chainId) - bz, err := n.QueryGRPCGateway(infoPath) +func (n *NodeConfig) QueryCheckpointChainsInfo(chainID string) ([]*zctypes.ChainInfo, error) { + bz, err := n.QueryGRPCGateway("/babylon/zoneconcierge/v1/chains_info", "chain_ids", chainID) require.NoError(n.t, err) - var infoResponse zctypes.QueryChainInfoResponse + var infoResponse zctypes.QueryChainsInfoResponse if err := util.Cdc.UnmarshalJSON(bz, &infoResponse); err != nil { return nil, err } - return infoResponse.ChainInfo, nil + return infoResponse.ChainsInfo, nil } func (n *NodeConfig) QueryCurrentEpoch() (uint64, error) { diff --git a/test/e2e/e2e_test.go b/test/e2e/e2e_test.go index e1344e622..e70e0b01a 100644 --- a/test/e2e/e2e_test.go +++ b/test/e2e/e2e_test.go @@ -29,6 +29,11 @@ func (s *IntegrationTestSuite) TestIbcCheckpointing() { nonValidatorNode, err := chainA.GetNodeAtIndex(2) s.NoError(err) + // Query checkpoint chain info for opposing chain + chainInfo, err := nonValidatorNode.QueryCheckpointChainsInfo(initialization.ChainBID) + s.NoError(err) + s.Equal(chainInfo[0].ChainId, initialization.ChainBID) + // Finalize epoch 1,2,3 , as first headers of opposing chain are in epoch 3 nonValidatorNode.FinalizeSealedEpochs(1, 3) diff --git a/x/zoneconcierge/client/cli/query.go b/x/zoneconcierge/client/cli/query.go index 0ecf92e7a..98d9e74ca 100644 --- a/x/zoneconcierge/client/cli/query.go +++ b/x/zoneconcierge/client/cli/query.go @@ -2,13 +2,11 @@ package cli import ( "fmt" - // "strings" + "github.com/cosmos/cosmos-sdk/client/flags" "github.com/spf13/cobra" "github.com/cosmos/cosmos-sdk/client" - // "github.com/cosmos/cosmos-sdk/client/flags" - // sdk "github.com/cosmos/cosmos-sdk/types" "github.com/babylonchain/babylon/x/zoneconcierge/types" ) @@ -24,5 +22,28 @@ func GetQueryCmd(queryRoute string) *cobra.Command { RunE: client.ValidateCmd, } + cmd.AddCommand(CmdChainsInfo()) + return cmd +} + +func CmdChainsInfo() *cobra.Command { + cmd := &cobra.Command{ + Use: "chains-info ", + Short: "retrieves the latest info for a list of chains with given IDs", + Args: cobra.ArbitraryArgs, + RunE: func(cmd *cobra.Command, args []string) error { + clientCtx := client.GetClientContextFromCmd(cmd) + queryClient := types.NewQueryClient(clientCtx) + req := types.QueryChainsInfoRequest{ChainIds: args} + resp, err := queryClient.ChainsInfo(cmd.Context(), &req) + if err != nil { + return err + } + + return clientCtx.PrintProto(resp) + }, + } + + flags.AddQueryFlagsToCmd(cmd) return cmd } diff --git a/x/zoneconcierge/keeper/grpc_query.go b/x/zoneconcierge/keeper/grpc_query.go index e1aac72ff..8acc2efd4 100644 --- a/x/zoneconcierge/keeper/grpc_query.go +++ b/x/zoneconcierge/keeper/grpc_query.go @@ -3,15 +3,18 @@ package keeper import ( "context" - "github.com/babylonchain/babylon/x/zoneconcierge/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/query" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" + + "github.com/babylonchain/babylon/x/zoneconcierge/types" ) var _ types.QueryServer = Keeper{} +const maxQueryChainsInfoLimit = 100 + func (k Keeper) ChainList(c context.Context, req *types.QueryChainListRequest) (*types.QueryChainListResponse, error) { if req == nil { return nil, status.Error(codes.InvalidArgument, "invalid request") @@ -37,24 +40,46 @@ func (k Keeper) ChainList(c context.Context, req *types.QueryChainListRequest) ( return resp, nil } -// ChainInfo returns the latest info of a chain with given ID -func (k Keeper) ChainInfo(c context.Context, req *types.QueryChainInfoRequest) (*types.QueryChainInfoResponse, error) { +// ChainsInfo returns the latest info for a list of chains with given IDs +func (k Keeper) ChainsInfo(c context.Context, req *types.QueryChainsInfoRequest) (*types.QueryChainsInfoResponse, error) { if req == nil { return nil, status.Error(codes.InvalidArgument, "invalid request") } - if len(req.ChainId) == 0 { - return nil, status.Error(codes.InvalidArgument, "chain ID cannot be empty") + if len(req.ChainIds) == 0 { + return nil, status.Error(codes.InvalidArgument, "chain IDs cannot be empty") + } + + if len(req.ChainIds) > maxQueryChainsInfoLimit { + return nil, status.Errorf(codes.InvalidArgument, "cannot query more than %d chains", maxQueryChainsInfoLimit) + } + + encountered := map[string]bool{} + for _, chainID := range req.ChainIds { + if len(chainID) == 0 { + return nil, status.Error(codes.InvalidArgument, "chain ID cannot be empty") + } + + // check for duplicates and return error on first duplicate found + if encountered[chainID] { + return nil, status.Errorf(codes.InvalidArgument, "duplicate chain ID %s", chainID) + } else { + encountered[chainID] = true + } } ctx := sdk.UnwrapSDKContext(c) + var chainsInfo []*types.ChainInfo + for _, chainID := range req.ChainIds { + chainInfo, err := k.GetChainInfo(ctx, chainID) + if err != nil { + return nil, err + } - // find the chain info of this epoch - chainInfo, err := k.GetChainInfo(ctx, req.ChainId) - if err != nil { - return nil, err + chainsInfo = append(chainsInfo, chainInfo) } - resp := &types.QueryChainInfoResponse{ChainInfo: chainInfo} + + resp := &types.QueryChainsInfoResponse{ChainsInfo: chainsInfo} return resp, nil } diff --git a/x/zoneconcierge/keeper/grpc_query_test.go b/x/zoneconcierge/keeper/grpc_query_test.go index 5903cdfb3..31483706f 100644 --- a/x/zoneconcierge/keeper/grpc_query_test.go +++ b/x/zoneconcierge/keeper/grpc_query_test.go @@ -4,11 +4,6 @@ import ( "math/rand" "testing" - "github.com/babylonchain/babylon/testutil/datagen" - testkeeper "github.com/babylonchain/babylon/testutil/keeper" - btcctypes "github.com/babylonchain/babylon/x/btccheckpoint/types" - checkpointingtypes "github.com/babylonchain/babylon/x/checkpointing/types" - zctypes "github.com/babylonchain/babylon/x/zoneconcierge/types" tmcrypto "github.com/cometbft/cometbft/proto/tendermint/crypto" tmrpctypes "github.com/cometbft/cometbft/rpc/core/types" tmtypes "github.com/cometbft/cometbft/types" @@ -16,6 +11,12 @@ import ( ibctmtypes "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" "github.com/golang/mock/gomock" "github.com/stretchr/testify/require" + + "github.com/babylonchain/babylon/testutil/datagen" + testkeeper "github.com/babylonchain/babylon/testutil/keeper" + btcctypes "github.com/babylonchain/babylon/x/btccheckpoint/types" + checkpointingtypes "github.com/babylonchain/babylon/x/checkpointing/types" + zctypes "github.com/babylonchain/babylon/x/zoneconcierge/types" ) func FuzzChainList(f *testing.F) { @@ -65,29 +66,52 @@ func FuzzChainList(f *testing.F) { }) } -func FuzzChainInfo(f *testing.F) { +func FuzzChainsInfo(f *testing.F) { datagen.AddRandomSeedsToFuzzer(f, 10) + type chainInfo struct { + chainID string + numHeaders uint64 + numForkHeaders uint64 + } f.Fuzz(func(t *testing.T, seed int64) { r := rand.New(rand.NewSource(seed)) - _, babylonChain, czChain, babylonApp := SetupTest(t) + _, babylonChain, _, babylonApp := SetupTest(t) zcKeeper := babylonApp.ZoneConciergeKeeper ctx := babylonChain.GetContext() hooks := zcKeeper.Hooks() - // invoke the hook a random number of times to simulate a random number of blocks - numHeaders := datagen.RandomInt(r, 100) + 1 - numForkHeaders := datagen.RandomInt(r, 10) + 1 - SimulateHeadersAndForksViaHook(ctx, r, hooks, czChain.ChainID, 0, numHeaders, numForkHeaders) + var ( + chainsInfo []chainInfo + chainIDs []string + ) + numChains := datagen.RandomInt(r, 100) + 1 + for i := uint64(0); i < numChains; i++ { + chainID := datagen.GenRandomHexStr(r, 30) + numHeaders := datagen.RandomInt(r, 100) + 1 + numForkHeaders := datagen.RandomInt(r, 10) + 1 + SimulateHeadersAndForksViaHook(ctx, r, hooks, chainID, 0, numHeaders, numForkHeaders) + + chainIDs = append(chainIDs, chainID) + chainsInfo = append(chainsInfo, chainInfo{ + chainID: chainID, + numHeaders: numHeaders, + numForkHeaders: numForkHeaders, + }) + } - // check if the chain info of is recorded or not - resp, err := zcKeeper.ChainInfo(ctx, &zctypes.QueryChainInfoRequest{ChainId: czChain.ChainID}) + resp, err := zcKeeper.ChainsInfo(ctx, &zctypes.QueryChainsInfoRequest{ + ChainIds: chainIDs, + }) require.NoError(t, err) - chainInfo := resp.ChainInfo - require.Equal(t, numHeaders-1, chainInfo.LatestHeader.Height) - require.Equal(t, numForkHeaders, uint64(len(chainInfo.LatestForks.Headers))) + + for i, data := range resp.ChainsInfo { + require.Equal(t, chainsInfo[i].chainID, data.ChainId) + require.Equal(t, chainsInfo[i].numHeaders-1, data.LatestHeader.Height) + require.Equal(t, chainsInfo[i].numForkHeaders, uint64(len(data.LatestForks.Headers))) + } }) } diff --git a/x/zoneconcierge/types/query.pb.go b/x/zoneconcierge/types/query.pb.go index 9841ea276..88988b821 100644 --- a/x/zoneconcierge/types/query.pb.go +++ b/x/zoneconcierge/types/query.pb.go @@ -239,23 +239,23 @@ func (m *QueryChainListResponse) GetPagination() *query.PageResponse { return nil } -// QueryChainInfoRequest is request type for the Query/ChainInfo RPC method. -type QueryChainInfoRequest struct { - ChainId string `protobuf:"bytes,1,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` +// QueryChainsInfoRequest is request type for the Query/ChainsInfo RPC method. +type QueryChainsInfoRequest struct { + ChainIds []string `protobuf:"bytes,1,rep,name=chain_ids,json=chainIds,proto3" json:"chain_ids,omitempty"` } -func (m *QueryChainInfoRequest) Reset() { *m = QueryChainInfoRequest{} } -func (m *QueryChainInfoRequest) String() string { return proto.CompactTextString(m) } -func (*QueryChainInfoRequest) ProtoMessage() {} -func (*QueryChainInfoRequest) Descriptor() ([]byte, []int) { +func (m *QueryChainsInfoRequest) Reset() { *m = QueryChainsInfoRequest{} } +func (m *QueryChainsInfoRequest) String() string { return proto.CompactTextString(m) } +func (*QueryChainsInfoRequest) ProtoMessage() {} +func (*QueryChainsInfoRequest) Descriptor() ([]byte, []int) { return fileDescriptor_cd665af90102da38, []int{4} } -func (m *QueryChainInfoRequest) XXX_Unmarshal(b []byte) error { +func (m *QueryChainsInfoRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *QueryChainInfoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *QueryChainsInfoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_QueryChainInfoRequest.Marshal(b, m, deterministic) + return xxx_messageInfo_QueryChainsInfoRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -265,43 +265,42 @@ func (m *QueryChainInfoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byt return b[:n], nil } } -func (m *QueryChainInfoRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryChainInfoRequest.Merge(m, src) +func (m *QueryChainsInfoRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryChainsInfoRequest.Merge(m, src) } -func (m *QueryChainInfoRequest) XXX_Size() int { +func (m *QueryChainsInfoRequest) XXX_Size() int { return m.Size() } -func (m *QueryChainInfoRequest) XXX_DiscardUnknown() { - xxx_messageInfo_QueryChainInfoRequest.DiscardUnknown(m) +func (m *QueryChainsInfoRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryChainsInfoRequest.DiscardUnknown(m) } -var xxx_messageInfo_QueryChainInfoRequest proto.InternalMessageInfo +var xxx_messageInfo_QueryChainsInfoRequest proto.InternalMessageInfo -func (m *QueryChainInfoRequest) GetChainId() string { +func (m *QueryChainsInfoRequest) GetChainIds() []string { if m != nil { - return m.ChainId + return m.ChainIds } - return "" + return nil } -// QueryChainInfoResponse is response type for the Query/ChainInfo RPC method. -type QueryChainInfoResponse struct { - // chain_info is the info of the CZ - ChainInfo *ChainInfo `protobuf:"bytes,1,opt,name=chain_info,json=chainInfo,proto3" json:"chain_info,omitempty"` +// QueryChainsInfoResponse is response type for the Query/ChainsInfo RPC method. +type QueryChainsInfoResponse struct { + ChainsInfo []*ChainInfo `protobuf:"bytes,1,rep,name=chains_info,json=chainsInfo,proto3" json:"chains_info,omitempty"` } -func (m *QueryChainInfoResponse) Reset() { *m = QueryChainInfoResponse{} } -func (m *QueryChainInfoResponse) String() string { return proto.CompactTextString(m) } -func (*QueryChainInfoResponse) ProtoMessage() {} -func (*QueryChainInfoResponse) Descriptor() ([]byte, []int) { +func (m *QueryChainsInfoResponse) Reset() { *m = QueryChainsInfoResponse{} } +func (m *QueryChainsInfoResponse) String() string { return proto.CompactTextString(m) } +func (*QueryChainsInfoResponse) ProtoMessage() {} +func (*QueryChainsInfoResponse) Descriptor() ([]byte, []int) { return fileDescriptor_cd665af90102da38, []int{5} } -func (m *QueryChainInfoResponse) XXX_Unmarshal(b []byte) error { +func (m *QueryChainsInfoResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *QueryChainInfoResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *QueryChainsInfoResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_QueryChainInfoResponse.Marshal(b, m, deterministic) + return xxx_messageInfo_QueryChainsInfoResponse.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -311,21 +310,21 @@ func (m *QueryChainInfoResponse) XXX_Marshal(b []byte, deterministic bool) ([]by return b[:n], nil } } -func (m *QueryChainInfoResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryChainInfoResponse.Merge(m, src) +func (m *QueryChainsInfoResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryChainsInfoResponse.Merge(m, src) } -func (m *QueryChainInfoResponse) XXX_Size() int { +func (m *QueryChainsInfoResponse) XXX_Size() int { return m.Size() } -func (m *QueryChainInfoResponse) XXX_DiscardUnknown() { - xxx_messageInfo_QueryChainInfoResponse.DiscardUnknown(m) +func (m *QueryChainsInfoResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryChainsInfoResponse.DiscardUnknown(m) } -var xxx_messageInfo_QueryChainInfoResponse proto.InternalMessageInfo +var xxx_messageInfo_QueryChainsInfoResponse proto.InternalMessageInfo -func (m *QueryChainInfoResponse) GetChainInfo() *ChainInfo { +func (m *QueryChainsInfoResponse) GetChainsInfo() []*ChainInfo { if m != nil { - return m.ChainInfo + return m.ChainsInfo } return nil } @@ -946,8 +945,8 @@ func init() { proto.RegisterType((*QueryHeaderResponse)(nil), "babylon.zoneconcierge.v1.QueryHeaderResponse") proto.RegisterType((*QueryChainListRequest)(nil), "babylon.zoneconcierge.v1.QueryChainListRequest") proto.RegisterType((*QueryChainListResponse)(nil), "babylon.zoneconcierge.v1.QueryChainListResponse") - proto.RegisterType((*QueryChainInfoRequest)(nil), "babylon.zoneconcierge.v1.QueryChainInfoRequest") - proto.RegisterType((*QueryChainInfoResponse)(nil), "babylon.zoneconcierge.v1.QueryChainInfoResponse") + proto.RegisterType((*QueryChainsInfoRequest)(nil), "babylon.zoneconcierge.v1.QueryChainsInfoRequest") + proto.RegisterType((*QueryChainsInfoResponse)(nil), "babylon.zoneconcierge.v1.QueryChainsInfoResponse") proto.RegisterType((*QueryEpochChainInfoRequest)(nil), "babylon.zoneconcierge.v1.QueryEpochChainInfoRequest") proto.RegisterType((*QueryEpochChainInfoResponse)(nil), "babylon.zoneconcierge.v1.QueryEpochChainInfoResponse") proto.RegisterType((*QueryListHeadersRequest)(nil), "babylon.zoneconcierge.v1.QueryListHeadersRequest") @@ -965,74 +964,76 @@ func init() { } var fileDescriptor_cd665af90102da38 = []byte{ - // 1071 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x57, 0x4f, 0x6f, 0x1b, 0x45, - 0x14, 0xef, 0xc6, 0x49, 0x1a, 0xbf, 0x94, 0xaa, 0x1a, 0x4a, 0x31, 0x9b, 0xd6, 0x8d, 0x16, 0x04, - 0x69, 0x15, 0x76, 0x59, 0xd3, 0x52, 0x22, 0x0e, 0x55, 0x92, 0x92, 0x34, 0x14, 0x95, 0x66, 0x21, - 0x1c, 0x10, 0x92, 0xb5, 0xbb, 0x1e, 0xdb, 0xab, 0xc4, 0x33, 0xee, 0xce, 0xda, 0xad, 0x1b, 0xc2, - 0x81, 0x4f, 0x80, 0x04, 0x07, 0xc4, 0x15, 0x09, 0x24, 0x0e, 0xfd, 0x1c, 0x20, 0xf5, 0x50, 0x89, - 0x0b, 0x47, 0x94, 0xf0, 0x35, 0x90, 0xd0, 0xce, 0xcc, 0xae, 0x77, 0xbd, 0x5e, 0xfc, 0x87, 0x1c, - 0x38, 0x70, 0xf3, 0xcc, 0xbe, 0xf7, 0x7b, 0xbf, 0xf7, 0x67, 0xde, 0x7b, 0x86, 0xd7, 0x1c, 0xdb, - 0xe9, 0x1d, 0x50, 0x62, 0x3c, 0xa1, 0x04, 0xbb, 0x94, 0xb8, 0x1e, 0xf6, 0x1b, 0xd8, 0xe8, 0x9a, - 0xc6, 0xc3, 0x0e, 0xf6, 0x7b, 0x7a, 0xdb, 0xa7, 0x01, 0x45, 0x25, 0x29, 0xa5, 0xa7, 0xa4, 0xf4, - 0xae, 0xa9, 0x5e, 0x6e, 0x50, 0xda, 0x38, 0xc0, 0x86, 0xdd, 0xf6, 0x0c, 0x9b, 0x10, 0x1a, 0xd8, - 0x81, 0x47, 0x09, 0x13, 0x7a, 0xea, 0x75, 0x97, 0xb2, 0x16, 0x65, 0x86, 0x63, 0x33, 0x2c, 0x00, - 0x8d, 0xae, 0xe9, 0xe0, 0xc0, 0x36, 0x8d, 0xb6, 0xdd, 0xf0, 0x08, 0x17, 0x96, 0xb2, 0xab, 0x11, - 0x13, 0x27, 0x70, 0xdd, 0x26, 0x76, 0xf7, 0xdb, 0xd4, 0x23, 0x41, 0xc8, 0x24, 0x75, 0x21, 0xa5, - 0xaf, 0x45, 0xd2, 0xfd, 0x2f, 0x1e, 0x69, 0x84, 0xd2, 0x19, 0x51, 0x2d, 0x12, 0xc5, 0x6d, 0xea, - 0x36, 0xa5, 0x54, 0xf4, 0x7b, 0xd0, 0x78, 0x26, 0x0c, 0x69, 0x8f, 0xb9, 0xb4, 0xb6, 0x0d, 0x68, - 0x37, 0x74, 0xe6, 0x2e, 0xb6, 0x6b, 0xd8, 0xb7, 0xf0, 0xc3, 0x0e, 0x66, 0x01, 0x7a, 0x05, 0x16, - 0xdc, 0xa6, 0xed, 0x91, 0xaa, 0x57, 0x2b, 0x29, 0xcb, 0xca, 0x4a, 0xd1, 0x3a, 0xcb, 0xcf, 0x3b, - 0x35, 0x74, 0x09, 0xe6, 0x9b, 0xd8, 0x6b, 0x34, 0x83, 0xd2, 0xcc, 0xb2, 0xb2, 0x32, 0x6b, 0xc9, - 0x93, 0xf6, 0xbd, 0x02, 0x2f, 0xa6, 0x90, 0x58, 0x9b, 0x12, 0x86, 0xd1, 0xed, 0x50, 0x3e, 0xbc, - 0xe1, 0x40, 0x8b, 0x95, 0x37, 0xf4, 0xbc, 0x04, 0xe8, 0x3b, 0xa4, 0x86, 0x1f, 0xe3, 0x9a, 0x04, - 0x90, 0x6a, 0x68, 0x03, 0xce, 0xd5, 0xa9, 0xbf, 0x5f, 0x15, 0x47, 0xc6, 0xcd, 0x2e, 0x56, 0xae, - 0xe6, 0xc3, 0x6c, 0x51, 0x7f, 0x9f, 0x59, 0x8b, 0xa1, 0x92, 0x80, 0x62, 0x5a, 0x15, 0x5e, 0xe2, - 0xdc, 0x36, 0x43, 0x27, 0x3e, 0xf4, 0x58, 0x10, 0x39, 0xba, 0x05, 0xd0, 0xcf, 0x9e, 0x64, 0xf8, - 0xba, 0x2e, 0x52, 0xad, 0x87, 0xa9, 0xd6, 0x45, 0xed, 0xc8, 0x54, 0xeb, 0x0f, 0xec, 0x06, 0x96, - 0xba, 0x56, 0x42, 0x53, 0xfb, 0x12, 0x2e, 0x0d, 0x1a, 0x90, 0xfe, 0x2f, 0x41, 0x31, 0x0a, 0x25, - 0x2b, 0x29, 0xcb, 0x85, 0x95, 0xa2, 0xb5, 0x20, 0x63, 0xc9, 0xd0, 0x76, 0xca, 0xfc, 0x8c, 0x0c, - 0xd0, 0x28, 0xf3, 0x02, 0x39, 0x65, 0xbf, 0x92, 0x74, 0x70, 0x87, 0xd4, 0xe9, 0xe8, 0x4c, 0x6a, - 0x9f, 0x27, 0x39, 0x0b, 0x1d, 0xc9, 0x79, 0x03, 0x40, 0x2a, 0x91, 0x3a, 0x95, 0x51, 0x79, 0x35, - 0x3f, 0xe0, 0x7d, 0x00, 0xe1, 0x6a, 0xf8, 0x53, 0xfb, 0x04, 0x54, 0x8e, 0xfe, 0x7e, 0x58, 0x9d, - 0x19, 0x5a, 0x4b, 0x50, 0xe4, 0x65, 0x5b, 0x25, 0x9d, 0x16, 0x37, 0x30, 0x6b, 0x2d, 0xf0, 0x8b, - 0xfb, 0x9d, 0x56, 0x8a, 0xf3, 0x4c, 0x9a, 0xb3, 0x0d, 0x4b, 0x43, 0x51, 0x4f, 0x91, 0xf8, 0x17, - 0xf0, 0x32, 0x37, 0x11, 0x66, 0x51, 0xd6, 0xcf, 0x18, 0xcf, 0x62, 0x6b, 0x48, 0x26, 0xa7, 0x29, - 0xa4, 0x1f, 0x15, 0x28, 0x65, 0xcd, 0x4b, 0xf7, 0xd6, 0xe1, 0x6c, 0xf4, 0x0a, 0xc2, 0x4a, 0x9a, - 0xe0, 0x31, 0x45, 0x7a, 0xa7, 0x57, 0x71, 0x9f, 0xc2, 0xe5, 0x98, 0x27, 0xcf, 0xc6, 0x40, 0xac, - 0xa6, 0xcd, 0xb0, 0x03, 0x57, 0x72, 0x70, 0x4f, 0x2d, 0x08, 0xda, 0x2e, 0x94, 0xb9, 0x8d, 0x2d, - 0x8f, 0xd8, 0x07, 0xde, 0x13, 0x5c, 0x9b, 0xe0, 0xd9, 0xa0, 0x8b, 0x30, 0xd7, 0xf6, 0x69, 0x17, - 0x73, 0xe2, 0x0b, 0x96, 0x38, 0x68, 0x3f, 0x14, 0xe0, 0x6a, 0x2e, 0xa6, 0x64, 0xbe, 0x07, 0x17, - 0xeb, 0xd1, 0xd7, 0xea, 0x74, 0x75, 0x8a, 0xea, 0x19, 0x78, 0xb4, 0x06, 0x20, 0x22, 0xcd, 0xc1, - 0x44, 0x4a, 0xd5, 0x18, 0x2c, 0x9e, 0x0e, 0x5d, 0x53, 0xe7, 0xf1, 0xb4, 0x44, 0x5e, 0xb8, 0xea, - 0x7d, 0x38, 0xef, 0xdb, 0x8f, 0xaa, 0xfd, 0x39, 0x53, 0x2a, 0x0c, 0x34, 0xe9, 0xd4, 0x4c, 0x0a, - 0x31, 0x2c, 0xfb, 0xd1, 0x66, 0x7c, 0x67, 0xbd, 0xe0, 0x27, 0x8f, 0x68, 0x0f, 0x90, 0x13, 0xb8, - 0x55, 0xd6, 0x71, 0x5a, 0x1e, 0x63, 0x1e, 0x25, 0xd5, 0x7d, 0xdc, 0x2b, 0xcd, 0x0e, 0x60, 0xa6, - 0x87, 0x60, 0xd7, 0xd4, 0x3f, 0x8e, 0xe5, 0xef, 0xe1, 0x9e, 0x75, 0xc1, 0x09, 0xdc, 0xd4, 0x0d, - 0xda, 0xe6, 0x21, 0xa7, 0xf5, 0xd2, 0x1c, 0x47, 0x32, 0xf3, 0x23, 0xf5, 0x20, 0x14, 0x1b, 0x92, - 0x02, 0xa1, 0xaf, 0x05, 0x70, 0x2d, 0x27, 0x49, 0x7b, 0x24, 0xf0, 0x0e, 0xee, 0xf2, 0x51, 0x36, - 0xfd, 0x10, 0xec, 0xd7, 0x46, 0x21, 0x59, 0x1b, 0x4f, 0x0b, 0x70, 0x7d, 0x1c, 0xb3, 0xff, 0x97, - 0xc9, 0x7f, 0xa3, 0x4c, 0x2a, 0xdf, 0x9e, 0x83, 0x39, 0x9e, 0x30, 0xf4, 0x54, 0x81, 0x79, 0xd1, - 0x3d, 0xd0, 0x6a, 0x3e, 0x5c, 0x76, 0x83, 0x52, 0xdf, 0x1c, 0x53, 0x5a, 0xe4, 0x5c, 0xdb, 0xfe, - 0xea, 0xb7, 0x3f, 0xbf, 0x99, 0x59, 0x47, 0xb7, 0x8d, 0xdc, 0xed, 0xad, 0x5f, 0x09, 0xc6, 0x61, - 0x54, 0x97, 0x47, 0x86, 0x68, 0x69, 0xc6, 0xa1, 0x28, 0xc0, 0x23, 0xf4, 0x9d, 0x02, 0xc5, 0x78, - 0x09, 0x41, 0xc6, 0x08, 0x16, 0x83, 0xfb, 0x90, 0xfa, 0xd6, 0xf8, 0x0a, 0x92, 0xf9, 0x0a, 0x67, - 0xae, 0xa1, 0xe5, 0x11, 0xcc, 0x19, 0xfa, 0x29, 0xa2, 0xc6, 0x6b, 0x6a, 0x2c, 0x6a, 0x89, 0x96, - 0x3c, 0x1e, 0xb5, 0x64, 0xbf, 0xd5, 0x6e, 0x71, 0x6a, 0x26, 0x32, 0x26, 0x0c, 0x2a, 0xfa, 0x55, - 0x81, 0xf3, 0xe9, 0x0d, 0x03, 0xdd, 0x18, 0x61, 0x7d, 0xe8, 0x9a, 0xa3, 0xde, 0x9c, 0x50, 0x4b, - 0x12, 0xff, 0x80, 0x13, 0xbf, 0x83, 0x36, 0x26, 0xad, 0x06, 0xfe, 0x64, 0x99, 0x71, 0x18, 0x4f, - 0xde, 0x23, 0xf4, 0xb3, 0x02, 0x8b, 0x89, 0x5d, 0x02, 0x99, 0x23, 0x28, 0x65, 0xd7, 0x1e, 0xb5, - 0x32, 0x89, 0x8a, 0x74, 0xe1, 0x06, 0x77, 0x41, 0x47, 0xab, 0xf9, 0x2e, 0xc8, 0x69, 0x9c, 0x0c, - 0xfc, 0x33, 0x05, 0x2e, 0x0c, 0x0e, 0x7e, 0xf4, 0xce, 0x18, 0xe6, 0x87, 0x6c, 0x20, 0xea, 0xad, - 0x89, 0xf5, 0xc6, 0x7f, 0x8c, 0x59, 0xee, 0xc3, 0x62, 0xff, 0x4c, 0x01, 0x94, 0xed, 0x32, 0xe8, - 0xdd, 0x11, 0xc4, 0x72, 0xd7, 0x12, 0x75, 0x6d, 0x0a, 0x4d, 0xe9, 0xd4, 0x3a, 0x77, 0xea, 0x3d, - 0xb4, 0x96, 0xef, 0xd4, 0xb0, 0xa9, 0x93, 0xcc, 0xce, 0x5f, 0x0a, 0x5c, 0xf9, 0xc7, 0x11, 0x86, - 0x36, 0x27, 0xe6, 0x97, 0x9d, 0xbb, 0xea, 0x9d, 0x7f, 0x07, 0x22, 0xfd, 0xdd, 0xe5, 0xfe, 0xde, - 0x43, 0x3b, 0x53, 0xfb, 0x6b, 0x88, 0x9e, 0x1a, 0xf7, 0xd6, 0x8d, 0x8f, 0x7e, 0x39, 0x2e, 0x2b, - 0xcf, 0x8f, 0xcb, 0xca, 0x1f, 0xc7, 0x65, 0xe5, 0xeb, 0x93, 0xf2, 0x99, 0xe7, 0x27, 0xe5, 0x33, - 0xbf, 0x9f, 0x94, 0xcf, 0x7c, 0x76, 0xb3, 0xe1, 0x05, 0xcd, 0x8e, 0xa3, 0xbb, 0xb4, 0x15, 0x99, - 0xe3, 0x30, 0xb1, 0xed, 0xc7, 0x03, 0xd6, 0x83, 0x5e, 0x1b, 0x33, 0x67, 0x9e, 0xff, 0x07, 0x7f, - 0xfb, 0xef, 0x00, 0x00, 0x00, 0xff, 0xff, 0x9a, 0x83, 0xf5, 0xfe, 0xba, 0x10, 0x00, 0x00, + // 1094 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x57, 0xcf, 0x6f, 0x1b, 0x45, + 0x14, 0xce, 0xc6, 0x49, 0x9a, 0x3c, 0x97, 0xaa, 0x1a, 0x4a, 0x31, 0xdb, 0xd6, 0x8d, 0x96, 0x1f, + 0x4d, 0xab, 0x74, 0x17, 0x9b, 0x06, 0x88, 0x38, 0x54, 0xf9, 0x41, 0xd2, 0x50, 0x54, 0x9a, 0x85, + 0x70, 0xe0, 0xb2, 0xda, 0x5d, 0x8f, 0xed, 0x55, 0xe2, 0x19, 0xd7, 0xb3, 0x76, 0xeb, 0x86, 0x70, + 0xe0, 0x8e, 0x84, 0xc4, 0x05, 0x71, 0x42, 0x42, 0xe2, 0xc0, 0xa1, 0x7f, 0x07, 0x48, 0x3d, 0x54, + 0xe2, 0xc2, 0x11, 0x25, 0xfc, 0x1b, 0x48, 0x68, 0x67, 0x66, 0xd7, 0x5e, 0xaf, 0x37, 0x5e, 0x9b, + 0x1c, 0x38, 0x70, 0xcb, 0x8e, 0xdf, 0xfb, 0xde, 0xf7, 0xde, 0xfb, 0x66, 0xde, 0x0b, 0xbc, 0xe1, + 0xd8, 0x4e, 0xf7, 0x80, 0x12, 0xe3, 0x29, 0x25, 0xd8, 0xa5, 0xc4, 0xf5, 0x70, 0xab, 0x86, 0x8d, + 0x4e, 0xc9, 0x78, 0xd4, 0xc6, 0xad, 0xae, 0xde, 0x6c, 0x51, 0x9f, 0xa2, 0x82, 0xb4, 0xd2, 0x63, + 0x56, 0x7a, 0xa7, 0xa4, 0x5e, 0xad, 0x51, 0x5a, 0x3b, 0xc0, 0x86, 0xdd, 0xf4, 0x0c, 0x9b, 0x10, + 0xea, 0xdb, 0xbe, 0x47, 0x09, 0x13, 0x7e, 0xea, 0x2d, 0x97, 0xb2, 0x06, 0x65, 0x86, 0x63, 0x33, + 0x2c, 0x00, 0x8d, 0x4e, 0xc9, 0xc1, 0xbe, 0x5d, 0x32, 0x9a, 0x76, 0xcd, 0x23, 0xdc, 0x58, 0xda, + 0x2e, 0x87, 0x4c, 0x1c, 0xdf, 0x75, 0xeb, 0xd8, 0xdd, 0x6f, 0x52, 0x8f, 0xf8, 0x01, 0x93, 0xd8, + 0x81, 0xb4, 0xbe, 0x19, 0x5a, 0xf7, 0x7e, 0xf1, 0x48, 0x2d, 0xb0, 0x4e, 0x98, 0x6a, 0xa1, 0x29, + 0x6e, 0x52, 0xb7, 0x2e, 0xad, 0xc2, 0xbf, 0x07, 0x83, 0x27, 0xca, 0x10, 0xcf, 0x98, 0x5b, 0x6b, + 0xdb, 0x80, 0x76, 0x83, 0x64, 0xee, 0x61, 0xbb, 0x82, 0x5b, 0x26, 0x7e, 0xd4, 0xc6, 0xcc, 0x47, + 0xaf, 0xc1, 0xbc, 0x5b, 0xb7, 0x3d, 0x62, 0x79, 0x95, 0x82, 0xb2, 0xa8, 0x2c, 0x2d, 0x98, 0xe7, + 0xf8, 0xf7, 0x4e, 0x05, 0x5d, 0x86, 0xb9, 0x3a, 0xf6, 0x6a, 0x75, 0xbf, 0x30, 0xbd, 0xa8, 0x2c, + 0xcd, 0x98, 0xf2, 0x4b, 0xfb, 0x41, 0x81, 0x97, 0x63, 0x48, 0xac, 0x49, 0x09, 0xc3, 0xe8, 0x6e, + 0x60, 0x1f, 0x9c, 0x70, 0xa0, 0x7c, 0xf9, 0x86, 0x9e, 0xd6, 0x00, 0x7d, 0x87, 0x54, 0xf0, 0x13, + 0x5c, 0x91, 0x00, 0xd2, 0x0d, 0xad, 0xc3, 0xf9, 0x2a, 0x6d, 0xed, 0x5b, 0xe2, 0x93, 0xf1, 0xb0, + 0xf9, 0xf2, 0xf5, 0x74, 0x98, 0x2d, 0xda, 0xda, 0x67, 0x66, 0x3e, 0x70, 0x12, 0x50, 0x4c, 0xb3, + 0xe0, 0x15, 0xce, 0x6d, 0x23, 0x48, 0xe2, 0x63, 0x8f, 0xf9, 0x61, 0xa2, 0x5b, 0x00, 0xbd, 0xee, + 0x49, 0x86, 0x6f, 0xe9, 0xa2, 0xd5, 0x7a, 0xd0, 0x6a, 0x5d, 0x68, 0x47, 0xb6, 0x5a, 0x7f, 0x68, + 0xd7, 0xb0, 0xf4, 0x35, 0xfb, 0x3c, 0xb5, 0xaf, 0xe0, 0xf2, 0x60, 0x00, 0x99, 0xff, 0x15, 0x58, + 0x08, 0x4b, 0xc9, 0x0a, 0xca, 0x62, 0x6e, 0x69, 0xc1, 0x9c, 0x97, 0xb5, 0x64, 0x68, 0x3b, 0x16, + 0x7e, 0x5a, 0x16, 0x68, 0x54, 0x78, 0x81, 0x1c, 0x8b, 0xbf, 0xd2, 0x1f, 0x9f, 0xed, 0x90, 0x2a, + 0x0d, 0x33, 0x3c, 0x2d, 0xbe, 0x66, 0xc1, 0xab, 0x09, 0x37, 0xc9, 0x7b, 0x13, 0xf2, 0xdc, 0x8c, + 0x59, 0x1e, 0xa9, 0x52, 0xee, 0x99, 0x2f, 0xbf, 0x9e, 0x5e, 0x75, 0x0e, 0xc1, 0x11, 0xc0, 0x8d, + 0xd0, 0xb4, 0xcf, 0x40, 0xe5, 0x01, 0x3e, 0x0c, 0x34, 0xda, 0x33, 0xe9, 0x71, 0xe3, 0xe2, 0xb5, + 0x48, 0xbb, 0xc1, 0x8b, 0x3f, 0x63, 0xce, 0xf3, 0x83, 0x07, 0xed, 0x46, 0x4c, 0x83, 0xd3, 0x31, + 0x0d, 0x6a, 0x36, 0x5c, 0x19, 0x8a, 0x2a, 0xa9, 0xaf, 0x03, 0x48, 0x4f, 0xc1, 0x5c, 0xc9, 0xca, + 0x5c, 0x54, 0x8a, 0x13, 0xff, 0x52, 0x56, 0x26, 0xe8, 0xa5, 0x54, 0x51, 0x86, 0xcb, 0xb1, 0x35, + 0xa4, 0x9f, 0x93, 0xc8, 0xe9, 0x67, 0x05, 0x0a, 0xc9, 0xf0, 0x32, 0xbd, 0x35, 0x38, 0x17, 0xde, + 0x05, 0xd1, 0x95, 0xcc, 0x57, 0x2a, 0xf4, 0x3b, 0x3b, 0xdd, 0x7d, 0x0e, 0x57, 0x23, 0x9e, 0xbc, + 0x1b, 0x03, 0xb5, 0x9a, 0xb4, 0xc3, 0x0e, 0x5c, 0x4b, 0xc1, 0x3d, 0xb3, 0x22, 0x68, 0xbb, 0x50, + 0xe4, 0x31, 0xb6, 0x3c, 0x62, 0x1f, 0x78, 0x4f, 0x71, 0x25, 0xa1, 0xcf, 0x53, 0x3a, 0x7d, 0x09, + 0x66, 0x9b, 0x2d, 0xda, 0xc1, 0x9c, 0xf8, 0xbc, 0x29, 0x3e, 0xb4, 0x9f, 0x72, 0x70, 0x3d, 0x15, + 0x53, 0x32, 0xdf, 0x83, 0x4b, 0xd5, 0xf0, 0x57, 0x6b, 0x32, 0x9d, 0xa2, 0x6a, 0x02, 0x1e, 0xad, + 0x02, 0x88, 0x4a, 0x73, 0x30, 0xd1, 0x52, 0x35, 0x02, 0x8b, 0x66, 0x44, 0xa7, 0xa4, 0xf3, 0x7a, + 0x9a, 0xa2, 0x2f, 0xdc, 0xf5, 0x01, 0x5c, 0x68, 0xd9, 0x8f, 0xad, 0xde, 0xb4, 0x29, 0xe4, 0x06, + 0x9e, 0xea, 0xd8, 0x64, 0x0a, 0x30, 0x4c, 0xfb, 0xf1, 0x46, 0x74, 0x66, 0xbe, 0xd4, 0xea, 0xff, + 0x44, 0x7b, 0x80, 0x1c, 0xdf, 0xb5, 0x58, 0xdb, 0x69, 0x78, 0x8c, 0x79, 0x94, 0x58, 0xfb, 0xb8, + 0x5b, 0x98, 0x19, 0xc0, 0x8c, 0x8f, 0xc2, 0x4e, 0x49, 0xff, 0x34, 0xb2, 0xbf, 0x8f, 0xbb, 0xe6, + 0x45, 0xc7, 0x77, 0x63, 0x27, 0x68, 0x9b, 0x97, 0x9c, 0x56, 0x0b, 0xb3, 0x1c, 0xa9, 0x94, 0x5e, + 0xa9, 0x87, 0x81, 0xd9, 0x90, 0x16, 0x08, 0x7f, 0xcd, 0x87, 0x9b, 0x29, 0x4d, 0xda, 0x23, 0xbe, + 0x77, 0x70, 0x8f, 0x0f, 0xb4, 0xc9, 0x47, 0x61, 0x4f, 0x1b, 0xb9, 0x7e, 0x6d, 0x3c, 0xcb, 0xc1, + 0xad, 0x2c, 0x61, 0xff, 0x97, 0xc9, 0x7f, 0x43, 0x26, 0xe5, 0x6f, 0xce, 0xc3, 0x2c, 0x6f, 0x18, + 0x7a, 0xa6, 0xc0, 0x9c, 0x78, 0x3d, 0xd0, 0x72, 0x3a, 0x5c, 0x72, 0x8f, 0x52, 0x6f, 0x67, 0xb4, + 0x16, 0x3d, 0xd7, 0xb6, 0xbf, 0xfe, 0xfd, 0xaf, 0xef, 0xa6, 0xd7, 0xd0, 0x5d, 0x23, 0x75, 0x87, + 0xeb, 0x29, 0xc1, 0x38, 0x0c, 0x75, 0x79, 0x64, 0x88, 0x27, 0xcd, 0x38, 0x14, 0x02, 0x3c, 0x42, + 0xdf, 0x2b, 0xb0, 0x10, 0xad, 0x22, 0xc8, 0x18, 0xc1, 0x62, 0x70, 0x2b, 0x52, 0xdf, 0xce, 0xee, + 0x20, 0x99, 0x2f, 0x71, 0xe6, 0x1a, 0x5a, 0x1c, 0xc1, 0x9c, 0xa1, 0x1f, 0x15, 0x80, 0xde, 0xba, + 0x81, 0x32, 0x85, 0xea, 0x5f, 0x68, 0xd4, 0xd2, 0x18, 0x1e, 0x92, 0xdd, 0x6d, 0xce, 0xee, 0x06, + 0x7a, 0x73, 0x14, 0x3b, 0x5e, 0x58, 0xf4, 0x9b, 0x02, 0x17, 0xe2, 0xab, 0x05, 0xba, 0x33, 0x22, + 0xe8, 0xd0, 0xfd, 0x46, 0x5d, 0x19, 0xd3, 0x4b, 0xd2, 0xfd, 0x88, 0xd3, 0xdd, 0x44, 0xeb, 0xe3, + 0xca, 0x80, 0xdf, 0x55, 0x66, 0x1c, 0x46, 0x23, 0xf7, 0x08, 0xfd, 0xa2, 0x40, 0xbe, 0x6f, 0x89, + 0x40, 0xa3, 0xaa, 0x97, 0xdc, 0x77, 0xd4, 0xf2, 0x38, 0x2e, 0x32, 0x85, 0x3b, 0x3c, 0x05, 0x1d, + 0x2d, 0xa7, 0xa7, 0x20, 0xc7, 0x70, 0x1f, 0x7f, 0xf4, 0x5c, 0x81, 0x8b, 0x83, 0x13, 0x1f, 0xbd, + 0x9b, 0x21, 0xfc, 0x90, 0xd5, 0x43, 0x7d, 0x6f, 0x6c, 0xbf, 0xec, 0xb7, 0x30, 0xc9, 0x7d, 0x58, + 0xed, 0x9f, 0x2b, 0x80, 0x92, 0xcf, 0x0b, 0x7a, 0x7f, 0x04, 0xb1, 0xd4, 0x7d, 0x44, 0x5d, 0x9d, + 0xc0, 0x53, 0x26, 0xb5, 0xc6, 0x93, 0xfa, 0x00, 0xad, 0xa6, 0x27, 0x35, 0x6c, 0xdc, 0xf4, 0x77, + 0xe7, 0x6f, 0x05, 0xae, 0x9d, 0x3a, 0xbb, 0xd0, 0xc6, 0xd8, 0xfc, 0x92, 0x03, 0x57, 0xdd, 0xfc, + 0x77, 0x20, 0x32, 0xdf, 0x5d, 0x9e, 0xef, 0x7d, 0xb4, 0x33, 0x71, 0xbe, 0x86, 0x78, 0x4c, 0xa3, + 0x47, 0x75, 0xfd, 0x93, 0x5f, 0x8f, 0x8b, 0xca, 0x8b, 0xe3, 0xa2, 0xf2, 0xe7, 0x71, 0x51, 0xf9, + 0xf6, 0xa4, 0x38, 0xf5, 0xe2, 0xa4, 0x38, 0xf5, 0xc7, 0x49, 0x71, 0xea, 0x8b, 0x95, 0x9a, 0xe7, + 0xd7, 0xdb, 0x8e, 0xee, 0xd2, 0x46, 0x18, 0x8e, 0xc3, 0x44, 0xb1, 0x9f, 0x0c, 0x44, 0xf7, 0xbb, + 0x4d, 0xcc, 0x9c, 0x39, 0xfe, 0x2f, 0xf8, 0x3b, 0xff, 0x04, 0x00, 0x00, 0xff, 0xff, 0xe0, 0xd3, + 0x0e, 0x7d, 0xb9, 0x10, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -1052,7 +1053,7 @@ type QueryClient interface { // ChainList queries the list of chains that checkpoint to Babylon ChainList(ctx context.Context, in *QueryChainListRequest, opts ...grpc.CallOption) (*QueryChainListResponse, error) // ChainInfo queries the latest info of a chain in Babylon's view - ChainInfo(ctx context.Context, in *QueryChainInfoRequest, opts ...grpc.CallOption) (*QueryChainInfoResponse, error) + ChainsInfo(ctx context.Context, in *QueryChainsInfoRequest, opts ...grpc.CallOption) (*QueryChainsInfoResponse, error) // EpochChainInfo queries the latest info of a chain in a given epoch of // Babylon's view EpochChainInfo(ctx context.Context, in *QueryEpochChainInfoRequest, opts ...grpc.CallOption) (*QueryEpochChainInfoResponse, error) @@ -1095,9 +1096,9 @@ func (c *queryClient) ChainList(ctx context.Context, in *QueryChainListRequest, return out, nil } -func (c *queryClient) ChainInfo(ctx context.Context, in *QueryChainInfoRequest, opts ...grpc.CallOption) (*QueryChainInfoResponse, error) { - out := new(QueryChainInfoResponse) - err := c.cc.Invoke(ctx, "/babylon.zoneconcierge.v1.Query/ChainInfo", in, out, opts...) +func (c *queryClient) ChainsInfo(ctx context.Context, in *QueryChainsInfoRequest, opts ...grpc.CallOption) (*QueryChainsInfoResponse, error) { + out := new(QueryChainsInfoResponse) + err := c.cc.Invoke(ctx, "/babylon.zoneconcierge.v1.Query/ChainsInfo", in, out, opts...) if err != nil { return nil, err } @@ -1156,7 +1157,7 @@ type QueryServer interface { // ChainList queries the list of chains that checkpoint to Babylon ChainList(context.Context, *QueryChainListRequest) (*QueryChainListResponse, error) // ChainInfo queries the latest info of a chain in Babylon's view - ChainInfo(context.Context, *QueryChainInfoRequest) (*QueryChainInfoResponse, error) + ChainsInfo(context.Context, *QueryChainsInfoRequest) (*QueryChainsInfoResponse, error) // EpochChainInfo queries the latest info of a chain in a given epoch of // Babylon's view EpochChainInfo(context.Context, *QueryEpochChainInfoRequest) (*QueryEpochChainInfoResponse, error) @@ -1183,8 +1184,8 @@ func (*UnimplementedQueryServer) Header(ctx context.Context, req *QueryHeaderReq func (*UnimplementedQueryServer) ChainList(ctx context.Context, req *QueryChainListRequest) (*QueryChainListResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ChainList not implemented") } -func (*UnimplementedQueryServer) ChainInfo(ctx context.Context, req *QueryChainInfoRequest) (*QueryChainInfoResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ChainInfo not implemented") +func (*UnimplementedQueryServer) ChainsInfo(ctx context.Context, req *QueryChainsInfoRequest) (*QueryChainsInfoResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ChainsInfo not implemented") } func (*UnimplementedQueryServer) EpochChainInfo(ctx context.Context, req *QueryEpochChainInfoRequest) (*QueryEpochChainInfoResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method EpochChainInfo not implemented") @@ -1242,20 +1243,20 @@ func _Query_ChainList_Handler(srv interface{}, ctx context.Context, dec func(int return interceptor(ctx, in, info, handler) } -func _Query_ChainInfo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(QueryChainInfoRequest) +func _Query_ChainsInfo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryChainsInfoRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(QueryServer).ChainInfo(ctx, in) + return srv.(QueryServer).ChainsInfo(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/babylon.zoneconcierge.v1.Query/ChainInfo", + FullMethod: "/babylon.zoneconcierge.v1.Query/ChainsInfo", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(QueryServer).ChainInfo(ctx, req.(*QueryChainInfoRequest)) + return srv.(QueryServer).ChainsInfo(ctx, req.(*QueryChainsInfoRequest)) } return interceptor(ctx, in, info, handler) } @@ -1363,8 +1364,8 @@ var _Query_serviceDesc = grpc.ServiceDesc{ Handler: _Query_ChainList_Handler, }, { - MethodName: "ChainInfo", - Handler: _Query_ChainInfo_Handler, + MethodName: "ChainsInfo", + Handler: _Query_ChainsInfo_Handler, }, { MethodName: "EpochChainInfo", @@ -1552,7 +1553,7 @@ func (m *QueryChainListResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) return len(dAtA) - i, nil } -func (m *QueryChainInfoRequest) Marshal() (dAtA []byte, err error) { +func (m *QueryChainsInfoRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1562,27 +1563,29 @@ func (m *QueryChainInfoRequest) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *QueryChainInfoRequest) MarshalTo(dAtA []byte) (int, error) { +func (m *QueryChainsInfoRequest) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *QueryChainInfoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *QueryChainsInfoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - if len(m.ChainId) > 0 { - i -= len(m.ChainId) - copy(dAtA[i:], m.ChainId) - i = encodeVarintQuery(dAtA, i, uint64(len(m.ChainId))) - i-- - dAtA[i] = 0xa + if len(m.ChainIds) > 0 { + for iNdEx := len(m.ChainIds) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.ChainIds[iNdEx]) + copy(dAtA[i:], m.ChainIds[iNdEx]) + i = encodeVarintQuery(dAtA, i, uint64(len(m.ChainIds[iNdEx]))) + i-- + dAtA[i] = 0xa + } } return len(dAtA) - i, nil } -func (m *QueryChainInfoResponse) Marshal() (dAtA []byte, err error) { +func (m *QueryChainsInfoResponse) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1592,27 +1595,29 @@ func (m *QueryChainInfoResponse) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *QueryChainInfoResponse) MarshalTo(dAtA []byte) (int, error) { +func (m *QueryChainsInfoResponse) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *QueryChainInfoResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *QueryChainsInfoResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - if m.ChainInfo != nil { - { - size, err := m.ChainInfo.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err + if len(m.ChainsInfo) > 0 { + for iNdEx := len(m.ChainsInfo) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.ChainsInfo[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) } - i -= size - i = encodeVarintQuery(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0xa } - i-- - dAtA[i] = 0xa } return len(dAtA) - i, nil } @@ -2177,28 +2182,32 @@ func (m *QueryChainListResponse) Size() (n int) { return n } -func (m *QueryChainInfoRequest) Size() (n int) { +func (m *QueryChainsInfoRequest) Size() (n int) { if m == nil { return 0 } var l int _ = l - l = len(m.ChainId) - if l > 0 { - n += 1 + l + sovQuery(uint64(l)) + if len(m.ChainIds) > 0 { + for _, s := range m.ChainIds { + l = len(s) + n += 1 + l + sovQuery(uint64(l)) + } } return n } -func (m *QueryChainInfoResponse) Size() (n int) { +func (m *QueryChainsInfoResponse) Size() (n int) { if m == nil { return 0 } var l int _ = l - if m.ChainInfo != nil { - l = m.ChainInfo.Size() - n += 1 + l + sovQuery(uint64(l)) + if len(m.ChainsInfo) > 0 { + for _, e := range m.ChainsInfo { + l = e.Size() + n += 1 + l + sovQuery(uint64(l)) + } } return n } @@ -2825,7 +2834,7 @@ func (m *QueryChainListResponse) Unmarshal(dAtA []byte) error { } return nil } -func (m *QueryChainInfoRequest) Unmarshal(dAtA []byte) error { +func (m *QueryChainsInfoRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -2848,15 +2857,15 @@ func (m *QueryChainInfoRequest) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: QueryChainInfoRequest: wiretype end group for non-group") + return fmt.Errorf("proto: QueryChainsInfoRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: QueryChainInfoRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: QueryChainsInfoRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ChainId", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ChainIds", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -2884,7 +2893,7 @@ func (m *QueryChainInfoRequest) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.ChainId = string(dAtA[iNdEx:postIndex]) + m.ChainIds = append(m.ChainIds, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex default: iNdEx = preIndex @@ -2907,7 +2916,7 @@ func (m *QueryChainInfoRequest) Unmarshal(dAtA []byte) error { } return nil } -func (m *QueryChainInfoResponse) Unmarshal(dAtA []byte) error { +func (m *QueryChainsInfoResponse) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -2930,15 +2939,15 @@ func (m *QueryChainInfoResponse) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: QueryChainInfoResponse: wiretype end group for non-group") + return fmt.Errorf("proto: QueryChainsInfoResponse: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: QueryChainInfoResponse: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: QueryChainsInfoResponse: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ChainInfo", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ChainsInfo", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -2965,10 +2974,8 @@ func (m *QueryChainInfoResponse) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.ChainInfo == nil { - m.ChainInfo = &ChainInfo{} - } - if err := m.ChainInfo.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + m.ChainsInfo = append(m.ChainsInfo, &ChainInfo{}) + if err := m.ChainsInfo[len(m.ChainsInfo)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex diff --git a/x/zoneconcierge/types/query.pb.gw.go b/x/zoneconcierge/types/query.pb.gw.go index 8766d6fd7..5a9e81fcf 100644 --- a/x/zoneconcierge/types/query.pb.gw.go +++ b/x/zoneconcierge/types/query.pb.gw.go @@ -145,56 +145,38 @@ func local_request_Query_ChainList_0(ctx context.Context, marshaler runtime.Mars } -func request_Query_ChainInfo_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryChainInfoRequest - var metadata runtime.ServerMetadata +var ( + filter_Query_ChainsInfo_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} +) - var ( - val string - ok bool - err error - _ = err - ) +func request_Query_ChainsInfo_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryChainsInfoRequest + var metadata runtime.ServerMetadata - val, ok = pathParams["chain_id"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "chain_id") + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - - protoReq.ChainId, err = runtime.String(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "chain_id", err) + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_ChainsInfo_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.ChainInfo(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + msg, err := client.ChainsInfo(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } -func local_request_Query_ChainInfo_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryChainInfoRequest +func local_request_Query_ChainsInfo_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryChainsInfoRequest var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["chain_id"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "chain_id") + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - - protoReq.ChainId, err = runtime.String(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "chain_id", err) + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_ChainsInfo_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.ChainInfo(ctx, &protoReq) + msg, err := server.ChainsInfo(ctx, &protoReq) return msg, metadata, err } @@ -641,7 +623,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv }) - mux.Handle("GET", pattern_Query_ChainInfo_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("GET", pattern_Query_ChainsInfo_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream @@ -652,7 +634,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := local_request_Query_ChainInfo_0(rctx, inboundMarshaler, server, req, pathParams) + resp, md, err := local_request_Query_ChainsInfo_0(rctx, inboundMarshaler, server, req, pathParams) md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { @@ -660,7 +642,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv return } - forward_Query_ChainInfo_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_Query_ChainsInfo_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) @@ -860,7 +842,7 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie }) - mux.Handle("GET", pattern_Query_ChainInfo_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("GET", pattern_Query_ChainsInfo_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) @@ -869,14 +851,14 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := request_Query_ChainInfo_0(rctx, inboundMarshaler, client, req, pathParams) + resp, md, err := request_Query_ChainsInfo_0(rctx, inboundMarshaler, client, req, pathParams) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - forward_Query_ChainInfo_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_Query_ChainsInfo_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) @@ -988,7 +970,7 @@ var ( pattern_Query_ChainList_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"babylon", "zoneconcierge", "v1", "chains"}, "", runtime.AssumeColonVerbOpt(false))) - pattern_Query_ChainInfo_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4}, []string{"babylon", "zoneconcierge", "v1", "chain_info", "chain_id"}, "", runtime.AssumeColonVerbOpt(false))) + pattern_Query_ChainsInfo_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"babylon", "zoneconcierge", "v1", "chains_info"}, "", runtime.AssumeColonVerbOpt(false))) pattern_Query_EpochChainInfo_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4, 2, 5, 1, 0, 4, 1, 5, 6}, []string{"babylon", "zoneconcierge", "v1", "chain_info", "chain_id", "epochs", "epoch_num"}, "", runtime.AssumeColonVerbOpt(false))) @@ -1006,7 +988,7 @@ var ( forward_Query_ChainList_0 = runtime.ForwardResponseMessage - forward_Query_ChainInfo_0 = runtime.ForwardResponseMessage + forward_Query_ChainsInfo_0 = runtime.ForwardResponseMessage forward_Query_EpochChainInfo_0 = runtime.ForwardResponseMessage From f7c9e049d9656ef83f98d8916b44ee78fb62fcb5 Mon Sep 17 00:00:00 2001 From: KonradStaniec Date: Fri, 28 Apr 2023 12:31:56 +0200 Subject: [PATCH 48/59] Fix bug in submission btc info (#367) * Fix bug in submission btc info --- x/btccheckpoint/keeper/keeper.go | 51 ++++++++--- x/btccheckpoint/keeper/keeper_test.go | 125 ++++++++++++++++++++++++++ 2 files changed, 162 insertions(+), 14 deletions(-) create mode 100644 x/btccheckpoint/keeper/keeper_test.go diff --git a/x/btccheckpoint/keeper/keeper.go b/x/btccheckpoint/keeper/keeper.go index 9c04169f4..79f92f950 100644 --- a/x/btccheckpoint/keeper/keeper.go +++ b/x/btccheckpoint/keeper/keeper.go @@ -142,34 +142,57 @@ func (k Keeper) checkSubmissionStatus(ctx sdk.Context, info *types.SubmissionBtc func (k Keeper) GetSubmissionBtcInfo(ctx sdk.Context, sk types.SubmissionKey) (*types.SubmissionBtcInfo, error) { - var lowest uint64 = math.MaxUint64 - var highest uint64 = uint64(0) - var lowestIndestInMostFreshBlock uint32 = math.MaxUint32 + var youngestBlockDepth uint64 = math.MaxUint64 + + var lowestIndexInMostFreshBlock uint32 = math.MaxUint32 + + var oldestBlockDepth uint64 = uint64(0) for _, tk := range sk.Key { - d, err := k.headerDepth(ctx, tk.Hash) + currentBlockDepth, err := k.headerDepth(ctx, tk.Hash) if err != nil { return nil, err } - if d <= lowest { - lowest = d - if tk.Index < lowestIndestInMostFreshBlock { - lowestIndestInMostFreshBlock = tk.Index - } + if currentBlockDepth < youngestBlockDepth { + youngestBlockDepth = currentBlockDepth + lowestIndexInMostFreshBlock = tk.Index + } + + // This case happens when we have two submissions in the same block. + if currentBlockDepth == youngestBlockDepth && tk.Index < lowestIndexInMostFreshBlock { + // This is something which needs a bit more careful thinking as it is used + // to determine which submission is better. + // Currently if two submissions of one checkpoint are in the same block, + // we pick tx with lower index as the point at which checkpoint happened. + // This is in line with the logic that if two submission are in the same block, + // they are esentially happening at the same time, so it does not really matter + // which index pick, and for possibble tie breaks it is better to pick lower one. + // This means in case when we have: + // Checkpoint submission `x` for epoch 5, both tx in same block at height 100, with indexes 1 and 10 + // and + // Checkpoint submission `y` for epoch 5, both tx in same block at height 100, with indexes 3 and 9 + // we will chose submission `x` as the better one. + // This good enough solution, but it is not perfect and leads to some edge cases like: + // Checkpoint submission `x` for epoch 5, one tx in block 99 with index 1, and second tx in block 100 with index 4 + // and + // Checkpoint submission `y` for epoch 5, both tx in same block at height 100, with indexes 3 and 9 + // In this case submission `y` will be better as it `earliest` tx in most fresh block is first. But at first glance + // submission `x` seems better. + lowestIndexInMostFreshBlock = tk.Index } - if d > highest { - highest = d + if currentBlockDepth > oldestBlockDepth { + oldestBlockDepth = currentBlockDepth } } return &types.SubmissionBtcInfo{ SubmissionKey: sk, - OldestBlockDepth: highest, - YoungestBlockDepth: lowest, - LatestTxIndex: lowestIndestInMostFreshBlock, + OldestBlockDepth: oldestBlockDepth, + YoungestBlockDepth: youngestBlockDepth, + LatestTxIndex: lowestIndexInMostFreshBlock, }, nil } diff --git a/x/btccheckpoint/keeper/keeper_test.go b/x/btccheckpoint/keeper/keeper_test.go new file mode 100644 index 000000000..944188641 --- /dev/null +++ b/x/btccheckpoint/keeper/keeper_test.go @@ -0,0 +1,125 @@ +package keeper_test + +import ( + "math/rand" + "testing" + "time" + + "github.com/babylonchain/babylon/testutil/datagen" + "github.com/babylonchain/babylon/x/btccheckpoint/types" + "github.com/stretchr/testify/require" +) + +func TestKeeper_GetSubmissionBtcInfo(t *testing.T) { + type TxKeyDesc struct { + TxIdx uint32 + Depth uint64 + } + + type args struct { + Key1 TxKeyDesc + Key2 TxKeyDesc + } + + tests := []struct { + name string + args args + expectedYoungestBlockDepth uint64 + expectedTxIndex uint32 + expectedOldestBlockDepth uint64 + }{ + {"First header older. TxIndex larger in older header.", args{TxKeyDesc{TxIdx: 5, Depth: 10}, TxKeyDesc{TxIdx: 1, Depth: 0}}, 0, 1, 10}, + {"First header older. TxIndex larger in younger header.", args{TxKeyDesc{TxIdx: 1, Depth: 10}, TxKeyDesc{TxIdx: 5, Depth: 0}}, 0, 5, 10}, + {"Second header older. TxIndex larger in older header.", args{TxKeyDesc{TxIdx: 1, Depth: 0}, TxKeyDesc{TxIdx: 5, Depth: 10}}, 0, 1, 10}, + {"Second header older. TxIndex larger in younger header.", args{TxKeyDesc{TxIdx: 5, Depth: 0}, TxKeyDesc{TxIdx: 1, Depth: 10}}, 0, 5, 10}, + {"Same block. TxIndex larger in first transaction key.", args{TxKeyDesc{TxIdx: 5, Depth: 10}, TxKeyDesc{TxIdx: 1, Depth: 10}}, 10, 1, 10}, + {"Same block. TxIndex larger in second transaction key.", args{TxKeyDesc{TxIdx: 1, Depth: 10}, TxKeyDesc{TxIdx: 5, Depth: 10}}, 10, 1, 10}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + r := rand.New(rand.NewSource(time.Now().Unix())) + + k := InitTestKeepers(t) + + hash1 := datagen.GenRandomBTCHeaderPrevBlock(r) + hash2 := datagen.GenRandomBTCHeaderPrevBlock(r) + + sk := types.SubmissionKey{Key: []*types.TransactionKey{ + {Index: tt.args.Key1.TxIdx, Hash: hash1}, + {Index: tt.args.Key2.TxIdx, Hash: hash2}, + }} + + k.BTCLightClient.SetDepth(hash1, int64(tt.args.Key1.Depth)) + k.BTCLightClient.SetDepth(hash2, int64(tt.args.Key2.Depth)) + + info, err := k.BTCCheckpoint.GetSubmissionBtcInfo(k.SdkCtx, sk) + + require.NoError(t, err) + + require.Equal(t, info.YoungestBlockDepth, tt.expectedYoungestBlockDepth, tt.name) + require.Equal(t, info.LatestTxIndex, tt.expectedTxIndex, tt.name) + require.Equal(t, info.OldestBlockDepth, tt.expectedOldestBlockDepth, tt.name) + }) + } +} + +func FuzzGetSubmissionBtcInfo(f *testing.F) { + datagen.AddRandomSeedsToFuzzer(f, 100) + + f.Fuzz(func(t *testing.T, seed int64) { + r := rand.New(rand.NewSource(seed)) + + depth1 := r.Uint32() + txidx1 := r.Uint32() + depth2 := r.Uint32() + txidx2 := r.Uint32() + + if txidx1 == txidx2 { + // transaction indexes must be different to cover the case where transactions are + // in the same block. + txidx1 = txidx1 + 1 + } + + k := InitTestKeepers(t) + + hash1 := datagen.GenRandomBTCHeaderPrevBlock(r) + hash2 := datagen.GenRandomBTCHeaderPrevBlock(r) + + sk := types.SubmissionKey{Key: []*types.TransactionKey{ + {Index: txidx1, Hash: hash1}, + {Index: txidx2, Hash: hash2}, + }} + + k.BTCLightClient.SetDepth(hash1, int64(depth1)) + k.BTCLightClient.SetDepth(hash2, int64(depth2)) + + info, err := k.BTCCheckpoint.GetSubmissionBtcInfo(k.SdkCtx, sk) + require.NoError(t, err) + + var expectedOldestDepth uint64 + var expectedYoungestDepth uint64 + var expectedTxIdx uint32 + + if depth1 > depth2 { + expectedOldestDepth = uint64(depth1) + expectedYoungestDepth = uint64(depth2) + expectedTxIdx = txidx2 + } else if depth1 < depth2 { + expectedOldestDepth = uint64(depth2) + expectedYoungestDepth = uint64(depth1) + expectedTxIdx = txidx1 + } else { + if txidx1 > txidx2 { + expectedTxIdx = txidx2 + } else { + expectedTxIdx = txidx1 + } + expectedOldestDepth = uint64(depth1) + expectedYoungestDepth = uint64(depth1) + } + + require.Equal(t, info.YoungestBlockDepth, expectedYoungestDepth) + require.Equal(t, info.LatestTxIndex, expectedTxIdx) + require.Equal(t, info.OldestBlockDepth, expectedOldestDepth) + }) +} From 3a88d87341a4e5f3e85012e5356fcf9ea2761f46 Mon Sep 17 00:00:00 2001 From: Vitalis Salis Date: Mon, 1 May 2023 18:06:46 +0300 Subject: [PATCH 49/59] testnet: Add flag for time between blocks (#134) --- cmd/babylond/cmd/testnet.go | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/cmd/babylond/cmd/testnet.go b/cmd/babylond/cmd/testnet.go index 683499ae9..6f3ac6cc1 100644 --- a/cmd/babylond/cmd/testnet.go +++ b/cmd/babylond/cmd/testnet.go @@ -10,6 +10,7 @@ import ( "net" "os" "path/filepath" + "time" appparams "github.com/babylonchain/babylon/app/params" bbn "github.com/babylonchain/babylon/types" @@ -53,6 +54,7 @@ var ( flagStartingIPAddress = "starting-ip-address" flagBtcNetwork = "btc-network" flagAdditionalSenderAccount = "additional-sender-account" + flagTimeBetweenBlocks = "time-between-blocks-seconds" ) // TestnetCmd initializes all files for tendermint testnet and application @@ -88,6 +90,7 @@ Example: algo, _ := cmd.Flags().GetString(flags.FlagKeyType) btcNetwork, _ := cmd.Flags().GetString(flagBtcNetwork) additionalAccount, _ := cmd.Flags().GetBool(flagAdditionalSenderAccount) + timeBetweenBlocks, _ := cmd.Flags().GetUint64(flagTimeBetweenBlocks) if err != nil { return errors.New("base Bitcoin header height should be a uint64") } @@ -102,7 +105,7 @@ Example: return InitTestnet( clientCtx, cmd, config, mbm, genBalIterator, outputDir, genesisCliArgs.ChainID, minGasPrices, nodeDirPrefix, nodeDaemonHome, startingIPAddress, keyringBackend, algo, numValidators, - btcNetwork, additionalAccount, genesisParams, + btcNetwork, additionalAccount, timeBetweenBlocks, genesisParams, ) }, } @@ -117,6 +120,7 @@ Example: cmd.Flags().String(flags.FlagKeyType, string(hd.Secp256k1Type), "Key signing algorithm to generate keys for") cmd.Flags().String(flagBtcNetwork, string(bbn.BtcSimnet), "Bitcoin network to use. Available networks: simnet, testnet, regtest, mainnet") cmd.Flags().Bool(flagAdditionalSenderAccount, false, "If there should be additional pre funded account per validator") + cmd.Flags().Uint64(flagTimeBetweenBlocks, 5, "Time between blocks in seconds") addGenesisFlags(cmd) return cmd @@ -142,6 +146,7 @@ func InitTestnet( numValidators int, btcNetwork string, additionalAccount bool, + timeBetweenBlocks uint64, genesisParams GenesisParams, ) error { @@ -187,6 +192,8 @@ func InitTestnet( nodeConfig.Instrumentation.Prometheus = true // Set the number of simultaneous connections to unlimited nodeConfig.Instrumentation.MaxOpenConnections = 0 + // Time between blocks + nodeConfig.Consensus.TimeoutCommit = time.Second * time.Duration(timeBetweenBlocks) if err := os.MkdirAll(filepath.Join(nodeDir, "config"), nodeDirPerm); err != nil { _ = os.RemoveAll(outputDir) From 813134bc4033bd2bc2ebf0d7cb8ab4b4171ebc0d Mon Sep 17 00:00:00 2001 From: Vitalis Salis Date: Tue, 2 May 2023 12:38:33 +0300 Subject: [PATCH 50/59] chore: circleci: Use image with go 1.20.3 installed (#371) --- .circleci/config.yml | 31 ++++++++++++++++--------------- btctxformatter/formatter_test.go | 3 ++- 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 3ef7fbc5d..35cf66ca0 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -4,31 +4,30 @@ version: 2.1 orbs: aws-ecr: circleci/aws-ecr@8.2.1 + go: circleci/go@1.7.3 + -# Define a job to be invoked later in a workflow. -# See: https://circleci.com/docs/2.0/configuration-reference/#jobs jobs: build-test: - # Specify the execution environment. You can specify an image from Dockerhub or use one of our Convenience Images from CircleCI's Developer Hub. - # See: https://circleci.com/docs/2.0/configuration-reference/#docker-machine-macos-windows-executor machine: image: ubuntu-2204:2022.10.1 - resource_class: large + resource_class: large steps: + - go/install: + version: "1.20" - checkout - run: name: Print Go environment command: "go env" - - restore_cache: # restores saved cache if no changes are detected since last run - keys: - - go-mod-v6-{{ checksum "go.sum" }} + - go/load-cache: + key: go-mod-v6-{{ checksum "go.sum" }} + - go/mod-download + - go/save-cache: + key: go-mod-v6-{{ checksum "go.sum" }} + path: "/home/circleci/.go_workspace/pkg/mod" - run: name: Build babylond command: make build - - save_cache: - key: go-mod-v6-{{ checksum "go.sum" }} - paths: - - "/home/circleci/.go_workspace/pkg/mod" - run: name: Run tests command: | @@ -46,8 +45,10 @@ jobs: lint: machine: image: ubuntu-2204:2022.10.1 - resource_class: medium + resource_class: large steps: + - go/install: + version: "1.20" - checkout - run: name: Lint proto files @@ -55,13 +56,13 @@ jobs: - run: name: Lint command: | - curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s v1.50.1 + curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s v1.52.2 ./bin/golangci-lint run build_docker: machine: image: ubuntu-2204:2022.10.1 - resource_class: large + resource_class: large steps: - checkout - aws-ecr/build-image: diff --git a/btctxformatter/formatter_test.go b/btctxformatter/formatter_test.go index 757202528..06b9ea10f 100644 --- a/btctxformatter/formatter_test.go +++ b/btctxformatter/formatter_test.go @@ -2,13 +2,14 @@ package btctxformatter import ( "bytes" + cprand "crypto/rand" "math/rand" "testing" ) func randNBytes(n int) []byte { bytes := make([]byte, n) - rand.Read(bytes) + cprand.Read(bytes) //nolint:errcheck // This is a test. return bytes } From 13bb8a7d0ef7e44583309d2f188d6517df07cd6c Mon Sep 17 00:00:00 2001 From: KonradStaniec Date: Tue, 2 May 2023 11:57:20 +0200 Subject: [PATCH 51/59] Improve btccheckpointinfo rpc (#370) * Clean up btccheckpoint info implementation --- .../btccheckpoint/v1/btccheckpoint.proto | 21 +- x/btccheckpoint/keeper/grpc_query.go | 95 ++------- x/btccheckpoint/keeper/keeper.go | 50 ++++- x/btccheckpoint/keeper/keeper_test.go | 4 +- x/btccheckpoint/types/btccheckpoint.pb.go | 198 +++++++++--------- x/btccheckpoint/types/types.go | 9 +- 6 files changed, 176 insertions(+), 201 deletions(-) diff --git a/proto/babylon/btccheckpoint/v1/btccheckpoint.proto b/proto/babylon/btccheckpoint/v1/btccheckpoint.proto index 0aa77fe2e..68126cc7b 100644 --- a/proto/babylon/btccheckpoint/v1/btccheckpoint.proto +++ b/proto/babylon/btccheckpoint/v1/btccheckpoint.proto @@ -132,19 +132,20 @@ message CheckpointAddresses { bytes reporter = 2; } -// BTCCheckpointInfo contains all checkpoint related data expected in a query -// response. +// BTCCheckpointInfo contains all data about best submission of checkpoint for +// given epoch. Best submission is the submission which is deeper in btc ledger message BTCCheckpointInfo { // epoch number of this checkpoint uint64 epoch_number = 1; - // height of earliest BTC block that includes this checkpoint - uint64 earliest_btc_block_number = 2; - // hash of earliest BTC block that includes this checkpoint - bytes earliest_btc_block_hash = 3 + // btc height of the best submission of the epoch + uint64 best_submission_btc_block_height = 2; + // hash of the btc block which determines checkpoint btc block height i.e. + // youngest block of best submission + bytes best_submission_btc_block_hash = 3 [ (gogoproto.customtype) = "github.com/babylonchain/babylon/types.BTCHeaderHashBytes" ]; - // the BTC checkpoint transactions on the above block - repeated TransactionInfo earliest_btc_block_txs = 4; - // list of vigilantes' addresses - repeated CheckpointAddresses vigilante_address_list = 5; + // the BTC checkpoint transactions of the best submission + repeated TransactionInfo best_submission_transactions = 4; + // list of vigilantes' addresses of the best submission + repeated CheckpointAddresses best_submission_vigilante_address_list = 5; } diff --git a/x/btccheckpoint/keeper/grpc_query.go b/x/btccheckpoint/keeper/grpc_query.go index 3bdb75cec..19c038344 100644 --- a/x/btccheckpoint/keeper/grpc_query.go +++ b/x/btccheckpoint/keeper/grpc_query.go @@ -4,8 +4,6 @@ import ( "context" "errors" "fmt" - bbntypes "github.com/babylonchain/babylon/types" - "math" "github.com/babylonchain/babylon/x/btccheckpoint/types" "github.com/cosmos/cosmos-sdk/store/prefix" @@ -17,76 +15,28 @@ import ( var _ types.QueryServer = Keeper{} -func (k Keeper) lowestBtcHeightAndHash(ctx sdk.Context, subKey *types.SubmissionKey) (uint64, *bbntypes.BTCHeaderHashBytes, error) { - // initializing to max, as then every header height will be smaller - var lowestHeaderNumber uint64 = math.MaxUint64 - var lowestHeaderHash *bbntypes.BTCHeaderHashBytes +func (k Keeper) getCheckpointInfo(ctx sdk.Context, epochNum uint64, epochData *types.EpochData) (*types.BTCCheckpointInfo, error) { + bestSubmission := k.GetEpochBestSubmissionBtcInfo(ctx, epochData) - for _, tk := range subKey.Key { - - if !k.CheckHeaderIsOnMainChain(ctx, tk.Hash) { - return 0, nil, errors.New("one of submission headers not on main chain") - } - - headerNumber, err := k.GetBlockHeight(ctx, tk.Hash) - - if err != nil { - // CheckHeaderIsOnMainChain (which uses main chain depth) returned true which - // means header should be saved and we should know its heigh but GetBlockHeight - // returned error. Something is really bad, panic. - panic("Inconsistent data model in btc light client") - } - - if headerNumber < lowestHeaderNumber { - lowestHeaderNumber = headerNumber - lowestHeaderHash = tk.Hash - } - } - - return lowestHeaderNumber, lowestHeaderHash, nil -} - -func (k Keeper) getCheckpointInfo(ctx sdk.Context, epochNum uint64, subKeys []*types.SubmissionKey) (*types.BTCCheckpointInfo, error) { - if len(subKeys) == 0 { - return nil, errors.New("empty subKeys") + if bestSubmission == nil { + return nil, errors.New("checkpoint for given epoch not yet submitted") } - info := types.BTCCheckpointInfo{ - EpochNumber: epochNum, - EarliestBtcBlockNumber: math.MaxUint64, // initializing to max, as then every header height will be smaller - VigilanteAddressList: []*types.CheckpointAddresses{}, - } + bestSubmissionHeight, err := k.GetBlockHeight(ctx, &bestSubmission.YoungestBlockHash) - for _, subKey := range subKeys { - headerNumber, headerHash, err := k.lowestBtcHeightAndHash(ctx, subKey) - if err != nil { - // submission is not valid for some reason, ignore it - continue - } - - // get vigilante address - sd := k.GetSubmissionData(ctx, *subKey) - if sd == nil { - // submission is not valid for some reason, ignore it - continue - } - - // ensure lowest header number and hash - if headerNumber < info.EarliestBtcBlockNumber { - info.EarliestBtcBlockNumber = headerNumber - info.EarliestBtcBlockHash = headerHash - info.EarliestBtcBlockTxs = sd.TxsInfo - } - // append vigilante addresses - vAddrs := *sd.VigilanteAddresses // make a new copy - info.VigilanteAddressList = append(info.VigilanteAddressList, &vAddrs) + if err != nil { + return nil, fmt.Errorf("error getting best submission height: %w", err) } - if info.EarliestBtcBlockNumber == math.MaxUint64 { - return nil, errors.New("there is no valid submission for given raw checkpoint") - } + bestSubmissionData := k.GetSubmissionData(ctx, bestSubmission.SubmissionKey) - return &info, nil + return &types.BTCCheckpointInfo{ + EpochNumber: epochNum, + BestSubmissionBtcBlockHeight: bestSubmissionHeight, + BestSubmissionBtcBlockHash: &bestSubmission.YoungestBlockHash, + BestSubmissionTransactions: bestSubmissionData.TxsInfo, + BestSubmissionVigilanteAddressList: []*types.CheckpointAddresses{bestSubmissionData.VigilanteAddresses}, + }, nil } func (k Keeper) BtcCheckpointInfo(c context.Context, req *types.QueryBtcCheckpointInfoRequest) (*types.QueryBtcCheckpointInfoResponse, error) { @@ -98,14 +48,10 @@ func (k Keeper) BtcCheckpointInfo(c context.Context, req *types.QueryBtcCheckpoi checkpointEpoch := req.GetEpochNum() - epochData := k.GetEpochData(ctx, checkpointEpoch) + ed := k.GetEpochData(ctx, checkpointEpoch) - // Check if we have any submission for given epoch - if epochData == nil || len(epochData.Key) == 0 { - return nil, errors.New("checkpoint for given epoch not yet submitted") - } + ckptInfo, err := k.getCheckpointInfo(ctx, checkpointEpoch, ed) - ckptInfo, err := k.getCheckpointInfo(ctx, checkpointEpoch, epochData.Key) if err != nil { return nil, fmt.Errorf("failed to get lowest BTC height and hash in keys of epoch %d: %w", req.EpochNum, err) } @@ -133,16 +79,11 @@ func (k Keeper) BtcCheckpointsInfo(c context.Context, req *types.QueryBtcCheckpo var epochData types.EpochData k.cdc.MustUnmarshal(value, &epochData) - // Check if we have any submission for given epoch - if len(epochData.Key) == 0 { - return errors.New("checkpoint for given epoch not yet submitted") - } + ckptInfo, err := k.getCheckpointInfo(ctx, epochNum, &epochData) - ckptInfo, err := k.getCheckpointInfo(ctx, epochNum, epochData.Key) if err != nil { return fmt.Errorf("failed to get lowest BTC height and hash in keys of epoch %d: %w", epochNum, err) } - // append ckpt info ckptInfoList = append(ckptInfoList, ckptInfo) diff --git a/x/btccheckpoint/keeper/keeper.go b/x/btccheckpoint/keeper/keeper.go index 79f92f950..10753584a 100644 --- a/x/btccheckpoint/keeper/keeper.go +++ b/x/btccheckpoint/keeper/keeper.go @@ -108,11 +108,6 @@ func (k Keeper) GetBlockHeight(ctx sdk.Context, b *bbn.BTCHeaderHashBytes) (uint return k.btcLightClientKeeper.BlockHeight(ctx, b) } -func (k Keeper) CheckHeaderIsOnMainChain(ctx sdk.Context, hash *bbn.BTCHeaderHashBytes) bool { - depth, err := k.btcLightClientKeeper.MainChainDepth(ctx, hash) - return err == nil && depth >= 0 -} - func (k Keeper) headerDepth(ctx sdk.Context, headerHash *bbn.BTCHeaderHashBytes) (uint64, error) { blockDepth, err := k.btcLightClientKeeper.MainChainDepth(ctx, headerHash) @@ -143,6 +138,7 @@ func (k Keeper) checkSubmissionStatus(ctx sdk.Context, info *types.SubmissionBtc func (k Keeper) GetSubmissionBtcInfo(ctx sdk.Context, sk types.SubmissionKey) (*types.SubmissionBtcInfo, error) { var youngestBlockDepth uint64 = math.MaxUint64 + var youngestBlockHash *bbn.BTCHeaderHashBytes var lowestIndexInMostFreshBlock uint32 = math.MaxUint32 @@ -158,6 +154,7 @@ func (k Keeper) GetSubmissionBtcInfo(ctx sdk.Context, sk types.SubmissionKey) (* if currentBlockDepth < youngestBlockDepth { youngestBlockDepth = currentBlockDepth lowestIndexInMostFreshBlock = tk.Index + youngestBlockHash = tk.Hash } // This case happens when we have two submissions in the same block. @@ -189,10 +186,11 @@ func (k Keeper) GetSubmissionBtcInfo(ctx sdk.Context, sk types.SubmissionKey) (* } return &types.SubmissionBtcInfo{ - SubmissionKey: sk, - OldestBlockDepth: oldestBlockDepth, - YoungestBlockDepth: youngestBlockDepth, - LatestTxIndex: lowestIndexInMostFreshBlock, + SubmissionKey: sk, + OldestBlockDepth: oldestBlockDepth, + YoungestBlockDepth: youngestBlockDepth, + YoungestBlockHash: *youngestBlockHash, + YoungestBlockLowestTxIdx: lowestIndexInMostFreshBlock, }, nil } @@ -234,6 +232,35 @@ func (k Keeper) GetBestSubmission(ctx sdk.Context, epochNumber uint64) (types.Bt return ed.Status, bestSubmissionKey, nil } +func (k Keeper) GetEpochBestSubmissionBtcInfo(ctx sdk.Context, ed *types.EpochData) *types.SubmissionBtcInfo { + // there is no submissions for this epoch, so transitivly there is no best submission + if ed == nil || len(ed.Key) == 0 { + return nil + } + + // There is only one submission for this epoch: + // - either epoch is already finalized and we already chosen the best submission + // - or we only received one submission for this epoch + // Either way, we do not need to decide which submission is the best one. + if len(ed.Key) == 1 { + sk := *ed.Key[0] + btcInfo, err := k.GetSubmissionBtcInfo(ctx, sk) + + if err != nil { + k.Logger(ctx).Debug("Previously stored submission is not valid anymore. Submission key: %+v", sk) + } + + // we only log error, as the only error which we can receive here is that submission + // is not longer on btc canoncial chain, which essentially means that there is no valid submission + return btcInfo + } + + // We have more that one valid submission. We need to chose the best one. + epochSummary := k.getEpochChanges(ctx, nil, ed) + + return epochSummary.EpochBestSubmission +} + // checkAncestors checks if there is at least one ancestor in previous epoch submissions // previous epoch submission is considered ancestor when: // - it is on main chain @@ -620,10 +647,11 @@ func (k Keeper) checkCheckpoints(ctx sdk.Context) { if i != epochChanges.BestSubmissionIdx { k.deleteSubmission(ctx, *sk) } - currentEpoch.Key = []*types.SubmissionKey{&epochChanges.EpochBestSubmission.SubmissionKey} } + // leave only best submission key + currentEpoch.Key = []*types.SubmissionKey{&epochChanges.EpochBestSubmission.SubmissionKey} } else { - // applay changes to epoch according to changes + // apply changes to epoch according to changes for _, sk := range epochChanges.SubmissionsToDelete { k.deleteSubmission(ctx, *sk) } diff --git a/x/btccheckpoint/keeper/keeper_test.go b/x/btccheckpoint/keeper/keeper_test.go index 944188641..9d3fa923e 100644 --- a/x/btccheckpoint/keeper/keeper_test.go +++ b/x/btccheckpoint/keeper/keeper_test.go @@ -57,7 +57,7 @@ func TestKeeper_GetSubmissionBtcInfo(t *testing.T) { require.NoError(t, err) require.Equal(t, info.YoungestBlockDepth, tt.expectedYoungestBlockDepth, tt.name) - require.Equal(t, info.LatestTxIndex, tt.expectedTxIndex, tt.name) + require.Equal(t, info.YoungestBlockLowestTxIdx, tt.expectedTxIndex, tt.name) require.Equal(t, info.OldestBlockDepth, tt.expectedOldestBlockDepth, tt.name) }) } @@ -119,7 +119,7 @@ func FuzzGetSubmissionBtcInfo(f *testing.F) { } require.Equal(t, info.YoungestBlockDepth, expectedYoungestDepth) - require.Equal(t, info.LatestTxIndex, expectedTxIdx) + require.Equal(t, info.YoungestBlockLowestTxIdx, expectedTxIdx) require.Equal(t, info.OldestBlockDepth, expectedOldestDepth) }) } diff --git a/x/btccheckpoint/types/btccheckpoint.pb.go b/x/btccheckpoint/types/btccheckpoint.pb.go index f779bda7f..2c5545b37 100644 --- a/x/btccheckpoint/types/btccheckpoint.pb.go +++ b/x/btccheckpoint/types/btccheckpoint.pb.go @@ -507,19 +507,20 @@ func (m *CheckpointAddresses) GetReporter() []byte { return nil } -// BTCCheckpointInfo contains all checkpoint related data expected in a query -// response. +// BTCCheckpointInfo contains all data about best submission of checkpoint for +// given epoch. Best submission is the submission which is deeper in btc ledger type BTCCheckpointInfo struct { // epoch number of this checkpoint EpochNumber uint64 `protobuf:"varint,1,opt,name=epoch_number,json=epochNumber,proto3" json:"epoch_number,omitempty"` - // height of earliest BTC block that includes this checkpoint - EarliestBtcBlockNumber uint64 `protobuf:"varint,2,opt,name=earliest_btc_block_number,json=earliestBtcBlockNumber,proto3" json:"earliest_btc_block_number,omitempty"` - // hash of earliest BTC block that includes this checkpoint - EarliestBtcBlockHash *github_com_babylonchain_babylon_types.BTCHeaderHashBytes `protobuf:"bytes,3,opt,name=earliest_btc_block_hash,json=earliestBtcBlockHash,proto3,customtype=github.com/babylonchain/babylon/types.BTCHeaderHashBytes" json:"earliest_btc_block_hash,omitempty"` - // the BTC checkpoint transactions on the above block - EarliestBtcBlockTxs []*TransactionInfo `protobuf:"bytes,4,rep,name=earliest_btc_block_txs,json=earliestBtcBlockTxs,proto3" json:"earliest_btc_block_txs,omitempty"` - // list of vigilantes' addresses - VigilanteAddressList []*CheckpointAddresses `protobuf:"bytes,5,rep,name=vigilante_address_list,json=vigilanteAddressList,proto3" json:"vigilante_address_list,omitempty"` + // btc height of the best submission of the epoch + BestSubmissionBtcBlockHeight uint64 `protobuf:"varint,2,opt,name=best_submission_btc_block_height,json=bestSubmissionBtcBlockHeight,proto3" json:"best_submission_btc_block_height,omitempty"` + // hash of the btc block which determines checkpoint btc block height i.e. + // youngest block of best submission + BestSubmissionBtcBlockHash *github_com_babylonchain_babylon_types.BTCHeaderHashBytes `protobuf:"bytes,3,opt,name=best_submission_btc_block_hash,json=bestSubmissionBtcBlockHash,proto3,customtype=github.com/babylonchain/babylon/types.BTCHeaderHashBytes" json:"best_submission_btc_block_hash,omitempty"` + // the BTC checkpoint transactions of the best submission + BestSubmissionTransactions []*TransactionInfo `protobuf:"bytes,4,rep,name=best_submission_transactions,json=bestSubmissionTransactions,proto3" json:"best_submission_transactions,omitempty"` + // list of vigilantes' addresses of the best submission + BestSubmissionVigilanteAddressList []*CheckpointAddresses `protobuf:"bytes,5,rep,name=best_submission_vigilante_address_list,json=bestSubmissionVigilanteAddressList,proto3" json:"best_submission_vigilante_address_list,omitempty"` } func (m *BTCCheckpointInfo) Reset() { *m = BTCCheckpointInfo{} } @@ -562,23 +563,23 @@ func (m *BTCCheckpointInfo) GetEpochNumber() uint64 { return 0 } -func (m *BTCCheckpointInfo) GetEarliestBtcBlockNumber() uint64 { +func (m *BTCCheckpointInfo) GetBestSubmissionBtcBlockHeight() uint64 { if m != nil { - return m.EarliestBtcBlockNumber + return m.BestSubmissionBtcBlockHeight } return 0 } -func (m *BTCCheckpointInfo) GetEarliestBtcBlockTxs() []*TransactionInfo { +func (m *BTCCheckpointInfo) GetBestSubmissionTransactions() []*TransactionInfo { if m != nil { - return m.EarliestBtcBlockTxs + return m.BestSubmissionTransactions } return nil } -func (m *BTCCheckpointInfo) GetVigilanteAddressList() []*CheckpointAddresses { +func (m *BTCCheckpointInfo) GetBestSubmissionVigilanteAddressList() []*CheckpointAddresses { if m != nil { - return m.VigilanteAddressList + return m.BestSubmissionVigilanteAddressList } return nil } @@ -600,57 +601,58 @@ func init() { } var fileDescriptor_e096cac78d49b0a6 = []byte{ - // 788 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x55, 0x4d, 0x6f, 0x32, 0x55, - 0x14, 0x66, 0x80, 0xbe, 0xbe, 0x5c, 0x28, 0x6f, 0xbd, 0x50, 0x1c, 0x89, 0xa1, 0x74, 0x5c, 0x94, - 0x1a, 0x85, 0xb4, 0x6a, 0xd2, 0xaa, 0x9b, 0x0e, 0xd0, 0x94, 0xb4, 0x85, 0x66, 0x98, 0x6e, 0xba, - 0xe8, 0x64, 0x66, 0xb8, 0x30, 0x37, 0x0c, 0x73, 0xc9, 0xdc, 0x0b, 0x01, 0xb7, 0xc6, 0xc4, 0xb8, - 0x32, 0xee, 0x5d, 0xb9, 0xf4, 0x8f, 0xb8, 0x70, 0xd1, 0xa5, 0xe9, 0xa2, 0x31, 0xed, 0xcf, 0x70, - 0x63, 0xe6, 0xce, 0xf0, 0x59, 0x88, 0x92, 0xb8, 0xe3, 0x9c, 0xf3, 0x9c, 0x8f, 0xe7, 0x39, 0xe7, - 0x32, 0xe0, 0x53, 0x43, 0x37, 0xc6, 0x36, 0x71, 0x4a, 0x06, 0x33, 0x4d, 0x0b, 0x99, 0xdd, 0x3e, - 0xc1, 0x0e, 0x2b, 0x0d, 0x8f, 0x16, 0x1d, 0xc5, 0xbe, 0x4b, 0x18, 0x81, 0x62, 0x80, 0x2e, 0x2e, - 0x06, 0x87, 0x47, 0xd9, 0x74, 0x87, 0x74, 0x08, 0x07, 0x95, 0xbc, 0x5f, 0x3e, 0x5e, 0xfa, 0x5b, - 0x00, 0x71, 0x59, 0x2d, 0x37, 0xfb, 0xc3, 0x1b, 0x97, 0x90, 0x36, 0x3c, 0x00, 0xef, 0x0c, 0x66, - 0x6a, 0xcc, 0xd5, 0x1d, 0xaa, 0x9b, 0x0c, 0x13, 0x47, 0x14, 0xf2, 0x42, 0x21, 0xa1, 0x24, 0x0d, - 0x66, 0xaa, 0x33, 0x2f, 0x3c, 0x06, 0xbb, 0x4b, 0x40, 0x0d, 0x3b, 0x2d, 0x34, 0x12, 0xc3, 0x79, - 0xa1, 0xb0, 0xad, 0xa4, 0x16, 0xe1, 0x35, 0x2f, 0x04, 0xf7, 0x41, 0xa2, 0x87, 0xdc, 0xae, 0x8d, - 0x34, 0x87, 0xb4, 0x10, 0x15, 0x23, 0xbc, 0x72, 0xdc, 0xf7, 0xd5, 0x3d, 0x17, 0xb4, 0xc1, 0xae, - 0x49, 0x9c, 0x36, 0x76, 0x7b, 0xd8, 0xe9, 0x68, 0x5e, 0x07, 0x0b, 0xe9, 0x2d, 0xe4, 0x8a, 0x51, - 0x0f, 0x2b, 0x9f, 0x3c, 0x3e, 0xed, 0x7d, 0xd1, 0xc1, 0xcc, 0x1a, 0x18, 0x45, 0x93, 0xf4, 0x4a, - 0x01, 0x5b, 0xd3, 0xd2, 0xb1, 0x33, 0x31, 0x4a, 0x6c, 0xdc, 0x47, 0xb4, 0x28, 0xab, 0xe5, 0x0b, - 0x9e, 0x2a, 0x8f, 0x19, 0xa2, 0x4a, 0x6a, 0x56, 0x56, 0x66, 0xa6, 0x1f, 0x91, 0x46, 0x20, 0x39, - 0x37, 0xe4, 0x25, 0x1a, 0xc3, 0x34, 0xd8, 0xf2, 0x69, 0x08, 0x9c, 0x86, 0x6f, 0xc0, 0x1b, 0x10, - 0xb5, 0x74, 0x6a, 0x71, 0x6e, 0x09, 0xf9, 0x9b, 0xc7, 0xa7, 0xbd, 0x93, 0x0d, 0x87, 0xb8, 0xd0, - 0xa9, 0xe5, 0x0f, 0xc2, 0x2b, 0x49, 0x97, 0x60, 0xbb, 0x39, 0x30, 0x7a, 0x98, 0xd2, 0xa0, 0xf1, - 0x57, 0x20, 0xd2, 0x45, 0x63, 0x51, 0xc8, 0x47, 0x0a, 0xf1, 0xe3, 0x42, 0x71, 0xdd, 0x1a, 0x8b, - 0x8b, 0xf3, 0x2a, 0x5e, 0x92, 0xf4, 0xbd, 0x00, 0xde, 0x2d, 0x88, 0xdd, 0x26, 0xb3, 0x7a, 0xc2, - 0xc6, 0xf5, 0x60, 0x1e, 0xc4, 0xe7, 0x0f, 0x20, 0xec, 0xaf, 0x69, 0xce, 0xe5, 0xc9, 0xd4, 0xf7, - 0xee, 0x25, 0x58, 0xa1, 0x6f, 0x48, 0x7f, 0x08, 0x20, 0x39, 0x63, 0x55, 0xd1, 0x99, 0x0e, 0xef, - 0x41, 0x6a, 0x88, 0x3b, 0xd8, 0xd6, 0x1d, 0x86, 0x34, 0xbd, 0xd5, 0x72, 0x11, 0xa5, 0x88, 0x06, - 0x63, 0x7d, 0xb6, 0x7e, 0xac, 0xf2, 0xd4, 0x3a, 0x9b, 0x24, 0x29, 0x70, 0x5a, 0x69, 0xea, 0x83, - 0x15, 0xf0, 0x96, 0x8d, 0xa8, 0x86, 0x9d, 0x36, 0x11, 0xc3, 0x5c, 0xbb, 0xc3, 0xff, 0xc4, 0xd5, - 0xd3, 0x48, 0x79, 0x8f, 0x8d, 0x28, 0x17, 0x2b, 0x0d, 0xb6, 0x50, 0x9f, 0x98, 0x16, 0xa7, 0x13, - 0x55, 0x7c, 0x43, 0xfa, 0x4e, 0x00, 0xb1, 0xaa, 0xf7, 0x8b, 0x33, 0x39, 0x9d, 0x5f, 0xd0, 0xc1, - 0xfa, 0x26, 0x0b, 0x6b, 0xf5, 0xf5, 0xfc, 0x1a, 0xbc, 0xa1, 0x4c, 0x67, 0x03, 0xca, 0xa5, 0x4c, - 0x1e, 0x7f, 0xbc, 0x3e, 0x5b, 0x66, 0x66, 0x93, 0x43, 0x95, 0x20, 0x45, 0x6a, 0x80, 0xd4, 0x0a, - 0x31, 0xe0, 0x47, 0x20, 0x46, 0xbd, 0x4e, 0x8c, 0x21, 0x37, 0x78, 0xa2, 0x33, 0x07, 0xcc, 0x82, - 0xb7, 0x2e, 0xea, 0x13, 0xd7, 0x0b, 0xfa, 0xeb, 0x9b, 0xda, 0xd2, 0x6f, 0x11, 0xf0, 0xbe, 0xac, - 0x96, 0x67, 0x45, 0xb9, 0x04, 0xfb, 0x20, 0xc1, 0x59, 0x6b, 0xce, 0xa0, 0x67, 0x04, 0x25, 0xa3, - 0x4a, 0x9c, 0xfb, 0xea, 0xdc, 0x05, 0x4f, 0xc1, 0x87, 0x48, 0x77, 0x6d, 0x8c, 0x28, 0xe3, 0x2f, - 0xd3, 0xb0, 0x89, 0xd9, 0x9d, 0xe0, 0xc3, 0x1c, 0x9f, 0x99, 0x00, 0x64, 0x66, 0xca, 0x5e, 0x38, - 0x48, 0xa5, 0xe0, 0x83, 0x15, 0xa9, 0xfc, 0x4d, 0x45, 0xfe, 0x87, 0x37, 0x95, 0x5e, 0x6e, 0xeb, - 0x85, 0xe0, 0x3d, 0xc8, 0xac, 0x68, 0xca, 0x46, 0x54, 0x8c, 0x6e, 0x7a, 0x29, 0xa9, 0xe5, 0x06, - 0xea, 0x88, 0x42, 0x13, 0x64, 0x5e, 0xdd, 0xb6, 0x66, 0x63, 0xca, 0xc4, 0x2d, 0x5e, 0x7f, 0xc3, - 0xf3, 0x4e, 0x2f, 0x9f, 0xf7, 0x15, 0xa6, 0xec, 0x93, 0x9f, 0x05, 0x10, 0x9b, 0x1e, 0x05, 0x3c, - 0x04, 0x99, 0xea, 0x4d, 0xa3, 0x7c, 0xa1, 0x35, 0xd5, 0x33, 0xf5, 0xb6, 0xa9, 0x35, 0x6f, 0xe5, - 0xeb, 0x9a, 0xaa, 0x56, 0x2b, 0x3b, 0xa1, 0xec, 0xf6, 0x8f, 0xbf, 0xe4, 0x63, 0xcd, 0xe0, 0x04, - 0x5a, 0xaf, 0xa0, 0xe5, 0x46, 0xfd, 0xbc, 0xa6, 0x5c, 0x57, 0x2b, 0x3b, 0x82, 0x0f, 0x2d, 0xfb, - 0x7f, 0x88, 0x2b, 0xa0, 0xe7, 0xb5, 0xfa, 0xd9, 0x55, 0xed, 0xae, 0x5a, 0xd9, 0x09, 0xfb, 0xd0, - 0x73, 0xec, 0xe8, 0x36, 0xfe, 0x16, 0xb5, 0xb2, 0xd1, 0x1f, 0x7e, 0xcd, 0x85, 0xe4, 0xc6, 0xef, - 0xcf, 0x39, 0xe1, 0xe1, 0x39, 0x27, 0xfc, 0xf5, 0x9c, 0x13, 0x7e, 0x7a, 0xc9, 0x85, 0x1e, 0x5e, - 0x72, 0xa1, 0x3f, 0x5f, 0x72, 0xa1, 0xbb, 0x2f, 0xff, 0x6d, 0x87, 0xa3, 0xa5, 0xef, 0x18, 0xdf, - 0xa9, 0xf1, 0x86, 0x7f, 0x8d, 0x3e, 0xff, 0x27, 0x00, 0x00, 0xff, 0xff, 0xdc, 0xaf, 0x2a, 0x70, - 0xed, 0x06, 0x00, 0x00, + // 809 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x55, 0x4b, 0x6f, 0xea, 0x46, + 0x14, 0x66, 0x80, 0xdc, 0x5e, 0x06, 0xc2, 0x4d, 0x87, 0xdc, 0xca, 0x42, 0x91, 0x2f, 0xd7, 0x95, + 0x1a, 0x52, 0xb5, 0xa0, 0xa4, 0xad, 0x94, 0x3e, 0x36, 0x31, 0x0f, 0x81, 0x92, 0x40, 0x64, 0x9c, + 0x2e, 0xb2, 0xa8, 0x65, 0x9b, 0x01, 0x8f, 0x00, 0x0f, 0xf2, 0x0c, 0x08, 0xba, 0x6a, 0x55, 0x55, + 0xaa, 0xba, 0xaa, 0xba, 0xef, 0xaa, 0x7f, 0xa6, 0x8b, 0x2e, 0xb2, 0xac, 0xb2, 0x88, 0xaa, 0xe4, + 0x1f, 0x74, 0xdb, 0x4d, 0xe5, 0xb1, 0xc3, 0x2b, 0xa1, 0x2d, 0xd2, 0xdd, 0x71, 0xce, 0x7c, 0xe7, + 0xf1, 0x7d, 0xe7, 0x1c, 0x0c, 0x3f, 0xb0, 0x4c, 0x6b, 0xda, 0xa7, 0x6e, 0xd1, 0xe2, 0xb6, 0xed, + 0x60, 0xbb, 0x37, 0xa4, 0xc4, 0xe5, 0xc5, 0xf1, 0xe1, 0xb2, 0xa3, 0x30, 0xf4, 0x28, 0xa7, 0x48, + 0x0a, 0xd1, 0x85, 0xe5, 0xc7, 0xf1, 0x61, 0x76, 0xb7, 0x4b, 0xbb, 0x54, 0x80, 0x8a, 0xfe, 0xaf, + 0x00, 0xaf, 0xfc, 0x0d, 0x60, 0x52, 0xd5, 0x4b, 0xad, 0xe1, 0xf8, 0xc2, 0xa3, 0xb4, 0x83, 0xf6, + 0xe1, 0x0b, 0x8b, 0xdb, 0x06, 0xf7, 0x4c, 0x97, 0x99, 0x36, 0x27, 0xd4, 0x95, 0x40, 0x0e, 0xe4, + 0x53, 0x5a, 0xda, 0xe2, 0xb6, 0x3e, 0xf7, 0xa2, 0x23, 0xf8, 0x72, 0x05, 0x68, 0x10, 0xb7, 0x8d, + 0x27, 0x52, 0x34, 0x07, 0xf2, 0xdb, 0x5a, 0x66, 0x19, 0x5e, 0xf7, 0x9f, 0xd0, 0x6b, 0x98, 0x1a, + 0x60, 0xaf, 0xd7, 0xc7, 0x86, 0x4b, 0xdb, 0x98, 0x49, 0x31, 0x91, 0x39, 0x19, 0xf8, 0x1a, 0xbe, + 0x0b, 0xf5, 0xe1, 0x4b, 0x9b, 0xba, 0x1d, 0xe2, 0x0d, 0x88, 0xdb, 0x35, 0xfc, 0x0a, 0x0e, 0x36, + 0xdb, 0xd8, 0x93, 0xe2, 0x3e, 0x56, 0x3d, 0xbe, 0xb9, 0x7d, 0xf5, 0x71, 0x97, 0x70, 0x67, 0x64, + 0x15, 0x6c, 0x3a, 0x28, 0x86, 0x6c, 0x6d, 0xc7, 0x24, 0xee, 0x83, 0x51, 0xe4, 0xd3, 0x21, 0x66, + 0x05, 0x55, 0x2f, 0xd5, 0x44, 0xa8, 0x3a, 0xe5, 0x98, 0x69, 0x99, 0x79, 0x5a, 0x95, 0xdb, 0xc1, + 0x8b, 0x32, 0x81, 0xe9, 0x85, 0x26, 0x4f, 0xf1, 0x14, 0xed, 0xc2, 0xad, 0x80, 0x06, 0x10, 0x34, + 0x02, 0x03, 0x5d, 0xc0, 0xb8, 0x63, 0x32, 0x47, 0x70, 0x4b, 0xa9, 0x5f, 0xdc, 0xdc, 0xbe, 0x3a, + 0xde, 0xb0, 0x89, 0x9a, 0xc9, 0x9c, 0xa0, 0x11, 0x91, 0x49, 0x39, 0x85, 0xdb, 0xad, 0x91, 0x35, + 0x20, 0x8c, 0x85, 0x85, 0x3f, 0x83, 0xb1, 0x1e, 0x9e, 0x4a, 0x20, 0x17, 0xcb, 0x27, 0x8f, 0xf2, + 0x85, 0x75, 0x63, 0x2c, 0x2c, 0xf7, 0xab, 0xf9, 0x41, 0xca, 0xf7, 0x00, 0xbe, 0x58, 0x12, 0xbb, + 0x43, 0xe7, 0xf9, 0xc0, 0xc6, 0xf9, 0x50, 0x0e, 0x26, 0x17, 0x17, 0x20, 0x1a, 0x8c, 0x69, 0xc1, + 0xe5, 0xcb, 0x34, 0xf4, 0xf7, 0x25, 0x1c, 0x61, 0x60, 0x28, 0xbf, 0x03, 0x98, 0x9e, 0xb3, 0x2a, + 0x9b, 0xdc, 0x44, 0x5f, 0xc1, 0xcc, 0x98, 0x74, 0x49, 0xdf, 0x74, 0x39, 0x36, 0xcc, 0x76, 0xdb, + 0xc3, 0x8c, 0x61, 0x16, 0xb6, 0xf5, 0xe1, 0xfa, 0xb6, 0x4a, 0x33, 0xeb, 0xe4, 0x21, 0x48, 0x43, + 0xb3, 0x4c, 0x33, 0x1f, 0x2a, 0xc3, 0xe7, 0x7c, 0xc2, 0x0c, 0xe2, 0x76, 0xa8, 0x14, 0x15, 0xda, + 0x1d, 0xfc, 0x2f, 0xae, 0xbe, 0x46, 0xda, 0x5b, 0x7c, 0xc2, 0x84, 0x58, 0xbb, 0x70, 0x0b, 0x0f, + 0xa9, 0xed, 0x08, 0x3a, 0x71, 0x2d, 0x30, 0x94, 0xef, 0x00, 0x4c, 0x54, 0xfc, 0x5f, 0x82, 0xc9, + 0xa7, 0x8b, 0x03, 0xda, 0x5f, 0x5f, 0x64, 0x69, 0xac, 0x81, 0x9e, 0x9f, 0xc3, 0x67, 0x8c, 0x9b, + 0x7c, 0xc4, 0x84, 0x94, 0xe9, 0xa3, 0x77, 0xd7, 0x47, 0xab, 0xdc, 0x6e, 0x09, 0xa8, 0x16, 0x86, + 0x28, 0x4d, 0x98, 0x79, 0x42, 0x0c, 0xb4, 0x07, 0x13, 0xcc, 0xaf, 0xc4, 0x39, 0xf6, 0xc2, 0x13, + 0x9d, 0x3b, 0x50, 0x16, 0x3e, 0xf7, 0xf0, 0x90, 0x7a, 0xfe, 0x63, 0x30, 0xbe, 0x99, 0xad, 0xfc, + 0x15, 0x83, 0x6f, 0xab, 0x7a, 0x69, 0x9e, 0x54, 0x48, 0xf0, 0x1a, 0xa6, 0x04, 0x6b, 0xc3, 0x1d, + 0x0d, 0xac, 0x30, 0x65, 0x5c, 0x4b, 0x0a, 0x5f, 0x43, 0xb8, 0x50, 0x15, 0xe6, 0x2c, 0xcc, 0xb8, + 0xc1, 0x66, 0x0c, 0xc5, 0x81, 0x5a, 0x7d, 0x6a, 0xf7, 0x0c, 0x07, 0x93, 0xae, 0xc3, 0x45, 0xb1, + 0xb8, 0xb6, 0xe7, 0xe3, 0xe6, 0x42, 0xa8, 0xdc, 0x56, 0x7d, 0x50, 0x4d, 0x60, 0xd0, 0x37, 0x00, + 0xca, 0xff, 0x92, 0xc8, 0x3f, 0xb4, 0xd8, 0x1b, 0x38, 0xb4, 0xec, 0x9a, 0x26, 0x4c, 0xe6, 0xa0, + 0x1e, 0xdc, 0x5b, 0xed, 0x60, 0x61, 0xbd, 0x99, 0x14, 0xdf, 0x74, 0x95, 0x56, 0x8a, 0x2d, 0x3c, + 0x33, 0xf4, 0x2d, 0x80, 0xef, 0xad, 0x56, 0x7b, 0x74, 0x14, 0x46, 0x9f, 0x30, 0x2e, 0x6d, 0x89, + 0xba, 0x1b, 0xde, 0x85, 0xb2, 0x5c, 0xfb, 0xcb, 0x95, 0x2b, 0x39, 0x23, 0x8c, 0xbf, 0xff, 0x33, + 0x80, 0x89, 0xd9, 0x6e, 0xa1, 0x03, 0xf8, 0x4e, 0xe5, 0xa2, 0x59, 0xaa, 0x19, 0x2d, 0xfd, 0x44, + 0xbf, 0x6c, 0x19, 0xad, 0x4b, 0xf5, 0xbc, 0xae, 0xeb, 0x95, 0xf2, 0x4e, 0x24, 0xbb, 0xfd, 0xe3, + 0x2f, 0xb9, 0x44, 0x2b, 0xdc, 0xa4, 0xf6, 0x23, 0x68, 0xa9, 0xd9, 0xa8, 0xd6, 0xb5, 0xf3, 0x4a, + 0x79, 0x07, 0x04, 0xd0, 0x52, 0xf0, 0xbf, 0xfa, 0x04, 0xb4, 0x5a, 0x6f, 0x9c, 0x9c, 0xd5, 0xaf, + 0x2a, 0xe5, 0x9d, 0x68, 0x00, 0xad, 0x12, 0xd7, 0xec, 0x93, 0xaf, 0x71, 0x3b, 0x1b, 0xff, 0xe1, + 0x57, 0x39, 0xa2, 0x36, 0x7f, 0xbb, 0x93, 0xc1, 0xf5, 0x9d, 0x0c, 0xfe, 0xbc, 0x93, 0xc1, 0x4f, + 0xf7, 0x72, 0xe4, 0xfa, 0x5e, 0x8e, 0xfc, 0x71, 0x2f, 0x47, 0xae, 0x3e, 0xf9, 0xaf, 0xa9, 0x4f, + 0x56, 0x3e, 0x87, 0x62, 0x0b, 0xac, 0x67, 0xe2, 0xa3, 0xf6, 0xd1, 0x3f, 0x01, 0x00, 0x00, 0xff, + 0xff, 0xa5, 0xcd, 0xc5, 0xce, 0x34, 0x07, 0x00, 0x00, } func (m *BTCSpvProof) Marshal() (dAtA []byte, err error) { @@ -986,10 +988,10 @@ func (m *BTCCheckpointInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l - if len(m.VigilanteAddressList) > 0 { - for iNdEx := len(m.VigilanteAddressList) - 1; iNdEx >= 0; iNdEx-- { + if len(m.BestSubmissionVigilanteAddressList) > 0 { + for iNdEx := len(m.BestSubmissionVigilanteAddressList) - 1; iNdEx >= 0; iNdEx-- { { - size, err := m.VigilanteAddressList[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + size, err := m.BestSubmissionVigilanteAddressList[iNdEx].MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -1000,10 +1002,10 @@ func (m *BTCCheckpointInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0x2a } } - if len(m.EarliestBtcBlockTxs) > 0 { - for iNdEx := len(m.EarliestBtcBlockTxs) - 1; iNdEx >= 0; iNdEx-- { + if len(m.BestSubmissionTransactions) > 0 { + for iNdEx := len(m.BestSubmissionTransactions) - 1; iNdEx >= 0; iNdEx-- { { - size, err := m.EarliestBtcBlockTxs[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + size, err := m.BestSubmissionTransactions[iNdEx].MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -1014,11 +1016,11 @@ func (m *BTCCheckpointInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0x22 } } - if m.EarliestBtcBlockHash != nil { + if m.BestSubmissionBtcBlockHash != nil { { - size := m.EarliestBtcBlockHash.Size() + size := m.BestSubmissionBtcBlockHash.Size() i -= size - if _, err := m.EarliestBtcBlockHash.MarshalTo(dAtA[i:]); err != nil { + if _, err := m.BestSubmissionBtcBlockHash.MarshalTo(dAtA[i:]); err != nil { return 0, err } i = encodeVarintBtccheckpoint(dAtA, i, uint64(size)) @@ -1026,8 +1028,8 @@ func (m *BTCCheckpointInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x1a } - if m.EarliestBtcBlockNumber != 0 { - i = encodeVarintBtccheckpoint(dAtA, i, uint64(m.EarliestBtcBlockNumber)) + if m.BestSubmissionBtcBlockHeight != 0 { + i = encodeVarintBtccheckpoint(dAtA, i, uint64(m.BestSubmissionBtcBlockHeight)) i-- dAtA[i] = 0x10 } @@ -1192,21 +1194,21 @@ func (m *BTCCheckpointInfo) Size() (n int) { if m.EpochNumber != 0 { n += 1 + sovBtccheckpoint(uint64(m.EpochNumber)) } - if m.EarliestBtcBlockNumber != 0 { - n += 1 + sovBtccheckpoint(uint64(m.EarliestBtcBlockNumber)) + if m.BestSubmissionBtcBlockHeight != 0 { + n += 1 + sovBtccheckpoint(uint64(m.BestSubmissionBtcBlockHeight)) } - if m.EarliestBtcBlockHash != nil { - l = m.EarliestBtcBlockHash.Size() + if m.BestSubmissionBtcBlockHash != nil { + l = m.BestSubmissionBtcBlockHash.Size() n += 1 + l + sovBtccheckpoint(uint64(l)) } - if len(m.EarliestBtcBlockTxs) > 0 { - for _, e := range m.EarliestBtcBlockTxs { + if len(m.BestSubmissionTransactions) > 0 { + for _, e := range m.BestSubmissionTransactions { l = e.Size() n += 1 + l + sovBtccheckpoint(uint64(l)) } } - if len(m.VigilanteAddressList) > 0 { - for _, e := range m.VigilanteAddressList { + if len(m.BestSubmissionVigilanteAddressList) > 0 { + for _, e := range m.BestSubmissionVigilanteAddressList { l = e.Size() n += 1 + l + sovBtccheckpoint(uint64(l)) } @@ -2144,9 +2146,9 @@ func (m *BTCCheckpointInfo) Unmarshal(dAtA []byte) error { } case 2: if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field EarliestBtcBlockNumber", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field BestSubmissionBtcBlockHeight", wireType) } - m.EarliestBtcBlockNumber = 0 + m.BestSubmissionBtcBlockHeight = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowBtccheckpoint @@ -2156,14 +2158,14 @@ func (m *BTCCheckpointInfo) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.EarliestBtcBlockNumber |= uint64(b&0x7F) << shift + m.BestSubmissionBtcBlockHeight |= uint64(b&0x7F) << shift if b < 0x80 { break } } case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EarliestBtcBlockHash", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field BestSubmissionBtcBlockHash", wireType) } var byteLen int for shift := uint(0); ; shift += 7 { @@ -2191,14 +2193,14 @@ func (m *BTCCheckpointInfo) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } var v github_com_babylonchain_babylon_types.BTCHeaderHashBytes - m.EarliestBtcBlockHash = &v - if err := m.EarliestBtcBlockHash.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + m.BestSubmissionBtcBlockHash = &v + if err := m.BestSubmissionBtcBlockHash.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EarliestBtcBlockTxs", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field BestSubmissionTransactions", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -2225,14 +2227,14 @@ func (m *BTCCheckpointInfo) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.EarliestBtcBlockTxs = append(m.EarliestBtcBlockTxs, &TransactionInfo{}) - if err := m.EarliestBtcBlockTxs[len(m.EarliestBtcBlockTxs)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + m.BestSubmissionTransactions = append(m.BestSubmissionTransactions, &TransactionInfo{}) + if err := m.BestSubmissionTransactions[len(m.BestSubmissionTransactions)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field VigilanteAddressList", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field BestSubmissionVigilanteAddressList", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -2259,8 +2261,8 @@ func (m *BTCCheckpointInfo) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.VigilanteAddressList = append(m.VigilanteAddressList, &CheckpointAddresses{}) - if err := m.VigilanteAddressList[len(m.VigilanteAddressList)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + m.BestSubmissionVigilanteAddressList = append(m.BestSubmissionVigilanteAddressList, &CheckpointAddresses{}) + if err := m.BestSubmissionVigilanteAddressList[len(m.BestSubmissionVigilanteAddressList)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex diff --git a/x/btccheckpoint/types/types.go b/x/btccheckpoint/types/types.go index 97dfc1211..bec28894e 100644 --- a/x/btccheckpoint/types/types.go +++ b/x/btccheckpoint/types/types.go @@ -32,8 +32,11 @@ type SubmissionBtcInfo struct { // Depth of the youngest btc header of the submission YoungestBlockDepth uint64 - // Index of the latest transaction in youngest submission block - LatestTxIndex uint32 + // Hash of the youngest btc header of the submission + YoungestBlockHash types.BTCHeaderHashBytes + + // Index of the lowest index transaction in youngest submission block + YoungestBlockLowestTxIdx uint32 } func NewRawCheckpointSubmission( @@ -147,7 +150,7 @@ func (newSubmission *SubmissionBtcInfo) IsBetterThan(currentBestSubmission *Subm // at this point we know that both submissions youngest part happens to be in // the same block. To resolve the tie we need to take into account index of // latest transaction of the submissions - return newSubmission.LatestTxIndex < currentBestSubmission.LatestTxIndex + return newSubmission.YoungestBlockLowestTxIdx < currentBestSubmission.YoungestBlockLowestTxIdx } func NewTransactionInfo(txKey *TransactionKey, txBytes []byte, proof []byte) *TransactionInfo { From cc5c8ec0186e332d1c4bb8119e451f31439fc141 Mon Sep 17 00:00:00 2001 From: Vitalis Salis Date: Tue, 2 May 2023 13:01:47 +0300 Subject: [PATCH 52/59] chore: Reduce default number of tests from 100 to 10 (#373) --- types/btc_header_bytes_test.go | 10 +++++----- types/btc_header_hash_bytes_test.go | 10 +++++----- x/btccheckpoint/keeper/keeper_test.go | 2 +- .../keeper/base_btc_header_test.go | 2 +- x/btclightclient/keeper/grpc_query_test.go | 10 +++++----- x/btclightclient/keeper/keeper_test.go | 10 +++++----- x/btclightclient/keeper/msg_server_test.go | 2 +- x/btclightclient/keeper/state_test.go | 18 +++++++++--------- x/btclightclient/types/btc_header_info_test.go | 2 +- x/btclightclient/types/keys_test.go | 4 ++-- x/btclightclient/types/msgs_test.go | 2 +- x/btclightclient/types/querier_test.go | 2 +- x/btclightclient/types/work_test.go | 2 +- .../keeper/grpc_query_checkpoint_test.go | 4 ++-- x/epoching/keeper/epoch_msg_queue_test.go | 8 ++++---- .../keeper/epoch_slashed_val_set_test.go | 2 +- x/epoching/keeper/epoch_val_set_test.go | 2 +- x/epoching/types/epoching_test.go | 2 +- 18 files changed, 47 insertions(+), 47 deletions(-) diff --git a/types/btc_header_bytes_test.go b/types/btc_header_bytes_test.go index 21fa5088d..df0b00dcd 100644 --- a/types/btc_header_bytes_test.go +++ b/types/btc_header_bytes_test.go @@ -11,7 +11,7 @@ import ( ) func FuzzBTCHeaderBytesBytesOps(f *testing.F) { - datagen.AddRandomSeedsToFuzzer(f, 100) + datagen.AddRandomSeedsToFuzzer(f, 10) f.Fuzz(func(t *testing.T, seed int64) { r := rand.New(rand.NewSource(seed)) @@ -77,7 +77,7 @@ func FuzzBTCHeaderBytesBytesOps(f *testing.F) { } func FuzzBTCHeaderBytesHexOps(f *testing.F) { - datagen.AddRandomSeedsToFuzzer(f, 100) + datagen.AddRandomSeedsToFuzzer(f, 10) f.Fuzz(func(t *testing.T, seed int64) { r := rand.New(rand.NewSource(seed)) @@ -120,7 +120,7 @@ func FuzzBTCHeaderBytesHexOps(f *testing.F) { } func FuzzBTCHeaderBytesJSONOps(f *testing.F) { - datagen.AddRandomSeedsToFuzzer(f, 100) + datagen.AddRandomSeedsToFuzzer(f, 10) f.Fuzz(func(t *testing.T, seed int64) { r := rand.New(rand.NewSource(seed)) @@ -171,7 +171,7 @@ func FuzzBTCHeaderBytesJSONOps(f *testing.F) { } func FuzzBTCHeaderBytesBtcdBlockOps(f *testing.F) { - datagen.AddRandomSeedsToFuzzer(f, 100) + datagen.AddRandomSeedsToFuzzer(f, 10) f.Fuzz(func(t *testing.T, seed int64) { r := rand.New(rand.NewSource(seed)) @@ -193,7 +193,7 @@ func FuzzBTCHeaderBytesBtcdBlockOps(f *testing.F) { } func FuzzBTCHeaderBytesOperators(f *testing.F) { - datagen.AddRandomSeedsToFuzzer(f, 100) + datagen.AddRandomSeedsToFuzzer(f, 10) f.Fuzz(func(t *testing.T, seed int64) { r := rand.New(rand.NewSource(seed)) diff --git a/types/btc_header_hash_bytes_test.go b/types/btc_header_hash_bytes_test.go index 7d4bd514f..83305e969 100644 --- a/types/btc_header_hash_bytes_test.go +++ b/types/btc_header_hash_bytes_test.go @@ -12,7 +12,7 @@ import ( ) func FuzzBTCHeaderHashBytesBytesOps(f *testing.F) { - datagen.AddRandomSeedsToFuzzer(f, 100) + datagen.AddRandomSeedsToFuzzer(f, 10) f.Fuzz(func(t *testing.T, seed int64) { r := rand.New(rand.NewSource(seed)) @@ -80,7 +80,7 @@ func FuzzBTCHeaderHashBytesBytesOps(f *testing.F) { } func FuzzBTCHeaderHashBytesHexOps(f *testing.F) { - datagen.AddRandomSeedsToFuzzer(f, 100) + datagen.AddRandomSeedsToFuzzer(f, 10) f.Fuzz(func(t *testing.T, seed int64) { r := rand.New(rand.NewSource(seed)) @@ -126,7 +126,7 @@ func FuzzBTCHeaderHashBytesHexOps(f *testing.F) { } func FuzzBTCHeaderHashBytesJSONOps(f *testing.F) { - datagen.AddRandomSeedsToFuzzer(f, 100) + datagen.AddRandomSeedsToFuzzer(f, 10) f.Fuzz(func(t *testing.T, seed int64) { r := rand.New(rand.NewSource(seed)) @@ -181,7 +181,7 @@ func FuzzBTCHeaderHashBytesJSONOps(f *testing.F) { } func FuzzHeaderHashBytesChainhashOps(f *testing.F) { - datagen.AddRandomSeedsToFuzzer(f, 100) + datagen.AddRandomSeedsToFuzzer(f, 10) f.Fuzz(func(t *testing.T, seed int64) { r := rand.New(rand.NewSource(seed)) @@ -204,7 +204,7 @@ func FuzzHeaderHashBytesChainhashOps(f *testing.F) { } func FuzzHeaderHashBytesOperators(f *testing.F) { - datagen.AddRandomSeedsToFuzzer(f, 100) + datagen.AddRandomSeedsToFuzzer(f, 10) f.Fuzz(func(t *testing.T, seed int64) { r := rand.New(rand.NewSource(seed)) diff --git a/x/btccheckpoint/keeper/keeper_test.go b/x/btccheckpoint/keeper/keeper_test.go index 9d3fa923e..97a360232 100644 --- a/x/btccheckpoint/keeper/keeper_test.go +++ b/x/btccheckpoint/keeper/keeper_test.go @@ -64,7 +64,7 @@ func TestKeeper_GetSubmissionBtcInfo(t *testing.T) { } func FuzzGetSubmissionBtcInfo(f *testing.F) { - datagen.AddRandomSeedsToFuzzer(f, 100) + datagen.AddRandomSeedsToFuzzer(f, 10) f.Fuzz(func(t *testing.T, seed int64) { r := rand.New(rand.NewSource(seed)) diff --git a/x/btclightclient/keeper/base_btc_header_test.go b/x/btclightclient/keeper/base_btc_header_test.go index dfe1fa824..8fa2eca7f 100644 --- a/x/btclightclient/keeper/base_btc_header_test.go +++ b/x/btclightclient/keeper/base_btc_header_test.go @@ -17,7 +17,7 @@ func FuzzKeeperBaseBTCHeader(f *testing.F) { Data generation: - Create a header. Use it as a parameter to SetBaseBTCHeader */ - datagen.AddRandomSeedsToFuzzer(f, 100) + datagen.AddRandomSeedsToFuzzer(f, 10) f.Fuzz(func(t *testing.T, seed int64) { r := rand.New(rand.NewSource(seed)) blcKeeper, ctx := keeper.BTCLightClientKeeper(t) diff --git a/x/btclightclient/keeper/grpc_query_test.go b/x/btclightclient/keeper/grpc_query_test.go index dc2f18cff..98f02cdaa 100644 --- a/x/btclightclient/keeper/grpc_query_test.go +++ b/x/btclightclient/keeper/grpc_query_test.go @@ -33,7 +33,7 @@ func FuzzHashesQuery(f *testing.F) { Do checks 2-4 by initially querying without a key and then querying with the nextKey attribute. */ - datagen.AddRandomSeedsToFuzzer(f, 100) + datagen.AddRandomSeedsToFuzzer(f, 10) f.Fuzz(func(t *testing.T, seed int64) { r := rand.New(rand.NewSource(seed)) blcKeeper, ctx := testkeeper.BTCLightClientKeeper(t) @@ -123,7 +123,7 @@ func FuzzContainsQuery(f *testing.F) { - Generate a random tree of headers and insert into storage. - Generate a random header but do not insert it into storage. */ - datagen.AddRandomSeedsToFuzzer(f, 100) + datagen.AddRandomSeedsToFuzzer(f, 10) f.Fuzz(func(t *testing.T, seed int64) { r := rand.New(rand.NewSource(seed)) blcKeeper, ctx := testkeeper.BTCLightClientKeeper(t) @@ -185,7 +185,7 @@ func FuzzMainChainQuery(f *testing.F) { - Generate a random tree of headers with different PoW and insert them into the headers storage. - Calculate the main chain using the `HeadersState().MainChain()` function (here we only test the query) */ - datagen.AddRandomSeedsToFuzzer(f, 100) + datagen.AddRandomSeedsToFuzzer(f, 10) f.Fuzz(func(t *testing.T, seed int64) { r := rand.New(rand.NewSource(seed)) blcKeeper, ctx := testkeeper.BTCLightClientKeeper(t) @@ -316,7 +316,7 @@ func FuzzTipQuery(f *testing.F) { Data generation: - Generate a random tree of headers and insert into storage */ - datagen.AddRandomSeedsToFuzzer(f, 100) + datagen.AddRandomSeedsToFuzzer(f, 10) f.Fuzz(func(t *testing.T, seed int64) { r := rand.New(rand.NewSource(seed)) blcKeeper, ctx := testkeeper.BTCLightClientKeeper(t) @@ -355,7 +355,7 @@ func FuzzBaseHeaderQuery(f *testing.F) { Data generation: - Generate a random tree of headers and insert into storage. */ - datagen.AddRandomSeedsToFuzzer(f, 100) + datagen.AddRandomSeedsToFuzzer(f, 10) f.Fuzz(func(t *testing.T, seed int64) { r := rand.New(rand.NewSource(seed)) blcKeeper, ctx := testkeeper.BTCLightClientKeeper(t) diff --git a/x/btclightclient/keeper/keeper_test.go b/x/btclightclient/keeper/keeper_test.go index 02c5fc427..b510be086 100644 --- a/x/btclightclient/keeper/keeper_test.go +++ b/x/btclightclient/keeper/keeper_test.go @@ -24,7 +24,7 @@ func FuzzKeeperIsHeaderKDeep(f *testing.F) { - Generate a random tree of headers. - Get the mainchain and select appropriate headers. */ - datagen.AddRandomSeedsToFuzzer(f, 100) + datagen.AddRandomSeedsToFuzzer(f, 10) f.Fuzz(func(t *testing.T, seed int64) { r := rand.New(rand.NewSource(seed)) blcKeeper, ctx := testkeeper.BTCLightClientKeeper(t) @@ -101,7 +101,7 @@ func FuzzKeeperMainChainDepth(f *testing.F) { - Random generation of a header that is not inserted into storage. - Random selection of a header from the main chain and outside of it. */ - datagen.AddRandomSeedsToFuzzer(f, 100) + datagen.AddRandomSeedsToFuzzer(f, 10) f.Fuzz(func(t *testing.T, seed int64) { r := rand.New(rand.NewSource(seed)) blcKeeper, ctx := testkeeper.BTCLightClientKeeper(t) @@ -166,7 +166,7 @@ func FuzzKeeperBlockHeight(f *testing.F) { - Random generation of a header that is not inserted into storage. - Random selection of a header from the main chain and outside of it. */ - datagen.AddRandomSeedsToFuzzer(f, 100) + datagen.AddRandomSeedsToFuzzer(f, 10) f.Fuzz(func(t *testing.T, seed int64) { r := rand.New(rand.NewSource(seed)) blcKeeper, ctx := testkeeper.BTCLightClientKeeper(t) @@ -214,7 +214,7 @@ func FuzzKeeperIsAncestor(f *testing.F) { - Generate a random tree of headers and insert it into storage. - Select a random header and select a random descendant and a random ancestor to test (2-4). */ - datagen.AddRandomSeedsToFuzzer(f, 100) + datagen.AddRandomSeedsToFuzzer(f, 10) f.Fuzz(func(t *testing.T, seed int64) { r := rand.New(rand.NewSource(seed)) blcKeeper, ctx := testkeeper.BTCLightClientKeeper(t) @@ -320,7 +320,7 @@ func FuzzKeeperInsertHeader(f *testing.F) { * Build on top of a header that is `rand.Intn(tipHeight)` headers back from the tip. - This should emulate both 4e2 and 4e3. */ - datagen.AddRandomSeedsToFuzzer(f, 100) + datagen.AddRandomSeedsToFuzzer(f, 10) f.Fuzz(func(t *testing.T, seed int64) { r := rand.New(rand.NewSource(seed)) blcKeeper, ctx := testkeeper.BTCLightClientKeeper(t) diff --git a/x/btclightclient/keeper/msg_server_test.go b/x/btclightclient/keeper/msg_server_test.go index e4f7bd742..b3fa85907 100644 --- a/x/btclightclient/keeper/msg_server_test.go +++ b/x/btclightclient/keeper/msg_server_test.go @@ -41,7 +41,7 @@ func FuzzMsgServerInsertHeader(f *testing.F) { 5. parent 1 < work < 4 times the work of the header 6. parent > 4 times the work of the header */ - datagen.AddRandomSeedsToFuzzer(f, 100) + datagen.AddRandomSeedsToFuzzer(f, 10) f.Fuzz(func(t *testing.T, seed int64) { r := rand.New(rand.NewSource(seed)) _, blcKeeper, sdkCtx := setupMsgServer(t) diff --git a/x/btclightclient/keeper/state_test.go b/x/btclightclient/keeper/state_test.go index f6dcc7893..f7b2aecc4 100644 --- a/x/btclightclient/keeper/state_test.go +++ b/x/btclightclient/keeper/state_test.go @@ -33,7 +33,7 @@ func FuzzHeadersStateCreateHeader(f *testing.F) { - No need to create a tree, since this function does not consider the existence or the chain, it just inserts into state and updates the tip based on a simple work comparison. */ - datagen.AddRandomSeedsToFuzzer(f, 100) + datagen.AddRandomSeedsToFuzzer(f, 10) f.Fuzz(func(t *testing.T, seed int64) { r := rand.New(rand.NewSource(seed)) blcKeeper, ctx := testkeeper.BTCLightClientKeeper(t) @@ -128,7 +128,7 @@ func FuzzHeadersStateTipOps(f *testing.F) { 1. A header that will be set as the tip. 2. A header that will override it. */ - datagen.AddRandomSeedsToFuzzer(f, 100) + datagen.AddRandomSeedsToFuzzer(f, 10) f.Fuzz(func(t *testing.T, seed int64) { r := rand.New(rand.NewSource(seed)) blcKeeper, ctx := testkeeper.BTCLightClientKeeper(t) @@ -196,7 +196,7 @@ func FuzzHeadersStateGetHeaderOps(f *testing.F) { Data generation: - Create a header and store it using the `CreateHeader` method. Do retrievals to check conditions. */ - datagen.AddRandomSeedsToFuzzer(f, 100) + datagen.AddRandomSeedsToFuzzer(f, 10) f.Fuzz(func(t *testing.T, seed int64) { r := rand.New(rand.NewSource(seed)) blcKeeper, ctx := testkeeper.BTCLightClientKeeper(t) @@ -290,7 +290,7 @@ func FuzzHeadersStateGetBaseBTCHeader(f *testing.F) { Data generation: - Generate a random tree and retrieve the main chain from it. */ - datagen.AddRandomSeedsToFuzzer(f, 100) + datagen.AddRandomSeedsToFuzzer(f, 10) f.Fuzz(func(t *testing.T, seed int64) { r := rand.New(rand.NewSource(seed)) blcKeeper, ctx := testkeeper.BTCLightClientKeeper(t) @@ -323,7 +323,7 @@ func FuzzHeadersStateHeadersByHeight(f *testing.F) { - The randomness of the number of headers should guarantee that (1) and (2) are observed. - Generate a random stop signal 1/N times. */ - datagen.AddRandomSeedsToFuzzer(f, 100) + datagen.AddRandomSeedsToFuzzer(f, 10) f.Fuzz(func(t *testing.T, seed int64) { r := rand.New(rand.NewSource(seed)) blcKeeper, ctx := testkeeper.BTCLightClientKeeper(t) @@ -393,7 +393,7 @@ func FuzzHeadersStateGetMainChain(f *testing.F) { - Generate a random tree and retrieve the main chain from it. - Randomly generate the depth */ - datagen.AddRandomSeedsToFuzzer(f, 100) + datagen.AddRandomSeedsToFuzzer(f, 10) f.Fuzz(func(t *testing.T, seed int64) { r := rand.New(rand.NewSource(seed)) blcKeeper, ctx := testkeeper.BTCLightClientKeeper(t) @@ -440,7 +440,7 @@ func FuzzHeadersStateGetHighestCommonAncestor(f *testing.F) { - Generate a random tree of headers and store it. - Select two random headers and call `GetHighestCommonAncestor` for them. */ - datagen.AddRandomSeedsToFuzzer(f, 100) + datagen.AddRandomSeedsToFuzzer(f, 10) f.Fuzz(func(t *testing.T, seed int64) { r := rand.New(rand.NewSource(seed)) blcKeeper, ctx := testkeeper.BTCLightClientKeeper(t) @@ -494,7 +494,7 @@ func FuzzHeadersStateGetInOrderAncestorsUntil(f *testing.F) { - Select a random header which will serve as the `descendant`. Cannot be the base header. - Select a random header that is an ancestor of `descendant`. */ - datagen.AddRandomSeedsToFuzzer(f, 100) + datagen.AddRandomSeedsToFuzzer(f, 10) f.Fuzz(func(t *testing.T, seed int64) { r := rand.New(rand.NewSource(seed)) blcKeeper, ctx := testkeeper.BTCLightClientKeeper(t) @@ -535,7 +535,7 @@ func FuzzHeadersStateGetHeaderAncestryUpTo(f *testing.F) { - Select a random header which will serve as the `header` parameter. - Select a random depth in the range of [0, header.Height-baseHeader.Height] */ - datagen.AddRandomSeedsToFuzzer(f, 100) + datagen.AddRandomSeedsToFuzzer(f, 10) f.Fuzz(func(t *testing.T, seed int64) { r := rand.New(rand.NewSource(seed)) blcKeeper, ctx := testkeeper.BTCLightClientKeeper(t) diff --git a/x/btclightclient/types/btc_header_info_test.go b/x/btclightclient/types/btc_header_info_test.go index 1fd6eed5d..cd523563a 100644 --- a/x/btclightclient/types/btc_header_info_test.go +++ b/x/btclightclient/types/btc_header_info_test.go @@ -12,7 +12,7 @@ import ( ) func FuzzNewHeaderInfo(f *testing.F) { - datagen.AddRandomSeedsToFuzzer(f, 100) + datagen.AddRandomSeedsToFuzzer(f, 10) f.Fuzz(func(t *testing.T, seed int64) { // If either of the hash strings is not of appropriate length diff --git a/x/btclightclient/types/keys_test.go b/x/btclightclient/types/keys_test.go index c41199768..7c1530abf 100644 --- a/x/btclightclient/types/keys_test.go +++ b/x/btclightclient/types/keys_test.go @@ -12,7 +12,7 @@ import ( ) func FuzzHeadersObjectKey(f *testing.F) { - datagen.AddRandomSeedsToFuzzer(f, 100) + datagen.AddRandomSeedsToFuzzer(f, 10) f.Fuzz(func(t *testing.T, seed int64) { r := rand.New(rand.NewSource(seed)) @@ -36,7 +36,7 @@ func FuzzHeadersObjectKey(f *testing.F) { } func FuzzHeadersObjectHeightAndWorkKey(f *testing.F) { - datagen.AddRandomSeedsToFuzzer(f, 100) + datagen.AddRandomSeedsToFuzzer(f, 10) f.Fuzz(func(t *testing.T, seed int64) { r := rand.New(rand.NewSource(seed)) diff --git a/x/btclightclient/types/msgs_test.go b/x/btclightclient/types/msgs_test.go index 3eebe72c5..27641d364 100644 --- a/x/btclightclient/types/msgs_test.go +++ b/x/btclightclient/types/msgs_test.go @@ -16,7 +16,7 @@ import ( func FuzzMsgInsertHeader(f *testing.F) { maxDifficulty := bbn.GetMaxDifficulty() - datagen.AddRandomSeedsToFuzzer(f, 100) + datagen.AddRandomSeedsToFuzzer(f, 10) f.Fuzz(func(t *testing.T, seed int64) { r := rand.New(rand.NewSource(seed)) diff --git a/x/btclightclient/types/querier_test.go b/x/btclightclient/types/querier_test.go index a8a292501..e659a1041 100644 --- a/x/btclightclient/types/querier_test.go +++ b/x/btclightclient/types/querier_test.go @@ -31,7 +31,7 @@ func TestNewQueryHashesRequest(t *testing.T) { } func FuzzNewQueryContainsRequest(f *testing.F) { - datagen.AddRandomSeedsToFuzzer(f, 100) + datagen.AddRandomSeedsToFuzzer(f, 10) f.Fuzz(func(t *testing.T, seed int64) { r := rand.New(rand.NewSource(seed)) hexHash := datagen.GenRandomHexStr(r, bbn.BTCHeaderHashLen) diff --git a/x/btclightclient/types/work_test.go b/x/btclightclient/types/work_test.go index ef760c07c..e4e20a458 100644 --- a/x/btclightclient/types/work_test.go +++ b/x/btclightclient/types/work_test.go @@ -9,7 +9,7 @@ import ( ) func FuzzCumulativeWork(f *testing.F) { - datagen.AddRandomSeedsToFuzzer(f, 100) + datagen.AddRandomSeedsToFuzzer(f, 10) f.Fuzz(func(t *testing.T, seed int64) { r := rand.New(rand.NewSource(seed)) numa := r.Uint64() diff --git a/x/checkpointing/keeper/grpc_query_checkpoint_test.go b/x/checkpointing/keeper/grpc_query_checkpoint_test.go index b97a4de40..a60aeb537 100644 --- a/x/checkpointing/keeper/grpc_query_checkpoint_test.go +++ b/x/checkpointing/keeper/grpc_query_checkpoint_test.go @@ -20,7 +20,7 @@ import ( ) func FuzzQueryEpoch(f *testing.F) { - datagen.AddRandomSeedsToFuzzer(f, 100) + datagen.AddRandomSeedsToFuzzer(f, 10) f.Fuzz(func(t *testing.T, seed int64) { r := rand.New(rand.NewSource(seed)) ckptKeeper, ctx, _ := testkeeper.CheckpointingKeeper(t, nil, nil, client.Context{}) @@ -48,7 +48,7 @@ func FuzzQueryEpoch(f *testing.F) { } func FuzzQueryStatusCount(f *testing.F) { - datagen.AddRandomSeedsToFuzzer(f, 100) + datagen.AddRandomSeedsToFuzzer(f, 10) f.Fuzz(func(t *testing.T, seed int64) { r := rand.New(rand.NewSource(seed)) diff --git a/x/epoching/keeper/epoch_msg_queue_test.go b/x/epoching/keeper/epoch_msg_queue_test.go index ae3718dd3..8d41bd685 100644 --- a/x/epoching/keeper/epoch_msg_queue_test.go +++ b/x/epoching/keeper/epoch_msg_queue_test.go @@ -20,7 +20,7 @@ var ( // FuzzEnqueueMsg tests EnqueueMsg. It enqueues some wrapped msgs, and check if the message queue includes the enqueued msgs or not func FuzzEnqueueMsg(f *testing.F) { - datagen.AddRandomSeedsToFuzzer(f, 100) + datagen.AddRandomSeedsToFuzzer(f, 10) f.Fuzz(func(t *testing.T, seed int64) { r := rand.New(rand.NewSource(seed)) @@ -63,7 +63,7 @@ func FuzzEnqueueMsg(f *testing.F) { // FuzzHandleQueuedMsg_MsgWrappedDelegate tests HandleQueueMsg over MsgWrappedDelegate. // It enqueues some MsgWrappedDelegate, enters a new epoch (which triggers HandleQueueMsg), and check if the newly delegated tokens take effect or not func FuzzHandleQueuedMsg_MsgWrappedDelegate(f *testing.F) { - datagen.AddRandomSeedsToFuzzer(f, 100) + datagen.AddRandomSeedsToFuzzer(f, 10) f.Fuzz(func(t *testing.T, seed int64) { r := rand.New(rand.NewSource(seed)) @@ -127,7 +127,7 @@ func FuzzHandleQueuedMsg_MsgWrappedDelegate(f *testing.F) { // FuzzHandleQueuedMsg_MsgWrappedUndelegate tests HandleQueueMsg over MsgWrappedUndelegate. // It enqueues some MsgWrappedUndelegate, enters a new epoch (which triggers HandleQueueMsg), and check if the tokens become unbonding or not func FuzzHandleQueuedMsg_MsgWrappedUndelegate(f *testing.F) { - datagen.AddRandomSeedsToFuzzer(f, 100) + datagen.AddRandomSeedsToFuzzer(f, 10) f.Fuzz(func(t *testing.T, seed int64) { r := rand.New(rand.NewSource(seed)) @@ -201,7 +201,7 @@ func FuzzHandleQueuedMsg_MsgWrappedUndelegate(f *testing.F) { // FuzzHandleQueuedMsg_MsgWrappedBeginRedelegate tests HandleQueueMsg over MsgWrappedBeginRedelegate. // It enqueues some MsgWrappedBeginRedelegate, enters a new epoch (which triggers HandleQueueMsg), and check if the tokens become unbonding or not func FuzzHandleQueuedMsg_MsgWrappedBeginRedelegate(f *testing.F) { - datagen.AddRandomSeedsToFuzzer(f, 100) + datagen.AddRandomSeedsToFuzzer(f, 10) f.Fuzz(func(t *testing.T, seed int64) { r := rand.New(rand.NewSource(seed)) diff --git a/x/epoching/keeper/epoch_slashed_val_set_test.go b/x/epoching/keeper/epoch_slashed_val_set_test.go index 45078be72..9c6b9cb33 100644 --- a/x/epoching/keeper/epoch_slashed_val_set_test.go +++ b/x/epoching/keeper/epoch_slashed_val_set_test.go @@ -13,7 +13,7 @@ import ( ) func FuzzSlashedValSet(f *testing.F) { - datagen.AddRandomSeedsToFuzzer(f, 100) + datagen.AddRandomSeedsToFuzzer(f, 10) f.Fuzz(func(t *testing.T, seed int64) { r := rand.New(rand.NewSource(seed)) diff --git a/x/epoching/keeper/epoch_val_set_test.go b/x/epoching/keeper/epoch_val_set_test.go index db2579e5f..842330805 100644 --- a/x/epoching/keeper/epoch_val_set_test.go +++ b/x/epoching/keeper/epoch_val_set_test.go @@ -11,7 +11,7 @@ import ( ) func FuzzEpochValSet(f *testing.F) { - datagen.AddRandomSeedsToFuzzer(f, 100) + datagen.AddRandomSeedsToFuzzer(f, 10) f.Fuzz(func(t *testing.T, seed int64) { r := rand.New(rand.NewSource(seed)) diff --git a/x/epoching/types/epoching_test.go b/x/epoching/types/epoching_test.go index e28b98e48..a82e9e303 100644 --- a/x/epoching/types/epoching_test.go +++ b/x/epoching/types/epoching_test.go @@ -10,7 +10,7 @@ import ( ) func FuzzEpoch(f *testing.F) { - datagen.AddRandomSeedsToFuzzer(f, 100) + datagen.AddRandomSeedsToFuzzer(f, 10) f.Fuzz(func(t *testing.T, seed int64) { r := rand.New(rand.NewSource(seed)) From 73f57be022a4c253547b0a58436fb35d96018232 Mon Sep 17 00:00:00 2001 From: Gurjot Singh <111540954+gusin13@users.noreply.github.com> Date: Tue, 2 May 2023 23:11:57 +0530 Subject: [PATCH 53/59] feat: support multiple chain ids in FinalizedChainsInfo (#365) * finalized chains info * update proto * comments * update tests * update comments * update query * fix e2e tests * fix query params in e2e test * add e2e test * add log * clean up proto * fix swag * update comment * fix e2e tests * wrap up input checker fn * update docstring Co-authored-by: Vitalis Salis * use empty url vals instead of nil * remove err log * optimize * helper func * add docstring * desc error message by caller * wrap error * optimize as per suggestions * reduce loc * extra line * simplify exists Co-authored-by: Vitalis Salis * simplify exists * simplify logic * fix comments * more comments --------- Co-authored-by: Vitalis Salis --- client/docs/swagger-ui/swagger.yaml | 3632 ++++++++++------- proto/babylon/zoneconcierge/v1/query.proto | 38 +- .../zoneconcierge/v1/zoneconcierge.proto | 21 + test/e2e/configurer/chain/queries.go | 62 +- test/e2e/e2e_test.go | 10 +- types/utils.go | 18 + x/zoneconcierge/client/cli/query.go | 23 + .../keeper/epoch_chain_info_indexer.go | 46 +- x/zoneconcierge/keeper/grpc_query.go | 133 +- x/zoneconcierge/keeper/grpc_query_test.go | 50 +- x/zoneconcierge/types/errors.go | 1 + x/zoneconcierge/types/query.pb.go | 594 +-- x/zoneconcierge/types/query.pb.gw.go | 70 +- x/zoneconcierge/types/zoneconcierge.pb.go | 599 ++- 14 files changed, 3206 insertions(+), 2091 deletions(-) diff --git a/client/docs/swagger-ui/swagger.yaml b/client/docs/swagger-ui/swagger.yaml index 7ded4d2d7..ef947e9a4 100644 --- a/client/docs/swagger-ui/swagger.yaml +++ b/client/docs/swagger-ui/swagger.yaml @@ -7284,12 +7284,14 @@ paths: collectionFormat: multi tags: - Query - /babylon/zoneconcierge/v1/finalized_chain_info/{chain_id}: + /babylon/zoneconcierge/v1/finalized_chain_info/{chain_id}/height/{height}: get: summary: >- - FinalizedChainInfo queries the BTC-finalised info of a chain, with - proofs - operationId: FinalizedChainInfo + FinalizedChainInfoUntilHeight queries the BTC-finalised info no later + than + + the provided CZ height, with proofs + operationId: FinalizedChainInfoUntilHeight responses: '200': description: A successful response. @@ -8062,9 +8064,11 @@ paths: (i.e., earliest) checkpoint submission - description: |- - QueryFinalizedChainInfoResponse is response type for the - Query/FinalizedChainInfo RPC method. + description: >- + QueryFinalizedChainInfoUntilHeightResponse is response type for + the + + Query/FinalizedChainInfoUntilHeight RPC method. default: description: An unexpected error response. schema: @@ -8262,6 +8266,18 @@ paths: in: path required: true type: string + - name: height + description: >- + height is the height of the CZ chain + + such that the returned finalised chain info will be no later than + this + + height + in: path + required: true + type: string + format: uint64 - name: prove description: >- prove indicates whether the querier wants to get proofs of this @@ -8271,155 +8287,36 @@ paths: type: boolean tags: - Query - /babylon/zoneconcierge/v1/finalized_chain_info/{chain_id}/height/{height}: + /babylon/zoneconcierge/v1/finalized_chains_info: get: summary: >- - FinalizedChainInfoUntilHeight queries the BTC-finalised info no later - than - - the provided CZ height, with proofs - operationId: FinalizedChainInfoUntilHeight + FinalizedChainsInfo queries the BTC-finalised info of chains with given + IDs, with proofs + operationId: FinalizedChainsInfo responses: '200': description: A successful response. schema: type: object properties: - finalized_chain_info: - type: object - properties: - chain_id: - type: string - title: chain_id is the ID of the chain - latest_header: - title: latest_header is the latest header in CZ's canonical chain - type: object - properties: - chain_id: - type: string - title: chain_id is the unique ID of the chain - hash: - type: string - format: byte - title: hash is the hash of this header - height: - type: string - format: uint64 - title: >- - height is the height of this header on CZ ledger - - (hash, height) jointly provides the position of the - header on CZ ledger - babylon_header: - title: >- - babylon_header is the header of the babylon block that - includes this CZ - - header - type: object - properties: - version: - title: basic block info - type: object - properties: - block: - type: string - format: uint64 - app: - type: string - format: uint64 - description: >- - Consensus captures the consensus rules for - processing a block in the blockchain, - - including all blockchain data structures and the - rules of the application's - - state transition machine. - chain_id: - type: string - height: - type: string - format: int64 - time: - type: string - format: date-time - last_block_id: - title: prev block info - type: object - properties: - hash: - type: string - format: byte - part_set_header: - type: object - properties: - total: - type: integer - format: int64 - hash: - type: string - format: byte - title: PartsetHeader - last_commit_hash: - type: string - format: byte - title: hashes of block data - data_hash: - type: string - format: byte - validators_hash: - type: string - format: byte - title: hashes from the app output from the prev block - next_validators_hash: - type: string - format: byte - consensus_hash: - type: string - format: byte - app_hash: - type: string - format: byte - last_results_hash: - type: string - format: byte - evidence_hash: - type: string - format: byte - title: consensus info - proposer_address: - type: string - format: byte - description: Header defines the structure of a block header. - babylon_epoch: - type: string - format: uint64 - title: >- - epoch is the epoch number of this header on Babylon - ledger - babylon_tx_hash: - type: string - format: byte - title: >- - babylon_tx_hash is the hash of the tx that includes - this header - - (babylon_block_height, babylon_tx_hash) jointly - provides the position of - - the header on Babylon ledger - latest_forks: - title: >- - latest_forks is the latest forks, formed as a series of - IndexedHeader (from - - low to high) - type: object - properties: - headers: - type: array - items: + finalized_chains_info: + type: array + items: + type: object + properties: + chain_id: + type: string + title: chain_id is the ID of the chain + finalized_chain_info: + type: object + properties: + chain_id: + type: string + title: chain_id is the ID of the chain + latest_header: + title: >- + latest_header is the latest header in CZ's canonical + chain type: object properties: chain_id: @@ -8538,524 +8435,664 @@ paths: provides the position of the header on Babylon ledger - title: IndexedHeader is the metadata of a CZ header - title: >- - blocks is the list of non-canonical indexed headers at - the same height - description: >- - Forks is a list of non-canonical `IndexedHeader`s at the - same height. + latest_forks: + title: >- + latest_forks is the latest forks, formed as a series + of IndexedHeader (from - For example, assuming the following blockchain + low to high) + type: object + properties: + headers: + type: array + items: + type: object + properties: + chain_id: + type: string + title: chain_id is the unique ID of the chain + hash: + type: string + format: byte + title: hash is the hash of this header + height: + type: string + format: uint64 + title: >- + height is the height of this header on CZ + ledger - ``` + (hash, height) jointly provides the + position of the header on CZ ledger + babylon_header: + title: >- + babylon_header is the header of the + babylon block that includes this CZ - A <- B <- C <- D <- E - \ -- D1 - \ -- D2 - ``` + header + type: object + properties: + version: + title: basic block info + type: object + properties: + block: + type: string + format: uint64 + app: + type: string + format: uint64 + description: >- + Consensus captures the consensus rules + for processing a block in the + blockchain, - Then the fork will be {[D1, D2]} where each item is in - struct `IndexedBlock`. + including all blockchain data structures + and the rules of the application's + state transition machine. + chain_id: + type: string + height: + type: string + format: int64 + time: + type: string + format: date-time + last_block_id: + title: prev block info + type: object + properties: + hash: + type: string + format: byte + part_set_header: + type: object + properties: + total: + type: integer + format: int64 + hash: + type: string + format: byte + title: PartsetHeader + last_commit_hash: + type: string + format: byte + title: hashes of block data + data_hash: + type: string + format: byte + validators_hash: + type: string + format: byte + title: >- + hashes from the app output from the prev + block + next_validators_hash: + type: string + format: byte + consensus_hash: + type: string + format: byte + app_hash: + type: string + format: byte + last_results_hash: + type: string + format: byte + evidence_hash: + type: string + format: byte + title: consensus info + proposer_address: + type: string + format: byte + description: >- + Header defines the structure of a block + header. + babylon_epoch: + type: string + format: uint64 + title: >- + epoch is the epoch number of this header + on Babylon ledger + babylon_tx_hash: + type: string + format: byte + title: >- + babylon_tx_hash is the hash of the tx that + includes this header - Note that each `IndexedHeader` in the fork should have a - valid quorum + (babylon_block_height, babylon_tx_hash) + jointly provides the position of - certificate. Such forks exist since Babylon considers CZs - might have + the header on Babylon ledger + title: IndexedHeader is the metadata of a CZ header + title: >- + blocks is the list of non-canonical indexed + headers at the same height + description: >- + Forks is a list of non-canonical `IndexedHeader`s at + the same height. - dishonest majority. Also note that the IBC-Go - implementation will only + For example, assuming the following blockchain - consider the first header in a fork valid, since the - subsequent headers + ``` - cannot be verified without knowing the validator set in - the previous header. - timestamped_headers_count: - type: string - format: uint64 - title: >- - timestamped_headers_count is the number of timestamped - headers in CZ's + A <- B <- C <- D <- E + \ -- D1 + \ -- D2 + ``` - canonical chain - title: ChainInfo is the information of a CZ - epoch_info: - title: epoch_info is the metadata of the last BTC-finalised epoch - type: object - properties: - epoch_number: - type: string - format: uint64 - current_epoch_interval: - type: string - format: uint64 - first_block_height: - type: string - format: uint64 - last_block_header: - description: >- - last_block_header is the header of the last block in this - epoch. + Then the fork will be {[D1, D2]} where each item is + in struct `IndexedBlock`. - Babylon needs to remember the last header of each epoch to - complete - unbonding validators/delegations when a previous epoch's - checkpoint is + Note that each `IndexedHeader` in the fork should + have a valid quorum - finalised. The last_block_header field is nil in the - epoch's beginning, and + certificate. Such forks exist since Babylon + considers CZs might have - is set upon the end of this epoch. - type: object - properties: - version: - title: basic block info - type: object - properties: - block: - type: string - format: uint64 - app: - type: string - format: uint64 - description: >- - Consensus captures the consensus rules for processing - a block in the blockchain, + dishonest majority. Also note that the IBC-Go + implementation will only - including all blockchain data structures and the rules - of the application's + consider the first header in a fork valid, since the + subsequent headers - state transition machine. - chain_id: - type: string - height: - type: string - format: int64 - time: - type: string - format: date-time - last_block_id: - title: prev block info - type: object - properties: - hash: - type: string - format: byte - part_set_header: - type: object - properties: - total: - type: integer - format: int64 - hash: - type: string - format: byte - title: PartsetHeader - last_commit_hash: - type: string - format: byte - title: hashes of block data - data_hash: - type: string - format: byte - validators_hash: - type: string - format: byte - title: hashes from the app output from the prev block - next_validators_hash: - type: string - format: byte - consensus_hash: - type: string - format: byte - app_hash: - type: string - format: byte - last_results_hash: - type: string - format: byte - evidence_hash: - type: string - format: byte - title: consensus info - proposer_address: - type: string - format: byte - app_hash_root: - type: string - format: byte - title: >- - app_hash_root is the Merkle root of all AppHashs in this - epoch + cannot be verified without knowing the validator set + in the previous header. + timestamped_headers_count: + type: string + format: uint64 + title: >- + timestamped_headers_count is the number of + timestamped headers in CZ's - It will be used for proving a block is in an epoch - sealer_header: - title: >- - sealer_header is the 2nd header of the next epoch + canonical chain + title: ChainInfo is the information of a CZ + epoch_info: + title: >- + epoch_info is the metadata of the last BTC-finalised + epoch + type: object + properties: + epoch_number: + type: string + format: uint64 + current_epoch_interval: + type: string + format: uint64 + first_block_height: + type: string + format: uint64 + last_block_header: + description: >- + last_block_header is the header of the last block in + this epoch. - This validator set has generated a BLS multisig on - `last_commit_hash` of + Babylon needs to remember the last header of each + epoch to complete - the sealer header - type: object - properties: - version: - title: basic block info - type: object - properties: - block: - type: string - format: uint64 - app: - type: string - format: uint64 - description: >- - Consensus captures the consensus rules for processing - a block in the blockchain, + unbonding validators/delegations when a previous + epoch's checkpoint is - including all blockchain data structures and the rules - of the application's + finalised. The last_block_header field is nil in the + epoch's beginning, and - state transition machine. - chain_id: - type: string - height: - type: string - format: int64 - time: - type: string - format: date-time - last_block_id: - title: prev block info - type: object - properties: - hash: - type: string - format: byte - part_set_header: - type: object - properties: - total: - type: integer - format: int64 - hash: - type: string - format: byte - title: PartsetHeader - last_commit_hash: - type: string - format: byte - title: hashes of block data - data_hash: - type: string - format: byte - validators_hash: - type: string - format: byte - title: hashes from the app output from the prev block - next_validators_hash: - type: string - format: byte - consensus_hash: - type: string - format: byte - app_hash: - type: string - format: byte - last_results_hash: - type: string - format: byte - evidence_hash: - type: string - format: byte - title: consensus info - proposer_address: - type: string - format: byte - description: Header defines the structure of a block header. - raw_checkpoint: - title: raw_checkpoint is the raw checkpoint of this epoch - type: object - properties: - epoch_num: - type: string - format: uint64 - title: >- - epoch_num defines the epoch number the raw checkpoint is - for - last_commit_hash: - type: string - format: byte - title: >- - last_commit_hash defines the 'LastCommitHash' that - individual BLS sigs are + is set upon the end of this epoch. + type: object + properties: + version: + title: basic block info + type: object + properties: + block: + type: string + format: uint64 + app: + type: string + format: uint64 + description: >- + Consensus captures the consensus rules for + processing a block in the blockchain, - signed on - bitmap: - type: string - format: byte - title: >- - bitmap defines the bitmap that indicates the signers of - the BLS multi sig - bls_multi_sig: - type: string - format: byte - title: >- - bls_multi_sig defines the multi sig that is aggregated - from individual BLS + including all blockchain data structures and the + rules of the application's - sigs - btc_submission_key: - title: >- - btc_submission_key is position of two BTC txs that include the - raw - - checkpoint of this epoch - type: object - properties: - key: - type: array - items: - type: object - properties: - index: - type: integer - format: int64 - hash: - type: string - format: byte - title: >- - Each provided OP_RETURN transaction can be idendtified - by hash of block in - - which transaction was included and transaction index in - the block - proof: - title: proof is the proof that the chain info is finalized - type: object - properties: - proof_tx_in_block: - title: >- - proof_tx_in_block is the proof that tx that carries the - header is included - - in a certain Babylon block - type: object - properties: - root_hash: - type: string - format: byte - data: - type: string - format: byte - proof: - type: object - properties: - total: - type: string - format: int64 - index: - type: string - format: int64 - leaf_hash: - type: string - format: byte - aunts: - type: array - items: + state transition machine. + chain_id: + type: string + height: + type: string + format: int64 + time: + type: string + format: date-time + last_block_id: + title: prev block info + type: object + properties: + hash: + type: string + format: byte + part_set_header: + type: object + properties: + total: + type: integer + format: int64 + hash: + type: string + format: byte + title: PartsetHeader + last_commit_hash: type: string format: byte - description: >- - TxProof represents a Merkle proof of the presence of a - transaction in the Merkle tree. - proof_header_in_epoch: - type: object - properties: - total: - type: string - format: int64 - index: - type: string - format: int64 - leaf_hash: - type: string - format: byte - aunts: - type: array - items: - type: string - format: byte - title: >- - proof_header_in_epoch is the proof that the Babylon header - is in a certain - - epoch - proof_epoch_sealed: - title: proof_epoch_sealed is the proof that the epoch is sealed - type: object - properties: - validator_set: - type: array - items: - type: object - properties: - validator_address: + title: hashes of block data + data_hash: type: string - bls_pub_key: + format: byte + validators_hash: type: string format: byte - voting_power: + title: hashes from the app output from the prev block + next_validators_hash: type: string - format: uint64 + format: byte + consensus_hash: + type: string + format: byte + app_hash: + type: string + format: byte + last_results_hash: + type: string + format: byte + evidence_hash: + type: string + format: byte + title: consensus info + proposer_address: + type: string + format: byte + app_hash_root: + type: string + format: byte title: >- - ValidatorWithBlsKey couples validator address, - voting power, and its bls - - public key - title: >- - validator_set is the validator set of the sealed epoch + app_hash_root is the Merkle root of all AppHashs in + this epoch - This validator set has generated a BLS multisig on - `last_commit_hash` of + It will be used for proving a block is in an epoch + sealer_header: + title: >- + sealer_header is the 2nd header of the next epoch - the sealer header - proof_epoch_info: - title: >- - proof_epoch_info is the Merkle proof that the epoch's - metadata is committed + This validator set has generated a BLS multisig on + `last_commit_hash` of - to `app_hash` of the sealer header - type: object - properties: - ops: - type: array - items: + the sealer header + type: object + properties: + version: + title: basic block info type: object properties: - type: - type: string - key: + block: type: string - format: byte - data: + format: uint64 + app: type: string - format: byte - title: >- - ProofOp defines an operation used for - calculating Merkle root - - The data could be arbitrary format, providing - nessecary data + format: uint64 + description: >- + Consensus captures the consensus rules for + processing a block in the blockchain, - for example neighbouring node hash - proof_epoch_val_set: - title: >- - proof_epoch_info is the Merkle proof that the epoch's - validator set is + including all blockchain data structures and the + rules of the application's - committed to `app_hash` of the sealer header - type: object - properties: - ops: - type: array - items: + state transition machine. + chain_id: + type: string + height: + type: string + format: int64 + time: + type: string + format: date-time + last_block_id: + title: prev block info type: object properties: - type: - type: string - key: - type: string - format: byte - data: + hash: type: string format: byte - title: >- - ProofOp defines an operation used for - calculating Merkle root - - The data could be arbitrary format, providing - nessecary data - - for example neighbouring node hash - proof_epoch_submitted: - type: array - items: - type: object - properties: - key: - type: object - properties: - index: - type: integer - format: int64 - hash: + part_set_header: + type: object + properties: + total: + type: integer + format: int64 + hash: + type: string + format: byte + title: PartsetHeader + last_commit_hash: type: string format: byte - title: >- - Each provided OP_RETURN transaction can be - idendtified by hash of block in - - which transaction was included and transaction index - in the block - description: >- - key is the position (txIdx, blockHash) of this tx on - BTC blockchain - - Although it is already a part of SubmissionKey, we - store it here again - - to make TransactionInfo self-contained. - - For example, storing the key allows TransactionInfo - to not relay on - - the fact that TransactionInfo will be ordered in the - same order as + title: hashes of block data + data_hash: + type: string + format: byte + validators_hash: + type: string + format: byte + title: hashes from the app output from the prev block + next_validators_hash: + type: string + format: byte + consensus_hash: + type: string + format: byte + app_hash: + type: string + format: byte + last_results_hash: + type: string + format: byte + evidence_hash: + type: string + format: byte + title: consensus info + proposer_address: + type: string + format: byte + description: Header defines the structure of a block header. + raw_checkpoint: + title: raw_checkpoint is the raw checkpoint of this epoch + type: object + properties: + epoch_num: + type: string + format: uint64 + title: >- + epoch_num defines the epoch number the raw + checkpoint is for + last_commit_hash: + type: string + format: byte + title: >- + last_commit_hash defines the 'LastCommitHash' that + individual BLS sigs are - TransactionKeys in SubmissionKey. - transaction: + signed on + bitmap: type: string format: byte - title: transaction is the full transaction in bytes - proof: + title: >- + bitmap defines the bitmap that indicates the signers + of the BLS multi sig + bls_multi_sig: type: string format: byte title: >- - proof is the Merkle proof that this tx is included - in the position in `key` - - TODO: maybe it could use here better format as we - already processed and + bls_multi_sig defines the multi sig that is + aggregated from individual BLS - valideated the proof? + sigs + btc_submission_key: title: >- - TransactionInfo is the info of a tx that contains - Babylon checkpoint, + btc_submission_key is position of two BTC txs that + include the raw - including + checkpoint of this epoch + type: object + properties: + key: + type: array + items: + type: object + properties: + index: + type: integer + format: int64 + hash: + type: string + format: byte + title: >- + Each provided OP_RETURN transaction can be + idendtified by hash of block in - - the position of the tx on BTC blockchain + which transaction was included and transaction + index in the block + proof: + title: proof is the proof that the chain info is finalized + type: object + properties: + proof_tx_in_block: + title: >- + proof_tx_in_block is the proof that tx that carries + the header is included - - the full tx content + in a certain Babylon block + type: object + properties: + root_hash: + type: string + format: byte + data: + type: string + format: byte + proof: + type: object + properties: + total: + type: string + format: int64 + index: + type: string + format: int64 + leaf_hash: + type: string + format: byte + aunts: + type: array + items: + type: string + format: byte + description: >- + TxProof represents a Merkle proof of the presence of + a transaction in the Merkle tree. + proof_header_in_epoch: + type: object + properties: + total: + type: string + format: int64 + index: + type: string + format: int64 + leaf_hash: + type: string + format: byte + aunts: + type: array + items: + type: string + format: byte + title: >- + proof_header_in_epoch is the proof that the Babylon + header is in a certain - - the Merkle proof that this tx is on the above position - title: >- - proof_epoch_submitted is the proof that the epoch's - checkpoint is included + epoch + proof_epoch_sealed: + title: >- + proof_epoch_sealed is the proof that the epoch is + sealed + type: object + properties: + validator_set: + type: array + items: + type: object + properties: + validator_address: + type: string + bls_pub_key: + type: string + format: byte + voting_power: + type: string + format: uint64 + title: >- + ValidatorWithBlsKey couples validator address, + voting power, and its bls - in BTC ledger It is the two TransactionInfo in the best - (i.e., earliest) + public key + title: >- + validator_set is the validator set of the sealed + epoch - checkpoint submission - description: >- - QueryFinalizedChainInfoUntilHeightResponse is response type for - the + This validator set has generated a BLS multisig + on `last_commit_hash` of - Query/FinalizedChainInfoUntilHeight RPC method. + the sealer header + proof_epoch_info: + title: >- + proof_epoch_info is the Merkle proof that the + epoch's metadata is committed + + to `app_hash` of the sealer header + type: object + properties: + ops: + type: array + items: + type: object + properties: + type: + type: string + key: + type: string + format: byte + data: + type: string + format: byte + title: >- + ProofOp defines an operation used for + calculating Merkle root + + The data could be arbitrary format, + providing nessecary data + + for example neighbouring node hash + proof_epoch_val_set: + title: >- + proof_epoch_info is the Merkle proof that the + epoch's validator set is + + committed to `app_hash` of the sealer header + type: object + properties: + ops: + type: array + items: + type: object + properties: + type: + type: string + key: + type: string + format: byte + data: + type: string + format: byte + title: >- + ProofOp defines an operation used for + calculating Merkle root + + The data could be arbitrary format, + providing nessecary data + + for example neighbouring node hash + proof_epoch_submitted: + type: array + items: + type: object + properties: + key: + type: object + properties: + index: + type: integer + format: int64 + hash: + type: string + format: byte + title: >- + Each provided OP_RETURN transaction can be + idendtified by hash of block in + + which transaction was included and transaction + index in the block + description: >- + key is the position (txIdx, blockHash) of this + tx on BTC blockchain + + Although it is already a part of + SubmissionKey, we store it here again + + to make TransactionInfo self-contained. + + For example, storing the key allows + TransactionInfo to not relay on + + the fact that TransactionInfo will be ordered + in the same order as + + TransactionKeys in SubmissionKey. + transaction: + type: string + format: byte + title: transaction is the full transaction in bytes + proof: + type: string + format: byte + title: >- + proof is the Merkle proof that this tx is + included in the position in `key` + + TODO: maybe it could use here better format as + we already processed and + + valideated the proof? + title: >- + TransactionInfo is the info of a tx that contains + Babylon checkpoint, + + including + + - the position of the tx on BTC blockchain + + - the full tx content + + - the Merkle proof that this tx is on the above + position + title: >- + proof_epoch_submitted is the proof that the epoch's + checkpoint is included + + in BTC ledger It is the two TransactionInfo in the + best (i.e., earliest) + + checkpoint submission + title: >- + FinalizedChainInfo is the information of a CZ that is + BTC-finalised + description: |- + QueryFinalizedChainsInfoResponse is response type for the + Query/FinalizedChainsInfo RPC method. default: description: An unexpected error response. schema: @@ -9248,23 +9285,14 @@ paths: "value": "1.212s" } parameters: - - name: chain_id - description: chain_id is the ID of the CZ - in: path - required: true - type: string - - name: height - description: >- - height is the height of the CZ chain - - such that the returned finalised chain info will be no later than - this - - height - in: path - required: true - type: string - format: uint64 + - name: chain_ids + description: chain_ids is the list of ids of CZs. + in: query + required: false + type: array + items: + type: string + collectionFormat: multi - name: prove description: >- prove indicates whether the querier wants to get proofs of this @@ -15128,228 +15156,990 @@ definitions: timestamped_headers_count is the number of timestamped headers in CZ's canonical chain title: ChainInfo is the information of a CZ - babylon.zoneconcierge.v1.Forks: - type: object - properties: - headers: - type: array - items: - type: object - properties: - chain_id: - type: string - title: chain_id is the unique ID of the chain - hash: - type: string - format: byte - title: hash is the hash of this header - height: - type: string - format: uint64 - title: >- - height is the height of this header on CZ ledger - - (hash, height) jointly provides the position of the header on CZ - ledger - babylon_header: - title: >- - babylon_header is the header of the babylon block that includes - this CZ - - header - type: object - properties: - version: - title: basic block info - type: object - properties: - block: - type: string - format: uint64 - app: - type: string - format: uint64 - description: >- - Consensus captures the consensus rules for processing a - block in the blockchain, - - including all blockchain data structures and the rules of - the application's - - state transition machine. - chain_id: - type: string - height: - type: string - format: int64 - time: - type: string - format: date-time - last_block_id: - title: prev block info - type: object - properties: - hash: - type: string - format: byte - part_set_header: - type: object - properties: - total: - type: integer - format: int64 - hash: - type: string - format: byte - title: PartsetHeader - last_commit_hash: - type: string - format: byte - title: hashes of block data - data_hash: - type: string - format: byte - validators_hash: - type: string - format: byte - title: hashes from the app output from the prev block - next_validators_hash: - type: string - format: byte - consensus_hash: - type: string - format: byte - app_hash: - type: string - format: byte - last_results_hash: - type: string - format: byte - evidence_hash: - type: string - format: byte - title: consensus info - proposer_address: - type: string - format: byte - description: Header defines the structure of a block header. - babylon_epoch: - type: string - format: uint64 - title: epoch is the epoch number of this header on Babylon ledger - babylon_tx_hash: - type: string - format: byte - title: >- - babylon_tx_hash is the hash of the tx that includes this header - - (babylon_block_height, babylon_tx_hash) jointly provides the - position of - - the header on Babylon ledger - title: IndexedHeader is the metadata of a CZ header - title: blocks is the list of non-canonical indexed headers at the same height - description: >- - Forks is a list of non-canonical `IndexedHeader`s at the same height. - - For example, assuming the following blockchain - - ``` - - A <- B <- C <- D <- E - \ -- D1 - \ -- D2 - ``` - - Then the fork will be {[D1, D2]} where each item is in struct - `IndexedBlock`. - - - Note that each `IndexedHeader` in the fork should have a valid quorum - - certificate. Such forks exist since Babylon considers CZs might have - - dishonest majority. Also note that the IBC-Go implementation will only - - consider the first header in a fork valid, since the subsequent headers - - cannot be verified without knowing the validator set in the previous - header. - babylon.zoneconcierge.v1.IndexedHeader: + babylon.zoneconcierge.v1.FinalizedChainInfo: type: object properties: chain_id: type: string - title: chain_id is the unique ID of the chain - hash: - type: string - format: byte - title: hash is the hash of this header - height: - type: string - format: uint64 - title: >- - height is the height of this header on CZ ledger - - (hash, height) jointly provides the position of the header on CZ - ledger - babylon_header: - title: >- - babylon_header is the header of the babylon block that includes this - CZ - - header + title: chain_id is the ID of the chain + finalized_chain_info: type: object properties: - version: - title: basic block info - type: object - properties: - block: - type: string - format: uint64 - app: - type: string - format: uint64 - description: >- - Consensus captures the consensus rules for processing a block in - the blockchain, - - including all blockchain data structures and the rules of the - application's - - state transition machine. chain_id: type: string - height: - type: string - format: int64 - time: - type: string - format: date-time - last_block_id: - title: prev block info + title: chain_id is the ID of the chain + latest_header: + title: latest_header is the latest header in CZ's canonical chain type: object properties: + chain_id: + type: string + title: chain_id is the unique ID of the chain hash: type: string format: byte - part_set_header: + title: hash is the hash of this header + height: + type: string + format: uint64 + title: >- + height is the height of this header on CZ ledger + + (hash, height) jointly provides the position of the header on + CZ ledger + babylon_header: + title: >- + babylon_header is the header of the babylon block that + includes this CZ + + header type: object properties: - total: - type: integer + version: + title: basic block info + type: object + properties: + block: + type: string + format: uint64 + app: + type: string + format: uint64 + description: >- + Consensus captures the consensus rules for processing a + block in the blockchain, + + including all blockchain data structures and the rules of + the application's + + state transition machine. + chain_id: + type: string + height: + type: string format: int64 - hash: + time: + type: string + format: date-time + last_block_id: + title: prev block info + type: object + properties: + hash: + type: string + format: byte + part_set_header: + type: object + properties: + total: + type: integer + format: int64 + hash: + type: string + format: byte + title: PartsetHeader + last_commit_hash: type: string format: byte - title: PartsetHeader - last_commit_hash: - type: string - format: byte - title: hashes of block data - data_hash: - type: string + title: hashes of block data + data_hash: + type: string + format: byte + validators_hash: + type: string + format: byte + title: hashes from the app output from the prev block + next_validators_hash: + type: string + format: byte + consensus_hash: + type: string + format: byte + app_hash: + type: string + format: byte + last_results_hash: + type: string + format: byte + evidence_hash: + type: string + format: byte + title: consensus info + proposer_address: + type: string + format: byte + description: Header defines the structure of a block header. + babylon_epoch: + type: string + format: uint64 + title: epoch is the epoch number of this header on Babylon ledger + babylon_tx_hash: + type: string + format: byte + title: >- + babylon_tx_hash is the hash of the tx that includes this + header + + (babylon_block_height, babylon_tx_hash) jointly provides the + position of + + the header on Babylon ledger + latest_forks: + title: >- + latest_forks is the latest forks, formed as a series of + IndexedHeader (from + + low to high) + type: object + properties: + headers: + type: array + items: + type: object + properties: + chain_id: + type: string + title: chain_id is the unique ID of the chain + hash: + type: string + format: byte + title: hash is the hash of this header + height: + type: string + format: uint64 + title: >- + height is the height of this header on CZ ledger + + (hash, height) jointly provides the position of the + header on CZ ledger + babylon_header: + title: >- + babylon_header is the header of the babylon block that + includes this CZ + + header + type: object + properties: + version: + title: basic block info + type: object + properties: + block: + type: string + format: uint64 + app: + type: string + format: uint64 + description: >- + Consensus captures the consensus rules for + processing a block in the blockchain, + + including all blockchain data structures and the + rules of the application's + + state transition machine. + chain_id: + type: string + height: + type: string + format: int64 + time: + type: string + format: date-time + last_block_id: + title: prev block info + type: object + properties: + hash: + type: string + format: byte + part_set_header: + type: object + properties: + total: + type: integer + format: int64 + hash: + type: string + format: byte + title: PartsetHeader + last_commit_hash: + type: string + format: byte + title: hashes of block data + data_hash: + type: string + format: byte + validators_hash: + type: string + format: byte + title: hashes from the app output from the prev block + next_validators_hash: + type: string + format: byte + consensus_hash: + type: string + format: byte + app_hash: + type: string + format: byte + last_results_hash: + type: string + format: byte + evidence_hash: + type: string + format: byte + title: consensus info + proposer_address: + type: string + format: byte + description: Header defines the structure of a block header. + babylon_epoch: + type: string + format: uint64 + title: >- + epoch is the epoch number of this header on Babylon + ledger + babylon_tx_hash: + type: string + format: byte + title: >- + babylon_tx_hash is the hash of the tx that includes this + header + + (babylon_block_height, babylon_tx_hash) jointly provides + the position of + + the header on Babylon ledger + title: IndexedHeader is the metadata of a CZ header + title: >- + blocks is the list of non-canonical indexed headers at the + same height + description: >- + Forks is a list of non-canonical `IndexedHeader`s at the same + height. + + For example, assuming the following blockchain + + ``` + + A <- B <- C <- D <- E + \ -- D1 + \ -- D2 + ``` + + Then the fork will be {[D1, D2]} where each item is in struct + `IndexedBlock`. + + + Note that each `IndexedHeader` in the fork should have a valid + quorum + + certificate. Such forks exist since Babylon considers CZs might + have + + dishonest majority. Also note that the IBC-Go implementation will + only + + consider the first header in a fork valid, since the subsequent + headers + + cannot be verified without knowing the validator set in the + previous header. + timestamped_headers_count: + type: string + format: uint64 + title: >- + timestamped_headers_count is the number of timestamped headers in + CZ's + + canonical chain + title: ChainInfo is the information of a CZ + epoch_info: + title: epoch_info is the metadata of the last BTC-finalised epoch + type: object + properties: + epoch_number: + type: string + format: uint64 + current_epoch_interval: + type: string + format: uint64 + first_block_height: + type: string + format: uint64 + last_block_header: + description: >- + last_block_header is the header of the last block in this epoch. + + Babylon needs to remember the last header of each epoch to + complete + + unbonding validators/delegations when a previous epoch's + checkpoint is + + finalised. The last_block_header field is nil in the epoch's + beginning, and + + is set upon the end of this epoch. + type: object + properties: + version: + title: basic block info + type: object + properties: + block: + type: string + format: uint64 + app: + type: string + format: uint64 + description: >- + Consensus captures the consensus rules for processing a block + in the blockchain, + + including all blockchain data structures and the rules of the + application's + + state transition machine. + chain_id: + type: string + height: + type: string + format: int64 + time: + type: string + format: date-time + last_block_id: + title: prev block info + type: object + properties: + hash: + type: string + format: byte + part_set_header: + type: object + properties: + total: + type: integer + format: int64 + hash: + type: string + format: byte + title: PartsetHeader + last_commit_hash: + type: string + format: byte + title: hashes of block data + data_hash: + type: string + format: byte + validators_hash: + type: string + format: byte + title: hashes from the app output from the prev block + next_validators_hash: + type: string + format: byte + consensus_hash: + type: string + format: byte + app_hash: + type: string + format: byte + last_results_hash: + type: string + format: byte + evidence_hash: + type: string + format: byte + title: consensus info + proposer_address: + type: string + format: byte + app_hash_root: + type: string + format: byte + title: |- + app_hash_root is the Merkle root of all AppHashs in this epoch + It will be used for proving a block is in an epoch + sealer_header: + title: >- + sealer_header is the 2nd header of the next epoch + + This validator set has generated a BLS multisig on + `last_commit_hash` of + + the sealer header + type: object + properties: + version: + title: basic block info + type: object + properties: + block: + type: string + format: uint64 + app: + type: string + format: uint64 + description: >- + Consensus captures the consensus rules for processing a block + in the blockchain, + + including all blockchain data structures and the rules of the + application's + + state transition machine. + chain_id: + type: string + height: + type: string + format: int64 + time: + type: string + format: date-time + last_block_id: + title: prev block info + type: object + properties: + hash: + type: string + format: byte + part_set_header: + type: object + properties: + total: + type: integer + format: int64 + hash: + type: string + format: byte + title: PartsetHeader + last_commit_hash: + type: string + format: byte + title: hashes of block data + data_hash: + type: string + format: byte + validators_hash: + type: string + format: byte + title: hashes from the app output from the prev block + next_validators_hash: + type: string + format: byte + consensus_hash: + type: string + format: byte + app_hash: + type: string + format: byte + last_results_hash: + type: string + format: byte + evidence_hash: + type: string + format: byte + title: consensus info + proposer_address: + type: string + format: byte + description: Header defines the structure of a block header. + raw_checkpoint: + title: raw_checkpoint is the raw checkpoint of this epoch + type: object + properties: + epoch_num: + type: string + format: uint64 + title: epoch_num defines the epoch number the raw checkpoint is for + last_commit_hash: + type: string + format: byte + title: >- + last_commit_hash defines the 'LastCommitHash' that individual BLS + sigs are + + signed on + bitmap: + type: string + format: byte + title: >- + bitmap defines the bitmap that indicates the signers of the BLS + multi sig + bls_multi_sig: + type: string + format: byte + title: >- + bls_multi_sig defines the multi sig that is aggregated from + individual BLS + + sigs + btc_submission_key: + title: |- + btc_submission_key is position of two BTC txs that include the raw + checkpoint of this epoch + type: object + properties: + key: + type: array + items: + type: object + properties: + index: + type: integer + format: int64 + hash: + type: string + format: byte + title: >- + Each provided OP_RETURN transaction can be idendtified by hash + of block in + + which transaction was included and transaction index in the + block + proof: + title: proof is the proof that the chain info is finalized + type: object + properties: + proof_tx_in_block: + title: >- + proof_tx_in_block is the proof that tx that carries the header is + included + + in a certain Babylon block + type: object + properties: + root_hash: + type: string + format: byte + data: + type: string + format: byte + proof: + type: object + properties: + total: + type: string + format: int64 + index: + type: string + format: int64 + leaf_hash: + type: string + format: byte + aunts: + type: array + items: + type: string + format: byte + description: >- + TxProof represents a Merkle proof of the presence of a transaction + in the Merkle tree. + proof_header_in_epoch: + type: object + properties: + total: + type: string + format: int64 + index: + type: string + format: int64 + leaf_hash: + type: string + format: byte + aunts: + type: array + items: + type: string + format: byte + title: >- + proof_header_in_epoch is the proof that the Babylon header is in a + certain + + epoch + proof_epoch_sealed: + title: proof_epoch_sealed is the proof that the epoch is sealed + type: object + properties: + validator_set: + type: array + items: + type: object + properties: + validator_address: + type: string + bls_pub_key: + type: string + format: byte + voting_power: + type: string + format: uint64 + title: >- + ValidatorWithBlsKey couples validator address, voting power, + and its bls + + public key + title: >- + validator_set is the validator set of the sealed epoch + + This validator set has generated a BLS multisig on + `last_commit_hash` of + + the sealer header + proof_epoch_info: + title: >- + proof_epoch_info is the Merkle proof that the epoch's metadata + is committed + + to `app_hash` of the sealer header + type: object + properties: + ops: + type: array + items: + type: object + properties: + type: + type: string + key: + type: string + format: byte + data: + type: string + format: byte + title: >- + ProofOp defines an operation used for calculating Merkle + root + + The data could be arbitrary format, providing nessecary + data + + for example neighbouring node hash + proof_epoch_val_set: + title: >- + proof_epoch_info is the Merkle proof that the epoch's + validator set is + + committed to `app_hash` of the sealer header + type: object + properties: + ops: + type: array + items: + type: object + properties: + type: + type: string + key: + type: string + format: byte + data: + type: string + format: byte + title: >- + ProofOp defines an operation used for calculating Merkle + root + + The data could be arbitrary format, providing nessecary + data + + for example neighbouring node hash + proof_epoch_submitted: + type: array + items: + type: object + properties: + key: + type: object + properties: + index: + type: integer + format: int64 + hash: + type: string + format: byte + title: >- + Each provided OP_RETURN transaction can be idendtified by + hash of block in + + which transaction was included and transaction index in the + block + description: >- + key is the position (txIdx, blockHash) of this tx on BTC + blockchain + + Although it is already a part of SubmissionKey, we store it + here again + + to make TransactionInfo self-contained. + + For example, storing the key allows TransactionInfo to not + relay on + + the fact that TransactionInfo will be ordered in the same + order as + + TransactionKeys in SubmissionKey. + transaction: + type: string + format: byte + title: transaction is the full transaction in bytes + proof: + type: string + format: byte + title: >- + proof is the Merkle proof that this tx is included in the + position in `key` + + TODO: maybe it could use here better format as we already + processed and + + valideated the proof? + title: >- + TransactionInfo is the info of a tx that contains Babylon + checkpoint, + + including + + - the position of the tx on BTC blockchain + + - the full tx content + + - the Merkle proof that this tx is on the above position + title: >- + proof_epoch_submitted is the proof that the epoch's checkpoint is + included + + in BTC ledger It is the two TransactionInfo in the best (i.e., + earliest) + + checkpoint submission + title: FinalizedChainInfo is the information of a CZ that is BTC-finalised + babylon.zoneconcierge.v1.Forks: + type: object + properties: + headers: + type: array + items: + type: object + properties: + chain_id: + type: string + title: chain_id is the unique ID of the chain + hash: + type: string + format: byte + title: hash is the hash of this header + height: + type: string + format: uint64 + title: >- + height is the height of this header on CZ ledger + + (hash, height) jointly provides the position of the header on CZ + ledger + babylon_header: + title: >- + babylon_header is the header of the babylon block that includes + this CZ + + header + type: object + properties: + version: + title: basic block info + type: object + properties: + block: + type: string + format: uint64 + app: + type: string + format: uint64 + description: >- + Consensus captures the consensus rules for processing a + block in the blockchain, + + including all blockchain data structures and the rules of + the application's + + state transition machine. + chain_id: + type: string + height: + type: string + format: int64 + time: + type: string + format: date-time + last_block_id: + title: prev block info + type: object + properties: + hash: + type: string + format: byte + part_set_header: + type: object + properties: + total: + type: integer + format: int64 + hash: + type: string + format: byte + title: PartsetHeader + last_commit_hash: + type: string + format: byte + title: hashes of block data + data_hash: + type: string + format: byte + validators_hash: + type: string + format: byte + title: hashes from the app output from the prev block + next_validators_hash: + type: string + format: byte + consensus_hash: + type: string + format: byte + app_hash: + type: string + format: byte + last_results_hash: + type: string + format: byte + evidence_hash: + type: string + format: byte + title: consensus info + proposer_address: + type: string + format: byte + description: Header defines the structure of a block header. + babylon_epoch: + type: string + format: uint64 + title: epoch is the epoch number of this header on Babylon ledger + babylon_tx_hash: + type: string + format: byte + title: >- + babylon_tx_hash is the hash of the tx that includes this header + + (babylon_block_height, babylon_tx_hash) jointly provides the + position of + + the header on Babylon ledger + title: IndexedHeader is the metadata of a CZ header + title: blocks is the list of non-canonical indexed headers at the same height + description: >- + Forks is a list of non-canonical `IndexedHeader`s at the same height. + + For example, assuming the following blockchain + + ``` + + A <- B <- C <- D <- E + \ -- D1 + \ -- D2 + ``` + + Then the fork will be {[D1, D2]} where each item is in struct + `IndexedBlock`. + + + Note that each `IndexedHeader` in the fork should have a valid quorum + + certificate. Such forks exist since Babylon considers CZs might have + + dishonest majority. Also note that the IBC-Go implementation will only + + consider the first header in a fork valid, since the subsequent headers + + cannot be verified without knowing the validator set in the previous + header. + babylon.zoneconcierge.v1.IndexedHeader: + type: object + properties: + chain_id: + type: string + title: chain_id is the unique ID of the chain + hash: + type: string + format: byte + title: hash is the hash of this header + height: + type: string + format: uint64 + title: >- + height is the height of this header on CZ ledger + + (hash, height) jointly provides the position of the header on CZ + ledger + babylon_header: + title: >- + babylon_header is the header of the babylon block that includes this + CZ + + header + type: object + properties: + version: + title: basic block info + type: object + properties: + block: + type: string + format: uint64 + app: + type: string + format: uint64 + description: >- + Consensus captures the consensus rules for processing a block in + the blockchain, + + including all blockchain data structures and the rules of the + application's + + state transition machine. + chain_id: + type: string + height: + type: string + format: int64 + time: + type: string + format: date-time + last_block_id: + title: prev block info + type: object + properties: + hash: + type: string + format: byte + part_set_header: + type: object + properties: + total: + type: integer + format: int64 + hash: + type: string + format: byte + title: PartsetHeader + last_commit_hash: + type: string + format: byte + title: hashes of block data + data_hash: + type: string format: byte validators_hash: type: string @@ -16342,7 +17132,7 @@ definitions: RPC method. - babylon.zoneconcierge.v1.QueryFinalizedChainInfoResponse: + babylon.zoneconcierge.v1.QueryFinalizedChainInfoUntilHeightResponse: type: object properties: finalized_chain_info: @@ -17101,144 +17891,27 @@ definitions: checkpoint submission description: |- - QueryFinalizedChainInfoResponse is response type for the - Query/FinalizedChainInfo RPC method. - babylon.zoneconcierge.v1.QueryFinalizedChainInfoUntilHeightResponse: + QueryFinalizedChainInfoUntilHeightResponse is response type for the + Query/FinalizedChainInfoUntilHeight RPC method. + babylon.zoneconcierge.v1.QueryFinalizedChainsInfoResponse: type: object properties: - finalized_chain_info: - type: object - properties: - chain_id: - type: string - title: chain_id is the ID of the chain - latest_header: - title: latest_header is the latest header in CZ's canonical chain - type: object - properties: - chain_id: - type: string - title: chain_id is the unique ID of the chain - hash: - type: string - format: byte - title: hash is the hash of this header - height: - type: string - format: uint64 - title: >- - height is the height of this header on CZ ledger - - (hash, height) jointly provides the position of the header on - CZ ledger - babylon_header: - title: >- - babylon_header is the header of the babylon block that - includes this CZ - - header - type: object - properties: - version: - title: basic block info - type: object - properties: - block: - type: string - format: uint64 - app: - type: string - format: uint64 - description: >- - Consensus captures the consensus rules for processing a - block in the blockchain, - - including all blockchain data structures and the rules of - the application's - - state transition machine. - chain_id: - type: string - height: - type: string - format: int64 - time: - type: string - format: date-time - last_block_id: - title: prev block info - type: object - properties: - hash: - type: string - format: byte - part_set_header: - type: object - properties: - total: - type: integer - format: int64 - hash: - type: string - format: byte - title: PartsetHeader - last_commit_hash: - type: string - format: byte - title: hashes of block data - data_hash: - type: string - format: byte - validators_hash: - type: string - format: byte - title: hashes from the app output from the prev block - next_validators_hash: - type: string - format: byte - consensus_hash: - type: string - format: byte - app_hash: - type: string - format: byte - last_results_hash: - type: string - format: byte - evidence_hash: - type: string - format: byte - title: consensus info - proposer_address: - type: string - format: byte - description: Header defines the structure of a block header. - babylon_epoch: - type: string - format: uint64 - title: epoch is the epoch number of this header on Babylon ledger - babylon_tx_hash: - type: string - format: byte - title: >- - babylon_tx_hash is the hash of the tx that includes this - header - - (babylon_block_height, babylon_tx_hash) jointly provides the - position of - - the header on Babylon ledger - latest_forks: - title: >- - latest_forks is the latest forks, formed as a series of - IndexedHeader (from - - low to high) - type: object - properties: - headers: - type: array - items: + finalized_chains_info: + type: array + items: + type: object + properties: + chain_id: + type: string + title: chain_id is the ID of the chain + finalized_chain_info: + type: object + properties: + chain_id: + type: string + title: chain_id is the ID of the chain + latest_header: + title: latest_header is the latest header in CZ's canonical chain type: object properties: chain_id: @@ -17355,515 +18028,648 @@ definitions: the position of the header on Babylon ledger - title: IndexedHeader is the metadata of a CZ header - title: >- - blocks is the list of non-canonical indexed headers at the - same height - description: >- - Forks is a list of non-canonical `IndexedHeader`s at the same - height. - - For example, assuming the following blockchain - - ``` - - A <- B <- C <- D <- E - \ -- D1 - \ -- D2 - ``` - - Then the fork will be {[D1, D2]} where each item is in struct - `IndexedBlock`. - - - Note that each `IndexedHeader` in the fork should have a valid - quorum - - certificate. Such forks exist since Babylon considers CZs might - have - - dishonest majority. Also note that the IBC-Go implementation will - only - - consider the first header in a fork valid, since the subsequent - headers - - cannot be verified without knowing the validator set in the - previous header. - timestamped_headers_count: - type: string - format: uint64 - title: >- - timestamped_headers_count is the number of timestamped headers in - CZ's + latest_forks: + title: >- + latest_forks is the latest forks, formed as a series of + IndexedHeader (from - canonical chain - title: ChainInfo is the information of a CZ - epoch_info: - title: epoch_info is the metadata of the last BTC-finalised epoch - type: object - properties: - epoch_number: - type: string - format: uint64 - current_epoch_interval: - type: string - format: uint64 - first_block_height: - type: string - format: uint64 - last_block_header: - description: >- - last_block_header is the header of the last block in this epoch. + low to high) + type: object + properties: + headers: + type: array + items: + type: object + properties: + chain_id: + type: string + title: chain_id is the unique ID of the chain + hash: + type: string + format: byte + title: hash is the hash of this header + height: + type: string + format: uint64 + title: >- + height is the height of this header on CZ ledger - Babylon needs to remember the last header of each epoch to - complete + (hash, height) jointly provides the position of + the header on CZ ledger + babylon_header: + title: >- + babylon_header is the header of the babylon block + that includes this CZ - unbonding validators/delegations when a previous epoch's - checkpoint is + header + type: object + properties: + version: + title: basic block info + type: object + properties: + block: + type: string + format: uint64 + app: + type: string + format: uint64 + description: >- + Consensus captures the consensus rules for + processing a block in the blockchain, - finalised. The last_block_header field is nil in the epoch's - beginning, and + including all blockchain data structures and + the rules of the application's - is set upon the end of this epoch. - type: object - properties: - version: - title: basic block info - type: object - properties: - block: - type: string - format: uint64 - app: - type: string - format: uint64 - description: >- - Consensus captures the consensus rules for processing a block - in the blockchain, + state transition machine. + chain_id: + type: string + height: + type: string + format: int64 + time: + type: string + format: date-time + last_block_id: + title: prev block info + type: object + properties: + hash: + type: string + format: byte + part_set_header: + type: object + properties: + total: + type: integer + format: int64 + hash: + type: string + format: byte + title: PartsetHeader + last_commit_hash: + type: string + format: byte + title: hashes of block data + data_hash: + type: string + format: byte + validators_hash: + type: string + format: byte + title: hashes from the app output from the prev block + next_validators_hash: + type: string + format: byte + consensus_hash: + type: string + format: byte + app_hash: + type: string + format: byte + last_results_hash: + type: string + format: byte + evidence_hash: + type: string + format: byte + title: consensus info + proposer_address: + type: string + format: byte + description: Header defines the structure of a block header. + babylon_epoch: + type: string + format: uint64 + title: >- + epoch is the epoch number of this header on + Babylon ledger + babylon_tx_hash: + type: string + format: byte + title: >- + babylon_tx_hash is the hash of the tx that + includes this header - including all blockchain data structures and the rules of the - application's + (babylon_block_height, babylon_tx_hash) jointly + provides the position of - state transition machine. - chain_id: - type: string - height: - type: string - format: int64 - time: - type: string - format: date-time - last_block_id: - title: prev block info - type: object - properties: - hash: - type: string - format: byte - part_set_header: - type: object - properties: - total: - type: integer - format: int64 - hash: - type: string - format: byte - title: PartsetHeader - last_commit_hash: - type: string - format: byte - title: hashes of block data - data_hash: - type: string - format: byte - validators_hash: - type: string - format: byte - title: hashes from the app output from the prev block - next_validators_hash: - type: string - format: byte - consensus_hash: - type: string - format: byte - app_hash: - type: string - format: byte - last_results_hash: - type: string - format: byte - evidence_hash: - type: string - format: byte - title: consensus info - proposer_address: - type: string - format: byte - app_hash_root: - type: string - format: byte - title: |- - app_hash_root is the Merkle root of all AppHashs in this epoch - It will be used for proving a block is in an epoch - sealer_header: - title: >- - sealer_header is the 2nd header of the next epoch + the header on Babylon ledger + title: IndexedHeader is the metadata of a CZ header + title: >- + blocks is the list of non-canonical indexed headers at + the same height + description: >- + Forks is a list of non-canonical `IndexedHeader`s at the + same height. - This validator set has generated a BLS multisig on - `last_commit_hash` of + For example, assuming the following blockchain - the sealer header - type: object - properties: - version: - title: basic block info - type: object - properties: - block: - type: string - format: uint64 - app: - type: string - format: uint64 - description: >- - Consensus captures the consensus rules for processing a block - in the blockchain, + ``` - including all blockchain data structures and the rules of the - application's + A <- B <- C <- D <- E + \ -- D1 + \ -- D2 + ``` - state transition machine. - chain_id: - type: string - height: - type: string - format: int64 - time: - type: string - format: date-time - last_block_id: - title: prev block info - type: object - properties: - hash: - type: string - format: byte - part_set_header: - type: object - properties: - total: - type: integer - format: int64 - hash: - type: string - format: byte - title: PartsetHeader - last_commit_hash: - type: string - format: byte - title: hashes of block data - data_hash: - type: string - format: byte - validators_hash: - type: string - format: byte - title: hashes from the app output from the prev block - next_validators_hash: - type: string - format: byte - consensus_hash: - type: string - format: byte - app_hash: - type: string - format: byte - last_results_hash: - type: string - format: byte - evidence_hash: - type: string - format: byte - title: consensus info - proposer_address: - type: string - format: byte - description: Header defines the structure of a block header. - raw_checkpoint: - title: raw_checkpoint is the raw checkpoint of this epoch - type: object - properties: - epoch_num: - type: string - format: uint64 - title: epoch_num defines the epoch number the raw checkpoint is for - last_commit_hash: - type: string - format: byte - title: >- - last_commit_hash defines the 'LastCommitHash' that individual BLS - sigs are + Then the fork will be {[D1, D2]} where each item is in + struct `IndexedBlock`. - signed on - bitmap: - type: string - format: byte - title: >- - bitmap defines the bitmap that indicates the signers of the BLS - multi sig - bls_multi_sig: - type: string - format: byte - title: >- - bls_multi_sig defines the multi sig that is aggregated from - individual BLS - sigs - btc_submission_key: - title: |- - btc_submission_key is position of two BTC txs that include the raw - checkpoint of this epoch - type: object - properties: - key: - type: array - items: + Note that each `IndexedHeader` in the fork should have a + valid quorum + + certificate. Such forks exist since Babylon considers CZs + might have + + dishonest majority. Also note that the IBC-Go implementation + will only + + consider the first header in a fork valid, since the + subsequent headers + + cannot be verified without knowing the validator set in the + previous header. + timestamped_headers_count: + type: string + format: uint64 + title: >- + timestamped_headers_count is the number of timestamped + headers in CZ's + + canonical chain + title: ChainInfo is the information of a CZ + epoch_info: + title: epoch_info is the metadata of the last BTC-finalised epoch type: object properties: - index: - type: integer - format: int64 - hash: + epoch_number: + type: string + format: uint64 + current_epoch_interval: + type: string + format: uint64 + first_block_height: + type: string + format: uint64 + last_block_header: + description: >- + last_block_header is the header of the last block in this + epoch. + + Babylon needs to remember the last header of each epoch to + complete + + unbonding validators/delegations when a previous epoch's + checkpoint is + + finalised. The last_block_header field is nil in the epoch's + beginning, and + + is set upon the end of this epoch. + type: object + properties: + version: + title: basic block info + type: object + properties: + block: + type: string + format: uint64 + app: + type: string + format: uint64 + description: >- + Consensus captures the consensus rules for processing a + block in the blockchain, + + including all blockchain data structures and the rules + of the application's + + state transition machine. + chain_id: + type: string + height: + type: string + format: int64 + time: + type: string + format: date-time + last_block_id: + title: prev block info + type: object + properties: + hash: + type: string + format: byte + part_set_header: + type: object + properties: + total: + type: integer + format: int64 + hash: + type: string + format: byte + title: PartsetHeader + last_commit_hash: + type: string + format: byte + title: hashes of block data + data_hash: + type: string + format: byte + validators_hash: + type: string + format: byte + title: hashes from the app output from the prev block + next_validators_hash: + type: string + format: byte + consensus_hash: + type: string + format: byte + app_hash: + type: string + format: byte + last_results_hash: + type: string + format: byte + evidence_hash: + type: string + format: byte + title: consensus info + proposer_address: + type: string + format: byte + app_hash_root: type: string format: byte - title: >- - Each provided OP_RETURN transaction can be idendtified by hash - of block in + title: >- + app_hash_root is the Merkle root of all AppHashs in this + epoch - which transaction was included and transaction index in the - block - proof: - title: proof is the proof that the chain info is finalized - type: object - properties: - proof_tx_in_block: - title: >- - proof_tx_in_block is the proof that tx that carries the header is - included + It will be used for proving a block is in an epoch + sealer_header: + title: >- + sealer_header is the 2nd header of the next epoch - in a certain Babylon block - type: object - properties: - root_hash: - type: string - format: byte - data: - type: string - format: byte - proof: - type: object - properties: - total: - type: string - format: int64 - index: - type: string - format: int64 - leaf_hash: - type: string - format: byte - aunts: - type: array - items: + This validator set has generated a BLS multisig on + `last_commit_hash` of + + the sealer header + type: object + properties: + version: + title: basic block info + type: object + properties: + block: + type: string + format: uint64 + app: + type: string + format: uint64 + description: >- + Consensus captures the consensus rules for processing a + block in the blockchain, + + including all blockchain data structures and the rules + of the application's + + state transition machine. + chain_id: + type: string + height: + type: string + format: int64 + time: + type: string + format: date-time + last_block_id: + title: prev block info + type: object + properties: + hash: + type: string + format: byte + part_set_header: + type: object + properties: + total: + type: integer + format: int64 + hash: + type: string + format: byte + title: PartsetHeader + last_commit_hash: type: string format: byte - description: >- - TxProof represents a Merkle proof of the presence of a transaction - in the Merkle tree. - proof_header_in_epoch: - type: object - properties: - total: - type: string - format: int64 - index: - type: string - format: int64 - leaf_hash: - type: string - format: byte - aunts: - type: array - items: + title: hashes of block data + data_hash: + type: string + format: byte + validators_hash: + type: string + format: byte + title: hashes from the app output from the prev block + next_validators_hash: + type: string + format: byte + consensus_hash: + type: string + format: byte + app_hash: + type: string + format: byte + last_results_hash: + type: string + format: byte + evidence_hash: + type: string + format: byte + title: consensus info + proposer_address: + type: string + format: byte + description: Header defines the structure of a block header. + raw_checkpoint: + title: raw_checkpoint is the raw checkpoint of this epoch + type: object + properties: + epoch_num: + type: string + format: uint64 + title: epoch_num defines the epoch number the raw checkpoint is for + last_commit_hash: + type: string + format: byte + title: >- + last_commit_hash defines the 'LastCommitHash' that + individual BLS sigs are + + signed on + bitmap: + type: string + format: byte + title: >- + bitmap defines the bitmap that indicates the signers of the + BLS multi sig + bls_multi_sig: type: string format: byte - title: >- - proof_header_in_epoch is the proof that the Babylon header is in a - certain + title: >- + bls_multi_sig defines the multi sig that is aggregated from + individual BLS - epoch - proof_epoch_sealed: - title: proof_epoch_sealed is the proof that the epoch is sealed - type: object - properties: - validator_set: - type: array - items: + sigs + btc_submission_key: + title: >- + btc_submission_key is position of two BTC txs that include the + raw + + checkpoint of this epoch + type: object + properties: + key: + type: array + items: + type: object + properties: + index: + type: integer + format: int64 + hash: + type: string + format: byte + title: >- + Each provided OP_RETURN transaction can be idendtified by + hash of block in + + which transaction was included and transaction index in + the block + proof: + title: proof is the proof that the chain info is finalized + type: object + properties: + proof_tx_in_block: + title: >- + proof_tx_in_block is the proof that tx that carries the + header is included + + in a certain Babylon block type: object properties: - validator_address: - type: string - bls_pub_key: + root_hash: type: string format: byte - voting_power: + data: type: string - format: uint64 - title: >- - ValidatorWithBlsKey couples validator address, voting power, - and its bls - - public key - title: >- - validator_set is the validator set of the sealed epoch - - This validator set has generated a BLS multisig on - `last_commit_hash` of - - the sealer header - proof_epoch_info: - title: >- - proof_epoch_info is the Merkle proof that the epoch's metadata - is committed - - to `app_hash` of the sealer header - type: object - properties: - ops: - type: array - items: + format: byte + proof: type: object properties: - type: + total: type: string - key: + format: int64 + index: type: string - format: byte - data: + format: int64 + leaf_hash: type: string format: byte + aunts: + type: array + items: + type: string + format: byte + description: >- + TxProof represents a Merkle proof of the presence of a + transaction in the Merkle tree. + proof_header_in_epoch: + type: object + properties: + total: + type: string + format: int64 + index: + type: string + format: int64 + leaf_hash: + type: string + format: byte + aunts: + type: array + items: + type: string + format: byte + title: >- + proof_header_in_epoch is the proof that the Babylon header + is in a certain + + epoch + proof_epoch_sealed: + title: proof_epoch_sealed is the proof that the epoch is sealed + type: object + properties: + validator_set: + type: array + items: + type: object + properties: + validator_address: + type: string + bls_pub_key: + type: string + format: byte + voting_power: + type: string + format: uint64 + title: >- + ValidatorWithBlsKey couples validator address, voting + power, and its bls + + public key title: >- - ProofOp defines an operation used for calculating Merkle - root + validator_set is the validator set of the sealed epoch - The data could be arbitrary format, providing nessecary - data + This validator set has generated a BLS multisig on + `last_commit_hash` of - for example neighbouring node hash - proof_epoch_val_set: - title: >- - proof_epoch_info is the Merkle proof that the epoch's - validator set is + the sealer header + proof_epoch_info: + title: >- + proof_epoch_info is the Merkle proof that the epoch's + metadata is committed - committed to `app_hash` of the sealer header - type: object - properties: - ops: - type: array - items: + to `app_hash` of the sealer header type: object properties: - type: - type: string - key: - type: string - format: byte - data: - type: string - format: byte + ops: + type: array + items: + type: object + properties: + type: + type: string + key: + type: string + format: byte + data: + type: string + format: byte + title: >- + ProofOp defines an operation used for calculating + Merkle root + + The data could be arbitrary format, providing + nessecary data + + for example neighbouring node hash + proof_epoch_val_set: title: >- - ProofOp defines an operation used for calculating Merkle - root + proof_epoch_info is the Merkle proof that the epoch's + validator set is - The data could be arbitrary format, providing nessecary - data + committed to `app_hash` of the sealer header + type: object + properties: + ops: + type: array + items: + type: object + properties: + type: + type: string + key: + type: string + format: byte + data: + type: string + format: byte + title: >- + ProofOp defines an operation used for calculating + Merkle root - for example neighbouring node hash - proof_epoch_submitted: - type: array - items: - type: object - properties: - key: - type: object - properties: - index: - type: integer - format: int64 - hash: - type: string - format: byte - title: >- - Each provided OP_RETURN transaction can be idendtified by - hash of block in + The data could be arbitrary format, providing + nessecary data - which transaction was included and transaction index in the - block - description: >- - key is the position (txIdx, blockHash) of this tx on BTC - blockchain + for example neighbouring node hash + proof_epoch_submitted: + type: array + items: + type: object + properties: + key: + type: object + properties: + index: + type: integer + format: int64 + hash: + type: string + format: byte + title: >- + Each provided OP_RETURN transaction can be idendtified + by hash of block in - Although it is already a part of SubmissionKey, we store it - here again + which transaction was included and transaction index + in the block + description: >- + key is the position (txIdx, blockHash) of this tx on + BTC blockchain - to make TransactionInfo self-contained. + Although it is already a part of SubmissionKey, we + store it here again - For example, storing the key allows TransactionInfo to not - relay on + to make TransactionInfo self-contained. - the fact that TransactionInfo will be ordered in the same - order as + For example, storing the key allows TransactionInfo to + not relay on - TransactionKeys in SubmissionKey. - transaction: - type: string - format: byte - title: transaction is the full transaction in bytes - proof: - type: string - format: byte - title: >- - proof is the Merkle proof that this tx is included in the - position in `key` + the fact that TransactionInfo will be ordered in the + same order as - TODO: maybe it could use here better format as we already - processed and + TransactionKeys in SubmissionKey. + transaction: + type: string + format: byte + title: transaction is the full transaction in bytes + proof: + type: string + format: byte + title: >- + proof is the Merkle proof that this tx is included in + the position in `key` - valideated the proof? - title: >- - TransactionInfo is the info of a tx that contains Babylon - checkpoint, + TODO: maybe it could use here better format as we + already processed and - including + valideated the proof? + title: >- + TransactionInfo is the info of a tx that contains Babylon + checkpoint, - - the position of the tx on BTC blockchain + including - - the full tx content + - the position of the tx on BTC blockchain - - the Merkle proof that this tx is on the above position - title: >- - proof_epoch_submitted is the proof that the epoch's checkpoint is - included + - the full tx content - in BTC ledger It is the two TransactionInfo in the best (i.e., - earliest) + - the Merkle proof that this tx is on the above position + title: >- + proof_epoch_submitted is the proof that the epoch's + checkpoint is included - checkpoint submission + in BTC ledger It is the two TransactionInfo in the best + (i.e., earliest) + + checkpoint submission + title: FinalizedChainInfo is the information of a CZ that is BTC-finalised description: |- - QueryFinalizedChainInfoUntilHeightResponse is response type for the - Query/FinalizedChainInfoUntilHeight RPC method. + QueryFinalizedChainsInfoResponse is response type for the + Query/FinalizedChainsInfo RPC method. babylon.zoneconcierge.v1.QueryHeaderResponse: type: object properties: diff --git a/proto/babylon/zoneconcierge/v1/query.proto b/proto/babylon/zoneconcierge/v1/query.proto index 0a33dea00..e9b7cd267 100644 --- a/proto/babylon/zoneconcierge/v1/query.proto +++ b/proto/babylon/zoneconcierge/v1/query.proto @@ -46,11 +46,11 @@ service Query { option (google.api.http).get = "/babylon/zoneconcierge/v1/headers/{chain_id}/epochs/{epoch_num}"; } - // FinalizedChainInfo queries the BTC-finalised info of a chain, with proofs - rpc FinalizedChainInfo(QueryFinalizedChainInfoRequest) - returns (QueryFinalizedChainInfoResponse) { + // FinalizedChainsInfo queries the BTC-finalised info of chains with given IDs, with proofs + rpc FinalizedChainsInfo(QueryFinalizedChainsInfoRequest) + returns (QueryFinalizedChainsInfoResponse) { option (google.api.http).get = - "/babylon/zoneconcierge/v1/finalized_chain_info/{chain_id}"; + "/babylon/zoneconcierge/v1/finalized_chains_info"; } // FinalizedChainInfoUntilHeight queries the BTC-finalised info no later than // the provided CZ height, with proofs @@ -140,31 +140,19 @@ message QueryListEpochHeadersResponse { repeated babylon.zoneconcierge.v1.IndexedHeader headers = 1; } -// QueryFinalizedChainInfoRequest is request type for the -// Query/FinalizedChainInfo RPC method. -message QueryFinalizedChainInfoRequest { - // chain_id is the ID of the CZ - string chain_id = 1; +// QueryFinalizedChainsInfoRequest is request type for the +// Query/FinalizedChainsInfo RPC method. +message QueryFinalizedChainsInfoRequest { + // chain_ids is the list of ids of CZs + repeated string chain_ids = 1; // prove indicates whether the querier wants to get proofs of this timestamp bool prove = 2; } -// QueryFinalizedChainInfoResponse is response type for the -// Query/FinalizedChainInfo RPC method. -message QueryFinalizedChainInfoResponse { - // finalized_chain_info is the info of the CZ - babylon.zoneconcierge.v1.ChainInfo finalized_chain_info = 1; - - // epoch_info is the metadata of the last BTC-finalised epoch - babylon.epoching.v1.Epoch epoch_info = 2; - // raw_checkpoint is the raw checkpoint of this epoch - babylon.checkpointing.v1.RawCheckpoint raw_checkpoint = 3; - // btc_submission_key is position of two BTC txs that include the raw - // checkpoint of this epoch - babylon.btccheckpoint.v1.SubmissionKey btc_submission_key = 4; - - // proof is the proof that the chain info is finalized - babylon.zoneconcierge.v1.ProofFinalizedChainInfo proof = 5; +// QueryFinalizedChainsInfoResponse is response type for the +// Query/FinalizedChainsInfo RPC method. +message QueryFinalizedChainsInfoResponse { + repeated babylon.zoneconcierge.v1.FinalizedChainInfo finalized_chains_info = 1; } // QueryFinalizedChainInfoUntilHeightRequest is request type for the diff --git a/proto/babylon/zoneconcierge/v1/zoneconcierge.proto b/proto/babylon/zoneconcierge/v1/zoneconcierge.proto index ef52447ff..c19a34bba 100644 --- a/proto/babylon/zoneconcierge/v1/zoneconcierge.proto +++ b/proto/babylon/zoneconcierge/v1/zoneconcierge.proto @@ -5,6 +5,8 @@ import "tendermint/types/types.proto"; import "tendermint/crypto/proof.proto"; import "babylon/btccheckpoint/v1/btccheckpoint.proto"; import "babylon/checkpointing/v1/bls_key.proto"; +import "babylon/checkpointing/v1/checkpoint.proto"; +import "babylon/epoching/v1/epoching.proto"; option go_package = "github.com/babylonchain/babylon/x/zoneconcierge/types"; @@ -61,6 +63,25 @@ message ChainInfo { uint64 timestamped_headers_count = 4; } +// FinalizedChainInfo is the information of a CZ that is BTC-finalised +message FinalizedChainInfo { + // chain_id is the ID of the chain + string chain_id = 1; + // finalized_chain_info is the info of the CZ + babylon.zoneconcierge.v1.ChainInfo finalized_chain_info = 2; + + // epoch_info is the metadata of the last BTC-finalised epoch + babylon.epoching.v1.Epoch epoch_info = 3; + // raw_checkpoint is the raw checkpoint of this epoch + babylon.checkpointing.v1.RawCheckpoint raw_checkpoint = 4; + // btc_submission_key is position of two BTC txs that include the raw + // checkpoint of this epoch + babylon.btccheckpoint.v1.SubmissionKey btc_submission_key = 5; + + // proof is the proof that the chain info is finalized + babylon.zoneconcierge.v1.ProofFinalizedChainInfo proof = 6; +} + // ProofEpochSealed is the proof that an epoch is sealed by the sealer header, // i.e., the 2nd header of the next epoch With the access of metadata // - Metadata of this epoch, which includes the sealer header diff --git a/test/e2e/configurer/chain/queries.go b/test/e2e/configurer/chain/queries.go index 58af85ccb..16f3d5460 100644 --- a/test/e2e/configurer/chain/queries.go +++ b/test/e2e/configurer/chain/queries.go @@ -6,6 +6,7 @@ import ( "fmt" "io" "net/http" + "net/url" "time" sdkmath "cosmossdk.io/math" @@ -23,12 +24,8 @@ import ( zctypes "github.com/babylonchain/babylon/x/zoneconcierge/types" ) -func (n *NodeConfig) QueryGRPCGateway(path string, parameters ...string) ([]byte, error) { - if len(parameters)%2 != 0 { - return nil, fmt.Errorf("invalid number of parameters, must follow the format of key + value") - } - - // add the URL for the given validator ID, and pre-pend to to path. +func (n *NodeConfig) QueryGRPCGateway(path string, queryParams url.Values) ([]byte, error) { + // add the URL for the given validator ID, and pre-pend to path. hostPort, err := n.containerManager.GetHostPort(n.Name, "1317/tcp") require.NoError(n.t, err) endpoint := fmt.Sprintf("http://%s", hostPort) @@ -41,12 +38,8 @@ func (n *NodeConfig) QueryGRPCGateway(path string, parameters ...string) ([]byte return false } - if len(parameters) > 0 { - q := req.URL.Query() - for i := 0; i < len(parameters); i += 2 { - q.Add(parameters[i], parameters[i+1]) - } - req.URL.RawQuery = q.Encode() + if len(queryParams) > 0 { + req.URL.RawQuery = queryParams.Encode() } resp, err = http.DefaultClient.Do(req) @@ -70,10 +63,10 @@ func (n *NodeConfig) QueryGRPCGateway(path string, parameters ...string) ([]byte return bz, nil } -// QueryBalancer returns balances at the address. +// QueryBalances returns balances at the address. func (n *NodeConfig) QueryBalances(address string) (sdk.Coins, error) { path := fmt.Sprintf("cosmos/bank/v1beta1/balances/%s", address) - bz, err := n.QueryGRPCGateway(path) + bz, err := n.QueryGRPCGateway(path, url.Values{}) require.NoError(n.t, err) var balancesResp banktypes.QueryAllBalancesResponse @@ -85,7 +78,7 @@ func (n *NodeConfig) QueryBalances(address string) (sdk.Coins, error) { func (n *NodeConfig) QuerySupplyOf(denom string) (sdkmath.Int, error) { path := fmt.Sprintf("cosmos/bank/v1beta1/supply/%s", denom) - bz, err := n.QueryGRPCGateway(path) + bz, err := n.QueryGRPCGateway(path, url.Values{}) require.NoError(n.t, err) var supplyResp banktypes.QuerySupplyOfResponse @@ -151,7 +144,7 @@ func (n *NodeConfig) QueryListSnapshots() ([]*tmabcitypes.Snapshot, error) { func (n *NodeConfig) QueryCheckpointForEpoch(epoch uint64) (*ct.RawCheckpointWithMeta, error) { path := fmt.Sprintf("babylon/checkpointing/v1/raw_checkpoint/%d", epoch) - bz, err := n.QueryGRPCGateway(path) + bz, err := n.QueryGRPCGateway(path, url.Values{}) require.NoError(n.t, err) var checkpointingResponse ct.QueryRawCheckpointResponse @@ -163,7 +156,7 @@ func (n *NodeConfig) QueryCheckpointForEpoch(epoch uint64) (*ct.RawCheckpointWit } func (n *NodeConfig) QueryBtcBaseHeader() (*blc.BTCHeaderInfo, error) { - bz, err := n.QueryGRPCGateway("babylon/btclightclient/v1/baseheader") + bz, err := n.QueryGRPCGateway("babylon/btclightclient/v1/baseheader", url.Values{}) require.NoError(n.t, err) var blcResponse blc.QueryBaseHeaderResponse @@ -175,7 +168,7 @@ func (n *NodeConfig) QueryBtcBaseHeader() (*blc.BTCHeaderInfo, error) { } func (n *NodeConfig) QueryTip() (*blc.BTCHeaderInfo, error) { - bz, err := n.QueryGRPCGateway("babylon/btclightclient/v1/tip") + bz, err := n.QueryGRPCGateway("babylon/btclightclient/v1/tip", url.Values{}) require.NoError(n.t, err) var blcResponse blc.QueryTipResponse @@ -186,21 +179,25 @@ func (n *NodeConfig) QueryTip() (*blc.BTCHeaderInfo, error) { return blcResponse.Header, nil } -func (n *NodeConfig) QueryFinalizedChainInfo(chainId string) (*zctypes.QueryFinalizedChainInfoResponse, error) { - finalizedPath := fmt.Sprintf("babylon/zoneconcierge/v1/finalized_chain_info/%s", chainId) - bz, err := n.QueryGRPCGateway(finalizedPath) +func (n *NodeConfig) QueryFinalizedChainsInfo(chainIDs []string) (*zctypes.QueryFinalizedChainsInfoResponse, error) { + queryParams := url.Values{} + for _, chainId := range chainIDs { + queryParams.Add("chain_ids", chainId) + } + + bz, err := n.QueryGRPCGateway("babylon/zoneconcierge/v1/finalized_chains_info", queryParams) require.NoError(n.t, err) - var finalizedResponse zctypes.QueryFinalizedChainInfoResponse - if err := util.Cdc.UnmarshalJSON(bz, &finalizedResponse); err != nil { + var resp zctypes.QueryFinalizedChainsInfoResponse + if err := util.Cdc.UnmarshalJSON(bz, &resp); err != nil { return nil, err } - return &finalizedResponse, nil + return &resp, nil } func (n *NodeConfig) QueryCheckpointChains() (*[]string, error) { - bz, err := n.QueryGRPCGateway("babylon/zoneconcierge/v1/chains") + bz, err := n.QueryGRPCGateway("babylon/zoneconcierge/v1/chains", url.Values{}) require.NoError(n.t, err) var chainsResponse zctypes.QueryChainListResponse if err := util.Cdc.UnmarshalJSON(bz, &chainsResponse); err != nil { @@ -209,8 +206,13 @@ func (n *NodeConfig) QueryCheckpointChains() (*[]string, error) { return &chainsResponse.ChainIds, nil } -func (n *NodeConfig) QueryCheckpointChainsInfo(chainID string) ([]*zctypes.ChainInfo, error) { - bz, err := n.QueryGRPCGateway("/babylon/zoneconcierge/v1/chains_info", "chain_ids", chainID) +func (n *NodeConfig) QueryCheckpointChainsInfo(chainIDs []string) ([]*zctypes.ChainInfo, error) { + queryParams := url.Values{} + for _, chainId := range chainIDs { + queryParams.Add("chain_ids", chainId) + } + + bz, err := n.QueryGRPCGateway("/babylon/zoneconcierge/v1/chains_info", queryParams) require.NoError(n.t, err) var infoResponse zctypes.QueryChainsInfoResponse if err := util.Cdc.UnmarshalJSON(bz, &infoResponse); err != nil { @@ -220,7 +222,7 @@ func (n *NodeConfig) QueryCheckpointChainsInfo(chainID string) ([]*zctypes.Chain } func (n *NodeConfig) QueryCurrentEpoch() (uint64, error) { - bz, err := n.QueryGRPCGateway("/babylon/epoching/v1/current_epoch") + bz, err := n.QueryGRPCGateway("/babylon/epoching/v1/current_epoch", url.Values{}) require.NoError(n.t, err) var epochResponse etypes.QueryCurrentEpochResponse if err := util.Cdc.UnmarshalJSON(bz, &epochResponse); err != nil { @@ -231,7 +233,7 @@ func (n *NodeConfig) QueryCurrentEpoch() (uint64, error) { func (n *NodeConfig) QueryLightClientHeightEpochEnd(epoch uint64) (uint64, error) { monitorPath := fmt.Sprintf("/babylon/monitor/v1/epochs/%d", epoch) - bz, err := n.QueryGRPCGateway(monitorPath) + bz, err := n.QueryGRPCGateway(monitorPath, url.Values{}) require.NoError(n.t, err) var mResponse mtypes.QueryEndedEpochBtcHeightResponse if err := util.Cdc.UnmarshalJSON(bz, &mResponse); err != nil { @@ -242,7 +244,7 @@ func (n *NodeConfig) QueryLightClientHeightEpochEnd(epoch uint64) (uint64, error func (n *NodeConfig) QueryLightClientHeightCheckpointReported(ckptHash []byte) (uint64, error) { monitorPath := fmt.Sprintf("/babylon/monitor/v1/checkpoints/%x", ckptHash) - bz, err := n.QueryGRPCGateway(monitorPath) + bz, err := n.QueryGRPCGateway(monitorPath, url.Values{}) require.NoError(n.t, err) var mResponse mtypes.QueryReportedCheckpointBtcHeightResponse if err := util.Cdc.UnmarshalJSON(bz, &mResponse); err != nil { diff --git a/test/e2e/e2e_test.go b/test/e2e/e2e_test.go index e70e0b01a..c86c512a7 100644 --- a/test/e2e/e2e_test.go +++ b/test/e2e/e2e_test.go @@ -30,7 +30,7 @@ func (s *IntegrationTestSuite) TestIbcCheckpointing() { s.NoError(err) // Query checkpoint chain info for opposing chain - chainInfo, err := nonValidatorNode.QueryCheckpointChainsInfo(initialization.ChainBID) + chainInfo, err := nonValidatorNode.QueryCheckpointChainsInfo([]string{initialization.ChainBID}) s.NoError(err) s.Equal(chainInfo[0].ChainId, initialization.ChainBID) @@ -45,11 +45,13 @@ func (s *IntegrationTestSuite) TestIbcCheckpointing() { } // Check we have finalized epoch info for opposing chain and some basic assertions - fininfo, err := nonValidatorNode.QueryFinalizedChainInfo(initialization.ChainBID) + finalizedResp, err := nonValidatorNode.QueryFinalizedChainsInfo([]string{initialization.ChainBID}) s.NoError(err) + + finalizedInfo := finalizedResp.FinalizedChainsInfo[0] // TODO Add more assertion here. Maybe check proofs ? - s.Equal(fininfo.FinalizedChainInfo.ChainId, initialization.ChainBID) - s.Equal(fininfo.EpochInfo.EpochNumber, uint64(3)) + s.Equal(finalizedInfo.FinalizedChainInfo.ChainId, initialization.ChainBID) + s.Equal(finalizedInfo.EpochInfo.EpochNumber, uint64(3)) currEpoch, err := nonValidatorNode.QueryCurrentEpoch() s.NoError(err) diff --git a/types/utils.go b/types/utils.go index 0f8145042..59d9eb82c 100644 --- a/types/utils.go +++ b/types/utils.go @@ -1,6 +1,7 @@ package types import ( + "fmt" "reflect" ) @@ -11,3 +12,20 @@ func Reverse(s interface{}) { swap(i, j) } } + +func CheckForDuplicatesAndEmptyStrings(input []string) error { + encountered := map[string]bool{} + for _, str := range input { + if len(str) == 0 { + return fmt.Errorf("empty string is not allowed") + } + + if encountered[str] { + return fmt.Errorf("duplicate entry found: %s", str) + } + + encountered[str] = true + } + + return nil +} diff --git a/x/zoneconcierge/client/cli/query.go b/x/zoneconcierge/client/cli/query.go index 98d9e74ca..67d8069c4 100644 --- a/x/zoneconcierge/client/cli/query.go +++ b/x/zoneconcierge/client/cli/query.go @@ -23,6 +23,7 @@ func GetQueryCmd(queryRoute string) *cobra.Command { } cmd.AddCommand(CmdChainsInfo()) + cmd.AddCommand(CmdFinalizedChainsInfo()) return cmd } @@ -47,3 +48,25 @@ func CmdChainsInfo() *cobra.Command { flags.AddQueryFlagsToCmd(cmd) return cmd } + +func CmdFinalizedChainsInfo() *cobra.Command { + cmd := &cobra.Command{ + Use: "finalized-chains-info ", + Short: "retrieves the finalized info for a list of chains with given IDs", + Args: cobra.ArbitraryArgs, + RunE: func(cmd *cobra.Command, args []string) error { + clientCtx := client.GetClientContextFromCmd(cmd) + queryClient := types.NewQueryClient(clientCtx) + req := types.QueryFinalizedChainsInfoRequest{ChainIds: args} + resp, err := queryClient.FinalizedChainsInfo(cmd.Context(), &req) + if err != nil { + return err + } + + return clientCtx.PrintProto(resp) + }, + } + + flags.AddQueryFlagsToCmd(cmd) + return cmd +} diff --git a/x/zoneconcierge/keeper/epoch_chain_info_indexer.go b/x/zoneconcierge/keeper/epoch_chain_info_indexer.go index f9d92e628..286c36c1e 100644 --- a/x/zoneconcierge/keeper/epoch_chain_info_indexer.go +++ b/x/zoneconcierge/keeper/epoch_chain_info_indexer.go @@ -1,54 +1,32 @@ package keeper import ( - bbn "github.com/babylonchain/babylon/types" - "github.com/babylonchain/babylon/x/zoneconcierge/types" "github.com/cosmos/cosmos-sdk/store/prefix" sdk "github.com/cosmos/cosmos-sdk/types" + + bbn "github.com/babylonchain/babylon/types" + "github.com/babylonchain/babylon/x/zoneconcierge/types" ) // GetEpochChainInfo gets the latest chain info of a given epoch for a given chain ID func (k Keeper) GetEpochChainInfo(ctx sdk.Context, chainID string, epochNumber uint64) (*types.ChainInfo, error) { - store := k.epochChainInfoStore(ctx, chainID) - epochNumberBytes := sdk.Uint64ToBigEndian(epochNumber) - if !store.Has(epochNumberBytes) { + if !k.EpochChainInfoExists(ctx, chainID, epochNumber) { return nil, types.ErrEpochChainInfoNotFound } + + store := k.epochChainInfoStore(ctx, chainID) + epochNumberBytes := sdk.Uint64ToBigEndian(epochNumber) epochChainInfoBytes := store.Get(epochNumberBytes) var chainInfo types.ChainInfo k.cdc.MustUnmarshal(epochChainInfoBytes, &chainInfo) return &chainInfo, nil } -// GetLastFinalizedChainInfo gets the last finalised chain info recorded for a given chain ID -// and the earliest epoch that snapshots this chain info -func (k Keeper) GetLastFinalizedChainInfo(ctx sdk.Context, chainID string) (uint64, *types.ChainInfo, error) { - // find the last finalised epoch - finalizedEpoch, err := k.GetFinalizedEpoch(ctx) - if err != nil { - return 0, nil, err - } - - // find the chain info of this epoch - chainInfo, err := k.GetEpochChainInfo(ctx, chainID, finalizedEpoch) - if err != nil { - return finalizedEpoch, nil, err - } - - // It's possible that the chain info's epoch is way before the last finalised epoch - // e.g., when there is no relayer for many epochs - // NOTE: if an epoch is finalised then all of its previous epochs are also finalised - if chainInfo.LatestHeader.BabylonEpoch < finalizedEpoch { - // remember the last finalised epoch - finalizedEpoch = chainInfo.LatestHeader.BabylonEpoch - // replace the chain info w.r.t. this last finalised epoch - chainInfo, err = k.GetEpochChainInfo(ctx, chainID, finalizedEpoch) - if err != nil { - return finalizedEpoch, nil, err - } - } - - return finalizedEpoch, chainInfo, nil +// EpochChainInfoExists checks if the latest chain info exists of a given epoch for a given chain ID +func (k Keeper) EpochChainInfoExists(ctx sdk.Context, chainID string, epochNumber uint64) bool { + store := k.epochChainInfoStore(ctx, chainID) + epochNumberBytes := sdk.Uint64ToBigEndian(epochNumber) + return store.Has(epochNumberBytes) } // GetEpochHeaders gets the headers timestamped in a given epoch, in the ascending order diff --git a/x/zoneconcierge/keeper/grpc_query.go b/x/zoneconcierge/keeper/grpc_query.go index 8acc2efd4..e67554c59 100644 --- a/x/zoneconcierge/keeper/grpc_query.go +++ b/x/zoneconcierge/keeper/grpc_query.go @@ -8,6 +8,8 @@ import ( "google.golang.org/grpc/codes" "google.golang.org/grpc/status" + bbntypes "github.com/babylonchain/babylon/types" + "github.com/babylonchain/babylon/x/zoneconcierge/types" ) @@ -46,26 +48,19 @@ func (k Keeper) ChainsInfo(c context.Context, req *types.QueryChainsInfoRequest) return nil, status.Error(codes.InvalidArgument, "invalid request") } + // return if no chain IDs are provided if len(req.ChainIds) == 0 { return nil, status.Error(codes.InvalidArgument, "chain IDs cannot be empty") } + // return if chain IDs exceed the limit if len(req.ChainIds) > maxQueryChainsInfoLimit { return nil, status.Errorf(codes.InvalidArgument, "cannot query more than %d chains", maxQueryChainsInfoLimit) } - encountered := map[string]bool{} - for _, chainID := range req.ChainIds { - if len(chainID) == 0 { - return nil, status.Error(codes.InvalidArgument, "chain ID cannot be empty") - } - - // check for duplicates and return error on first duplicate found - if encountered[chainID] { - return nil, status.Errorf(codes.InvalidArgument, "duplicate chain ID %s", chainID) - } else { - encountered[chainID] = true - } + // return if chain IDs contain duplicates or empty strings + if err := bbntypes.CheckForDuplicatesAndEmptyStrings(req.ChainIds); err != nil { + return nil, status.Error(codes.InvalidArgument, types.ErrInvalidChainIDs.Wrap(err.Error()).Error()) } ctx := sdk.UnwrapSDKContext(c) @@ -184,54 +179,90 @@ func (k Keeper) ListEpochHeaders(c context.Context, req *types.QueryListEpochHea return resp, nil } -func (k Keeper) FinalizedChainInfo(c context.Context, req *types.QueryFinalizedChainInfoRequest) (*types.QueryFinalizedChainInfoResponse, error) { +// FinalizedChainsInfo returns the finalized info of chains with given IDs +func (k Keeper) FinalizedChainsInfo(c context.Context, req *types.QueryFinalizedChainsInfoRequest) (*types.QueryFinalizedChainsInfoResponse, error) { if req == nil { return nil, status.Error(codes.InvalidArgument, "invalid request") } - if len(req.ChainId) == 0 { + // return if no chain IDs are provided + if len(req.ChainIds) == 0 { return nil, status.Error(codes.InvalidArgument, "chain ID cannot be empty") } - ctx := sdk.UnwrapSDKContext(c) - resp := &types.QueryFinalizedChainInfoResponse{} - - // find the last finalised chain info and the earliest epoch that snapshots this chain info - finalizedEpoch, chainInfo, err := k.GetLastFinalizedChainInfo(ctx, req.ChainId) - if err != nil { - return nil, err + // return if chain IDs exceed the limit + if len(req.ChainIds) > maxQueryChainsInfoLimit { + return nil, status.Errorf(codes.InvalidArgument, "cannot query more than %d chains", maxQueryChainsInfoLimit) } - resp.FinalizedChainInfo = chainInfo - // find the epoch metadata of the finalised epoch - resp.EpochInfo, err = k.epochingKeeper.GetHistoricalEpoch(ctx, finalizedEpoch) - if err != nil { - return nil, err + // return if chain IDs contain duplicates or empty strings + if err := bbntypes.CheckForDuplicatesAndEmptyStrings(req.ChainIds); err != nil { + return nil, status.Error(codes.InvalidArgument, types.ErrInvalidChainIDs.Wrap(err.Error()).Error()) } - rawCheckpoint, err := k.checkpointingKeeper.GetRawCheckpoint(ctx, finalizedEpoch) + ctx := sdk.UnwrapSDKContext(c) + resp := &types.QueryFinalizedChainsInfoResponse{FinalizedChainsInfo: []*types.FinalizedChainInfo{}} + // find the last finalised epoch + lastFinalizedEpoch, err := k.GetFinalizedEpoch(ctx) if err != nil { return nil, err } - resp.RawCheckpoint = rawCheckpoint.Ckpt + for _, chainID := range req.ChainIds { + data := &types.FinalizedChainInfo{ChainId: chainID} - // find the raw checkpoint and the best submission key for the finalised epoch - _, resp.BtcSubmissionKey, err = k.btccKeeper.GetBestSubmission(ctx, finalizedEpoch) - if err != nil { - return nil, err - } + // if the chain info is not found in the last finalised epoch, return the chain info with empty fields + if !k.EpochChainInfoExists(ctx, chainID, lastFinalizedEpoch) { + resp.FinalizedChainsInfo = append(resp.FinalizedChainsInfo, data) + continue + } - // if the query does not want the proofs, return here - if !req.Prove { - return resp, nil - } + // find the chain info in the last finalised epoch + chainInfo, err := k.GetEpochChainInfo(ctx, chainID, lastFinalizedEpoch) + if err != nil { + return nil, err + } - // generate all proofs - resp.Proof, err = k.proveFinalizedChainInfo(ctx, chainInfo, resp.EpochInfo, resp.BtcSubmissionKey) - if err != nil { - return nil, err + // set finalizedEpoch as the earliest epoch that snapshots this chain info. + // it's possible that the chain info's epoch is way before the last finalised epoch + // e.g., when there is no relayer for many epochs + // NOTE: if an epoch is finalised then all of its previous epochs are also finalised + finalizedEpoch := lastFinalizedEpoch + if chainInfo.LatestHeader.BabylonEpoch < finalizedEpoch { + finalizedEpoch = chainInfo.LatestHeader.BabylonEpoch + } + + data.FinalizedChainInfo = chainInfo + + // find the epoch metadata of the finalised epoch + data.EpochInfo, err = k.epochingKeeper.GetHistoricalEpoch(ctx, finalizedEpoch) + if err != nil { + return nil, err + } + + rawCheckpoint, err := k.checkpointingKeeper.GetRawCheckpoint(ctx, finalizedEpoch) + if err != nil { + return nil, err + } + + data.RawCheckpoint = rawCheckpoint.Ckpt + + // find the raw checkpoint and the best submission key for the finalised epoch + _, data.BtcSubmissionKey, err = k.btccKeeper.GetBestSubmission(ctx, finalizedEpoch) + if err != nil { + return nil, err + } + + // generate all proofs + if req.Prove { + data.Proof, err = k.proveFinalizedChainInfo(ctx, chainInfo, data.EpochInfo, data.BtcSubmissionKey) + if err != nil { + return nil, err + } + } + + resp.FinalizedChainsInfo = append(resp.FinalizedChainsInfo, data) } return resp, nil @@ -249,11 +280,27 @@ func (k Keeper) FinalizedChainInfoUntilHeight(c context.Context, req *types.Quer ctx := sdk.UnwrapSDKContext(c) resp := &types.QueryFinalizedChainInfoUntilHeightResponse{} - // find and assign the last finalised chain info and the earliest epoch that snapshots this chain info - finalizedEpoch, chainInfo, err := k.GetLastFinalizedChainInfo(ctx, req.ChainId) + // find the last finalised epoch + lastFinalizedEpoch, err := k.GetFinalizedEpoch(ctx) if err != nil { return nil, err } + + // find the chain info in the last finalised epoch + chainInfo, err := k.GetEpochChainInfo(ctx, req.ChainId, lastFinalizedEpoch) + if err != nil { + return nil, err + } + + // set finalizedEpoch as the earliest epoch that snapshots this chain info. + // it's possible that the chain info's epoch is way before the last finalised epoch + // e.g., when there is no relayer for many epochs + // NOTE: if an epoch is finalised then all of its previous epochs are also finalised + finalizedEpoch := lastFinalizedEpoch + if chainInfo.LatestHeader.BabylonEpoch < finalizedEpoch { + finalizedEpoch = chainInfo.LatestHeader.BabylonEpoch + } + resp.FinalizedChainInfo = chainInfo if chainInfo.LatestHeader.Height <= req.Height { // the requested height is after the last finalised chain info diff --git a/x/zoneconcierge/keeper/grpc_query_test.go b/x/zoneconcierge/keeper/grpc_query_test.go index 31483706f..e699942f7 100644 --- a/x/zoneconcierge/keeper/grpc_query_test.go +++ b/x/zoneconcierge/keeper/grpc_query_test.go @@ -19,6 +19,12 @@ import ( zctypes "github.com/babylonchain/babylon/x/zoneconcierge/types" ) +type chainInfo struct { + chainID string + numHeaders uint64 + numForkHeaders uint64 +} + func FuzzChainList(f *testing.F) { datagen.AddRandomSeedsToFuzzer(f, 10) @@ -68,11 +74,6 @@ func FuzzChainList(f *testing.F) { func FuzzChainsInfo(f *testing.F) { datagen.AddRandomSeedsToFuzzer(f, 10) - type chainInfo struct { - chainID string - numHeaders uint64 - numForkHeaders uint64 - } f.Fuzz(func(t *testing.T, seed int64) { r := rand.New(rand.NewSource(seed)) @@ -312,9 +313,6 @@ func FuzzFinalizedChainInfo(f *testing.F) { ctrl := gomock.NewController(t) defer ctrl.Finish() - czChainIDLen := datagen.RandomInt(r, 50) + 1 - czChainID := string(datagen.GenRandomByteArray(r, czChainIDLen)) - // simulate the scenario that a random epoch has ended and finalised epoch := datagen.GenRandomEpoch(r) @@ -358,20 +356,40 @@ func FuzzFinalizedChainInfo(f *testing.F) { zcKeeper, ctx := testkeeper.ZoneConciergeKeeper(t, checkpointingKeeper, btccKeeper, epochingKeeper, tmClient) hooks := zcKeeper.Hooks() - // invoke the hook a random number of times to simulate a random number of blocks - numHeaders := datagen.RandomInt(r, 100) + 1 - numForkHeaders := datagen.RandomInt(r, 10) + 1 - SimulateHeadersAndForksViaHook(ctx, r, hooks, czChainID, 0, numHeaders, numForkHeaders) + var ( + chainsInfo []chainInfo + chainIDs []string + ) + numChains := datagen.RandomInt(r, 100) + 1 + for i := uint64(0); i < numChains; i++ { + czChainIDLen := datagen.RandomInt(r, 50) + 1 + czChainID := string(datagen.GenRandomByteArray(r, czChainIDLen)) + + // invoke the hook a random number of times to simulate a random number of blocks + numHeaders := datagen.RandomInt(r, 100) + 1 + numForkHeaders := datagen.RandomInt(r, 10) + 1 + SimulateHeadersAndForksViaHook(ctx, r, hooks, czChainID, 0, numHeaders, numForkHeaders) + + chainIDs = append(chainIDs, czChainID) + chainsInfo = append(chainsInfo, chainInfo{ + chainID: czChainID, + numHeaders: numHeaders, + numForkHeaders: numForkHeaders, + }) + } hooks.AfterEpochEnds(ctx, epoch.EpochNumber) err := hooks.AfterRawCheckpointFinalized(ctx, epoch.EpochNumber) require.NoError(t, err) // check if the chain info of this epoch is recorded or not - resp, err := zcKeeper.FinalizedChainInfo(ctx, &zctypes.QueryFinalizedChainInfoRequest{ChainId: czChainID, Prove: true}) + resp, err := zcKeeper.FinalizedChainsInfo(ctx, &zctypes.QueryFinalizedChainsInfoRequest{ChainIds: chainIDs, Prove: true}) require.NoError(t, err) - chainInfo := resp.FinalizedChainInfo - require.Equal(t, numHeaders-1, chainInfo.LatestHeader.Height) - require.Equal(t, numForkHeaders, uint64(len(chainInfo.LatestForks.Headers))) + for i, data := range resp.FinalizedChainsInfo { + finalizedInfo := data.FinalizedChainInfo + require.Equal(t, chainsInfo[i].chainID, data.ChainId) + require.Equal(t, chainsInfo[i].numHeaders-1, finalizedInfo.LatestHeader.Height) + require.Equal(t, chainsInfo[i].numForkHeaders, uint64(len(finalizedInfo.LatestForks.Headers))) + } }) } diff --git a/x/zoneconcierge/types/errors.go b/x/zoneconcierge/types/errors.go index 9dc7587a6..a9d28f4bd 100644 --- a/x/zoneconcierge/types/errors.go +++ b/x/zoneconcierge/types/errors.go @@ -23,4 +23,5 @@ var ( ErrInvalidProofEpochSealed = errorsmod.Register(ModuleName, 1112, "invalid ProofEpochSealed") ErrInvalidMerkleProof = errorsmod.Register(ModuleName, 1113, "invalid Merkle inclusion proof") ErrInvalidChainInfo = errorsmod.Register(ModuleName, 1114, "invalid chain info") + ErrInvalidChainIDs = errorsmod.Register(ModuleName, 1115, "chain ids contain duplicates or empty strings") ) diff --git a/x/zoneconcierge/types/query.pb.go b/x/zoneconcierge/types/query.pb.go index 88988b821..ca1f0842c 100644 --- a/x/zoneconcierge/types/query.pb.go +++ b/x/zoneconcierge/types/query.pb.go @@ -641,27 +641,27 @@ func (m *QueryListEpochHeadersResponse) GetHeaders() []*IndexedHeader { return nil } -// QueryFinalizedChainInfoRequest is request type for the -// Query/FinalizedChainInfo RPC method. -type QueryFinalizedChainInfoRequest struct { - // chain_id is the ID of the CZ - ChainId string `protobuf:"bytes,1,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` +// QueryFinalizedChainsInfoRequest is request type for the +// Query/FinalizedChainsInfo RPC method. +type QueryFinalizedChainsInfoRequest struct { + // chain_ids is the list of ids of CZs + ChainIds []string `protobuf:"bytes,1,rep,name=chain_ids,json=chainIds,proto3" json:"chain_ids,omitempty"` // prove indicates whether the querier wants to get proofs of this timestamp Prove bool `protobuf:"varint,2,opt,name=prove,proto3" json:"prove,omitempty"` } -func (m *QueryFinalizedChainInfoRequest) Reset() { *m = QueryFinalizedChainInfoRequest{} } -func (m *QueryFinalizedChainInfoRequest) String() string { return proto.CompactTextString(m) } -func (*QueryFinalizedChainInfoRequest) ProtoMessage() {} -func (*QueryFinalizedChainInfoRequest) Descriptor() ([]byte, []int) { +func (m *QueryFinalizedChainsInfoRequest) Reset() { *m = QueryFinalizedChainsInfoRequest{} } +func (m *QueryFinalizedChainsInfoRequest) String() string { return proto.CompactTextString(m) } +func (*QueryFinalizedChainsInfoRequest) ProtoMessage() {} +func (*QueryFinalizedChainsInfoRequest) Descriptor() ([]byte, []int) { return fileDescriptor_cd665af90102da38, []int{12} } -func (m *QueryFinalizedChainInfoRequest) XXX_Unmarshal(b []byte) error { +func (m *QueryFinalizedChainsInfoRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *QueryFinalizedChainInfoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *QueryFinalizedChainsInfoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_QueryFinalizedChainInfoRequest.Marshal(b, m, deterministic) + return xxx_messageInfo_QueryFinalizedChainsInfoRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -671,60 +671,50 @@ func (m *QueryFinalizedChainInfoRequest) XXX_Marshal(b []byte, deterministic boo return b[:n], nil } } -func (m *QueryFinalizedChainInfoRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryFinalizedChainInfoRequest.Merge(m, src) +func (m *QueryFinalizedChainsInfoRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryFinalizedChainsInfoRequest.Merge(m, src) } -func (m *QueryFinalizedChainInfoRequest) XXX_Size() int { +func (m *QueryFinalizedChainsInfoRequest) XXX_Size() int { return m.Size() } -func (m *QueryFinalizedChainInfoRequest) XXX_DiscardUnknown() { - xxx_messageInfo_QueryFinalizedChainInfoRequest.DiscardUnknown(m) +func (m *QueryFinalizedChainsInfoRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryFinalizedChainsInfoRequest.DiscardUnknown(m) } -var xxx_messageInfo_QueryFinalizedChainInfoRequest proto.InternalMessageInfo +var xxx_messageInfo_QueryFinalizedChainsInfoRequest proto.InternalMessageInfo -func (m *QueryFinalizedChainInfoRequest) GetChainId() string { +func (m *QueryFinalizedChainsInfoRequest) GetChainIds() []string { if m != nil { - return m.ChainId + return m.ChainIds } - return "" + return nil } -func (m *QueryFinalizedChainInfoRequest) GetProve() bool { +func (m *QueryFinalizedChainsInfoRequest) GetProve() bool { if m != nil { return m.Prove } return false } -// QueryFinalizedChainInfoResponse is response type for the -// Query/FinalizedChainInfo RPC method. -type QueryFinalizedChainInfoResponse struct { - // finalized_chain_info is the info of the CZ - FinalizedChainInfo *ChainInfo `protobuf:"bytes,1,opt,name=finalized_chain_info,json=finalizedChainInfo,proto3" json:"finalized_chain_info,omitempty"` - // epoch_info is the metadata of the last BTC-finalised epoch - EpochInfo *types.Epoch `protobuf:"bytes,2,opt,name=epoch_info,json=epochInfo,proto3" json:"epoch_info,omitempty"` - // raw_checkpoint is the raw checkpoint of this epoch - RawCheckpoint *types1.RawCheckpoint `protobuf:"bytes,3,opt,name=raw_checkpoint,json=rawCheckpoint,proto3" json:"raw_checkpoint,omitempty"` - // btc_submission_key is position of two BTC txs that include the raw - // checkpoint of this epoch - BtcSubmissionKey *types2.SubmissionKey `protobuf:"bytes,4,opt,name=btc_submission_key,json=btcSubmissionKey,proto3" json:"btc_submission_key,omitempty"` - // proof is the proof that the chain info is finalized - Proof *ProofFinalizedChainInfo `protobuf:"bytes,5,opt,name=proof,proto3" json:"proof,omitempty"` +// QueryFinalizedChainsInfoResponse is response type for the +// Query/FinalizedChainsInfo RPC method. +type QueryFinalizedChainsInfoResponse struct { + FinalizedChainsInfo []*FinalizedChainInfo `protobuf:"bytes,1,rep,name=finalized_chains_info,json=finalizedChainsInfo,proto3" json:"finalized_chains_info,omitempty"` } -func (m *QueryFinalizedChainInfoResponse) Reset() { *m = QueryFinalizedChainInfoResponse{} } -func (m *QueryFinalizedChainInfoResponse) String() string { return proto.CompactTextString(m) } -func (*QueryFinalizedChainInfoResponse) ProtoMessage() {} -func (*QueryFinalizedChainInfoResponse) Descriptor() ([]byte, []int) { +func (m *QueryFinalizedChainsInfoResponse) Reset() { *m = QueryFinalizedChainsInfoResponse{} } +func (m *QueryFinalizedChainsInfoResponse) String() string { return proto.CompactTextString(m) } +func (*QueryFinalizedChainsInfoResponse) ProtoMessage() {} +func (*QueryFinalizedChainsInfoResponse) Descriptor() ([]byte, []int) { return fileDescriptor_cd665af90102da38, []int{13} } -func (m *QueryFinalizedChainInfoResponse) XXX_Unmarshal(b []byte) error { +func (m *QueryFinalizedChainsInfoResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *QueryFinalizedChainInfoResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *QueryFinalizedChainsInfoResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_QueryFinalizedChainInfoResponse.Marshal(b, m, deterministic) + return xxx_messageInfo_QueryFinalizedChainsInfoResponse.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -734,49 +724,21 @@ func (m *QueryFinalizedChainInfoResponse) XXX_Marshal(b []byte, deterministic bo return b[:n], nil } } -func (m *QueryFinalizedChainInfoResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryFinalizedChainInfoResponse.Merge(m, src) +func (m *QueryFinalizedChainsInfoResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryFinalizedChainsInfoResponse.Merge(m, src) } -func (m *QueryFinalizedChainInfoResponse) XXX_Size() int { +func (m *QueryFinalizedChainsInfoResponse) XXX_Size() int { return m.Size() } -func (m *QueryFinalizedChainInfoResponse) XXX_DiscardUnknown() { - xxx_messageInfo_QueryFinalizedChainInfoResponse.DiscardUnknown(m) +func (m *QueryFinalizedChainsInfoResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryFinalizedChainsInfoResponse.DiscardUnknown(m) } -var xxx_messageInfo_QueryFinalizedChainInfoResponse proto.InternalMessageInfo +var xxx_messageInfo_QueryFinalizedChainsInfoResponse proto.InternalMessageInfo -func (m *QueryFinalizedChainInfoResponse) GetFinalizedChainInfo() *ChainInfo { +func (m *QueryFinalizedChainsInfoResponse) GetFinalizedChainsInfo() []*FinalizedChainInfo { if m != nil { - return m.FinalizedChainInfo - } - return nil -} - -func (m *QueryFinalizedChainInfoResponse) GetEpochInfo() *types.Epoch { - if m != nil { - return m.EpochInfo - } - return nil -} - -func (m *QueryFinalizedChainInfoResponse) GetRawCheckpoint() *types1.RawCheckpoint { - if m != nil { - return m.RawCheckpoint - } - return nil -} - -func (m *QueryFinalizedChainInfoResponse) GetBtcSubmissionKey() *types2.SubmissionKey { - if m != nil { - return m.BtcSubmissionKey - } - return nil -} - -func (m *QueryFinalizedChainInfoResponse) GetProof() *ProofFinalizedChainInfo { - if m != nil { - return m.Proof + return m.FinalizedChainsInfo } return nil } @@ -953,8 +915,8 @@ func init() { proto.RegisterType((*QueryListHeadersResponse)(nil), "babylon.zoneconcierge.v1.QueryListHeadersResponse") proto.RegisterType((*QueryListEpochHeadersRequest)(nil), "babylon.zoneconcierge.v1.QueryListEpochHeadersRequest") proto.RegisterType((*QueryListEpochHeadersResponse)(nil), "babylon.zoneconcierge.v1.QueryListEpochHeadersResponse") - proto.RegisterType((*QueryFinalizedChainInfoRequest)(nil), "babylon.zoneconcierge.v1.QueryFinalizedChainInfoRequest") - proto.RegisterType((*QueryFinalizedChainInfoResponse)(nil), "babylon.zoneconcierge.v1.QueryFinalizedChainInfoResponse") + proto.RegisterType((*QueryFinalizedChainsInfoRequest)(nil), "babylon.zoneconcierge.v1.QueryFinalizedChainsInfoRequest") + proto.RegisterType((*QueryFinalizedChainsInfoResponse)(nil), "babylon.zoneconcierge.v1.QueryFinalizedChainsInfoResponse") proto.RegisterType((*QueryFinalizedChainInfoUntilHeightRequest)(nil), "babylon.zoneconcierge.v1.QueryFinalizedChainInfoUntilHeightRequest") proto.RegisterType((*QueryFinalizedChainInfoUntilHeightResponse)(nil), "babylon.zoneconcierge.v1.QueryFinalizedChainInfoUntilHeightResponse") } @@ -964,76 +926,76 @@ func init() { } var fileDescriptor_cd665af90102da38 = []byte{ - // 1094 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x57, 0xcf, 0x6f, 0x1b, 0x45, - 0x14, 0xce, 0xc6, 0x49, 0x9a, 0x3c, 0x97, 0xaa, 0x1a, 0x4a, 0x31, 0xdb, 0xd6, 0x8d, 0x96, 0x1f, - 0x4d, 0xab, 0x74, 0x17, 0x9b, 0x06, 0x88, 0x38, 0x54, 0xf9, 0x41, 0xd2, 0x50, 0x54, 0x9a, 0x85, - 0x70, 0xe0, 0xb2, 0xda, 0x5d, 0x8f, 0xed, 0x55, 0xe2, 0x19, 0xd7, 0xb3, 0x76, 0xeb, 0x86, 0x70, - 0xe0, 0x8e, 0x84, 0xc4, 0x05, 0x71, 0x42, 0x42, 0xe2, 0xc0, 0xa1, 0x7f, 0x07, 0x48, 0x3d, 0x54, - 0xe2, 0xc2, 0x11, 0x25, 0xfc, 0x1b, 0x48, 0x68, 0x67, 0x66, 0xd7, 0x5e, 0xaf, 0x37, 0x5e, 0x9b, - 0x1c, 0x38, 0x70, 0xcb, 0x8e, 0xdf, 0xfb, 0xde, 0xf7, 0xde, 0xfb, 0x66, 0xde, 0x0b, 0xbc, 0xe1, - 0xd8, 0x4e, 0xf7, 0x80, 0x12, 0xe3, 0x29, 0x25, 0xd8, 0xa5, 0xc4, 0xf5, 0x70, 0xab, 0x86, 0x8d, - 0x4e, 0xc9, 0x78, 0xd4, 0xc6, 0xad, 0xae, 0xde, 0x6c, 0x51, 0x9f, 0xa2, 0x82, 0xb4, 0xd2, 0x63, - 0x56, 0x7a, 0xa7, 0xa4, 0x5e, 0xad, 0x51, 0x5a, 0x3b, 0xc0, 0x86, 0xdd, 0xf4, 0x0c, 0x9b, 0x10, - 0xea, 0xdb, 0xbe, 0x47, 0x09, 0x13, 0x7e, 0xea, 0x2d, 0x97, 0xb2, 0x06, 0x65, 0x86, 0x63, 0x33, - 0x2c, 0x00, 0x8d, 0x4e, 0xc9, 0xc1, 0xbe, 0x5d, 0x32, 0x9a, 0x76, 0xcd, 0x23, 0xdc, 0x58, 0xda, - 0x2e, 0x87, 0x4c, 0x1c, 0xdf, 0x75, 0xeb, 0xd8, 0xdd, 0x6f, 0x52, 0x8f, 0xf8, 0x01, 0x93, 0xd8, - 0x81, 0xb4, 0xbe, 0x19, 0x5a, 0xf7, 0x7e, 0xf1, 0x48, 0x2d, 0xb0, 0x4e, 0x98, 0x6a, 0xa1, 0x29, - 0x6e, 0x52, 0xb7, 0x2e, 0xad, 0xc2, 0xbf, 0x07, 0x83, 0x27, 0xca, 0x10, 0xcf, 0x98, 0x5b, 0x6b, - 0xdb, 0x80, 0x76, 0x83, 0x64, 0xee, 0x61, 0xbb, 0x82, 0x5b, 0x26, 0x7e, 0xd4, 0xc6, 0xcc, 0x47, - 0xaf, 0xc1, 0xbc, 0x5b, 0xb7, 0x3d, 0x62, 0x79, 0x95, 0x82, 0xb2, 0xa8, 0x2c, 0x2d, 0x98, 0xe7, - 0xf8, 0xf7, 0x4e, 0x05, 0x5d, 0x86, 0xb9, 0x3a, 0xf6, 0x6a, 0x75, 0xbf, 0x30, 0xbd, 0xa8, 0x2c, - 0xcd, 0x98, 0xf2, 0x4b, 0xfb, 0x41, 0x81, 0x97, 0x63, 0x48, 0xac, 0x49, 0x09, 0xc3, 0xe8, 0x6e, - 0x60, 0x1f, 0x9c, 0x70, 0xa0, 0x7c, 0xf9, 0x86, 0x9e, 0xd6, 0x00, 0x7d, 0x87, 0x54, 0xf0, 0x13, - 0x5c, 0x91, 0x00, 0xd2, 0x0d, 0xad, 0xc3, 0xf9, 0x2a, 0x6d, 0xed, 0x5b, 0xe2, 0x93, 0xf1, 0xb0, - 0xf9, 0xf2, 0xf5, 0x74, 0x98, 0x2d, 0xda, 0xda, 0x67, 0x66, 0x3e, 0x70, 0x12, 0x50, 0x4c, 0xb3, - 0xe0, 0x15, 0xce, 0x6d, 0x23, 0x48, 0xe2, 0x63, 0x8f, 0xf9, 0x61, 0xa2, 0x5b, 0x00, 0xbd, 0xee, - 0x49, 0x86, 0x6f, 0xe9, 0xa2, 0xd5, 0x7a, 0xd0, 0x6a, 0x5d, 0x68, 0x47, 0xb6, 0x5a, 0x7f, 0x68, - 0xd7, 0xb0, 0xf4, 0x35, 0xfb, 0x3c, 0xb5, 0xaf, 0xe0, 0xf2, 0x60, 0x00, 0x99, 0xff, 0x15, 0x58, - 0x08, 0x4b, 0xc9, 0x0a, 0xca, 0x62, 0x6e, 0x69, 0xc1, 0x9c, 0x97, 0xb5, 0x64, 0x68, 0x3b, 0x16, - 0x7e, 0x5a, 0x16, 0x68, 0x54, 0x78, 0x81, 0x1c, 0x8b, 0xbf, 0xd2, 0x1f, 0x9f, 0xed, 0x90, 0x2a, - 0x0d, 0x33, 0x3c, 0x2d, 0xbe, 0x66, 0xc1, 0xab, 0x09, 0x37, 0xc9, 0x7b, 0x13, 0xf2, 0xdc, 0x8c, - 0x59, 0x1e, 0xa9, 0x52, 0xee, 0x99, 0x2f, 0xbf, 0x9e, 0x5e, 0x75, 0x0e, 0xc1, 0x11, 0xc0, 0x8d, - 0xd0, 0xb4, 0xcf, 0x40, 0xe5, 0x01, 0x3e, 0x0c, 0x34, 0xda, 0x33, 0xe9, 0x71, 0xe3, 0xe2, 0xb5, - 0x48, 0xbb, 0xc1, 0x8b, 0x3f, 0x63, 0xce, 0xf3, 0x83, 0x07, 0xed, 0x46, 0x4c, 0x83, 0xd3, 0x31, - 0x0d, 0x6a, 0x36, 0x5c, 0x19, 0x8a, 0x2a, 0xa9, 0xaf, 0x03, 0x48, 0x4f, 0xc1, 0x5c, 0xc9, 0xca, - 0x5c, 0x54, 0x8a, 0x13, 0xff, 0x52, 0x56, 0x26, 0xe8, 0xa5, 0x54, 0x51, 0x86, 0xcb, 0xb1, 0x35, - 0xa4, 0x9f, 0x93, 0xc8, 0xe9, 0x67, 0x05, 0x0a, 0xc9, 0xf0, 0x32, 0xbd, 0x35, 0x38, 0x17, 0xde, - 0x05, 0xd1, 0x95, 0xcc, 0x57, 0x2a, 0xf4, 0x3b, 0x3b, 0xdd, 0x7d, 0x0e, 0x57, 0x23, 0x9e, 0xbc, - 0x1b, 0x03, 0xb5, 0x9a, 0xb4, 0xc3, 0x0e, 0x5c, 0x4b, 0xc1, 0x3d, 0xb3, 0x22, 0x68, 0xbb, 0x50, - 0xe4, 0x31, 0xb6, 0x3c, 0x62, 0x1f, 0x78, 0x4f, 0x71, 0x25, 0xa1, 0xcf, 0x53, 0x3a, 0x7d, 0x09, - 0x66, 0x9b, 0x2d, 0xda, 0xc1, 0x9c, 0xf8, 0xbc, 0x29, 0x3e, 0xb4, 0x9f, 0x72, 0x70, 0x3d, 0x15, - 0x53, 0x32, 0xdf, 0x83, 0x4b, 0xd5, 0xf0, 0x57, 0x6b, 0x32, 0x9d, 0xa2, 0x6a, 0x02, 0x1e, 0xad, - 0x02, 0x88, 0x4a, 0x73, 0x30, 0xd1, 0x52, 0x35, 0x02, 0x8b, 0x66, 0x44, 0xa7, 0xa4, 0xf3, 0x7a, - 0x9a, 0xa2, 0x2f, 0xdc, 0xf5, 0x01, 0x5c, 0x68, 0xd9, 0x8f, 0xad, 0xde, 0xb4, 0x29, 0xe4, 0x06, - 0x9e, 0xea, 0xd8, 0x64, 0x0a, 0x30, 0x4c, 0xfb, 0xf1, 0x46, 0x74, 0x66, 0xbe, 0xd4, 0xea, 0xff, - 0x44, 0x7b, 0x80, 0x1c, 0xdf, 0xb5, 0x58, 0xdb, 0x69, 0x78, 0x8c, 0x79, 0x94, 0x58, 0xfb, 0xb8, - 0x5b, 0x98, 0x19, 0xc0, 0x8c, 0x8f, 0xc2, 0x4e, 0x49, 0xff, 0x34, 0xb2, 0xbf, 0x8f, 0xbb, 0xe6, - 0x45, 0xc7, 0x77, 0x63, 0x27, 0x68, 0x9b, 0x97, 0x9c, 0x56, 0x0b, 0xb3, 0x1c, 0xa9, 0x94, 0x5e, - 0xa9, 0x87, 0x81, 0xd9, 0x90, 0x16, 0x08, 0x7f, 0xcd, 0x87, 0x9b, 0x29, 0x4d, 0xda, 0x23, 0xbe, - 0x77, 0x70, 0x8f, 0x0f, 0xb4, 0xc9, 0x47, 0x61, 0x4f, 0x1b, 0xb9, 0x7e, 0x6d, 0x3c, 0xcb, 0xc1, - 0xad, 0x2c, 0x61, 0xff, 0x97, 0xc9, 0x7f, 0x43, 0x26, 0xe5, 0x6f, 0xce, 0xc3, 0x2c, 0x6f, 0x18, - 0x7a, 0xa6, 0xc0, 0x9c, 0x78, 0x3d, 0xd0, 0x72, 0x3a, 0x5c, 0x72, 0x8f, 0x52, 0x6f, 0x67, 0xb4, - 0x16, 0x3d, 0xd7, 0xb6, 0xbf, 0xfe, 0xfd, 0xaf, 0xef, 0xa6, 0xd7, 0xd0, 0x5d, 0x23, 0x75, 0x87, - 0xeb, 0x29, 0xc1, 0x38, 0x0c, 0x75, 0x79, 0x64, 0x88, 0x27, 0xcd, 0x38, 0x14, 0x02, 0x3c, 0x42, - 0xdf, 0x2b, 0xb0, 0x10, 0xad, 0x22, 0xc8, 0x18, 0xc1, 0x62, 0x70, 0x2b, 0x52, 0xdf, 0xce, 0xee, - 0x20, 0x99, 0x2f, 0x71, 0xe6, 0x1a, 0x5a, 0x1c, 0xc1, 0x9c, 0xa1, 0x1f, 0x15, 0x80, 0xde, 0xba, - 0x81, 0x32, 0x85, 0xea, 0x5f, 0x68, 0xd4, 0xd2, 0x18, 0x1e, 0x92, 0xdd, 0x6d, 0xce, 0xee, 0x06, - 0x7a, 0x73, 0x14, 0x3b, 0x5e, 0x58, 0xf4, 0x9b, 0x02, 0x17, 0xe2, 0xab, 0x05, 0xba, 0x33, 0x22, - 0xe8, 0xd0, 0xfd, 0x46, 0x5d, 0x19, 0xd3, 0x4b, 0xd2, 0xfd, 0x88, 0xd3, 0xdd, 0x44, 0xeb, 0xe3, - 0xca, 0x80, 0xdf, 0x55, 0x66, 0x1c, 0x46, 0x23, 0xf7, 0x08, 0xfd, 0xa2, 0x40, 0xbe, 0x6f, 0x89, - 0x40, 0xa3, 0xaa, 0x97, 0xdc, 0x77, 0xd4, 0xf2, 0x38, 0x2e, 0x32, 0x85, 0x3b, 0x3c, 0x05, 0x1d, - 0x2d, 0xa7, 0xa7, 0x20, 0xc7, 0x70, 0x1f, 0x7f, 0xf4, 0x5c, 0x81, 0x8b, 0x83, 0x13, 0x1f, 0xbd, - 0x9b, 0x21, 0xfc, 0x90, 0xd5, 0x43, 0x7d, 0x6f, 0x6c, 0xbf, 0xec, 0xb7, 0x30, 0xc9, 0x7d, 0x58, - 0xed, 0x9f, 0x2b, 0x80, 0x92, 0xcf, 0x0b, 0x7a, 0x7f, 0x04, 0xb1, 0xd4, 0x7d, 0x44, 0x5d, 0x9d, - 0xc0, 0x53, 0x26, 0xb5, 0xc6, 0x93, 0xfa, 0x00, 0xad, 0xa6, 0x27, 0x35, 0x6c, 0xdc, 0xf4, 0x77, - 0xe7, 0x6f, 0x05, 0xae, 0x9d, 0x3a, 0xbb, 0xd0, 0xc6, 0xd8, 0xfc, 0x92, 0x03, 0x57, 0xdd, 0xfc, - 0x77, 0x20, 0x32, 0xdf, 0x5d, 0x9e, 0xef, 0x7d, 0xb4, 0x33, 0x71, 0xbe, 0x86, 0x78, 0x4c, 0xa3, - 0x47, 0x75, 0xfd, 0x93, 0x5f, 0x8f, 0x8b, 0xca, 0x8b, 0xe3, 0xa2, 0xf2, 0xe7, 0x71, 0x51, 0xf9, - 0xf6, 0xa4, 0x38, 0xf5, 0xe2, 0xa4, 0x38, 0xf5, 0xc7, 0x49, 0x71, 0xea, 0x8b, 0x95, 0x9a, 0xe7, - 0xd7, 0xdb, 0x8e, 0xee, 0xd2, 0x46, 0x18, 0x8e, 0xc3, 0x44, 0xb1, 0x9f, 0x0c, 0x44, 0xf7, 0xbb, - 0x4d, 0xcc, 0x9c, 0x39, 0xfe, 0x2f, 0xf8, 0x3b, 0xff, 0x04, 0x00, 0x00, 0xff, 0xff, 0xe0, 0xd3, - 0x0e, 0x7d, 0xb9, 0x10, 0x00, 0x00, + // 1103 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x57, 0xcd, 0x6f, 0x1b, 0x45, + 0x14, 0xcf, 0xe4, 0xab, 0xc9, 0x73, 0xa9, 0xaa, 0x49, 0x5b, 0xcc, 0xb6, 0x75, 0xad, 0xe5, 0xa3, + 0x69, 0x95, 0xee, 0x62, 0xd3, 0x50, 0x95, 0x4b, 0xd5, 0x24, 0x24, 0x0d, 0x45, 0xa5, 0x5d, 0x1a, + 0x0e, 0x5c, 0x96, 0xdd, 0xf5, 0xd8, 0x5e, 0x25, 0xde, 0x71, 0x3d, 0x6b, 0xb7, 0x6e, 0x08, 0x07, + 0x84, 0x38, 0x23, 0x71, 0x41, 0x9c, 0x38, 0x71, 0xe0, 0xd0, 0xff, 0x02, 0x09, 0x24, 0x0e, 0x95, + 0xb8, 0x70, 0x44, 0x09, 0xff, 0x06, 0x12, 0xda, 0x99, 0xd9, 0xb5, 0xd7, 0xbb, 0x1b, 0xaf, 0x43, + 0x6f, 0x99, 0xf1, 0x7b, 0xbf, 0xdf, 0xef, 0x7d, 0xcd, 0xdb, 0xc0, 0x5b, 0xb6, 0x65, 0xf7, 0xf7, + 0xa8, 0xa7, 0x3f, 0xa7, 0x1e, 0x71, 0xa8, 0xe7, 0xb8, 0xa4, 0xd3, 0x20, 0x7a, 0xaf, 0xa2, 0x3f, + 0xe9, 0x92, 0x4e, 0x5f, 0x6b, 0x77, 0xa8, 0x4f, 0x71, 0x51, 0x5a, 0x69, 0x31, 0x2b, 0xad, 0x57, + 0x51, 0x2e, 0x35, 0x28, 0x6d, 0xec, 0x11, 0xdd, 0x6a, 0xbb, 0xba, 0xe5, 0x79, 0xd4, 0xb7, 0x7c, + 0x97, 0x7a, 0x4c, 0xf8, 0x29, 0xd7, 0x1d, 0xca, 0x5a, 0x94, 0xe9, 0xb6, 0xc5, 0x88, 0x00, 0xd4, + 0x7b, 0x15, 0x9b, 0xf8, 0x56, 0x45, 0x6f, 0x5b, 0x0d, 0xd7, 0xe3, 0xc6, 0xd2, 0x76, 0x25, 0x54, + 0x62, 0xfb, 0x8e, 0xd3, 0x24, 0xce, 0x6e, 0x9b, 0xba, 0x9e, 0x1f, 0x28, 0x89, 0x5d, 0x48, 0xeb, + 0x6b, 0xa1, 0xf5, 0xe0, 0x17, 0xd7, 0x6b, 0x04, 0xd6, 0x09, 0x53, 0x35, 0x34, 0x25, 0x6d, 0xea, + 0x34, 0xa5, 0x55, 0xf8, 0xf7, 0x28, 0x79, 0x22, 0x0d, 0xf1, 0x88, 0xb9, 0xb5, 0xba, 0x05, 0xf8, + 0x51, 0x10, 0xcc, 0x3d, 0x62, 0xd5, 0x48, 0xc7, 0x20, 0x4f, 0xba, 0x84, 0xf9, 0xf8, 0x0d, 0x58, + 0x70, 0x9a, 0x96, 0xeb, 0x99, 0x6e, 0xad, 0x88, 0xca, 0x68, 0x79, 0xd1, 0x38, 0xc5, 0xcf, 0xdb, + 0x35, 0x7c, 0x01, 0xe6, 0x9b, 0xc4, 0x6d, 0x34, 0xfd, 0xe2, 0x74, 0x19, 0x2d, 0xcf, 0x1a, 0xf2, + 0xa4, 0xfe, 0x88, 0x60, 0x29, 0x86, 0xc4, 0xda, 0xd4, 0x63, 0x04, 0xdf, 0x09, 0xec, 0x83, 0x1b, + 0x0e, 0x54, 0xa8, 0x5e, 0xd5, 0xb2, 0x0a, 0xa0, 0x6d, 0x7b, 0x35, 0xf2, 0x8c, 0xd4, 0x24, 0x80, + 0x74, 0xc3, 0x6b, 0x70, 0xba, 0x4e, 0x3b, 0xbb, 0xa6, 0x38, 0x32, 0x4e, 0x5b, 0xa8, 0x5e, 0xc9, + 0x86, 0xd9, 0xa4, 0x9d, 0x5d, 0x66, 0x14, 0x02, 0x27, 0x01, 0xc5, 0x54, 0x13, 0xce, 0x73, 0x6d, + 0xeb, 0x41, 0x10, 0x1f, 0xbb, 0xcc, 0x0f, 0x03, 0xdd, 0x04, 0x18, 0x54, 0x4f, 0x2a, 0x7c, 0x47, + 0x13, 0xa5, 0xd6, 0x82, 0x52, 0x6b, 0xa2, 0x77, 0x64, 0xa9, 0xb5, 0x87, 0x56, 0x83, 0x48, 0x5f, + 0x63, 0xc8, 0x53, 0xfd, 0x0a, 0x2e, 0x8c, 0x12, 0xc8, 0xf8, 0x2f, 0xc2, 0x62, 0x98, 0x4a, 0x56, + 0x44, 0xe5, 0x99, 0xe5, 0x45, 0x63, 0x41, 0xe6, 0x92, 0xe1, 0xad, 0x18, 0xfd, 0xb4, 0x4c, 0xd0, + 0x38, 0x7a, 0x81, 0x1c, 0xe3, 0x5f, 0x1d, 0xe6, 0x67, 0xdb, 0x5e, 0x9d, 0x86, 0x11, 0x1e, 0xc7, + 0xaf, 0x9a, 0xf0, 0x7a, 0xc2, 0x4d, 0xea, 0xde, 0x80, 0x02, 0x37, 0x63, 0xa6, 0xeb, 0xd5, 0x29, + 0xf7, 0x2c, 0x54, 0xdf, 0xcc, 0xce, 0x3a, 0x87, 0xe0, 0x08, 0xe0, 0x44, 0x68, 0xea, 0x63, 0x50, + 0x38, 0xc1, 0x87, 0x41, 0x8f, 0x0e, 0x4c, 0x06, 0xda, 0x78, 0xf3, 0x9a, 0x5e, 0xb7, 0xc5, 0x93, + 0x3f, 0x6b, 0x2c, 0xf0, 0x8b, 0x07, 0xdd, 0x56, 0xac, 0x07, 0xa7, 0x63, 0x3d, 0xa8, 0x5a, 0x70, + 0x31, 0x15, 0x55, 0x4a, 0x5f, 0x03, 0x90, 0x9e, 0x42, 0x39, 0xca, 0xab, 0x5c, 0x64, 0x8a, 0x0b, + 0xff, 0x52, 0x66, 0x26, 0xa8, 0xa5, 0xec, 0xa2, 0x1c, 0xc3, 0xb1, 0x99, 0x52, 0xcf, 0x93, 0xb4, + 0xd3, 0xcf, 0x08, 0x8a, 0x49, 0x7a, 0x19, 0xde, 0x5d, 0x38, 0x15, 0xce, 0x82, 0xa8, 0x4a, 0xee, + 0x91, 0x0a, 0xfd, 0x5e, 0x5d, 0xdf, 0x7d, 0x06, 0x97, 0x22, 0x9d, 0xbc, 0x1a, 0x23, 0xb9, 0x3a, + 0x69, 0x85, 0x6d, 0xb8, 0x9c, 0x81, 0xfb, 0xca, 0x92, 0xa0, 0x3e, 0x86, 0x2b, 0x9c, 0x63, 0xd3, + 0xf5, 0xac, 0x3d, 0xf7, 0x39, 0xa9, 0x4d, 0x36, 0x3c, 0xf8, 0x1c, 0xcc, 0xb5, 0x3b, 0xb4, 0x47, + 0xb8, 0xf6, 0x05, 0x43, 0x1c, 0xd4, 0x6f, 0x10, 0x94, 0xb3, 0x61, 0xa5, 0xfa, 0x2f, 0xe0, 0x7c, + 0x3d, 0xfc, 0xd9, 0x4c, 0x8e, 0xd9, 0xca, 0x31, 0x8f, 0x5b, 0x0c, 0x95, 0x83, 0x2e, 0xd5, 0x93, + 0x4c, 0xaa, 0x0f, 0xd7, 0x52, 0x54, 0x04, 0x3f, 0xed, 0x78, 0xbe, 0xbb, 0x77, 0x8f, 0x3f, 0xda, + 0x27, 0x7f, 0xee, 0x07, 0xc1, 0xcf, 0x0c, 0x07, 0xff, 0x62, 0x06, 0xae, 0xe7, 0xa1, 0x95, 0x69, + 0xd8, 0x81, 0x73, 0x23, 0x69, 0x98, 0x78, 0x64, 0x71, 0x3d, 0xc1, 0x84, 0x6f, 0x03, 0x88, 0xa6, + 0xe3, 0x60, 0xa2, 0xbb, 0x95, 0x08, 0x2c, 0x5a, 0x97, 0xbd, 0x8a, 0xc6, 0x5b, 0xcb, 0x10, 0x2d, + 0xca, 0x5d, 0x1f, 0xc0, 0x99, 0x8e, 0xf5, 0xd4, 0x1c, 0x2c, 0x5e, 0x1e, 0xdf, 0x70, 0x77, 0xc5, + 0x96, 0x74, 0x80, 0x61, 0x58, 0x4f, 0xd7, 0xa3, 0x3b, 0xe3, 0xb5, 0xce, 0xf0, 0x11, 0xef, 0x00, + 0xb6, 0x7d, 0xc7, 0x64, 0x5d, 0xbb, 0xe5, 0x32, 0xe6, 0x52, 0xcf, 0xdc, 0x25, 0xfd, 0xe2, 0xec, + 0x08, 0x66, 0xfc, 0xab, 0xa0, 0x57, 0xd1, 0x3e, 0x8d, 0xec, 0xef, 0x93, 0xbe, 0x71, 0xd6, 0xf6, + 0x9d, 0xd8, 0x0d, 0xde, 0xe2, 0xd9, 0xa7, 0xf5, 0xe2, 0x1c, 0x47, 0xaa, 0x64, 0x67, 0xea, 0x61, + 0x60, 0x96, 0xd2, 0x34, 0xc2, 0xbf, 0xfa, 0xed, 0x69, 0x98, 0xe3, 0x05, 0xc3, 0x2f, 0x10, 0xcc, + 0x8b, 0x09, 0xc1, 0xc7, 0xb4, 0x5f, 0xf2, 0x5b, 0x41, 0xb9, 0x91, 0xd3, 0x5a, 0xd4, 0x5c, 0xdd, + 0xfa, 0xfa, 0xcf, 0x7f, 0xbe, 0x9f, 0xbe, 0x8b, 0xef, 0xe8, 0x99, 0xdf, 0x29, 0x83, 0x4e, 0xd0, + 0xf7, 0xc3, 0xbe, 0x3c, 0xd0, 0xc5, 0xd8, 0xea, 0xfb, 0xa2, 0x01, 0x0f, 0xf0, 0x0f, 0x08, 0x16, + 0xa3, 0x75, 0x8b, 0xf5, 0x31, 0x2a, 0x46, 0x37, 0xbf, 0xf2, 0x6e, 0x7e, 0x07, 0xa9, 0x7c, 0x99, + 0x2b, 0x57, 0x71, 0x79, 0x8c, 0x72, 0x86, 0x7f, 0x42, 0x00, 0x83, 0x59, 0xc4, 0xb9, 0xa8, 0x86, + 0xdf, 0x1d, 0xa5, 0x32, 0x81, 0x87, 0x54, 0x77, 0x83, 0xab, 0xbb, 0x8a, 0xdf, 0x1e, 0xa7, 0x8e, + 0x27, 0x16, 0xff, 0x8e, 0xe0, 0x4c, 0x7c, 0x7d, 0xe2, 0x9b, 0x63, 0x48, 0x53, 0x77, 0xb8, 0xb2, + 0x3a, 0xa1, 0x97, 0x94, 0xfb, 0x11, 0x97, 0xbb, 0x81, 0xd7, 0x26, 0x6d, 0x03, 0x3e, 0xab, 0x4c, + 0xdf, 0x8f, 0xd6, 0xca, 0x01, 0xfe, 0x05, 0x41, 0x61, 0x68, 0x51, 0xe2, 0x71, 0xd9, 0x4b, 0xee, + 0x74, 0xa5, 0x3a, 0x89, 0x8b, 0x0c, 0xe1, 0x26, 0x0f, 0x41, 0xc3, 0x2b, 0xd9, 0x21, 0xc8, 0x55, + 0x33, 0xa4, 0x1f, 0xff, 0x81, 0xe0, 0xec, 0xe8, 0x56, 0xc3, 0xef, 0xe7, 0xa0, 0x4f, 0x59, 0xaf, + 0xca, 0xad, 0x89, 0xfd, 0xf2, 0x4f, 0x61, 0x52, 0x7b, 0x5a, 0xee, 0x7f, 0x45, 0xb0, 0x94, 0xb2, + 0xe9, 0xf0, 0xed, 0x31, 0xca, 0xb2, 0x97, 0xae, 0xf2, 0xc1, 0x49, 0x5c, 0x65, 0x5c, 0xb7, 0x78, + 0x5c, 0x15, 0xac, 0x67, 0xc7, 0x95, 0xba, 0x78, 0xf1, 0xbf, 0x08, 0x2e, 0x1f, 0xbb, 0xb4, 0xf0, + 0xfa, 0x44, 0xb2, 0xd2, 0x37, 0xad, 0xb2, 0xf1, 0xff, 0x40, 0x64, 0x94, 0x8f, 0x78, 0x94, 0xf7, + 0xf1, 0x76, 0xee, 0x28, 0x53, 0x5e, 0xd3, 0x00, 0x31, 0x7a, 0x4d, 0xd7, 0x3e, 0xf9, 0xed, 0xb0, + 0x84, 0x5e, 0x1e, 0x96, 0xd0, 0xdf, 0x87, 0x25, 0xf4, 0xdd, 0x51, 0x69, 0xea, 0xe5, 0x51, 0x69, + 0xea, 0xaf, 0xa3, 0xd2, 0xd4, 0xe7, 0xab, 0x0d, 0xd7, 0x6f, 0x76, 0x6d, 0xcd, 0xa1, 0xad, 0x90, + 0x8e, 0xc3, 0x44, 0xdc, 0xcf, 0x46, 0xd8, 0xfd, 0x7e, 0x9b, 0x30, 0x7b, 0x9e, 0xff, 0x7f, 0xf9, + 0xde, 0x7f, 0x01, 0x00, 0x00, 0xff, 0xff, 0xd9, 0x74, 0x79, 0x64, 0x96, 0x0f, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -1063,8 +1025,8 @@ type QueryClient interface { // ListEpochHeaders queries the headers of a chain timestamped in a given // epoch of Babylon, with pagination support ListEpochHeaders(ctx context.Context, in *QueryListEpochHeadersRequest, opts ...grpc.CallOption) (*QueryListEpochHeadersResponse, error) - // FinalizedChainInfo queries the BTC-finalised info of a chain, with proofs - FinalizedChainInfo(ctx context.Context, in *QueryFinalizedChainInfoRequest, opts ...grpc.CallOption) (*QueryFinalizedChainInfoResponse, error) + // FinalizedChainsInfo queries the BTC-finalised info of chains with given IDs, with proofs + FinalizedChainsInfo(ctx context.Context, in *QueryFinalizedChainsInfoRequest, opts ...grpc.CallOption) (*QueryFinalizedChainsInfoResponse, error) // FinalizedChainInfoUntilHeight queries the BTC-finalised info no later than // the provided CZ height, with proofs FinalizedChainInfoUntilHeight(ctx context.Context, in *QueryFinalizedChainInfoUntilHeightRequest, opts ...grpc.CallOption) (*QueryFinalizedChainInfoUntilHeightResponse, error) @@ -1132,9 +1094,9 @@ func (c *queryClient) ListEpochHeaders(ctx context.Context, in *QueryListEpochHe return out, nil } -func (c *queryClient) FinalizedChainInfo(ctx context.Context, in *QueryFinalizedChainInfoRequest, opts ...grpc.CallOption) (*QueryFinalizedChainInfoResponse, error) { - out := new(QueryFinalizedChainInfoResponse) - err := c.cc.Invoke(ctx, "/babylon.zoneconcierge.v1.Query/FinalizedChainInfo", in, out, opts...) +func (c *queryClient) FinalizedChainsInfo(ctx context.Context, in *QueryFinalizedChainsInfoRequest, opts ...grpc.CallOption) (*QueryFinalizedChainsInfoResponse, error) { + out := new(QueryFinalizedChainsInfoResponse) + err := c.cc.Invoke(ctx, "/babylon.zoneconcierge.v1.Query/FinalizedChainsInfo", in, out, opts...) if err != nil { return nil, err } @@ -1167,8 +1129,8 @@ type QueryServer interface { // ListEpochHeaders queries the headers of a chain timestamped in a given // epoch of Babylon, with pagination support ListEpochHeaders(context.Context, *QueryListEpochHeadersRequest) (*QueryListEpochHeadersResponse, error) - // FinalizedChainInfo queries the BTC-finalised info of a chain, with proofs - FinalizedChainInfo(context.Context, *QueryFinalizedChainInfoRequest) (*QueryFinalizedChainInfoResponse, error) + // FinalizedChainsInfo queries the BTC-finalised info of chains with given IDs, with proofs + FinalizedChainsInfo(context.Context, *QueryFinalizedChainsInfoRequest) (*QueryFinalizedChainsInfoResponse, error) // FinalizedChainInfoUntilHeight queries the BTC-finalised info no later than // the provided CZ height, with proofs FinalizedChainInfoUntilHeight(context.Context, *QueryFinalizedChainInfoUntilHeightRequest) (*QueryFinalizedChainInfoUntilHeightResponse, error) @@ -1196,8 +1158,8 @@ func (*UnimplementedQueryServer) ListHeaders(ctx context.Context, req *QueryList func (*UnimplementedQueryServer) ListEpochHeaders(ctx context.Context, req *QueryListEpochHeadersRequest) (*QueryListEpochHeadersResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ListEpochHeaders not implemented") } -func (*UnimplementedQueryServer) FinalizedChainInfo(ctx context.Context, req *QueryFinalizedChainInfoRequest) (*QueryFinalizedChainInfoResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method FinalizedChainInfo not implemented") +func (*UnimplementedQueryServer) FinalizedChainsInfo(ctx context.Context, req *QueryFinalizedChainsInfoRequest) (*QueryFinalizedChainsInfoResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method FinalizedChainsInfo not implemented") } func (*UnimplementedQueryServer) FinalizedChainInfoUntilHeight(ctx context.Context, req *QueryFinalizedChainInfoUntilHeightRequest) (*QueryFinalizedChainInfoUntilHeightResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method FinalizedChainInfoUntilHeight not implemented") @@ -1315,20 +1277,20 @@ func _Query_ListEpochHeaders_Handler(srv interface{}, ctx context.Context, dec f return interceptor(ctx, in, info, handler) } -func _Query_FinalizedChainInfo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(QueryFinalizedChainInfoRequest) +func _Query_FinalizedChainsInfo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryFinalizedChainsInfoRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(QueryServer).FinalizedChainInfo(ctx, in) + return srv.(QueryServer).FinalizedChainsInfo(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/babylon.zoneconcierge.v1.Query/FinalizedChainInfo", + FullMethod: "/babylon.zoneconcierge.v1.Query/FinalizedChainsInfo", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(QueryServer).FinalizedChainInfo(ctx, req.(*QueryFinalizedChainInfoRequest)) + return srv.(QueryServer).FinalizedChainsInfo(ctx, req.(*QueryFinalizedChainsInfoRequest)) } return interceptor(ctx, in, info, handler) } @@ -1380,8 +1342,8 @@ var _Query_serviceDesc = grpc.ServiceDesc{ Handler: _Query_ListEpochHeaders_Handler, }, { - MethodName: "FinalizedChainInfo", - Handler: _Query_FinalizedChainInfo_Handler, + MethodName: "FinalizedChainsInfo", + Handler: _Query_FinalizedChainsInfo_Handler, }, { MethodName: "FinalizedChainInfoUntilHeight", @@ -1855,7 +1817,7 @@ func (m *QueryListEpochHeadersResponse) MarshalToSizedBuffer(dAtA []byte) (int, return len(dAtA) - i, nil } -func (m *QueryFinalizedChainInfoRequest) Marshal() (dAtA []byte, err error) { +func (m *QueryFinalizedChainsInfoRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1865,12 +1827,12 @@ func (m *QueryFinalizedChainInfoRequest) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *QueryFinalizedChainInfoRequest) MarshalTo(dAtA []byte) (int, error) { +func (m *QueryFinalizedChainsInfoRequest) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *QueryFinalizedChainInfoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *QueryFinalizedChainsInfoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -1885,17 +1847,19 @@ func (m *QueryFinalizedChainInfoRequest) MarshalToSizedBuffer(dAtA []byte) (int, i-- dAtA[i] = 0x10 } - if len(m.ChainId) > 0 { - i -= len(m.ChainId) - copy(dAtA[i:], m.ChainId) - i = encodeVarintQuery(dAtA, i, uint64(len(m.ChainId))) - i-- - dAtA[i] = 0xa + if len(m.ChainIds) > 0 { + for iNdEx := len(m.ChainIds) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.ChainIds[iNdEx]) + copy(dAtA[i:], m.ChainIds[iNdEx]) + i = encodeVarintQuery(dAtA, i, uint64(len(m.ChainIds[iNdEx]))) + i-- + dAtA[i] = 0xa + } } return len(dAtA) - i, nil } -func (m *QueryFinalizedChainInfoResponse) Marshal() (dAtA []byte, err error) { +func (m *QueryFinalizedChainsInfoResponse) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1905,75 +1869,29 @@ func (m *QueryFinalizedChainInfoResponse) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *QueryFinalizedChainInfoResponse) MarshalTo(dAtA []byte) (int, error) { +func (m *QueryFinalizedChainsInfoResponse) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *QueryFinalizedChainInfoResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *QueryFinalizedChainsInfoResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - if m.Proof != nil { - { - size, err := m.Proof.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x2a - } - if m.BtcSubmissionKey != nil { - { - size, err := m.BtcSubmissionKey.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - } - if m.RawCheckpoint != nil { - { - size, err := m.RawCheckpoint.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - } - if m.EpochInfo != nil { - { - size, err := m.EpochInfo.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - if m.FinalizedChainInfo != nil { - { - size, err := m.FinalizedChainInfo.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err + if len(m.FinalizedChainsInfo) > 0 { + for iNdEx := len(m.FinalizedChainsInfo) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.FinalizedChainsInfo[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) } - i -= size - i = encodeVarintQuery(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0xa } - i-- - dAtA[i] = 0xa } return len(dAtA) - i, nil } @@ -2308,15 +2226,17 @@ func (m *QueryListEpochHeadersResponse) Size() (n int) { return n } -func (m *QueryFinalizedChainInfoRequest) Size() (n int) { +func (m *QueryFinalizedChainsInfoRequest) Size() (n int) { if m == nil { return 0 } var l int _ = l - l = len(m.ChainId) - if l > 0 { - n += 1 + l + sovQuery(uint64(l)) + if len(m.ChainIds) > 0 { + for _, s := range m.ChainIds { + l = len(s) + n += 1 + l + sovQuery(uint64(l)) + } } if m.Prove { n += 2 @@ -2324,31 +2244,17 @@ func (m *QueryFinalizedChainInfoRequest) Size() (n int) { return n } -func (m *QueryFinalizedChainInfoResponse) Size() (n int) { +func (m *QueryFinalizedChainsInfoResponse) Size() (n int) { if m == nil { return 0 } var l int _ = l - if m.FinalizedChainInfo != nil { - l = m.FinalizedChainInfo.Size() - n += 1 + l + sovQuery(uint64(l)) - } - if m.EpochInfo != nil { - l = m.EpochInfo.Size() - n += 1 + l + sovQuery(uint64(l)) - } - if m.RawCheckpoint != nil { - l = m.RawCheckpoint.Size() - n += 1 + l + sovQuery(uint64(l)) - } - if m.BtcSubmissionKey != nil { - l = m.BtcSubmissionKey.Size() - n += 1 + l + sovQuery(uint64(l)) - } - if m.Proof != nil { - l = m.Proof.Size() - n += 1 + l + sovQuery(uint64(l)) + if len(m.FinalizedChainsInfo) > 0 { + for _, e := range m.FinalizedChainsInfo { + l = e.Size() + n += 1 + l + sovQuery(uint64(l)) + } } return n } @@ -3610,7 +3516,7 @@ func (m *QueryListEpochHeadersResponse) Unmarshal(dAtA []byte) error { } return nil } -func (m *QueryFinalizedChainInfoRequest) Unmarshal(dAtA []byte) error { +func (m *QueryFinalizedChainsInfoRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -3633,15 +3539,15 @@ func (m *QueryFinalizedChainInfoRequest) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: QueryFinalizedChainInfoRequest: wiretype end group for non-group") + return fmt.Errorf("proto: QueryFinalizedChainsInfoRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: QueryFinalizedChainInfoRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: QueryFinalizedChainsInfoRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ChainId", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ChainIds", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -3669,7 +3575,7 @@ func (m *QueryFinalizedChainInfoRequest) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.ChainId = string(dAtA[iNdEx:postIndex]) + m.ChainIds = append(m.ChainIds, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex case 2: if wireType != 0 { @@ -3712,7 +3618,7 @@ func (m *QueryFinalizedChainInfoRequest) Unmarshal(dAtA []byte) error { } return nil } -func (m *QueryFinalizedChainInfoResponse) Unmarshal(dAtA []byte) error { +func (m *QueryFinalizedChainsInfoResponse) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -3735,159 +3641,15 @@ func (m *QueryFinalizedChainInfoResponse) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: QueryFinalizedChainInfoResponse: wiretype end group for non-group") + return fmt.Errorf("proto: QueryFinalizedChainsInfoResponse: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: QueryFinalizedChainInfoResponse: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: QueryFinalizedChainsInfoResponse: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field FinalizedChainInfo", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.FinalizedChainInfo == nil { - m.FinalizedChainInfo = &ChainInfo{} - } - if err := m.FinalizedChainInfo.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EpochInfo", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.EpochInfo == nil { - m.EpochInfo = &types.Epoch{} - } - if err := m.EpochInfo.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field RawCheckpoint", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.RawCheckpoint == nil { - m.RawCheckpoint = &types1.RawCheckpoint{} - } - if err := m.RawCheckpoint.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field BtcSubmissionKey", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.BtcSubmissionKey == nil { - m.BtcSubmissionKey = &types2.SubmissionKey{} - } - if err := m.BtcSubmissionKey.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Proof", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field FinalizedChainsInfo", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -3914,10 +3676,8 @@ func (m *QueryFinalizedChainInfoResponse) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.Proof == nil { - m.Proof = &ProofFinalizedChainInfo{} - } - if err := m.Proof.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + m.FinalizedChainsInfo = append(m.FinalizedChainsInfo, &FinalizedChainInfo{}) + if err := m.FinalizedChainsInfo[len(m.FinalizedChainsInfo)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex diff --git a/x/zoneconcierge/types/query.pb.gw.go b/x/zoneconcierge/types/query.pb.gw.go index 5a9e81fcf..5b7d961fd 100644 --- a/x/zoneconcierge/types/query.pb.gw.go +++ b/x/zoneconcierge/types/query.pb.gw.go @@ -406,73 +406,37 @@ func local_request_Query_ListEpochHeaders_0(ctx context.Context, marshaler runti } var ( - filter_Query_FinalizedChainInfo_0 = &utilities.DoubleArray{Encoding: map[string]int{"chain_id": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} + filter_Query_FinalizedChainsInfo_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} ) -func request_Query_FinalizedChainInfo_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryFinalizedChainInfoRequest +func request_Query_FinalizedChainsInfo_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryFinalizedChainsInfoRequest var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["chain_id"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "chain_id") - } - - protoReq.ChainId, err = runtime.String(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "chain_id", err) - } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_FinalizedChainInfo_0); err != nil { + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_FinalizedChainsInfo_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.FinalizedChainInfo(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + msg, err := client.FinalizedChainsInfo(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } -func local_request_Query_FinalizedChainInfo_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryFinalizedChainInfoRequest +func local_request_Query_FinalizedChainsInfo_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryFinalizedChainsInfoRequest var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["chain_id"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "chain_id") - } - - protoReq.ChainId, err = runtime.String(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "chain_id", err) - } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_FinalizedChainInfo_0); err != nil { + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_FinalizedChainsInfo_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.FinalizedChainInfo(ctx, &protoReq) + msg, err := server.FinalizedChainsInfo(ctx, &protoReq) return msg, metadata, err } @@ -715,7 +679,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv }) - mux.Handle("GET", pattern_Query_FinalizedChainInfo_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("GET", pattern_Query_FinalizedChainsInfo_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream @@ -726,7 +690,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := local_request_Query_FinalizedChainInfo_0(rctx, inboundMarshaler, server, req, pathParams) + resp, md, err := local_request_Query_FinalizedChainsInfo_0(rctx, inboundMarshaler, server, req, pathParams) md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { @@ -734,7 +698,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv return } - forward_Query_FinalizedChainInfo_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_Query_FinalizedChainsInfo_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) @@ -922,7 +886,7 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie }) - mux.Handle("GET", pattern_Query_FinalizedChainInfo_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("GET", pattern_Query_FinalizedChainsInfo_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) @@ -931,14 +895,14 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := request_Query_FinalizedChainInfo_0(rctx, inboundMarshaler, client, req, pathParams) + resp, md, err := request_Query_FinalizedChainsInfo_0(rctx, inboundMarshaler, client, req, pathParams) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - forward_Query_FinalizedChainInfo_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_Query_FinalizedChainsInfo_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) @@ -978,7 +942,7 @@ var ( pattern_Query_ListEpochHeaders_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4, 2, 5, 1, 0, 4, 1, 5, 6}, []string{"babylon", "zoneconcierge", "v1", "headers", "chain_id", "epochs", "epoch_num"}, "", runtime.AssumeColonVerbOpt(false))) - pattern_Query_FinalizedChainInfo_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4}, []string{"babylon", "zoneconcierge", "v1", "finalized_chain_info", "chain_id"}, "", runtime.AssumeColonVerbOpt(false))) + pattern_Query_FinalizedChainsInfo_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"babylon", "zoneconcierge", "v1", "finalized_chains_info"}, "", runtime.AssumeColonVerbOpt(false))) pattern_Query_FinalizedChainInfoUntilHeight_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4, 2, 5, 1, 0, 4, 1, 5, 5}, []string{"babylon", "zoneconcierge", "v1", "finalized_chain_info", "chain_id", "height"}, "", runtime.AssumeColonVerbOpt(false))) ) @@ -996,7 +960,7 @@ var ( forward_Query_ListEpochHeaders_0 = runtime.ForwardResponseMessage - forward_Query_FinalizedChainInfo_0 = runtime.ForwardResponseMessage + forward_Query_FinalizedChainsInfo_0 = runtime.ForwardResponseMessage forward_Query_FinalizedChainInfoUntilHeight_0 = runtime.ForwardResponseMessage ) diff --git a/x/zoneconcierge/types/zoneconcierge.pb.go b/x/zoneconcierge/types/zoneconcierge.pb.go index 99082b5b2..f9e732c74 100644 --- a/x/zoneconcierge/types/zoneconcierge.pb.go +++ b/x/zoneconcierge/types/zoneconcierge.pb.go @@ -5,8 +5,9 @@ package types import ( fmt "fmt" - types2 "github.com/babylonchain/babylon/x/btccheckpoint/types" - types1 "github.com/babylonchain/babylon/x/checkpointing/types" + types3 "github.com/babylonchain/babylon/x/btccheckpoint/types" + types2 "github.com/babylonchain/babylon/x/checkpointing/types" + types1 "github.com/babylonchain/babylon/x/epoching/types" crypto "github.com/cometbft/cometbft/proto/tendermint/crypto" types "github.com/cometbft/cometbft/proto/tendermint/types" proto "github.com/cosmos/gogoproto/proto" @@ -257,6 +258,98 @@ func (m *ChainInfo) GetTimestampedHeadersCount() uint64 { return 0 } +// FinalizedChainInfo is the information of a CZ that is BTC-finalised +type FinalizedChainInfo struct { + // chain_id is the ID of the chain + ChainId string `protobuf:"bytes,1,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` + // finalized_chain_info is the info of the CZ + FinalizedChainInfo *ChainInfo `protobuf:"bytes,2,opt,name=finalized_chain_info,json=finalizedChainInfo,proto3" json:"finalized_chain_info,omitempty"` + // epoch_info is the metadata of the last BTC-finalised epoch + EpochInfo *types1.Epoch `protobuf:"bytes,3,opt,name=epoch_info,json=epochInfo,proto3" json:"epoch_info,omitempty"` + // raw_checkpoint is the raw checkpoint of this epoch + RawCheckpoint *types2.RawCheckpoint `protobuf:"bytes,4,opt,name=raw_checkpoint,json=rawCheckpoint,proto3" json:"raw_checkpoint,omitempty"` + // btc_submission_key is position of two BTC txs that include the raw + // checkpoint of this epoch + BtcSubmissionKey *types3.SubmissionKey `protobuf:"bytes,5,opt,name=btc_submission_key,json=btcSubmissionKey,proto3" json:"btc_submission_key,omitempty"` + // proof is the proof that the chain info is finalized + Proof *ProofFinalizedChainInfo `protobuf:"bytes,6,opt,name=proof,proto3" json:"proof,omitempty"` +} + +func (m *FinalizedChainInfo) Reset() { *m = FinalizedChainInfo{} } +func (m *FinalizedChainInfo) String() string { return proto.CompactTextString(m) } +func (*FinalizedChainInfo) ProtoMessage() {} +func (*FinalizedChainInfo) Descriptor() ([]byte, []int) { + return fileDescriptor_ab886e1868e5c5cd, []int{3} +} +func (m *FinalizedChainInfo) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *FinalizedChainInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_FinalizedChainInfo.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 *FinalizedChainInfo) XXX_Merge(src proto.Message) { + xxx_messageInfo_FinalizedChainInfo.Merge(m, src) +} +func (m *FinalizedChainInfo) XXX_Size() int { + return m.Size() +} +func (m *FinalizedChainInfo) XXX_DiscardUnknown() { + xxx_messageInfo_FinalizedChainInfo.DiscardUnknown(m) +} + +var xxx_messageInfo_FinalizedChainInfo proto.InternalMessageInfo + +func (m *FinalizedChainInfo) GetChainId() string { + if m != nil { + return m.ChainId + } + return "" +} + +func (m *FinalizedChainInfo) GetFinalizedChainInfo() *ChainInfo { + if m != nil { + return m.FinalizedChainInfo + } + return nil +} + +func (m *FinalizedChainInfo) GetEpochInfo() *types1.Epoch { + if m != nil { + return m.EpochInfo + } + return nil +} + +func (m *FinalizedChainInfo) GetRawCheckpoint() *types2.RawCheckpoint { + if m != nil { + return m.RawCheckpoint + } + return nil +} + +func (m *FinalizedChainInfo) GetBtcSubmissionKey() *types3.SubmissionKey { + if m != nil { + return m.BtcSubmissionKey + } + return nil +} + +func (m *FinalizedChainInfo) GetProof() *ProofFinalizedChainInfo { + if m != nil { + return m.Proof + } + return nil +} + // ProofEpochSealed is the proof that an epoch is sealed by the sealer header, // i.e., the 2nd header of the next epoch With the access of metadata // - Metadata of this epoch, which includes the sealer header @@ -271,7 +364,7 @@ type ProofEpochSealed struct { // validator_set is the validator set of the sealed epoch // This validator set has generated a BLS multisig on `last_commit_hash` of // the sealer header - ValidatorSet []*types1.ValidatorWithBlsKey `protobuf:"bytes,1,rep,name=validator_set,json=validatorSet,proto3" json:"validator_set,omitempty"` + ValidatorSet []*types2.ValidatorWithBlsKey `protobuf:"bytes,1,rep,name=validator_set,json=validatorSet,proto3" json:"validator_set,omitempty"` // proof_epoch_info is the Merkle proof that the epoch's metadata is committed // to `app_hash` of the sealer header ProofEpochInfo *crypto.ProofOps `protobuf:"bytes,2,opt,name=proof_epoch_info,json=proofEpochInfo,proto3" json:"proof_epoch_info,omitempty"` @@ -284,7 +377,7 @@ func (m *ProofEpochSealed) Reset() { *m = ProofEpochSealed{} } func (m *ProofEpochSealed) String() string { return proto.CompactTextString(m) } func (*ProofEpochSealed) ProtoMessage() {} func (*ProofEpochSealed) Descriptor() ([]byte, []int) { - return fileDescriptor_ab886e1868e5c5cd, []int{3} + return fileDescriptor_ab886e1868e5c5cd, []int{4} } func (m *ProofEpochSealed) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -313,7 +406,7 @@ func (m *ProofEpochSealed) XXX_DiscardUnknown() { var xxx_messageInfo_ProofEpochSealed proto.InternalMessageInfo -func (m *ProofEpochSealed) GetValidatorSet() []*types1.ValidatorWithBlsKey { +func (m *ProofEpochSealed) GetValidatorSet() []*types2.ValidatorWithBlsKey { if m != nil { return m.ValidatorSet } @@ -348,14 +441,14 @@ type ProofFinalizedChainInfo struct { // proof_epoch_submitted is the proof that the epoch's checkpoint is included // in BTC ledger It is the two TransactionInfo in the best (i.e., earliest) // checkpoint submission - ProofEpochSubmitted []*types2.TransactionInfo `protobuf:"bytes,7,rep,name=proof_epoch_submitted,json=proofEpochSubmitted,proto3" json:"proof_epoch_submitted,omitempty"` + ProofEpochSubmitted []*types3.TransactionInfo `protobuf:"bytes,7,rep,name=proof_epoch_submitted,json=proofEpochSubmitted,proto3" json:"proof_epoch_submitted,omitempty"` } func (m *ProofFinalizedChainInfo) Reset() { *m = ProofFinalizedChainInfo{} } func (m *ProofFinalizedChainInfo) String() string { return proto.CompactTextString(m) } func (*ProofFinalizedChainInfo) ProtoMessage() {} func (*ProofFinalizedChainInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_ab886e1868e5c5cd, []int{4} + return fileDescriptor_ab886e1868e5c5cd, []int{5} } func (m *ProofFinalizedChainInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -405,7 +498,7 @@ func (m *ProofFinalizedChainInfo) GetProofEpochSealed() *ProofEpochSealed { return nil } -func (m *ProofFinalizedChainInfo) GetProofEpochSubmitted() []*types2.TransactionInfo { +func (m *ProofFinalizedChainInfo) GetProofEpochSubmitted() []*types3.TransactionInfo { if m != nil { return m.ProofEpochSubmitted } @@ -416,6 +509,7 @@ func init() { proto.RegisterType((*IndexedHeader)(nil), "babylon.zoneconcierge.v1.IndexedHeader") proto.RegisterType((*Forks)(nil), "babylon.zoneconcierge.v1.Forks") proto.RegisterType((*ChainInfo)(nil), "babylon.zoneconcierge.v1.ChainInfo") + proto.RegisterType((*FinalizedChainInfo)(nil), "babylon.zoneconcierge.v1.FinalizedChainInfo") proto.RegisterType((*ProofEpochSealed)(nil), "babylon.zoneconcierge.v1.ProofEpochSealed") proto.RegisterType((*ProofFinalizedChainInfo)(nil), "babylon.zoneconcierge.v1.ProofFinalizedChainInfo") } @@ -425,52 +519,60 @@ func init() { } var fileDescriptor_ab886e1868e5c5cd = []byte{ - // 710 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x54, 0x41, 0x6f, 0xd3, 0x4a, - 0x10, 0xae, 0x9b, 0xb4, 0x7d, 0xdd, 0x24, 0x7d, 0x7d, 0xae, 0x1e, 0x75, 0x0b, 0x84, 0x28, 0x48, - 0x25, 0x20, 0x70, 0x94, 0x20, 0x2e, 0x5c, 0x10, 0x29, 0xad, 0x9a, 0x16, 0xa9, 0xc8, 0x8d, 0x0a, - 0x42, 0x42, 0xd6, 0xc6, 0xde, 0xc4, 0xab, 0x38, 0xbb, 0x96, 0x77, 0x1b, 0x25, 0xfd, 0x15, 0xfc, - 0x2c, 0x8e, 0x3d, 0x72, 0x44, 0x2d, 0xfc, 0x03, 0x2e, 0xdc, 0x90, 0x67, 0xd7, 0x89, 0x53, 0x54, - 0xe0, 0x12, 0x65, 0x77, 0x66, 0xbe, 0xfd, 0xe6, 0xfb, 0x66, 0x8c, 0x1e, 0x77, 0x71, 0x77, 0x12, - 0x72, 0x56, 0x3f, 0xe7, 0x8c, 0x78, 0x9c, 0x79, 0x94, 0xc4, 0x7d, 0x52, 0x1f, 0x35, 0xe6, 0x2f, - 0xec, 0x28, 0xe6, 0x92, 0x9b, 0x96, 0xce, 0xb6, 0xe7, 0x83, 0xa3, 0xc6, 0xf6, 0x1d, 0x49, 0x98, - 0x4f, 0xe2, 0x21, 0x65, 0xb2, 0x2e, 0x27, 0x11, 0x11, 0xea, 0x57, 0xd5, 0x6d, 0xdf, 0xcd, 0x44, - 0xbd, 0x78, 0x12, 0x49, 0x5e, 0x8f, 0x62, 0xce, 0x7b, 0x3a, 0x3c, 0x25, 0xd1, 0x95, 0x9e, 0x17, - 0x10, 0x6f, 0x10, 0xf1, 0x24, 0x73, 0xd4, 0x98, 0xbf, 0xd0, 0xd9, 0x3b, 0x69, 0xf6, 0x2c, 0x42, - 0x59, 0x1f, 0xb2, 0x43, 0xe1, 0x0e, 0xc8, 0x44, 0xe5, 0x55, 0xbf, 0x1a, 0xa8, 0xd4, 0x66, 0x3e, - 0x19, 0x13, 0xff, 0x80, 0x60, 0x9f, 0xc4, 0xe6, 0x16, 0xfa, 0xc7, 0x0b, 0x30, 0x65, 0x2e, 0xf5, - 0x2d, 0xa3, 0x62, 0xd4, 0x56, 0x9d, 0x15, 0x38, 0xb7, 0x7d, 0xd3, 0x44, 0xf9, 0x00, 0x8b, 0xc0, - 0x5a, 0xac, 0x18, 0xb5, 0xa2, 0x03, 0xff, 0xcd, 0x5b, 0x68, 0x39, 0x20, 0xb4, 0x1f, 0x48, 0x2b, - 0x57, 0x31, 0x6a, 0x79, 0x47, 0x9f, 0xcc, 0x17, 0x68, 0x4d, 0x53, 0x70, 0x03, 0x00, 0xb6, 0xf2, - 0x15, 0xa3, 0x56, 0x68, 0x5a, 0xf6, 0xac, 0x4d, 0x5b, 0xb5, 0xaf, 0x1e, 0x76, 0x4a, 0x3a, 0x5f, - 0xf3, 0xb8, 0x8f, 0xd2, 0x0b, 0x97, 0x44, 0xdc, 0x0b, 0xac, 0x25, 0xc0, 0x2f, 0xea, 0xcb, 0xbd, - 0xe4, 0xce, 0xdc, 0x41, 0xff, 0xa6, 0x49, 0x72, 0xec, 0x02, 0xb9, 0x65, 0x20, 0x97, 0xd6, 0x76, - 0xc6, 0x07, 0x58, 0x04, 0xd5, 0x43, 0xb4, 0xb4, 0xcf, 0xe3, 0x81, 0x30, 0x5f, 0xa2, 0x15, 0x45, - 0x47, 0x58, 0xb9, 0x4a, 0xae, 0x56, 0x68, 0x3e, 0xb0, 0x6f, 0xb2, 0xcb, 0x9e, 0xd3, 0xc5, 0x49, - 0xeb, 0xaa, 0xdf, 0x0d, 0xb4, 0xba, 0x0b, 0x8a, 0xb0, 0x1e, 0xff, 0x9d, 0x5c, 0xaf, 0x51, 0x29, - 0xc4, 0x92, 0x08, 0x99, 0x2a, 0xb0, 0x08, 0x0a, 0xfc, 0xf5, 0x8b, 0x45, 0x55, 0xad, 0xf5, 0x68, - 0x21, 0x7d, 0x76, 0x7b, 0x49, 0x27, 0x20, 0x77, 0xa1, 0x79, 0xef, 0x66, 0x30, 0x68, 0xd8, 0x29, - 0xa8, 0x22, 0xd5, 0xfd, 0x73, 0xb4, 0x25, 0xe9, 0x90, 0x08, 0x89, 0x87, 0x11, 0xf1, 0x35, 0x2d, - 0xe1, 0x7a, 0xfc, 0x8c, 0x49, 0xf0, 0x27, 0xef, 0x6c, 0x66, 0x12, 0xd4, 0xcb, 0x62, 0x37, 0x09, - 0x57, 0x7f, 0x18, 0x68, 0xfd, 0x4d, 0x32, 0x8f, 0xa0, 0xfc, 0x09, 0xc1, 0x21, 0xf1, 0x4d, 0x07, - 0x95, 0x46, 0x38, 0xa4, 0x3e, 0x96, 0x3c, 0x76, 0x05, 0x91, 0x96, 0x01, 0xa2, 0x3e, 0x99, 0xb2, - 0x9a, 0x1b, 0xbf, 0x84, 0xd5, 0x69, 0x9a, 0xfe, 0x96, 0xca, 0xa0, 0x15, 0x8a, 0x23, 0x32, 0x71, - 0x8a, 0x53, 0x8c, 0x13, 0x22, 0xcd, 0x3d, 0xb4, 0x0e, 0x73, 0xaf, 0x6c, 0x77, 0x29, 0xeb, 0x71, - 0xad, 0xdc, 0xed, 0xec, 0xec, 0xa8, 0x15, 0xb1, 0x81, 0xd2, 0x71, 0x24, 0x9c, 0xb5, 0x68, 0x4a, - 0x0e, 0x8c, 0x39, 0x44, 0x1b, 0x59, 0x98, 0x11, 0x0e, 0x81, 0x60, 0xee, 0xcf, 0x48, 0xeb, 0x33, - 0xa4, 0x53, 0x1c, 0x9e, 0x10, 0x59, 0xfd, 0xb6, 0x88, 0x36, 0x21, 0xbc, 0x4f, 0x19, 0x0e, 0xe9, - 0x39, 0xf1, 0x67, 0x03, 0xf0, 0x0a, 0xfd, 0xa7, 0xde, 0x91, 0x63, 0x97, 0x32, 0xb7, 0x1b, 0x72, - 0x6f, 0xa0, 0x67, 0x7d, 0xeb, 0xd7, 0x59, 0xef, 0x8c, 0x01, 0x47, 0xb3, 0xed, 0x8c, 0xdb, 0xac, - 0x95, 0x14, 0x98, 0x47, 0xe8, 0x7f, 0x85, 0xa2, 0x3c, 0x49, 0x90, 0x66, 0x53, 0x7f, 0x6d, 0x6b, - 0xb2, 0x7c, 0x1d, 0x13, 0xca, 0x94, 0x53, 0x6d, 0xbd, 0x15, 0xef, 0x90, 0x99, 0x6d, 0x5d, 0x80, - 0x57, 0xb0, 0x18, 0x85, 0xe6, 0xa3, 0x9b, 0x07, 0xe6, 0xba, 0xbb, 0x59, 0x21, 0xb4, 0xdf, 0x1f, - 0x52, 0x9a, 0x1a, 0xf9, 0xac, 0x3b, 0xa4, 0x52, 0x12, 0xdf, 0x5a, 0x01, 0xdf, 0x1f, 0x4e, 0xc1, - 0xe7, 0xbf, 0x49, 0xa3, 0x86, 0xdd, 0x89, 0x31, 0x13, 0xd8, 0x93, 0x94, 0x83, 0x6c, 0xce, 0x46, - 0x06, 0x3b, 0x45, 0x69, 0x1d, 0x7f, 0xba, 0x2c, 0x1b, 0x17, 0x97, 0x65, 0xe3, 0xcb, 0x65, 0xd9, - 0xf8, 0x78, 0x55, 0x5e, 0xb8, 0xb8, 0x2a, 0x2f, 0x7c, 0xbe, 0x2a, 0x2f, 0xbc, 0x7f, 0xd6, 0xa7, - 0x32, 0x38, 0xeb, 0xda, 0x1e, 0x1f, 0xd6, 0xf5, 0x1b, 0xb0, 0x66, 0xe9, 0xa1, 0x3e, 0xbe, 0xf6, - 0x71, 0x06, 0xb9, 0xbb, 0xcb, 0xf0, 0x95, 0x7b, 0xfa, 0x33, 0x00, 0x00, 0xff, 0xff, 0xff, 0x75, - 0xe0, 0xb7, 0xc2, 0x05, 0x00, 0x00, + // 848 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x55, 0xdd, 0x6e, 0x1b, 0x45, + 0x14, 0xce, 0xc6, 0xf9, 0x21, 0xe3, 0x38, 0x84, 0x29, 0xd0, 0x4d, 0x00, 0x63, 0xb9, 0x52, 0x71, + 0x11, 0xac, 0xe5, 0x20, 0x2e, 0xe0, 0x06, 0x91, 0xd0, 0xd2, 0xb4, 0x88, 0xa2, 0x89, 0x5b, 0x10, + 0x12, 0x5a, 0xcd, 0xee, 0x8e, 0xbd, 0x23, 0xaf, 0x67, 0x56, 0x3b, 0x13, 0xd7, 0xee, 0x53, 0xf0, + 0x2a, 0xbc, 0x05, 0x97, 0xbd, 0xe4, 0x12, 0x25, 0xf0, 0x06, 0xdc, 0x70, 0x87, 0xf6, 0xcc, 0xec, + 0x7a, 0x5d, 0x6b, 0x69, 0x6e, 0x2c, 0xcf, 0xcc, 0x77, 0xbe, 0xf3, 0xcd, 0x77, 0xce, 0x99, 0x45, + 0x9f, 0x04, 0x34, 0x58, 0x24, 0x52, 0xf4, 0x5f, 0x48, 0xc1, 0x42, 0x29, 0x42, 0xce, 0xb2, 0x31, + 0xeb, 0xcf, 0x06, 0xab, 0x1b, 0x5e, 0x9a, 0x49, 0x2d, 0xb1, 0x6b, 0xd1, 0xde, 0xea, 0xe1, 0x6c, + 0x70, 0xfc, 0xbe, 0x66, 0x22, 0x62, 0xd9, 0x94, 0x0b, 0xdd, 0xd7, 0x8b, 0x94, 0x29, 0xf3, 0x6b, + 0xe2, 0x8e, 0x3f, 0xa8, 0x9c, 0x86, 0xd9, 0x22, 0xd5, 0xb2, 0x9f, 0x66, 0x52, 0x8e, 0xec, 0x71, + 0x29, 0x22, 0xd0, 0x61, 0x18, 0xb3, 0x70, 0x92, 0xca, 0x1c, 0x39, 0x1b, 0xac, 0x6e, 0x58, 0xf4, + 0xdd, 0x02, 0xbd, 0x3c, 0xe1, 0x62, 0x0c, 0xe8, 0x44, 0xf9, 0x13, 0xb6, 0xb0, 0xb8, 0x7b, 0xb5, + 0xb8, 0x35, 0xca, 0x6e, 0x01, 0x65, 0xa9, 0x0c, 0x63, 0x8b, 0x2a, 0xfe, 0x1b, 0x4c, 0xf7, 0x2f, + 0x07, 0xb5, 0xce, 0x45, 0xc4, 0xe6, 0x2c, 0x7a, 0xc8, 0x68, 0xc4, 0x32, 0x7c, 0x84, 0xde, 0x08, + 0x63, 0xca, 0x85, 0xcf, 0x23, 0xd7, 0xe9, 0x38, 0xbd, 0x3d, 0xb2, 0x0b, 0xeb, 0xf3, 0x08, 0x63, + 0xb4, 0x15, 0x53, 0x15, 0xbb, 0x9b, 0x1d, 0xa7, 0xb7, 0x4f, 0xe0, 0x3f, 0x7e, 0x17, 0xed, 0xc4, + 0x8c, 0x8f, 0x63, 0xed, 0x36, 0x3a, 0x4e, 0x6f, 0x8b, 0xd8, 0x15, 0xfe, 0x0a, 0x1d, 0xd8, 0xf4, + 0x7e, 0x0c, 0xc4, 0xee, 0x56, 0xc7, 0xe9, 0x35, 0x4f, 0x5c, 0x6f, 0xe9, 0x9a, 0x67, 0xdc, 0x34, + 0x89, 0x49, 0xcb, 0xe2, 0xad, 0x8e, 0x3b, 0xa8, 0xd8, 0xf0, 0x41, 0xb3, 0xbb, 0x0d, 0xfc, 0xfb, + 0x76, 0xf3, 0x7e, 0xbe, 0x87, 0xef, 0xa2, 0x37, 0x0b, 0x90, 0x9e, 0xfb, 0x20, 0x6e, 0x07, 0xc4, + 0x15, 0xb1, 0xc3, 0xf9, 0x43, 0xaa, 0xe2, 0xee, 0x23, 0xb4, 0xfd, 0x40, 0x66, 0x13, 0x85, 0xbf, + 0x46, 0xbb, 0x46, 0x8e, 0x72, 0x1b, 0x9d, 0x46, 0xaf, 0x79, 0xf2, 0x91, 0x57, 0x57, 0x7d, 0x6f, + 0xc5, 0x17, 0x52, 0xc4, 0x75, 0xff, 0x71, 0xd0, 0xde, 0x19, 0x38, 0x22, 0x46, 0xf2, 0xff, 0xec, + 0xfa, 0x0e, 0xb5, 0x12, 0xaa, 0x99, 0xd2, 0x85, 0x03, 0x9b, 0xe0, 0xc0, 0x8d, 0x33, 0xee, 0x9b, + 0x68, 0xeb, 0xc7, 0x29, 0xb2, 0x6b, 0x7f, 0x94, 0xdf, 0x04, 0xec, 0x6e, 0x9e, 0x7c, 0x58, 0x4f, + 0x06, 0x17, 0x26, 0x4d, 0x13, 0x64, 0x6e, 0xff, 0x25, 0x3a, 0xd2, 0x7c, 0xca, 0x94, 0xa6, 0xd3, + 0x94, 0x45, 0x56, 0x96, 0xf2, 0x43, 0x79, 0x29, 0x34, 0xd4, 0x67, 0x8b, 0xdc, 0xae, 0x00, 0x4c, + 0x66, 0x75, 0x96, 0x1f, 0x77, 0x7f, 0x6b, 0x20, 0xfc, 0x80, 0x0b, 0x9a, 0xf0, 0x17, 0x2c, 0xba, + 0xd1, 0xfd, 0x9f, 0xa2, 0xb7, 0x47, 0x45, 0x80, 0x6f, 0x41, 0x62, 0x24, 0xad, 0x0d, 0x77, 0xea, + 0x95, 0x97, 0xec, 0x04, 0x8f, 0xd6, 0x33, 0x7e, 0x81, 0x10, 0x34, 0x84, 0x21, 0x33, 0x36, 0x1c, + 0x97, 0x64, 0x65, 0x7f, 0xcf, 0x06, 0x1e, 0xf4, 0x08, 0xd9, 0x83, 0x2d, 0x08, 0xfd, 0x1e, 0x1d, + 0x64, 0xf4, 0xb9, 0xbf, 0x9c, 0x14, 0xdb, 0x94, 0xcb, 0x92, 0xac, 0x4c, 0x55, 0xce, 0x41, 0xe8, + 0xf3, 0xb3, 0x72, 0x8f, 0xb4, 0xb2, 0xea, 0x12, 0x3f, 0x45, 0x38, 0xd0, 0xa1, 0xaf, 0x2e, 0x83, + 0x29, 0x57, 0x8a, 0x4b, 0x91, 0x0f, 0x2a, 0x34, 0x6a, 0x95, 0x73, 0x75, 0xdc, 0x67, 0x03, 0xef, + 0xa2, 0xc4, 0x3f, 0x66, 0x0b, 0x72, 0x18, 0xe8, 0x70, 0x65, 0x07, 0x7f, 0x8b, 0xb6, 0xe1, 0x21, + 0x81, 0x5e, 0x6e, 0x9e, 0x0c, 0xea, 0x9d, 0xfa, 0x21, 0x87, 0xad, 0x57, 0x85, 0x98, 0xf8, 0xee, + 0xbf, 0x0e, 0x3a, 0x04, 0x08, 0x38, 0x71, 0xc1, 0x68, 0xc2, 0x22, 0x4c, 0x50, 0x6b, 0x46, 0x13, + 0x1e, 0x51, 0x2d, 0x33, 0x5f, 0x31, 0xed, 0x3a, 0x30, 0x08, 0x9f, 0xd6, 0x7b, 0xf0, 0xac, 0x80, + 0xff, 0xc8, 0x75, 0x7c, 0x9a, 0xa8, 0x5c, 0xf5, 0x7e, 0xc9, 0x71, 0xc1, 0x34, 0xbe, 0x8f, 0x0e, + 0x21, 0xa3, 0x5f, 0xa9, 0x8c, 0x29, 0xf3, 0x7b, 0xd5, 0x79, 0x37, 0xaf, 0xa4, 0x51, 0xfd, 0x24, + 0x55, 0xe4, 0x20, 0x2d, 0xc5, 0x41, 0x7d, 0x1e, 0xa1, 0x5b, 0x55, 0x9a, 0x19, 0x4d, 0x40, 0x60, + 0xe3, 0xf5, 0x4c, 0x87, 0x4b, 0xa6, 0x67, 0x34, 0xb9, 0x60, 0xba, 0xfb, 0xf7, 0x26, 0xba, 0x5d, + 0x63, 0x0f, 0xfe, 0x06, 0xbd, 0x65, 0xf2, 0xe8, 0xb9, 0xcf, 0x85, 0x1f, 0x24, 0x32, 0x9c, 0xd8, + 0x56, 0x38, 0x5a, 0x7f, 0x9f, 0x86, 0x73, 0xe0, 0xb1, 0x6a, 0x87, 0xf3, 0x73, 0x71, 0x9a, 0x07, + 0xe0, 0xc7, 0xe8, 0x1d, 0xc3, 0x62, 0xe6, 0x28, 0x67, 0x5a, 0xbe, 0x54, 0xaf, 0xbc, 0x74, 0x55, + 0xbd, 0x04, 0x43, 0x98, 0x99, 0xae, 0x73, 0xfb, 0x92, 0xfd, 0x84, 0x70, 0xf5, 0xea, 0x0a, 0x6a, + 0x65, 0x1b, 0xe0, 0xe3, 0xd7, 0x34, 0x40, 0xa5, 0xba, 0x55, 0x23, 0x6c, 0xbd, 0x7f, 0x29, 0x64, + 0x5a, 0xe6, 0xbc, 0xd5, 0xb4, 0x66, 0x91, 0xbb, 0x0b, 0x75, 0xbf, 0x57, 0xdf, 0xa7, 0xc3, 0x8c, + 0x0a, 0x45, 0x43, 0xcd, 0xa5, 0xe9, 0xaa, 0x5b, 0x15, 0xee, 0x82, 0xe5, 0xf4, 0xc9, 0xef, 0x57, + 0x6d, 0xe7, 0xe5, 0x55, 0xdb, 0xf9, 0xf3, 0xaa, 0xed, 0xfc, 0x7a, 0xdd, 0xde, 0x78, 0x79, 0xdd, + 0xde, 0xf8, 0xe3, 0xba, 0xbd, 0xf1, 0xf3, 0xe7, 0x63, 0xae, 0xe3, 0xcb, 0xc0, 0x0b, 0xe5, 0xb4, + 0x6f, 0x73, 0xc0, 0x2b, 0x50, 0x2c, 0xfa, 0xf3, 0x57, 0xbe, 0xcf, 0x60, 0x77, 0xb0, 0x03, 0x5f, + 0xa6, 0xcf, 0xfe, 0x0b, 0x00, 0x00, 0xff, 0xff, 0x4c, 0xe5, 0x71, 0xc2, 0xc5, 0x07, 0x00, 0x00, } func (m *IndexedHeader) Marshal() (dAtA []byte, err error) { @@ -635,6 +737,96 @@ func (m *ChainInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *FinalizedChainInfo) 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 *FinalizedChainInfo) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *FinalizedChainInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Proof != nil { + { + size, err := m.Proof.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintZoneconcierge(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x32 + } + if m.BtcSubmissionKey != nil { + { + size, err := m.BtcSubmissionKey.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintZoneconcierge(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2a + } + if m.RawCheckpoint != nil { + { + size, err := m.RawCheckpoint.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintZoneconcierge(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + } + if m.EpochInfo != nil { + { + size, err := m.EpochInfo.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintZoneconcierge(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + if m.FinalizedChainInfo != nil { + { + size, err := m.FinalizedChainInfo.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintZoneconcierge(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + if len(m.ChainId) > 0 { + i -= len(m.ChainId) + copy(dAtA[i:], m.ChainId) + i = encodeVarintZoneconcierge(dAtA, i, uint64(len(m.ChainId))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func (m *ProofEpochSealed) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -850,6 +1042,39 @@ func (m *ChainInfo) Size() (n int) { return n } +func (m *FinalizedChainInfo) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.ChainId) + if l > 0 { + n += 1 + l + sovZoneconcierge(uint64(l)) + } + if m.FinalizedChainInfo != nil { + l = m.FinalizedChainInfo.Size() + n += 1 + l + sovZoneconcierge(uint64(l)) + } + if m.EpochInfo != nil { + l = m.EpochInfo.Size() + n += 1 + l + sovZoneconcierge(uint64(l)) + } + if m.RawCheckpoint != nil { + l = m.RawCheckpoint.Size() + n += 1 + l + sovZoneconcierge(uint64(l)) + } + if m.BtcSubmissionKey != nil { + l = m.BtcSubmissionKey.Size() + n += 1 + l + sovZoneconcierge(uint64(l)) + } + if m.Proof != nil { + l = m.Proof.Size() + n += 1 + l + sovZoneconcierge(uint64(l)) + } + return n +} + func (m *ProofEpochSealed) Size() (n int) { if m == nil { return 0 @@ -1387,6 +1612,268 @@ func (m *ChainInfo) Unmarshal(dAtA []byte) error { } return nil } +func (m *FinalizedChainInfo) 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 ErrIntOverflowZoneconcierge + } + 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: FinalizedChainInfo: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: FinalizedChainInfo: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ChainId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowZoneconcierge + } + 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 ErrInvalidLengthZoneconcierge + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthZoneconcierge + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ChainId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field FinalizedChainInfo", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowZoneconcierge + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthZoneconcierge + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthZoneconcierge + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.FinalizedChainInfo == nil { + m.FinalizedChainInfo = &ChainInfo{} + } + if err := m.FinalizedChainInfo.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field EpochInfo", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowZoneconcierge + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthZoneconcierge + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthZoneconcierge + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.EpochInfo == nil { + m.EpochInfo = &types1.Epoch{} + } + if err := m.EpochInfo.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RawCheckpoint", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowZoneconcierge + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthZoneconcierge + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthZoneconcierge + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.RawCheckpoint == nil { + m.RawCheckpoint = &types2.RawCheckpoint{} + } + if err := m.RawCheckpoint.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field BtcSubmissionKey", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowZoneconcierge + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthZoneconcierge + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthZoneconcierge + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.BtcSubmissionKey == nil { + m.BtcSubmissionKey = &types3.SubmissionKey{} + } + if err := m.BtcSubmissionKey.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Proof", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowZoneconcierge + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthZoneconcierge + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthZoneconcierge + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Proof == nil { + m.Proof = &ProofFinalizedChainInfo{} + } + if err := m.Proof.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipZoneconcierge(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthZoneconcierge + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *ProofEpochSealed) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -1445,7 +1932,7 @@ func (m *ProofEpochSealed) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.ValidatorSet = append(m.ValidatorSet, &types1.ValidatorWithBlsKey{}) + m.ValidatorSet = append(m.ValidatorSet, &types2.ValidatorWithBlsKey{}) if err := m.ValidatorSet[len(m.ValidatorSet)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } @@ -1709,7 +2196,7 @@ func (m *ProofFinalizedChainInfo) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.ProofEpochSubmitted = append(m.ProofEpochSubmitted, &types2.TransactionInfo{}) + m.ProofEpochSubmitted = append(m.ProofEpochSubmitted, &types3.TransactionInfo{}) if err := m.ProofEpochSubmitted[len(m.ProofEpochSubmitted)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } From 58ba7e5db9dfc1606d0a27a46317fa0574f28d55 Mon Sep 17 00:00:00 2001 From: Gurjot Singh <111540954+gusin13@users.noreply.github.com> Date: Wed, 3 May 2023 22:35:54 +0530 Subject: [PATCH 54/59] feat: Add support for multiple chain ids in EpochChainsInfo API (#369) * epoch chains info * update proto * update logic * fix tests * epoch chains tests * add comments * swag doc * add cli query and update doc strings * e2e test * fix tests * no type cast req * fix e2e tests * fix tests * simplify assertions * wrap error * swag doc * fix int literal * fix strings * fix args * fix tests * add more checks in grpc query * fix checks * add more tests * rename vars * re-order tests * rename vars --- client/docs/swagger-ui/swagger.yaml | 2145 +++++++++--------- proto/babylon/zoneconcierge/v1/query.proto | 24 +- test/e2e/configurer/chain/queries.go | 32 +- test/e2e/e2e_test.go | 29 +- x/zoneconcierge/client/cli/query.go | 33 +- x/zoneconcierge/keeper/chain_info_indexer.go | 11 +- x/zoneconcierge/keeper/grpc_query.go | 56 +- x/zoneconcierge/keeper/grpc_query_test.go | 128 +- x/zoneconcierge/keeper/hooks.go | 30 +- x/zoneconcierge/types/query.pb.go | 352 +-- x/zoneconcierge/types/query.pb.gw.go | 92 +- 11 files changed, 1537 insertions(+), 1395 deletions(-) diff --git a/client/docs/swagger-ui/swagger.yaml b/client/docs/swagger-ui/swagger.yaml index ef947e9a4..0dd155c35 100644 --- a/client/docs/swagger-ui/swagger.yaml +++ b/client/docs/swagger-ui/swagger.yaml @@ -23,17 +23,19 @@ paths: type: string format: uint64 title: epoch number of this checkpoint - earliest_btc_block_number: + best_submission_btc_block_height: type: string format: uint64 - title: >- - height of earliest BTC block that includes this - checkpoint - earliest_btc_block_hash: + title: btc height of the best submission of the epoch + best_submission_btc_block_hash: type: string format: byte - title: hash of earliest BTC block that includes this checkpoint - earliest_btc_block_txs: + title: >- + hash of the btc block which determines checkpoint btc + block height i.e. + + youngest block of best submission + best_submission_transactions: type: array items: type: object @@ -96,8 +98,8 @@ paths: - the Merkle proof that this tx is on the above position - title: the BTC checkpoint transactions on the above block - vigilante_address_list: + title: the BTC checkpoint transactions of the best submission + best_submission_vigilante_address_list: type: array items: type: object @@ -126,12 +128,13 @@ paths: submitter and reporter of a given checkpoint - title: list of vigilantes' addresses - description: >- - BTCCheckpointInfo contains all checkpoint related data - expected in a query + title: list of vigilantes' addresses of the best submission + title: >- + BTCCheckpointInfo contains all data about best submission of + checkpoint for - response. + given epoch. Best submission is the submission which is + deeper in btc ledger pagination: title: pagination defines the pagination in the response type: object @@ -338,15 +341,19 @@ paths: type: string format: uint64 title: epoch number of this checkpoint - earliest_btc_block_number: + best_submission_btc_block_height: type: string format: uint64 - title: height of earliest BTC block that includes this checkpoint - earliest_btc_block_hash: + title: btc height of the best submission of the epoch + best_submission_btc_block_hash: type: string format: byte - title: hash of earliest BTC block that includes this checkpoint - earliest_btc_block_txs: + title: >- + hash of the btc block which determines checkpoint btc + block height i.e. + + youngest block of best submission + best_submission_transactions: type: array items: type: object @@ -408,8 +415,8 @@ paths: - the full tx content - the Merkle proof that this tx is on the above position - title: the BTC checkpoint transactions on the above block - vigilante_address_list: + title: the BTC checkpoint transactions of the best submission + best_submission_vigilante_address_list: type: array items: type: object @@ -438,12 +445,13 @@ paths: submitter and reporter of a given checkpoint - title: list of vigilantes' addresses - description: >- - BTCCheckpointInfo contains all checkpoint related data - expected in a query + title: list of vigilantes' addresses of the best submission + title: >- + BTCCheckpointInfo contains all data about best submission of + checkpoint for - response. + given epoch. Best submission is the submission which is deeper + in btc ledger title: |- QueryBtcCheckpointInfoResponse is response type for the Query/BtcCheckpointInfo RPC method @@ -5461,319 +5469,291 @@ paths: type: boolean tags: - Query - /babylon/zoneconcierge/v1/chain_info/{chain_id}/epochs/{epoch_num}: + /babylon/zoneconcierge/v1/chain_info/{chain_id}/header/{height}: get: - summary: |- - EpochChainInfo queries the latest info of a chain in a given epoch of - Babylon's view - operationId: EpochChainInfo + summary: Header queries the CZ header and fork headers at a given height. + operationId: Header responses: '200': description: A successful response. schema: type: object properties: - chain_info: - title: chain_info is the info of the CZ + header: type: object properties: chain_id: type: string - title: chain_id is the ID of the chain - latest_header: - title: latest_header is the latest header in CZ's canonical chain + title: chain_id is the unique ID of the chain + hash: + type: string + format: byte + title: hash is the hash of this header + height: + type: string + format: uint64 + title: >- + height is the height of this header on CZ ledger + + (hash, height) jointly provides the position of the header + on CZ ledger + babylon_header: + title: >- + babylon_header is the header of the babylon block that + includes this CZ + + header type: object properties: + version: + title: basic block info + type: object + properties: + block: + type: string + format: uint64 + app: + type: string + format: uint64 + description: >- + Consensus captures the consensus rules for processing + a block in the blockchain, + + including all blockchain data structures and the rules + of the application's + + state transition machine. chain_id: type: string - title: chain_id is the unique ID of the chain - hash: - type: string - format: byte - title: hash is the hash of this header height: type: string - format: uint64 - title: >- - height is the height of this header on CZ ledger - - (hash, height) jointly provides the position of the - header on CZ ledger - babylon_header: - title: >- - babylon_header is the header of the babylon block that - includes this CZ - - header + format: int64 + time: + type: string + format: date-time + last_block_id: + title: prev block info type: object properties: - version: - title: basic block info - type: object - properties: - block: - type: string - format: uint64 - app: - type: string - format: uint64 - description: >- - Consensus captures the consensus rules for - processing a block in the blockchain, - - including all blockchain data structures and the - rules of the application's - - state transition machine. - chain_id: - type: string - height: - type: string - format: int64 - time: + hash: type: string - format: date-time - last_block_id: - title: prev block info + format: byte + part_set_header: type: object properties: + total: + type: integer + format: int64 hash: type: string format: byte - part_set_header: - type: object - properties: - total: - type: integer - format: int64 - hash: - type: string - format: byte - title: PartsetHeader - last_commit_hash: - type: string - format: byte - title: hashes of block data - data_hash: - type: string - format: byte - validators_hash: - type: string - format: byte - title: hashes from the app output from the prev block - next_validators_hash: - type: string - format: byte - consensus_hash: - type: string - format: byte - app_hash: - type: string - format: byte - last_results_hash: - type: string - format: byte - evidence_hash: - type: string - format: byte - title: consensus info - proposer_address: - type: string - format: byte - description: Header defines the structure of a block header. - babylon_epoch: + title: PartsetHeader + last_commit_hash: type: string - format: uint64 - title: >- - epoch is the epoch number of this header on Babylon - ledger - babylon_tx_hash: + format: byte + title: hashes of block data + data_hash: type: string format: byte - title: >- - babylon_tx_hash is the hash of the tx that includes - this header + validators_hash: + type: string + format: byte + title: hashes from the app output from the prev block + next_validators_hash: + type: string + format: byte + consensus_hash: + type: string + format: byte + app_hash: + type: string + format: byte + last_results_hash: + type: string + format: byte + evidence_hash: + type: string + format: byte + title: consensus info + proposer_address: + type: string + format: byte + description: Header defines the structure of a block header. + babylon_epoch: + type: string + format: uint64 + title: epoch is the epoch number of this header on Babylon ledger + babylon_tx_hash: + type: string + format: byte + title: >- + babylon_tx_hash is the hash of the tx that includes this + header - (babylon_block_height, babylon_tx_hash) jointly - provides the position of + (babylon_block_height, babylon_tx_hash) jointly provides + the position of - the header on Babylon ledger - latest_forks: - title: >- - latest_forks is the latest forks, formed as a series of - IndexedHeader (from + the header on Babylon ledger + title: IndexedHeader is the metadata of a CZ header + fork_headers: + type: object + properties: + headers: + type: array + items: + type: object + properties: + chain_id: + type: string + title: chain_id is the unique ID of the chain + hash: + type: string + format: byte + title: hash is the hash of this header + height: + type: string + format: uint64 + title: >- + height is the height of this header on CZ ledger - low to high) - type: object - properties: - headers: - type: array - items: + (hash, height) jointly provides the position of the + header on CZ ledger + babylon_header: + title: >- + babylon_header is the header of the babylon block + that includes this CZ + + header type: object properties: - chain_id: - type: string - title: chain_id is the unique ID of the chain - hash: - type: string - format: byte - title: hash is the hash of this header - height: - type: string - format: uint64 - title: >- - height is the height of this header on CZ ledger - - (hash, height) jointly provides the position of - the header on CZ ledger - babylon_header: - title: >- - babylon_header is the header of the babylon - block that includes this CZ - - header + version: + title: basic block info type: object properties: - version: - title: basic block info - type: object - properties: - block: - type: string - format: uint64 - app: - type: string - format: uint64 - description: >- - Consensus captures the consensus rules for - processing a block in the blockchain, - - including all blockchain data structures and - the rules of the application's - - state transition machine. - chain_id: + block: type: string - height: + format: uint64 + app: type: string - format: int64 - time: + format: uint64 + description: >- + Consensus captures the consensus rules for + processing a block in the blockchain, + + including all blockchain data structures and the + rules of the application's + + state transition machine. + chain_id: + type: string + height: + type: string + format: int64 + time: + type: string + format: date-time + last_block_id: + title: prev block info + type: object + properties: + hash: type: string - format: date-time - last_block_id: - title: prev block info + format: byte + part_set_header: type: object properties: + total: + type: integer + format: int64 hash: type: string format: byte - part_set_header: - type: object - properties: - total: - type: integer - format: int64 - hash: - type: string - format: byte - title: PartsetHeader - last_commit_hash: - type: string - format: byte - title: hashes of block data - data_hash: - type: string - format: byte - validators_hash: - type: string - format: byte - title: >- - hashes from the app output from the prev - block - next_validators_hash: - type: string - format: byte - consensus_hash: - type: string - format: byte - app_hash: - type: string - format: byte - last_results_hash: - type: string - format: byte - evidence_hash: - type: string - format: byte - title: consensus info - proposer_address: - type: string - format: byte - description: Header defines the structure of a block header. - babylon_epoch: + title: PartsetHeader + last_commit_hash: type: string - format: uint64 - title: >- - epoch is the epoch number of this header on - Babylon ledger - babylon_tx_hash: + format: byte + title: hashes of block data + data_hash: type: string format: byte - title: >- - babylon_tx_hash is the hash of the tx that - includes this header - - (babylon_block_height, babylon_tx_hash) jointly - provides the position of + validators_hash: + type: string + format: byte + title: hashes from the app output from the prev block + next_validators_hash: + type: string + format: byte + consensus_hash: + type: string + format: byte + app_hash: + type: string + format: byte + last_results_hash: + type: string + format: byte + evidence_hash: + type: string + format: byte + title: consensus info + proposer_address: + type: string + format: byte + description: Header defines the structure of a block header. + babylon_epoch: + type: string + format: uint64 + title: >- + epoch is the epoch number of this header on Babylon + ledger + babylon_tx_hash: + type: string + format: byte + title: >- + babylon_tx_hash is the hash of the tx that includes + this header - the header on Babylon ledger - title: IndexedHeader is the metadata of a CZ header - title: >- - blocks is the list of non-canonical indexed headers at - the same height - description: >- - Forks is a list of non-canonical `IndexedHeader`s at the - same height. + (babylon_block_height, babylon_tx_hash) jointly + provides the position of - For example, assuming the following blockchain + the header on Babylon ledger + title: IndexedHeader is the metadata of a CZ header + title: >- + blocks is the list of non-canonical indexed headers at the + same height + description: >- + Forks is a list of non-canonical `IndexedHeader`s at the same + height. - ``` + For example, assuming the following blockchain - A <- B <- C <- D <- E - \ -- D1 - \ -- D2 - ``` + ``` - Then the fork will be {[D1, D2]} where each item is in - struct `IndexedBlock`. + A <- B <- C <- D <- E + \ -- D1 + \ -- D2 + ``` + Then the fork will be {[D1, D2]} where each item is in struct + `IndexedBlock`. - Note that each `IndexedHeader` in the fork should have a - valid quorum - certificate. Such forks exist since Babylon considers CZs - might have + Note that each `IndexedHeader` in the fork should have a valid + quorum - dishonest majority. Also note that the IBC-Go - implementation will only + certificate. Such forks exist since Babylon considers CZs + might have - consider the first header in a fork valid, since the - subsequent headers + dishonest majority. Also note that the IBC-Go implementation + will only - cannot be verified without knowing the validator set in - the previous header. - timestamped_headers_count: - type: string - format: uint64 - title: >- - timestamped_headers_count is the number of timestamped - headers in CZ's + consider the first header in a fork valid, since the + subsequent headers - canonical chain + cannot be verified without knowing the validator set in the + previous header. description: >- - QueryEpochChainInfoResponse is response type for the - Query/EpochChainInfo RPC - + QueryHeaderResponse is response type for the Query/Header RPC method. default: description: An unexpected error response. @@ -5971,299 +5951,62 @@ paths: in: path required: true type: string - - name: epoch_num + - name: height in: path required: true type: string format: uint64 tags: - Query - /babylon/zoneconcierge/v1/chain_info/{chain_id}/header/{height}: + /babylon/zoneconcierge/v1/chains: get: - summary: Header queries the CZ header and fork headers at a given height. - operationId: Header + summary: ChainList queries the list of chains that checkpoint to Babylon + operationId: ChainList responses: '200': description: A successful response. schema: type: object properties: - header: + chain_ids: + type: array + items: + type: string + title: >- + chain_ids are IDs of the chains in ascending alphabetical + order + pagination: + title: pagination defines the pagination in the response type: object properties: - chain_id: - type: string - title: chain_id is the unique ID of the chain - hash: + next_key: type: string format: byte - title: hash is the hash of this header - height: - type: string - format: uint64 - title: >- - height is the height of this header on CZ ledger - - (hash, height) jointly provides the position of the header - on CZ ledger - babylon_header: - title: >- - babylon_header is the header of the babylon block that - includes this CZ - - header - type: object - properties: - version: - title: basic block info - type: object - properties: - block: - type: string - format: uint64 - app: - type: string - format: uint64 - description: >- - Consensus captures the consensus rules for processing - a block in the blockchain, - - including all blockchain data structures and the rules - of the application's - - state transition machine. - chain_id: - type: string - height: - type: string - format: int64 - time: - type: string - format: date-time - last_block_id: - title: prev block info - type: object - properties: - hash: - type: string - format: byte - part_set_header: - type: object - properties: - total: - type: integer - format: int64 - hash: - type: string - format: byte - title: PartsetHeader - last_commit_hash: - type: string - format: byte - title: hashes of block data - data_hash: - type: string - format: byte - validators_hash: - type: string - format: byte - title: hashes from the app output from the prev block - next_validators_hash: - type: string - format: byte - consensus_hash: - type: string - format: byte - app_hash: - type: string - format: byte - last_results_hash: - type: string - format: byte - evidence_hash: - type: string - format: byte - title: consensus info - proposer_address: - type: string - format: byte - description: Header defines the structure of a block header. - babylon_epoch: + description: |- + next_key is the key to be passed to PageRequest.key to + query the next page most efficiently. It will be empty if + there are no more results. + total: type: string format: uint64 - title: epoch is the epoch number of this header on Babylon ledger - babylon_tx_hash: - type: string - format: byte title: >- - babylon_tx_hash is the hash of the tx that includes this - header - - (babylon_block_height, babylon_tx_hash) jointly provides - the position of - - the header on Babylon ledger - title: IndexedHeader is the metadata of a CZ header - fork_headers: - type: object - properties: - headers: - type: array - items: - type: object - properties: - chain_id: - type: string - title: chain_id is the unique ID of the chain - hash: - type: string - format: byte - title: hash is the hash of this header - height: - type: string - format: uint64 - title: >- - height is the height of this header on CZ ledger - - (hash, height) jointly provides the position of the - header on CZ ledger - babylon_header: - title: >- - babylon_header is the header of the babylon block - that includes this CZ - - header - type: object - properties: - version: - title: basic block info - type: object - properties: - block: - type: string - format: uint64 - app: - type: string - format: uint64 - description: >- - Consensus captures the consensus rules for - processing a block in the blockchain, - - including all blockchain data structures and the - rules of the application's - - state transition machine. - chain_id: - type: string - height: - type: string - format: int64 - time: - type: string - format: date-time - last_block_id: - title: prev block info - type: object - properties: - hash: - type: string - format: byte - part_set_header: - type: object - properties: - total: - type: integer - format: int64 - hash: - type: string - format: byte - title: PartsetHeader - last_commit_hash: - type: string - format: byte - title: hashes of block data - data_hash: - type: string - format: byte - validators_hash: - type: string - format: byte - title: hashes from the app output from the prev block - next_validators_hash: - type: string - format: byte - consensus_hash: - type: string - format: byte - app_hash: - type: string - format: byte - last_results_hash: - type: string - format: byte - evidence_hash: - type: string - format: byte - title: consensus info - proposer_address: - type: string - format: byte - description: Header defines the structure of a block header. - babylon_epoch: - type: string - format: uint64 - title: >- - epoch is the epoch number of this header on Babylon - ledger - babylon_tx_hash: - type: string - format: byte - title: >- - babylon_tx_hash is the hash of the tx that includes - this header - - (babylon_block_height, babylon_tx_hash) jointly - provides the position of + total is total number of results available if + PageRequest.count_total - the header on Babylon ledger - title: IndexedHeader is the metadata of a CZ header - title: >- - blocks is the list of non-canonical indexed headers at the - same height + was set, its value is undefined otherwise description: >- - Forks is a list of non-canonical `IndexedHeader`s at the same - height. - - For example, assuming the following blockchain - - ``` - - A <- B <- C <- D <- E - \ -- D1 - \ -- D2 - ``` - - Then the fork will be {[D1, D2]} where each item is in struct - `IndexedBlock`. - - - Note that each `IndexedHeader` in the fork should have a valid - quorum - - certificate. Such forks exist since Babylon considers CZs - might have - - dishonest majority. Also note that the IBC-Go implementation - will only + PageResponse is to be embedded in gRPC response messages where + the - consider the first header in a fork valid, since the - subsequent headers + corresponding request message has used PageRequest. - cannot be verified without knowing the validator set in the - previous header. - description: >- - QueryHeaderResponse is response type for the Query/Header RPC - method. + message SomeResponse { + repeated Bar results = 1; + PageResponse page = 2; + } + title: >- + QueryChainListResponse is response type for the Query/ChainList + RPC method default: description: An unexpected error response. schema: @@ -6420,102 +6163,417 @@ paths: JSON - The JSON representation of an `Any` value uses the regular + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with + an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom + JSON + + representation, that representation will be embedded adding + a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + parameters: + - name: pagination.key + description: |- + key is a value returned in PageResponse.next_key to begin + querying the next page most efficiently. Only one of offset or key + should be set. + in: query + required: false + type: string + format: byte + - name: pagination.offset + description: >- + offset is a numeric offset that can be used when key is unavailable. + + It is less efficient than using key. Only one of offset or key + should + + be set. + in: query + required: false + type: string + format: uint64 + - name: pagination.limit + description: >- + limit is the total number of results to be returned in the result + page. + + If left empty it will default to a value to be set by each app. + in: query + required: false + type: string + format: uint64 + - name: pagination.count_total + description: >- + count_total is set to true to indicate that the result set should + include + + a count of the total number of items available for pagination in + UIs. + + count_total is only respected when offset is used. It is ignored + when key + + is set. + in: query + required: false + type: boolean + - name: pagination.reverse + description: >- + reverse is set to true if results are to be returned in the + descending order. + + + Since: cosmos-sdk 0.43 + in: query + required: false + type: boolean + tags: + - Query + /babylon/zoneconcierge/v1/chains_info: + get: + summary: >- + ChainsInfo queries the latest info for a given list of chains in + Babylon's view + operationId: ChainsInfo + responses: + '200': + description: A successful response. + schema: + type: object + properties: + chains_info: + type: array + items: + type: object + properties: + chain_id: + type: string + title: chain_id is the ID of the chain + latest_header: + type: object + properties: + chain_id: + type: string + title: chain_id is the unique ID of the chain + hash: + type: string + format: byte + title: hash is the hash of this header + height: + type: string + format: uint64 + title: >- + height is the height of this header on CZ ledger + + (hash, height) jointly provides the position of the + header on CZ ledger + babylon_header: + title: >- + babylon_header is the header of the babylon block + that includes this CZ + + header + type: object + properties: + version: + title: basic block info + type: object + properties: + block: + type: string + format: uint64 + app: + type: string + format: uint64 + description: >- + Consensus captures the consensus rules for + processing a block in the blockchain, + + including all blockchain data structures and the + rules of the application's + + state transition machine. + chain_id: + type: string + height: + type: string + format: int64 + time: + type: string + format: date-time + last_block_id: + title: prev block info + type: object + properties: + hash: + type: string + format: byte + part_set_header: + type: object + properties: + total: + type: integer + format: int64 + hash: + type: string + format: byte + title: PartsetHeader + last_commit_hash: + type: string + format: byte + title: hashes of block data + data_hash: + type: string + format: byte + validators_hash: + type: string + format: byte + title: hashes from the app output from the prev block + next_validators_hash: + type: string + format: byte + consensus_hash: + type: string + format: byte + app_hash: + type: string + format: byte + last_results_hash: + type: string + format: byte + evidence_hash: + type: string + format: byte + title: consensus info + proposer_address: + type: string + format: byte + description: Header defines the structure of a block header. + babylon_epoch: + type: string + format: uint64 + title: >- + epoch is the epoch number of this header on Babylon + ledger + babylon_tx_hash: + type: string + format: byte + title: >- + babylon_tx_hash is the hash of the tx that includes + this header + + (babylon_block_height, babylon_tx_hash) jointly + provides the position of + + the header on Babylon ledger + title: IndexedHeader is the metadata of a CZ header + latest_forks: + type: object + properties: + headers: + type: array + items: + type: object + properties: + chain_id: + type: string + title: chain_id is the unique ID of the chain + hash: + type: string + format: byte + title: hash is the hash of this header + height: + type: string + format: uint64 + title: >- + height is the height of this header on CZ + ledger - representation of the deserialized, embedded message, with - an + (hash, height) jointly provides the position + of the header on CZ ledger + babylon_header: + title: >- + babylon_header is the header of the babylon + block that includes this CZ - additional field `@type` which contains the type URL. - Example: + header + type: object + properties: + version: + title: basic block info + type: object + properties: + block: + type: string + format: uint64 + app: + type: string + format: uint64 + description: >- + Consensus captures the consensus rules for + processing a block in the blockchain, - package google.profile; - message Person { - string first_name = 1; - string last_name = 2; - } + including all blockchain data structures + and the rules of the application's - { - "@type": "type.googleapis.com/google.profile.Person", - "firstName": , - "lastName": - } + state transition machine. + chain_id: + type: string + height: + type: string + format: int64 + time: + type: string + format: date-time + last_block_id: + title: prev block info + type: object + properties: + hash: + type: string + format: byte + part_set_header: + type: object + properties: + total: + type: integer + format: int64 + hash: + type: string + format: byte + title: PartsetHeader + last_commit_hash: + type: string + format: byte + title: hashes of block data + data_hash: + type: string + format: byte + validators_hash: + type: string + format: byte + title: >- + hashes from the app output from the prev + block + next_validators_hash: + type: string + format: byte + consensus_hash: + type: string + format: byte + app_hash: + type: string + format: byte + last_results_hash: + type: string + format: byte + evidence_hash: + type: string + format: byte + title: consensus info + proposer_address: + type: string + format: byte + description: >- + Header defines the structure of a block + header. + babylon_epoch: + type: string + format: uint64 + title: >- + epoch is the epoch number of this header on + Babylon ledger + babylon_tx_hash: + type: string + format: byte + title: >- + babylon_tx_hash is the hash of the tx that + includes this header - If the embedded message type is well-known and has a custom - JSON + (babylon_block_height, babylon_tx_hash) + jointly provides the position of - representation, that representation will be embedded adding - a field + the header on Babylon ledger + title: IndexedHeader is the metadata of a CZ header + title: >- + blocks is the list of non-canonical indexed headers + at the same height + description: >- + Forks is a list of non-canonical `IndexedHeader`s at the + same height. - `value` which holds the custom JSON in addition to the - `@type` + For example, assuming the following blockchain - field. Example (for message [google.protobuf.Duration][]): + ``` - { - "@type": "type.googleapis.com/google.protobuf.Duration", - "value": "1.212s" - } - parameters: - - name: chain_id - in: path - required: true - type: string - - name: height - in: path - required: true - type: string - format: uint64 - tags: - - Query - /babylon/zoneconcierge/v1/chains: - get: - summary: ChainList queries the list of chains that checkpoint to Babylon - operationId: ChainList - responses: - '200': - description: A successful response. - schema: - type: object - properties: - chain_ids: - type: array - items: - type: string - title: >- - chain_ids are IDs of the chains in ascending alphabetical - order - pagination: - title: pagination defines the pagination in the response - type: object - properties: - next_key: - type: string - format: byte - description: |- - next_key is the key to be passed to PageRequest.key to - query the next page most efficiently. It will be empty if - there are no more results. - total: - type: string - format: uint64 - title: >- - total is total number of results available if - PageRequest.count_total + A <- B <- C <- D <- E + \ -- D1 + \ -- D2 + ``` - was set, its value is undefined otherwise - description: >- - PageResponse is to be embedded in gRPC response messages where - the + Then the fork will be {[D1, D2]} where each item is in + struct `IndexedBlock`. - corresponding request message has used PageRequest. - message SomeResponse { - repeated Bar results = 1; - PageResponse page = 2; - } - title: >- - QueryChainListResponse is response type for the Query/ChainList - RPC method + Note that each `IndexedHeader` in the fork should have a + valid quorum + + certificate. Such forks exist since Babylon considers + CZs might have + + dishonest majority. Also note that the IBC-Go + implementation will only + + consider the first header in a fork valid, since the + subsequent headers + + cannot be verified without knowing the validator set in + the previous header. + title: >- + latest_forks is the latest forks, formed as a series of + IndexedHeader (from + + low to high) + timestamped_headers_count: + type: string + format: uint64 + title: >- + timestamped_headers_count is the number of timestamped + headers in CZ's + + canonical chain + title: ChainInfo is the information of a CZ + description: >- + QueryChainsInfoResponse is response type for the Query/ChainsInfo + RPC method. default: description: An unexpected error response. schema: @@ -6708,68 +6766,21 @@ paths: "value": "1.212s" } parameters: - - name: pagination.key - description: |- - key is a value returned in PageResponse.next_key to begin - querying the next page most efficiently. Only one of offset or key - should be set. - in: query - required: false - type: string - format: byte - - name: pagination.offset - description: >- - offset is a numeric offset that can be used when key is unavailable. - - It is less efficient than using key. Only one of offset or key - should - - be set. - in: query - required: false - type: string - format: uint64 - - name: pagination.limit - description: >- - limit is the total number of results to be returned in the result - page. - - If left empty it will default to a value to be set by each app. - in: query - required: false - type: string - format: uint64 - - name: pagination.count_total - description: >- - count_total is set to true to indicate that the result set should - include - - a count of the total number of items available for pagination in - UIs. - - count_total is only respected when offset is used. It is ignored - when key - - is set. - in: query - required: false - type: boolean - - name: pagination.reverse - description: >- - reverse is set to true if results are to be returned in the - descending order. - - - Since: cosmos-sdk 0.43 + - name: chain_ids in: query required: false - type: boolean + type: array + items: + type: string + collectionFormat: multi tags: - Query - /babylon/zoneconcierge/v1/chains_info: + /babylon/zoneconcierge/v1/epoch_chains_info: get: - summary: ChainInfo queries the latest info of a chain in Babylon's view - operationId: ChainsInfo + summary: |- + EpochChainsInfo queries the latest info for a list of chains + in a given epoch in Babylon's view + operationId: EpochChainsInfo responses: '200': description: A successful response. @@ -6785,9 +6796,6 @@ paths: type: string title: chain_id is the ID of the chain latest_header: - title: >- - latest_header is the latest header in CZ's canonical - chain type: object properties: chain_id: @@ -6904,12 +6912,8 @@ paths: provides the position of the header on Babylon ledger + title: IndexedHeader is the metadata of a CZ header latest_forks: - title: >- - latest_forks is the latest forks, formed as a series of - IndexedHeader (from - - low to high) type: object properties: headers: @@ -7071,6 +7075,11 @@ paths: cannot be verified without knowing the validator set in the previous header. + title: >- + latest_forks is the latest forks, formed as a series of + IndexedHeader (from + + low to high) timestamped_headers_count: type: string format: uint64 @@ -7080,9 +7089,12 @@ paths: canonical chain title: ChainInfo is the information of a CZ + title: chain_info is the info of the CZ description: >- - QueryChainsInfoResponse is response type for the Query/ChainsInfo - RPC method. + QueryEpochChainsInfoResponse is response type for the + Query/EpochChainsInfo RPC + + method. default: description: An unexpected error response. schema: @@ -7275,6 +7287,11 @@ paths: "value": "1.212s" } parameters: + - name: epoch_num + in: query + required: false + type: string + format: uint64 - name: chain_ids in: query required: false @@ -7305,7 +7322,6 @@ paths: type: string title: chain_id is the ID of the chain latest_header: - title: latest_header is the latest header in CZ's canonical chain type: object properties: chain_id: @@ -7422,12 +7438,8 @@ paths: provides the position of the header on Babylon ledger + title: IndexedHeader is the metadata of a CZ header latest_forks: - title: >- - latest_forks is the latest forks, formed as a series of - IndexedHeader (from - - low to high) type: object properties: headers: @@ -7586,6 +7598,11 @@ paths: cannot be verified without knowing the validator set in the previous header. + title: >- + latest_forks is the latest forks, formed as a series of + IndexedHeader (from + + low to high) timestamped_headers_count: type: string format: uint64 @@ -8314,9 +8331,6 @@ paths: type: string title: chain_id is the ID of the chain latest_header: - title: >- - latest_header is the latest header in CZ's canonical - chain type: object properties: chain_id: @@ -8435,12 +8449,8 @@ paths: provides the position of the header on Babylon ledger + title: IndexedHeader is the metadata of a CZ header latest_forks: - title: >- - latest_forks is the latest forks, formed as a series - of IndexedHeader (from - - low to high) type: object properties: headers: @@ -8603,6 +8613,11 @@ paths: cannot be verified without knowing the validator set in the previous header. + title: >- + latest_forks is the latest forks, formed as a series + of IndexedHeader (from + + low to high) timestamped_headers_count: type: string format: uint64 @@ -10072,15 +10087,19 @@ definitions: type: string format: uint64 title: epoch number of this checkpoint - earliest_btc_block_number: + best_submission_btc_block_height: type: string format: uint64 - title: height of earliest BTC block that includes this checkpoint - earliest_btc_block_hash: + title: btc height of the best submission of the epoch + best_submission_btc_block_hash: type: string format: byte - title: hash of earliest BTC block that includes this checkpoint - earliest_btc_block_txs: + title: >- + hash of the btc block which determines checkpoint btc block height + i.e. + + youngest block of best submission + best_submission_transactions: type: array items: type: object @@ -10142,8 +10161,8 @@ definitions: - the full tx content - the Merkle proof that this tx is on the above position - title: the BTC checkpoint transactions on the above block - vigilante_address_list: + title: the BTC checkpoint transactions of the best submission + best_submission_vigilante_address_list: type: array items: type: object @@ -10171,10 +10190,13 @@ definitions: reporter of a given checkpoint - title: list of vigilantes' addresses - description: |- - BTCCheckpointInfo contains all checkpoint related data expected in a query - response. + title: list of vigilantes' addresses of the best submission + title: >- + BTCCheckpointInfo contains all data about best submission of checkpoint + for + + given epoch. Best submission is the submission which is deeper in btc + ledger babylon.btccheckpoint.v1.CheckpointAddresses: type: object properties: @@ -10248,15 +10270,19 @@ definitions: type: string format: uint64 title: epoch number of this checkpoint - earliest_btc_block_number: + best_submission_btc_block_height: type: string format: uint64 - title: height of earliest BTC block that includes this checkpoint - earliest_btc_block_hash: + title: btc height of the best submission of the epoch + best_submission_btc_block_hash: type: string format: byte - title: hash of earliest BTC block that includes this checkpoint - earliest_btc_block_txs: + title: >- + hash of the btc block which determines checkpoint btc block height + i.e. + + youngest block of best submission + best_submission_transactions: type: array items: type: object @@ -10318,8 +10344,8 @@ definitions: - the full tx content - the Merkle proof that this tx is on the above position - title: the BTC checkpoint transactions on the above block - vigilante_address_list: + title: the BTC checkpoint transactions of the best submission + best_submission_vigilante_address_list: type: array items: type: object @@ -10348,12 +10374,13 @@ definitions: reporter of a given checkpoint - title: list of vigilantes' addresses - description: >- - BTCCheckpointInfo contains all checkpoint related data expected in a - query + title: list of vigilantes' addresses of the best submission + title: >- + BTCCheckpointInfo contains all data about best submission of + checkpoint for - response. + given epoch. Best submission is the submission which is deeper in btc + ledger title: |- QueryBtcCheckpointInfoResponse is response type for the Query/BtcCheckpointInfo RPC method @@ -10369,15 +10396,19 @@ definitions: type: string format: uint64 title: epoch number of this checkpoint - earliest_btc_block_number: + best_submission_btc_block_height: type: string format: uint64 - title: height of earliest BTC block that includes this checkpoint - earliest_btc_block_hash: + title: btc height of the best submission of the epoch + best_submission_btc_block_hash: type: string format: byte - title: hash of earliest BTC block that includes this checkpoint - earliest_btc_block_txs: + title: >- + hash of the btc block which determines checkpoint btc block + height i.e. + + youngest block of best submission + best_submission_transactions: type: array items: type: object @@ -10439,8 +10470,8 @@ definitions: - the full tx content - the Merkle proof that this tx is on the above position - title: the BTC checkpoint transactions on the above block - vigilante_address_list: + title: the BTC checkpoint transactions of the best submission + best_submission_vigilante_address_list: type: array items: type: object @@ -10469,12 +10500,13 @@ definitions: and reporter of a given checkpoint - title: list of vigilantes' addresses - description: >- - BTCCheckpointInfo contains all checkpoint related data expected in a - query + title: list of vigilantes' addresses of the best submission + title: >- + BTCCheckpointInfo contains all data about best submission of + checkpoint for - response. + given epoch. Best submission is the submission which is deeper in + btc ledger pagination: title: pagination defines the pagination in the response type: object @@ -14879,7 +14911,6 @@ definitions: type: string title: chain_id is the ID of the chain latest_header: - title: latest_header is the latest header in CZ's canonical chain type: object properties: chain_id: @@ -14993,12 +15024,8 @@ definitions: position of the header on Babylon ledger + title: IndexedHeader is the metadata of a CZ header latest_forks: - title: >- - latest_forks is the latest forks, formed as a series of IndexedHeader - (from - - low to high) type: object properties: headers: @@ -15149,6 +15176,11 @@ definitions: cannot be verified without knowing the validator set in the previous header. + title: >- + latest_forks is the latest forks, formed as a series of IndexedHeader + (from + + low to high) timestamped_headers_count: type: string format: uint64 @@ -15169,7 +15201,6 @@ definitions: type: string title: chain_id is the ID of the chain latest_header: - title: latest_header is the latest header in CZ's canonical chain type: object properties: chain_id: @@ -15284,12 +15315,8 @@ definitions: position of the header on Babylon ledger + title: IndexedHeader is the metadata of a CZ header latest_forks: - title: >- - latest_forks is the latest forks, formed as a series of - IndexedHeader (from - - low to high) type: object properties: headers: @@ -15446,6 +15473,11 @@ definitions: cannot be verified without knowing the validator set in the previous header. + title: >- + latest_forks is the latest forks, formed as a series of + IndexedHeader (from + + low to high) timestamped_headers_count: type: string format: uint64 @@ -16542,7 +16574,6 @@ definitions: type: string title: chain_id is the ID of the chain latest_header: - title: latest_header is the latest header in CZ's canonical chain type: object properties: chain_id: @@ -16657,12 +16688,8 @@ definitions: position of the header on Babylon ledger + title: IndexedHeader is the metadata of a CZ header latest_forks: - title: >- - latest_forks is the latest forks, formed as a series of - IndexedHeader (from - - low to high) type: object properties: headers: @@ -16819,317 +16846,325 @@ definitions: cannot be verified without knowing the validator set in the previous header. - timestamped_headers_count: - type: string - format: uint64 - title: >- - timestamped_headers_count is the number of timestamped headers - in CZ's - - canonical chain - title: ChainInfo is the information of a CZ - description: >- - QueryChainsInfoResponse is response type for the Query/ChainsInfo RPC - method. - babylon.zoneconcierge.v1.QueryEpochChainInfoResponse: - type: object - properties: - chain_info: - title: chain_info is the info of the CZ - type: object - properties: - chain_id: - type: string - title: chain_id is the ID of the chain - latest_header: - title: latest_header is the latest header in CZ's canonical chain - type: object - properties: - chain_id: - type: string - title: chain_id is the unique ID of the chain - hash: - type: string - format: byte - title: hash is the hash of this header - height: - type: string - format: uint64 - title: >- - height is the height of this header on CZ ledger - - (hash, height) jointly provides the position of the header on - CZ ledger - babylon_header: - title: >- - babylon_header is the header of the babylon block that - includes this CZ - - header - type: object - properties: - version: - title: basic block info - type: object - properties: - block: - type: string - format: uint64 - app: - type: string - format: uint64 - description: >- - Consensus captures the consensus rules for processing a - block in the blockchain, - - including all blockchain data structures and the rules of - the application's + title: >- + latest_forks is the latest forks, formed as a series of + IndexedHeader (from - state transition machine. - chain_id: - type: string - height: - type: string - format: int64 - time: - type: string - format: date-time - last_block_id: - title: prev block info - type: object - properties: - hash: - type: string - format: byte - part_set_header: - type: object - properties: - total: - type: integer - format: int64 - hash: - type: string - format: byte - title: PartsetHeader - last_commit_hash: - type: string - format: byte - title: hashes of block data - data_hash: - type: string - format: byte - validators_hash: - type: string - format: byte - title: hashes from the app output from the prev block - next_validators_hash: - type: string - format: byte - consensus_hash: - type: string - format: byte - app_hash: - type: string - format: byte - last_results_hash: - type: string - format: byte - evidence_hash: - type: string - format: byte - title: consensus info - proposer_address: - type: string - format: byte - description: Header defines the structure of a block header. - babylon_epoch: - type: string - format: uint64 - title: epoch is the epoch number of this header on Babylon ledger - babylon_tx_hash: - type: string - format: byte - title: >- - babylon_tx_hash is the hash of the tx that includes this - header + low to high) + timestamped_headers_count: + type: string + format: uint64 + title: >- + timestamped_headers_count is the number of timestamped headers + in CZ's - (babylon_block_height, babylon_tx_hash) jointly provides the - position of + canonical chain + title: ChainInfo is the information of a CZ + description: >- + QueryChainsInfoResponse is response type for the Query/ChainsInfo RPC + method. + babylon.zoneconcierge.v1.QueryEpochChainsInfoResponse: + type: object + properties: + chains_info: + type: array + items: + type: object + properties: + chain_id: + type: string + title: chain_id is the ID of the chain + latest_header: + type: object + properties: + chain_id: + type: string + title: chain_id is the unique ID of the chain + hash: + type: string + format: byte + title: hash is the hash of this header + height: + type: string + format: uint64 + title: >- + height is the height of this header on CZ ledger - the header on Babylon ledger - latest_forks: - title: >- - latest_forks is the latest forks, formed as a series of - IndexedHeader (from + (hash, height) jointly provides the position of the header + on CZ ledger + babylon_header: + title: >- + babylon_header is the header of the babylon block that + includes this CZ - low to high) - type: object - properties: - headers: - type: array - items: + header type: object properties: + version: + title: basic block info + type: object + properties: + block: + type: string + format: uint64 + app: + type: string + format: uint64 + description: >- + Consensus captures the consensus rules for processing a + block in the blockchain, + + including all blockchain data structures and the rules + of the application's + + state transition machine. chain_id: type: string - title: chain_id is the unique ID of the chain - hash: - type: string - format: byte - title: hash is the hash of this header height: type: string - format: uint64 - title: >- - height is the height of this header on CZ ledger - - (hash, height) jointly provides the position of the - header on CZ ledger - babylon_header: - title: >- - babylon_header is the header of the babylon block that - includes this CZ - - header + format: int64 + time: + type: string + format: date-time + last_block_id: + title: prev block info type: object properties: - version: - title: basic block info - type: object - properties: - block: - type: string - format: uint64 - app: - type: string - format: uint64 - description: >- - Consensus captures the consensus rules for - processing a block in the blockchain, - - including all blockchain data structures and the - rules of the application's - - state transition machine. - chain_id: - type: string - height: - type: string - format: int64 - time: + hash: type: string - format: date-time - last_block_id: - title: prev block info + format: byte + part_set_header: type: object properties: + total: + type: integer + format: int64 hash: type: string format: byte - part_set_header: - type: object - properties: - total: - type: integer - format: int64 - hash: - type: string - format: byte - title: PartsetHeader - last_commit_hash: - type: string - format: byte - title: hashes of block data - data_hash: - type: string - format: byte - validators_hash: - type: string - format: byte - title: hashes from the app output from the prev block - next_validators_hash: - type: string - format: byte - consensus_hash: - type: string - format: byte - app_hash: - type: string - format: byte - last_results_hash: - type: string - format: byte - evidence_hash: - type: string - format: byte - title: consensus info - proposer_address: - type: string - format: byte - description: Header defines the structure of a block header. - babylon_epoch: + title: PartsetHeader + last_commit_hash: + type: string + format: byte + title: hashes of block data + data_hash: + type: string + format: byte + validators_hash: + type: string + format: byte + title: hashes from the app output from the prev block + next_validators_hash: type: string - format: uint64 - title: >- - epoch is the epoch number of this header on Babylon - ledger - babylon_tx_hash: + format: byte + consensus_hash: type: string format: byte - title: >- - babylon_tx_hash is the hash of the tx that includes this - header + app_hash: + type: string + format: byte + last_results_hash: + type: string + format: byte + evidence_hash: + type: string + format: byte + title: consensus info + proposer_address: + type: string + format: byte + description: Header defines the structure of a block header. + babylon_epoch: + type: string + format: uint64 + title: epoch is the epoch number of this header on Babylon ledger + babylon_tx_hash: + type: string + format: byte + title: >- + babylon_tx_hash is the hash of the tx that includes this + header - (babylon_block_height, babylon_tx_hash) jointly provides - the position of + (babylon_block_height, babylon_tx_hash) jointly provides the + position of - the header on Babylon ledger - title: IndexedHeader is the metadata of a CZ header - title: >- - blocks is the list of non-canonical indexed headers at the - same height - description: >- - Forks is a list of non-canonical `IndexedHeader`s at the same - height. + the header on Babylon ledger + title: IndexedHeader is the metadata of a CZ header + latest_forks: + type: object + properties: + headers: + type: array + items: + type: object + properties: + chain_id: + type: string + title: chain_id is the unique ID of the chain + hash: + type: string + format: byte + title: hash is the hash of this header + height: + type: string + format: uint64 + title: >- + height is the height of this header on CZ ledger - For example, assuming the following blockchain + (hash, height) jointly provides the position of the + header on CZ ledger + babylon_header: + title: >- + babylon_header is the header of the babylon block that + includes this CZ - ``` + header + type: object + properties: + version: + title: basic block info + type: object + properties: + block: + type: string + format: uint64 + app: + type: string + format: uint64 + description: >- + Consensus captures the consensus rules for + processing a block in the blockchain, - A <- B <- C <- D <- E - \ -- D1 - \ -- D2 - ``` + including all blockchain data structures and the + rules of the application's - Then the fork will be {[D1, D2]} where each item is in struct - `IndexedBlock`. + state transition machine. + chain_id: + type: string + height: + type: string + format: int64 + time: + type: string + format: date-time + last_block_id: + title: prev block info + type: object + properties: + hash: + type: string + format: byte + part_set_header: + type: object + properties: + total: + type: integer + format: int64 + hash: + type: string + format: byte + title: PartsetHeader + last_commit_hash: + type: string + format: byte + title: hashes of block data + data_hash: + type: string + format: byte + validators_hash: + type: string + format: byte + title: hashes from the app output from the prev block + next_validators_hash: + type: string + format: byte + consensus_hash: + type: string + format: byte + app_hash: + type: string + format: byte + last_results_hash: + type: string + format: byte + evidence_hash: + type: string + format: byte + title: consensus info + proposer_address: + type: string + format: byte + description: Header defines the structure of a block header. + babylon_epoch: + type: string + format: uint64 + title: >- + epoch is the epoch number of this header on Babylon + ledger + babylon_tx_hash: + type: string + format: byte + title: >- + babylon_tx_hash is the hash of the tx that includes + this header + (babylon_block_height, babylon_tx_hash) jointly + provides the position of - Note that each `IndexedHeader` in the fork should have a valid - quorum + the header on Babylon ledger + title: IndexedHeader is the metadata of a CZ header + title: >- + blocks is the list of non-canonical indexed headers at the + same height + description: >- + Forks is a list of non-canonical `IndexedHeader`s at the same + height. - certificate. Such forks exist since Babylon considers CZs might - have + For example, assuming the following blockchain - dishonest majority. Also note that the IBC-Go implementation will - only + ``` - consider the first header in a fork valid, since the subsequent - headers + A <- B <- C <- D <- E + \ -- D1 + \ -- D2 + ``` - cannot be verified without knowing the validator set in the - previous header. - timestamped_headers_count: - type: string - format: uint64 - title: >- - timestamped_headers_count is the number of timestamped headers in - CZ's + Then the fork will be {[D1, D2]} where each item is in struct + `IndexedBlock`. - canonical chain + + Note that each `IndexedHeader` in the fork should have a valid + quorum + + certificate. Such forks exist since Babylon considers CZs might + have + + dishonest majority. Also note that the IBC-Go implementation + will only + + consider the first header in a fork valid, since the subsequent + headers + + cannot be verified without knowing the validator set in the + previous header. + title: >- + latest_forks is the latest forks, formed as a series of + IndexedHeader (from + + low to high) + timestamped_headers_count: + type: string + format: uint64 + title: >- + timestamped_headers_count is the number of timestamped headers + in CZ's + + canonical chain + title: ChainInfo is the information of a CZ + title: chain_info is the info of the CZ description: >- - QueryEpochChainInfoResponse is response type for the Query/EpochChainInfo - RPC + QueryEpochChainsInfoResponse is response type for the + Query/EpochChainsInfo RPC method. babylon.zoneconcierge.v1.QueryFinalizedChainInfoUntilHeightResponse: @@ -17142,7 +17177,6 @@ definitions: type: string title: chain_id is the ID of the chain latest_header: - title: latest_header is the latest header in CZ's canonical chain type: object properties: chain_id: @@ -17257,12 +17291,8 @@ definitions: position of the header on Babylon ledger + title: IndexedHeader is the metadata of a CZ header latest_forks: - title: >- - latest_forks is the latest forks, formed as a series of - IndexedHeader (from - - low to high) type: object properties: headers: @@ -17419,6 +17449,11 @@ definitions: cannot be verified without knowing the validator set in the previous header. + title: >- + latest_forks is the latest forks, formed as a series of + IndexedHeader (from + + low to high) timestamped_headers_count: type: string format: uint64 @@ -17911,7 +17946,6 @@ definitions: type: string title: chain_id is the ID of the chain latest_header: - title: latest_header is the latest header in CZ's canonical chain type: object properties: chain_id: @@ -18028,12 +18062,8 @@ definitions: the position of the header on Babylon ledger + title: IndexedHeader is the metadata of a CZ header latest_forks: - title: >- - latest_forks is the latest forks, formed as a series of - IndexedHeader (from - - low to high) type: object properties: headers: @@ -18190,6 +18220,11 @@ definitions: cannot be verified without knowing the validator set in the previous header. + title: >- + latest_forks is the latest forks, formed as a series of + IndexedHeader (from + + low to high) timestamped_headers_count: type: string format: uint64 diff --git a/proto/babylon/zoneconcierge/v1/query.proto b/proto/babylon/zoneconcierge/v1/query.proto index e9b7cd267..e3675682d 100644 --- a/proto/babylon/zoneconcierge/v1/query.proto +++ b/proto/babylon/zoneconcierge/v1/query.proto @@ -21,17 +21,17 @@ service Query { rpc ChainList(QueryChainListRequest) returns (QueryChainListResponse) { option (google.api.http).get = "/babylon/zoneconcierge/v1/chains"; } - // ChainInfo queries the latest info of a chain in Babylon's view + // ChainsInfo queries the latest info for a given list of chains in Babylon's view rpc ChainsInfo(QueryChainsInfoRequest) returns (QueryChainsInfoResponse) { option (google.api.http).get = "/babylon/zoneconcierge/v1/chains_info"; } - // EpochChainInfo queries the latest info of a chain in a given epoch of - // Babylon's view - rpc EpochChainInfo(QueryEpochChainInfoRequest) - returns (QueryEpochChainInfoResponse) { + // EpochChainsInfo queries the latest info for a list of chains + // in a given epoch in Babylon's view + rpc EpochChainsInfo(QueryEpochChainsInfoRequest) + returns (QueryEpochChainsInfoResponse) { option (google.api.http).get = - "/babylon/zoneconcierge/v1/chain_info/{chain_id}/epochs/{epoch_num}"; + "/babylon/zoneconcierge/v1/epoch_chains_info"; } // ListHeaders queries the headers of a chain in Babylon's view, with // pagination support @@ -96,18 +96,18 @@ message QueryChainsInfoResponse { repeated babylon.zoneconcierge.v1.ChainInfo chains_info = 1; } -// QueryEpochChainInfoRequest is request type for the Query/EpochChainInfo RPC +// QueryEpochChainsInfoRequest is request type for the Query/EpochChainsInfo RPC // method. -message QueryEpochChainInfoRequest { +message QueryEpochChainsInfoRequest { uint64 epoch_num = 1; - string chain_id = 2; + repeated string chain_ids = 2; } -// QueryEpochChainInfoResponse is response type for the Query/EpochChainInfo RPC +// QueryEpochChainsInfoResponse is response type for the Query/EpochChainsInfo RPC // method. -message QueryEpochChainInfoResponse { +message QueryEpochChainsInfoResponse { // chain_info is the info of the CZ - babylon.zoneconcierge.v1.ChainInfo chain_info = 1; + repeated babylon.zoneconcierge.v1.ChainInfo chains_info = 1; } // QueryListHeadersRequest is request type for the Query/ListHeaders RPC method. diff --git a/test/e2e/configurer/chain/queries.go b/test/e2e/configurer/chain/queries.go index 16f3d5460..b6764c4c2 100644 --- a/test/e2e/configurer/chain/queries.go +++ b/test/e2e/configurer/chain/queries.go @@ -179,7 +179,7 @@ func (n *NodeConfig) QueryTip() (*blc.BTCHeaderInfo, error) { return blcResponse.Header, nil } -func (n *NodeConfig) QueryFinalizedChainsInfo(chainIDs []string) (*zctypes.QueryFinalizedChainsInfoResponse, error) { +func (n *NodeConfig) QueryFinalizedChainsInfo(chainIDs []string) ([]*zctypes.FinalizedChainInfo, error) { queryParams := url.Values{} for _, chainId := range chainIDs { queryParams.Add("chain_ids", chainId) @@ -193,10 +193,28 @@ func (n *NodeConfig) QueryFinalizedChainsInfo(chainIDs []string) (*zctypes.Query return nil, err } - return &resp, nil + return resp.FinalizedChainsInfo, nil } -func (n *NodeConfig) QueryCheckpointChains() (*[]string, error) { +func (n *NodeConfig) QueryEpochChainsInfo(epochNum uint64, chainIDs []string) ([]*zctypes.ChainInfo, error) { + queryParams := url.Values{} + for _, chainId := range chainIDs { + queryParams.Add("epoch_num", fmt.Sprintf("%d", epochNum)) + queryParams.Add("chain_ids", chainId) + } + + bz, err := n.QueryGRPCGateway("babylon/zoneconcierge/v1/epoch_chains_info", queryParams) + require.NoError(n.t, err) + + var resp zctypes.QueryEpochChainsInfoResponse + if err := util.Cdc.UnmarshalJSON(bz, &resp); err != nil { + return nil, err + } + + return resp.ChainsInfo, nil +} + +func (n *NodeConfig) QueryChains() (*[]string, error) { bz, err := n.QueryGRPCGateway("babylon/zoneconcierge/v1/chains", url.Values{}) require.NoError(n.t, err) var chainsResponse zctypes.QueryChainListResponse @@ -206,7 +224,7 @@ func (n *NodeConfig) QueryCheckpointChains() (*[]string, error) { return &chainsResponse.ChainIds, nil } -func (n *NodeConfig) QueryCheckpointChainsInfo(chainIDs []string) ([]*zctypes.ChainInfo, error) { +func (n *NodeConfig) QueryChainsInfo(chainIDs []string) ([]*zctypes.ChainInfo, error) { queryParams := url.Values{} for _, chainId := range chainIDs { queryParams.Add("chain_ids", chainId) @@ -214,11 +232,11 @@ func (n *NodeConfig) QueryCheckpointChainsInfo(chainIDs []string) ([]*zctypes.Ch bz, err := n.QueryGRPCGateway("/babylon/zoneconcierge/v1/chains_info", queryParams) require.NoError(n.t, err) - var infoResponse zctypes.QueryChainsInfoResponse - if err := util.Cdc.UnmarshalJSON(bz, &infoResponse); err != nil { + var resp zctypes.QueryChainsInfoResponse + if err := util.Cdc.UnmarshalJSON(bz, &resp); err != nil { return nil, err } - return infoResponse.ChainsInfo, nil + return resp.ChainsInfo, nil } func (n *NodeConfig) QueryCurrentEpoch() (uint64, error) { diff --git a/test/e2e/e2e_test.go b/test/e2e/e2e_test.go index c86c512a7..8c29d1b64 100644 --- a/test/e2e/e2e_test.go +++ b/test/e2e/e2e_test.go @@ -30,28 +30,35 @@ func (s *IntegrationTestSuite) TestIbcCheckpointing() { s.NoError(err) // Query checkpoint chain info for opposing chain - chainInfo, err := nonValidatorNode.QueryCheckpointChainsInfo([]string{initialization.ChainBID}) + chainsInfo, err := nonValidatorNode.QueryChainsInfo([]string{initialization.ChainBID}) s.NoError(err) - s.Equal(chainInfo[0].ChainId, initialization.ChainBID) + s.Equal(chainsInfo[0].ChainId, initialization.ChainBID) // Finalize epoch 1,2,3 , as first headers of opposing chain are in epoch 3 - nonValidatorNode.FinalizeSealedEpochs(1, 3) + var ( + startEpochNum uint64 = 1 + endEpochNum uint64 = 3 + ) - epoch3, err := nonValidatorNode.QueryCheckpointForEpoch(3) + nonValidatorNode.FinalizeSealedEpochs(startEpochNum, endEpochNum) + + endEpoch, err := nonValidatorNode.QueryCheckpointForEpoch(endEpochNum) s.NoError(err) + s.Equal(endEpoch.Status, ct.Finalized) - if epoch3.Status != ct.Finalized { - s.FailNow("Epoch 2 should be finalized") - } + // Check we have epoch info for opposing chain and some basic assertions + epochChainsInfo, err := nonValidatorNode.QueryEpochChainsInfo(endEpochNum, []string{initialization.ChainBID}) + s.NoError(err) + s.Equal(epochChainsInfo[0].ChainId, initialization.ChainBID) + s.Equal(epochChainsInfo[0].LatestHeader.BabylonEpoch, endEpochNum) // Check we have finalized epoch info for opposing chain and some basic assertions - finalizedResp, err := nonValidatorNode.QueryFinalizedChainsInfo([]string{initialization.ChainBID}) + finalizedChainsInfo, err := nonValidatorNode.QueryFinalizedChainsInfo([]string{initialization.ChainBID}) s.NoError(err) - finalizedInfo := finalizedResp.FinalizedChainsInfo[0] // TODO Add more assertion here. Maybe check proofs ? - s.Equal(finalizedInfo.FinalizedChainInfo.ChainId, initialization.ChainBID) - s.Equal(finalizedInfo.EpochInfo.EpochNumber, uint64(3)) + s.Equal(finalizedChainsInfo[0].FinalizedChainInfo.ChainId, initialization.ChainBID) + s.Equal(finalizedChainsInfo[0].EpochInfo.EpochNumber, endEpochNum) currEpoch, err := nonValidatorNode.QueryCurrentEpoch() s.NoError(err) diff --git a/x/zoneconcierge/client/cli/query.go b/x/zoneconcierge/client/cli/query.go index 67d8069c4..270ad106e 100644 --- a/x/zoneconcierge/client/cli/query.go +++ b/x/zoneconcierge/client/cli/query.go @@ -2,6 +2,7 @@ package cli import ( "fmt" + "strconv" "github.com/cosmos/cosmos-sdk/client/flags" "github.com/spf13/cobra" @@ -24,13 +25,14 @@ func GetQueryCmd(queryRoute string) *cobra.Command { cmd.AddCommand(CmdChainsInfo()) cmd.AddCommand(CmdFinalizedChainsInfo()) + cmd.AddCommand(CmdEpochChainsInfoInfo()) return cmd } func CmdChainsInfo() *cobra.Command { cmd := &cobra.Command{ Use: "chains-info ", - Short: "retrieves the latest info for a list of chains with given IDs", + Short: "retrieve the latest info for a given list of chains", Args: cobra.ArbitraryArgs, RunE: func(cmd *cobra.Command, args []string) error { clientCtx := client.GetClientContextFromCmd(cmd) @@ -52,7 +54,7 @@ func CmdChainsInfo() *cobra.Command { func CmdFinalizedChainsInfo() *cobra.Command { cmd := &cobra.Command{ Use: "finalized-chains-info ", - Short: "retrieves the finalized info for a list of chains with given IDs", + Short: "retrieve the finalized info for a given list of chains", Args: cobra.ArbitraryArgs, RunE: func(cmd *cobra.Command, args []string) error { clientCtx := client.GetClientContextFromCmd(cmd) @@ -70,3 +72,30 @@ func CmdFinalizedChainsInfo() *cobra.Command { flags.AddQueryFlagsToCmd(cmd) return cmd } + +func CmdEpochChainsInfoInfo() *cobra.Command { + cmd := &cobra.Command{ + Use: "epoch-chains-info ", + Short: "retrieve the latest info for a list of chains in a given epoch", + Args: cobra.MinimumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + clientCtx := client.GetClientContextFromCmd(cmd) + queryClient := types.NewQueryClient(clientCtx) + + epoch, err := strconv.ParseUint(args[0], 10, 64) + if err != nil { + return err + } + req := types.QueryEpochChainsInfoRequest{EpochNum: epoch, ChainIds: args[1:]} + resp, err := queryClient.EpochChainsInfo(cmd.Context(), &req) + if err != nil { + return err + } + + return clientCtx.PrintProto(resp) + }, + } + + flags.AddQueryFlagsToCmd(cmd) + return cmd +} diff --git a/x/zoneconcierge/keeper/chain_info_indexer.go b/x/zoneconcierge/keeper/chain_info_indexer.go index 1f6f07c14..cd71c2904 100644 --- a/x/zoneconcierge/keeper/chain_info_indexer.go +++ b/x/zoneconcierge/keeper/chain_info_indexer.go @@ -4,9 +4,10 @@ import ( "fmt" errorsmod "cosmossdk.io/errors" - "github.com/babylonchain/babylon/x/zoneconcierge/types" "github.com/cosmos/cosmos-sdk/store/prefix" sdk "github.com/cosmos/cosmos-sdk/types" + + "github.com/babylonchain/babylon/x/zoneconcierge/types" ) func (k Keeper) setChainInfo(ctx sdk.Context, chainInfo *types.ChainInfo) { @@ -48,11 +49,11 @@ func (k Keeper) HasChainInfo(ctx sdk.Context, chainID string) bool { // Since IBC does not provide API that allows to initialise chain info right before creating an IBC connection, // we can only check its existence every time, and return an empty one if it's not initialised yet. func (k Keeper) GetChainInfo(ctx sdk.Context, chainID string) (*types.ChainInfo, error) { - store := k.chainInfoStore(ctx) - - if !store.Has([]byte(chainID)) { - return nil, types.ErrEpochChainInfoNotFound + if !k.HasChainInfo(ctx, chainID) { + return nil, types.ErrChainInfoNotFound } + + store := k.chainInfoStore(ctx) chainInfoBytes := store.Get([]byte(chainID)) var chainInfo types.ChainInfo k.cdc.MustUnmarshal(chainInfoBytes, &chainInfo) diff --git a/x/zoneconcierge/keeper/grpc_query.go b/x/zoneconcierge/keeper/grpc_query.go index e67554c59..191f59f32 100644 --- a/x/zoneconcierge/keeper/grpc_query.go +++ b/x/zoneconcierge/keeper/grpc_query.go @@ -42,7 +42,7 @@ func (k Keeper) ChainList(c context.Context, req *types.QueryChainListRequest) ( return resp, nil } -// ChainsInfo returns the latest info for a list of chains with given IDs +// ChainsInfo returns the latest info for a given list of chains func (k Keeper) ChainsInfo(c context.Context, req *types.QueryChainsInfoRequest) (*types.QueryChainsInfoResponse, error) { if req == nil { return nil, status.Error(codes.InvalidArgument, "invalid request") @@ -103,24 +103,51 @@ func (k Keeper) Header(c context.Context, req *types.QueryHeaderRequest) (*types return resp, nil } -// EpochChainInfo returns the info of a chain with given ID in a given epoch -func (k Keeper) EpochChainInfo(c context.Context, req *types.QueryEpochChainInfoRequest) (*types.QueryEpochChainInfoResponse, error) { +// EpochChainsInfo returns the latest info for list of chains in a given epoch +func (k Keeper) EpochChainsInfo(c context.Context, req *types.QueryEpochChainsInfoRequest) (*types.QueryEpochChainsInfoResponse, error) { if req == nil { return nil, status.Error(codes.InvalidArgument, "invalid request") } - if len(req.ChainId) == 0 { - return nil, status.Error(codes.InvalidArgument, "chain ID cannot be empty") + // return if no chain IDs are provided + if len(req.ChainIds) == 0 { + return nil, status.Error(codes.InvalidArgument, "chain IDs cannot be empty") + } + + // return if chain IDs exceed the limit + if len(req.ChainIds) > maxQueryChainsInfoLimit { + return nil, status.Errorf(codes.InvalidArgument, "cannot query more than %d chains", maxQueryChainsInfoLimit) + } + + // return if chain IDs contain duplicates or empty strings + if err := bbntypes.CheckForDuplicatesAndEmptyStrings(req.ChainIds); err != nil { + return nil, status.Error(codes.InvalidArgument, types.ErrInvalidChainIDs.Wrap(err.Error()).Error()) } ctx := sdk.UnwrapSDKContext(c) + var chainsInfo []*types.ChainInfo + for _, chainID := range req.ChainIds { + // check if chain ID is valid + if !k.HasChainInfo(ctx, chainID) { + return nil, status.Error(codes.InvalidArgument, types.ErrChainInfoNotFound.Wrapf("chain ID %s", chainID).Error()) + } - // find the chain info of the given epoch - chainInfo, err := k.GetEpochChainInfo(ctx, req.ChainId, req.EpochNum) - if err != nil { - return nil, err + // if the chain info is not found in the given epoch, return with empty fields + if !k.EpochChainInfoExists(ctx, chainID, req.EpochNum) { + chainsInfo = append(chainsInfo, &types.ChainInfo{ChainId: chainID}) + continue + } + + // find the chain info of the given epoch + chainInfo, err := k.GetEpochChainInfo(ctx, chainID, req.EpochNum) + if err != nil { + return nil, err + } + + chainsInfo = append(chainsInfo, chainInfo) } - resp := &types.QueryEpochChainInfoResponse{ChainInfo: chainInfo} + + resp := &types.QueryEpochChainsInfoResponse{ChainsInfo: chainsInfo} return resp, nil } @@ -179,7 +206,7 @@ func (k Keeper) ListEpochHeaders(c context.Context, req *types.QueryListEpochHea return resp, nil } -// FinalizedChainsInfo returns the finalized info of chains with given IDs +// FinalizedChainsInfo returns the finalized info for a given list of chains func (k Keeper) FinalizedChainsInfo(c context.Context, req *types.QueryFinalizedChainsInfoRequest) (*types.QueryFinalizedChainsInfoResponse, error) { if req == nil { return nil, status.Error(codes.InvalidArgument, "invalid request") @@ -210,9 +237,14 @@ func (k Keeper) FinalizedChainsInfo(c context.Context, req *types.QueryFinalized } for _, chainID := range req.ChainIds { + // check if chain ID is valid + if !k.HasChainInfo(ctx, chainID) { + return nil, status.Error(codes.InvalidArgument, types.ErrChainInfoNotFound.Wrapf("chain ID %s", chainID).Error()) + } + data := &types.FinalizedChainInfo{ChainId: chainID} - // if the chain info is not found in the last finalised epoch, return the chain info with empty fields + // if the chain info is not found in the last finalised epoch, return with empty fields if !k.EpochChainInfoExists(ctx, chainID, lastFinalizedEpoch) { resp.FinalizedChainsInfo = append(resp.FinalizedChainsInfo, data) continue diff --git a/x/zoneconcierge/keeper/grpc_query_test.go b/x/zoneconcierge/keeper/grpc_query_test.go index e699942f7..08ad7f6cf 100644 --- a/x/zoneconcierge/keeper/grpc_query_test.go +++ b/x/zoneconcierge/keeper/grpc_query_test.go @@ -20,9 +20,10 @@ import ( ) type chainInfo struct { - chainID string - numHeaders uint64 - numForkHeaders uint64 + chainID string + numHeaders uint64 + numForkHeaders uint64 + headerStartHeight uint64 } func FuzzChainList(f *testing.F) { @@ -108,10 +109,10 @@ func FuzzChainsInfo(f *testing.F) { }) require.NoError(t, err) - for i, data := range resp.ChainsInfo { - require.Equal(t, chainsInfo[i].chainID, data.ChainId) - require.Equal(t, chainsInfo[i].numHeaders-1, data.LatestHeader.Height) - require.Equal(t, chainsInfo[i].numForkHeaders, uint64(len(data.LatestForks.Headers))) + for i, respData := range resp.ChainsInfo { + require.Equal(t, chainsInfo[i].chainID, respData.ChainId) + require.Equal(t, chainsInfo[i].numHeaders-1, respData.LatestHeader.Height) + require.Equal(t, chainsInfo[i].numForkHeaders, uint64(len(respData.LatestForks.Headers))) } }) } @@ -151,50 +152,100 @@ func FuzzHeader(f *testing.F) { }) } -func FuzzEpochChainInfo(f *testing.F) { +func FuzzEpochChainsInfo(f *testing.F) { datagen.AddRandomSeedsToFuzzer(f, 10) f.Fuzz(func(t *testing.T, seed int64) { r := rand.New(rand.NewSource(seed)) - - _, babylonChain, czChain, babylonApp := SetupTest(t) + _, babylonChain, _, babylonApp := SetupTest(t) zcKeeper := babylonApp.ZoneConciergeKeeper ctx := babylonChain.GetContext() hooks := zcKeeper.Hooks() - numReqs := datagen.RandomInt(r, 5) + 1 + // generate a random number of chains + numChains := datagen.RandomInt(r, 10) + 1 + var chainIDs []string + for j := uint64(0); j < numChains; j++ { + chainID := datagen.GenRandomHexStr(r, 30) + chainIDs = append(chainIDs, chainID) + } - epochNumList := []uint64{datagen.RandomInt(r, 10) + 1} - nextHeightList := []uint64{0} - numHeadersList := []uint64{} - numForkHeadersList := []uint64{} + // generate a random number of epochNums + totalNumEpochs := datagen.RandomInt(r, 5) + 1 + epochNums := []uint64{datagen.RandomInt(r, 10) + 1} + for i := uint64(1); i < totalNumEpochs; i++ { + nextEpoch := epochNums[i-1] + datagen.RandomInt(r, 10) + 1 + epochNums = append(epochNums, nextEpoch) + } - // we test the scenario of ending an epoch for multiple times, in order to ensure that - // consecutive epoch infos do not affect each other. - for i := uint64(0); i < numReqs; i++ { - // generate a random number of headers and fork headers - numHeadersList = append(numHeadersList, datagen.RandomInt(r, 100)+1) - numForkHeadersList = append(numForkHeadersList, datagen.RandomInt(r, 10)+1) - // trigger hooks to append these headers and fork headers - SimulateHeadersAndForksViaHook(ctx, r, hooks, czChain.ChainID, nextHeightList[i], numHeadersList[i], numForkHeadersList[i]) - // prepare nextHeight for the next request - nextHeightList = append(nextHeightList, nextHeightList[i]+numHeadersList[i]) + // we insert random number of headers and fork headers for each chain in each epoch, + // chainHeaderStartHeights keeps track of the next start height of header for each chain + chainHeaderStartHeights := make([]uint64, numChains) + epochToChainInfo := make(map[uint64]map[string]chainInfo) + for _, epochNum := range epochNums { + epochToChainInfo[epochNum] = make(map[string]chainInfo) + for j, chainID := range chainIDs { + // generate a random number of headers and fork headers for each chain + numHeaders := datagen.RandomInt(r, 100) + 1 + numForkHeaders := datagen.RandomInt(r, 10) + 1 + + // trigger hooks to append these headers and fork headers + SimulateHeadersAndForksViaHook(ctx, r, hooks, chainID, chainHeaderStartHeights[j], numHeaders, numForkHeaders) + + epochToChainInfo[epochNum][chainID] = chainInfo{ + chainID: chainID, + numHeaders: numHeaders, + numForkHeaders: numForkHeaders, + headerStartHeight: chainHeaderStartHeights[j], + } + + // update next insertion height for this chain + chainHeaderStartHeights[j] += numHeaders + } // simulate the scenario that a random epoch has ended - hooks.AfterEpochEnds(ctx, epochNumList[i]) - // prepare epochNum for the next request - epochNumList = append(epochNumList, epochNumList[i]+datagen.RandomInt(r, 10)+1) + hooks.AfterEpochEnds(ctx, epochNum) } - // attest the correctness of epoch info for each tested epoch - for i := uint64(0); i < numReqs; i++ { - resp, err := zcKeeper.EpochChainInfo(ctx, &zctypes.QueryEpochChainInfoRequest{EpochNum: epochNumList[i], ChainId: czChain.ChainID}) + // assert correctness of best case scenario + for _, epochNum := range epochNums { + resp, err := zcKeeper.EpochChainsInfo(ctx, &zctypes.QueryEpochChainsInfoRequest{EpochNum: epochNum, ChainIds: chainIDs}) require.NoError(t, err) - chainInfo := resp.ChainInfo - require.Equal(t, nextHeightList[i+1]-1, chainInfo.LatestHeader.Height) - require.Equal(t, numForkHeadersList[i], uint64(len(chainInfo.LatestForks.Headers))) + epochChainsInfo := resp.ChainsInfo + require.Len(t, epochChainsInfo, int(numChains)) + for _, info := range epochChainsInfo { + require.Equal(t, epochToChainInfo[epochNum][info.ChainId].numForkHeaders, uint64(len(info.LatestForks.Headers))) + + actualHeight := epochToChainInfo[epochNum][info.ChainId].headerStartHeight + (epochToChainInfo[epochNum][info.ChainId].numHeaders - 1) + require.Equal(t, actualHeight, info.LatestHeader.Height) + + } + } + + // if num of chain ids exceed the max limit, query should fail + largeNumChains := datagen.RandomInt(r, 10) + 101 + var maxChainIDs []string + for i := uint64(0); i < largeNumChains; i++ { + maxChainIDs = append(maxChainIDs, datagen.GenRandomHexStr(r, 30)) } + randomEpochNum := datagen.RandomInt(r, 10) + 1 + _, err := zcKeeper.EpochChainsInfo(ctx, &zctypes.QueryEpochChainsInfoRequest{EpochNum: randomEpochNum, ChainIds: maxChainIDs}) + require.Error(t, err) + + // if no input is passed in, query should fail + _, err = zcKeeper.EpochChainsInfo(ctx, &zctypes.QueryEpochChainsInfoRequest{EpochNum: randomEpochNum, ChainIds: nil}) + require.Error(t, err) + + // if len of chain ids is 0, query should fail + _, err = zcKeeper.EpochChainsInfo(ctx, &zctypes.QueryEpochChainsInfoRequest{EpochNum: randomEpochNum, ChainIds: []string{}}) + require.Error(t, err) + + // if chain ids contain duplicates, query should fail + randomChainID := datagen.GenRandomHexStr(r, 30) + dupChainIds := []string{randomChainID, randomChainID} + _, err = zcKeeper.EpochChainsInfo(ctx, &zctypes.QueryEpochChainsInfoRequest{EpochNum: randomEpochNum, ChainIds: dupChainIds}) + require.Error(t, err) }) } @@ -385,11 +436,10 @@ func FuzzFinalizedChainInfo(f *testing.F) { // check if the chain info of this epoch is recorded or not resp, err := zcKeeper.FinalizedChainsInfo(ctx, &zctypes.QueryFinalizedChainsInfoRequest{ChainIds: chainIDs, Prove: true}) require.NoError(t, err) - for i, data := range resp.FinalizedChainsInfo { - finalizedInfo := data.FinalizedChainInfo - require.Equal(t, chainsInfo[i].chainID, data.ChainId) - require.Equal(t, chainsInfo[i].numHeaders-1, finalizedInfo.LatestHeader.Height) - require.Equal(t, chainsInfo[i].numForkHeaders, uint64(len(finalizedInfo.LatestForks.Headers))) + for i, respData := range resp.FinalizedChainsInfo { + require.Equal(t, chainsInfo[i].chainID, respData.FinalizedChainInfo.ChainId) + require.Equal(t, chainsInfo[i].numHeaders-1, respData.FinalizedChainInfo.LatestHeader.Height) + require.Equal(t, chainsInfo[i].numForkHeaders, uint64(len(respData.FinalizedChainInfo.LatestForks.Headers))) } }) } diff --git a/x/zoneconcierge/keeper/hooks.go b/x/zoneconcierge/keeper/hooks.go index 12e58ee3c..95b52a65f 100644 --- a/x/zoneconcierge/keeper/hooks.go +++ b/x/zoneconcierge/keeper/hooks.go @@ -3,12 +3,12 @@ package keeper import ( "fmt" - errorsmod "cosmossdk.io/errors" + sdk "github.com/cosmos/cosmos-sdk/types" + checkpointingtypes "github.com/babylonchain/babylon/x/checkpointing/types" epochingtypes "github.com/babylonchain/babylon/x/epoching/types" extendedkeeper "github.com/babylonchain/babylon/x/zoneconcierge/extended-client-keeper" "github.com/babylonchain/babylon/x/zoneconcierge/types" - sdk "github.com/cosmos/cosmos-sdk/types" ) type Hooks struct { @@ -28,22 +28,26 @@ func (h Hooks) AfterHeaderWithValidCommit(ctx sdk.Context, txHash []byte, header indexedHeader := types.IndexedHeader{ ChainId: header.ChaindId, Hash: header.Hash, - Height: uint64(header.Height), + Height: header.Height, BabylonHeader: &babylonHeader, BabylonEpoch: h.k.GetEpoch(ctx).EpochNumber, BabylonTxHash: txHash, } - // initialise chain info if not exist - chainInfo, err := h.k.GetChainInfo(ctx, indexedHeader.ChainId) - if err != nil { - if errorsmod.IsOf(err, types.ErrEpochChainInfoNotFound) { - // chain info does not exist yet, initialise chain info for this chain - chainInfo, err = h.k.InitChainInfo(ctx, indexedHeader.ChainId) - if err != nil { - panic(fmt.Errorf("failed to initialize chain info of %s: %w", indexedHeader.ChainId, err)) - } - } else { + var ( + chainInfo *types.ChainInfo + err error + ) + if !h.k.HasChainInfo(ctx, indexedHeader.ChainId) { + // chain info does not exist yet, initialise chain info for this chain + chainInfo, err = h.k.InitChainInfo(ctx, indexedHeader.ChainId) + if err != nil { + panic(fmt.Errorf("failed to initialize chain info of %s: %w", indexedHeader.ChainId, err)) + } + } else { + // get chain info + chainInfo, err = h.k.GetChainInfo(ctx, indexedHeader.ChainId) + if err != nil { panic(fmt.Errorf("failed to get chain info of %s: %w", indexedHeader.ChainId, err)) } } diff --git a/x/zoneconcierge/types/query.pb.go b/x/zoneconcierge/types/query.pb.go index ca1f0842c..fa90d6a3d 100644 --- a/x/zoneconcierge/types/query.pb.go +++ b/x/zoneconcierge/types/query.pb.go @@ -329,25 +329,25 @@ func (m *QueryChainsInfoResponse) GetChainsInfo() []*ChainInfo { return nil } -// QueryEpochChainInfoRequest is request type for the Query/EpochChainInfo RPC +// QueryEpochChainsInfoRequest is request type for the Query/EpochChainsInfo RPC // method. -type QueryEpochChainInfoRequest struct { - EpochNum uint64 `protobuf:"varint,1,opt,name=epoch_num,json=epochNum,proto3" json:"epoch_num,omitempty"` - ChainId string `protobuf:"bytes,2,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` +type QueryEpochChainsInfoRequest struct { + EpochNum uint64 `protobuf:"varint,1,opt,name=epoch_num,json=epochNum,proto3" json:"epoch_num,omitempty"` + ChainIds []string `protobuf:"bytes,2,rep,name=chain_ids,json=chainIds,proto3" json:"chain_ids,omitempty"` } -func (m *QueryEpochChainInfoRequest) Reset() { *m = QueryEpochChainInfoRequest{} } -func (m *QueryEpochChainInfoRequest) String() string { return proto.CompactTextString(m) } -func (*QueryEpochChainInfoRequest) ProtoMessage() {} -func (*QueryEpochChainInfoRequest) Descriptor() ([]byte, []int) { +func (m *QueryEpochChainsInfoRequest) Reset() { *m = QueryEpochChainsInfoRequest{} } +func (m *QueryEpochChainsInfoRequest) String() string { return proto.CompactTextString(m) } +func (*QueryEpochChainsInfoRequest) ProtoMessage() {} +func (*QueryEpochChainsInfoRequest) Descriptor() ([]byte, []int) { return fileDescriptor_cd665af90102da38, []int{6} } -func (m *QueryEpochChainInfoRequest) XXX_Unmarshal(b []byte) error { +func (m *QueryEpochChainsInfoRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *QueryEpochChainInfoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *QueryEpochChainsInfoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_QueryEpochChainInfoRequest.Marshal(b, m, deterministic) + return xxx_messageInfo_QueryEpochChainsInfoRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -357,51 +357,51 @@ func (m *QueryEpochChainInfoRequest) XXX_Marshal(b []byte, deterministic bool) ( return b[:n], nil } } -func (m *QueryEpochChainInfoRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryEpochChainInfoRequest.Merge(m, src) +func (m *QueryEpochChainsInfoRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryEpochChainsInfoRequest.Merge(m, src) } -func (m *QueryEpochChainInfoRequest) XXX_Size() int { +func (m *QueryEpochChainsInfoRequest) XXX_Size() int { return m.Size() } -func (m *QueryEpochChainInfoRequest) XXX_DiscardUnknown() { - xxx_messageInfo_QueryEpochChainInfoRequest.DiscardUnknown(m) +func (m *QueryEpochChainsInfoRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryEpochChainsInfoRequest.DiscardUnknown(m) } -var xxx_messageInfo_QueryEpochChainInfoRequest proto.InternalMessageInfo +var xxx_messageInfo_QueryEpochChainsInfoRequest proto.InternalMessageInfo -func (m *QueryEpochChainInfoRequest) GetEpochNum() uint64 { +func (m *QueryEpochChainsInfoRequest) GetEpochNum() uint64 { if m != nil { return m.EpochNum } return 0 } -func (m *QueryEpochChainInfoRequest) GetChainId() string { +func (m *QueryEpochChainsInfoRequest) GetChainIds() []string { if m != nil { - return m.ChainId + return m.ChainIds } - return "" + return nil } -// QueryEpochChainInfoResponse is response type for the Query/EpochChainInfo RPC +// QueryEpochChainsInfoResponse is response type for the Query/EpochChainsInfo RPC // method. -type QueryEpochChainInfoResponse struct { +type QueryEpochChainsInfoResponse struct { // chain_info is the info of the CZ - ChainInfo *ChainInfo `protobuf:"bytes,1,opt,name=chain_info,json=chainInfo,proto3" json:"chain_info,omitempty"` + ChainsInfo []*ChainInfo `protobuf:"bytes,1,rep,name=chains_info,json=chainsInfo,proto3" json:"chains_info,omitempty"` } -func (m *QueryEpochChainInfoResponse) Reset() { *m = QueryEpochChainInfoResponse{} } -func (m *QueryEpochChainInfoResponse) String() string { return proto.CompactTextString(m) } -func (*QueryEpochChainInfoResponse) ProtoMessage() {} -func (*QueryEpochChainInfoResponse) Descriptor() ([]byte, []int) { +func (m *QueryEpochChainsInfoResponse) Reset() { *m = QueryEpochChainsInfoResponse{} } +func (m *QueryEpochChainsInfoResponse) String() string { return proto.CompactTextString(m) } +func (*QueryEpochChainsInfoResponse) ProtoMessage() {} +func (*QueryEpochChainsInfoResponse) Descriptor() ([]byte, []int) { return fileDescriptor_cd665af90102da38, []int{7} } -func (m *QueryEpochChainInfoResponse) XXX_Unmarshal(b []byte) error { +func (m *QueryEpochChainsInfoResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *QueryEpochChainInfoResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *QueryEpochChainsInfoResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_QueryEpochChainInfoResponse.Marshal(b, m, deterministic) + return xxx_messageInfo_QueryEpochChainsInfoResponse.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -411,21 +411,21 @@ func (m *QueryEpochChainInfoResponse) XXX_Marshal(b []byte, deterministic bool) return b[:n], nil } } -func (m *QueryEpochChainInfoResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryEpochChainInfoResponse.Merge(m, src) +func (m *QueryEpochChainsInfoResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryEpochChainsInfoResponse.Merge(m, src) } -func (m *QueryEpochChainInfoResponse) XXX_Size() int { +func (m *QueryEpochChainsInfoResponse) XXX_Size() int { return m.Size() } -func (m *QueryEpochChainInfoResponse) XXX_DiscardUnknown() { - xxx_messageInfo_QueryEpochChainInfoResponse.DiscardUnknown(m) +func (m *QueryEpochChainsInfoResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryEpochChainsInfoResponse.DiscardUnknown(m) } -var xxx_messageInfo_QueryEpochChainInfoResponse proto.InternalMessageInfo +var xxx_messageInfo_QueryEpochChainsInfoResponse proto.InternalMessageInfo -func (m *QueryEpochChainInfoResponse) GetChainInfo() *ChainInfo { +func (m *QueryEpochChainsInfoResponse) GetChainsInfo() []*ChainInfo { if m != nil { - return m.ChainInfo + return m.ChainsInfo } return nil } @@ -909,8 +909,8 @@ func init() { proto.RegisterType((*QueryChainListResponse)(nil), "babylon.zoneconcierge.v1.QueryChainListResponse") proto.RegisterType((*QueryChainsInfoRequest)(nil), "babylon.zoneconcierge.v1.QueryChainsInfoRequest") proto.RegisterType((*QueryChainsInfoResponse)(nil), "babylon.zoneconcierge.v1.QueryChainsInfoResponse") - proto.RegisterType((*QueryEpochChainInfoRequest)(nil), "babylon.zoneconcierge.v1.QueryEpochChainInfoRequest") - proto.RegisterType((*QueryEpochChainInfoResponse)(nil), "babylon.zoneconcierge.v1.QueryEpochChainInfoResponse") + proto.RegisterType((*QueryEpochChainsInfoRequest)(nil), "babylon.zoneconcierge.v1.QueryEpochChainsInfoRequest") + proto.RegisterType((*QueryEpochChainsInfoResponse)(nil), "babylon.zoneconcierge.v1.QueryEpochChainsInfoResponse") proto.RegisterType((*QueryListHeadersRequest)(nil), "babylon.zoneconcierge.v1.QueryListHeadersRequest") proto.RegisterType((*QueryListHeadersResponse)(nil), "babylon.zoneconcierge.v1.QueryListHeadersResponse") proto.RegisterType((*QueryListEpochHeadersRequest)(nil), "babylon.zoneconcierge.v1.QueryListEpochHeadersRequest") @@ -926,76 +926,76 @@ func init() { } var fileDescriptor_cd665af90102da38 = []byte{ - // 1103 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x57, 0xcd, 0x6f, 0x1b, 0x45, - 0x14, 0xcf, 0xe4, 0xab, 0xc9, 0x73, 0xa9, 0xaa, 0x49, 0x5b, 0xcc, 0xb6, 0x75, 0xad, 0xe5, 0xa3, - 0x69, 0x95, 0xee, 0x62, 0xd3, 0x50, 0x95, 0x4b, 0xd5, 0x24, 0x24, 0x0d, 0x45, 0xa5, 0x5d, 0x1a, - 0x0e, 0x5c, 0x96, 0xdd, 0xf5, 0xd8, 0x5e, 0x25, 0xde, 0x71, 0x3d, 0x6b, 0xb7, 0x6e, 0x08, 0x07, - 0x84, 0x38, 0x23, 0x71, 0x41, 0x9c, 0x38, 0x71, 0xe0, 0xd0, 0xff, 0x02, 0x09, 0x24, 0x0e, 0x95, - 0xb8, 0x70, 0x44, 0x09, 0xff, 0x06, 0x12, 0xda, 0x99, 0xd9, 0xb5, 0xd7, 0xbb, 0x1b, 0xaf, 0x43, - 0x6f, 0x99, 0xf1, 0x7b, 0xbf, 0xdf, 0xef, 0x7d, 0xcd, 0xdb, 0xc0, 0x5b, 0xb6, 0x65, 0xf7, 0xf7, - 0xa8, 0xa7, 0x3f, 0xa7, 0x1e, 0x71, 0xa8, 0xe7, 0xb8, 0xa4, 0xd3, 0x20, 0x7a, 0xaf, 0xa2, 0x3f, - 0xe9, 0x92, 0x4e, 0x5f, 0x6b, 0x77, 0xa8, 0x4f, 0x71, 0x51, 0x5a, 0x69, 0x31, 0x2b, 0xad, 0x57, - 0x51, 0x2e, 0x35, 0x28, 0x6d, 0xec, 0x11, 0xdd, 0x6a, 0xbb, 0xba, 0xe5, 0x79, 0xd4, 0xb7, 0x7c, - 0x97, 0x7a, 0x4c, 0xf8, 0x29, 0xd7, 0x1d, 0xca, 0x5a, 0x94, 0xe9, 0xb6, 0xc5, 0x88, 0x00, 0xd4, - 0x7b, 0x15, 0x9b, 0xf8, 0x56, 0x45, 0x6f, 0x5b, 0x0d, 0xd7, 0xe3, 0xc6, 0xd2, 0x76, 0x25, 0x54, - 0x62, 0xfb, 0x8e, 0xd3, 0x24, 0xce, 0x6e, 0x9b, 0xba, 0x9e, 0x1f, 0x28, 0x89, 0x5d, 0x48, 0xeb, - 0x6b, 0xa1, 0xf5, 0xe0, 0x17, 0xd7, 0x6b, 0x04, 0xd6, 0x09, 0x53, 0x35, 0x34, 0x25, 0x6d, 0xea, - 0x34, 0xa5, 0x55, 0xf8, 0xf7, 0x28, 0x79, 0x22, 0x0d, 0xf1, 0x88, 0xb9, 0xb5, 0xba, 0x05, 0xf8, - 0x51, 0x10, 0xcc, 0x3d, 0x62, 0xd5, 0x48, 0xc7, 0x20, 0x4f, 0xba, 0x84, 0xf9, 0xf8, 0x0d, 0x58, - 0x70, 0x9a, 0x96, 0xeb, 0x99, 0x6e, 0xad, 0x88, 0xca, 0x68, 0x79, 0xd1, 0x38, 0xc5, 0xcf, 0xdb, - 0x35, 0x7c, 0x01, 0xe6, 0x9b, 0xc4, 0x6d, 0x34, 0xfd, 0xe2, 0x74, 0x19, 0x2d, 0xcf, 0x1a, 0xf2, - 0xa4, 0xfe, 0x88, 0x60, 0x29, 0x86, 0xc4, 0xda, 0xd4, 0x63, 0x04, 0xdf, 0x09, 0xec, 0x83, 0x1b, - 0x0e, 0x54, 0xa8, 0x5e, 0xd5, 0xb2, 0x0a, 0xa0, 0x6d, 0x7b, 0x35, 0xf2, 0x8c, 0xd4, 0x24, 0x80, - 0x74, 0xc3, 0x6b, 0x70, 0xba, 0x4e, 0x3b, 0xbb, 0xa6, 0x38, 0x32, 0x4e, 0x5b, 0xa8, 0x5e, 0xc9, - 0x86, 0xd9, 0xa4, 0x9d, 0x5d, 0x66, 0x14, 0x02, 0x27, 0x01, 0xc5, 0x54, 0x13, 0xce, 0x73, 0x6d, - 0xeb, 0x41, 0x10, 0x1f, 0xbb, 0xcc, 0x0f, 0x03, 0xdd, 0x04, 0x18, 0x54, 0x4f, 0x2a, 0x7c, 0x47, - 0x13, 0xa5, 0xd6, 0x82, 0x52, 0x6b, 0xa2, 0x77, 0x64, 0xa9, 0xb5, 0x87, 0x56, 0x83, 0x48, 0x5f, - 0x63, 0xc8, 0x53, 0xfd, 0x0a, 0x2e, 0x8c, 0x12, 0xc8, 0xf8, 0x2f, 0xc2, 0x62, 0x98, 0x4a, 0x56, - 0x44, 0xe5, 0x99, 0xe5, 0x45, 0x63, 0x41, 0xe6, 0x92, 0xe1, 0xad, 0x18, 0xfd, 0xb4, 0x4c, 0xd0, - 0x38, 0x7a, 0x81, 0x1c, 0xe3, 0x5f, 0x1d, 0xe6, 0x67, 0xdb, 0x5e, 0x9d, 0x86, 0x11, 0x1e, 0xc7, - 0xaf, 0x9a, 0xf0, 0x7a, 0xc2, 0x4d, 0xea, 0xde, 0x80, 0x02, 0x37, 0x63, 0xa6, 0xeb, 0xd5, 0x29, - 0xf7, 0x2c, 0x54, 0xdf, 0xcc, 0xce, 0x3a, 0x87, 0xe0, 0x08, 0xe0, 0x44, 0x68, 0xea, 0x63, 0x50, - 0x38, 0xc1, 0x87, 0x41, 0x8f, 0x0e, 0x4c, 0x06, 0xda, 0x78, 0xf3, 0x9a, 0x5e, 0xb7, 0xc5, 0x93, - 0x3f, 0x6b, 0x2c, 0xf0, 0x8b, 0x07, 0xdd, 0x56, 0xac, 0x07, 0xa7, 0x63, 0x3d, 0xa8, 0x5a, 0x70, - 0x31, 0x15, 0x55, 0x4a, 0x5f, 0x03, 0x90, 0x9e, 0x42, 0x39, 0xca, 0xab, 0x5c, 0x64, 0x8a, 0x0b, - 0xff, 0x52, 0x66, 0x26, 0xa8, 0xa5, 0xec, 0xa2, 0x1c, 0xc3, 0xb1, 0x99, 0x52, 0xcf, 0x93, 0xb4, - 0xd3, 0xcf, 0x08, 0x8a, 0x49, 0x7a, 0x19, 0xde, 0x5d, 0x38, 0x15, 0xce, 0x82, 0xa8, 0x4a, 0xee, - 0x91, 0x0a, 0xfd, 0x5e, 0x5d, 0xdf, 0x7d, 0x06, 0x97, 0x22, 0x9d, 0xbc, 0x1a, 0x23, 0xb9, 0x3a, - 0x69, 0x85, 0x6d, 0xb8, 0x9c, 0x81, 0xfb, 0xca, 0x92, 0xa0, 0x3e, 0x86, 0x2b, 0x9c, 0x63, 0xd3, - 0xf5, 0xac, 0x3d, 0xf7, 0x39, 0xa9, 0x4d, 0x36, 0x3c, 0xf8, 0x1c, 0xcc, 0xb5, 0x3b, 0xb4, 0x47, - 0xb8, 0xf6, 0x05, 0x43, 0x1c, 0xd4, 0x6f, 0x10, 0x94, 0xb3, 0x61, 0xa5, 0xfa, 0x2f, 0xe0, 0x7c, - 0x3d, 0xfc, 0xd9, 0x4c, 0x8e, 0xd9, 0xca, 0x31, 0x8f, 0x5b, 0x0c, 0x95, 0x83, 0x2e, 0xd5, 0x93, - 0x4c, 0xaa, 0x0f, 0xd7, 0x52, 0x54, 0x04, 0x3f, 0xed, 0x78, 0xbe, 0xbb, 0x77, 0x8f, 0x3f, 0xda, - 0x27, 0x7f, 0xee, 0x07, 0xc1, 0xcf, 0x0c, 0x07, 0xff, 0x62, 0x06, 0xae, 0xe7, 0xa1, 0x95, 0x69, - 0xd8, 0x81, 0x73, 0x23, 0x69, 0x98, 0x78, 0x64, 0x71, 0x3d, 0xc1, 0x84, 0x6f, 0x03, 0x88, 0xa6, - 0xe3, 0x60, 0xa2, 0xbb, 0x95, 0x08, 0x2c, 0x5a, 0x97, 0xbd, 0x8a, 0xc6, 0x5b, 0xcb, 0x10, 0x2d, - 0xca, 0x5d, 0x1f, 0xc0, 0x99, 0x8e, 0xf5, 0xd4, 0x1c, 0x2c, 0x5e, 0x1e, 0xdf, 0x70, 0x77, 0xc5, - 0x96, 0x74, 0x80, 0x61, 0x58, 0x4f, 0xd7, 0xa3, 0x3b, 0xe3, 0xb5, 0xce, 0xf0, 0x11, 0xef, 0x00, - 0xb6, 0x7d, 0xc7, 0x64, 0x5d, 0xbb, 0xe5, 0x32, 0xe6, 0x52, 0xcf, 0xdc, 0x25, 0xfd, 0xe2, 0xec, - 0x08, 0x66, 0xfc, 0xab, 0xa0, 0x57, 0xd1, 0x3e, 0x8d, 0xec, 0xef, 0x93, 0xbe, 0x71, 0xd6, 0xf6, - 0x9d, 0xd8, 0x0d, 0xde, 0xe2, 0xd9, 0xa7, 0xf5, 0xe2, 0x1c, 0x47, 0xaa, 0x64, 0x67, 0xea, 0x61, - 0x60, 0x96, 0xd2, 0x34, 0xc2, 0xbf, 0xfa, 0xed, 0x69, 0x98, 0xe3, 0x05, 0xc3, 0x2f, 0x10, 0xcc, - 0x8b, 0x09, 0xc1, 0xc7, 0xb4, 0x5f, 0xf2, 0x5b, 0x41, 0xb9, 0x91, 0xd3, 0x5a, 0xd4, 0x5c, 0xdd, - 0xfa, 0xfa, 0xcf, 0x7f, 0xbe, 0x9f, 0xbe, 0x8b, 0xef, 0xe8, 0x99, 0xdf, 0x29, 0x83, 0x4e, 0xd0, - 0xf7, 0xc3, 0xbe, 0x3c, 0xd0, 0xc5, 0xd8, 0xea, 0xfb, 0xa2, 0x01, 0x0f, 0xf0, 0x0f, 0x08, 0x16, - 0xa3, 0x75, 0x8b, 0xf5, 0x31, 0x2a, 0x46, 0x37, 0xbf, 0xf2, 0x6e, 0x7e, 0x07, 0xa9, 0x7c, 0x99, - 0x2b, 0x57, 0x71, 0x79, 0x8c, 0x72, 0x86, 0x7f, 0x42, 0x00, 0x83, 0x59, 0xc4, 0xb9, 0xa8, 0x86, - 0xdf, 0x1d, 0xa5, 0x32, 0x81, 0x87, 0x54, 0x77, 0x83, 0xab, 0xbb, 0x8a, 0xdf, 0x1e, 0xa7, 0x8e, - 0x27, 0x16, 0xff, 0x8e, 0xe0, 0x4c, 0x7c, 0x7d, 0xe2, 0x9b, 0x63, 0x48, 0x53, 0x77, 0xb8, 0xb2, - 0x3a, 0xa1, 0x97, 0x94, 0xfb, 0x11, 0x97, 0xbb, 0x81, 0xd7, 0x26, 0x6d, 0x03, 0x3e, 0xab, 0x4c, - 0xdf, 0x8f, 0xd6, 0xca, 0x01, 0xfe, 0x05, 0x41, 0x61, 0x68, 0x51, 0xe2, 0x71, 0xd9, 0x4b, 0xee, - 0x74, 0xa5, 0x3a, 0x89, 0x8b, 0x0c, 0xe1, 0x26, 0x0f, 0x41, 0xc3, 0x2b, 0xd9, 0x21, 0xc8, 0x55, - 0x33, 0xa4, 0x1f, 0xff, 0x81, 0xe0, 0xec, 0xe8, 0x56, 0xc3, 0xef, 0xe7, 0xa0, 0x4f, 0x59, 0xaf, - 0xca, 0xad, 0x89, 0xfd, 0xf2, 0x4f, 0x61, 0x52, 0x7b, 0x5a, 0xee, 0x7f, 0x45, 0xb0, 0x94, 0xb2, - 0xe9, 0xf0, 0xed, 0x31, 0xca, 0xb2, 0x97, 0xae, 0xf2, 0xc1, 0x49, 0x5c, 0x65, 0x5c, 0xb7, 0x78, - 0x5c, 0x15, 0xac, 0x67, 0xc7, 0x95, 0xba, 0x78, 0xf1, 0xbf, 0x08, 0x2e, 0x1f, 0xbb, 0xb4, 0xf0, - 0xfa, 0x44, 0xb2, 0xd2, 0x37, 0xad, 0xb2, 0xf1, 0xff, 0x40, 0x64, 0x94, 0x8f, 0x78, 0x94, 0xf7, - 0xf1, 0x76, 0xee, 0x28, 0x53, 0x5e, 0xd3, 0x00, 0x31, 0x7a, 0x4d, 0xd7, 0x3e, 0xf9, 0xed, 0xb0, - 0x84, 0x5e, 0x1e, 0x96, 0xd0, 0xdf, 0x87, 0x25, 0xf4, 0xdd, 0x51, 0x69, 0xea, 0xe5, 0x51, 0x69, - 0xea, 0xaf, 0xa3, 0xd2, 0xd4, 0xe7, 0xab, 0x0d, 0xd7, 0x6f, 0x76, 0x6d, 0xcd, 0xa1, 0xad, 0x90, - 0x8e, 0xc3, 0x44, 0xdc, 0xcf, 0x46, 0xd8, 0xfd, 0x7e, 0x9b, 0x30, 0x7b, 0x9e, 0xff, 0x7f, 0xf9, - 0xde, 0x7f, 0x01, 0x00, 0x00, 0xff, 0xff, 0xd9, 0x74, 0x79, 0x64, 0x96, 0x0f, 0x00, 0x00, + // 1101 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x57, 0x4d, 0x6f, 0x1b, 0x45, + 0x18, 0xce, 0x3a, 0x1f, 0x4d, 0x5e, 0xf3, 0x51, 0x4d, 0xda, 0x62, 0xb6, 0xad, 0x6b, 0x2d, 0x1f, + 0x4d, 0x4b, 0xb2, 0x8b, 0x5d, 0xd2, 0xaa, 0x5c, 0xaa, 0x36, 0x25, 0x69, 0x54, 0x54, 0xda, 0x85, + 0x80, 0xc4, 0x65, 0xd9, 0x5d, 0x8f, 0xed, 0x55, 0xe2, 0x1d, 0xd7, 0xb3, 0x76, 0xeb, 0x86, 0x70, + 0x40, 0xfc, 0x00, 0x24, 0x2e, 0x88, 0x13, 0x27, 0x0e, 0x1c, 0x7a, 0xe3, 0x27, 0x20, 0x71, 0xe0, + 0x50, 0x89, 0x0b, 0x47, 0x94, 0xf0, 0x0b, 0xb8, 0x23, 0xa1, 0x9d, 0x99, 0xb5, 0xf7, 0xd3, 0x5e, + 0x87, 0xdc, 0x32, 0xe3, 0xf7, 0x7d, 0x9e, 0xe7, 0xfd, 0x9a, 0x77, 0x03, 0x6f, 0x5a, 0xa6, 0x35, + 0xd8, 0x23, 0xae, 0xf6, 0x8c, 0xb8, 0xd8, 0x26, 0xae, 0xed, 0xe0, 0x6e, 0x13, 0x6b, 0xfd, 0xaa, + 0xf6, 0xb8, 0x87, 0xbb, 0x03, 0xb5, 0xd3, 0x25, 0x1e, 0x41, 0x25, 0x61, 0xa5, 0x46, 0xac, 0xd4, + 0x7e, 0x55, 0xbe, 0xd0, 0x24, 0xa4, 0xb9, 0x87, 0x35, 0xb3, 0xe3, 0x68, 0xa6, 0xeb, 0x12, 0xcf, + 0xf4, 0x1c, 0xe2, 0x52, 0xee, 0x27, 0x5f, 0xb5, 0x09, 0x6d, 0x13, 0xaa, 0x59, 0x26, 0xc5, 0x1c, + 0x50, 0xeb, 0x57, 0x2d, 0xec, 0x99, 0x55, 0xad, 0x63, 0x36, 0x1d, 0x97, 0x19, 0x0b, 0xdb, 0xd5, + 0x40, 0x89, 0xe5, 0xd9, 0x76, 0x0b, 0xdb, 0xbb, 0x1d, 0xe2, 0xb8, 0x9e, 0xaf, 0x24, 0x72, 0x21, + 0xac, 0xaf, 0x04, 0xd6, 0xa3, 0x5f, 0x1c, 0xb7, 0xe9, 0x5b, 0x27, 0x4c, 0x95, 0xc0, 0x14, 0x77, + 0x88, 0xdd, 0x12, 0x56, 0xc1, 0xdf, 0x71, 0xf2, 0x44, 0x1a, 0xa2, 0x11, 0x33, 0x6b, 0x65, 0x0b, + 0xd0, 0x23, 0x3f, 0x98, 0x7b, 0xd8, 0xac, 0xe3, 0xae, 0x8e, 0x1f, 0xf7, 0x30, 0xf5, 0xd0, 0xeb, + 0xb0, 0x68, 0xb7, 0x4c, 0xc7, 0x35, 0x9c, 0x7a, 0x49, 0xaa, 0x48, 0x2b, 0x4b, 0xfa, 0x29, 0x76, + 0xde, 0xae, 0xa3, 0x73, 0xb0, 0xd0, 0xc2, 0x4e, 0xb3, 0xe5, 0x95, 0x0a, 0x15, 0x69, 0x65, 0x4e, + 0x17, 0x27, 0xe5, 0x07, 0x09, 0x96, 0x23, 0x48, 0xb4, 0x43, 0x5c, 0x8a, 0xd1, 0x2d, 0xdf, 0xde, + 0xbf, 0x61, 0x40, 0xc5, 0xda, 0x65, 0x35, 0xab, 0x00, 0xea, 0xb6, 0x5b, 0xc7, 0x4f, 0x71, 0x5d, + 0x00, 0x08, 0x37, 0x74, 0x07, 0x5e, 0x6a, 0x90, 0xee, 0xae, 0xc1, 0x8f, 0x94, 0xd1, 0x16, 0x6b, + 0x97, 0xb2, 0x61, 0x36, 0x49, 0x77, 0x97, 0xea, 0x45, 0xdf, 0x89, 0x43, 0x51, 0xc5, 0x80, 0xb3, + 0x4c, 0xdb, 0x86, 0x1f, 0xc4, 0x87, 0x0e, 0xf5, 0x82, 0x40, 0x37, 0x01, 0x46, 0xd5, 0x13, 0x0a, + 0xdf, 0x56, 0x79, 0xa9, 0x55, 0xbf, 0xd4, 0x2a, 0xef, 0x1d, 0x51, 0x6a, 0xf5, 0xa1, 0xd9, 0xc4, + 0xc2, 0x57, 0x0f, 0x79, 0x2a, 0x5f, 0xc1, 0xb9, 0x38, 0x81, 0x88, 0xff, 0x3c, 0x2c, 0x05, 0xa9, + 0xa4, 0x25, 0xa9, 0x32, 0xbb, 0xb2, 0xa4, 0x2f, 0x8a, 0x5c, 0x52, 0xb4, 0x15, 0xa1, 0x2f, 0x88, + 0x04, 0x4d, 0xa2, 0xe7, 0xc8, 0x11, 0xfe, 0xf5, 0x30, 0x3f, 0xdd, 0x76, 0x1b, 0x24, 0x88, 0x70, + 0x1c, 0xbf, 0x62, 0xc0, 0x6b, 0x09, 0x37, 0xa1, 0xfb, 0x2e, 0x14, 0x99, 0x19, 0x35, 0x1c, 0xb7, + 0x41, 0x98, 0x67, 0xb1, 0xf6, 0x46, 0x76, 0xd6, 0x19, 0x04, 0x43, 0x00, 0x7b, 0x88, 0xa6, 0x7c, + 0x06, 0xe7, 0x19, 0xc1, 0x07, 0x7e, 0x8f, 0xa6, 0x8a, 0x63, 0xdd, 0x6b, 0xb8, 0xbd, 0x36, 0xcb, + 0xfe, 0x9c, 0xbe, 0xc8, 0x2e, 0x1e, 0xf4, 0xda, 0x51, 0xe5, 0x85, 0x98, 0xf2, 0x3a, 0x5c, 0x48, + 0x07, 0x3e, 0x51, 0xf9, 0x5f, 0x8a, 0xfc, 0xf8, 0x15, 0x15, 0xbd, 0x94, 0x63, 0x44, 0x36, 0x53, + 0xaa, 0x7a, 0x9c, 0xa6, 0xfa, 0x49, 0x82, 0x52, 0x92, 0x5e, 0x04, 0x78, 0x1b, 0x4e, 0x05, 0x13, + 0xc1, 0x83, 0xcb, 0x3d, 0x58, 0x81, 0xdf, 0xc9, 0x75, 0xdf, 0xa7, 0xa2, 0x18, 0xbe, 0x4e, 0x56, + 0x90, 0x58, 0xae, 0xc6, 0x96, 0x39, 0x9c, 0xc8, 0x42, 0x24, 0x91, 0x8a, 0x05, 0x17, 0x33, 0x70, + 0x4f, 0x2c, 0x09, 0xca, 0x27, 0x70, 0x89, 0x71, 0x6c, 0x3a, 0xae, 0xb9, 0xe7, 0x3c, 0xc3, 0xf5, + 0xe9, 0x46, 0x08, 0x9d, 0x81, 0xf9, 0x4e, 0x97, 0xf4, 0x31, 0xd3, 0xbe, 0xa8, 0xf3, 0x83, 0xf2, + 0x8d, 0x04, 0x95, 0x6c, 0x58, 0xa1, 0xfe, 0x0b, 0x38, 0xdb, 0x08, 0x7e, 0x36, 0x92, 0xdd, 0xba, + 0x3a, 0xe6, 0x89, 0x8b, 0xa0, 0x32, 0xd0, 0xe5, 0x46, 0x92, 0x49, 0xf1, 0xe0, 0x4a, 0x8a, 0x0a, + 0xff, 0xa7, 0x1d, 0xd7, 0x73, 0xf6, 0xee, 0xb1, 0xa7, 0xfb, 0xf8, 0x8f, 0xfe, 0x28, 0xf8, 0xd9, + 0x70, 0xf0, 0xcf, 0x67, 0xe1, 0x6a, 0x1e, 0x5a, 0x91, 0x86, 0x1d, 0x38, 0x13, 0x4b, 0x43, 0x90, + 0x05, 0x29, 0xef, 0xcc, 0xa2, 0x46, 0x82, 0x09, 0xdd, 0x04, 0xe0, 0x4d, 0xc7, 0xc0, 0x78, 0x77, + 0xcb, 0x43, 0xb0, 0xe1, 0xd2, 0xec, 0x57, 0x55, 0xd6, 0x5a, 0x3a, 0x6f, 0x51, 0xe6, 0xfa, 0x00, + 0x5e, 0xe9, 0x9a, 0x4f, 0x8c, 0xd1, 0xfa, 0x65, 0xf1, 0x85, 0xbb, 0x2b, 0xb2, 0xaa, 0x7d, 0x0c, + 0xdd, 0x7c, 0xb2, 0x31, 0xbc, 0xd3, 0x5f, 0xee, 0x86, 0x8f, 0x68, 0x07, 0x90, 0xe5, 0xd9, 0x06, + 0xed, 0x59, 0x6d, 0x87, 0x52, 0x87, 0xb8, 0xc6, 0x2e, 0x1e, 0x94, 0xe6, 0x62, 0x98, 0xd1, 0x6f, + 0x83, 0x7e, 0x55, 0xfd, 0x78, 0x68, 0x7f, 0x1f, 0x0f, 0xf4, 0xd3, 0x96, 0x67, 0x47, 0x6e, 0xd0, + 0x16, 0xcb, 0x3e, 0x69, 0x94, 0xe6, 0x19, 0x52, 0x35, 0x3b, 0x53, 0x0f, 0x7d, 0xb3, 0x94, 0xa6, + 0xe1, 0xfe, 0xb5, 0x7f, 0x8a, 0x30, 0xcf, 0x0a, 0x86, 0x9e, 0x4b, 0xb0, 0xc0, 0x27, 0x04, 0x8d, + 0x69, 0xbf, 0xe4, 0x17, 0x83, 0xbc, 0x96, 0xd3, 0x9a, 0xd7, 0x5c, 0xd9, 0xfa, 0xfa, 0x8f, 0xbf, + 0xbf, 0x2b, 0xdc, 0x46, 0xb7, 0xb4, 0xcc, 0xaf, 0x95, 0x51, 0x27, 0x68, 0xfb, 0x41, 0x5f, 0x1e, + 0x68, 0x7c, 0x6c, 0xb5, 0x7d, 0xde, 0x80, 0x07, 0xe8, 0x7b, 0x09, 0x96, 0x86, 0x4b, 0x17, 0x69, + 0x13, 0x54, 0xc4, 0xf7, 0xbf, 0xfc, 0x6e, 0x7e, 0x07, 0xa1, 0x7c, 0x85, 0x29, 0x57, 0x50, 0x65, + 0x82, 0x72, 0x8a, 0x7e, 0x94, 0x00, 0x46, 0xb3, 0x88, 0x72, 0x51, 0x85, 0xdf, 0x1d, 0xb9, 0x3a, + 0x85, 0x87, 0x50, 0xb7, 0xc6, 0xd4, 0x5d, 0x46, 0x6f, 0x4d, 0x52, 0xc7, 0x12, 0x8b, 0x7e, 0x91, + 0xe0, 0xd5, 0xd8, 0x06, 0x45, 0xeb, 0x13, 0x58, 0xd3, 0x57, 0xb9, 0x7c, 0x7d, 0x5a, 0x37, 0xa1, + 0xf8, 0x1a, 0x53, 0xbc, 0x86, 0xde, 0xc9, 0x56, 0xcc, 0xc7, 0x38, 0xac, 0xfb, 0x67, 0x09, 0x8a, + 0xa1, 0xa5, 0x88, 0x26, 0x65, 0x2a, 0xb9, 0xbf, 0xe5, 0xda, 0x34, 0x2e, 0x42, 0xeb, 0x7b, 0x4c, + 0xab, 0x8a, 0x56, 0xb3, 0xb5, 0x8a, 0xb5, 0x12, 0x6a, 0x59, 0xf4, 0xbb, 0x04, 0xa7, 0xe3, 0x1b, + 0x0c, 0x5d, 0xcf, 0x41, 0x9f, 0xb2, 0x4a, 0xe5, 0x1b, 0x53, 0xfb, 0xe5, 0x9f, 0xb8, 0xa4, 0x76, + 0x9e, 0x7a, 0xaa, 0xed, 0x0f, 0xd7, 0xf7, 0x01, 0xfa, 0x55, 0x82, 0xe5, 0x94, 0xad, 0x86, 0x6e, + 0x4e, 0x50, 0x96, 0xbd, 0x60, 0xe5, 0xf7, 0x8f, 0xe3, 0x2a, 0xe2, 0xba, 0xc1, 0xe2, 0xaa, 0x22, + 0x2d, 0x3b, 0xae, 0xd4, 0x25, 0x8b, 0xfe, 0x95, 0xe0, 0xe2, 0xd8, 0x05, 0x85, 0x36, 0xa6, 0x92, + 0x95, 0xbe, 0x55, 0xe5, 0xbb, 0xff, 0x0f, 0x44, 0x44, 0xf9, 0x88, 0x45, 0x79, 0x1f, 0x6d, 0xe7, + 0x8e, 0x32, 0xe5, 0xe5, 0xf4, 0x11, 0x87, 0x2f, 0xe7, 0x9d, 0x8f, 0x7e, 0x3b, 0x2c, 0x4b, 0x2f, + 0x0e, 0xcb, 0xd2, 0x5f, 0x87, 0x65, 0xe9, 0xdb, 0xa3, 0xf2, 0xcc, 0x8b, 0xa3, 0xf2, 0xcc, 0x9f, + 0x47, 0xe5, 0x99, 0xcf, 0xd7, 0x9b, 0x8e, 0xd7, 0xea, 0x59, 0xaa, 0x4d, 0xda, 0x01, 0x1d, 0x83, + 0x19, 0x72, 0x3f, 0x8d, 0xb1, 0x7b, 0x83, 0x0e, 0xa6, 0xd6, 0x02, 0xfb, 0x8f, 0xf2, 0xda, 0x7f, + 0x01, 0x00, 0x00, 0xff, 0xff, 0x4b, 0x80, 0x0f, 0x7d, 0x88, 0x0f, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -1014,11 +1014,11 @@ type QueryClient interface { Header(ctx context.Context, in *QueryHeaderRequest, opts ...grpc.CallOption) (*QueryHeaderResponse, error) // ChainList queries the list of chains that checkpoint to Babylon ChainList(ctx context.Context, in *QueryChainListRequest, opts ...grpc.CallOption) (*QueryChainListResponse, error) - // ChainInfo queries the latest info of a chain in Babylon's view + // ChainsInfo queries the latest info for a given list of chains in Babylon's view ChainsInfo(ctx context.Context, in *QueryChainsInfoRequest, opts ...grpc.CallOption) (*QueryChainsInfoResponse, error) - // EpochChainInfo queries the latest info of a chain in a given epoch of - // Babylon's view - EpochChainInfo(ctx context.Context, in *QueryEpochChainInfoRequest, opts ...grpc.CallOption) (*QueryEpochChainInfoResponse, error) + // EpochChainsInfo queries the latest info for a list of chains + // in a given epoch in Babylon's view + EpochChainsInfo(ctx context.Context, in *QueryEpochChainsInfoRequest, opts ...grpc.CallOption) (*QueryEpochChainsInfoResponse, error) // ListHeaders queries the headers of a chain in Babylon's view, with // pagination support ListHeaders(ctx context.Context, in *QueryListHeadersRequest, opts ...grpc.CallOption) (*QueryListHeadersResponse, error) @@ -1067,9 +1067,9 @@ func (c *queryClient) ChainsInfo(ctx context.Context, in *QueryChainsInfoRequest return out, nil } -func (c *queryClient) EpochChainInfo(ctx context.Context, in *QueryEpochChainInfoRequest, opts ...grpc.CallOption) (*QueryEpochChainInfoResponse, error) { - out := new(QueryEpochChainInfoResponse) - err := c.cc.Invoke(ctx, "/babylon.zoneconcierge.v1.Query/EpochChainInfo", in, out, opts...) +func (c *queryClient) EpochChainsInfo(ctx context.Context, in *QueryEpochChainsInfoRequest, opts ...grpc.CallOption) (*QueryEpochChainsInfoResponse, error) { + out := new(QueryEpochChainsInfoResponse) + err := c.cc.Invoke(ctx, "/babylon.zoneconcierge.v1.Query/EpochChainsInfo", in, out, opts...) if err != nil { return nil, err } @@ -1118,11 +1118,11 @@ type QueryServer interface { Header(context.Context, *QueryHeaderRequest) (*QueryHeaderResponse, error) // ChainList queries the list of chains that checkpoint to Babylon ChainList(context.Context, *QueryChainListRequest) (*QueryChainListResponse, error) - // ChainInfo queries the latest info of a chain in Babylon's view + // ChainsInfo queries the latest info for a given list of chains in Babylon's view ChainsInfo(context.Context, *QueryChainsInfoRequest) (*QueryChainsInfoResponse, error) - // EpochChainInfo queries the latest info of a chain in a given epoch of - // Babylon's view - EpochChainInfo(context.Context, *QueryEpochChainInfoRequest) (*QueryEpochChainInfoResponse, error) + // EpochChainsInfo queries the latest info for a list of chains + // in a given epoch in Babylon's view + EpochChainsInfo(context.Context, *QueryEpochChainsInfoRequest) (*QueryEpochChainsInfoResponse, error) // ListHeaders queries the headers of a chain in Babylon's view, with // pagination support ListHeaders(context.Context, *QueryListHeadersRequest) (*QueryListHeadersResponse, error) @@ -1149,8 +1149,8 @@ func (*UnimplementedQueryServer) ChainList(ctx context.Context, req *QueryChainL func (*UnimplementedQueryServer) ChainsInfo(ctx context.Context, req *QueryChainsInfoRequest) (*QueryChainsInfoResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ChainsInfo not implemented") } -func (*UnimplementedQueryServer) EpochChainInfo(ctx context.Context, req *QueryEpochChainInfoRequest) (*QueryEpochChainInfoResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method EpochChainInfo not implemented") +func (*UnimplementedQueryServer) EpochChainsInfo(ctx context.Context, req *QueryEpochChainsInfoRequest) (*QueryEpochChainsInfoResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method EpochChainsInfo not implemented") } func (*UnimplementedQueryServer) ListHeaders(ctx context.Context, req *QueryListHeadersRequest) (*QueryListHeadersResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ListHeaders not implemented") @@ -1223,20 +1223,20 @@ func _Query_ChainsInfo_Handler(srv interface{}, ctx context.Context, dec func(in return interceptor(ctx, in, info, handler) } -func _Query_EpochChainInfo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(QueryEpochChainInfoRequest) +func _Query_EpochChainsInfo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryEpochChainsInfoRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(QueryServer).EpochChainInfo(ctx, in) + return srv.(QueryServer).EpochChainsInfo(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/babylon.zoneconcierge.v1.Query/EpochChainInfo", + FullMethod: "/babylon.zoneconcierge.v1.Query/EpochChainsInfo", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(QueryServer).EpochChainInfo(ctx, req.(*QueryEpochChainInfoRequest)) + return srv.(QueryServer).EpochChainsInfo(ctx, req.(*QueryEpochChainsInfoRequest)) } return interceptor(ctx, in, info, handler) } @@ -1330,8 +1330,8 @@ var _Query_serviceDesc = grpc.ServiceDesc{ Handler: _Query_ChainsInfo_Handler, }, { - MethodName: "EpochChainInfo", - Handler: _Query_EpochChainInfo_Handler, + MethodName: "EpochChainsInfo", + Handler: _Query_EpochChainsInfo_Handler, }, { MethodName: "ListHeaders", @@ -1584,7 +1584,7 @@ func (m *QueryChainsInfoResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) return len(dAtA) - i, nil } -func (m *QueryEpochChainInfoRequest) Marshal() (dAtA []byte, err error) { +func (m *QueryEpochChainsInfoRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1594,22 +1594,24 @@ func (m *QueryEpochChainInfoRequest) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *QueryEpochChainInfoRequest) MarshalTo(dAtA []byte) (int, error) { +func (m *QueryEpochChainsInfoRequest) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *QueryEpochChainInfoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *QueryEpochChainsInfoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - if len(m.ChainId) > 0 { - i -= len(m.ChainId) - copy(dAtA[i:], m.ChainId) - i = encodeVarintQuery(dAtA, i, uint64(len(m.ChainId))) - i-- - dAtA[i] = 0x12 + if len(m.ChainIds) > 0 { + for iNdEx := len(m.ChainIds) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.ChainIds[iNdEx]) + copy(dAtA[i:], m.ChainIds[iNdEx]) + i = encodeVarintQuery(dAtA, i, uint64(len(m.ChainIds[iNdEx]))) + i-- + dAtA[i] = 0x12 + } } if m.EpochNum != 0 { i = encodeVarintQuery(dAtA, i, uint64(m.EpochNum)) @@ -1619,7 +1621,7 @@ func (m *QueryEpochChainInfoRequest) MarshalToSizedBuffer(dAtA []byte) (int, err return len(dAtA) - i, nil } -func (m *QueryEpochChainInfoResponse) Marshal() (dAtA []byte, err error) { +func (m *QueryEpochChainsInfoResponse) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1629,27 +1631,29 @@ func (m *QueryEpochChainInfoResponse) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *QueryEpochChainInfoResponse) MarshalTo(dAtA []byte) (int, error) { +func (m *QueryEpochChainsInfoResponse) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *QueryEpochChainInfoResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *QueryEpochChainsInfoResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - if m.ChainInfo != nil { - { - size, err := m.ChainInfo.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err + if len(m.ChainsInfo) > 0 { + for iNdEx := len(m.ChainsInfo) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.ChainsInfo[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) } - i -= size - i = encodeVarintQuery(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0xa } - i-- - dAtA[i] = 0xa } return len(dAtA) - i, nil } @@ -2130,7 +2134,7 @@ func (m *QueryChainsInfoResponse) Size() (n int) { return n } -func (m *QueryEpochChainInfoRequest) Size() (n int) { +func (m *QueryEpochChainsInfoRequest) Size() (n int) { if m == nil { return 0 } @@ -2139,22 +2143,26 @@ func (m *QueryEpochChainInfoRequest) Size() (n int) { if m.EpochNum != 0 { n += 1 + sovQuery(uint64(m.EpochNum)) } - l = len(m.ChainId) - if l > 0 { - n += 1 + l + sovQuery(uint64(l)) + if len(m.ChainIds) > 0 { + for _, s := range m.ChainIds { + l = len(s) + n += 1 + l + sovQuery(uint64(l)) + } } return n } -func (m *QueryEpochChainInfoResponse) Size() (n int) { +func (m *QueryEpochChainsInfoResponse) Size() (n int) { if m == nil { return 0 } var l int _ = l - if m.ChainInfo != nil { - l = m.ChainInfo.Size() - n += 1 + l + sovQuery(uint64(l)) + if len(m.ChainsInfo) > 0 { + for _, e := range m.ChainsInfo { + l = e.Size() + n += 1 + l + sovQuery(uint64(l)) + } } return n } @@ -2906,7 +2914,7 @@ func (m *QueryChainsInfoResponse) Unmarshal(dAtA []byte) error { } return nil } -func (m *QueryEpochChainInfoRequest) Unmarshal(dAtA []byte) error { +func (m *QueryEpochChainsInfoRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -2929,10 +2937,10 @@ func (m *QueryEpochChainInfoRequest) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: QueryEpochChainInfoRequest: wiretype end group for non-group") + return fmt.Errorf("proto: QueryEpochChainsInfoRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: QueryEpochChainInfoRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: QueryEpochChainsInfoRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -2956,7 +2964,7 @@ func (m *QueryEpochChainInfoRequest) Unmarshal(dAtA []byte) error { } case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ChainId", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ChainIds", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -2984,7 +2992,7 @@ func (m *QueryEpochChainInfoRequest) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.ChainId = string(dAtA[iNdEx:postIndex]) + m.ChainIds = append(m.ChainIds, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex default: iNdEx = preIndex @@ -3007,7 +3015,7 @@ func (m *QueryEpochChainInfoRequest) Unmarshal(dAtA []byte) error { } return nil } -func (m *QueryEpochChainInfoResponse) Unmarshal(dAtA []byte) error { +func (m *QueryEpochChainsInfoResponse) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -3030,15 +3038,15 @@ func (m *QueryEpochChainInfoResponse) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: QueryEpochChainInfoResponse: wiretype end group for non-group") + return fmt.Errorf("proto: QueryEpochChainsInfoResponse: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: QueryEpochChainInfoResponse: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: QueryEpochChainsInfoResponse: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ChainInfo", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ChainsInfo", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -3065,10 +3073,8 @@ func (m *QueryEpochChainInfoResponse) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.ChainInfo == nil { - m.ChainInfo = &ChainInfo{} - } - if err := m.ChainInfo.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + m.ChainsInfo = append(m.ChainsInfo, &ChainInfo{}) + if err := m.ChainsInfo[len(m.ChainsInfo)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex diff --git a/x/zoneconcierge/types/query.pb.gw.go b/x/zoneconcierge/types/query.pb.gw.go index 5b7d961fd..607477240 100644 --- a/x/zoneconcierge/types/query.pb.gw.go +++ b/x/zoneconcierge/types/query.pb.gw.go @@ -181,78 +181,38 @@ func local_request_Query_ChainsInfo_0(ctx context.Context, marshaler runtime.Mar } -func request_Query_EpochChainInfo_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryEpochChainInfoRequest - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["chain_id"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "chain_id") - } - - protoReq.ChainId, err = runtime.String(val) +var ( + filter_Query_EpochChainsInfo_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} +) - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "chain_id", err) - } +func request_Query_EpochChainsInfo_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryEpochChainsInfoRequest + var metadata runtime.ServerMetadata - val, ok = pathParams["epoch_num"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "epoch_num") + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - - protoReq.EpochNum, err = runtime.Uint64(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "epoch_num", err) + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_EpochChainsInfo_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.EpochChainInfo(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + msg, err := client.EpochChainsInfo(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } -func local_request_Query_EpochChainInfo_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryEpochChainInfoRequest +func local_request_Query_EpochChainsInfo_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryEpochChainsInfoRequest var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["chain_id"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "chain_id") - } - - protoReq.ChainId, err = runtime.String(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "chain_id", err) - } - - val, ok = pathParams["epoch_num"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "epoch_num") + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - - protoReq.EpochNum, err = runtime.Uint64(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "epoch_num", err) + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_EpochChainsInfo_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.EpochChainInfo(ctx, &protoReq) + msg, err := server.EpochChainsInfo(ctx, &protoReq) return msg, metadata, err } @@ -610,7 +570,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv }) - mux.Handle("GET", pattern_Query_EpochChainInfo_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("GET", pattern_Query_EpochChainsInfo_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream @@ -621,7 +581,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := local_request_Query_EpochChainInfo_0(rctx, inboundMarshaler, server, req, pathParams) + resp, md, err := local_request_Query_EpochChainsInfo_0(rctx, inboundMarshaler, server, req, pathParams) md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { @@ -629,7 +589,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv return } - forward_Query_EpochChainInfo_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_Query_EpochChainsInfo_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) @@ -826,7 +786,7 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie }) - mux.Handle("GET", pattern_Query_EpochChainInfo_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("GET", pattern_Query_EpochChainsInfo_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) @@ -835,14 +795,14 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := request_Query_EpochChainInfo_0(rctx, inboundMarshaler, client, req, pathParams) + resp, md, err := request_Query_EpochChainsInfo_0(rctx, inboundMarshaler, client, req, pathParams) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - forward_Query_EpochChainInfo_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_Query_EpochChainsInfo_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) @@ -936,7 +896,7 @@ var ( pattern_Query_ChainsInfo_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"babylon", "zoneconcierge", "v1", "chains_info"}, "", runtime.AssumeColonVerbOpt(false))) - pattern_Query_EpochChainInfo_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4, 2, 5, 1, 0, 4, 1, 5, 6}, []string{"babylon", "zoneconcierge", "v1", "chain_info", "chain_id", "epochs", "epoch_num"}, "", runtime.AssumeColonVerbOpt(false))) + pattern_Query_EpochChainsInfo_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"babylon", "zoneconcierge", "v1", "epoch_chains_info"}, "", runtime.AssumeColonVerbOpt(false))) pattern_Query_ListHeaders_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4}, []string{"babylon", "zoneconcierge", "v1", "headers", "chain_id"}, "", runtime.AssumeColonVerbOpt(false))) @@ -954,7 +914,7 @@ var ( forward_Query_ChainsInfo_0 = runtime.ForwardResponseMessage - forward_Query_EpochChainInfo_0 = runtime.ForwardResponseMessage + forward_Query_EpochChainsInfo_0 = runtime.ForwardResponseMessage forward_Query_ListHeaders_0 = runtime.ForwardResponseMessage From e4e7d3b16d2a60163dcaa31813e7a70c7ad24655 Mon Sep 17 00:00:00 2001 From: KonradStaniec Date: Thu, 4 May 2023 09:09:19 +0200 Subject: [PATCH 55/59] use tagged branch in test contract (#374) --- wasmbinding/testdata/Cargo.lock | 4 ++-- wasmbinding/testdata/Cargo.toml | 4 +--- wasmbinding/testdata/artifacts/checksums.txt | 4 ++-- .../artifacts/checksums_intermediate.txt | 2 +- .../testdata/artifacts/testdata-aarch64.wasm | Bin 167091 -> 167091 bytes wasmbinding/testdata/artifacts/testdata.wasm | Bin 167093 -> 167107 bytes 6 files changed, 6 insertions(+), 8 deletions(-) diff --git a/wasmbinding/testdata/Cargo.lock b/wasmbinding/testdata/Cargo.lock index 6933a42cf..920856fc1 100644 --- a/wasmbinding/testdata/Cargo.lock +++ b/wasmbinding/testdata/Cargo.lock @@ -16,7 +16,7 @@ dependencies = [ [[package]] name = "babylon-bindings" version = "0.1.0" -source = "git+https://github.com/babylonchain/bindings?branch=main#7c209ab2cd289b9bad57958d5bc074cb8ded5a5c" +source = "git+https://github.com/babylonchain/bindings?tag=v0.1.0#7c209ab2cd289b9bad57958d5bc074cb8ded5a5c" dependencies = [ "cosmwasm-schema", "cosmwasm-std", @@ -27,7 +27,7 @@ dependencies = [ [[package]] name = "babylon-example" version = "0.1.0" -source = "git+https://github.com/babylonchain/bindings?branch=main#7c209ab2cd289b9bad57958d5bc074cb8ded5a5c" +source = "git+https://github.com/babylonchain/bindings?tag=v0.1.0#7c209ab2cd289b9bad57958d5bc074cb8ded5a5c" dependencies = [ "babylon-bindings", "cosmwasm-schema", diff --git a/wasmbinding/testdata/Cargo.toml b/wasmbinding/testdata/Cargo.toml index ced0f9300..bfc90296f 100644 --- a/wasmbinding/testdata/Cargo.toml +++ b/wasmbinding/testdata/Cargo.toml @@ -7,7 +7,5 @@ edition = "2021" [lib] crate-type = ["cdylib", "rlib"] -# TODO for now we use main branch, we should change it to some release -# branches or tags when api will be more stable [dependencies] -babylon-example = { git = "https://github.com/babylonchain/bindings", branch = "main" } +babylon-example = { git = "https://github.com/babylonchain/bindings", tag = "v0.1.0" } diff --git a/wasmbinding/testdata/artifacts/checksums.txt b/wasmbinding/testdata/artifacts/checksums.txt index 3378550b7..a7fccc780 100644 --- a/wasmbinding/testdata/artifacts/checksums.txt +++ b/wasmbinding/testdata/artifacts/checksums.txt @@ -1,2 +1,2 @@ -68dda2e9227ae65bcf56a41201a9eda05002b7f19b97d50ce09c79f818771e8f testdata-aarch64.wasm -5afdc819d10798874793abc813c0dbb70dcf3cec05aa0e84e3128234f8f9f498 testdata.wasm +cb5724a467b45181e187768e942c0e9badaf6953fae2f5b403e61ef696d11167 testdata-aarch64.wasm +29bb4c2ef5e142e32a999132d7245ba7eae385091bd5e5fc2cd0bb818ae2539e testdata.wasm diff --git a/wasmbinding/testdata/artifacts/checksums_intermediate.txt b/wasmbinding/testdata/artifacts/checksums_intermediate.txt index 91167e136..962182268 100644 --- a/wasmbinding/testdata/artifacts/checksums_intermediate.txt +++ b/wasmbinding/testdata/artifacts/checksums_intermediate.txt @@ -1 +1 @@ -3f81b570cc1ec35e77e7ee5856cfe0596a934d0d9aae776313f247734b67e7a1 ./target/wasm32-unknown-unknown/release/testdata.wasm +16e2b22ad2769ae68243d509a88925d0bdcbf9ba916df6c357f9acfc97365984 ./target/wasm32-unknown-unknown/release/testdata.wasm diff --git a/wasmbinding/testdata/artifacts/testdata-aarch64.wasm b/wasmbinding/testdata/artifacts/testdata-aarch64.wasm index c29e5f8d78d2f6c60855551e419300f83a54d3cb..2379ef56f01bbe0275a614b92fa15f25185d3da0 100644 GIT binary patch delta 8032 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�dyPy=wFv~rOL3)X3yE@#R%9E&n^13mpm39CWa z>s4~1cCHceJ@o$t>E0u2AvtU?lhZso!d*76K+NT6K|APER^yI_oq1Ds+DX4%l52U! zn{v}mloI*!>`vV=oE}Dk%&gcEO8_PxgYcT{MCHUaylF(Ra7*7P-5P zZ3(M(i=(?~AZr@37kMvVUf8SKK42fAtd@iKQ7M{c`w@>ha`Pc<$m{#*U7&0SD2|1& z7$FQHEOAOxfN)kzjEK?8puq>I7YkuwNx2N#bO4q2FY@mPa0H=XETPUQ#$GAW-!?uk zG2T!tEE!J@J&3sfMfN#Jttn5-I7oI1gBd-HlCV2hf^iBte^HWb0s*4ScbEz@k5MC* z%#-b*aNKwzA_0P|ryi%EoqUoKEj$Ug1^DeTN`ndNoTAQh-4T>ig)-u(u5#rmNh zxDWihblZLS2;J1|>_*0Q^H`83|BupsyhTx^aU zb*7dddm+Q=o=NsOvh0lR$M?_BHca1imY!hm@UBiP6=(Ida__8>(Y$#B*>zLT>8|^5 zMw7^Bq1xSZ6v_S@a2}O(zDz!^r?u`EbT^)NK~HNRU%*p;q1;=l@9D)-`WX;sHO{Zq zSq(kTuT~)7t@?8d=d_@Uk0v?3#Z_J;{na3#D!*xU{)WRDg4Dl6c@P9y?EyERRp+wC za(_8_$oO(Sp$#nm9X=LW?PhtEhx^7U7F>GR!_oDu<>3&$yBz$v5tJ3IjrL3h*kSdp zN`Smi;lHg$w|cc7;-kS;dON6CKgC14W~8U5Z>Dx8#SsoW+l%GFs}uvhzPw7!IehfH zhkm{y$^rl)d^|XO_z>-I%?KY4#2sENui?&-C$C(iPgwxeK-J=-TU&th*XeC4mdQ6z zcNNQNH*gl@YWHu@0zsuR<0j>s-hWUcqi@knz^iWI7nD+M_?LL*rMue9ukg!>=|TEI z+2uA4fzLGcHsuLgtF`==Qq0<{? ziO*3PE^^0D7#6%gTxz=97Uu?)KA%rItgC`Ot7MyyDJ+zsMIUAWHWSdk;(IS?EFK>A+UNn{?!u{oF)6UGMFrF1@7ssz;$n;AcDLT#X>W}!%gl_ z6j9o~MA1f=4k2{!brsJcG<$UuKh=|;3=xCtj2zW$+Qd;)UP^ssRQ%*AN`b$eI#$Gc z1qIlZa7AHw{a7(Myf5GpfM?+oiBB~=2mPk9+l!)E=N~b}gF%O)SOV?%C0J2@0FG+4 zDUL~#9Vx%z8)BZjJ}x)EC?@(n1$YSHuPut=hjwqE_VY;LW0LVhg~RVukX;D?wi2x; z+FL;~WvFP`*c@zEngH%OaeC^6aU&fgUYk0~0k}QzHng?o?;R>Kg&M34943}{)Ju2R zmGlPq)W;_rpD=tv?OMV(G1#weVyInF@F@ua7N10Xln`zG>mtuvA}7|B`{(29&Q#Hk zzdYr@`NCfwn=j&J_I%+Z^WH)a15e8_^F=FJZ-KDM{cnjL`dYVcV^haX)WQ}BY5E@( C6jS~H delta 8090 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 diff --git a/wasmbinding/testdata/artifacts/testdata.wasm b/wasmbinding/testdata/artifacts/testdata.wasm index 37894a87084015b7354d6df2993e5a8784c1b7b1..75ff0e9c09cb34a2480fbb64ab0e28af6b4b3a78 100644 GIT binary patch delta 14623 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 delta 15080 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 Date: Thu, 4 May 2023 15:49:37 +0530 Subject: [PATCH 56/59] feat: new rpc RawCheckpoints (#372) * proto files * raw checkpoints query and update proto * update swag docs * fuzz tests * add cli query * update e2e tests * fix vars * fix tests * fix key * fix e2e tests * fix fuzz * fix assertions * fix assertions * update docs * update docstring * add more comments * fix proto comment * update proto files * update fuzz seed Co-authored-by: Vitalis Salis * panic if not able to unmarshal --------- Co-authored-by: Vitalis Salis --- client/docs/swagger-ui/swagger.yaml | 384 +++++++++++ proto/babylon/checkpointing/v1/query.proto | 25 + test/e2e/configurer/chain/commands.go | 42 +- test/e2e/configurer/chain/queries.go | 23 +- test/e2e/e2e_test.go | 3 +- x/checkpointing/client/cli/query.go | 34 + .../keeper/grpc_query_checkpoint.go | 26 +- .../keeper/grpc_query_checkpoint_test.go | 49 +- x/checkpointing/types/query.pb.go | 598 ++++++++++++++++-- x/checkpointing/types/query.pb.gw.go | 83 +++ 10 files changed, 1170 insertions(+), 97 deletions(-) diff --git a/client/docs/swagger-ui/swagger.yaml b/client/docs/swagger-ui/swagger.yaml index 0dd155c35..25146beee 100644 --- a/client/docs/swagger-ui/swagger.yaml +++ b/client/docs/swagger-ui/swagger.yaml @@ -5222,6 +5222,246 @@ paths: format: uint64 tags: - Query + /babylon/checkpointing/v1/raw_checkpoints: + get: + summary: >- + RawCheckpoints queries checkpoints for a epoch range specified in + pagination params. + operationId: RawCheckpoints + responses: + '200': + description: A successful response. + schema: + type: object + properties: + raw_checkpoints: + type: array + items: + type: object + properties: + ckpt: + type: object + properties: + epoch_num: + type: string + format: uint64 + title: >- + epoch_num defines the epoch number the raw + checkpoint is for + last_commit_hash: + type: string + format: byte + title: >- + last_commit_hash defines the 'LastCommitHash' that + individual BLS sigs are + + signed on + bitmap: + type: string + format: byte + title: >- + bitmap defines the bitmap that indicates the signers + of the BLS multi sig + bls_multi_sig: + type: string + format: byte + title: >- + bls_multi_sig defines the multi sig that is + aggregated from individual BLS + + sigs + title: RawCheckpoint wraps the BLS multi sig with meta data + status: + type: string + enum: + - CKPT_STATUS_ACCUMULATING + - CKPT_STATUS_SEALED + - CKPT_STATUS_SUBMITTED + - CKPT_STATUS_CONFIRMED + - CKPT_STATUS_FINALIZED + default: CKPT_STATUS_ACCUMULATING + description: |- + CheckpointStatus is the status of a checkpoint. + + - CKPT_STATUS_ACCUMULATING: ACCUMULATING defines a checkpoint that is awaiting for BLS signatures. + - CKPT_STATUS_SEALED: SEALED defines a checkpoint that has accumulated sufficient BLS signatures. + - CKPT_STATUS_SUBMITTED: SUBMITTED defines a checkpoint that is included on BTC. + - CKPT_STATUS_CONFIRMED: CONFIRMED defines a checkpoint that is k-deep on BTC. + - CKPT_STATUS_FINALIZED: FINALIZED defines a checkpoint that is w-deep on BTC. + title: status defines the status of the checkpoint + bls_aggr_pk: + type: string + format: byte + title: bls_aggr_pk defines the aggregated BLS public key + power_sum: + type: string + format: uint64 + title: >- + power_sum defines the accumulated voting power for the + checkpoint + lifecycle: + type: array + items: + type: object + properties: + state: + type: string + enum: + - CKPT_STATUS_ACCUMULATING + - CKPT_STATUS_SEALED + - CKPT_STATUS_SUBMITTED + - CKPT_STATUS_CONFIRMED + - CKPT_STATUS_FINALIZED + default: CKPT_STATUS_ACCUMULATING + description: |- + CheckpointStatus is the status of a checkpoint. + + - CKPT_STATUS_ACCUMULATING: ACCUMULATING defines a checkpoint that is awaiting for BLS signatures. + - CKPT_STATUS_SEALED: SEALED defines a checkpoint that has accumulated sufficient BLS signatures. + - CKPT_STATUS_SUBMITTED: SUBMITTED defines a checkpoint that is included on BTC. + - CKPT_STATUS_CONFIRMED: CONFIRMED defines a checkpoint that is k-deep on BTC. + - CKPT_STATUS_FINALIZED: FINALIZED defines a checkpoint that is w-deep on BTC. + title: >- + state defines the event of a state transition + towards this state + block_height: + type: string + format: uint64 + title: >- + block_height is the height of the Babylon block + that triggers the state + + update + block_time: + type: string + format: date-time + title: >- + block_time is the timestamp in the Babylon block + that triggers the state + + update + description: >- + CheckpointStateUpdate defines a state transition on + the checkpoint. + description: >- + lifecycle defines the lifecycle of this checkpoint, + i.e., each state + + transition and the time (in both timestamp and block + height) of this + + transition. + description: >- + RawCheckpointWithMeta wraps the raw checkpoint with meta + data. + title: >- + the order is going from the newest to oldest based on the + epoch number + pagination: + description: pagination defines the pagination in the response. + type: object + properties: + next_key: + type: string + format: byte + description: |- + next_key is the key to be passed to PageRequest.key to + query the next page most efficiently. It will be empty if + there are no more results. + total: + type: string + format: uint64 + title: >- + total is total number of results available if + PageRequest.count_total + + was set, its value is undefined otherwise + description: >- + QueryRawCheckpointsResponse is the response type for the + Query/RawCheckpoints + + RPC method. + default: + description: An unexpected error response. + schema: + type: object + properties: + error: + type: string + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + type_url: + type: string + value: + type: string + format: byte + parameters: + - name: pagination.key + description: |- + key is a value returned in PageResponse.next_key to begin + querying the next page most efficiently. Only one of offset or key + should be set. + in: query + required: false + type: string + format: byte + - name: pagination.offset + description: >- + offset is a numeric offset that can be used when key is unavailable. + + It is less efficient than using key. Only one of offset or key + should + + be set. + in: query + required: false + type: string + format: uint64 + - name: pagination.limit + description: >- + limit is the total number of results to be returned in the result + page. + + If left empty it will default to a value to be set by each app. + in: query + required: false + type: string + format: uint64 + - name: pagination.count_total + description: >- + count_total is set to true to indicate that the result set should + include + + a count of the total number of items available for pagination in + UIs. + + count_total is only respected when offset is used. It is ignored + when key + + is set. + in: query + required: false + type: boolean + - name: pagination.reverse + description: >- + reverse is set to true if results are to be returned in the + descending order. + + + Since: cosmos-sdk 0.43 + in: query + required: false + type: boolean + tags: + - Query /babylon/checkpointing/v1/raw_checkpoints/{status}: get: summary: RawCheckpointList queries all checkpoints that match the given status. @@ -14738,6 +14978,150 @@ definitions: QueryRawCheckpointResponse is the response type for the Query/RawCheckpoint + RPC method. + babylon.checkpointing.v1.QueryRawCheckpointsResponse: + type: object + properties: + raw_checkpoints: + type: array + items: + type: object + properties: + ckpt: + type: object + properties: + epoch_num: + type: string + format: uint64 + title: epoch_num defines the epoch number the raw checkpoint is for + last_commit_hash: + type: string + format: byte + title: >- + last_commit_hash defines the 'LastCommitHash' that + individual BLS sigs are + + signed on + bitmap: + type: string + format: byte + title: >- + bitmap defines the bitmap that indicates the signers of the + BLS multi sig + bls_multi_sig: + type: string + format: byte + title: >- + bls_multi_sig defines the multi sig that is aggregated from + individual BLS + + sigs + title: RawCheckpoint wraps the BLS multi sig with meta data + status: + type: string + enum: + - CKPT_STATUS_ACCUMULATING + - CKPT_STATUS_SEALED + - CKPT_STATUS_SUBMITTED + - CKPT_STATUS_CONFIRMED + - CKPT_STATUS_FINALIZED + default: CKPT_STATUS_ACCUMULATING + description: |- + CheckpointStatus is the status of a checkpoint. + + - CKPT_STATUS_ACCUMULATING: ACCUMULATING defines a checkpoint that is awaiting for BLS signatures. + - CKPT_STATUS_SEALED: SEALED defines a checkpoint that has accumulated sufficient BLS signatures. + - CKPT_STATUS_SUBMITTED: SUBMITTED defines a checkpoint that is included on BTC. + - CKPT_STATUS_CONFIRMED: CONFIRMED defines a checkpoint that is k-deep on BTC. + - CKPT_STATUS_FINALIZED: FINALIZED defines a checkpoint that is w-deep on BTC. + title: status defines the status of the checkpoint + bls_aggr_pk: + type: string + format: byte + title: bls_aggr_pk defines the aggregated BLS public key + power_sum: + type: string + format: uint64 + title: >- + power_sum defines the accumulated voting power for the + checkpoint + lifecycle: + type: array + items: + type: object + properties: + state: + type: string + enum: + - CKPT_STATUS_ACCUMULATING + - CKPT_STATUS_SEALED + - CKPT_STATUS_SUBMITTED + - CKPT_STATUS_CONFIRMED + - CKPT_STATUS_FINALIZED + default: CKPT_STATUS_ACCUMULATING + description: |- + CheckpointStatus is the status of a checkpoint. + + - CKPT_STATUS_ACCUMULATING: ACCUMULATING defines a checkpoint that is awaiting for BLS signatures. + - CKPT_STATUS_SEALED: SEALED defines a checkpoint that has accumulated sufficient BLS signatures. + - CKPT_STATUS_SUBMITTED: SUBMITTED defines a checkpoint that is included on BTC. + - CKPT_STATUS_CONFIRMED: CONFIRMED defines a checkpoint that is k-deep on BTC. + - CKPT_STATUS_FINALIZED: FINALIZED defines a checkpoint that is w-deep on BTC. + title: >- + state defines the event of a state transition towards this + state + block_height: + type: string + format: uint64 + title: >- + block_height is the height of the Babylon block that + triggers the state + + update + block_time: + type: string + format: date-time + title: >- + block_time is the timestamp in the Babylon block that + triggers the state + + update + description: >- + CheckpointStateUpdate defines a state transition on the + checkpoint. + description: >- + lifecycle defines the lifecycle of this checkpoint, i.e., each + state + + transition and the time (in both timestamp and block height) of + this + + transition. + description: RawCheckpointWithMeta wraps the raw checkpoint with meta data. + title: the order is going from the newest to oldest based on the epoch number + pagination: + description: pagination defines the pagination in the response. + type: object + properties: + next_key: + type: string + format: byte + description: |- + next_key is the key to be passed to PageRequest.key to + query the next page most efficiently. It will be empty if + there are no more results. + total: + type: string + format: uint64 + title: >- + total is total number of results available if + PageRequest.count_total + + was set, its value is undefined otherwise + description: >- + QueryRawCheckpointsResponse is the response type for the + Query/RawCheckpoints + RPC method. babylon.checkpointing.v1.QueryRecentEpochStatusCountResponse: type: object diff --git a/proto/babylon/checkpointing/v1/query.proto b/proto/babylon/checkpointing/v1/query.proto index 5bcb7c0b0..b522c9a7e 100644 --- a/proto/babylon/checkpointing/v1/query.proto +++ b/proto/babylon/checkpointing/v1/query.proto @@ -24,6 +24,13 @@ service Query { "/babylon/checkpointing/v1/raw_checkpoint/{epoch_num}"; } + // RawCheckpoints queries checkpoints for a epoch range specified in pagination params. + rpc RawCheckpoints(QueryRawCheckpointsRequest) + returns (QueryRawCheckpointsResponse) { + option (google.api.http).get = + "/babylon/checkpointing/v1/raw_checkpoints"; + } + // BlsPublicKeyList queries a list of bls public keys of the validators at a // given epoch number. rpc BlsPublicKeyList(QueryBlsPublicKeyListRequest) @@ -86,6 +93,24 @@ message QueryRawCheckpointRequest { // RPC method. message QueryRawCheckpointResponse { RawCheckpointWithMeta raw_checkpoint = 1; } + +// QueryRawCheckpointsRequest is the request type for the Query/RawCheckpoints +// RPC method. +message QueryRawCheckpointsRequest { + // pagination defines whether to have the pagination in the request + cosmos.base.query.v1beta1.PageRequest pagination = 1; +} + +// QueryRawCheckpointsResponse is the response type for the Query/RawCheckpoints +// RPC method. +message QueryRawCheckpointsResponse { + // the order is going from the newest to oldest based on the epoch number + repeated RawCheckpointWithMeta raw_checkpoints = 1; + + // pagination defines the pagination in the response. + cosmos.base.query.v1beta1.PageResponse pagination = 2; +} + // QueryBlsPublicKeyListRequest is the request type for the Query/BlsPublicKeys // RPC method. message QueryBlsPublicKeyListRequest { diff --git a/test/e2e/configurer/chain/commands.go b/test/e2e/configurer/chain/commands.go index 5023c1aa6..6b1364fcb 100644 --- a/test/e2e/configurer/chain/commands.go +++ b/test/e2e/configurer/chain/commands.go @@ -7,9 +7,12 @@ import ( "math/rand" "time" + "github.com/cosmos/cosmos-sdk/types/bech32" + + sdkquerytypes "github.com/cosmos/cosmos-sdk/types/query" + btccheckpointtypes "github.com/babylonchain/babylon/x/btccheckpoint/types" cttypes "github.com/babylonchain/babylon/x/checkpointing/types" - "github.com/cosmos/cosmos-sdk/types/bech32" txformat "github.com/babylonchain/babylon/btctxformatter" bbn "github.com/babylonchain/babylon/types" @@ -97,50 +100,46 @@ func (n *NodeConfig) InsertProofs(p1 *btccheckpointtypes.BTCSpvProof, p2 *btcche n.LogActionF("successfully inserted btc spv proofs") } -func (n *NodeConfig) FinalizeSealedEpochs(startingEpoch uint64, lastEpoch uint64) { - n.LogActionF("start finalizing epoch starting from %d", startingEpoch) +func (n *NodeConfig) FinalizeSealedEpochs(startEpoch uint64, lastEpoch uint64) { + n.LogActionF("start finalizing epochs from %d to %d", startEpoch, lastEpoch) // Random source for the generation of BTC data r := rand.New(rand.NewSource(time.Now().Unix())) madeProgress := false - currEpoch := startingEpoch - for { - if currEpoch > lastEpoch { - break - } - checkpoint, err := n.QueryCheckpointForEpoch(currEpoch) + pageLimit := lastEpoch - startEpoch + 1 + pagination := &sdkquerytypes.PageRequest{ + Key: cttypes.CkptsObjectKey(startEpoch), + Limit: pageLimit, + } - require.NoError(n.t, err) + resp, err := n.QueryRawCheckpoints(pagination) + require.NoError(n.t, err) + require.Equal(n.t, int(pageLimit), len(resp.RawCheckpoints)) - // can only finalize sealed checkpoints - if checkpoint.Status != cttypes.Sealed { - return - } + for _, checkpoint := range resp.RawCheckpoints { + require.Equal(n.t, checkpoint.Status, cttypes.Sealed) currentBtcTip, err := n.QueryTip() - require.NoError(n.t, err) _, c, err := bech32.DecodeAndConvert(n.PublicAddress) - require.NoError(n.t, err) btcCheckpoint, err := cttypes.FromRawCkptToBTCCkpt(checkpoint.Ckpt, c) + require.NoError(n.t, err) + babylonTagBytes, err := hex.DecodeString(initialization.BabylonOpReturnTag) require.NoError(n.t, err) - babylonTagBytes, _ := hex.DecodeString(initialization.BabylonOpReturnTag) p1, p2, err := txformat.EncodeCheckpointData( - txformat.BabylonTag(babylonTagBytes), + babylonTagBytes, txformat.CurrentVersion, btcCheckpoint, ) - require.NoError(n.t, err) opReturn1 := datagen.CreateBlockWithTransaction(r, currentBtcTip.Header.ToBlockHeader(), p1) - opReturn2 := datagen.CreateBlockWithTransaction(r, opReturn1.HeaderBytes.ToBlockHeader(), p2) n.InsertHeader(&opReturn1.HeaderBytes) @@ -148,13 +147,12 @@ func (n *NodeConfig) FinalizeSealedEpochs(startingEpoch uint64, lastEpoch uint64 n.InsertProofs(opReturn1.SpvProof, opReturn2.SpvProof) n.WaitForCondition(func() bool { - ckpt, err := n.QueryCheckpointForEpoch(currEpoch) + ckpt, err := n.QueryRawCheckpoint(checkpoint.Ckpt.EpochNum) require.NoError(n.t, err) return ckpt.Status == cttypes.Submitted }, "Checkpoint should be submitted ") madeProgress = true - currEpoch++ } if madeProgress { diff --git a/test/e2e/configurer/chain/queries.go b/test/e2e/configurer/chain/queries.go index b6764c4c2..c832f5135 100644 --- a/test/e2e/configurer/chain/queries.go +++ b/test/e2e/configurer/chain/queries.go @@ -2,14 +2,17 @@ package chain import ( "context" + "encoding/base64" "encoding/json" "fmt" "io" "net/http" "net/url" + "strconv" "time" sdkmath "cosmossdk.io/math" + "github.com/cosmos/cosmos-sdk/types/query" tmabcitypes "github.com/cometbft/cometbft/abci/types" sdk "github.com/cosmos/cosmos-sdk/types" @@ -142,7 +145,7 @@ func (n *NodeConfig) QueryListSnapshots() ([]*tmabcitypes.Snapshot, error) { // return contractsResponse.Contracts, nil // } -func (n *NodeConfig) QueryCheckpointForEpoch(epoch uint64) (*ct.RawCheckpointWithMeta, error) { +func (n *NodeConfig) QueryRawCheckpoint(epoch uint64) (*ct.RawCheckpointWithMeta, error) { path := fmt.Sprintf("babylon/checkpointing/v1/raw_checkpoint/%d", epoch) bz, err := n.QueryGRPCGateway(path, url.Values{}) require.NoError(n.t, err) @@ -155,6 +158,24 @@ func (n *NodeConfig) QueryCheckpointForEpoch(epoch uint64) (*ct.RawCheckpointWit return checkpointingResponse.RawCheckpoint, nil } +func (n *NodeConfig) QueryRawCheckpoints(pagination *query.PageRequest) (*ct.QueryRawCheckpointsResponse, error) { + queryParams := url.Values{} + if pagination != nil { + queryParams.Set("pagination.key", base64.URLEncoding.EncodeToString(pagination.Key)) + queryParams.Set("pagination.limit", strconv.Itoa(int(pagination.Limit))) + } + + bz, err := n.QueryGRPCGateway("babylon/checkpointing/v1/raw_checkpoints", queryParams) + require.NoError(n.t, err) + + var checkpointingResponse ct.QueryRawCheckpointsResponse + if err := util.Cdc.UnmarshalJSON(bz, &checkpointingResponse); err != nil { + return nil, err + } + + return &checkpointingResponse, nil +} + func (n *NodeConfig) QueryBtcBaseHeader() (*blc.BTCHeaderInfo, error) { bz, err := n.QueryGRPCGateway("babylon/btclightclient/v1/baseheader", url.Values{}) require.NoError(n.t, err) diff --git a/test/e2e/e2e_test.go b/test/e2e/e2e_test.go index 8c29d1b64..b5e69cf9a 100644 --- a/test/e2e/e2e_test.go +++ b/test/e2e/e2e_test.go @@ -23,7 +23,6 @@ func (s *IntegrationTestSuite) TestConnectIbc() { func (s *IntegrationTestSuite) TestIbcCheckpointing() { chainA := s.configurer.GetChainConfig(0) - chainA.WaitUntilHeight(35) nonValidatorNode, err := chainA.GetNodeAtIndex(2) @@ -42,7 +41,7 @@ func (s *IntegrationTestSuite) TestIbcCheckpointing() { nonValidatorNode.FinalizeSealedEpochs(startEpochNum, endEpochNum) - endEpoch, err := nonValidatorNode.QueryCheckpointForEpoch(endEpochNum) + endEpoch, err := nonValidatorNode.QueryRawCheckpoint(endEpochNum) s.NoError(err) s.Equal(endEpoch.Status, ct.Finalized) diff --git a/x/checkpointing/client/cli/query.go b/x/checkpointing/client/cli/query.go index 1546c99d9..76b89bb05 100644 --- a/x/checkpointing/client/cli/query.go +++ b/x/checkpointing/client/cli/query.go @@ -27,6 +27,7 @@ func GetQueryCmd(queryRoute string) *cobra.Command { } cmd.AddCommand(CmdRawCheckpoint()) cmd.AddCommand(CmdRawCheckpointList()) + cmd.AddCommand(CmdRawCheckpoints()) return cmd } @@ -97,3 +98,36 @@ func CmdRawCheckpoint() *cobra.Command { return cmd } + +// CmdRawCheckpoints defines the cobra command to query the raw checkpoints +func CmdRawCheckpoints() *cobra.Command { + cmd := &cobra.Command{ + Use: "raw-checkpoints", + Short: "retrieve the checkpoints for a epoch range", + Args: cobra.NoArgs, + RunE: func(cmd *cobra.Command, args []string) error { + clientCtx := client.GetClientContextFromCmd(cmd) + + queryClient := types.NewQueryClient(clientCtx) + + pageReq, err := client.ReadPageRequest(cmd.Flags()) + if err != nil { + return err + } + + res, err := queryClient.RawCheckpoints(context.Background(), &types.QueryRawCheckpointsRequest{ + Pagination: pageReq, + }) + if err != nil { + return err + } + + return clientCtx.PrintProto(res) + }, + } + + flags.AddQueryFlagsToCmd(cmd) + flags.AddPaginationFlagsToCmd(cmd, "raw-checkpoints") + + return cmd +} diff --git a/x/checkpointing/keeper/grpc_query_checkpoint.go b/x/checkpointing/keeper/grpc_query_checkpoint.go index 120a03f6d..94107561e 100644 --- a/x/checkpointing/keeper/grpc_query_checkpoint.go +++ b/x/checkpointing/keeper/grpc_query_checkpoint.go @@ -4,11 +4,12 @@ import ( "context" "fmt" - "github.com/babylonchain/babylon/x/checkpointing/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/query" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" + + "github.com/babylonchain/babylon/x/checkpointing/types" ) var _ types.QueryServer = Keeper{} @@ -60,6 +61,29 @@ func (k Keeper) RawCheckpoint(ctx context.Context, req *types.QueryRawCheckpoint return &types.QueryRawCheckpointResponse{RawCheckpoint: ckptWithMeta}, nil } +// RawCheckpoints returns checkpoints for given epoch range specified in pagination params +func (k Keeper) RawCheckpoints(ctx context.Context, req *types.QueryRawCheckpointsRequest) (*types.QueryRawCheckpointsResponse, error) { + if req == nil { + return nil, status.Error(codes.InvalidArgument, "invalid request") + } + + sdkCtx := sdk.UnwrapSDKContext(ctx) + store := k.CheckpointsState(sdkCtx).checkpoints + + var checkpointList []*types.RawCheckpointWithMeta + pageRes, err := query.Paginate(store, req.Pagination, func(key, value []byte) error { + var ckptWithMeta types.RawCheckpointWithMeta + k.cdc.MustUnmarshal(value, &ckptWithMeta) + checkpointList = append(checkpointList, &ckptWithMeta) + return nil + }) + if err != nil { + return nil, err + } + + return &types.QueryRawCheckpointsResponse{RawCheckpoints: checkpointList, Pagination: pageRes}, nil +} + // EpochStatus returns the status of the checkpoint at a given epoch func (k Keeper) EpochStatus(ctx context.Context, req *types.QueryEpochStatusRequest) (*types.QueryEpochStatusResponse, error) { if req == nil { diff --git a/x/checkpointing/keeper/grpc_query_checkpoint_test.go b/x/checkpointing/keeper/grpc_query_checkpoint_test.go index a60aeb537..39a029973 100644 --- a/x/checkpointing/keeper/grpc_query_checkpoint_test.go +++ b/x/checkpointing/keeper/grpc_query_checkpoint_test.go @@ -2,21 +2,25 @@ package keeper_test import ( "context" - "github.com/babylonchain/babylon/x/checkpointing/keeper" - "github.com/cosmos/cosmos-sdk/types/query" "math/rand" "testing" + "github.com/cosmos/cosmos-sdk/types/query" + + "github.com/babylonchain/babylon/x/checkpointing/keeper" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/golang/mock/gomock" + "github.com/babylonchain/babylon/testutil/mocks" "github.com/babylonchain/babylon/x/checkpointing/types" epochingtypes "github.com/babylonchain/babylon/x/epoching/types" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/golang/mock/gomock" - "github.com/babylonchain/babylon/testutil/datagen" - testkeeper "github.com/babylonchain/babylon/testutil/keeper" "github.com/cosmos/cosmos-sdk/client" "github.com/stretchr/testify/require" + + "github.com/babylonchain/babylon/testutil/datagen" + testkeeper "github.com/babylonchain/babylon/testutil/keeper" ) func FuzzQueryEpoch(f *testing.F) { @@ -47,6 +51,39 @@ func FuzzQueryEpoch(f *testing.F) { }) } +func FuzzQueryRawCheckpoints(f *testing.F) { + datagen.AddRandomSeedsToFuzzer(f, 10) + f.Fuzz(func(t *testing.T, seed int64) { + r := rand.New(rand.NewSource(seed)) + ckptKeeper, ctx, _ := testkeeper.CheckpointingKeeper(t, nil, nil, client.Context{}) + sdkCtx := sdk.WrapSDKContext(ctx) + + // add a random number of checkpoints + checkpoints := datagen.GenRandomSequenceRawCheckpointsWithMeta(r) + for _, ckpt := range checkpoints { + err := ckptKeeper.AddRawCheckpoint( + ctx, + ckpt, + ) + require.NoError(t, err) + } + + // test querying raw checkpoints with epoch range in pagination params + startEpoch := checkpoints[0].Ckpt.EpochNum + endEpoch := checkpoints[len(checkpoints)-1].Ckpt.EpochNum + pageLimit := endEpoch - startEpoch + 1 + + pagination := &query.PageRequest{Key: types.CkptsObjectKey(startEpoch), Limit: pageLimit} + ckptResp, err := ckptKeeper.RawCheckpoints(sdkCtx, &types.QueryRawCheckpointsRequest{Pagination: pagination}) + require.NoError(t, err) + require.Equal(t, int(pageLimit), len(ckptResp.RawCheckpoints)) + require.Nil(t, ckptResp.Pagination.NextKey) + for i, ckpt := range ckptResp.RawCheckpoints { + require.Equal(t, checkpoints[i], ckpt) + } + }) +} + func FuzzQueryStatusCount(f *testing.F) { datagen.AddRandomSeedsToFuzzer(f, 10) f.Fuzz(func(t *testing.T, seed int64) { diff --git a/x/checkpointing/types/query.pb.go b/x/checkpointing/types/query.pb.go index f74b0e6f3..96dcf8fc1 100644 --- a/x/checkpointing/types/query.pb.go +++ b/x/checkpointing/types/query.pb.go @@ -234,6 +234,109 @@ func (m *QueryRawCheckpointResponse) GetRawCheckpoint() *RawCheckpointWithMeta { return nil } +// QueryRawCheckpointsRequest is the request type for the Query/RawCheckpoints +// RPC method. +type QueryRawCheckpointsRequest struct { + // pagination defines whether to have the pagination in the request + Pagination *query.PageRequest `protobuf:"bytes,1,opt,name=pagination,proto3" json:"pagination,omitempty"` +} + +func (m *QueryRawCheckpointsRequest) Reset() { *m = QueryRawCheckpointsRequest{} } +func (m *QueryRawCheckpointsRequest) String() string { return proto.CompactTextString(m) } +func (*QueryRawCheckpointsRequest) ProtoMessage() {} +func (*QueryRawCheckpointsRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_113f1ca5c3c2ca44, []int{4} +} +func (m *QueryRawCheckpointsRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryRawCheckpointsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryRawCheckpointsRequest.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 *QueryRawCheckpointsRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryRawCheckpointsRequest.Merge(m, src) +} +func (m *QueryRawCheckpointsRequest) XXX_Size() int { + return m.Size() +} +func (m *QueryRawCheckpointsRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryRawCheckpointsRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryRawCheckpointsRequest proto.InternalMessageInfo + +func (m *QueryRawCheckpointsRequest) GetPagination() *query.PageRequest { + if m != nil { + return m.Pagination + } + return nil +} + +// QueryRawCheckpointsResponse is the response type for the Query/RawCheckpoints +// RPC method. +type QueryRawCheckpointsResponse struct { + // the order is going from the newest to oldest based on the epoch number + RawCheckpoints []*RawCheckpointWithMeta `protobuf:"bytes,1,rep,name=raw_checkpoints,json=rawCheckpoints,proto3" json:"raw_checkpoints,omitempty"` + // pagination defines the pagination in the response. + Pagination *query.PageResponse `protobuf:"bytes,2,opt,name=pagination,proto3" json:"pagination,omitempty"` +} + +func (m *QueryRawCheckpointsResponse) Reset() { *m = QueryRawCheckpointsResponse{} } +func (m *QueryRawCheckpointsResponse) String() string { return proto.CompactTextString(m) } +func (*QueryRawCheckpointsResponse) ProtoMessage() {} +func (*QueryRawCheckpointsResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_113f1ca5c3c2ca44, []int{5} +} +func (m *QueryRawCheckpointsResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryRawCheckpointsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryRawCheckpointsResponse.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 *QueryRawCheckpointsResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryRawCheckpointsResponse.Merge(m, src) +} +func (m *QueryRawCheckpointsResponse) XXX_Size() int { + return m.Size() +} +func (m *QueryRawCheckpointsResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryRawCheckpointsResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryRawCheckpointsResponse proto.InternalMessageInfo + +func (m *QueryRawCheckpointsResponse) GetRawCheckpoints() []*RawCheckpointWithMeta { + if m != nil { + return m.RawCheckpoints + } + return nil +} + +func (m *QueryRawCheckpointsResponse) GetPagination() *query.PageResponse { + if m != nil { + return m.Pagination + } + return nil +} + // QueryBlsPublicKeyListRequest is the request type for the Query/BlsPublicKeys // RPC method. type QueryBlsPublicKeyListRequest struct { @@ -247,7 +350,7 @@ func (m *QueryBlsPublicKeyListRequest) Reset() { *m = QueryBlsPublicKeyL func (m *QueryBlsPublicKeyListRequest) String() string { return proto.CompactTextString(m) } func (*QueryBlsPublicKeyListRequest) ProtoMessage() {} func (*QueryBlsPublicKeyListRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_113f1ca5c3c2ca44, []int{4} + return fileDescriptor_113f1ca5c3c2ca44, []int{6} } func (m *QueryBlsPublicKeyListRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -302,7 +405,7 @@ func (m *QueryBlsPublicKeyListResponse) Reset() { *m = QueryBlsPublicKey func (m *QueryBlsPublicKeyListResponse) String() string { return proto.CompactTextString(m) } func (*QueryBlsPublicKeyListResponse) ProtoMessage() {} func (*QueryBlsPublicKeyListResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_113f1ca5c3c2ca44, []int{5} + return fileDescriptor_113f1ca5c3c2ca44, []int{7} } func (m *QueryBlsPublicKeyListResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -355,7 +458,7 @@ func (m *QueryEpochStatusRequest) Reset() { *m = QueryEpochStatusRequest func (m *QueryEpochStatusRequest) String() string { return proto.CompactTextString(m) } func (*QueryEpochStatusRequest) ProtoMessage() {} func (*QueryEpochStatusRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_113f1ca5c3c2ca44, []int{6} + return fileDescriptor_113f1ca5c3c2ca44, []int{8} } func (m *QueryEpochStatusRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -401,7 +504,7 @@ func (m *QueryEpochStatusResponse) Reset() { *m = QueryEpochStatusRespon func (m *QueryEpochStatusResponse) String() string { return proto.CompactTextString(m) } func (*QueryEpochStatusResponse) ProtoMessage() {} func (*QueryEpochStatusResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_113f1ca5c3c2ca44, []int{7} + return fileDescriptor_113f1ca5c3c2ca44, []int{9} } func (m *QueryEpochStatusResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -449,7 +552,7 @@ func (m *QueryRecentEpochStatusCountRequest) Reset() { *m = QueryRecentE func (m *QueryRecentEpochStatusCountRequest) String() string { return proto.CompactTextString(m) } func (*QueryRecentEpochStatusCountRequest) ProtoMessage() {} func (*QueryRecentEpochStatusCountRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_113f1ca5c3c2ca44, []int{8} + return fileDescriptor_113f1ca5c3c2ca44, []int{10} } func (m *QueryRecentEpochStatusCountRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -497,7 +600,7 @@ func (m *QueryRecentEpochStatusCountResponse) Reset() { *m = QueryRecent func (m *QueryRecentEpochStatusCountResponse) String() string { return proto.CompactTextString(m) } func (*QueryRecentEpochStatusCountResponse) ProtoMessage() {} func (*QueryRecentEpochStatusCountResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_113f1ca5c3c2ca44, []int{9} + return fileDescriptor_113f1ca5c3c2ca44, []int{11} } func (m *QueryRecentEpochStatusCountResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -557,7 +660,7 @@ func (m *QueryLastCheckpointWithStatusRequest) Reset() { *m = QueryLastC func (m *QueryLastCheckpointWithStatusRequest) String() string { return proto.CompactTextString(m) } func (*QueryLastCheckpointWithStatusRequest) ProtoMessage() {} func (*QueryLastCheckpointWithStatusRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_113f1ca5c3c2ca44, []int{10} + return fileDescriptor_113f1ca5c3c2ca44, []int{12} } func (m *QueryLastCheckpointWithStatusRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -603,7 +706,7 @@ func (m *QueryLastCheckpointWithStatusResponse) Reset() { *m = QueryLast func (m *QueryLastCheckpointWithStatusResponse) String() string { return proto.CompactTextString(m) } func (*QueryLastCheckpointWithStatusResponse) ProtoMessage() {} func (*QueryLastCheckpointWithStatusResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_113f1ca5c3c2ca44, []int{11} + return fileDescriptor_113f1ca5c3c2ca44, []int{13} } func (m *QueryLastCheckpointWithStatusResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -644,6 +747,8 @@ func init() { proto.RegisterType((*QueryRawCheckpointListResponse)(nil), "babylon.checkpointing.v1.QueryRawCheckpointListResponse") proto.RegisterType((*QueryRawCheckpointRequest)(nil), "babylon.checkpointing.v1.QueryRawCheckpointRequest") proto.RegisterType((*QueryRawCheckpointResponse)(nil), "babylon.checkpointing.v1.QueryRawCheckpointResponse") + proto.RegisterType((*QueryRawCheckpointsRequest)(nil), "babylon.checkpointing.v1.QueryRawCheckpointsRequest") + proto.RegisterType((*QueryRawCheckpointsResponse)(nil), "babylon.checkpointing.v1.QueryRawCheckpointsResponse") proto.RegisterType((*QueryBlsPublicKeyListRequest)(nil), "babylon.checkpointing.v1.QueryBlsPublicKeyListRequest") proto.RegisterType((*QueryBlsPublicKeyListResponse)(nil), "babylon.checkpointing.v1.QueryBlsPublicKeyListResponse") proto.RegisterType((*QueryEpochStatusRequest)(nil), "babylon.checkpointing.v1.QueryEpochStatusRequest") @@ -660,63 +765,66 @@ func init() { } var fileDescriptor_113f1ca5c3c2ca44 = []byte{ - // 886 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x56, 0x41, 0x6f, 0xe3, 0x44, - 0x14, 0xae, 0x53, 0x76, 0x45, 0x5e, 0xd8, 0x52, 0x46, 0x2b, 0x36, 0x78, 0x97, 0xb0, 0x32, 0xa5, - 0x2d, 0x95, 0x6a, 0x2b, 0x69, 0x93, 0x46, 0xa5, 0x2d, 0x52, 0xaa, 0xc2, 0xa1, 0xa5, 0x14, 0x23, - 0x15, 0xc4, 0x81, 0x68, 0xec, 0x8e, 0x12, 0x53, 0xc7, 0x76, 0x33, 0xe3, 0x84, 0xa8, 0xea, 0x05, - 0xfe, 0x00, 0x12, 0x12, 0x7f, 0x02, 0x71, 0xe0, 0xc6, 0x19, 0x2e, 0x1c, 0x10, 0xaa, 0xc4, 0x05, - 0x89, 0x0b, 0x6a, 0xf9, 0x21, 0xc8, 0xe3, 0x49, 0x13, 0x3b, 0x75, 0x9d, 0x74, 0x73, 0x4b, 0x9e, - 0xdf, 0x37, 0xef, 0xfb, 0xde, 0xbc, 0xf7, 0xd9, 0xb0, 0x60, 0x60, 0xa3, 0x67, 0xbb, 0x8e, 0x66, - 0x36, 0x89, 0x79, 0xea, 0xb9, 0x96, 0xc3, 0x2c, 0xa7, 0xa1, 0x75, 0x8a, 0xda, 0x99, 0x4f, 0xda, - 0x3d, 0xd5, 0x6b, 0xbb, 0xcc, 0x45, 0x79, 0x91, 0xa5, 0x46, 0xb2, 0xd4, 0x4e, 0x51, 0x5e, 0x4c, - 0xc4, 0x1b, 0x36, 0xad, 0x9f, 0x12, 0x71, 0x82, 0xbc, 0x62, 0xba, 0xb4, 0xe5, 0x52, 0xcd, 0xc0, - 0x94, 0x84, 0x47, 0x6b, 0x9d, 0xa2, 0x41, 0x18, 0x2e, 0x6a, 0x1e, 0x6e, 0x58, 0x0e, 0x66, 0x96, - 0xeb, 0x88, 0xdc, 0x67, 0x0d, 0xd7, 0x6d, 0xd8, 0x44, 0xc3, 0x9e, 0xa5, 0x61, 0xc7, 0x71, 0x19, - 0x7f, 0x48, 0xc5, 0xd3, 0x77, 0x13, 0x2b, 0x0e, 0x02, 0x61, 0xaa, 0xf2, 0xa3, 0x04, 0x6f, 0x7e, - 0x12, 0xd4, 0xd2, 0x71, 0x77, 0xf7, 0xe6, 0xe1, 0x81, 0x45, 0x99, 0x4e, 0xce, 0x7c, 0x42, 0x19, - 0xaa, 0xc1, 0x43, 0xca, 0x30, 0xf3, 0x69, 0x5e, 0x7a, 0x2e, 0x2d, 0xcf, 0x95, 0x56, 0xd4, 0x24, - 0xa5, 0xea, 0xe0, 0x80, 0x4f, 0x39, 0x42, 0x17, 0x48, 0xf4, 0x01, 0xc0, 0x40, 0x42, 0x3e, 0xf3, - 0x5c, 0x5a, 0xce, 0x95, 0x16, 0xd5, 0x50, 0xaf, 0x1a, 0xe8, 0x55, 0xc3, 0x56, 0x0a, 0xbd, 0xea, - 0x11, 0x6e, 0x10, 0x51, 0x5f, 0x1f, 0x42, 0x2a, 0xbf, 0x49, 0x50, 0x48, 0x62, 0x4b, 0x3d, 0xd7, - 0xa1, 0x04, 0x7d, 0x0e, 0xaf, 0xb6, 0x71, 0xb7, 0x3e, 0xe0, 0x16, 0xf0, 0x9e, 0x5d, 0xce, 0x95, - 0xb4, 0x64, 0xde, 0x91, 0xd3, 0x3e, 0xb3, 0x58, 0xf3, 0x23, 0xc2, 0xb0, 0x3e, 0xd7, 0x1e, 0x0e, - 0x53, 0xf4, 0xe1, 0x2d, 0x22, 0x96, 0x52, 0x45, 0x84, 0xb4, 0x22, 0x2a, 0xaa, 0xf0, 0xc6, 0xa8, - 0x88, 0x7e, 0xbb, 0x9f, 0x42, 0x96, 0x78, 0xae, 0xd9, 0xac, 0x3b, 0x7e, 0x8b, 0x77, 0xfc, 0x25, - 0xfd, 0x65, 0x1e, 0x38, 0xf4, 0x5b, 0x0a, 0x03, 0xf9, 0x36, 0xa4, 0x90, 0x7e, 0x0c, 0x73, 0x51, - 0xe9, 0x1c, 0x7f, 0x0f, 0xe5, 0x8f, 0x22, 0xca, 0x95, 0x6f, 0x25, 0x78, 0xc6, 0xcb, 0xd6, 0x6c, - 0x7a, 0xe4, 0x1b, 0xb6, 0x65, 0xee, 0x93, 0xde, 0xf0, 0x88, 0xdc, 0xc5, 0x79, 0x6a, 0x77, 0xff, - 0x67, 0x7f, 0x52, 0x47, 0x59, 0x08, 0xfd, 0x27, 0xf0, 0xa4, 0x83, 0x6d, 0xeb, 0x04, 0x33, 0xb7, - 0x5d, 0xef, 0x5a, 0xac, 0x59, 0x17, 0x0b, 0xd6, 0x1f, 0x81, 0xd5, 0xe4, 0x46, 0x1c, 0xf7, 0x81, - 0x41, 0x13, 0x6a, 0x36, 0xdd, 0x27, 0x3d, 0xfd, 0x71, 0x67, 0x34, 0x38, 0xc5, 0x31, 0xa8, 0xc0, - 0x13, 0xae, 0x67, 0x2f, 0xe8, 0x94, 0x58, 0x98, 0x71, 0x86, 0xe0, 0x4b, 0xc8, 0x8f, 0xe2, 0x44, - 0x0b, 0xa6, 0xb0, 0xac, 0xca, 0x1e, 0x28, 0xe1, 0x90, 0x11, 0x93, 0x38, 0x6c, 0xa8, 0xca, 0xae, - 0xeb, 0x0f, 0xe6, 0xf4, 0x2d, 0xc8, 0x85, 0x14, 0xcd, 0x20, 0x2a, 0x48, 0x02, 0x0f, 0xf1, 0x3c, - 0xe5, 0x87, 0x0c, 0xbc, 0x7d, 0xe7, 0x39, 0x82, 0xf2, 0x53, 0xc8, 0x32, 0xcb, 0xab, 0x73, 0x64, - 0x5f, 0x2b, 0xb3, 0x3c, 0x9e, 0x1f, 0xaf, 0x92, 0x89, 0x57, 0x41, 0x67, 0xf0, 0x4a, 0x48, 0x5b, - 0x64, 0xcc, 0xf2, 0x8b, 0x3e, 0x4c, 0x96, 0x3d, 0x06, 0x25, 0x75, 0x28, 0xb6, 0xe7, 0xb0, 0x76, - 0x4f, 0xcf, 0xd1, 0x41, 0x44, 0xde, 0x81, 0xf9, 0x78, 0x02, 0x9a, 0x87, 0xd9, 0x53, 0xd2, 0xe3, - 0xf4, 0xb3, 0x7a, 0xf0, 0x13, 0x3d, 0x86, 0x07, 0x1d, 0x6c, 0xfb, 0x44, 0x70, 0x0e, 0xff, 0x6c, - 0x66, 0xaa, 0x92, 0xf2, 0x15, 0x2c, 0x70, 0x12, 0x07, 0x98, 0xb2, 0xe8, 0xf2, 0x45, 0x87, 0x60, - 0x1a, 0x77, 0xd9, 0x85, 0x77, 0x52, 0x6a, 0x89, 0x5b, 0x38, 0x4c, 0xf0, 0x8e, 0xa5, 0x31, 0xbd, - 0x23, 0xe6, 0x19, 0xa5, 0x9f, 0xb2, 0xf0, 0x80, 0x57, 0x46, 0xbf, 0x4a, 0xf0, 0xda, 0x88, 0x5d, - 0xa3, 0x8d, 0xb4, 0x1b, 0x4a, 0x78, 0x1d, 0xc9, 0xd5, 0xc9, 0x81, 0xa1, 0x44, 0x65, 0xf3, 0x9b, - 0xbf, 0xfe, 0xfb, 0x3e, 0xb3, 0x8e, 0x4a, 0x5a, 0xe2, 0xeb, 0x31, 0xf6, 0xe6, 0xd0, 0xce, 0xc3, - 0x36, 0x5e, 0xa0, 0x5f, 0x24, 0x78, 0x14, 0x39, 0x19, 0xad, 0x4d, 0xc2, 0xa3, 0x4f, 0x7e, 0x7d, - 0x32, 0x90, 0x20, 0xbe, 0xc5, 0x89, 0x57, 0xd0, 0xfa, 0xb8, 0xc4, 0xb5, 0xf3, 0x1b, 0xf7, 0xb8, - 0x08, 0xfa, 0x3f, 0x1f, 0xb7, 0x4c, 0x54, 0x49, 0x21, 0x92, 0xe0, 0xf4, 0xf2, 0xc6, 0xc4, 0x38, - 0xa1, 0x61, 0x9b, 0x6b, 0xd8, 0x40, 0x65, 0xed, 0xce, 0xaf, 0x21, 0x8f, 0x83, 0xb9, 0x67, 0x47, - 0x44, 0xfc, 0x2c, 0x41, 0x6e, 0x68, 0x5d, 0x51, 0x31, 0x85, 0xc7, 0xa8, 0xa7, 0xca, 0xa5, 0x49, - 0x20, 0x82, 0xf5, 0x7b, 0x9c, 0x75, 0x19, 0xad, 0x25, 0xb3, 0xe6, 0x24, 0x23, 0x64, 0x35, 0xf1, - 0xd1, 0xf3, 0x87, 0x04, 0xaf, 0xdf, 0x6e, 0x34, 0x68, 0xeb, 0x9e, 0xfe, 0x14, 0x2a, 0xd9, 0x7e, - 0x21, 0x77, 0x53, 0xca, 0x5c, 0x94, 0x86, 0x56, 0xd3, 0x44, 0x6d, 0x0e, 0x3b, 0x2b, 0xfa, 0x47, - 0x82, 0x7c, 0x92, 0x8d, 0xa0, 0x9d, 0x14, 0x4a, 0x29, 0x5e, 0x27, 0xbf, 0x7f, 0x6f, 0xbc, 0x10, - 0xb5, 0xc3, 0x45, 0x55, 0x51, 0x25, 0x59, 0x94, 0x8d, 0x29, 0xab, 0xc7, 0x17, 0x45, 0x2c, 0x78, - 0xed, 0xe3, 0xdf, 0xaf, 0x0a, 0xd2, 0xe5, 0x55, 0x41, 0xfa, 0xf7, 0xaa, 0x20, 0x7d, 0x77, 0x5d, - 0x98, 0xb9, 0xbc, 0x2e, 0xcc, 0xfc, 0x7d, 0x5d, 0x98, 0xf9, 0xa2, 0xdc, 0xb0, 0x58, 0xd3, 0x37, - 0x54, 0xd3, 0x6d, 0xf5, 0xcf, 0x36, 0x9b, 0xd8, 0x72, 0x6e, 0x0a, 0x7d, 0x1d, 0x2b, 0xc5, 0x7a, - 0x1e, 0xa1, 0xc6, 0x43, 0xfe, 0x7d, 0xbd, 0xf6, 0x7f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x26, 0xf7, - 0x47, 0x75, 0x3e, 0x0c, 0x00, 0x00, + // 938 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x97, 0xd1, 0x6f, 0xdb, 0x44, + 0x1c, 0xc7, 0x7b, 0x29, 0x9b, 0xe8, 0x2f, 0xac, 0x94, 0xd3, 0xc4, 0x82, 0x3b, 0xc2, 0x64, 0xc6, + 0xd6, 0x0d, 0xcd, 0x56, 0xd2, 0xa6, 0x8d, 0xca, 0x56, 0xa4, 0x4c, 0x85, 0x87, 0x8d, 0x32, 0x8c, + 0x34, 0x10, 0x0f, 0x44, 0x67, 0xf7, 0x94, 0x98, 0x3a, 0xb6, 0x9b, 0x3b, 0x27, 0x44, 0xd3, 0x5e, + 0xe0, 0x1f, 0x40, 0x42, 0xe2, 0x9f, 0xe0, 0x05, 0xde, 0x78, 0x44, 0xf0, 0xc2, 0x03, 0x42, 0x93, + 0x78, 0x41, 0xe2, 0x65, 0x6a, 0xf9, 0x43, 0x90, 0xcf, 0xe7, 0x26, 0x76, 0xe2, 0x3a, 0x09, 0x79, + 0xe1, 0xad, 0x3d, 0xdf, 0xf7, 0x7e, 0x9f, 0xef, 0xef, 0x7c, 0xdf, 0x73, 0xe0, 0xba, 0x49, 0xcc, + 0x81, 0xe3, 0xb9, 0xba, 0xd5, 0xa6, 0xd6, 0x91, 0xef, 0xd9, 0x2e, 0xb7, 0xdd, 0x96, 0xde, 0xab, + 0xe8, 0xc7, 0x01, 0xed, 0x0e, 0x34, 0xbf, 0xeb, 0x71, 0x0f, 0x97, 0xe4, 0x2c, 0x2d, 0x31, 0x4b, + 0xeb, 0x55, 0x94, 0x1b, 0x99, 0x7a, 0xd3, 0x61, 0xcd, 0x23, 0x2a, 0x57, 0x50, 0x6e, 0x5b, 0x1e, + 0xeb, 0x78, 0x4c, 0x37, 0x09, 0xa3, 0xd1, 0xd2, 0x7a, 0xaf, 0x62, 0x52, 0x4e, 0x2a, 0xba, 0x4f, + 0x5a, 0xb6, 0x4b, 0xb8, 0xed, 0xb9, 0x72, 0xee, 0xd5, 0x96, 0xe7, 0xb5, 0x1c, 0xaa, 0x13, 0xdf, + 0xd6, 0x89, 0xeb, 0x7a, 0x5c, 0x3c, 0x64, 0xf2, 0xe9, 0xad, 0xcc, 0x8a, 0xc3, 0x81, 0x68, 0xaa, + 0xfa, 0x3d, 0x82, 0xd7, 0x3f, 0x0a, 0x6b, 0x19, 0xa4, 0x7f, 0xff, 0xec, 0xe1, 0x43, 0x9b, 0x71, + 0x83, 0x1e, 0x07, 0x94, 0x71, 0xdc, 0x80, 0x8b, 0x8c, 0x13, 0x1e, 0xb0, 0x12, 0xba, 0x86, 0x36, + 0x56, 0xab, 0xb7, 0xb5, 0x2c, 0xa7, 0xda, 0x70, 0x81, 0x8f, 0x85, 0xc2, 0x90, 0x4a, 0xfc, 0x1e, + 0xc0, 0xd0, 0x42, 0xa9, 0x70, 0x0d, 0x6d, 0x14, 0xab, 0x37, 0xb4, 0xc8, 0xaf, 0x16, 0xfa, 0xd5, + 0xa2, 0x56, 0x4a, 0xbf, 0xda, 0x23, 0xd2, 0xa2, 0xb2, 0xbe, 0x31, 0xa2, 0x54, 0x7f, 0x45, 0x50, + 0xce, 0xa2, 0x65, 0xbe, 0xe7, 0x32, 0x8a, 0x3f, 0x85, 0x97, 0xbb, 0xa4, 0xdf, 0x1c, 0xb2, 0x85, + 0xdc, 0xcb, 0x1b, 0xc5, 0xaa, 0x9e, 0xcd, 0x9d, 0x58, 0xed, 0x13, 0x9b, 0xb7, 0x3f, 0xa0, 0x9c, + 0x18, 0xab, 0xdd, 0xd1, 0x61, 0x86, 0xdf, 0x9f, 0x60, 0xe2, 0x66, 0xae, 0x89, 0x08, 0x2b, 0xe1, + 0xa2, 0x0e, 0xaf, 0x8d, 0x9b, 0x88, 0xdb, 0xbd, 0x0e, 0x2b, 0xd4, 0xf7, 0xac, 0x76, 0xd3, 0x0d, + 0x3a, 0xa2, 0xe3, 0x2f, 0x18, 0x2f, 0x8a, 0x81, 0x83, 0xa0, 0xa3, 0x72, 0x50, 0x26, 0x29, 0xa5, + 0xf5, 0xc7, 0xb0, 0x9a, 0xb4, 0x2e, 0xf4, 0x73, 0x38, 0xbf, 0x94, 0x70, 0xae, 0x1e, 0x4e, 0xaa, + 0xca, 0x62, 0xe0, 0xe4, 0xde, 0xa2, 0xb9, 0xf7, 0xf6, 0x67, 0x04, 0xeb, 0x13, 0xcb, 0xfc, 0x7f, + 0x36, 0xf6, 0x6b, 0x04, 0x57, 0x85, 0x85, 0x86, 0xc3, 0x1e, 0x05, 0xa6, 0x63, 0x5b, 0x0f, 0xe8, + 0x60, 0xf4, 0x2c, 0x9d, 0xb7, 0xb9, 0x0b, 0x3b, 0x24, 0x7f, 0xc4, 0x47, 0x7a, 0x9c, 0x42, 0xb6, + 0xf2, 0x10, 0xae, 0xf4, 0x88, 0x63, 0x1f, 0x12, 0xee, 0x75, 0x9b, 0x7d, 0x9b, 0xb7, 0x9b, 0x32, + 0x89, 0xe2, 0x96, 0xde, 0xc9, 0x6e, 0xe9, 0xe3, 0x58, 0x18, 0xb6, 0xb3, 0xe1, 0xb0, 0x07, 0x74, + 0x60, 0x5c, 0xee, 0x8d, 0x0f, 0x2e, 0xb0, 0xad, 0xdb, 0x70, 0x45, 0xf8, 0xd9, 0x0f, 0x3b, 0x25, + 0x93, 0x65, 0x9a, 0xd3, 0xf2, 0x39, 0x94, 0xc6, 0x75, 0xb2, 0x05, 0x0b, 0x48, 0x35, 0x75, 0x1f, + 0xd4, 0xe8, 0x85, 0xa5, 0x16, 0x75, 0xf9, 0x48, 0x95, 0xfb, 0x5e, 0x30, 0x3c, 0xd0, 0x6f, 0x40, + 0x31, 0x42, 0xb4, 0xc2, 0x51, 0x09, 0x09, 0x62, 0x48, 0xcc, 0x53, 0xbf, 0x2b, 0xc0, 0x9b, 0xe7, + 0xae, 0x23, 0x91, 0xd7, 0x61, 0x85, 0xdb, 0x7e, 0x53, 0x28, 0x63, 0xaf, 0xdc, 0xf6, 0xc5, 0xfc, + 0x74, 0x95, 0x42, 0xba, 0x0a, 0x3e, 0x86, 0x97, 0x22, 0x6c, 0x39, 0x63, 0x59, 0x6c, 0xf4, 0x41, + 0xb6, 0xed, 0x29, 0x90, 0xb4, 0x91, 0xb1, 0x7d, 0x97, 0x77, 0x07, 0x46, 0x91, 0x0d, 0x47, 0x94, + 0x3d, 0x58, 0x4b, 0x4f, 0xc0, 0x6b, 0xb0, 0x7c, 0x44, 0x07, 0x02, 0x7f, 0xc5, 0x08, 0xff, 0xc4, + 0x97, 0xe1, 0x42, 0x8f, 0x38, 0x01, 0x95, 0xcc, 0xd1, 0x3f, 0xbb, 0x85, 0x3a, 0x52, 0xbf, 0x80, + 0xeb, 0x02, 0xe2, 0x21, 0x61, 0x3c, 0x79, 0x8c, 0x93, 0x2f, 0xc1, 0x22, 0xf6, 0xb2, 0x0f, 0x6f, + 0xe5, 0xd4, 0x92, 0xbb, 0x70, 0x90, 0x11, 0xb2, 0x37, 0xa7, 0x4c, 0xa1, 0x54, 0xb8, 0x56, 0x9f, + 0x03, 0x5c, 0x10, 0x95, 0xf1, 0x2f, 0x08, 0x5e, 0x19, 0xbb, 0xd7, 0xf0, 0x4e, 0xde, 0x0e, 0x65, + 0xdc, 0xdb, 0x4a, 0x7d, 0x76, 0x61, 0x64, 0x51, 0xdd, 0xfd, 0xea, 0xcf, 0x7f, 0xbe, 0x2d, 0x6c, + 0xe1, 0xaa, 0x9e, 0xf9, 0x1d, 0x91, 0x4a, 0x62, 0xfd, 0x49, 0xd4, 0xc6, 0xa7, 0xf8, 0x27, 0x04, + 0x97, 0x12, 0x2b, 0xe3, 0xcd, 0x59, 0x38, 0x62, 0xf8, 0xad, 0xd9, 0x44, 0x12, 0xfc, 0xae, 0x00, + 0xdf, 0xc6, 0x5b, 0xd3, 0x82, 0xeb, 0x4f, 0xce, 0xd2, 0xe3, 0x29, 0xfe, 0x01, 0xc1, 0x6a, 0xf2, + 0xee, 0xc1, 0x33, 0x61, 0xc4, 0xef, 0xa3, 0x52, 0x9b, 0x51, 0x25, 0xe9, 0x2b, 0x82, 0xfe, 0x6d, + 0x7c, 0x6b, 0xea, 0xb6, 0x87, 0xaf, 0xcc, 0x5a, 0x3a, 0xe5, 0xf1, 0x76, 0x4e, 0xf9, 0x8c, 0xcb, + 0x49, 0xd9, 0x99, 0x59, 0x27, 0xc1, 0xef, 0x09, 0xf0, 0x1d, 0x5c, 0xd3, 0xcf, 0xfd, 0xd2, 0xf5, + 0x85, 0x58, 0x5c, 0x33, 0x89, 0xbe, 0xff, 0x88, 0xa0, 0x38, 0x92, 0x30, 0xb8, 0x92, 0xc3, 0x31, + 0x7e, 0x0d, 0x28, 0xd5, 0x59, 0x24, 0x92, 0xfa, 0x1d, 0x41, 0x5d, 0xc3, 0x9b, 0xd9, 0xd4, 0x02, + 0x32, 0x01, 0xab, 0xcb, 0x0f, 0xda, 0xdf, 0x11, 0xbc, 0x3a, 0x39, 0x1b, 0xf1, 0xdd, 0x39, 0x23, + 0x35, 0x72, 0x72, 0xef, 0x3f, 0x05, 0xb2, 0x5a, 0x13, 0xa6, 0x74, 0x7c, 0x27, 0xcf, 0xd4, 0xee, + 0xe8, 0x65, 0x80, 0xff, 0x46, 0x50, 0xca, 0x4a, 0x3e, 0xbc, 0x97, 0x83, 0x94, 0x13, 0xcf, 0xca, + 0xbb, 0x73, 0xeb, 0xa5, 0xa9, 0x3d, 0x61, 0xaa, 0x8e, 0xb7, 0xb3, 0x4d, 0x39, 0x84, 0xf1, 0x66, + 0xfa, 0x6c, 0xcb, 0x4c, 0x6a, 0x7c, 0xf8, 0xdb, 0x49, 0x19, 0x3d, 0x3b, 0x29, 0xa3, 0xe7, 0x27, + 0x65, 0xf4, 0xcd, 0x69, 0x79, 0xe9, 0xd9, 0x69, 0x79, 0xe9, 0xaf, 0xd3, 0xf2, 0xd2, 0x67, 0xb5, + 0x96, 0xcd, 0xdb, 0x81, 0xa9, 0x59, 0x5e, 0x27, 0x5e, 0xdb, 0x6a, 0x13, 0xdb, 0x3d, 0x2b, 0xf4, + 0x65, 0xaa, 0x14, 0x1f, 0xf8, 0x94, 0x99, 0x17, 0xc5, 0x6f, 0xa7, 0xcd, 0x7f, 0x03, 0x00, 0x00, + 0xff, 0xff, 0x27, 0x4c, 0x94, 0xaf, 0x1a, 0x0e, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -735,6 +843,8 @@ type QueryClient interface { RawCheckpointList(ctx context.Context, in *QueryRawCheckpointListRequest, opts ...grpc.CallOption) (*QueryRawCheckpointListResponse, error) // RawCheckpoint queries a checkpoints at a given epoch number. RawCheckpoint(ctx context.Context, in *QueryRawCheckpointRequest, opts ...grpc.CallOption) (*QueryRawCheckpointResponse, error) + // RawCheckpoints queries checkpoints for a epoch range specified in pagination params. + RawCheckpoints(ctx context.Context, in *QueryRawCheckpointsRequest, opts ...grpc.CallOption) (*QueryRawCheckpointsResponse, error) // BlsPublicKeyList queries a list of bls public keys of the validators at a // given epoch number. BlsPublicKeyList(ctx context.Context, in *QueryBlsPublicKeyListRequest, opts ...grpc.CallOption) (*QueryBlsPublicKeyListResponse, error) @@ -774,6 +884,15 @@ func (c *queryClient) RawCheckpoint(ctx context.Context, in *QueryRawCheckpointR return out, nil } +func (c *queryClient) RawCheckpoints(ctx context.Context, in *QueryRawCheckpointsRequest, opts ...grpc.CallOption) (*QueryRawCheckpointsResponse, error) { + out := new(QueryRawCheckpointsResponse) + err := c.cc.Invoke(ctx, "/babylon.checkpointing.v1.Query/RawCheckpoints", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *queryClient) BlsPublicKeyList(ctx context.Context, in *QueryBlsPublicKeyListRequest, opts ...grpc.CallOption) (*QueryBlsPublicKeyListResponse, error) { out := new(QueryBlsPublicKeyListResponse) err := c.cc.Invoke(ctx, "/babylon.checkpointing.v1.Query/BlsPublicKeyList", in, out, opts...) @@ -816,6 +935,8 @@ type QueryServer interface { RawCheckpointList(context.Context, *QueryRawCheckpointListRequest) (*QueryRawCheckpointListResponse, error) // RawCheckpoint queries a checkpoints at a given epoch number. RawCheckpoint(context.Context, *QueryRawCheckpointRequest) (*QueryRawCheckpointResponse, error) + // RawCheckpoints queries checkpoints for a epoch range specified in pagination params. + RawCheckpoints(context.Context, *QueryRawCheckpointsRequest) (*QueryRawCheckpointsResponse, error) // BlsPublicKeyList queries a list of bls public keys of the validators at a // given epoch number. BlsPublicKeyList(context.Context, *QueryBlsPublicKeyListRequest) (*QueryBlsPublicKeyListResponse, error) @@ -839,6 +960,9 @@ func (*UnimplementedQueryServer) RawCheckpointList(ctx context.Context, req *Que func (*UnimplementedQueryServer) RawCheckpoint(ctx context.Context, req *QueryRawCheckpointRequest) (*QueryRawCheckpointResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method RawCheckpoint not implemented") } +func (*UnimplementedQueryServer) RawCheckpoints(ctx context.Context, req *QueryRawCheckpointsRequest) (*QueryRawCheckpointsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method RawCheckpoints not implemented") +} func (*UnimplementedQueryServer) BlsPublicKeyList(ctx context.Context, req *QueryBlsPublicKeyListRequest) (*QueryBlsPublicKeyListResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method BlsPublicKeyList not implemented") } @@ -892,6 +1016,24 @@ func _Query_RawCheckpoint_Handler(srv interface{}, ctx context.Context, dec func return interceptor(ctx, in, info, handler) } +func _Query_RawCheckpoints_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryRawCheckpointsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).RawCheckpoints(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/babylon.checkpointing.v1.Query/RawCheckpoints", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).RawCheckpoints(ctx, req.(*QueryRawCheckpointsRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _Query_BlsPublicKeyList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(QueryBlsPublicKeyListRequest) if err := dec(in); err != nil { @@ -976,6 +1118,10 @@ var _Query_serviceDesc = grpc.ServiceDesc{ MethodName: "RawCheckpoint", Handler: _Query_RawCheckpoint_Handler, }, + { + MethodName: "RawCheckpoints", + Handler: _Query_RawCheckpoints_Handler, + }, { MethodName: "BlsPublicKeyList", Handler: _Query_BlsPublicKeyList_Handler, @@ -1149,6 +1295,90 @@ func (m *QueryRawCheckpointResponse) MarshalToSizedBuffer(dAtA []byte) (int, err return len(dAtA) - i, nil } +func (m *QueryRawCheckpointsRequest) 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 *QueryRawCheckpointsRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryRawCheckpointsRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Pagination != nil { + { + size, err := m.Pagination.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *QueryRawCheckpointsResponse) 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 *QueryRawCheckpointsResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryRawCheckpointsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Pagination != nil { + { + size, err := m.Pagination.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + if len(m.RawCheckpoints) > 0 { + for iNdEx := len(m.RawCheckpoints) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.RawCheckpoints[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + func (m *QueryBlsPublicKeyListRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -1506,6 +1736,38 @@ func (m *QueryRawCheckpointResponse) Size() (n int) { return n } +func (m *QueryRawCheckpointsRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Pagination != nil { + l = m.Pagination.Size() + n += 1 + l + sovQuery(uint64(l)) + } + return n +} + +func (m *QueryRawCheckpointsResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.RawCheckpoints) > 0 { + for _, e := range m.RawCheckpoints { + l = e.Size() + n += 1 + l + sovQuery(uint64(l)) + } + } + if m.Pagination != nil { + l = m.Pagination.Size() + n += 1 + l + sovQuery(uint64(l)) + } + return n +} + func (m *QueryBlsPublicKeyListRequest) Size() (n int) { if m == nil { return 0 @@ -2011,6 +2273,212 @@ func (m *QueryRawCheckpointResponse) Unmarshal(dAtA []byte) error { } return nil } +func (m *QueryRawCheckpointsRequest) 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 ErrIntOverflowQuery + } + 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: QueryRawCheckpointsRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryRawCheckpointsRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Pagination", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Pagination == nil { + m.Pagination = &query.PageRequest{} + } + if err := m.Pagination.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryRawCheckpointsResponse) 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 ErrIntOverflowQuery + } + 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: QueryRawCheckpointsResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryRawCheckpointsResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RawCheckpoints", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.RawCheckpoints = append(m.RawCheckpoints, &RawCheckpointWithMeta{}) + if err := m.RawCheckpoints[len(m.RawCheckpoints)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Pagination", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Pagination == nil { + m.Pagination = &query.PageResponse{} + } + if err := m.Pagination.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *QueryBlsPublicKeyListRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/x/checkpointing/types/query.pb.gw.go b/x/checkpointing/types/query.pb.gw.go index 8b269e51a..7914c5bba 100644 --- a/x/checkpointing/types/query.pb.gw.go +++ b/x/checkpointing/types/query.pb.gw.go @@ -165,6 +165,42 @@ func local_request_Query_RawCheckpoint_0(ctx context.Context, marshaler runtime. } +var ( + filter_Query_RawCheckpoints_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} +) + +func request_Query_RawCheckpoints_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryRawCheckpointsRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_RawCheckpoints_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.RawCheckpoints(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_RawCheckpoints_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryRawCheckpointsRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_RawCheckpoints_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.RawCheckpoints(ctx, &protoReq) + return msg, metadata, err + +} + var ( filter_Query_BlsPublicKeyList_0 = &utilities.DoubleArray{Encoding: map[string]int{"epoch_num": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} ) @@ -439,6 +475,29 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv }) + mux.Handle("GET", pattern_Query_RawCheckpoints_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_RawCheckpoints_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_RawCheckpoints_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("GET", pattern_Query_BlsPublicKeyList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -612,6 +671,26 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie }) + mux.Handle("GET", pattern_Query_RawCheckpoints_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Query_RawCheckpoints_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_RawCheckpoints_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("GET", pattern_Query_BlsPublicKeyList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -700,6 +779,8 @@ var ( pattern_Query_RawCheckpoint_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4}, []string{"babylon", "checkpointing", "v1", "raw_checkpoint", "epoch_num"}, "", runtime.AssumeColonVerbOpt(false))) + pattern_Query_RawCheckpoints_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"babylon", "checkpointing", "v1", "raw_checkpoints"}, "", runtime.AssumeColonVerbOpt(false))) + pattern_Query_BlsPublicKeyList_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4}, []string{"babylon", "checkpointing", "v1", "bls_public_keys", "epoch_num"}, "", runtime.AssumeColonVerbOpt(false))) pattern_Query_EpochStatus_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4, 2, 5}, []string{"babylon", "checkpointing", "v1", "epochs", "epoch_num", "status"}, "", runtime.AssumeColonVerbOpt(false))) @@ -714,6 +795,8 @@ var ( forward_Query_RawCheckpoint_0 = runtime.ForwardResponseMessage + forward_Query_RawCheckpoints_0 = runtime.ForwardResponseMessage + forward_Query_BlsPublicKeyList_0 = runtime.ForwardResponseMessage forward_Query_EpochStatus_0 = runtime.ForwardResponseMessage From 4e2b30a11a82f0ac2a7c7e9e5841f86c03c0ebde Mon Sep 17 00:00:00 2001 From: KonradStaniec Date: Thu, 4 May 2023 14:18:39 +0200 Subject: [PATCH 57/59] Add fuzz test for epoch finalization/confirmation (#375) --- x/btccheckpoint/keeper/msg_server_test.go | 107 ++++++++++++++++++++++ 1 file changed, 107 insertions(+) diff --git a/x/btccheckpoint/keeper/msg_server_test.go b/x/btccheckpoint/keeper/msg_server_test.go index 39eefb98c..b621d444b 100644 --- a/x/btccheckpoint/keeper/msg_server_test.go +++ b/x/btccheckpoint/keeper/msg_server_test.go @@ -3,10 +3,13 @@ package keeper_test import ( "bytes" "context" + "math" "math/rand" "testing" "time" + "github.com/babylonchain/babylon/testutil/datagen" + dg "github.com/babylonchain/babylon/testutil/datagen" keepertest "github.com/babylonchain/babylon/testutil/keeper" bbn "github.com/babylonchain/babylon/types" @@ -589,3 +592,107 @@ func TestStateTransitionOfValidSubmission(t *testing.T) { t.Errorf("Epoch Data missing of in unexpected state") } } + +func FuzzConfirmAndDinalizeManyEpochs(f *testing.F) { + datagen.AddRandomSeedsToFuzzer(f, 20) + + f.Fuzz(func(t *testing.T, seed int64) { + r := rand.New(rand.NewSource(seed)) + tk := InitTestKeepers(t) + defaultParams := btcctypes.DefaultParams() + kDeep := defaultParams.BtcConfirmationDepth + wDeep := defaultParams.CheckpointFinalizationTimeout + + numFinalizedEpochs := r.Intn(10) + 1 + numConfirmedEpochs := r.Intn(5) + 1 + numSubmittedEpochs := 1 + + finalizationDepth := math.MaxUint32 + confirmationDepth := wDeep - 1 + sumbissionDepth := kDeep - 1 + + numOfEpochs := numFinalizedEpochs + numConfirmedEpochs + numSubmittedEpochs + + bestSumbissionInfos := make(map[uint64]uint64) + + for i := 1; i <= numOfEpochs; i++ { + epoch := uint64(i) + raw, _ := dg.RandomRawCheckpointDataForEpoch(r, epoch) + numSubmissionsPerEpoch := r.Intn(3) + 1 + + for j := 1; j <= numSubmissionsPerEpoch; j++ { + numTx1 := uint32(r.Intn(30) + 10) + numTx2 := uint32(r.Intn(30) + 10) + blck1 := dg.CreateBlock(r, 0, numTx1, 1, raw.FirstPart) + blck2 := dg.CreateBlock(r, 0, numTx2, 2, raw.SecondPart) + + msg := dg.GenerateMessageWithRandomSubmitter([]*dg.BlockCreationResult{blck1, blck2}) + + if epoch <= uint64(numFinalizedEpochs) { + tk.BTCLightClient.SetDepth(blck1.HeaderBytes.Hash(), int64(finalizationDepth)) + finalizationDepth = finalizationDepth - 1 + tk.BTCLightClient.SetDepth(blck2.HeaderBytes.Hash(), int64(finalizationDepth)) + + // first submission is always deepest one, and second block is the most recent one + if j == 1 { + bestSumbissionInfos[epoch] = uint64(finalizationDepth) + } + finalizationDepth = finalizationDepth - 1 + } else if epoch <= uint64(numFinalizedEpochs+numConfirmedEpochs) { + tk.BTCLightClient.SetDepth(blck1.HeaderBytes.Hash(), int64(confirmationDepth)) + confirmationDepth = confirmationDepth - 1 + tk.BTCLightClient.SetDepth(blck2.HeaderBytes.Hash(), int64(confirmationDepth)) + // first submission is always deepest one, and second block is the most recent one + if j == 1 { + bestSumbissionInfos[epoch] = uint64(confirmationDepth) + } + confirmationDepth = confirmationDepth - 1 + } else { + tk.BTCLightClient.SetDepth(blck1.HeaderBytes.Hash(), int64(sumbissionDepth)) + sumbissionDepth = sumbissionDepth - 1 + tk.BTCLightClient.SetDepth(blck2.HeaderBytes.Hash(), int64(sumbissionDepth)) + // first submission is always deepest one, and second block is the most recent one + if j == 1 { + bestSumbissionInfos[epoch] = uint64(sumbissionDepth) + } + sumbissionDepth = sumbissionDepth - 1 + } + + _, err := tk.insertProofMsg(msg) + require.NoError(t, err, "failed to insert submission for epoch %d", epoch) + } + } + + // Check that all epochs are in submitted state + for i := 1; i <= numOfEpochs; i++ { + epoch := uint64(i) + ed := tk.GetEpochData(epoch) + require.NotNil(t, ed) + require.Equal(t, ed.Status, btcctypes.Submitted) + } + + // Fire up tip change callback. All epochs should reach their correct state + tk.onTipChange() + + for i := 1; i <= numOfEpochs; i++ { + epoch := uint64(i) + ed := tk.GetEpochData(epoch) + require.NotNil(t, ed) + + if epoch <= uint64(numFinalizedEpochs) { + require.Equal(t, ed.Status, btcctypes.Finalized) + // finalized epochs should have only best submission + require.Equal(t, len(ed.Key), 1) + } else if epoch <= uint64(numFinalizedEpochs+numConfirmedEpochs) { + require.Equal(t, ed.Status, btcctypes.Confirmed) + } else { + require.Equal(t, ed.Status, btcctypes.Submitted) + } + + bestSubInfo := tk.BTCCheckpoint.GetEpochBestSubmissionBtcInfo(tk.SdkCtx, ed) + require.NotNil(t, bestSubInfo) + expectedBestSubmissionDepth := bestSumbissionInfos[epoch] + require.Equal(t, bestSubInfo.SubmissionDepth(), expectedBestSubmissionDepth) + } + }) +} From b77b2e6db82fe6398434d259c52824c6a5b97b86 Mon Sep 17 00:00:00 2001 From: KonradStaniec Date: Fri, 5 May 2023 08:00:03 +0200 Subject: [PATCH 58/59] Fix consensus version in our custom modules (#376) Fix consensus version --- x/btccheckpoint/module.go | 2 +- x/btclightclient/module.go | 2 +- x/checkpointing/module.go | 2 +- x/epoching/module.go | 2 +- x/monitor/module.go | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/x/btccheckpoint/module.go b/x/btccheckpoint/module.go index e0c2f71da..879902e9a 100644 --- a/x/btccheckpoint/module.go +++ b/x/btccheckpoint/module.go @@ -155,7 +155,7 @@ func (am AppModule) ExportGenesis(ctx sdk.Context, cdc codec.JSONCodec) json.Raw } // ConsensusVersion implements ConsensusVersion. -func (AppModule) ConsensusVersion() uint64 { return 2 } +func (AppModule) ConsensusVersion() uint64 { return 1 } // BeginBlock executes all ABCI BeginBlock logic respective to the capability module. func (am AppModule) BeginBlock(_ sdk.Context, _ abci.RequestBeginBlock) {} diff --git a/x/btclightclient/module.go b/x/btclightclient/module.go index 657f13097..ba1fd57be 100644 --- a/x/btclightclient/module.go +++ b/x/btclightclient/module.go @@ -154,7 +154,7 @@ func (am AppModule) ExportGenesis(ctx sdk.Context, cdc codec.JSONCodec) json.Raw } // ConsensusVersion implements ConsensusVersion. -func (AppModule) ConsensusVersion() uint64 { return 2 } +func (AppModule) ConsensusVersion() uint64 { return 1 } // BeginBlock executes all ABCI BeginBlock logic respective to the capability module. func (am AppModule) BeginBlock(_ sdk.Context, _ abci.RequestBeginBlock) {} diff --git a/x/checkpointing/module.go b/x/checkpointing/module.go index 0b4d25935..3e9db023e 100644 --- a/x/checkpointing/module.go +++ b/x/checkpointing/module.go @@ -155,7 +155,7 @@ func (am AppModule) ExportGenesis(ctx sdk.Context, cdc codec.JSONCodec) json.Raw } // ConsensusVersion implements ConsensusVersion. -func (AppModule) ConsensusVersion() uint64 { return 2 } +func (AppModule) ConsensusVersion() uint64 { return 1 } // BeginBlock executes all ABCI BeginBlock logic respective to the capability module. func (am AppModule) BeginBlock(ctx sdk.Context, req abci.RequestBeginBlock) { diff --git a/x/epoching/module.go b/x/epoching/module.go index bffbb5081..f8215345c 100644 --- a/x/epoching/module.go +++ b/x/epoching/module.go @@ -158,7 +158,7 @@ func (am AppModule) ExportGenesis(ctx sdk.Context, cdc codec.JSONCodec) json.Raw } // ConsensusVersion implements ConsensusVersion. -func (AppModule) ConsensusVersion() uint64 { return 2 } +func (AppModule) ConsensusVersion() uint64 { return 1 } func (am AppModule) BeginBlock(ctx sdk.Context, req abci.RequestBeginBlock) { BeginBlocker(ctx, am.keeper, req) diff --git a/x/monitor/module.go b/x/monitor/module.go index ace8e6269..c1badb11c 100644 --- a/x/monitor/module.go +++ b/x/monitor/module.go @@ -155,7 +155,7 @@ func (am AppModule) ExportGenesis(ctx sdk.Context, cdc codec.JSONCodec) json.Raw } // ConsensusVersion implements ConsensusVersion. -func (AppModule) ConsensusVersion() uint64 { return 2 } +func (AppModule) ConsensusVersion() uint64 { return 1 } // BeginBlock executes all ABCI BeginBlock logic respective to the capability module. func (am AppModule) BeginBlock(_ sdk.Context, _ abci.RequestBeginBlock) {} From a19d78ac4599a827b25c2c19e0e0deaf80ed4c14 Mon Sep 17 00:00:00 2001 From: KonradStaniec Date: Fri, 5 May 2023 10:55:25 +0200 Subject: [PATCH 59/59] Fix non-determinism in integration test (#377) Fix non-determinism --- test/integration_test.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/integration_test.go b/test/integration_test.go index 400ec9abb..c6b4a78bd 100644 --- a/test/integration_test.go +++ b/test/integration_test.go @@ -175,13 +175,13 @@ func TestBtcLightClientGenesis(t *testing.T) { func TestNodeProgress(t *testing.T) { // Waiting for block 7, as tests are configured to run with epoch interval = 5, - // which means that at block 7 all clients will surely be in second epoch + // which means that at block 7 all clients will surely be in second epoch or later waitForBlock(clients, 7) for _, c := range clients { currentEpoch := getCurrentEpoch(c) - if currentEpoch != 2 { - t.Errorf("Epoch after 7 blocks, should equal 2. Current epoch %d", currentEpoch) + if currentEpoch < 2 { + t.Errorf("Epoch after 7 blocks, should be at least larger or equal 2. Current epoch %d", currentEpoch) } } }