From bb5747a568844162cd93d68b9ded59c8b73f5121 Mon Sep 17 00:00:00 2001 From: Nilesh Gupta Date: Thu, 12 Mar 2026 12:51:01 +0530 Subject: [PATCH 01/36] feat: added chain_meta proto changes --- proto/uexecutor/v1/chain_meta.proto | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 proto/uexecutor/v1/chain_meta.proto diff --git a/proto/uexecutor/v1/chain_meta.proto b/proto/uexecutor/v1/chain_meta.proto new file mode 100644 index 00000000..8a10ec03 --- /dev/null +++ b/proto/uexecutor/v1/chain_meta.proto @@ -0,0 +1,21 @@ +syntax = "proto3"; +package uexecutor.v1; + +import "gogoproto/gogo.proto"; +import "amino/amino.proto"; + +option go_package = "github.com/pushchain/push-chain-node/x/uexecutor/types"; + +// ChainMeta stores aggregated chain metadata (gas price + block height) for a given chain +message ChainMeta { + option (amino.name) = "uexecutor/chain_meta"; + option (gogoproto.equal) = true; + option (gogoproto.goproto_stringer) = false; + + string observed_chain_id = 1; // chain ID of observed external chain (e.g. "eip155:1" for ethereum mainnet) + repeated string signers = 2; // Validators who submitted votes + repeated uint64 prices = 3; // Submitted gas prices + repeated uint64 chain_heights = 4; // Block heights corresponding to each price observation + repeated uint64 observed_ats = 5; // Timestamps when each observation was made + uint64 median_index = 6; // Index of the median price in 'prices' +} From cc4d8c66d809fdcea9cc8a128c22539c92cb7775 Mon Sep 17 00:00:00 2001 From: Nilesh Gupta Date: Thu, 12 Mar 2026 12:51:13 +0530 Subject: [PATCH 02/36] feat: added MsgVoteChainMeta proto changes --- proto/uexecutor/v1/tx.proto | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/proto/uexecutor/v1/tx.proto b/proto/uexecutor/v1/tx.proto index 7eb065aa..b8413f11 100755 --- a/proto/uexecutor/v1/tx.proto +++ b/proto/uexecutor/v1/tx.proto @@ -4,6 +4,7 @@ package uexecutor.v1; import "amino/amino.proto"; import "cosmos/msg/v1/msg.proto"; import "uexecutor/v1/types.proto"; +import "uexecutor/v1/chain_meta.proto"; import "gogoproto/gogo.proto"; import "cosmos_proto/cosmos.proto"; @@ -32,6 +33,9 @@ service Msg { // VoteGasPrice defines a message for universal validators to vote on the gas price rpc VoteGasPrice(MsgVoteGasPrice) returns (MsgVoteGasPriceResponse); + + // VoteChainMeta defines a message for universal validators to vote on chain metadata (gas price + block height) + rpc VoteChainMeta(MsgVoteChainMeta) returns (MsgVoteChainMetaResponse); } // MsgUpdateParams is the Msg/UpdateParams request type. @@ -139,3 +143,18 @@ message MsgVoteGasPrice { // MsgVoteGasPriceResponse defines the response for MsgVoteGasPrice message MsgVoteGasPriceResponse {} + +// MsgVoteChainMeta is broadcasted by Universal Validators to submit observed chain metadata (gas price + block height) +message MsgVoteChainMeta { + option (amino.name) = "uexecutor/MsgVoteChainMeta"; + option (cosmos.msg.v1.signer) = "signer"; + + string signer = 1 [(cosmos_proto.scalar) = "cosmos.AddressString"]; // Universal Validator address submitting the vote + string observed_chain_id = 2; // CAIP-2 chain ID of observed external chain (e.g. "eip155:1") + uint64 price = 3; // Observed gas price in wei + uint64 chain_height = 4; // Block height from which observation was made + uint64 observed_at = 5; // Timestamp when the observation was made (unix seconds) +} + +// MsgVoteChainMetaResponse defines the response for MsgVoteChainMeta +message MsgVoteChainMetaResponse {} From 7082f4e1ca15750e4697fd988a37228ec38bbb26 Mon Sep 17 00:00:00 2001 From: Nilesh Gupta Date: Thu, 12 Mar 2026 12:51:31 +0530 Subject: [PATCH 03/36] refactor: added generated protobuf --- api/uexecutor/v1/chain_meta.pulsar.go | 1338 ++++++++++++++++++++++ api/uexecutor/v1/tx.pulsar.go | 1467 ++++++++++++++++++++++--- api/uexecutor/v1/tx_grpc.pb.go | 39 + 3 files changed, 2677 insertions(+), 167 deletions(-) create mode 100644 api/uexecutor/v1/chain_meta.pulsar.go diff --git a/api/uexecutor/v1/chain_meta.pulsar.go b/api/uexecutor/v1/chain_meta.pulsar.go new file mode 100644 index 00000000..3bd7eff7 --- /dev/null +++ b/api/uexecutor/v1/chain_meta.pulsar.go @@ -0,0 +1,1338 @@ +// Code generated by protoc-gen-go-pulsar. DO NOT EDIT. +package uexecutorv1 + +import ( + _ "cosmossdk.io/api/amino" + fmt "fmt" + runtime "github.com/cosmos/cosmos-proto/runtime" + _ "github.com/cosmos/gogoproto/gogoproto" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoiface "google.golang.org/protobuf/runtime/protoiface" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + io "io" + reflect "reflect" + sync "sync" +) + +var _ protoreflect.List = (*_ChainMeta_2_list)(nil) + +type _ChainMeta_2_list struct { + list *[]string +} + +func (x *_ChainMeta_2_list) Len() int { + if x.list == nil { + return 0 + } + return len(*x.list) +} + +func (x *_ChainMeta_2_list) Get(i int) protoreflect.Value { + return protoreflect.ValueOfString((*x.list)[i]) +} + +func (x *_ChainMeta_2_list) Set(i int, value protoreflect.Value) { + valueUnwrapped := value.String() + concreteValue := valueUnwrapped + (*x.list)[i] = concreteValue +} + +func (x *_ChainMeta_2_list) Append(value protoreflect.Value) { + valueUnwrapped := value.String() + concreteValue := valueUnwrapped + *x.list = append(*x.list, concreteValue) +} + +func (x *_ChainMeta_2_list) AppendMutable() protoreflect.Value { + panic(fmt.Errorf("AppendMutable can not be called on message ChainMeta at list field Signers as it is not of Message kind")) +} + +func (x *_ChainMeta_2_list) Truncate(n int) { + *x.list = (*x.list)[:n] +} + +func (x *_ChainMeta_2_list) NewElement() protoreflect.Value { + v := "" + return protoreflect.ValueOfString(v) +} + +func (x *_ChainMeta_2_list) IsValid() bool { + return x.list != nil +} + +var _ protoreflect.List = (*_ChainMeta_3_list)(nil) + +type _ChainMeta_3_list struct { + list *[]uint64 +} + +func (x *_ChainMeta_3_list) Len() int { + if x.list == nil { + return 0 + } + return len(*x.list) +} + +func (x *_ChainMeta_3_list) Get(i int) protoreflect.Value { + return protoreflect.ValueOfUint64((*x.list)[i]) +} + +func (x *_ChainMeta_3_list) Set(i int, value protoreflect.Value) { + valueUnwrapped := value.Uint() + concreteValue := valueUnwrapped + (*x.list)[i] = concreteValue +} + +func (x *_ChainMeta_3_list) Append(value protoreflect.Value) { + valueUnwrapped := value.Uint() + concreteValue := valueUnwrapped + *x.list = append(*x.list, concreteValue) +} + +func (x *_ChainMeta_3_list) AppendMutable() protoreflect.Value { + panic(fmt.Errorf("AppendMutable can not be called on message ChainMeta at list field Prices as it is not of Message kind")) +} + +func (x *_ChainMeta_3_list) Truncate(n int) { + *x.list = (*x.list)[:n] +} + +func (x *_ChainMeta_3_list) NewElement() protoreflect.Value { + v := uint64(0) + return protoreflect.ValueOfUint64(v) +} + +func (x *_ChainMeta_3_list) IsValid() bool { + return x.list != nil +} + +var _ protoreflect.List = (*_ChainMeta_4_list)(nil) + +type _ChainMeta_4_list struct { + list *[]uint64 +} + +func (x *_ChainMeta_4_list) Len() int { + if x.list == nil { + return 0 + } + return len(*x.list) +} + +func (x *_ChainMeta_4_list) Get(i int) protoreflect.Value { + return protoreflect.ValueOfUint64((*x.list)[i]) +} + +func (x *_ChainMeta_4_list) Set(i int, value protoreflect.Value) { + valueUnwrapped := value.Uint() + concreteValue := valueUnwrapped + (*x.list)[i] = concreteValue +} + +func (x *_ChainMeta_4_list) Append(value protoreflect.Value) { + valueUnwrapped := value.Uint() + concreteValue := valueUnwrapped + *x.list = append(*x.list, concreteValue) +} + +func (x *_ChainMeta_4_list) AppendMutable() protoreflect.Value { + panic(fmt.Errorf("AppendMutable can not be called on message ChainMeta at list field ChainHeights as it is not of Message kind")) +} + +func (x *_ChainMeta_4_list) Truncate(n int) { + *x.list = (*x.list)[:n] +} + +func (x *_ChainMeta_4_list) NewElement() protoreflect.Value { + v := uint64(0) + return protoreflect.ValueOfUint64(v) +} + +func (x *_ChainMeta_4_list) IsValid() bool { + return x.list != nil +} + +var _ protoreflect.List = (*_ChainMeta_5_list)(nil) + +type _ChainMeta_5_list struct { + list *[]uint64 +} + +func (x *_ChainMeta_5_list) Len() int { + if x.list == nil { + return 0 + } + return len(*x.list) +} + +func (x *_ChainMeta_5_list) Get(i int) protoreflect.Value { + return protoreflect.ValueOfUint64((*x.list)[i]) +} + +func (x *_ChainMeta_5_list) Set(i int, value protoreflect.Value) { + valueUnwrapped := value.Uint() + concreteValue := valueUnwrapped + (*x.list)[i] = concreteValue +} + +func (x *_ChainMeta_5_list) Append(value protoreflect.Value) { + valueUnwrapped := value.Uint() + concreteValue := valueUnwrapped + *x.list = append(*x.list, concreteValue) +} + +func (x *_ChainMeta_5_list) AppendMutable() protoreflect.Value { + panic(fmt.Errorf("AppendMutable can not be called on message ChainMeta at list field ObservedAts as it is not of Message kind")) +} + +func (x *_ChainMeta_5_list) Truncate(n int) { + *x.list = (*x.list)[:n] +} + +func (x *_ChainMeta_5_list) NewElement() protoreflect.Value { + v := uint64(0) + return protoreflect.ValueOfUint64(v) +} + +func (x *_ChainMeta_5_list) IsValid() bool { + return x.list != nil +} + +var ( + md_ChainMeta protoreflect.MessageDescriptor + fd_ChainMeta_observed_chain_id protoreflect.FieldDescriptor + fd_ChainMeta_signers protoreflect.FieldDescriptor + fd_ChainMeta_prices protoreflect.FieldDescriptor + fd_ChainMeta_chain_heights protoreflect.FieldDescriptor + fd_ChainMeta_observed_ats protoreflect.FieldDescriptor + fd_ChainMeta_median_index protoreflect.FieldDescriptor +) + +func init() { + file_uexecutor_v1_chain_meta_proto_init() + md_ChainMeta = File_uexecutor_v1_chain_meta_proto.Messages().ByName("ChainMeta") + fd_ChainMeta_observed_chain_id = md_ChainMeta.Fields().ByName("observed_chain_id") + fd_ChainMeta_signers = md_ChainMeta.Fields().ByName("signers") + fd_ChainMeta_prices = md_ChainMeta.Fields().ByName("prices") + fd_ChainMeta_chain_heights = md_ChainMeta.Fields().ByName("chain_heights") + fd_ChainMeta_observed_ats = md_ChainMeta.Fields().ByName("observed_ats") + fd_ChainMeta_median_index = md_ChainMeta.Fields().ByName("median_index") +} + +var _ protoreflect.Message = (*fastReflection_ChainMeta)(nil) + +type fastReflection_ChainMeta ChainMeta + +func (x *ChainMeta) ProtoReflect() protoreflect.Message { + return (*fastReflection_ChainMeta)(x) +} + +func (x *ChainMeta) slowProtoReflect() protoreflect.Message { + mi := &file_uexecutor_v1_chain_meta_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +var _fastReflection_ChainMeta_messageType fastReflection_ChainMeta_messageType +var _ protoreflect.MessageType = fastReflection_ChainMeta_messageType{} + +type fastReflection_ChainMeta_messageType struct{} + +func (x fastReflection_ChainMeta_messageType) Zero() protoreflect.Message { + return (*fastReflection_ChainMeta)(nil) +} +func (x fastReflection_ChainMeta_messageType) New() protoreflect.Message { + return new(fastReflection_ChainMeta) +} +func (x fastReflection_ChainMeta_messageType) Descriptor() protoreflect.MessageDescriptor { + return md_ChainMeta +} + +// Descriptor returns message descriptor, which contains only the protobuf +// type information for the message. +func (x *fastReflection_ChainMeta) Descriptor() protoreflect.MessageDescriptor { + return md_ChainMeta +} + +// Type returns the message type, which encapsulates both Go and protobuf +// type information. If the Go type information is not needed, +// it is recommended that the message descriptor be used instead. +func (x *fastReflection_ChainMeta) Type() protoreflect.MessageType { + return _fastReflection_ChainMeta_messageType +} + +// New returns a newly allocated and mutable empty message. +func (x *fastReflection_ChainMeta) New() protoreflect.Message { + return new(fastReflection_ChainMeta) +} + +// Interface unwraps the message reflection interface and +// returns the underlying ProtoMessage interface. +func (x *fastReflection_ChainMeta) Interface() protoreflect.ProtoMessage { + return (*ChainMeta)(x) +} + +// Range iterates over every populated field in an undefined order, +// calling f for each field descriptor and value encountered. +// Range returns immediately if f returns false. +// While iterating, mutating operations may only be performed +// on the current field descriptor. +func (x *fastReflection_ChainMeta) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { + if x.ObservedChainId != "" { + value := protoreflect.ValueOfString(x.ObservedChainId) + if !f(fd_ChainMeta_observed_chain_id, value) { + return + } + } + if len(x.Signers) != 0 { + value := protoreflect.ValueOfList(&_ChainMeta_2_list{list: &x.Signers}) + if !f(fd_ChainMeta_signers, value) { + return + } + } + if len(x.Prices) != 0 { + value := protoreflect.ValueOfList(&_ChainMeta_3_list{list: &x.Prices}) + if !f(fd_ChainMeta_prices, value) { + return + } + } + if len(x.ChainHeights) != 0 { + value := protoreflect.ValueOfList(&_ChainMeta_4_list{list: &x.ChainHeights}) + if !f(fd_ChainMeta_chain_heights, value) { + return + } + } + if len(x.ObservedAts) != 0 { + value := protoreflect.ValueOfList(&_ChainMeta_5_list{list: &x.ObservedAts}) + if !f(fd_ChainMeta_observed_ats, value) { + return + } + } + if x.MedianIndex != uint64(0) { + value := protoreflect.ValueOfUint64(x.MedianIndex) + if !f(fd_ChainMeta_median_index, value) { + return + } + } +} + +// Has reports whether a field is populated. +// +// Some fields have the property of nullability where it is possible to +// distinguish between the default value of a field and whether the field +// was explicitly populated with the default value. Singular message fields, +// member fields of a oneof, and proto2 scalar fields are nullable. Such +// fields are populated only if explicitly set. +// +// In other cases (aside from the nullable cases above), +// a proto3 scalar field is populated if it contains a non-zero value, and +// a repeated field is populated if it is non-empty. +func (x *fastReflection_ChainMeta) Has(fd protoreflect.FieldDescriptor) bool { + switch fd.FullName() { + case "uexecutor.v1.ChainMeta.observed_chain_id": + return x.ObservedChainId != "" + case "uexecutor.v1.ChainMeta.signers": + return len(x.Signers) != 0 + case "uexecutor.v1.ChainMeta.prices": + return len(x.Prices) != 0 + case "uexecutor.v1.ChainMeta.chain_heights": + return len(x.ChainHeights) != 0 + case "uexecutor.v1.ChainMeta.observed_ats": + return len(x.ObservedAts) != 0 + case "uexecutor.v1.ChainMeta.median_index": + return x.MedianIndex != uint64(0) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: uexecutor.v1.ChainMeta")) + } + panic(fmt.Errorf("message uexecutor.v1.ChainMeta does not contain field %s", fd.FullName())) + } +} + +// Clear clears the field such that a subsequent Has call reports false. +// +// Clearing an extension field clears both the extension type and value +// associated with the given field number. +// +// Clear is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_ChainMeta) Clear(fd protoreflect.FieldDescriptor) { + switch fd.FullName() { + case "uexecutor.v1.ChainMeta.observed_chain_id": + x.ObservedChainId = "" + case "uexecutor.v1.ChainMeta.signers": + x.Signers = nil + case "uexecutor.v1.ChainMeta.prices": + x.Prices = nil + case "uexecutor.v1.ChainMeta.chain_heights": + x.ChainHeights = nil + case "uexecutor.v1.ChainMeta.observed_ats": + x.ObservedAts = nil + case "uexecutor.v1.ChainMeta.median_index": + x.MedianIndex = uint64(0) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: uexecutor.v1.ChainMeta")) + } + panic(fmt.Errorf("message uexecutor.v1.ChainMeta does not contain field %s", fd.FullName())) + } +} + +// Get retrieves the value for a field. +// +// For unpopulated scalars, it returns the default value, where +// the default value of a bytes scalar is guaranteed to be a copy. +// For unpopulated composite types, it returns an empty, read-only view +// of the value; to obtain a mutable reference, use Mutable. +func (x *fastReflection_ChainMeta) Get(descriptor protoreflect.FieldDescriptor) protoreflect.Value { + switch descriptor.FullName() { + case "uexecutor.v1.ChainMeta.observed_chain_id": + value := x.ObservedChainId + return protoreflect.ValueOfString(value) + case "uexecutor.v1.ChainMeta.signers": + if len(x.Signers) == 0 { + return protoreflect.ValueOfList(&_ChainMeta_2_list{}) + } + listValue := &_ChainMeta_2_list{list: &x.Signers} + return protoreflect.ValueOfList(listValue) + case "uexecutor.v1.ChainMeta.prices": + if len(x.Prices) == 0 { + return protoreflect.ValueOfList(&_ChainMeta_3_list{}) + } + listValue := &_ChainMeta_3_list{list: &x.Prices} + return protoreflect.ValueOfList(listValue) + case "uexecutor.v1.ChainMeta.chain_heights": + if len(x.ChainHeights) == 0 { + return protoreflect.ValueOfList(&_ChainMeta_4_list{}) + } + listValue := &_ChainMeta_4_list{list: &x.ChainHeights} + return protoreflect.ValueOfList(listValue) + case "uexecutor.v1.ChainMeta.observed_ats": + if len(x.ObservedAts) == 0 { + return protoreflect.ValueOfList(&_ChainMeta_5_list{}) + } + listValue := &_ChainMeta_5_list{list: &x.ObservedAts} + return protoreflect.ValueOfList(listValue) + case "uexecutor.v1.ChainMeta.median_index": + value := x.MedianIndex + return protoreflect.ValueOfUint64(value) + default: + if descriptor.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: uexecutor.v1.ChainMeta")) + } + panic(fmt.Errorf("message uexecutor.v1.ChainMeta does not contain field %s", descriptor.FullName())) + } +} + +// Set stores the value for a field. +// +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType. +// When setting a composite type, it is unspecified whether the stored value +// aliases the source's memory in any way. If the composite value is an +// empty, read-only value, then it panics. +// +// Set is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_ChainMeta) Set(fd protoreflect.FieldDescriptor, value protoreflect.Value) { + switch fd.FullName() { + case "uexecutor.v1.ChainMeta.observed_chain_id": + x.ObservedChainId = value.Interface().(string) + case "uexecutor.v1.ChainMeta.signers": + lv := value.List() + clv := lv.(*_ChainMeta_2_list) + x.Signers = *clv.list + case "uexecutor.v1.ChainMeta.prices": + lv := value.List() + clv := lv.(*_ChainMeta_3_list) + x.Prices = *clv.list + case "uexecutor.v1.ChainMeta.chain_heights": + lv := value.List() + clv := lv.(*_ChainMeta_4_list) + x.ChainHeights = *clv.list + case "uexecutor.v1.ChainMeta.observed_ats": + lv := value.List() + clv := lv.(*_ChainMeta_5_list) + x.ObservedAts = *clv.list + case "uexecutor.v1.ChainMeta.median_index": + x.MedianIndex = value.Uint() + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: uexecutor.v1.ChainMeta")) + } + panic(fmt.Errorf("message uexecutor.v1.ChainMeta does not contain field %s", fd.FullName())) + } +} + +// Mutable returns a mutable reference to a composite type. +// +// If the field is unpopulated, it may allocate a composite value. +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType +// if not already stored. +// It panics if the field does not contain a composite type. +// +// Mutable is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_ChainMeta) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "uexecutor.v1.ChainMeta.signers": + if x.Signers == nil { + x.Signers = []string{} + } + value := &_ChainMeta_2_list{list: &x.Signers} + return protoreflect.ValueOfList(value) + case "uexecutor.v1.ChainMeta.prices": + if x.Prices == nil { + x.Prices = []uint64{} + } + value := &_ChainMeta_3_list{list: &x.Prices} + return protoreflect.ValueOfList(value) + case "uexecutor.v1.ChainMeta.chain_heights": + if x.ChainHeights == nil { + x.ChainHeights = []uint64{} + } + value := &_ChainMeta_4_list{list: &x.ChainHeights} + return protoreflect.ValueOfList(value) + case "uexecutor.v1.ChainMeta.observed_ats": + if x.ObservedAts == nil { + x.ObservedAts = []uint64{} + } + value := &_ChainMeta_5_list{list: &x.ObservedAts} + return protoreflect.ValueOfList(value) + case "uexecutor.v1.ChainMeta.observed_chain_id": + panic(fmt.Errorf("field observed_chain_id of message uexecutor.v1.ChainMeta is not mutable")) + case "uexecutor.v1.ChainMeta.median_index": + panic(fmt.Errorf("field median_index of message uexecutor.v1.ChainMeta is not mutable")) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: uexecutor.v1.ChainMeta")) + } + panic(fmt.Errorf("message uexecutor.v1.ChainMeta does not contain field %s", fd.FullName())) + } +} + +// NewField returns a new value that is assignable to the field +// for the given descriptor. For scalars, this returns the default value. +// For lists, maps, and messages, this returns a new, empty, mutable value. +func (x *fastReflection_ChainMeta) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "uexecutor.v1.ChainMeta.observed_chain_id": + return protoreflect.ValueOfString("") + case "uexecutor.v1.ChainMeta.signers": + list := []string{} + return protoreflect.ValueOfList(&_ChainMeta_2_list{list: &list}) + case "uexecutor.v1.ChainMeta.prices": + list := []uint64{} + return protoreflect.ValueOfList(&_ChainMeta_3_list{list: &list}) + case "uexecutor.v1.ChainMeta.chain_heights": + list := []uint64{} + return protoreflect.ValueOfList(&_ChainMeta_4_list{list: &list}) + case "uexecutor.v1.ChainMeta.observed_ats": + list := []uint64{} + return protoreflect.ValueOfList(&_ChainMeta_5_list{list: &list}) + case "uexecutor.v1.ChainMeta.median_index": + return protoreflect.ValueOfUint64(uint64(0)) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: uexecutor.v1.ChainMeta")) + } + panic(fmt.Errorf("message uexecutor.v1.ChainMeta does not contain field %s", fd.FullName())) + } +} + +// WhichOneof reports which field within the oneof is populated, +// returning nil if none are populated. +// It panics if the oneof descriptor does not belong to this message. +func (x *fastReflection_ChainMeta) WhichOneof(d protoreflect.OneofDescriptor) protoreflect.FieldDescriptor { + switch d.FullName() { + default: + panic(fmt.Errorf("%s is not a oneof field in uexecutor.v1.ChainMeta", d.FullName())) + } + panic("unreachable") +} + +// GetUnknown retrieves the entire list of unknown fields. +// The caller may only mutate the contents of the RawFields +// if the mutated bytes are stored back into the message with SetUnknown. +func (x *fastReflection_ChainMeta) GetUnknown() protoreflect.RawFields { + return x.unknownFields +} + +// SetUnknown stores an entire list of unknown fields. +// The raw fields must be syntactically valid according to the wire format. +// An implementation may panic if this is not the case. +// Once stored, the caller must not mutate the content of the RawFields. +// An empty RawFields may be passed to clear the fields. +// +// SetUnknown is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_ChainMeta) SetUnknown(fields protoreflect.RawFields) { + x.unknownFields = fields +} + +// IsValid reports whether the message is valid. +// +// An invalid message is an empty, read-only value. +// +// An invalid message often corresponds to a nil pointer of the concrete +// message type, but the details are implementation dependent. +// Validity is not part of the protobuf data model, and may not +// be preserved in marshaling or other operations. +func (x *fastReflection_ChainMeta) IsValid() bool { + return x != nil +} + +// ProtoMethods returns optional fastReflectionFeature-path implementations of various operations. +// This method may return nil. +// +// The returned methods type is identical to +// "google.golang.org/protobuf/runtime/protoiface".Methods. +// Consult the protoiface package documentation for details. +func (x *fastReflection_ChainMeta) ProtoMethods() *protoiface.Methods { + size := func(input protoiface.SizeInput) protoiface.SizeOutput { + x := input.Message.Interface().(*ChainMeta) + if x == nil { + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: 0, + } + } + options := runtime.SizeInputToOptions(input) + _ = options + var n int + var l int + _ = l + l = len(x.ObservedChainId) + if l > 0 { + n += 1 + l + runtime.Sov(uint64(l)) + } + if len(x.Signers) > 0 { + for _, s := range x.Signers { + l = len(s) + n += 1 + l + runtime.Sov(uint64(l)) + } + } + if len(x.Prices) > 0 { + l = 0 + for _, e := range x.Prices { + l += runtime.Sov(uint64(e)) + } + n += 1 + runtime.Sov(uint64(l)) + l + } + if len(x.ChainHeights) > 0 { + l = 0 + for _, e := range x.ChainHeights { + l += runtime.Sov(uint64(e)) + } + n += 1 + runtime.Sov(uint64(l)) + l + } + if len(x.ObservedAts) > 0 { + l = 0 + for _, e := range x.ObservedAts { + l += runtime.Sov(uint64(e)) + } + n += 1 + runtime.Sov(uint64(l)) + l + } + if x.MedianIndex != 0 { + n += 1 + runtime.Sov(uint64(x.MedianIndex)) + } + if x.unknownFields != nil { + n += len(x.unknownFields) + } + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: n, + } + } + + marshal := func(input protoiface.MarshalInput) (protoiface.MarshalOutput, error) { + x := input.Message.Interface().(*ChainMeta) + if x == nil { + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + options := runtime.MarshalInputToOptions(input) + _ = options + size := options.Size(x) + dAtA := make([]byte, size) + i := len(dAtA) + _ = i + var l int + _ = l + if x.unknownFields != nil { + i -= len(x.unknownFields) + copy(dAtA[i:], x.unknownFields) + } + if x.MedianIndex != 0 { + i = runtime.EncodeVarint(dAtA, i, uint64(x.MedianIndex)) + i-- + dAtA[i] = 0x30 + } + if len(x.ObservedAts) > 0 { + var pksize2 int + for _, num := range x.ObservedAts { + pksize2 += runtime.Sov(uint64(num)) + } + i -= pksize2 + j1 := i + for _, num := range x.ObservedAts { + for num >= 1<<7 { + dAtA[j1] = uint8(uint64(num)&0x7f | 0x80) + num >>= 7 + j1++ + } + dAtA[j1] = uint8(num) + j1++ + } + i = runtime.EncodeVarint(dAtA, i, uint64(pksize2)) + i-- + dAtA[i] = 0x2a + } + if len(x.ChainHeights) > 0 { + var pksize4 int + for _, num := range x.ChainHeights { + pksize4 += runtime.Sov(uint64(num)) + } + i -= pksize4 + j3 := i + for _, num := range x.ChainHeights { + for num >= 1<<7 { + dAtA[j3] = uint8(uint64(num)&0x7f | 0x80) + num >>= 7 + j3++ + } + dAtA[j3] = uint8(num) + j3++ + } + i = runtime.EncodeVarint(dAtA, i, uint64(pksize4)) + i-- + dAtA[i] = 0x22 + } + if len(x.Prices) > 0 { + var pksize6 int + for _, num := range x.Prices { + pksize6 += runtime.Sov(uint64(num)) + } + i -= pksize6 + j5 := i + for _, num := range x.Prices { + for num >= 1<<7 { + dAtA[j5] = uint8(uint64(num)&0x7f | 0x80) + num >>= 7 + j5++ + } + dAtA[j5] = uint8(num) + j5++ + } + i = runtime.EncodeVarint(dAtA, i, uint64(pksize6)) + i-- + dAtA[i] = 0x1a + } + if len(x.Signers) > 0 { + for iNdEx := len(x.Signers) - 1; iNdEx >= 0; iNdEx-- { + i -= len(x.Signers[iNdEx]) + copy(dAtA[i:], x.Signers[iNdEx]) + i = runtime.EncodeVarint(dAtA, i, uint64(len(x.Signers[iNdEx]))) + i-- + dAtA[i] = 0x12 + } + } + if len(x.ObservedChainId) > 0 { + i -= len(x.ObservedChainId) + copy(dAtA[i:], x.ObservedChainId) + i = runtime.EncodeVarint(dAtA, i, uint64(len(x.ObservedChainId))) + i-- + dAtA[i] = 0xa + } + if input.Buf != nil { + input.Buf = append(input.Buf, dAtA...) + } else { + input.Buf = dAtA + } + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + unmarshal := func(input protoiface.UnmarshalInput) (protoiface.UnmarshalOutput, error) { + x := input.Message.Interface().(*ChainMeta) + if x == nil { + return protoiface.UnmarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Flags: input.Flags, + }, nil + } + options := runtime.UnmarshalInputToOptions(input) + _ = options + dAtA := input.Buf + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, 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 protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: ChainMeta: wiretype end group for non-group") + } + if fieldNum <= 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: ChainMeta: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field ObservedChainId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if postIndex > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + x.ObservedChainId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field Signers", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if postIndex > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + x.Signers = append(x.Signers, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 3: + if wireType == 0 { + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + x.Prices = append(x.Prices, v) + } else if wireType == 2 { + var packedLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + packedLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if packedLen < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + postIndex := iNdEx + packedLen + if postIndex < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if postIndex > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + var elementCount int + var count int + for _, integer := range dAtA[iNdEx:postIndex] { + if integer < 128 { + count++ + } + } + elementCount = count + if elementCount != 0 && len(x.Prices) == 0 { + x.Prices = make([]uint64, 0, elementCount) + } + for iNdEx < postIndex { + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + x.Prices = append(x.Prices, v) + } + } else { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field Prices", wireType) + } + case 4: + if wireType == 0 { + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + x.ChainHeights = append(x.ChainHeights, v) + } else if wireType == 2 { + var packedLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + packedLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if packedLen < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + postIndex := iNdEx + packedLen + if postIndex < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if postIndex > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + var elementCount int + var count int + for _, integer := range dAtA[iNdEx:postIndex] { + if integer < 128 { + count++ + } + } + elementCount = count + if elementCount != 0 && len(x.ChainHeights) == 0 { + x.ChainHeights = make([]uint64, 0, elementCount) + } + for iNdEx < postIndex { + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + x.ChainHeights = append(x.ChainHeights, v) + } + } else { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field ChainHeights", wireType) + } + case 5: + if wireType == 0 { + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + x.ObservedAts = append(x.ObservedAts, v) + } else if wireType == 2 { + var packedLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + packedLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if packedLen < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + postIndex := iNdEx + packedLen + if postIndex < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if postIndex > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + var elementCount int + var count int + for _, integer := range dAtA[iNdEx:postIndex] { + if integer < 128 { + count++ + } + } + elementCount = count + if elementCount != 0 && len(x.ObservedAts) == 0 { + x.ObservedAts = make([]uint64, 0, elementCount) + } + for iNdEx < postIndex { + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + x.ObservedAts = append(x.ObservedAts, v) + } + } else { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field ObservedAts", wireType) + } + case 6: + if wireType != 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field MedianIndex", wireType) + } + x.MedianIndex = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + x.MedianIndex |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := runtime.Skip(dAtA[iNdEx:]) + if err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + if !options.DiscardUnknown { + x.unknownFields = append(x.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + } + iNdEx += skippy + } + } + + if iNdEx > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, nil + } + return &protoiface.Methods{ + NoUnkeyedLiterals: struct{}{}, + Flags: protoiface.SupportMarshalDeterministic | protoiface.SupportUnmarshalDiscardUnknown, + Size: size, + Marshal: marshal, + Unmarshal: unmarshal, + Merge: nil, + CheckInitialized: nil, + } +} + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.27.0 +// protoc (unknown) +// source: uexecutor/v1/chain_meta.proto + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// ChainMeta stores aggregated chain metadata (gas price + block height) for a given chain +type ChainMeta struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ObservedChainId string `protobuf:"bytes,1,opt,name=observed_chain_id,json=observedChainId,proto3" json:"observed_chain_id,omitempty"` // chain ID of observed external chain (e.g. "eip155:1" for ethereum mainnet) + Signers []string `protobuf:"bytes,2,rep,name=signers,proto3" json:"signers,omitempty"` // Validators who submitted votes + Prices []uint64 `protobuf:"varint,3,rep,packed,name=prices,proto3" json:"prices,omitempty"` // Submitted gas prices + ChainHeights []uint64 `protobuf:"varint,4,rep,packed,name=chain_heights,json=chainHeights,proto3" json:"chain_heights,omitempty"` // Block heights corresponding to each price observation + ObservedAts []uint64 `protobuf:"varint,5,rep,packed,name=observed_ats,json=observedAts,proto3" json:"observed_ats,omitempty"` // Timestamps when each observation was made + MedianIndex uint64 `protobuf:"varint,6,opt,name=median_index,json=medianIndex,proto3" json:"median_index,omitempty"` // Index of the median price in 'prices' +} + +func (x *ChainMeta) Reset() { + *x = ChainMeta{} + if protoimpl.UnsafeEnabled { + mi := &file_uexecutor_v1_chain_meta_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ChainMeta) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ChainMeta) ProtoMessage() {} + +// Deprecated: Use ChainMeta.ProtoReflect.Descriptor instead. +func (*ChainMeta) Descriptor() ([]byte, []int) { + return file_uexecutor_v1_chain_meta_proto_rawDescGZIP(), []int{0} +} + +func (x *ChainMeta) GetObservedChainId() string { + if x != nil { + return x.ObservedChainId + } + return "" +} + +func (x *ChainMeta) GetSigners() []string { + if x != nil { + return x.Signers + } + return nil +} + +func (x *ChainMeta) GetPrices() []uint64 { + if x != nil { + return x.Prices + } + return nil +} + +func (x *ChainMeta) GetChainHeights() []uint64 { + if x != nil { + return x.ChainHeights + } + return nil +} + +func (x *ChainMeta) GetObservedAts() []uint64 { + if x != nil { + return x.ObservedAts + } + return nil +} + +func (x *ChainMeta) GetMedianIndex() uint64 { + if x != nil { + return x.MedianIndex + } + return 0 +} + +var File_uexecutor_v1_chain_meta_proto protoreflect.FileDescriptor + +var file_uexecutor_v1_chain_meta_proto_rawDesc = []byte{ + 0x0a, 0x1d, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2f, 0x76, 0x31, 0x2f, 0x63, + 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, + 0x0c, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x1a, 0x14, 0x67, + 0x6f, 0x67, 0x6f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x67, 0x6f, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x1a, 0x11, 0x61, 0x6d, 0x69, 0x6e, 0x6f, 0x2f, 0x61, 0x6d, 0x69, 0x6e, 0x6f, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xf7, 0x01, 0x0a, 0x09, 0x43, 0x68, 0x61, 0x69, 0x6e, + 0x4d, 0x65, 0x74, 0x61, 0x12, 0x2a, 0x0a, 0x11, 0x6f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, + 0x5f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0f, 0x6f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, + 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x07, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x72, + 0x69, 0x63, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x04, 0x52, 0x06, 0x70, 0x72, 0x69, 0x63, + 0x65, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x68, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x04, 0x52, 0x0c, 0x63, 0x68, 0x61, 0x69, 0x6e, + 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x6f, 0x62, 0x73, 0x65, 0x72, + 0x76, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x04, 0x52, 0x0b, 0x6f, + 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x41, 0x74, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x65, + 0x64, 0x69, 0x61, 0x6e, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x0b, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x3a, 0x21, 0x98, + 0xa0, 0x1f, 0x00, 0xe8, 0xa0, 0x1f, 0x01, 0x8a, 0xe7, 0xb0, 0x2a, 0x14, 0x75, 0x65, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x6d, 0x65, 0x74, 0x61, + 0x42, 0xb6, 0x01, 0x0a, 0x10, 0x63, 0x6f, 0x6d, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, + 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x42, 0x0e, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x4d, 0x65, 0x74, 0x61, + 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x41, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x75, 0x73, 0x68, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x2f, 0x70, 0x75, + 0x73, 0x68, 0x2d, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x2d, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x61, 0x70, + 0x69, 0x2f, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2f, 0x76, 0x31, 0x3b, 0x75, + 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x55, 0x58, 0x58, + 0xaa, 0x02, 0x0c, 0x55, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x56, 0x31, 0xca, + 0x02, 0x0c, 0x55, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x5c, 0x56, 0x31, 0xe2, 0x02, + 0x18, 0x55, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, + 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0d, 0x55, 0x65, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x6f, 0x72, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x33, +} + +var ( + file_uexecutor_v1_chain_meta_proto_rawDescOnce sync.Once + file_uexecutor_v1_chain_meta_proto_rawDescData = file_uexecutor_v1_chain_meta_proto_rawDesc +) + +func file_uexecutor_v1_chain_meta_proto_rawDescGZIP() []byte { + file_uexecutor_v1_chain_meta_proto_rawDescOnce.Do(func() { + file_uexecutor_v1_chain_meta_proto_rawDescData = protoimpl.X.CompressGZIP(file_uexecutor_v1_chain_meta_proto_rawDescData) + }) + return file_uexecutor_v1_chain_meta_proto_rawDescData +} + +var file_uexecutor_v1_chain_meta_proto_msgTypes = make([]protoimpl.MessageInfo, 1) +var file_uexecutor_v1_chain_meta_proto_goTypes = []interface{}{ + (*ChainMeta)(nil), // 0: uexecutor.v1.ChainMeta +} +var file_uexecutor_v1_chain_meta_proto_depIdxs = []int32{ + 0, // [0:0] is the sub-list for method output_type + 0, // [0:0] is the sub-list for method input_type + 0, // [0:0] is the sub-list for extension type_name + 0, // [0:0] is the sub-list for extension extendee + 0, // [0:0] is the sub-list for field type_name +} + +func init() { file_uexecutor_v1_chain_meta_proto_init() } +func file_uexecutor_v1_chain_meta_proto_init() { + if File_uexecutor_v1_chain_meta_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_uexecutor_v1_chain_meta_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ChainMeta); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_uexecutor_v1_chain_meta_proto_rawDesc, + NumEnums: 0, + NumMessages: 1, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_uexecutor_v1_chain_meta_proto_goTypes, + DependencyIndexes: file_uexecutor_v1_chain_meta_proto_depIdxs, + MessageInfos: file_uexecutor_v1_chain_meta_proto_msgTypes, + }.Build() + File_uexecutor_v1_chain_meta_proto = out.File + file_uexecutor_v1_chain_meta_proto_rawDesc = nil + file_uexecutor_v1_chain_meta_proto_goTypes = nil + file_uexecutor_v1_chain_meta_proto_depIdxs = nil +} diff --git a/api/uexecutor/v1/tx.pulsar.go b/api/uexecutor/v1/tx.pulsar.go index 619f27bd..2a936b32 100644 --- a/api/uexecutor/v1/tx.pulsar.go +++ b/api/uexecutor/v1/tx.pulsar.go @@ -5641,6 +5641,990 @@ func (x *fastReflection_MsgVoteGasPriceResponse) ProtoMethods() *protoiface.Meth } } +var ( + md_MsgVoteChainMeta protoreflect.MessageDescriptor + fd_MsgVoteChainMeta_signer protoreflect.FieldDescriptor + fd_MsgVoteChainMeta_observed_chain_id protoreflect.FieldDescriptor + fd_MsgVoteChainMeta_price protoreflect.FieldDescriptor + fd_MsgVoteChainMeta_chain_height protoreflect.FieldDescriptor + fd_MsgVoteChainMeta_observed_at protoreflect.FieldDescriptor +) + +func init() { + file_uexecutor_v1_tx_proto_init() + md_MsgVoteChainMeta = File_uexecutor_v1_tx_proto.Messages().ByName("MsgVoteChainMeta") + fd_MsgVoteChainMeta_signer = md_MsgVoteChainMeta.Fields().ByName("signer") + fd_MsgVoteChainMeta_observed_chain_id = md_MsgVoteChainMeta.Fields().ByName("observed_chain_id") + fd_MsgVoteChainMeta_price = md_MsgVoteChainMeta.Fields().ByName("price") + fd_MsgVoteChainMeta_chain_height = md_MsgVoteChainMeta.Fields().ByName("chain_height") + fd_MsgVoteChainMeta_observed_at = md_MsgVoteChainMeta.Fields().ByName("observed_at") +} + +var _ protoreflect.Message = (*fastReflection_MsgVoteChainMeta)(nil) + +type fastReflection_MsgVoteChainMeta MsgVoteChainMeta + +func (x *MsgVoteChainMeta) ProtoReflect() protoreflect.Message { + return (*fastReflection_MsgVoteChainMeta)(x) +} + +func (x *MsgVoteChainMeta) slowProtoReflect() protoreflect.Message { + mi := &file_uexecutor_v1_tx_proto_msgTypes[12] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +var _fastReflection_MsgVoteChainMeta_messageType fastReflection_MsgVoteChainMeta_messageType +var _ protoreflect.MessageType = fastReflection_MsgVoteChainMeta_messageType{} + +type fastReflection_MsgVoteChainMeta_messageType struct{} + +func (x fastReflection_MsgVoteChainMeta_messageType) Zero() protoreflect.Message { + return (*fastReflection_MsgVoteChainMeta)(nil) +} +func (x fastReflection_MsgVoteChainMeta_messageType) New() protoreflect.Message { + return new(fastReflection_MsgVoteChainMeta) +} +func (x fastReflection_MsgVoteChainMeta_messageType) Descriptor() protoreflect.MessageDescriptor { + return md_MsgVoteChainMeta +} + +// Descriptor returns message descriptor, which contains only the protobuf +// type information for the message. +func (x *fastReflection_MsgVoteChainMeta) Descriptor() protoreflect.MessageDescriptor { + return md_MsgVoteChainMeta +} + +// Type returns the message type, which encapsulates both Go and protobuf +// type information. If the Go type information is not needed, +// it is recommended that the message descriptor be used instead. +func (x *fastReflection_MsgVoteChainMeta) Type() protoreflect.MessageType { + return _fastReflection_MsgVoteChainMeta_messageType +} + +// New returns a newly allocated and mutable empty message. +func (x *fastReflection_MsgVoteChainMeta) New() protoreflect.Message { + return new(fastReflection_MsgVoteChainMeta) +} + +// Interface unwraps the message reflection interface and +// returns the underlying ProtoMessage interface. +func (x *fastReflection_MsgVoteChainMeta) Interface() protoreflect.ProtoMessage { + return (*MsgVoteChainMeta)(x) +} + +// Range iterates over every populated field in an undefined order, +// calling f for each field descriptor and value encountered. +// Range returns immediately if f returns false. +// While iterating, mutating operations may only be performed +// on the current field descriptor. +func (x *fastReflection_MsgVoteChainMeta) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { + if x.Signer != "" { + value := protoreflect.ValueOfString(x.Signer) + if !f(fd_MsgVoteChainMeta_signer, value) { + return + } + } + if x.ObservedChainId != "" { + value := protoreflect.ValueOfString(x.ObservedChainId) + if !f(fd_MsgVoteChainMeta_observed_chain_id, value) { + return + } + } + if x.Price != uint64(0) { + value := protoreflect.ValueOfUint64(x.Price) + if !f(fd_MsgVoteChainMeta_price, value) { + return + } + } + if x.ChainHeight != uint64(0) { + value := protoreflect.ValueOfUint64(x.ChainHeight) + if !f(fd_MsgVoteChainMeta_chain_height, value) { + return + } + } + if x.ObservedAt != uint64(0) { + value := protoreflect.ValueOfUint64(x.ObservedAt) + if !f(fd_MsgVoteChainMeta_observed_at, value) { + return + } + } +} + +// Has reports whether a field is populated. +// +// Some fields have the property of nullability where it is possible to +// distinguish between the default value of a field and whether the field +// was explicitly populated with the default value. Singular message fields, +// member fields of a oneof, and proto2 scalar fields are nullable. Such +// fields are populated only if explicitly set. +// +// In other cases (aside from the nullable cases above), +// a proto3 scalar field is populated if it contains a non-zero value, and +// a repeated field is populated if it is non-empty. +func (x *fastReflection_MsgVoteChainMeta) Has(fd protoreflect.FieldDescriptor) bool { + switch fd.FullName() { + case "uexecutor.v1.MsgVoteChainMeta.signer": + return x.Signer != "" + case "uexecutor.v1.MsgVoteChainMeta.observed_chain_id": + return x.ObservedChainId != "" + case "uexecutor.v1.MsgVoteChainMeta.price": + return x.Price != uint64(0) + case "uexecutor.v1.MsgVoteChainMeta.chain_height": + return x.ChainHeight != uint64(0) + case "uexecutor.v1.MsgVoteChainMeta.observed_at": + return x.ObservedAt != uint64(0) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: uexecutor.v1.MsgVoteChainMeta")) + } + panic(fmt.Errorf("message uexecutor.v1.MsgVoteChainMeta does not contain field %s", fd.FullName())) + } +} + +// Clear clears the field such that a subsequent Has call reports false. +// +// Clearing an extension field clears both the extension type and value +// associated with the given field number. +// +// Clear is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_MsgVoteChainMeta) Clear(fd protoreflect.FieldDescriptor) { + switch fd.FullName() { + case "uexecutor.v1.MsgVoteChainMeta.signer": + x.Signer = "" + case "uexecutor.v1.MsgVoteChainMeta.observed_chain_id": + x.ObservedChainId = "" + case "uexecutor.v1.MsgVoteChainMeta.price": + x.Price = uint64(0) + case "uexecutor.v1.MsgVoteChainMeta.chain_height": + x.ChainHeight = uint64(0) + case "uexecutor.v1.MsgVoteChainMeta.observed_at": + x.ObservedAt = uint64(0) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: uexecutor.v1.MsgVoteChainMeta")) + } + panic(fmt.Errorf("message uexecutor.v1.MsgVoteChainMeta does not contain field %s", fd.FullName())) + } +} + +// Get retrieves the value for a field. +// +// For unpopulated scalars, it returns the default value, where +// the default value of a bytes scalar is guaranteed to be a copy. +// For unpopulated composite types, it returns an empty, read-only view +// of the value; to obtain a mutable reference, use Mutable. +func (x *fastReflection_MsgVoteChainMeta) Get(descriptor protoreflect.FieldDescriptor) protoreflect.Value { + switch descriptor.FullName() { + case "uexecutor.v1.MsgVoteChainMeta.signer": + value := x.Signer + return protoreflect.ValueOfString(value) + case "uexecutor.v1.MsgVoteChainMeta.observed_chain_id": + value := x.ObservedChainId + return protoreflect.ValueOfString(value) + case "uexecutor.v1.MsgVoteChainMeta.price": + value := x.Price + return protoreflect.ValueOfUint64(value) + case "uexecutor.v1.MsgVoteChainMeta.chain_height": + value := x.ChainHeight + return protoreflect.ValueOfUint64(value) + case "uexecutor.v1.MsgVoteChainMeta.observed_at": + value := x.ObservedAt + return protoreflect.ValueOfUint64(value) + default: + if descriptor.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: uexecutor.v1.MsgVoteChainMeta")) + } + panic(fmt.Errorf("message uexecutor.v1.MsgVoteChainMeta does not contain field %s", descriptor.FullName())) + } +} + +// Set stores the value for a field. +// +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType. +// When setting a composite type, it is unspecified whether the stored value +// aliases the source's memory in any way. If the composite value is an +// empty, read-only value, then it panics. +// +// Set is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_MsgVoteChainMeta) Set(fd protoreflect.FieldDescriptor, value protoreflect.Value) { + switch fd.FullName() { + case "uexecutor.v1.MsgVoteChainMeta.signer": + x.Signer = value.Interface().(string) + case "uexecutor.v1.MsgVoteChainMeta.observed_chain_id": + x.ObservedChainId = value.Interface().(string) + case "uexecutor.v1.MsgVoteChainMeta.price": + x.Price = value.Uint() + case "uexecutor.v1.MsgVoteChainMeta.chain_height": + x.ChainHeight = value.Uint() + case "uexecutor.v1.MsgVoteChainMeta.observed_at": + x.ObservedAt = value.Uint() + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: uexecutor.v1.MsgVoteChainMeta")) + } + panic(fmt.Errorf("message uexecutor.v1.MsgVoteChainMeta does not contain field %s", fd.FullName())) + } +} + +// Mutable returns a mutable reference to a composite type. +// +// If the field is unpopulated, it may allocate a composite value. +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType +// if not already stored. +// It panics if the field does not contain a composite type. +// +// Mutable is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_MsgVoteChainMeta) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "uexecutor.v1.MsgVoteChainMeta.signer": + panic(fmt.Errorf("field signer of message uexecutor.v1.MsgVoteChainMeta is not mutable")) + case "uexecutor.v1.MsgVoteChainMeta.observed_chain_id": + panic(fmt.Errorf("field observed_chain_id of message uexecutor.v1.MsgVoteChainMeta is not mutable")) + case "uexecutor.v1.MsgVoteChainMeta.price": + panic(fmt.Errorf("field price of message uexecutor.v1.MsgVoteChainMeta is not mutable")) + case "uexecutor.v1.MsgVoteChainMeta.chain_height": + panic(fmt.Errorf("field chain_height of message uexecutor.v1.MsgVoteChainMeta is not mutable")) + case "uexecutor.v1.MsgVoteChainMeta.observed_at": + panic(fmt.Errorf("field observed_at of message uexecutor.v1.MsgVoteChainMeta is not mutable")) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: uexecutor.v1.MsgVoteChainMeta")) + } + panic(fmt.Errorf("message uexecutor.v1.MsgVoteChainMeta does not contain field %s", fd.FullName())) + } +} + +// NewField returns a new value that is assignable to the field +// for the given descriptor. For scalars, this returns the default value. +// For lists, maps, and messages, this returns a new, empty, mutable value. +func (x *fastReflection_MsgVoteChainMeta) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "uexecutor.v1.MsgVoteChainMeta.signer": + return protoreflect.ValueOfString("") + case "uexecutor.v1.MsgVoteChainMeta.observed_chain_id": + return protoreflect.ValueOfString("") + case "uexecutor.v1.MsgVoteChainMeta.price": + return protoreflect.ValueOfUint64(uint64(0)) + case "uexecutor.v1.MsgVoteChainMeta.chain_height": + return protoreflect.ValueOfUint64(uint64(0)) + case "uexecutor.v1.MsgVoteChainMeta.observed_at": + return protoreflect.ValueOfUint64(uint64(0)) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: uexecutor.v1.MsgVoteChainMeta")) + } + panic(fmt.Errorf("message uexecutor.v1.MsgVoteChainMeta does not contain field %s", fd.FullName())) + } +} + +// WhichOneof reports which field within the oneof is populated, +// returning nil if none are populated. +// It panics if the oneof descriptor does not belong to this message. +func (x *fastReflection_MsgVoteChainMeta) WhichOneof(d protoreflect.OneofDescriptor) protoreflect.FieldDescriptor { + switch d.FullName() { + default: + panic(fmt.Errorf("%s is not a oneof field in uexecutor.v1.MsgVoteChainMeta", d.FullName())) + } + panic("unreachable") +} + +// GetUnknown retrieves the entire list of unknown fields. +// The caller may only mutate the contents of the RawFields +// if the mutated bytes are stored back into the message with SetUnknown. +func (x *fastReflection_MsgVoteChainMeta) GetUnknown() protoreflect.RawFields { + return x.unknownFields +} + +// SetUnknown stores an entire list of unknown fields. +// The raw fields must be syntactically valid according to the wire format. +// An implementation may panic if this is not the case. +// Once stored, the caller must not mutate the content of the RawFields. +// An empty RawFields may be passed to clear the fields. +// +// SetUnknown is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_MsgVoteChainMeta) SetUnknown(fields protoreflect.RawFields) { + x.unknownFields = fields +} + +// IsValid reports whether the message is valid. +// +// An invalid message is an empty, read-only value. +// +// An invalid message often corresponds to a nil pointer of the concrete +// message type, but the details are implementation dependent. +// Validity is not part of the protobuf data model, and may not +// be preserved in marshaling or other operations. +func (x *fastReflection_MsgVoteChainMeta) IsValid() bool { + return x != nil +} + +// ProtoMethods returns optional fastReflectionFeature-path implementations of various operations. +// This method may return nil. +// +// The returned methods type is identical to +// "google.golang.org/protobuf/runtime/protoiface".Methods. +// Consult the protoiface package documentation for details. +func (x *fastReflection_MsgVoteChainMeta) ProtoMethods() *protoiface.Methods { + size := func(input protoiface.SizeInput) protoiface.SizeOutput { + x := input.Message.Interface().(*MsgVoteChainMeta) + if x == nil { + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: 0, + } + } + options := runtime.SizeInputToOptions(input) + _ = options + var n int + var l int + _ = l + l = len(x.Signer) + if l > 0 { + n += 1 + l + runtime.Sov(uint64(l)) + } + l = len(x.ObservedChainId) + if l > 0 { + n += 1 + l + runtime.Sov(uint64(l)) + } + if x.Price != 0 { + n += 1 + runtime.Sov(uint64(x.Price)) + } + if x.ChainHeight != 0 { + n += 1 + runtime.Sov(uint64(x.ChainHeight)) + } + if x.ObservedAt != 0 { + n += 1 + runtime.Sov(uint64(x.ObservedAt)) + } + if x.unknownFields != nil { + n += len(x.unknownFields) + } + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: n, + } + } + + marshal := func(input protoiface.MarshalInput) (protoiface.MarshalOutput, error) { + x := input.Message.Interface().(*MsgVoteChainMeta) + if x == nil { + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + options := runtime.MarshalInputToOptions(input) + _ = options + size := options.Size(x) + dAtA := make([]byte, size) + i := len(dAtA) + _ = i + var l int + _ = l + if x.unknownFields != nil { + i -= len(x.unknownFields) + copy(dAtA[i:], x.unknownFields) + } + if x.ObservedAt != 0 { + i = runtime.EncodeVarint(dAtA, i, uint64(x.ObservedAt)) + i-- + dAtA[i] = 0x28 + } + if x.ChainHeight != 0 { + i = runtime.EncodeVarint(dAtA, i, uint64(x.ChainHeight)) + i-- + dAtA[i] = 0x20 + } + if x.Price != 0 { + i = runtime.EncodeVarint(dAtA, i, uint64(x.Price)) + i-- + dAtA[i] = 0x18 + } + if len(x.ObservedChainId) > 0 { + i -= len(x.ObservedChainId) + copy(dAtA[i:], x.ObservedChainId) + i = runtime.EncodeVarint(dAtA, i, uint64(len(x.ObservedChainId))) + i-- + dAtA[i] = 0x12 + } + if len(x.Signer) > 0 { + i -= len(x.Signer) + copy(dAtA[i:], x.Signer) + i = runtime.EncodeVarint(dAtA, i, uint64(len(x.Signer))) + i-- + dAtA[i] = 0xa + } + if input.Buf != nil { + input.Buf = append(input.Buf, dAtA...) + } else { + input.Buf = dAtA + } + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + unmarshal := func(input protoiface.UnmarshalInput) (protoiface.UnmarshalOutput, error) { + x := input.Message.Interface().(*MsgVoteChainMeta) + if x == nil { + return protoiface.UnmarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Flags: input.Flags, + }, nil + } + options := runtime.UnmarshalInputToOptions(input) + _ = options + dAtA := input.Buf + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, 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 protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: MsgVoteChainMeta: wiretype end group for non-group") + } + if fieldNum <= 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: MsgVoteChainMeta: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field Signer", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if postIndex > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + x.Signer = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field ObservedChainId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if postIndex > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + x.ObservedChainId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field Price", wireType) + } + x.Price = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + x.Price |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 4: + if wireType != 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field ChainHeight", wireType) + } + x.ChainHeight = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + x.ChainHeight |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 5: + if wireType != 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field ObservedAt", wireType) + } + x.ObservedAt = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + x.ObservedAt |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := runtime.Skip(dAtA[iNdEx:]) + if err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + if !options.DiscardUnknown { + x.unknownFields = append(x.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + } + iNdEx += skippy + } + } + + if iNdEx > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, nil + } + return &protoiface.Methods{ + NoUnkeyedLiterals: struct{}{}, + Flags: protoiface.SupportMarshalDeterministic | protoiface.SupportUnmarshalDiscardUnknown, + Size: size, + Marshal: marshal, + Unmarshal: unmarshal, + Merge: nil, + CheckInitialized: nil, + } +} + +var ( + md_MsgVoteChainMetaResponse protoreflect.MessageDescriptor +) + +func init() { + file_uexecutor_v1_tx_proto_init() + md_MsgVoteChainMetaResponse = File_uexecutor_v1_tx_proto.Messages().ByName("MsgVoteChainMetaResponse") +} + +var _ protoreflect.Message = (*fastReflection_MsgVoteChainMetaResponse)(nil) + +type fastReflection_MsgVoteChainMetaResponse MsgVoteChainMetaResponse + +func (x *MsgVoteChainMetaResponse) ProtoReflect() protoreflect.Message { + return (*fastReflection_MsgVoteChainMetaResponse)(x) +} + +func (x *MsgVoteChainMetaResponse) slowProtoReflect() protoreflect.Message { + mi := &file_uexecutor_v1_tx_proto_msgTypes[13] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +var _fastReflection_MsgVoteChainMetaResponse_messageType fastReflection_MsgVoteChainMetaResponse_messageType +var _ protoreflect.MessageType = fastReflection_MsgVoteChainMetaResponse_messageType{} + +type fastReflection_MsgVoteChainMetaResponse_messageType struct{} + +func (x fastReflection_MsgVoteChainMetaResponse_messageType) Zero() protoreflect.Message { + return (*fastReflection_MsgVoteChainMetaResponse)(nil) +} +func (x fastReflection_MsgVoteChainMetaResponse_messageType) New() protoreflect.Message { + return new(fastReflection_MsgVoteChainMetaResponse) +} +func (x fastReflection_MsgVoteChainMetaResponse_messageType) Descriptor() protoreflect.MessageDescriptor { + return md_MsgVoteChainMetaResponse +} + +// Descriptor returns message descriptor, which contains only the protobuf +// type information for the message. +func (x *fastReflection_MsgVoteChainMetaResponse) Descriptor() protoreflect.MessageDescriptor { + return md_MsgVoteChainMetaResponse +} + +// Type returns the message type, which encapsulates both Go and protobuf +// type information. If the Go type information is not needed, +// it is recommended that the message descriptor be used instead. +func (x *fastReflection_MsgVoteChainMetaResponse) Type() protoreflect.MessageType { + return _fastReflection_MsgVoteChainMetaResponse_messageType +} + +// New returns a newly allocated and mutable empty message. +func (x *fastReflection_MsgVoteChainMetaResponse) New() protoreflect.Message { + return new(fastReflection_MsgVoteChainMetaResponse) +} + +// Interface unwraps the message reflection interface and +// returns the underlying ProtoMessage interface. +func (x *fastReflection_MsgVoteChainMetaResponse) Interface() protoreflect.ProtoMessage { + return (*MsgVoteChainMetaResponse)(x) +} + +// Range iterates over every populated field in an undefined order, +// calling f for each field descriptor and value encountered. +// Range returns immediately if f returns false. +// While iterating, mutating operations may only be performed +// on the current field descriptor. +func (x *fastReflection_MsgVoteChainMetaResponse) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { +} + +// Has reports whether a field is populated. +// +// Some fields have the property of nullability where it is possible to +// distinguish between the default value of a field and whether the field +// was explicitly populated with the default value. Singular message fields, +// member fields of a oneof, and proto2 scalar fields are nullable. Such +// fields are populated only if explicitly set. +// +// In other cases (aside from the nullable cases above), +// a proto3 scalar field is populated if it contains a non-zero value, and +// a repeated field is populated if it is non-empty. +func (x *fastReflection_MsgVoteChainMetaResponse) Has(fd protoreflect.FieldDescriptor) bool { + switch fd.FullName() { + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: uexecutor.v1.MsgVoteChainMetaResponse")) + } + panic(fmt.Errorf("message uexecutor.v1.MsgVoteChainMetaResponse does not contain field %s", fd.FullName())) + } +} + +// Clear clears the field such that a subsequent Has call reports false. +// +// Clearing an extension field clears both the extension type and value +// associated with the given field number. +// +// Clear is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_MsgVoteChainMetaResponse) Clear(fd protoreflect.FieldDescriptor) { + switch fd.FullName() { + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: uexecutor.v1.MsgVoteChainMetaResponse")) + } + panic(fmt.Errorf("message uexecutor.v1.MsgVoteChainMetaResponse does not contain field %s", fd.FullName())) + } +} + +// Get retrieves the value for a field. +// +// For unpopulated scalars, it returns the default value, where +// the default value of a bytes scalar is guaranteed to be a copy. +// For unpopulated composite types, it returns an empty, read-only view +// of the value; to obtain a mutable reference, use Mutable. +func (x *fastReflection_MsgVoteChainMetaResponse) Get(descriptor protoreflect.FieldDescriptor) protoreflect.Value { + switch descriptor.FullName() { + default: + if descriptor.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: uexecutor.v1.MsgVoteChainMetaResponse")) + } + panic(fmt.Errorf("message uexecutor.v1.MsgVoteChainMetaResponse does not contain field %s", descriptor.FullName())) + } +} + +// Set stores the value for a field. +// +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType. +// When setting a composite type, it is unspecified whether the stored value +// aliases the source's memory in any way. If the composite value is an +// empty, read-only value, then it panics. +// +// Set is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_MsgVoteChainMetaResponse) Set(fd protoreflect.FieldDescriptor, value protoreflect.Value) { + switch fd.FullName() { + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: uexecutor.v1.MsgVoteChainMetaResponse")) + } + panic(fmt.Errorf("message uexecutor.v1.MsgVoteChainMetaResponse does not contain field %s", fd.FullName())) + } +} + +// Mutable returns a mutable reference to a composite type. +// +// If the field is unpopulated, it may allocate a composite value. +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType +// if not already stored. +// It panics if the field does not contain a composite type. +// +// Mutable is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_MsgVoteChainMetaResponse) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: uexecutor.v1.MsgVoteChainMetaResponse")) + } + panic(fmt.Errorf("message uexecutor.v1.MsgVoteChainMetaResponse does not contain field %s", fd.FullName())) + } +} + +// NewField returns a new value that is assignable to the field +// for the given descriptor. For scalars, this returns the default value. +// For lists, maps, and messages, this returns a new, empty, mutable value. +func (x *fastReflection_MsgVoteChainMetaResponse) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: uexecutor.v1.MsgVoteChainMetaResponse")) + } + panic(fmt.Errorf("message uexecutor.v1.MsgVoteChainMetaResponse does not contain field %s", fd.FullName())) + } +} + +// WhichOneof reports which field within the oneof is populated, +// returning nil if none are populated. +// It panics if the oneof descriptor does not belong to this message. +func (x *fastReflection_MsgVoteChainMetaResponse) WhichOneof(d protoreflect.OneofDescriptor) protoreflect.FieldDescriptor { + switch d.FullName() { + default: + panic(fmt.Errorf("%s is not a oneof field in uexecutor.v1.MsgVoteChainMetaResponse", d.FullName())) + } + panic("unreachable") +} + +// GetUnknown retrieves the entire list of unknown fields. +// The caller may only mutate the contents of the RawFields +// if the mutated bytes are stored back into the message with SetUnknown. +func (x *fastReflection_MsgVoteChainMetaResponse) GetUnknown() protoreflect.RawFields { + return x.unknownFields +} + +// SetUnknown stores an entire list of unknown fields. +// The raw fields must be syntactically valid according to the wire format. +// An implementation may panic if this is not the case. +// Once stored, the caller must not mutate the content of the RawFields. +// An empty RawFields may be passed to clear the fields. +// +// SetUnknown is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_MsgVoteChainMetaResponse) SetUnknown(fields protoreflect.RawFields) { + x.unknownFields = fields +} + +// IsValid reports whether the message is valid. +// +// An invalid message is an empty, read-only value. +// +// An invalid message often corresponds to a nil pointer of the concrete +// message type, but the details are implementation dependent. +// Validity is not part of the protobuf data model, and may not +// be preserved in marshaling or other operations. +func (x *fastReflection_MsgVoteChainMetaResponse) IsValid() bool { + return x != nil +} + +// ProtoMethods returns optional fastReflectionFeature-path implementations of various operations. +// This method may return nil. +// +// The returned methods type is identical to +// "google.golang.org/protobuf/runtime/protoiface".Methods. +// Consult the protoiface package documentation for details. +func (x *fastReflection_MsgVoteChainMetaResponse) ProtoMethods() *protoiface.Methods { + size := func(input protoiface.SizeInput) protoiface.SizeOutput { + x := input.Message.Interface().(*MsgVoteChainMetaResponse) + if x == nil { + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: 0, + } + } + options := runtime.SizeInputToOptions(input) + _ = options + var n int + var l int + _ = l + if x.unknownFields != nil { + n += len(x.unknownFields) + } + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: n, + } + } + + marshal := func(input protoiface.MarshalInput) (protoiface.MarshalOutput, error) { + x := input.Message.Interface().(*MsgVoteChainMetaResponse) + if x == nil { + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + options := runtime.MarshalInputToOptions(input) + _ = options + size := options.Size(x) + dAtA := make([]byte, size) + i := len(dAtA) + _ = i + var l int + _ = l + if x.unknownFields != nil { + i -= len(x.unknownFields) + copy(dAtA[i:], x.unknownFields) + } + if input.Buf != nil { + input.Buf = append(input.Buf, dAtA...) + } else { + input.Buf = dAtA + } + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + unmarshal := func(input protoiface.UnmarshalInput) (protoiface.UnmarshalOutput, error) { + x := input.Message.Interface().(*MsgVoteChainMetaResponse) + if x == nil { + return protoiface.UnmarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Flags: input.Flags, + }, nil + } + options := runtime.UnmarshalInputToOptions(input) + _ = options + dAtA := input.Buf + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, 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 protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: MsgVoteChainMetaResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: MsgVoteChainMetaResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := runtime.Skip(dAtA[iNdEx:]) + if err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + if !options.DiscardUnknown { + x.unknownFields = append(x.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + } + iNdEx += skippy + } + } + + if iNdEx > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, nil + } + return &protoiface.Methods{ + NoUnkeyedLiterals: struct{}{}, + Flags: protoiface.SupportMarshalDeterministic | protoiface.SupportUnmarshalDiscardUnknown, + Size: size, + Marshal: marshal, + Unmarshal: unmarshal, + Merge: nil, + CheckInitialized: nil, + } +} + // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.27.0 @@ -6163,6 +7147,101 @@ func (*MsgVoteGasPriceResponse) Descriptor() ([]byte, []int) { return file_uexecutor_v1_tx_proto_rawDescGZIP(), []int{11} } +// MsgVoteChainMeta is broadcasted by Universal Validators to submit observed chain metadata (gas price + block height) +type MsgVoteChainMeta struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Signer string `protobuf:"bytes,1,opt,name=signer,proto3" json:"signer,omitempty"` // Universal Validator address submitting the vote + ObservedChainId string `protobuf:"bytes,2,opt,name=observed_chain_id,json=observedChainId,proto3" json:"observed_chain_id,omitempty"` // CAIP-2 chain ID of observed external chain (e.g. "eip155:1") + Price uint64 `protobuf:"varint,3,opt,name=price,proto3" json:"price,omitempty"` // Observed gas price in wei + ChainHeight uint64 `protobuf:"varint,4,opt,name=chain_height,json=chainHeight,proto3" json:"chain_height,omitempty"` // Block height from which observation was made + ObservedAt uint64 `protobuf:"varint,5,opt,name=observed_at,json=observedAt,proto3" json:"observed_at,omitempty"` // Timestamp when the observation was made (unix seconds) +} + +func (x *MsgVoteChainMeta) Reset() { + *x = MsgVoteChainMeta{} + if protoimpl.UnsafeEnabled { + mi := &file_uexecutor_v1_tx_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MsgVoteChainMeta) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MsgVoteChainMeta) ProtoMessage() {} + +// Deprecated: Use MsgVoteChainMeta.ProtoReflect.Descriptor instead. +func (*MsgVoteChainMeta) Descriptor() ([]byte, []int) { + return file_uexecutor_v1_tx_proto_rawDescGZIP(), []int{12} +} + +func (x *MsgVoteChainMeta) GetSigner() string { + if x != nil { + return x.Signer + } + return "" +} + +func (x *MsgVoteChainMeta) GetObservedChainId() string { + if x != nil { + return x.ObservedChainId + } + return "" +} + +func (x *MsgVoteChainMeta) GetPrice() uint64 { + if x != nil { + return x.Price + } + return 0 +} + +func (x *MsgVoteChainMeta) GetChainHeight() uint64 { + if x != nil { + return x.ChainHeight + } + return 0 +} + +func (x *MsgVoteChainMeta) GetObservedAt() uint64 { + if x != nil { + return x.ObservedAt + } + return 0 +} + +// MsgVoteChainMetaResponse defines the response for MsgVoteChainMeta +type MsgVoteChainMetaResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *MsgVoteChainMetaResponse) Reset() { + *x = MsgVoteChainMetaResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_uexecutor_v1_tx_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MsgVoteChainMetaResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MsgVoteChainMetaResponse) ProtoMessage() {} + +// Deprecated: Use MsgVoteChainMetaResponse.ProtoReflect.Descriptor instead. +func (*MsgVoteChainMetaResponse) Descriptor() ([]byte, []int) { + return file_uexecutor_v1_tx_proto_rawDescGZIP(), []int{13} +} + var File_uexecutor_v1_tx_proto protoreflect.FileDescriptor var file_uexecutor_v1_tx_proto_rawDesc = []byte{ @@ -6172,152 +7251,177 @@ var file_uexecutor_v1_tx_proto_rawDesc = []byte{ 0x6e, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x6d, 0x73, 0x67, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x73, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x18, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2f, 0x76, 0x31, 0x2f, - 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x14, 0x67, 0x6f, 0x67, - 0x6f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x67, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x1a, 0x19, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, - 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xab, 0x01, 0x0a, - 0x0f, 0x4d, 0x73, 0x67, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, - 0x12, 0x36, 0x0a, 0x09, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x42, 0x18, 0xd2, 0xb4, 0x2d, 0x14, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, - 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x09, 0x61, - 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x32, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, - 0x6d, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, - 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x42, 0x04, - 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3a, 0x2c, 0x82, 0xe7, - 0xb0, 0x2a, 0x09, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x8a, 0xe7, 0xb0, 0x2a, - 0x19, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2f, 0x4d, 0x73, 0x67, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x22, 0x19, 0x0a, 0x17, 0x4d, 0x73, - 0x67, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xc0, 0x02, 0x0a, 0x11, 0x4d, 0x73, 0x67, 0x45, 0x78, 0x65, - 0x63, 0x75, 0x74, 0x65, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x30, 0x0a, 0x06, 0x73, - 0x69, 0x67, 0x6e, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, 0xd2, 0xb4, 0x2d, - 0x14, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x53, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x12, 0x52, 0x0a, - 0x14, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x75, 0x65, + 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1d, 0x75, 0x65, 0x78, + 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, + 0x6d, 0x65, 0x74, 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x14, 0x67, 0x6f, 0x67, 0x6f, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x67, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x1a, 0x19, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x63, + 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xab, 0x01, 0x0a, 0x0f, + 0x4d, 0x73, 0x67, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, + 0x36, 0x0a, 0x09, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x18, 0xd2, 0xb4, 0x2d, 0x14, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x41, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x09, 0x61, 0x75, + 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x32, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, + 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x42, 0x04, 0xc8, + 0xde, 0x1f, 0x00, 0x52, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3a, 0x2c, 0x82, 0xe7, 0xb0, + 0x2a, 0x09, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x8a, 0xe7, 0xb0, 0x2a, 0x19, + 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2f, 0x4d, 0x73, 0x67, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x22, 0x19, 0x0a, 0x17, 0x4d, 0x73, 0x67, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xc0, 0x02, 0x0a, 0x11, 0x4d, 0x73, 0x67, 0x45, 0x78, 0x65, 0x63, + 0x75, 0x74, 0x65, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x30, 0x0a, 0x06, 0x73, 0x69, + 0x67, 0x6e, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, 0xd2, 0xb4, 0x2d, 0x14, + 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x53, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x52, 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x12, 0x52, 0x0a, 0x14, + 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x75, 0x65, 0x78, + 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, + 0x73, 0x61, 0x6c, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x52, 0x12, 0x75, 0x6e, + 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, + 0x12, 0x4b, 0x0a, 0x11, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x5f, 0x70, 0x61, + 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x6e, 0x69, 0x76, 0x65, - 0x72, 0x73, 0x61, 0x6c, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x52, 0x12, 0x75, - 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, - 0x64, 0x12, 0x4b, 0x0a, 0x11, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x5f, 0x70, - 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x75, - 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x6e, 0x69, 0x76, - 0x65, 0x72, 0x73, 0x61, 0x6c, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x10, 0x75, 0x6e, - 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x2b, - 0x0a, 0x11, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, - 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x76, 0x65, 0x72, 0x69, 0x66, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x3a, 0x2b, 0x82, 0xe7, 0xb0, - 0x2a, 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x8a, 0xe7, 0xb0, 0x2a, 0x1b, 0x75, 0x65, 0x78, - 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2f, 0x4d, 0x73, 0x67, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, - 0x65, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x1b, 0x0a, 0x19, 0x4d, 0x73, 0x67, 0x45, - 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xa9, 0x02, 0x0a, 0x0d, 0x4d, 0x73, 0x67, 0x4d, 0x69, 0x67, - 0x72, 0x61, 0x74, 0x65, 0x55, 0x45, 0x41, 0x12, 0x30, 0x0a, 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, - 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, 0xd2, 0xb4, 0x2d, 0x14, 0x63, 0x6f, 0x73, - 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x53, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x52, 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x12, 0x52, 0x0a, 0x14, 0x75, 0x6e, 0x69, - 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, - 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, - 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x52, 0x12, 0x75, 0x6e, 0x69, 0x76, 0x65, - 0x72, 0x73, 0x61, 0x6c, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x4b, 0x0a, - 0x11, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x61, 0x79, 0x6c, 0x6f, - 0x61, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, - 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x10, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x69, - 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, - 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x3a, 0x27, 0x82, 0xe7, 0xb0, 0x2a, 0x06, 0x73, - 0x69, 0x67, 0x6e, 0x65, 0x72, 0x8a, 0xe7, 0xb0, 0x2a, 0x17, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, - 0x74, 0x6f, 0x72, 0x2f, 0x4d, 0x73, 0x67, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x55, 0x45, - 0x41, 0x22, 0x17, 0x0a, 0x15, 0x4d, 0x73, 0x67, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x55, - 0x45, 0x41, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x96, 0x01, 0x0a, 0x0e, 0x4d, - 0x73, 0x67, 0x56, 0x6f, 0x74, 0x65, 0x49, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x30, 0x0a, - 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, 0xd2, - 0xb4, 0x2d, 0x14, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x12, - 0x2f, 0x0a, 0x07, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x15, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, - 0x49, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x07, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, - 0x3a, 0x21, 0x82, 0xe7, 0xb0, 0x2a, 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x8a, 0xe7, 0xb0, - 0x2a, 0x11, 0x75, 0x65, 0x2f, 0x4d, 0x73, 0x67, 0x56, 0x6f, 0x74, 0x65, 0x49, 0x6e, 0x62, 0x6f, - 0x75, 0x6e, 0x64, 0x22, 0x18, 0x0a, 0x16, 0x4d, 0x73, 0x67, 0x56, 0x6f, 0x74, 0x65, 0x49, 0x6e, - 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xde, 0x01, - 0x0a, 0x0f, 0x4d, 0x73, 0x67, 0x56, 0x6f, 0x74, 0x65, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, - 0x64, 0x12, 0x30, 0x0a, 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x42, 0x18, 0xd2, 0xb4, 0x2d, 0x14, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x06, 0x73, 0x69, 0x67, - 0x6e, 0x65, 0x72, 0x12, 0x13, 0x0a, 0x05, 0x74, 0x78, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x74, 0x78, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x75, 0x74, 0x78, 0x5f, - 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x75, 0x74, 0x78, 0x49, 0x64, 0x12, - 0x42, 0x0a, 0x0b, 0x6f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5f, 0x74, 0x78, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, - 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x4f, 0x62, 0x73, 0x65, - 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x64, 0x54, 0x78, 0x3a, 0x29, 0x82, 0xe7, 0xb0, 0x2a, 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, - 0x8a, 0xe7, 0xb0, 0x2a, 0x19, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2f, 0x4d, - 0x73, 0x67, 0x56, 0x6f, 0x74, 0x65, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x22, 0x19, - 0x0a, 0x17, 0x4d, 0x73, 0x67, 0x56, 0x6f, 0x74, 0x65, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, - 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xd3, 0x01, 0x0a, 0x0f, 0x4d, 0x73, - 0x67, 0x56, 0x6f, 0x74, 0x65, 0x47, 0x61, 0x73, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x30, 0x0a, - 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, 0xd2, - 0xb4, 0x2d, 0x14, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x12, - 0x2a, 0x0a, 0x11, 0x6f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5f, 0x63, 0x68, 0x61, 0x69, - 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6f, 0x62, 0x73, 0x65, - 0x72, 0x76, 0x65, 0x64, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x70, - 0x72, 0x69, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x70, 0x72, 0x69, 0x63, - 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, - 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75, - 0x6d, 0x62, 0x65, 0x72, 0x3a, 0x29, 0x82, 0xe7, 0xb0, 0x2a, 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, - 0x72, 0x8a, 0xe7, 0xb0, 0x2a, 0x19, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2f, - 0x4d, 0x73, 0x67, 0x56, 0x6f, 0x74, 0x65, 0x47, 0x61, 0x73, 0x50, 0x72, 0x69, 0x63, 0x65, 0x22, - 0x19, 0x0a, 0x17, 0x4d, 0x73, 0x67, 0x56, 0x6f, 0x74, 0x65, 0x47, 0x61, 0x73, 0x50, 0x72, 0x69, - 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0x8d, 0x04, 0x0a, 0x03, 0x4d, - 0x73, 0x67, 0x12, 0x54, 0x0a, 0x0c, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x61, 0x72, 0x61, - 0x6d, 0x73, 0x12, 0x1d, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, - 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, - 0x73, 0x1a, 0x25, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, - 0x2e, 0x4d, 0x73, 0x67, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5a, 0x0a, 0x0e, 0x45, 0x78, 0x65, 0x63, - 0x75, 0x74, 0x65, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x1f, 0x2e, 0x75, 0x65, 0x78, - 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x45, 0x78, 0x65, - 0x63, 0x75, 0x74, 0x65, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x1a, 0x27, 0x2e, 0x75, 0x65, - 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x45, 0x78, + 0x72, 0x73, 0x61, 0x6c, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x10, 0x75, 0x6e, 0x69, + 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x2b, 0x0a, + 0x11, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, + 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x3a, 0x2b, 0x82, 0xe7, 0xb0, 0x2a, + 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x8a, 0xe7, 0xb0, 0x2a, 0x1b, 0x75, 0x65, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2f, 0x4d, 0x73, 0x67, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, + 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x1b, 0x0a, 0x19, 0x4d, 0x73, 0x67, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4e, 0x0a, 0x0a, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x55, - 0x45, 0x41, 0x12, 0x1b, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, - 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x55, 0x45, 0x41, 0x1a, - 0x23, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4d, - 0x73, 0x67, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x55, 0x45, 0x41, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x51, 0x0a, 0x0b, 0x56, 0x6f, 0x74, 0x65, 0x49, 0x6e, 0x62, 0x6f, - 0x75, 0x6e, 0x64, 0x12, 0x1c, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, - 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x56, 0x6f, 0x74, 0x65, 0x49, 0x6e, 0x62, 0x6f, 0x75, 0x6e, - 0x64, 0x1a, 0x24, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, - 0x2e, 0x4d, 0x73, 0x67, 0x56, 0x6f, 0x74, 0x65, 0x49, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x54, 0x0a, 0x0c, 0x56, 0x6f, 0x74, 0x65, 0x4f, - 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x1d, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, - 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x56, 0x6f, 0x74, 0x65, 0x4f, 0x75, - 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x1a, 0x25, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, - 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x56, 0x6f, 0x74, 0x65, 0x4f, 0x75, 0x74, - 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x54, 0x0a, - 0x0c, 0x56, 0x6f, 0x74, 0x65, 0x47, 0x61, 0x73, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x1d, 0x2e, - 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, - 0x56, 0x6f, 0x74, 0x65, 0x47, 0x61, 0x73, 0x50, 0x72, 0x69, 0x63, 0x65, 0x1a, 0x25, 0x2e, 0x75, - 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x56, - 0x6f, 0x74, 0x65, 0x47, 0x61, 0x73, 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x1a, 0x05, 0x80, 0xe7, 0xb0, 0x2a, 0x01, 0x42, 0xaf, 0x01, 0x0a, 0x10, 0x63, - 0x6f, 0x6d, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x42, - 0x07, 0x54, 0x78, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x41, 0x67, 0x69, 0x74, 0x68, - 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x75, 0x73, 0x68, 0x63, 0x68, 0x61, 0x69, 0x6e, - 0x2f, 0x70, 0x75, 0x73, 0x68, 0x2d, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x2d, 0x6e, 0x6f, 0x64, 0x65, - 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2f, 0x76, - 0x31, 0x3b, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x76, 0x31, 0xa2, 0x02, 0x03, - 0x55, 0x58, 0x58, 0xaa, 0x02, 0x0c, 0x55, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, - 0x56, 0x31, 0xca, 0x02, 0x0c, 0x55, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x5c, 0x56, - 0x31, 0xe2, 0x02, 0x18, 0x55, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x5c, 0x56, 0x31, - 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0d, 0x55, - 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x33, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xa9, 0x02, 0x0a, 0x0d, 0x4d, 0x73, 0x67, 0x4d, 0x69, 0x67, 0x72, + 0x61, 0x74, 0x65, 0x55, 0x45, 0x41, 0x12, 0x30, 0x0a, 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, 0xd2, 0xb4, 0x2d, 0x14, 0x63, 0x6f, 0x73, 0x6d, + 0x6f, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x52, 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x12, 0x52, 0x0a, 0x14, 0x75, 0x6e, 0x69, 0x76, + 0x65, 0x72, 0x73, 0x61, 0x6c, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, + 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x41, + 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x52, 0x12, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, + 0x73, 0x61, 0x6c, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x4b, 0x0a, 0x11, + 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, + 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x10, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x69, 0x67, + 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x69, + 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x3a, 0x27, 0x82, 0xe7, 0xb0, 0x2a, 0x06, 0x73, 0x69, + 0x67, 0x6e, 0x65, 0x72, 0x8a, 0xe7, 0xb0, 0x2a, 0x17, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, + 0x6f, 0x72, 0x2f, 0x4d, 0x73, 0x67, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x55, 0x45, 0x41, + 0x22, 0x17, 0x0a, 0x15, 0x4d, 0x73, 0x67, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x55, 0x45, + 0x41, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x96, 0x01, 0x0a, 0x0e, 0x4d, 0x73, + 0x67, 0x56, 0x6f, 0x74, 0x65, 0x49, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x30, 0x0a, 0x06, + 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, 0xd2, 0xb4, + 0x2d, 0x14, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x12, 0x2f, + 0x0a, 0x07, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x15, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x49, + 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x07, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x3a, + 0x21, 0x82, 0xe7, 0xb0, 0x2a, 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x8a, 0xe7, 0xb0, 0x2a, + 0x11, 0x75, 0x65, 0x2f, 0x4d, 0x73, 0x67, 0x56, 0x6f, 0x74, 0x65, 0x49, 0x6e, 0x62, 0x6f, 0x75, + 0x6e, 0x64, 0x22, 0x18, 0x0a, 0x16, 0x4d, 0x73, 0x67, 0x56, 0x6f, 0x74, 0x65, 0x49, 0x6e, 0x62, + 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xde, 0x01, 0x0a, + 0x0f, 0x4d, 0x73, 0x67, 0x56, 0x6f, 0x74, 0x65, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, + 0x12, 0x30, 0x0a, 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x18, 0xd2, 0xb4, 0x2d, 0x14, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x06, 0x73, 0x69, 0x67, 0x6e, + 0x65, 0x72, 0x12, 0x13, 0x0a, 0x05, 0x74, 0x78, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x74, 0x78, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x75, 0x74, 0x78, 0x5f, 0x69, + 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x75, 0x74, 0x78, 0x49, 0x64, 0x12, 0x42, + 0x0a, 0x0b, 0x6f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5f, 0x74, 0x78, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, + 0x76, 0x31, 0x2e, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x4f, 0x62, 0x73, 0x65, 0x72, + 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, + 0x54, 0x78, 0x3a, 0x29, 0x82, 0xe7, 0xb0, 0x2a, 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x8a, + 0xe7, 0xb0, 0x2a, 0x19, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2f, 0x4d, 0x73, + 0x67, 0x56, 0x6f, 0x74, 0x65, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x22, 0x19, 0x0a, + 0x17, 0x4d, 0x73, 0x67, 0x56, 0x6f, 0x74, 0x65, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xd3, 0x01, 0x0a, 0x0f, 0x4d, 0x73, 0x67, + 0x56, 0x6f, 0x74, 0x65, 0x47, 0x61, 0x73, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x30, 0x0a, 0x06, + 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, 0xd2, 0xb4, + 0x2d, 0x14, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x12, 0x2a, + 0x0a, 0x11, 0x6f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5f, 0x63, 0x68, 0x61, 0x69, 0x6e, + 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6f, 0x62, 0x73, 0x65, 0x72, + 0x76, 0x65, 0x64, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x72, + 0x69, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, + 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x3a, 0x29, 0x82, 0xe7, 0xb0, 0x2a, 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, + 0x8a, 0xe7, 0xb0, 0x2a, 0x19, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2f, 0x4d, + 0x73, 0x67, 0x56, 0x6f, 0x74, 0x65, 0x47, 0x61, 0x73, 0x50, 0x72, 0x69, 0x63, 0x65, 0x22, 0x19, + 0x0a, 0x17, 0x4d, 0x73, 0x67, 0x56, 0x6f, 0x74, 0x65, 0x47, 0x61, 0x73, 0x50, 0x72, 0x69, 0x63, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xf6, 0x01, 0x0a, 0x10, 0x4d, 0x73, + 0x67, 0x56, 0x6f, 0x74, 0x65, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x30, + 0x0a, 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, + 0xd2, 0xb4, 0x2d, 0x14, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, + 0x12, 0x2a, 0x0a, 0x11, 0x6f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5f, 0x63, 0x68, 0x61, + 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6f, 0x62, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x64, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, + 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x70, 0x72, 0x69, + 0x63, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x68, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x48, + 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x6f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x64, 0x5f, 0x61, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x6f, 0x62, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x64, 0x41, 0x74, 0x3a, 0x2a, 0x82, 0xe7, 0xb0, 0x2a, 0x06, 0x73, 0x69, 0x67, + 0x6e, 0x65, 0x72, 0x8a, 0xe7, 0xb0, 0x2a, 0x1a, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, + 0x72, 0x2f, 0x4d, 0x73, 0x67, 0x56, 0x6f, 0x74, 0x65, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x4d, 0x65, + 0x74, 0x61, 0x22, 0x1a, 0x0a, 0x18, 0x4d, 0x73, 0x67, 0x56, 0x6f, 0x74, 0x65, 0x43, 0x68, 0x61, + 0x69, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0xe6, + 0x04, 0x0a, 0x03, 0x4d, 0x73, 0x67, 0x12, 0x54, 0x0a, 0x0c, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x1d, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, + 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, + 0x61, 0x72, 0x61, 0x6d, 0x73, 0x1a, 0x25, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, + 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x61, + 0x72, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5a, 0x0a, 0x0e, + 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x1f, + 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, + 0x67, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x1a, + 0x27, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4d, + 0x73, 0x67, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4e, 0x0a, 0x0a, 0x4d, 0x69, 0x67, 0x72, + 0x61, 0x74, 0x65, 0x55, 0x45, 0x41, 0x12, 0x1b, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, + 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, + 0x55, 0x45, 0x41, 0x1a, 0x23, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, + 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x55, 0x45, 0x41, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x51, 0x0a, 0x0b, 0x56, 0x6f, 0x74, 0x65, + 0x49, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x1c, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x56, 0x6f, 0x74, 0x65, 0x49, 0x6e, + 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x1a, 0x24, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, + 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x56, 0x6f, 0x74, 0x65, 0x49, 0x6e, 0x62, 0x6f, + 0x75, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x54, 0x0a, 0x0c, 0x56, + 0x6f, 0x74, 0x65, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x1d, 0x2e, 0x75, 0x65, + 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x56, 0x6f, + 0x74, 0x65, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x1a, 0x25, 0x2e, 0x75, 0x65, 0x78, + 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x56, 0x6f, 0x74, + 0x65, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x54, 0x0a, 0x0c, 0x56, 0x6f, 0x74, 0x65, 0x47, 0x61, 0x73, 0x50, 0x72, 0x69, 0x63, + 0x65, 0x12, 0x1d, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, + 0x2e, 0x4d, 0x73, 0x67, 0x56, 0x6f, 0x74, 0x65, 0x47, 0x61, 0x73, 0x50, 0x72, 0x69, 0x63, 0x65, + 0x1a, 0x25, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, + 0x4d, 0x73, 0x67, 0x56, 0x6f, 0x74, 0x65, 0x47, 0x61, 0x73, 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x57, 0x0a, 0x0d, 0x56, 0x6f, 0x74, 0x65, 0x43, + 0x68, 0x61, 0x69, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x1e, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, + 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x56, 0x6f, 0x74, 0x65, 0x43, + 0x68, 0x61, 0x69, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x1a, 0x26, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, + 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x56, 0x6f, 0x74, 0x65, 0x43, + 0x68, 0x61, 0x69, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x1a, 0x05, 0x80, 0xe7, 0xb0, 0x2a, 0x01, 0x42, 0xaf, 0x01, 0x0a, 0x10, 0x63, 0x6f, 0x6d, 0x2e, + 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x42, 0x07, 0x54, 0x78, + 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x41, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x75, 0x73, 0x68, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x2f, 0x70, 0x75, + 0x73, 0x68, 0x2d, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x2d, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x61, 0x70, + 0x69, 0x2f, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2f, 0x76, 0x31, 0x3b, 0x75, + 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x55, 0x58, 0x58, + 0xaa, 0x02, 0x0c, 0x55, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x56, 0x31, 0xca, + 0x02, 0x0c, 0x55, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x5c, 0x56, 0x31, 0xe2, 0x02, + 0x18, 0x55, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, + 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0d, 0x55, 0x65, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x6f, 0x72, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x33, } var ( @@ -6332,7 +7436,7 @@ func file_uexecutor_v1_tx_proto_rawDescGZIP() []byte { return file_uexecutor_v1_tx_proto_rawDescData } -var file_uexecutor_v1_tx_proto_msgTypes = make([]protoimpl.MessageInfo, 12) +var file_uexecutor_v1_tx_proto_msgTypes = make([]protoimpl.MessageInfo, 14) var file_uexecutor_v1_tx_proto_goTypes = []interface{}{ (*MsgUpdateParams)(nil), // 0: uexecutor.v1.MsgUpdateParams (*MsgUpdateParamsResponse)(nil), // 1: uexecutor.v1.MsgUpdateParamsResponse @@ -6346,35 +7450,39 @@ var file_uexecutor_v1_tx_proto_goTypes = []interface{}{ (*MsgVoteOutboundResponse)(nil), // 9: uexecutor.v1.MsgVoteOutboundResponse (*MsgVoteGasPrice)(nil), // 10: uexecutor.v1.MsgVoteGasPrice (*MsgVoteGasPriceResponse)(nil), // 11: uexecutor.v1.MsgVoteGasPriceResponse - (*Params)(nil), // 12: uexecutor.v1.Params - (*UniversalAccountId)(nil), // 13: uexecutor.v1.UniversalAccountId - (*UniversalPayload)(nil), // 14: uexecutor.v1.UniversalPayload - (*MigrationPayload)(nil), // 15: uexecutor.v1.MigrationPayload - (*Inbound)(nil), // 16: uexecutor.v1.Inbound - (*OutboundObservation)(nil), // 17: uexecutor.v1.OutboundObservation + (*MsgVoteChainMeta)(nil), // 12: uexecutor.v1.MsgVoteChainMeta + (*MsgVoteChainMetaResponse)(nil), // 13: uexecutor.v1.MsgVoteChainMetaResponse + (*Params)(nil), // 14: uexecutor.v1.Params + (*UniversalAccountId)(nil), // 15: uexecutor.v1.UniversalAccountId + (*UniversalPayload)(nil), // 16: uexecutor.v1.UniversalPayload + (*MigrationPayload)(nil), // 17: uexecutor.v1.MigrationPayload + (*Inbound)(nil), // 18: uexecutor.v1.Inbound + (*OutboundObservation)(nil), // 19: uexecutor.v1.OutboundObservation } var file_uexecutor_v1_tx_proto_depIdxs = []int32{ - 12, // 0: uexecutor.v1.MsgUpdateParams.params:type_name -> uexecutor.v1.Params - 13, // 1: uexecutor.v1.MsgExecutePayload.universal_account_id:type_name -> uexecutor.v1.UniversalAccountId - 14, // 2: uexecutor.v1.MsgExecutePayload.universal_payload:type_name -> uexecutor.v1.UniversalPayload - 13, // 3: uexecutor.v1.MsgMigrateUEA.universal_account_id:type_name -> uexecutor.v1.UniversalAccountId - 15, // 4: uexecutor.v1.MsgMigrateUEA.migration_payload:type_name -> uexecutor.v1.MigrationPayload - 16, // 5: uexecutor.v1.MsgVoteInbound.inbound:type_name -> uexecutor.v1.Inbound - 17, // 6: uexecutor.v1.MsgVoteOutbound.observed_tx:type_name -> uexecutor.v1.OutboundObservation + 14, // 0: uexecutor.v1.MsgUpdateParams.params:type_name -> uexecutor.v1.Params + 15, // 1: uexecutor.v1.MsgExecutePayload.universal_account_id:type_name -> uexecutor.v1.UniversalAccountId + 16, // 2: uexecutor.v1.MsgExecutePayload.universal_payload:type_name -> uexecutor.v1.UniversalPayload + 15, // 3: uexecutor.v1.MsgMigrateUEA.universal_account_id:type_name -> uexecutor.v1.UniversalAccountId + 17, // 4: uexecutor.v1.MsgMigrateUEA.migration_payload:type_name -> uexecutor.v1.MigrationPayload + 18, // 5: uexecutor.v1.MsgVoteInbound.inbound:type_name -> uexecutor.v1.Inbound + 19, // 6: uexecutor.v1.MsgVoteOutbound.observed_tx:type_name -> uexecutor.v1.OutboundObservation 0, // 7: uexecutor.v1.Msg.UpdateParams:input_type -> uexecutor.v1.MsgUpdateParams 2, // 8: uexecutor.v1.Msg.ExecutePayload:input_type -> uexecutor.v1.MsgExecutePayload 4, // 9: uexecutor.v1.Msg.MigrateUEA:input_type -> uexecutor.v1.MsgMigrateUEA 6, // 10: uexecutor.v1.Msg.VoteInbound:input_type -> uexecutor.v1.MsgVoteInbound 8, // 11: uexecutor.v1.Msg.VoteOutbound:input_type -> uexecutor.v1.MsgVoteOutbound 10, // 12: uexecutor.v1.Msg.VoteGasPrice:input_type -> uexecutor.v1.MsgVoteGasPrice - 1, // 13: uexecutor.v1.Msg.UpdateParams:output_type -> uexecutor.v1.MsgUpdateParamsResponse - 3, // 14: uexecutor.v1.Msg.ExecutePayload:output_type -> uexecutor.v1.MsgExecutePayloadResponse - 5, // 15: uexecutor.v1.Msg.MigrateUEA:output_type -> uexecutor.v1.MsgMigrateUEAResponse - 7, // 16: uexecutor.v1.Msg.VoteInbound:output_type -> uexecutor.v1.MsgVoteInboundResponse - 9, // 17: uexecutor.v1.Msg.VoteOutbound:output_type -> uexecutor.v1.MsgVoteOutboundResponse - 11, // 18: uexecutor.v1.Msg.VoteGasPrice:output_type -> uexecutor.v1.MsgVoteGasPriceResponse - 13, // [13:19] is the sub-list for method output_type - 7, // [7:13] is the sub-list for method input_type + 12, // 13: uexecutor.v1.Msg.VoteChainMeta:input_type -> uexecutor.v1.MsgVoteChainMeta + 1, // 14: uexecutor.v1.Msg.UpdateParams:output_type -> uexecutor.v1.MsgUpdateParamsResponse + 3, // 15: uexecutor.v1.Msg.ExecutePayload:output_type -> uexecutor.v1.MsgExecutePayloadResponse + 5, // 16: uexecutor.v1.Msg.MigrateUEA:output_type -> uexecutor.v1.MsgMigrateUEAResponse + 7, // 17: uexecutor.v1.Msg.VoteInbound:output_type -> uexecutor.v1.MsgVoteInboundResponse + 9, // 18: uexecutor.v1.Msg.VoteOutbound:output_type -> uexecutor.v1.MsgVoteOutboundResponse + 11, // 19: uexecutor.v1.Msg.VoteGasPrice:output_type -> uexecutor.v1.MsgVoteGasPriceResponse + 13, // 20: uexecutor.v1.Msg.VoteChainMeta:output_type -> uexecutor.v1.MsgVoteChainMetaResponse + 14, // [14:21] is the sub-list for method output_type + 7, // [7:14] is the sub-list for method input_type 7, // [7:7] is the sub-list for extension type_name 7, // [7:7] is the sub-list for extension extendee 0, // [0:7] is the sub-list for field type_name @@ -6386,6 +7494,7 @@ func file_uexecutor_v1_tx_proto_init() { return } file_uexecutor_v1_types_proto_init() + file_uexecutor_v1_chain_meta_proto_init() if !protoimpl.UnsafeEnabled { file_uexecutor_v1_tx_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*MsgUpdateParams); i { @@ -6531,6 +7640,30 @@ func file_uexecutor_v1_tx_proto_init() { return nil } } + file_uexecutor_v1_tx_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MsgVoteChainMeta); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_uexecutor_v1_tx_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MsgVoteChainMetaResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } type x struct{} out := protoimpl.TypeBuilder{ @@ -6538,7 +7671,7 @@ func file_uexecutor_v1_tx_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_uexecutor_v1_tx_proto_rawDesc, NumEnums: 0, - NumMessages: 12, + NumMessages: 14, NumExtensions: 0, NumServices: 1, }, diff --git a/api/uexecutor/v1/tx_grpc.pb.go b/api/uexecutor/v1/tx_grpc.pb.go index 7da7d9f3..f2e562d4 100644 --- a/api/uexecutor/v1/tx_grpc.pb.go +++ b/api/uexecutor/v1/tx_grpc.pb.go @@ -25,6 +25,7 @@ const ( Msg_VoteInbound_FullMethodName = "/uexecutor.v1.Msg/VoteInbound" Msg_VoteOutbound_FullMethodName = "/uexecutor.v1.Msg/VoteOutbound" Msg_VoteGasPrice_FullMethodName = "/uexecutor.v1.Msg/VoteGasPrice" + Msg_VoteChainMeta_FullMethodName = "/uexecutor.v1.Msg/VoteChainMeta" ) // MsgClient is the client API for Msg service. @@ -45,6 +46,8 @@ type MsgClient interface { VoteOutbound(ctx context.Context, in *MsgVoteOutbound, opts ...grpc.CallOption) (*MsgVoteOutboundResponse, error) // VoteGasPrice defines a message for universal validators to vote on the gas price VoteGasPrice(ctx context.Context, in *MsgVoteGasPrice, opts ...grpc.CallOption) (*MsgVoteGasPriceResponse, error) + // VoteChainMeta defines a message for universal validators to vote on chain metadata (gas price + block height) + VoteChainMeta(ctx context.Context, in *MsgVoteChainMeta, opts ...grpc.CallOption) (*MsgVoteChainMetaResponse, error) } type msgClient struct { @@ -109,6 +112,15 @@ func (c *msgClient) VoteGasPrice(ctx context.Context, in *MsgVoteGasPrice, opts return out, nil } +func (c *msgClient) VoteChainMeta(ctx context.Context, in *MsgVoteChainMeta, opts ...grpc.CallOption) (*MsgVoteChainMetaResponse, error) { + out := new(MsgVoteChainMetaResponse) + err := c.cc.Invoke(ctx, Msg_VoteChainMeta_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // MsgServer is the server API for Msg service. // All implementations must embed UnimplementedMsgServer // for forward compatibility @@ -127,6 +139,8 @@ type MsgServer interface { VoteOutbound(context.Context, *MsgVoteOutbound) (*MsgVoteOutboundResponse, error) // VoteGasPrice defines a message for universal validators to vote on the gas price VoteGasPrice(context.Context, *MsgVoteGasPrice) (*MsgVoteGasPriceResponse, error) + // VoteChainMeta defines a message for universal validators to vote on chain metadata (gas price + block height) + VoteChainMeta(context.Context, *MsgVoteChainMeta) (*MsgVoteChainMetaResponse, error) mustEmbedUnimplementedMsgServer() } @@ -152,6 +166,9 @@ func (UnimplementedMsgServer) VoteOutbound(context.Context, *MsgVoteOutbound) (* func (UnimplementedMsgServer) VoteGasPrice(context.Context, *MsgVoteGasPrice) (*MsgVoteGasPriceResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method VoteGasPrice not implemented") } +func (UnimplementedMsgServer) VoteChainMeta(context.Context, *MsgVoteChainMeta) (*MsgVoteChainMetaResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method VoteChainMeta not implemented") +} func (UnimplementedMsgServer) mustEmbedUnimplementedMsgServer() {} // UnsafeMsgServer may be embedded to opt out of forward compatibility for this service. @@ -273,6 +290,24 @@ func _Msg_VoteGasPrice_Handler(srv interface{}, ctx context.Context, dec func(in return interceptor(ctx, in, info, handler) } +func _Msg_VoteChainMeta_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgVoteChainMeta) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).VoteChainMeta(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Msg_VoteChainMeta_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).VoteChainMeta(ctx, req.(*MsgVoteChainMeta)) + } + return interceptor(ctx, in, info, handler) +} + // Msg_ServiceDesc is the grpc.ServiceDesc for Msg service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -304,6 +339,10 @@ var Msg_ServiceDesc = grpc.ServiceDesc{ MethodName: "VoteGasPrice", Handler: _Msg_VoteGasPrice_Handler, }, + { + MethodName: "VoteChainMeta", + Handler: _Msg_VoteChainMeta_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "uexecutor/v1/tx.proto", From 166f9697280508e6dceb59f6868d031c92475f77 Mon Sep 17 00:00:00 2001 From: Nilesh Gupta Date: Thu, 12 Mar 2026 12:53:57 +0530 Subject: [PATCH 04/36] feat: added chain_meta keys and keeper storage --- x/uexecutor/keeper/keeper.go | 11 +++++++++++ x/uexecutor/types/keys.go | 3 +++ 2 files changed, 14 insertions(+) diff --git a/x/uexecutor/keeper/keeper.go b/x/uexecutor/keeper/keeper.go index c959e948..1fd4d8c3 100755 --- a/x/uexecutor/keeper/keeper.go +++ b/x/uexecutor/keeper/keeper.go @@ -49,6 +49,9 @@ type Keeper struct { // GasPrices collection stores aggregated gas price data for each chain GasPrices collections.Map[string, types.GasPrice] + + // ChainMetas collection stores aggregated chain metadata (gas price + block height) for each chain + ChainMetas collections.Map[string, types.ChainMeta] } // NewKeeper creates a new Keeper instance @@ -118,6 +121,14 @@ func NewKeeper( collections.StringKey, codec.CollValue[types.GasPrice](cdc), ), + + ChainMetas: collections.NewMap( + sb, + types.ChainMetaKey, + types.ChainMetasName, + collections.StringKey, + codec.CollValue[types.ChainMeta](cdc), + ), } return k diff --git a/x/uexecutor/types/keys.go b/x/uexecutor/types/keys.go index d2c7c880..cc8ced32 100755 --- a/x/uexecutor/types/keys.go +++ b/x/uexecutor/types/keys.go @@ -30,6 +30,9 @@ var ( GasPricesKey = collections.NewPrefix(5) GasPricesName = "gas_prices" + + ChainMetaKey = collections.NewPrefix(6) + ChainMetasName = "chain_metas" ) const ( From ddaefd00b6d01d04c4444bb8925b860e36cdeb6a Mon Sep 17 00:00:00 2001 From: Nilesh Gupta Date: Thu, 12 Mar 2026 12:55:36 +0530 Subject: [PATCH 05/36] feat: added vote_chain_meta types --- x/uexecutor/types/chain_meta.go | 19 +++++++++ x/uexecutor/types/msg_vote_chain_meta.go | 50 ++++++++++++++++++++++++ 2 files changed, 69 insertions(+) create mode 100644 x/uexecutor/types/chain_meta.go create mode 100644 x/uexecutor/types/msg_vote_chain_meta.go diff --git a/x/uexecutor/types/chain_meta.go b/x/uexecutor/types/chain_meta.go new file mode 100644 index 00000000..8a80d9c7 --- /dev/null +++ b/x/uexecutor/types/chain_meta.go @@ -0,0 +1,19 @@ +package types + +import ( + "encoding/json" +) + +// Stringer method for ChainMeta. +func (p ChainMeta) String() string { + bz, err := json.Marshal(p) + if err != nil { + panic(err) + } + return string(bz) +} + +// ValidateBasic does the sanity check on the ChainMeta fields. +func (p ChainMeta) ValidateBasic() error { + return nil +} diff --git a/x/uexecutor/types/msg_vote_chain_meta.go b/x/uexecutor/types/msg_vote_chain_meta.go new file mode 100644 index 00000000..ef7f9fb6 --- /dev/null +++ b/x/uexecutor/types/msg_vote_chain_meta.go @@ -0,0 +1,50 @@ +package types + +import ( + "cosmossdk.io/errors" + sdk "github.com/cosmos/cosmos-sdk/types" +) + +var ( + _ sdk.Msg = &MsgVoteChainMeta{} +) + +// NewMsgVoteChainMeta creates new instance of MsgVoteChainMeta +func NewMsgVoteChainMeta( + sender sdk.Address, + observedChainId string, + price, chainHeight, observedAt uint64, +) *MsgVoteChainMeta { + return &MsgVoteChainMeta{ + Signer: sender.String(), + ObservedChainId: observedChainId, + Price: price, + ChainHeight: chainHeight, + ObservedAt: observedAt, + } +} + +// Route returns the name of the module +func (msg MsgVoteChainMeta) Route() string { return ModuleName } + +// Type returns the action +func (msg MsgVoteChainMeta) Type() string { return "msg_vote_chain_meta" } + +// GetSignBytes implements the LegacyMsg interface. +func (msg MsgVoteChainMeta) GetSignBytes() []byte { + return sdk.MustSortJSON(AminoCdc.MustMarshalJSON(&msg)) +} + +// GetSigners returns the expected signers for a MsgVoteChainMeta message. +func (msg *MsgVoteChainMeta) GetSigners() []sdk.AccAddress { + addr, _ := sdk.AccAddressFromBech32(msg.Signer) + return []sdk.AccAddress{addr} +} + +// ValidateBasic does a sanity check on the provided data. +func (msg *MsgVoteChainMeta) ValidateBasic() error { + if _, err := sdk.AccAddressFromBech32(msg.Signer); err != nil { + return errors.Wrap(err, "invalid signer address") + } + return nil +} From 1fddca9c0cdcee541b71a1e46a87d9272fb1cd8a Mon Sep 17 00:00:00 2001 From: Nilesh Gupta Date: Thu, 12 Mar 2026 12:56:37 +0530 Subject: [PATCH 06/36] feat: added helper method in evm to update chain meta in UniversalCore --- x/uexecutor/keeper/evm.go | 45 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/x/uexecutor/keeper/evm.go b/x/uexecutor/keeper/evm.go index 292de1e7..956ba68f 100644 --- a/x/uexecutor/keeper/evm.go +++ b/x/uexecutor/keeper/evm.go @@ -316,6 +316,51 @@ func (k Keeper) CallUniversalCoreSetGasPrice( ) } +// Calls UniversalCore Contract to set chain metadata (gas price + chain height + observed timestamp) +func (k Keeper) CallUniversalCoreSetChainMeta( + ctx sdk.Context, + chainNamespace string, + price *big.Int, + chainHeight *big.Int, + observedAt *big.Int, +) (*evmtypes.MsgEthereumTxResponse, error) { + handlerAddr := common.HexToAddress(uregistrytypes.SYSTEM_CONTRACTS["UNIVERSAL_CORE"].Address) + + abi, err := types.ParseUniversalCoreABI() + if err != nil { + return nil, errors.Wrap(err, "failed to parse Handler Contract ABI") + } + + ueModuleAccAddress, _ := k.GetUeModuleAddress(ctx) + + nonce, err := k.GetModuleAccountNonce(ctx) + if err != nil { + return nil, err + } + + if _, err := k.IncrementModuleAccountNonce(ctx); err != nil { + return nil, err + } + + return k.evmKeeper.DerivedEVMCall( + ctx, + abi, + ueModuleAccAddress, + handlerAddr, + big.NewInt(0), + nil, + true, + false, + true, + &nonce, + "setChainMeta", + chainNamespace, + price, + chainHeight, + observedAt, + ) +} + // Calls Handler Contract to deposit prc20 tokens func (k Keeper) CallPRC20DepositAutoSwap( ctx sdk.Context, From b97e4ce937f6d34bf8f6da9ffeeb34d5145880f3 Mon Sep 17 00:00:00 2001 From: Nilesh Gupta Date: Thu, 12 Mar 2026 15:42:08 +0530 Subject: [PATCH 07/36] feat: added validation in vote_chain_meta types --- x/uexecutor/types/msg_vote_chain_meta.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/x/uexecutor/types/msg_vote_chain_meta.go b/x/uexecutor/types/msg_vote_chain_meta.go index ef7f9fb6..775fea99 100644 --- a/x/uexecutor/types/msg_vote_chain_meta.go +++ b/x/uexecutor/types/msg_vote_chain_meta.go @@ -2,6 +2,7 @@ package types import ( "cosmossdk.io/errors" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" sdk "github.com/cosmos/cosmos-sdk/types" ) @@ -46,5 +47,14 @@ func (msg *MsgVoteChainMeta) ValidateBasic() error { if _, err := sdk.AccAddressFromBech32(msg.Signer); err != nil { return errors.Wrap(err, "invalid signer address") } + if msg.ObservedChainId == "" { + return errors.Wrap(sdkerrors.ErrInvalidRequest, "observed_chain_id cannot be empty") + } + if msg.Price == 0 { + return errors.Wrap(sdkerrors.ErrInvalidRequest, "price must be greater than 0") + } + if msg.ChainHeight == 0 { + return errors.Wrap(sdkerrors.ErrInvalidRequest, "chain_height must be greater than 0") + } return nil } From 47fd82ebbd0b20dd2604af1d24b7c8a46edc7307 Mon Sep 17 00:00:00 2001 From: Nilesh Gupta Date: Thu, 12 Mar 2026 16:07:51 +0530 Subject: [PATCH 08/36] feat: added changes in abi for chain meta changes --- x/uexecutor/types/abi.go | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/x/uexecutor/types/abi.go b/x/uexecutor/types/abi.go index 05a652a6..c484d446 100644 --- a/x/uexecutor/types/abi.go +++ b/x/uexecutor/types/abi.go @@ -299,6 +299,39 @@ const UNIVERSAL_CORE_ABI = `[ ], "outputs": [], "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setChainMeta", + "inputs": [ + { "name": "chainNamespace", "type": "string", "internalType": "string" }, + { "name": "price", "type": "uint256", "internalType": "uint256" }, + { "name": "chainHeight", "type": "uint256", "internalType": "uint256" }, + { "name": "observedAt", "type": "uint256", "internalType": "uint256" } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "gasPriceByChainNamespace", + "inputs": [{ "name": "", "type": "string", "internalType": "string" }], + "outputs": [{ "name": "", "type": "uint256", "internalType": "uint256" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "chainHeightByChainNamespace", + "inputs": [{ "name": "", "type": "string", "internalType": "string" }], + "outputs": [{ "name": "", "type": "uint256", "internalType": "uint256" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "timestampObservedAtByChainNamespace", + "inputs": [{ "name": "", "type": "string", "internalType": "string" }], + "outputs": [{ "name": "", "type": "uint256", "internalType": "uint256" }], + "stateMutability": "view" } ]` From a50a5373ebdf325667b84b50640d5a408a907dcb Mon Sep 17 00:00:00 2001 From: Nilesh Gupta Date: Thu, 12 Mar 2026 16:10:05 +0530 Subject: [PATCH 09/36] feat: added implementation of voteChainMeta msg --- x/uexecutor/keeper/chain_meta.go | 134 +++++++++++++++++++++++++++++++ x/uexecutor/keeper/msg_server.go | 32 ++++++++ 2 files changed, 166 insertions(+) create mode 100644 x/uexecutor/keeper/chain_meta.go diff --git a/x/uexecutor/keeper/chain_meta.go b/x/uexecutor/keeper/chain_meta.go new file mode 100644 index 00000000..f64d8c2d --- /dev/null +++ b/x/uexecutor/keeper/chain_meta.go @@ -0,0 +1,134 @@ +package keeper + +import ( + "context" + "errors" + + "cosmossdk.io/collections" + sdkerrors "cosmossdk.io/errors" + "cosmossdk.io/math" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/pushchain/push-chain-node/x/uexecutor/types" +) + +func (k Keeper) GetChainMeta(ctx context.Context, chainID string) (types.ChainMeta, bool, error) { + cm, err := k.ChainMetas.Get(ctx, chainID) + if err != nil { + if errors.Is(err, collections.ErrNotFound) { + return types.ChainMeta{}, false, nil + } + return types.ChainMeta{}, false, err + } + return cm, true, nil +} + +func (k Keeper) SetChainMeta(ctx context.Context, chainID string, chainMeta types.ChainMeta) error { + return k.ChainMetas.Set(ctx, chainID, chainMeta) +} + +// VoteChainMeta processes a universal validator's vote on chain metadata (gas price + chain height + observed timestamp). +// It accumulates votes, computes the median price, and calls setChainMeta on the UniversalCore contract. +func (k Keeper) VoteChainMeta(ctx context.Context, universalValidator sdk.ValAddress, observedChainId string, price, blockNumber, observedAt uint64) error { + sdkCtx := sdk.UnwrapSDKContext(ctx) + + entry, found, err := k.GetChainMeta(ctx, observedChainId) + if err != nil { + return sdkerrors.Wrap(err, "failed to fetch chain meta entry") + } + + if !found { + // First vote for this chain + newEntry := types.ChainMeta{ + ObservedChainId: observedChainId, + Signers: []string{universalValidator.String()}, + Prices: []uint64{price}, + ChainHeights: []uint64{blockNumber}, + ObservedAts: []uint64{observedAt}, + MedianIndex: 0, + } + + if err := k.SetChainMeta(ctx, observedChainId, newEntry); err != nil { + return sdkerrors.Wrap(err, "failed to set initial chain meta entry") + } + + // EVM call with single price + priceBig := math.NewUint(price).BigInt() + chainHeightBig := math.NewUint(blockNumber).BigInt() + observedAtBig := math.NewUint(observedAt).BigInt() + if _, evmErr := k.CallUniversalCoreSetChainMeta(sdkCtx, observedChainId, priceBig, chainHeightBig, observedAtBig); evmErr != nil { + // Non-fatal: log the error. The EVM call may fail if the contract hasn't been upgraded yet + // (old bytecode only has setGasPrice). State is still persisted. + sdkCtx.Logger().Error("VoteChainMeta: EVM setChainMeta call failed", "chain", observedChainId, "error", evmErr) + } + + return nil + } + + // Update or insert vote for this validator + var updated bool + for i, s := range entry.Signers { + if s == universalValidator.String() { + entry.Prices[i] = price + entry.ChainHeights[i] = blockNumber + entry.ObservedAts[i] = observedAt + updated = true + break + } + } + + if !updated { + entry.Signers = append(entry.Signers, universalValidator.String()) + entry.Prices = append(entry.Prices, price) + entry.ChainHeights = append(entry.ChainHeights, blockNumber) + entry.ObservedAts = append(entry.ObservedAts, observedAt) + } + + // Recompute median on price + medianIdx := computeMedianIndex(entry.Prices) + entry.MedianIndex = uint64(medianIdx) + + if err := k.SetChainMeta(ctx, observedChainId, entry); err != nil { + return sdkerrors.Wrap(err, "failed to set updated chain meta entry") + } + + medianPrice := math.NewUint(entry.Prices[medianIdx]).BigInt() + medianChainHeight := math.NewUint(entry.ChainHeights[medianIdx]).BigInt() + medianObservedAt := math.NewUint(entry.ObservedAts[medianIdx]).BigInt() + if _, evmErr := k.CallUniversalCoreSetChainMeta(sdkCtx, observedChainId, medianPrice, medianChainHeight, medianObservedAt); evmErr != nil { + // Non-fatal: log. Same forward-compat reason as above. + sdkCtx.Logger().Error("VoteChainMeta: EVM setChainMeta call failed", "chain", observedChainId, "error", evmErr) + } + + return nil +} + +// MigrateGasPricesToChainMeta seeds ChainMetas from existing GasPrices entries. +// Called once during the chain-meta upgrade. Existing gas price data (prices, block_nums, median_index) +// is carried over; observedAts is set to 0 since the timestamp was not tracked before. +func (k Keeper) MigrateGasPricesToChainMeta(ctx context.Context) error { + return k.GasPrices.Walk(ctx, nil, func(chainID string, gp types.GasPrice) (bool, error) { + // Skip if already migrated + existing, err := k.ChainMetas.Get(ctx, chainID) + if err == nil && existing.ObservedChainId != "" { + return false, nil // already exists, skip + } + + observedAts := make([]uint64, len(gp.Prices)) + // observedAts unknown at migration time — leave as 0 + + cm := types.ChainMeta{ + ObservedChainId: gp.ObservedChainId, + Signers: gp.Signers, + Prices: gp.Prices, + ChainHeights: gp.BlockNums, + ObservedAts: observedAts, + MedianIndex: gp.MedianIndex, + } + + if err := k.ChainMetas.Set(ctx, chainID, cm); err != nil { + return true, err + } + + return false, nil + }) +} diff --git a/x/uexecutor/keeper/msg_server.go b/x/uexecutor/keeper/msg_server.go index 5ef96f65..ce2d4f4c 100755 --- a/x/uexecutor/keeper/msg_server.go +++ b/x/uexecutor/keeper/msg_server.go @@ -176,3 +176,35 @@ func (ms msgServer) VoteOutbound(ctx context.Context, msg *types.MsgVoteOutbound return &types.MsgVoteOutboundResponse{}, nil } + +// VoteChainMeta implements types.MsgServer. +func (ms msgServer) VoteChainMeta(ctx context.Context, msg *types.MsgVoteChainMeta) (*types.MsgVoteChainMetaResponse, error) { + signerAccAddr, err := sdk.AccAddressFromBech32(msg.Signer) + if err != nil { + return nil, fmt.Errorf("invalid signer address: %w", err) + } + + signerValAddr := sdk.ValAddress(signerAccAddr) + + isBonded, err := ms.k.uvalidatorKeeper.IsBondedUniversalValidator(ctx, msg.Signer) + if err != nil { + return nil, errors.Wrapf(err, "failed to check bonded status for signer %s", msg.Signer) + } + if !isBonded { + return nil, fmt.Errorf("universal validator for signer %s is not bonded", msg.Signer) + } + + isTombstoned, err := ms.k.uvalidatorKeeper.IsTombstonedUniversalValidator(ctx, msg.Signer) + if err != nil { + return nil, errors.Wrapf(err, "failed to check tombstoned status for signer %s", msg.Signer) + } + if isTombstoned { + return nil, fmt.Errorf("universal validator for signer %s is tombstoned", msg.Signer) + } + + err = ms.k.VoteChainMeta(ctx, signerValAddr, msg.ObservedChainId, msg.Price, msg.ChainHeight, msg.ObservedAt) + if err != nil { + return nil, err + } + return &types.MsgVoteChainMetaResponse{}, nil +} From f53cedfa49a32c5f2899efa73f10a9b6e929630c Mon Sep 17 00:00:00 2001 From: Nilesh Gupta Date: Thu, 12 Mar 2026 16:10:30 +0530 Subject: [PATCH 10/36] refactor: added generated protobuf --- x/uexecutor/types/chain_meta.pb.go | 803 +++++++++++++++++++++++++++++ x/uexecutor/types/tx.pb.go | 598 +++++++++++++++++++-- 2 files changed, 1347 insertions(+), 54 deletions(-) create mode 100644 x/uexecutor/types/chain_meta.pb.go diff --git a/x/uexecutor/types/chain_meta.pb.go b/x/uexecutor/types/chain_meta.pb.go new file mode 100644 index 00000000..af8df41f --- /dev/null +++ b/x/uexecutor/types/chain_meta.pb.go @@ -0,0 +1,803 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: uexecutor/v1/chain_meta.proto + +package types + +import ( + fmt "fmt" + _ "github.com/cosmos/cosmos-sdk/types/tx/amino" + _ "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 + +// ChainMeta stores aggregated chain metadata (gas price + block height) for a given chain +type ChainMeta struct { + ObservedChainId string `protobuf:"bytes,1,opt,name=observed_chain_id,json=observedChainId,proto3" json:"observed_chain_id,omitempty"` + Signers []string `protobuf:"bytes,2,rep,name=signers,proto3" json:"signers,omitempty"` + Prices []uint64 `protobuf:"varint,3,rep,packed,name=prices,proto3" json:"prices,omitempty"` + ChainHeights []uint64 `protobuf:"varint,4,rep,packed,name=chain_heights,json=chainHeights,proto3" json:"chain_heights,omitempty"` + ObservedAts []uint64 `protobuf:"varint,5,rep,packed,name=observed_ats,json=observedAts,proto3" json:"observed_ats,omitempty"` + MedianIndex uint64 `protobuf:"varint,6,opt,name=median_index,json=medianIndex,proto3" json:"median_index,omitempty"` +} + +func (m *ChainMeta) Reset() { *m = ChainMeta{} } +func (*ChainMeta) ProtoMessage() {} +func (*ChainMeta) Descriptor() ([]byte, []int) { + return fileDescriptor_7d3b1b8d71b3d806, []int{0} +} +func (m *ChainMeta) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ChainMeta) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ChainMeta.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 *ChainMeta) XXX_Merge(src proto.Message) { + xxx_messageInfo_ChainMeta.Merge(m, src) +} +func (m *ChainMeta) XXX_Size() int { + return m.Size() +} +func (m *ChainMeta) XXX_DiscardUnknown() { + xxx_messageInfo_ChainMeta.DiscardUnknown(m) +} + +var xxx_messageInfo_ChainMeta proto.InternalMessageInfo + +func (m *ChainMeta) GetObservedChainId() string { + if m != nil { + return m.ObservedChainId + } + return "" +} + +func (m *ChainMeta) GetSigners() []string { + if m != nil { + return m.Signers + } + return nil +} + +func (m *ChainMeta) GetPrices() []uint64 { + if m != nil { + return m.Prices + } + return nil +} + +func (m *ChainMeta) GetChainHeights() []uint64 { + if m != nil { + return m.ChainHeights + } + return nil +} + +func (m *ChainMeta) GetObservedAts() []uint64 { + if m != nil { + return m.ObservedAts + } + return nil +} + +func (m *ChainMeta) GetMedianIndex() uint64 { + if m != nil { + return m.MedianIndex + } + return 0 +} + +func init() { + proto.RegisterType((*ChainMeta)(nil), "uexecutor.v1.ChainMeta") +} + +func init() { proto.RegisterFile("uexecutor/v1/chain_meta.proto", fileDescriptor_7d3b1b8d71b3d806) } + +var fileDescriptor_7d3b1b8d71b3d806 = []byte{ + // 324 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x2d, 0x4d, 0xad, 0x48, + 0x4d, 0x2e, 0x2d, 0xc9, 0x2f, 0xd2, 0x2f, 0x33, 0xd4, 0x4f, 0xce, 0x48, 0xcc, 0xcc, 0x8b, 0xcf, + 0x4d, 0x2d, 0x49, 0xd4, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0xe2, 0x81, 0x4b, 0xeb, 0x95, 0x19, + 0x4a, 0x89, 0xa4, 0xe7, 0xa7, 0xe7, 0x83, 0x25, 0xf4, 0x41, 0x2c, 0x88, 0x1a, 0x29, 0xc1, 0xc4, + 0xdc, 0xcc, 0xbc, 0x7c, 0x7d, 0x30, 0x09, 0x11, 0x52, 0xfa, 0xce, 0xc8, 0xc5, 0xe9, 0x0c, 0x32, + 0xcb, 0x37, 0xb5, 0x24, 0x51, 0x48, 0x8b, 0x4b, 0x30, 0x3f, 0xa9, 0x38, 0xb5, 0xa8, 0x2c, 0x35, + 0x25, 0x1e, 0x62, 0x43, 0x66, 0x8a, 0x04, 0xa3, 0x02, 0xa3, 0x06, 0x67, 0x10, 0x3f, 0x4c, 0x02, + 0xac, 0xda, 0x33, 0x45, 0x48, 0x82, 0x8b, 0xbd, 0x38, 0x33, 0x3d, 0x2f, 0xb5, 0xa8, 0x58, 0x82, + 0x49, 0x81, 0x59, 0x83, 0x33, 0x08, 0xc6, 0x15, 0x12, 0xe3, 0x62, 0x2b, 0x28, 0xca, 0x4c, 0x4e, + 0x2d, 0x96, 0x60, 0x56, 0x60, 0xd6, 0x60, 0x09, 0x82, 0xf2, 0x84, 0x94, 0xb9, 0x78, 0x21, 0x86, + 0x66, 0xa4, 0x66, 0xa6, 0x67, 0x94, 0x14, 0x4b, 0xb0, 0x80, 0xa5, 0x79, 0xc0, 0x82, 0x1e, 0x10, + 0x31, 0x21, 0x45, 0x2e, 0x1e, 0xb8, 0x13, 0x12, 0x4b, 0x8a, 0x25, 0x58, 0xc1, 0x6a, 0xb8, 0x61, + 0x62, 0x8e, 0x10, 0x25, 0xb9, 0xa9, 0x29, 0x99, 0x89, 0x79, 0xf1, 0x99, 0x79, 0x29, 0xa9, 0x15, + 0x12, 0x6c, 0x0a, 0x8c, 0x20, 0x25, 0x10, 0x31, 0x4f, 0x90, 0x90, 0x95, 0xe2, 0x8c, 0x05, 0xf2, + 0x0c, 0x2f, 0x16, 0xc8, 0x33, 0x76, 0x3d, 0xdf, 0xa0, 0x25, 0x82, 0x08, 0x39, 0x44, 0xb0, 0x39, + 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, 0x7e, 0x41, 0x69, 0x71, 0x06, 0x58, 0x13, 0x98, 0xa5, + 0x0b, 0x66, 0xea, 0xe6, 0xe5, 0xa7, 0xa4, 0xea, 0x57, 0xe8, 0x23, 0x8c, 0x2d, 0xa9, 0x2c, 0x48, + 0x2d, 0x4e, 0x62, 0x03, 0x07, 0xa9, 0x31, 0x20, 0x00, 0x00, 0xff, 0xff, 0x91, 0x64, 0xde, 0x80, + 0xaa, 0x01, 0x00, 0x00, +} + +func (this *ChainMeta) Equal(that interface{}) bool { + if that == nil { + return this == nil + } + + that1, ok := that.(*ChainMeta) + if !ok { + that2, ok := that.(ChainMeta) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + return this == nil + } else if this == nil { + return false + } + if this.ObservedChainId != that1.ObservedChainId { + return false + } + if len(this.Signers) != len(that1.Signers) { + return false + } + for i := range this.Signers { + if this.Signers[i] != that1.Signers[i] { + return false + } + } + if len(this.Prices) != len(that1.Prices) { + return false + } + for i := range this.Prices { + if this.Prices[i] != that1.Prices[i] { + return false + } + } + if len(this.ChainHeights) != len(that1.ChainHeights) { + return false + } + for i := range this.ChainHeights { + if this.ChainHeights[i] != that1.ChainHeights[i] { + return false + } + } + if len(this.ObservedAts) != len(that1.ObservedAts) { + return false + } + for i := range this.ObservedAts { + if this.ObservedAts[i] != that1.ObservedAts[i] { + return false + } + } + if this.MedianIndex != that1.MedianIndex { + return false + } + return true +} +func (m *ChainMeta) 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 *ChainMeta) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ChainMeta) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.MedianIndex != 0 { + i = encodeVarintChainMeta(dAtA, i, uint64(m.MedianIndex)) + i-- + dAtA[i] = 0x30 + } + if len(m.ObservedAts) > 0 { + dAtA2 := make([]byte, len(m.ObservedAts)*10) + var j1 int + for _, num := range m.ObservedAts { + for num >= 1<<7 { + dAtA2[j1] = uint8(uint64(num)&0x7f | 0x80) + num >>= 7 + j1++ + } + dAtA2[j1] = uint8(num) + j1++ + } + i -= j1 + copy(dAtA[i:], dAtA2[:j1]) + i = encodeVarintChainMeta(dAtA, i, uint64(j1)) + i-- + dAtA[i] = 0x2a + } + if len(m.ChainHeights) > 0 { + dAtA4 := make([]byte, len(m.ChainHeights)*10) + var j3 int + for _, num := range m.ChainHeights { + for num >= 1<<7 { + dAtA4[j3] = uint8(uint64(num)&0x7f | 0x80) + num >>= 7 + j3++ + } + dAtA4[j3] = uint8(num) + j3++ + } + i -= j3 + copy(dAtA[i:], dAtA4[:j3]) + i = encodeVarintChainMeta(dAtA, i, uint64(j3)) + i-- + dAtA[i] = 0x22 + } + if len(m.Prices) > 0 { + dAtA6 := make([]byte, len(m.Prices)*10) + var j5 int + for _, num := range m.Prices { + for num >= 1<<7 { + dAtA6[j5] = uint8(uint64(num)&0x7f | 0x80) + num >>= 7 + j5++ + } + dAtA6[j5] = uint8(num) + j5++ + } + i -= j5 + copy(dAtA[i:], dAtA6[:j5]) + i = encodeVarintChainMeta(dAtA, i, uint64(j5)) + i-- + dAtA[i] = 0x1a + } + if len(m.Signers) > 0 { + for iNdEx := len(m.Signers) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Signers[iNdEx]) + copy(dAtA[i:], m.Signers[iNdEx]) + i = encodeVarintChainMeta(dAtA, i, uint64(len(m.Signers[iNdEx]))) + i-- + dAtA[i] = 0x12 + } + } + if len(m.ObservedChainId) > 0 { + i -= len(m.ObservedChainId) + copy(dAtA[i:], m.ObservedChainId) + i = encodeVarintChainMeta(dAtA, i, uint64(len(m.ObservedChainId))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func encodeVarintChainMeta(dAtA []byte, offset int, v uint64) int { + offset -= sovChainMeta(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *ChainMeta) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.ObservedChainId) + if l > 0 { + n += 1 + l + sovChainMeta(uint64(l)) + } + if len(m.Signers) > 0 { + for _, s := range m.Signers { + l = len(s) + n += 1 + l + sovChainMeta(uint64(l)) + } + } + if len(m.Prices) > 0 { + l = 0 + for _, e := range m.Prices { + l += sovChainMeta(uint64(e)) + } + n += 1 + sovChainMeta(uint64(l)) + l + } + if len(m.ChainHeights) > 0 { + l = 0 + for _, e := range m.ChainHeights { + l += sovChainMeta(uint64(e)) + } + n += 1 + sovChainMeta(uint64(l)) + l + } + if len(m.ObservedAts) > 0 { + l = 0 + for _, e := range m.ObservedAts { + l += sovChainMeta(uint64(e)) + } + n += 1 + sovChainMeta(uint64(l)) + l + } + if m.MedianIndex != 0 { + n += 1 + sovChainMeta(uint64(m.MedianIndex)) + } + return n +} + +func sovChainMeta(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozChainMeta(x uint64) (n int) { + return sovChainMeta(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *ChainMeta) 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 ErrIntOverflowChainMeta + } + 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: ChainMeta: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ChainMeta: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ObservedChainId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowChainMeta + } + 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 ErrInvalidLengthChainMeta + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthChainMeta + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ObservedChainId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Signers", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowChainMeta + } + 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 ErrInvalidLengthChainMeta + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthChainMeta + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Signers = append(m.Signers, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 3: + if wireType == 0 { + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowChainMeta + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Prices = append(m.Prices, v) + } else if wireType == 2 { + var packedLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowChainMeta + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + packedLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if packedLen < 0 { + return ErrInvalidLengthChainMeta + } + postIndex := iNdEx + packedLen + if postIndex < 0 { + return ErrInvalidLengthChainMeta + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + var elementCount int + var count int + for _, integer := range dAtA[iNdEx:postIndex] { + if integer < 128 { + count++ + } + } + elementCount = count + if elementCount != 0 && len(m.Prices) == 0 { + m.Prices = make([]uint64, 0, elementCount) + } + for iNdEx < postIndex { + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowChainMeta + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Prices = append(m.Prices, v) + } + } else { + return fmt.Errorf("proto: wrong wireType = %d for field Prices", wireType) + } + case 4: + if wireType == 0 { + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowChainMeta + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.ChainHeights = append(m.ChainHeights, v) + } else if wireType == 2 { + var packedLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowChainMeta + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + packedLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if packedLen < 0 { + return ErrInvalidLengthChainMeta + } + postIndex := iNdEx + packedLen + if postIndex < 0 { + return ErrInvalidLengthChainMeta + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + var elementCount int + var count int + for _, integer := range dAtA[iNdEx:postIndex] { + if integer < 128 { + count++ + } + } + elementCount = count + if elementCount != 0 && len(m.ChainHeights) == 0 { + m.ChainHeights = make([]uint64, 0, elementCount) + } + for iNdEx < postIndex { + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowChainMeta + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.ChainHeights = append(m.ChainHeights, v) + } + } else { + return fmt.Errorf("proto: wrong wireType = %d for field ChainHeights", wireType) + } + case 5: + if wireType == 0 { + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowChainMeta + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.ObservedAts = append(m.ObservedAts, v) + } else if wireType == 2 { + var packedLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowChainMeta + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + packedLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if packedLen < 0 { + return ErrInvalidLengthChainMeta + } + postIndex := iNdEx + packedLen + if postIndex < 0 { + return ErrInvalidLengthChainMeta + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + var elementCount int + var count int + for _, integer := range dAtA[iNdEx:postIndex] { + if integer < 128 { + count++ + } + } + elementCount = count + if elementCount != 0 && len(m.ObservedAts) == 0 { + m.ObservedAts = make([]uint64, 0, elementCount) + } + for iNdEx < postIndex { + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowChainMeta + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.ObservedAts = append(m.ObservedAts, v) + } + } else { + return fmt.Errorf("proto: wrong wireType = %d for field ObservedAts", wireType) + } + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field MedianIndex", wireType) + } + m.MedianIndex = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowChainMeta + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.MedianIndex |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipChainMeta(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthChainMeta + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipChainMeta(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, ErrIntOverflowChainMeta + } + 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, ErrIntOverflowChainMeta + } + 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, ErrIntOverflowChainMeta + } + 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, ErrInvalidLengthChainMeta + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupChainMeta + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthChainMeta + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthChainMeta = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowChainMeta = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupChainMeta = fmt.Errorf("proto: unexpected end of group") +) diff --git a/x/uexecutor/types/tx.pb.go b/x/uexecutor/types/tx.pb.go index 348a8d59..075e0d32 100644 --- a/x/uexecutor/types/tx.pb.go +++ b/x/uexecutor/types/tx.pb.go @@ -654,6 +654,120 @@ func (m *MsgVoteGasPriceResponse) XXX_DiscardUnknown() { var xxx_messageInfo_MsgVoteGasPriceResponse proto.InternalMessageInfo +// MsgVoteChainMeta is broadcasted by Universal Validators to submit observed chain metadata (gas price + block height) +type MsgVoteChainMeta struct { + Signer string `protobuf:"bytes,1,opt,name=signer,proto3" json:"signer,omitempty"` + ObservedChainId string `protobuf:"bytes,2,opt,name=observed_chain_id,json=observedChainId,proto3" json:"observed_chain_id,omitempty"` + Price uint64 `protobuf:"varint,3,opt,name=price,proto3" json:"price,omitempty"` + ChainHeight uint64 `protobuf:"varint,4,opt,name=chain_height,json=chainHeight,proto3" json:"chain_height,omitempty"` + ObservedAt uint64 `protobuf:"varint,5,opt,name=observed_at,json=observedAt,proto3" json:"observed_at,omitempty"` +} + +func (m *MsgVoteChainMeta) Reset() { *m = MsgVoteChainMeta{} } +func (m *MsgVoteChainMeta) String() string { return proto.CompactTextString(m) } +func (*MsgVoteChainMeta) ProtoMessage() {} +func (*MsgVoteChainMeta) Descriptor() ([]byte, []int) { + return fileDescriptor_88d6216044506365, []int{12} +} +func (m *MsgVoteChainMeta) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgVoteChainMeta) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgVoteChainMeta.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 *MsgVoteChainMeta) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgVoteChainMeta.Merge(m, src) +} +func (m *MsgVoteChainMeta) XXX_Size() int { + return m.Size() +} +func (m *MsgVoteChainMeta) XXX_DiscardUnknown() { + xxx_messageInfo_MsgVoteChainMeta.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgVoteChainMeta proto.InternalMessageInfo + +func (m *MsgVoteChainMeta) GetSigner() string { + if m != nil { + return m.Signer + } + return "" +} + +func (m *MsgVoteChainMeta) GetObservedChainId() string { + if m != nil { + return m.ObservedChainId + } + return "" +} + +func (m *MsgVoteChainMeta) GetPrice() uint64 { + if m != nil { + return m.Price + } + return 0 +} + +func (m *MsgVoteChainMeta) GetChainHeight() uint64 { + if m != nil { + return m.ChainHeight + } + return 0 +} + +func (m *MsgVoteChainMeta) GetObservedAt() uint64 { + if m != nil { + return m.ObservedAt + } + return 0 +} + +// MsgVoteChainMetaResponse defines the response for MsgVoteChainMeta +type MsgVoteChainMetaResponse struct { +} + +func (m *MsgVoteChainMetaResponse) Reset() { *m = MsgVoteChainMetaResponse{} } +func (m *MsgVoteChainMetaResponse) String() string { return proto.CompactTextString(m) } +func (*MsgVoteChainMetaResponse) ProtoMessage() {} +func (*MsgVoteChainMetaResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_88d6216044506365, []int{13} +} +func (m *MsgVoteChainMetaResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgVoteChainMetaResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgVoteChainMetaResponse.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 *MsgVoteChainMetaResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgVoteChainMetaResponse.Merge(m, src) +} +func (m *MsgVoteChainMetaResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgVoteChainMetaResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgVoteChainMetaResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgVoteChainMetaResponse proto.InternalMessageInfo + func init() { proto.RegisterType((*MsgUpdateParams)(nil), "uexecutor.v1.MsgUpdateParams") proto.RegisterType((*MsgUpdateParamsResponse)(nil), "uexecutor.v1.MsgUpdateParamsResponse") @@ -667,65 +781,72 @@ func init() { proto.RegisterType((*MsgVoteOutboundResponse)(nil), "uexecutor.v1.MsgVoteOutboundResponse") proto.RegisterType((*MsgVoteGasPrice)(nil), "uexecutor.v1.MsgVoteGasPrice") proto.RegisterType((*MsgVoteGasPriceResponse)(nil), "uexecutor.v1.MsgVoteGasPriceResponse") + proto.RegisterType((*MsgVoteChainMeta)(nil), "uexecutor.v1.MsgVoteChainMeta") + proto.RegisterType((*MsgVoteChainMetaResponse)(nil), "uexecutor.v1.MsgVoteChainMetaResponse") } func init() { proto.RegisterFile("uexecutor/v1/tx.proto", fileDescriptor_88d6216044506365) } var fileDescriptor_88d6216044506365 = []byte{ - // 840 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x56, 0x4f, 0x4f, 0x33, 0x45, - 0x1c, 0xee, 0x42, 0x5b, 0xd3, 0x69, 0x7d, 0xdf, 0xb7, 0x6b, 0x6b, 0xff, 0x00, 0x05, 0xaa, 0x06, - 0x2c, 0xd2, 0x95, 0x9a, 0x70, 0xe8, 0x8d, 0x2a, 0x31, 0x8d, 0x29, 0xd4, 0x15, 0x3c, 0x70, 0x69, - 0xa6, 0xbb, 0xe3, 0x76, 0x23, 0xbb, 0xb3, 0xd9, 0x99, 0x69, 0xca, 0xcd, 0x78, 0x34, 0x31, 0xf1, - 0xe4, 0x77, 0x30, 0x5e, 0x38, 0xf8, 0x01, 0x3c, 0x72, 0x24, 0x7a, 0xf1, 0x44, 0x0c, 0x1c, 0xf8, - 0x1a, 0x66, 0x67, 0xff, 0x6f, 0x4b, 0x31, 0x9c, 0xde, 0x0b, 0x99, 0x7d, 0x9e, 0xdf, 0xef, 0xe1, - 0xf7, 0x3c, 0x3b, 0x33, 0x5d, 0x50, 0x66, 0x68, 0x86, 0x14, 0x46, 0xb1, 0x2d, 0x4d, 0x0f, 0x24, - 0x3a, 0x6b, 0x5b, 0x36, 0xa6, 0x58, 0x2c, 0x04, 0x70, 0x7b, 0x7a, 0x50, 0x2f, 0x42, 0x43, 0x37, - 0xb1, 0xc4, 0xff, 0xba, 0x05, 0xf5, 0x8a, 0x82, 0x89, 0x81, 0x89, 0x64, 0x10, 0xcd, 0x69, 0x34, - 0x88, 0xe6, 0x11, 0xd5, 0xb8, 0xe0, 0x95, 0x85, 0x88, 0xc7, 0x94, 0x34, 0xac, 0x61, 0xbe, 0x94, - 0x9c, 0x95, 0x87, 0xd6, 0x5c, 0xa1, 0x91, 0x4b, 0xb8, 0x0f, 0x2e, 0xd5, 0xfc, 0x5d, 0x00, 0xaf, - 0x07, 0x44, 0x3b, 0xb7, 0x54, 0x48, 0xd1, 0x10, 0xda, 0xd0, 0x20, 0xe2, 0x21, 0xc8, 0x41, 0x46, - 0x27, 0xd8, 0xd6, 0xe9, 0x55, 0x55, 0xd8, 0x12, 0x76, 0x73, 0xbd, 0xea, 0x5f, 0x7f, 0xec, 0x97, - 0xbc, 0xc6, 0x23, 0x55, 0xb5, 0x11, 0x21, 0xdf, 0x50, 0x5b, 0x37, 0x35, 0x39, 0x2c, 0x15, 0x3b, - 0x20, 0x6b, 0x71, 0x85, 0xea, 0xca, 0x96, 0xb0, 0x9b, 0xef, 0x94, 0xda, 0x51, 0x87, 0x6d, 0x57, - 0xbd, 0x97, 0xbe, 0xb9, 0xdb, 0x4c, 0xc9, 0x5e, 0x65, 0xf7, 0x93, 0x1f, 0x1f, 0xaf, 0x5b, 0xa1, - 0xc6, 0x4f, 0x8f, 0xd7, 0xad, 0x5a, 0xe8, 0x2e, 0x31, 0x59, 0xb3, 0x06, 0x2a, 0x09, 0x48, 0x46, - 0xc4, 0xc2, 0x26, 0x41, 0xcd, 0x3f, 0x57, 0x40, 0x71, 0x40, 0xb4, 0x63, 0xde, 0x8a, 0x86, 0xf0, - 0xea, 0x12, 0x43, 0x55, 0xfc, 0x14, 0x64, 0x89, 0xae, 0x99, 0xc8, 0x7e, 0xd6, 0x87, 0x57, 0x27, - 0xca, 0xa0, 0xc4, 0x4c, 0x7d, 0x8a, 0x6c, 0x02, 0x2f, 0x47, 0x50, 0x51, 0x30, 0x33, 0xe9, 0x48, - 0x57, 0x3d, 0x4b, 0x5b, 0x71, 0x4b, 0xe7, 0x7e, 0xe5, 0x91, 0x5b, 0xd8, 0x57, 0x65, 0x91, 0xcd, - 0x61, 0xe2, 0x57, 0xa0, 0x18, 0x6a, 0x5a, 0xee, 0x68, 0xd5, 0x55, 0x2e, 0xd8, 0x78, 0x42, 0xd0, - 0x33, 0x20, 0xbf, 0x61, 0x09, 0x44, 0xdc, 0x03, 0xc5, 0x29, 0xb2, 0xf5, 0xef, 0x74, 0x05, 0x52, - 0x1d, 0x9b, 0x23, 0x15, 0x52, 0x58, 0x4d, 0x3b, 0xee, 0xe4, 0x37, 0x51, 0xe2, 0x0b, 0x48, 0x61, - 0x77, 0xcf, 0x89, 0xd7, 0xb3, 0xe6, 0x64, 0xbb, 0x16, 0xcb, 0x36, 0x1e, 0x56, 0x73, 0x0d, 0xd4, - 0xe6, 0xc0, 0x20, 0xdf, 0xdf, 0x56, 0xc0, 0xbb, 0x03, 0xa2, 0x0d, 0x74, 0xcd, 0x86, 0x14, 0x9d, - 0x1f, 0x1f, 0xbd, 0x3d, 0xd9, 0x1a, 0x7c, 0x26, 0x27, 0x8b, 0xa5, 0xd9, 0x0e, 0xfc, 0xb2, 0x20, - 0x5b, 0x23, 0x81, 0x88, 0xeb, 0x20, 0xe7, 0x8c, 0x0a, 0x29, 0xb3, 0x91, 0x97, 0x69, 0x08, 0x74, - 0x77, 0x12, 0x61, 0x56, 0x62, 0x61, 0x86, 0xc9, 0x34, 0x2b, 0xa0, 0x1c, 0x03, 0x82, 0x10, 0x7f, - 0x15, 0xc0, 0xab, 0x01, 0xd1, 0xbe, 0xc5, 0x14, 0xf5, 0xcd, 0x31, 0x66, 0xe6, 0x4b, 0x76, 0xa8, - 0x04, 0xde, 0xd1, 0xdd, 0x66, 0x2f, 0xb8, 0x72, 0xdc, 0xa7, 0xa7, 0x2c, 0xfb, 0x55, 0xdd, 0xed, - 0xc4, 0xdc, 0x45, 0x86, 0xa4, 0xf8, 0x14, 0xcd, 0x2a, 0x78, 0x3f, 0x8e, 0x04, 0x23, 0xdf, 0xb9, - 0x17, 0x84, 0x43, 0x9d, 0x32, 0xfa, 0xd2, 0x99, 0xdf, 0x03, 0x19, 0x3a, 0xf3, 0x5f, 0x75, 0x4e, - 0x4e, 0xd3, 0x59, 0x5f, 0x15, 0xcb, 0x20, 0xcb, 0x5c, 0x74, 0x95, 0xa3, 0x19, 0xc6, 0xe1, 0x1e, - 0xc8, 0xe3, 0x31, 0x41, 0xf6, 0x14, 0xa9, 0x23, 0x3a, 0xe3, 0xaf, 0x21, 0xdf, 0xd9, 0x8e, 0x7b, - 0xf4, 0x47, 0x39, 0xe5, 0x85, 0xfc, 0x1d, 0xca, 0xc0, 0xef, 0x3a, 0x9b, 0x75, 0x3f, 0x4e, 0x58, - 0x8e, 0xdf, 0x29, 0x51, 0x33, 0xde, 0x9d, 0x12, 0x85, 0x02, 0xef, 0x7f, 0x87, 0xde, 0xbf, 0x84, - 0x64, 0x68, 0xeb, 0x0a, 0x7a, 0x81, 0xf7, 0x16, 0x28, 0x06, 0x7e, 0x94, 0x09, 0xd4, 0xcd, 0x30, - 0x87, 0xd7, 0x3e, 0xf1, 0xb9, 0x83, 0xf7, 0x55, 0xb1, 0x04, 0x32, 0x96, 0xf3, 0x6f, 0x78, 0x22, - 0x69, 0xd9, 0x7d, 0x10, 0xb7, 0x41, 0x61, 0x7c, 0x89, 0x95, 0xef, 0x47, 0x26, 0x33, 0xc6, 0xc8, - 0xe6, 0x91, 0xa4, 0xe5, 0x3c, 0xc7, 0x4e, 0x38, 0xf4, 0x3f, 0x0c, 0xfb, 0x0e, 0x22, 0x86, 0x7d, - 0xc8, 0x37, 0xdc, 0xf9, 0x39, 0x0d, 0x56, 0x07, 0x44, 0x13, 0xcf, 0x40, 0x21, 0xf6, 0x8b, 0xb0, - 0x91, 0x38, 0x49, 0xf1, 0x3b, 0xb8, 0xfe, 0xd1, 0x52, 0xda, 0x57, 0x17, 0x2f, 0xc0, 0xab, 0xc4, - 0xf5, 0xbc, 0x39, 0xd7, 0x18, 0x2f, 0xa8, 0xef, 0x3c, 0x53, 0x10, 0x68, 0x9f, 0x00, 0x10, 0xb9, - 0x9a, 0xd6, 0xe6, 0xda, 0x42, 0xb2, 0xfe, 0xc1, 0x12, 0x32, 0xd0, 0xfb, 0x1a, 0xe4, 0xa3, 0xa7, - 0x74, 0x7d, 0xae, 0x27, 0xc2, 0xd6, 0x3f, 0x5c, 0xc6, 0x06, 0x92, 0x67, 0xa0, 0x10, 0x3b, 0x45, - 0x1b, 0x0b, 0xbb, 0x7c, 0x7a, 0x41, 0xa8, 0x8b, 0xf6, 0xa8, 0xaf, 0x1a, 0xec, 0xcf, 0xc5, 0xaa, - 0x3e, 0xfd, 0x84, 0x6a, 0x72, 0x23, 0xd4, 0x33, 0x3f, 0x3c, 0x5e, 0xb7, 0x84, 0xde, 0xf0, 0xe6, - 0xbe, 0x21, 0xdc, 0xde, 0x37, 0x84, 0x7f, 0xef, 0x1b, 0xc2, 0x2f, 0x0f, 0x8d, 0xd4, 0xed, 0x43, - 0x23, 0xf5, 0xcf, 0x43, 0x23, 0x75, 0x71, 0xa8, 0xe9, 0x74, 0xc2, 0xc6, 0x6d, 0x05, 0x1b, 0x92, - 0xc5, 0xc8, 0x84, 0x6f, 0x6c, 0xbe, 0xda, 0xe7, 0xcb, 0x7d, 0x13, 0xab, 0x48, 0x9a, 0x49, 0xe1, - 0x36, 0xe4, 0x9f, 0x29, 0xe3, 0x2c, 0xff, 0xec, 0xf8, 0xec, 0xbf, 0x00, 0x00, 0x00, 0xff, 0xff, - 0x77, 0x92, 0x41, 0x7c, 0x14, 0x09, 0x00, 0x00, + // 926 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x56, 0xcf, 0x6f, 0xe3, 0x44, + 0x14, 0xae, 0xdb, 0xa4, 0xa8, 0x2f, 0xdd, 0xdd, 0xc6, 0xa4, 0xd4, 0x75, 0xb7, 0x69, 0x1b, 0x7e, + 0xec, 0x92, 0xa5, 0x31, 0x5b, 0xa4, 0x3d, 0xe4, 0xd6, 0xc2, 0x0a, 0x2a, 0x94, 0xdd, 0x62, 0x5a, + 0x90, 0xf6, 0x12, 0x4d, 0xec, 0xc1, 0xb1, 0xa8, 0x3d, 0x96, 0x67, 0x1c, 0xa5, 0x37, 0xc4, 0x91, + 0x13, 0x27, 0xfe, 0x07, 0xc4, 0xa5, 0x07, 0xfe, 0x00, 0x8e, 0x7b, 0x5c, 0xc1, 0x85, 0xd3, 0x0a, + 0xb5, 0x12, 0xfd, 0x0f, 0x38, 0x23, 0x8f, 0xed, 0xb1, 0xc7, 0xc9, 0xa6, 0xa8, 0x17, 0xf6, 0x12, + 0x39, 0xdf, 0xf7, 0xde, 0x97, 0xf7, 0x7d, 0xf6, 0x3c, 0x07, 0x56, 0x23, 0x3c, 0xc6, 0x56, 0xc4, + 0x48, 0x68, 0x8c, 0x1e, 0x1a, 0x6c, 0xdc, 0x09, 0x42, 0xc2, 0x88, 0xba, 0x2c, 0xe0, 0xce, 0xe8, + 0xa1, 0x5e, 0x47, 0x9e, 0xeb, 0x13, 0x83, 0x7f, 0x26, 0x05, 0xfa, 0x9a, 0x45, 0xa8, 0x47, 0xa8, + 0xe1, 0x51, 0x27, 0x6e, 0xf4, 0xa8, 0x93, 0x12, 0x9a, 0x2c, 0x78, 0x16, 0x60, 0x9a, 0x32, 0x9b, + 0x12, 0x63, 0x0d, 0x91, 0xeb, 0xf7, 0x3d, 0xcc, 0x50, 0x4a, 0x37, 0x1c, 0xe2, 0x10, 0x7e, 0x69, + 0xc4, 0x57, 0x29, 0xba, 0x9e, 0xfc, 0x4e, 0x3f, 0x21, 0x92, 0x2f, 0x09, 0xd5, 0xfa, 0x45, 0x81, + 0x3b, 0x3d, 0xea, 0x9c, 0x04, 0x36, 0x62, 0xf8, 0x08, 0x85, 0xc8, 0xa3, 0xea, 0x23, 0x58, 0x42, + 0x11, 0x1b, 0x92, 0xd0, 0x65, 0x67, 0x9a, 0xb2, 0xad, 0xdc, 0x5f, 0x3a, 0xd0, 0x7e, 0xff, 0x75, + 0xb7, 0x91, 0x36, 0xee, 0xdb, 0x76, 0x88, 0x29, 0xfd, 0x92, 0x85, 0xae, 0xef, 0x98, 0x79, 0xa9, + 0xba, 0x07, 0x8b, 0x01, 0x57, 0xd0, 0xe6, 0xb7, 0x95, 0xfb, 0xb5, 0xbd, 0x46, 0xa7, 0x18, 0x40, + 0x27, 0x51, 0x3f, 0xa8, 0x3c, 0x7f, 0xb9, 0x35, 0x67, 0xa6, 0x95, 0xdd, 0x0f, 0xbe, 0xbf, 0x3a, + 0x6f, 0xe7, 0x1a, 0x3f, 0x5c, 0x9d, 0xb7, 0xd7, 0x73, 0x8b, 0xa5, 0xc9, 0x5a, 0xeb, 0xb0, 0x56, + 0x82, 0x4c, 0x4c, 0x03, 0xe2, 0x53, 0xdc, 0xfa, 0x6d, 0x1e, 0xea, 0x3d, 0xea, 0x3c, 0xe6, 0xad, + 0xf8, 0x08, 0x9d, 0x9d, 0x12, 0x64, 0xab, 0x1f, 0xc2, 0x22, 0x75, 0x1d, 0x1f, 0x87, 0xd7, 0xfa, + 0x48, 0xeb, 0x54, 0x13, 0x1a, 0x91, 0xef, 0x8e, 0x70, 0x48, 0xd1, 0x69, 0x1f, 0x59, 0x16, 0x89, + 0x7c, 0xd6, 0x77, 0xed, 0xd4, 0xd2, 0xb6, 0x6c, 0xe9, 0x24, 0xab, 0xdc, 0x4f, 0x0a, 0x0f, 0x6d, + 0x53, 0x8d, 0x26, 0x30, 0xf5, 0x73, 0xa8, 0xe7, 0x9a, 0x41, 0x32, 0x9a, 0xb6, 0xc0, 0x05, 0x9b, + 0xaf, 0x10, 0x4c, 0x0d, 0x98, 0x2b, 0x51, 0x09, 0x51, 0x1f, 0x40, 0x7d, 0x84, 0x43, 0xf7, 0x1b, + 0xd7, 0x42, 0xcc, 0x25, 0x7e, 0xdf, 0x46, 0x0c, 0x69, 0x95, 0xd8, 0x9d, 0xb9, 0x52, 0x24, 0x3e, + 0x41, 0x0c, 0x75, 0x1f, 0xc4, 0xf1, 0xa6, 0xd6, 0xe2, 0x6c, 0x37, 0xa4, 0x6c, 0xe5, 0xb0, 0x5a, + 0x1b, 0xb0, 0x3e, 0x01, 0x8a, 0x7c, 0x7f, 0x9e, 0x87, 0x5b, 0x3d, 0xea, 0xf4, 0x5c, 0x27, 0x44, + 0x0c, 0x9f, 0x3c, 0xde, 0x7f, 0x7d, 0xb2, 0xf5, 0xf8, 0x4c, 0x71, 0x16, 0x33, 0xb3, 0xed, 0x65, + 0x65, 0x22, 0x5b, 0xaf, 0x84, 0xa8, 0x77, 0x61, 0x29, 0x1e, 0x15, 0xb1, 0x28, 0xc4, 0x69, 0xa6, + 0x39, 0xd0, 0xbd, 0x57, 0x0a, 0x73, 0x4d, 0x0a, 0x33, 0x4f, 0xa6, 0xb5, 0x06, 0xab, 0x12, 0x20, + 0x42, 0xfc, 0x49, 0x81, 0xdb, 0x3d, 0xea, 0x7c, 0x45, 0x18, 0x3e, 0xf4, 0x07, 0x24, 0xf2, 0x6f, + 0xf2, 0x84, 0x1a, 0xf0, 0x86, 0x9b, 0x34, 0xa7, 0xc1, 0xad, 0xca, 0x3e, 0x53, 0x65, 0x33, 0xab, + 0xea, 0xee, 0x94, 0xe6, 0xae, 0x47, 0xd8, 0x90, 0xa7, 0x68, 0x69, 0xf0, 0x96, 0x8c, 0x88, 0x91, + 0x5f, 0x26, 0x0b, 0x22, 0xa6, 0x9e, 0x46, 0xec, 0xa6, 0x33, 0xbf, 0x09, 0x55, 0x36, 0xce, 0x6e, + 0xf5, 0x92, 0x59, 0x61, 0xe3, 0x43, 0x5b, 0x5d, 0x85, 0xc5, 0x28, 0x41, 0x17, 0x38, 0x5a, 0x8d, + 0x38, 0x7c, 0x00, 0x35, 0x32, 0xa0, 0x38, 0x1c, 0x61, 0xbb, 0xcf, 0xc6, 0xfc, 0x36, 0xd4, 0xf6, + 0x76, 0x64, 0x8f, 0xd9, 0x28, 0x4f, 0x79, 0x21, 0xbf, 0x87, 0x26, 0x64, 0x5d, 0xc7, 0xe3, 0xee, + 0xfb, 0x25, 0xcb, 0xf2, 0x4e, 0x29, 0x9a, 0x49, 0x77, 0x4a, 0x11, 0x12, 0xde, 0xff, 0xc8, 0xbd, + 0x7f, 0x8a, 0xe8, 0x51, 0xe8, 0x5a, 0xf8, 0x06, 0xde, 0xdb, 0x50, 0x17, 0x7e, 0x92, 0x85, 0x2d, + 0x72, 0xb8, 0x93, 0x11, 0x1f, 0xc7, 0xf8, 0xa1, 0xad, 0x36, 0xa0, 0x1a, 0xc4, 0x3f, 0xc3, 0x13, + 0xa9, 0x98, 0xc9, 0x17, 0x75, 0x07, 0x96, 0x07, 0xa7, 0xc4, 0xfa, 0xb6, 0xef, 0x47, 0xde, 0x00, + 0x87, 0x3c, 0x92, 0x8a, 0x59, 0xe3, 0xd8, 0x13, 0x0e, 0xfd, 0x07, 0xc3, 0x99, 0x83, 0x82, 0xe1, + 0x0c, 0x12, 0x86, 0xff, 0x51, 0x60, 0x25, 0xe5, 0xf8, 0x44, 0x3d, 0xcc, 0xd0, 0xff, 0xe5, 0x38, + 0x69, 0x1c, 0x62, 0xd7, 0x19, 0xb2, 0xcc, 0x31, 0xc7, 0x3e, 0xe3, 0x90, 0xba, 0x55, 0x78, 0x4c, + 0x10, 0xd3, 0xaa, 0xbc, 0x42, 0x3c, 0x03, 0xfb, 0xac, 0xdb, 0x2e, 0x45, 0xa2, 0x4f, 0x44, 0x22, + 0x3c, 0xb6, 0x74, 0xd0, 0xca, 0x58, 0x16, 0xca, 0xde, 0xdf, 0x15, 0x58, 0xe8, 0x51, 0x47, 0x3d, + 0x86, 0x65, 0xe9, 0x35, 0xb9, 0x59, 0x5a, 0x2f, 0xf2, 0x8b, 0x49, 0x7f, 0x77, 0x26, 0x9d, 0xa9, + 0xab, 0xcf, 0xe0, 0x76, 0xe9, 0x9d, 0xb5, 0x35, 0xd1, 0x28, 0x17, 0xe8, 0xf7, 0xae, 0x29, 0x10, + 0xda, 0x4f, 0x00, 0x0a, 0xfb, 0x7a, 0x63, 0xa2, 0x2d, 0x27, 0xf5, 0xb7, 0x67, 0x90, 0x42, 0xef, + 0x0b, 0xa8, 0x15, 0x57, 0xd7, 0xdd, 0x89, 0x9e, 0x02, 0xab, 0xbf, 0x33, 0x8b, 0x15, 0x92, 0xc7, + 0xb0, 0x2c, 0xad, 0x96, 0xcd, 0xa9, 0x5d, 0x19, 0x3d, 0x25, 0xd4, 0x69, 0x07, 0x37, 0x53, 0x15, + 0x87, 0x76, 0xba, 0x6a, 0x46, 0xbf, 0x42, 0xb5, 0x7c, 0x3a, 0xd4, 0xaf, 0xe1, 0x96, 0x7c, 0x32, + 0x9a, 0x53, 0xfb, 0x04, 0xaf, 0xbf, 0x37, 0x9b, 0xcf, 0x84, 0xf5, 0xea, 0x77, 0x57, 0xe7, 0x6d, + 0xe5, 0xe0, 0xe8, 0xf9, 0x45, 0x53, 0x79, 0x71, 0xd1, 0x54, 0xfe, 0xba, 0x68, 0x2a, 0x3f, 0x5e, + 0x36, 0xe7, 0x5e, 0x5c, 0x36, 0xe7, 0xfe, 0xbc, 0x6c, 0xce, 0x3d, 0x7b, 0xe4, 0xb8, 0x6c, 0x18, + 0x0d, 0x3a, 0x16, 0xf1, 0x8c, 0x20, 0xa2, 0x43, 0x7e, 0x0e, 0xf8, 0xd5, 0x2e, 0xbf, 0xdc, 0xf5, + 0x89, 0x8d, 0x8d, 0xb1, 0x91, 0x3f, 0xe1, 0xfc, 0x3f, 0xe3, 0x60, 0x91, 0xff, 0xc9, 0xfb, 0xe8, + 0xdf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x21, 0xaa, 0x85, 0x4a, 0xa1, 0x0a, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -754,6 +875,8 @@ type MsgClient interface { VoteOutbound(ctx context.Context, in *MsgVoteOutbound, opts ...grpc.CallOption) (*MsgVoteOutboundResponse, error) // VoteGasPrice defines a message for universal validators to vote on the gas price VoteGasPrice(ctx context.Context, in *MsgVoteGasPrice, opts ...grpc.CallOption) (*MsgVoteGasPriceResponse, error) + // VoteChainMeta defines a message for universal validators to vote on chain metadata (gas price + block height) + VoteChainMeta(ctx context.Context, in *MsgVoteChainMeta, opts ...grpc.CallOption) (*MsgVoteChainMetaResponse, error) } type msgClient struct { @@ -818,6 +941,15 @@ func (c *msgClient) VoteGasPrice(ctx context.Context, in *MsgVoteGasPrice, opts return out, nil } +func (c *msgClient) VoteChainMeta(ctx context.Context, in *MsgVoteChainMeta, opts ...grpc.CallOption) (*MsgVoteChainMetaResponse, error) { + out := new(MsgVoteChainMetaResponse) + err := c.cc.Invoke(ctx, "/uexecutor.v1.Msg/VoteChainMeta", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // MsgServer is the server API for Msg service. type MsgServer interface { // UpdateParams defines a governance operation for updating the parameters. @@ -834,6 +966,8 @@ type MsgServer interface { VoteOutbound(context.Context, *MsgVoteOutbound) (*MsgVoteOutboundResponse, error) // VoteGasPrice defines a message for universal validators to vote on the gas price VoteGasPrice(context.Context, *MsgVoteGasPrice) (*MsgVoteGasPriceResponse, error) + // VoteChainMeta defines a message for universal validators to vote on chain metadata (gas price + block height) + VoteChainMeta(context.Context, *MsgVoteChainMeta) (*MsgVoteChainMetaResponse, error) } // UnimplementedMsgServer can be embedded to have forward compatible implementations. @@ -858,6 +992,9 @@ func (*UnimplementedMsgServer) VoteOutbound(ctx context.Context, req *MsgVoteOut func (*UnimplementedMsgServer) VoteGasPrice(ctx context.Context, req *MsgVoteGasPrice) (*MsgVoteGasPriceResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method VoteGasPrice not implemented") } +func (*UnimplementedMsgServer) VoteChainMeta(ctx context.Context, req *MsgVoteChainMeta) (*MsgVoteChainMetaResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method VoteChainMeta not implemented") +} func RegisterMsgServer(s grpc1.Server, srv MsgServer) { s.RegisterService(&_Msg_serviceDesc, srv) @@ -971,6 +1108,24 @@ func _Msg_VoteGasPrice_Handler(srv interface{}, ctx context.Context, dec func(in return interceptor(ctx, in, info, handler) } +func _Msg_VoteChainMeta_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgVoteChainMeta) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).VoteChainMeta(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/uexecutor.v1.Msg/VoteChainMeta", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).VoteChainMeta(ctx, req.(*MsgVoteChainMeta)) + } + return interceptor(ctx, in, info, handler) +} + var _Msg_serviceDesc = grpc.ServiceDesc{ ServiceName: "uexecutor.v1.Msg", HandlerType: (*MsgServer)(nil), @@ -999,6 +1154,10 @@ var _Msg_serviceDesc = grpc.ServiceDesc{ MethodName: "VoteGasPrice", Handler: _Msg_VoteGasPrice_Handler, }, + { + MethodName: "VoteChainMeta", + Handler: _Msg_VoteChainMeta_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "uexecutor/v1/tx.proto", @@ -1449,6 +1608,81 @@ func (m *MsgVoteGasPriceResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) return len(dAtA) - i, nil } +func (m *MsgVoteChainMeta) 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 *MsgVoteChainMeta) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgVoteChainMeta) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.ObservedAt != 0 { + i = encodeVarintTx(dAtA, i, uint64(m.ObservedAt)) + i-- + dAtA[i] = 0x28 + } + if m.ChainHeight != 0 { + i = encodeVarintTx(dAtA, i, uint64(m.ChainHeight)) + i-- + dAtA[i] = 0x20 + } + if m.Price != 0 { + i = encodeVarintTx(dAtA, i, uint64(m.Price)) + i-- + dAtA[i] = 0x18 + } + if len(m.ObservedChainId) > 0 { + i -= len(m.ObservedChainId) + copy(dAtA[i:], m.ObservedChainId) + i = encodeVarintTx(dAtA, i, uint64(len(m.ObservedChainId))) + 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 +} + +func (m *MsgVoteChainMetaResponse) 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 *MsgVoteChainMetaResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgVoteChainMetaResponse) 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 @@ -1644,6 +1878,41 @@ func (m *MsgVoteGasPriceResponse) Size() (n int) { return n } +func (m *MsgVoteChainMeta) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Signer) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = len(m.ObservedChainId) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + if m.Price != 0 { + n += 1 + sovTx(uint64(m.Price)) + } + if m.ChainHeight != 0 { + n += 1 + sovTx(uint64(m.ChainHeight)) + } + if m.ObservedAt != 0 { + n += 1 + sovTx(uint64(m.ObservedAt)) + } + return n +} + +func (m *MsgVoteChainMetaResponse) 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 } @@ -2889,6 +3158,227 @@ func (m *MsgVoteGasPriceResponse) Unmarshal(dAtA []byte) error { } return nil } +func (m *MsgVoteChainMeta) 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: MsgVoteChainMeta: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgVoteChainMeta: illegal tag %d (wire type %d)", fieldNum, wire) + } + 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 ObservedChainId", 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.ObservedChainId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Price", wireType) + } + m.Price = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Price |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ChainHeight", wireType) + } + m.ChainHeight = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.ChainHeight |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ObservedAt", wireType) + } + m.ObservedAt = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.ObservedAt |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgVoteChainMetaResponse) 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: MsgVoteChainMetaResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgVoteChainMetaResponse: 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 246a7720c2ecd4c565cc103758d4506288018b3a Mon Sep 17 00:00:00 2001 From: Nilesh Gupta Date: Thu, 12 Mar 2026 16:11:03 +0530 Subject: [PATCH 11/36] feat: added migration for uexecutor v4 -> v5 consensus --- x/uexecutor/autocli.go | 26 ++++++++++++++++++++++++++ x/uexecutor/migrations/v5/migrate.go | 13 +++++++++++++ x/uexecutor/module.go | 19 +++++++++++++++++-- 3 files changed, 56 insertions(+), 2 deletions(-) create mode 100644 x/uexecutor/migrations/v5/migrate.go diff --git a/x/uexecutor/autocli.go b/x/uexecutor/autocli.go index 5856254f..2eca2060 100755 --- a/x/uexecutor/autocli.go +++ b/x/uexecutor/autocli.go @@ -17,6 +17,32 @@ func (am AppModule) AutoCLIOptions() *autocliv1.ModuleOptions { Use: "params", Short: "Query the current gov gated parameters", }, + { + RpcMethod: "GasPrice", + Use: "gas-price [chain-id]", + Short: "Query the median gas price for a specific chain (reads from ChainMeta store)", + PositionalArgs: []*autocliv1.PositionalArgDescriptor{ + {ProtoField: "chain_id"}, + }, + }, + { + RpcMethod: "AllGasPrices", + Use: "all-gas-prices", + Short: "Query gas prices for all chains (reads from ChainMeta store)", + }, + { + RpcMethod: "ChainMeta", + Use: "chain-meta [chain-id]", + Short: "Query aggregated chain metadata (gas price + block height) for a specific chain", + PositionalArgs: []*autocliv1.PositionalArgDescriptor{ + {ProtoField: "chain_id"}, + }, + }, + { + RpcMethod: "AllChainMetas", + Use: "all-chain-metas", + Short: "Query chain metadata for all chains", + }, }, SubCommands: map[string]*autocliv1.ServiceCommandDescriptor{ "v2": { diff --git a/x/uexecutor/migrations/v5/migrate.go b/x/uexecutor/migrations/v5/migrate.go new file mode 100644 index 00000000..cc82b1b6 --- /dev/null +++ b/x/uexecutor/migrations/v5/migrate.go @@ -0,0 +1,13 @@ +package v5 + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + + "github.com/pushchain/push-chain-node/x/uexecutor/keeper" +) + +// MigrateGasPricesToChainMeta seeds the ChainMetas collection from the legacy +// GasPrices store. This is idempotent — existing ChainMeta entries are not overwritten. +func MigrateGasPricesToChainMeta(ctx sdk.Context, k *keeper.Keeper) error { + return k.MigrateGasPricesToChainMeta(ctx) +} diff --git a/x/uexecutor/module.go b/x/uexecutor/module.go index 2e7f261d..dbe947e8 100755 --- a/x/uexecutor/module.go +++ b/x/uexecutor/module.go @@ -25,11 +25,12 @@ import ( v2 "github.com/pushchain/push-chain-node/x/uexecutor/migrations/v2" v4 "github.com/pushchain/push-chain-node/x/uexecutor/migrations/v4" + v5 "github.com/pushchain/push-chain-node/x/uexecutor/migrations/v5" ) const ( // ConsensusVersion defines the current x/uexecutor module consensus version. - ConsensusVersion = 4 + ConsensusVersion = 5 ) var ( @@ -180,7 +181,14 @@ func (a AppModule) RegisterServices(cfg module.Configurator) { // Register UExecutor custom migration for v2 (from version 3 -> 4) if err := cfg.RegisterMigration(types.ModuleName, 3, a.migrateToV4()); err != nil { - panic(fmt.Sprintf("failed to migrate %s from version 2 to 3: %v", types.ModuleName, err)) + panic(fmt.Sprintf("failed to migrate %s from version 3 to 4: %v", types.ModuleName, err)) + } + + // Register UExecutor migration from version 4 -> 5 (chain-meta upgrade) + // GasPrices → ChainMetas migration is handled explicitly in the upgrade handler + // before RunMigrations is called, so this is a no-op. + if err := cfg.RegisterMigration(types.ModuleName, 4, a.migrateToV5()); err != nil { + panic(fmt.Sprintf("failed to migrate %s from version 4 to 5: %v", types.ModuleName, err)) } } @@ -208,6 +216,13 @@ func (a AppModule) migrateToV4() module.MigrationHandler { } } +func (a AppModule) migrateToV5() module.MigrationHandler { + return func(ctx sdk.Context) error { + ctx.Logger().Info("🔧 Running uexecutor module migration: v4 → v5 (chain-meta)") + return v5.MigrateGasPricesToChainMeta(ctx, &a.keeper) + } +} + // ConsensusVersion is a sequence number for state-breaking change of the // module. It should be incremented on each consensus-breaking change // introduced by the module. To avoid wrong/empty versions, the initial version From dce51024283730f614d620cba1736c066a641956 Mon Sep 17 00:00:00 2001 From: Nilesh Gupta Date: Thu, 12 Mar 2026 16:11:19 +0530 Subject: [PATCH 12/36] feat: added upgrade handler --- app/upgrades.go | 6 +++-- app/upgrades/chain-meta/upgrade.go | 41 ++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 2 deletions(-) create mode 100644 app/upgrades/chain-meta/upgrade.go diff --git a/app/upgrades.go b/app/upgrades.go index 4ad2a032..d2242870 100755 --- a/app/upgrades.go +++ b/app/upgrades.go @@ -6,6 +6,7 @@ import ( upgradetypes "cosmossdk.io/x/upgrade/types" "github.com/pushchain/push-chain-node/app/upgrades" + chainmeta "github.com/pushchain/push-chain-node/app/upgrades/chain-meta" ethhashfix "github.com/pushchain/push-chain-node/app/upgrades/eth-hash-fix" evmrpcfix "github.com/pushchain/push-chain-node/app/upgrades/evm-rpc-fix" feeabs "github.com/pushchain/push-chain-node/app/upgrades/fee-abs" @@ -14,10 +15,10 @@ import ( outbound "github.com/pushchain/push-chain-node/app/upgrades/outbound" pcmintcap "github.com/pushchain/push-chain-node/app/upgrades/pc-mint-cap" proxybytecodefix "github.com/pushchain/push-chain-node/app/upgrades/proxy-bytecode-fix" - supplyslash "github.com/pushchain/push-chain-node/app/upgrades/supply-slash" - supplyburn "github.com/pushchain/push-chain-node/app/upgrades/supply-burn" removefeeabsv1 "github.com/pushchain/push-chain-node/app/upgrades/remove-fee-abs-v1" solanafix "github.com/pushchain/push-chain-node/app/upgrades/solana-fix" + supplyburn "github.com/pushchain/push-chain-node/app/upgrades/supply-burn" + supplyslash "github.com/pushchain/push-chain-node/app/upgrades/supply-slash" tsscore "github.com/pushchain/push-chain-node/app/upgrades/tss-core" tsscoreevmparamsfix "github.com/pushchain/push-chain-node/app/upgrades/tss-core-evm-params-fix" tsscorefix "github.com/pushchain/push-chain-node/app/upgrades/tss-core-fix" @@ -43,6 +44,7 @@ var Upgrades = []upgrades.Upgrade{ proxybytecodefix.NewUpgrade(), supplyslash.NewUpgrade(), supplyburn.NewUpgrade(), + chainmeta.NewUpgrade(), } // RegisterUpgradeHandlers registers the chain upgrade handlers diff --git a/app/upgrades/chain-meta/upgrade.go b/app/upgrades/chain-meta/upgrade.go new file mode 100644 index 00000000..73da6a4b --- /dev/null +++ b/app/upgrades/chain-meta/upgrade.go @@ -0,0 +1,41 @@ +package chainmeta + +import ( + "context" + + storetypes "cosmossdk.io/store/types" + upgradetypes "cosmossdk.io/x/upgrade/types" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/module" + + "github.com/pushchain/push-chain-node/app/upgrades" +) + +const UpgradeName = "chain-meta" + +// NewUpgrade constructs the upgrade definition +func NewUpgrade() upgrades.Upgrade { + return upgrades.Upgrade{ + UpgradeName: UpgradeName, + CreateUpgradeHandler: CreateUpgradeHandler, + StoreUpgrades: storetypes.StoreUpgrades{ + Added: []string{}, + Deleted: []string{}, + }, + } +} + +func CreateUpgradeHandler( + mm upgrades.ModuleManager, + configurator module.Configurator, + ak *upgrades.AppKeepers, +) upgradetypes.UpgradeHandler { + return func(ctx context.Context, plan upgradetypes.Plan, fromVM module.VersionMap) (module.VersionMap, error) { + sdkCtx := sdk.UnwrapSDKContext(ctx) + sdkCtx.Logger().Info("🔧 Running upgrade:", "name", UpgradeName) + + // RunMigrations triggers uexecutor v4→v5 which calls MigrateGasPricesToChainMeta. + return mm.RunMigrations(ctx, configurator, fromVM) + } +} From 9e65043d72e4f2f2bccf64c34c3cb7810be2240f Mon Sep 17 00:00:00 2001 From: Nilesh Gupta Date: Thu, 12 Mar 2026 16:11:49 +0530 Subject: [PATCH 13/36] tests: added integration tests for vote_chain_meta --- .../uexecutor/vote_chain_meta_test.go | 264 ++++++++++++++++++ test/utils/bytecode.go | 2 +- test/utils/helpers.go | 32 +++ 3 files changed, 297 insertions(+), 1 deletion(-) create mode 100644 test/integration/uexecutor/vote_chain_meta_test.go diff --git a/test/integration/uexecutor/vote_chain_meta_test.go b/test/integration/uexecutor/vote_chain_meta_test.go new file mode 100644 index 00000000..81ebae13 --- /dev/null +++ b/test/integration/uexecutor/vote_chain_meta_test.go @@ -0,0 +1,264 @@ +package integrationtest + +import ( + "fmt" + "math/big" + "testing" + "time" + + sdk "github.com/cosmos/cosmos-sdk/types" + authz "github.com/cosmos/cosmos-sdk/x/authz" + stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" + "github.com/stretchr/testify/require" + + "github.com/pushchain/push-chain-node/app" + utils "github.com/pushchain/push-chain-node/test/utils" + uexecutortypes "github.com/pushchain/push-chain-node/x/uexecutor/types" + uregistrytypes "github.com/pushchain/push-chain-node/x/uregistry/types" + uvalidatortypes "github.com/pushchain/push-chain-node/x/uvalidator/types" +) + +func setupVoteChainMetaTest(t *testing.T, numVals int) (*app.ChainApp, sdk.Context, []string, []stakingtypes.Validator) { + testApp, ctx, _, validators := utils.SetAppWithMultipleValidators(t, numVals) + + chainConfig := uregistrytypes.ChainConfig{ + Chain: "eip155:11155111", + VmType: uregistrytypes.VmType_EVM, + PublicRpcUrl: "https://sepolia.drpc.org", + GatewayAddress: "0x28E0F09bE2321c1420Dc60Ee146aACbD68B335Fe", + Enabled: &uregistrytypes.ChainEnabled{ + IsInboundEnabled: true, + IsOutboundEnabled: true, + }, + } + require.NoError(t, testApp.UregistryKeeper.AddChainConfig(ctx, &chainConfig)) + + universalVals := make([]string, len(validators)) + for i, val := range validators { + network := uvalidatortypes.NetworkInfo{PeerId: fmt.Sprintf("temp%d", i+1), MultiAddrs: []string{"temp"}} + require.NoError(t, testApp.UvalidatorKeeper.AddUniversalValidator(ctx, val.OperatorAddress, network)) + universalVals[i] = sdk.AccAddress([]byte(fmt.Sprintf("universal-validator-%d", i))).String() + } + + for i, val := range validators { + accAddr, err := sdk.ValAddressFromBech32(val.OperatorAddress) + require.NoError(t, err) + coreAcc := sdk.AccAddress(accAddr) + uniAcc := sdk.MustAccAddressFromBech32(universalVals[i]) + auth := authz.NewGenericAuthorization(sdk.MsgTypeURL(&uexecutortypes.MsgVoteChainMeta{})) + exp := ctx.BlockTime().Add(time.Hour) + require.NoError(t, testApp.AuthzKeeper.SaveGrant(ctx, uniAcc, coreAcc, auth, &exp)) + } + + return testApp, ctx, universalVals, validators +} + +func TestVoteChainMetaIntegration(t *testing.T) { + t.Parallel() + chainId := "eip155:11155111" + + t.Run("single validator vote stores chain meta", func(t *testing.T) { + testApp, ctx, uvals, vals := setupVoteChainMetaTest(t, 1) + + coreVal, err := sdk.ValAddressFromBech32(vals[0].OperatorAddress) + require.NoError(t, err) + coreAcc := sdk.AccAddress(coreVal).String() + + err = utils.ExecVoteChainMeta(t, ctx, testApp, uvals[0], coreAcc, chainId, 100_000_000_000, 12345, 1700000000) + require.NoError(t, err) + + stored, found, err := testApp.UexecutorKeeper.GetChainMeta(ctx, chainId) + require.NoError(t, err) + require.True(t, found) + require.Len(t, stored.Prices, 1) + require.Equal(t, uint64(100_000_000_000), stored.Prices[0]) + require.Len(t, stored.ChainHeights, 1) + require.Equal(t, uint64(12345), stored.ChainHeights[0]) + require.Len(t, stored.ObservedAts, 1) + require.Equal(t, uint64(1700000000), stored.ObservedAts[0]) + }) + + t.Run("multiple validators vote and median calculated", func(t *testing.T) { + testApp, ctx, uvals, vals := setupVoteChainMetaTest(t, 4) + + votes := []struct { + uniVal string + price uint64 + height uint64 + observedAt uint64 + }{ + {uvals[0], 300_000_000_000, 12345, 1700000001}, + {uvals[1], 200_000_000_000, 12346, 1700000002}, + {uvals[2], 400_000_000_000, 12347, 1700000003}, + {uvals[3], 250_000_000_000, 12348, 1700000004}, + } + + for i, v := range votes { + coreVal, err := sdk.ValAddressFromBech32(vals[i].OperatorAddress) + require.NoError(t, err) + coreAcc := sdk.AccAddress(coreVal).String() + err = utils.ExecVoteChainMeta(t, ctx, testApp, v.uniVal, coreAcc, chainId, v.price, v.height, v.observedAt) + require.NoError(t, err) + } + + stored, found, err := testApp.UexecutorKeeper.GetChainMeta(ctx, chainId) + require.NoError(t, err) + require.True(t, found) + require.Len(t, stored.Prices, 4) + require.Len(t, stored.ChainHeights, 4) + require.Len(t, stored.ObservedAts, 4) + + median := stored.Prices[stored.MedianIndex] + // sorted: 200, 250, 300, 400 → median at index 2 → 300 + require.Equal(t, uint64(300_000_000_000), median) + }) + + t.Run("update existing vote", func(t *testing.T) { + testApp, ctx, uvals, vals := setupVoteChainMetaTest(t, 1) + + coreVal, err := sdk.ValAddressFromBech32(vals[0].OperatorAddress) + require.NoError(t, err) + coreAcc := sdk.AccAddress(coreVal).String() + + require.NoError(t, utils.ExecVoteChainMeta(t, ctx, testApp, uvals[0], coreAcc, chainId, 100_000_000_000, 12345, 1700000000)) + // Update same validator's vote + require.NoError(t, utils.ExecVoteChainMeta(t, ctx, testApp, uvals[0], coreAcc, chainId, 400_000_000_000, 12350, 1700000100)) + + stored, found, err := testApp.UexecutorKeeper.GetChainMeta(ctx, chainId) + require.NoError(t, err) + require.True(t, found) + require.Len(t, stored.Prices, 1, "should have only one entry (updated in-place)") + require.Equal(t, uint64(400_000_000_000), stored.Prices[0]) + require.Equal(t, uint64(12350), stored.ChainHeights[0]) + require.Equal(t, uint64(1700000100), stored.ObservedAts[0]) + }) + + t.Run("odd number of votes median", func(t *testing.T) { + testApp, ctx, uvals, vals := setupVoteChainMetaTest(t, 3) + prices := []uint64{100, 300, 200} + + for i, price := range prices { + coreVal, _ := sdk.ValAddressFromBech32(vals[i].OperatorAddress) + coreAcc := sdk.AccAddress(coreVal).String() + require.NoError(t, utils.ExecVoteChainMeta(t, ctx, testApp, uvals[i], coreAcc, chainId, price, uint64(i+1), uint64(1700000000+i))) + } + + stored, _, _ := testApp.UexecutorKeeper.GetChainMeta(ctx, chainId) + median := stored.Prices[stored.MedianIndex] + require.Equal(t, uint64(200), median) + }) +} + +func TestMigrateGasPricesToChainMeta(t *testing.T) { + chainId := "eip155:11155111" + + t.Run("migrates gas prices to chain meta", func(t *testing.T) { + testApp, ctx, _, _ := utils.SetAppWithMultipleValidators(t, 1) + + // Seed a GasPrice entry manually (simulating pre-upgrade state) + require.NoError(t, testApp.UexecutorKeeper.SetGasPrice(ctx, chainId, uexecutortypes.GasPrice{ + ObservedChainId: chainId, + Signers: []string{"cosmos1abc", "cosmos1def"}, + Prices: []uint64{100_000_000_000, 200_000_000_000}, + BlockNums: []uint64{12345, 12346}, + MedianIndex: 1, + })) + + // Run migration + require.NoError(t, testApp.UexecutorKeeper.MigrateGasPricesToChainMeta(ctx)) + + // Verify ChainMeta was created + cm, found, err := testApp.UexecutorKeeper.GetChainMeta(ctx, chainId) + require.NoError(t, err) + require.True(t, found) + + require.Equal(t, chainId, cm.ObservedChainId) + require.Equal(t, []string{"cosmos1abc", "cosmos1def"}, cm.Signers) + require.Equal(t, []uint64{100_000_000_000, 200_000_000_000}, cm.Prices) + // block_nums from GasPrice become chain_heights in ChainMeta + require.Equal(t, []uint64{12345, 12346}, cm.ChainHeights) + // observedAts unknown at migration time → all 0 + require.Equal(t, []uint64{0, 0}, cm.ObservedAts) + require.Equal(t, uint64(1), cm.MedianIndex) + }) + + t.Run("migration is idempotent: does not overwrite existing chain meta", func(t *testing.T) { + testApp, ctx, _, _ := utils.SetAppWithMultipleValidators(t, 1) + + // Pre-seed a GasPrice entry + require.NoError(t, testApp.UexecutorKeeper.SetGasPrice(ctx, chainId, uexecutortypes.GasPrice{ + ObservedChainId: chainId, + Signers: []string{"cosmos1abc"}, + Prices: []uint64{100_000_000_000}, + BlockNums: []uint64{12345}, + MedianIndex: 0, + })) + + // Pre-seed a ChainMeta entry (simulating a validator already voted post-upgrade) + require.NoError(t, testApp.UexecutorKeeper.SetChainMeta(ctx, chainId, uexecutortypes.ChainMeta{ + ObservedChainId: chainId, + Signers: []string{"cosmos1xyz"}, + Prices: []uint64{999_000_000_000}, + ChainHeights: []uint64{99999}, + ObservedAts: []uint64{1700000099}, + MedianIndex: 0, + })) + + // Run migration — should skip because ChainMeta already exists + require.NoError(t, testApp.UexecutorKeeper.MigrateGasPricesToChainMeta(ctx)) + + // Verify the existing entry was NOT overwritten + cm, found, err := testApp.UexecutorKeeper.GetChainMeta(ctx, chainId) + require.NoError(t, err) + require.True(t, found) + require.Equal(t, []string{"cosmos1xyz"}, cm.Signers, "existing chain meta should not be overwritten") + require.Equal(t, uint64(999_000_000_000), cm.Prices[0]) + }) +} + +// TestVoteChainMetaContractState verifies that after voting, the UniversalCore contract's +// on-chain storage reflects the correct gas price, chain height, and observed timestamp. +func TestVoteChainMetaContractState(t *testing.T) { + chainId := "eip155:11155111" + const ( + price = uint64(100_000_000_000) + height = uint64(12345) + observedAt = uint64(1700000000) + ) + + testApp, ctx, uvals, vals := setupVoteChainMetaTest(t, 1) + + coreVal, err := sdk.ValAddressFromBech32(vals[0].OperatorAddress) + require.NoError(t, err) + coreAcc := sdk.AccAddress(coreVal).String() + + require.NoError(t, utils.ExecVoteChainMeta(t, ctx, testApp, uvals[0], coreAcc, chainId, price, height, observedAt)) + + // Read from the UniversalCore contract using the public mapping getters + universalCoreAddr := utils.GetDefaultAddresses().HandlerAddr + ucABI, err := uexecutortypes.ParseUniversalCoreABI() + require.NoError(t, err) + + caller, _ := testApp.UexecutorKeeper.GetUeModuleAddress(ctx) + + t.Run("gasPriceByChainNamespace matches voted price", func(t *testing.T) { + res, err := testApp.EVMKeeper.CallEVM(ctx, ucABI, caller, universalCoreAddr, false, "gasPriceByChainNamespace", chainId) + require.NoError(t, err) + got := new(big.Int).SetBytes(res.Ret) + require.Equal(t, new(big.Int).SetUint64(price), got) + }) + + t.Run("chainHeightByChainNamespace matches voted height", func(t *testing.T) { + res, err := testApp.EVMKeeper.CallEVM(ctx, ucABI, caller, universalCoreAddr, false, "chainHeightByChainNamespace", chainId) + require.NoError(t, err) + got := new(big.Int).SetBytes(res.Ret) + require.Equal(t, new(big.Int).SetUint64(height), got) + }) + + t.Run("timestampObservedAtByChainNamespace matches voted observedAt", func(t *testing.T) { + res, err := testApp.EVMKeeper.CallEVM(ctx, ucABI, caller, universalCoreAddr, false, "timestampObservedAtByChainNamespace", chainId) + require.NoError(t, err) + got := new(big.Int).SetBytes(res.Ret) + require.Equal(t, new(big.Int).SetUint64(observedAt), got) + }) +} diff --git a/test/utils/bytecode.go b/test/utils/bytecode.go index 7e8177be..18b36c61 100644 --- a/test/utils/bytecode.go +++ b/test/utils/bytecode.go @@ -6,7 +6,7 @@ const UEA_SVM_BYTECODE = "6080604052348015600e575f80fd5b5060015f55611cf780610020 const UEA_PROXY_BYTECODE = "608060405260043610610028575f3560e01c806323efa7ec14610032578063aaf10f4214610051575b6100306100a8565b005b34801561003d575f80fd5b5061003061004c366004610368565b6100ba565b34801561005c575f80fd5b507f868a771a75a4aa6c2be13e9a9617cb8ea240ed84a3a90c8469537393ec3e115d5460405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b6100b86100b36102cc565b61034a565b565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff165f811580156101045750825b90505f8267ffffffffffffffff1660011480156101205750303b155b90508115801561012e575080155b15610165576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016600117855583156101c65784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b5f6101ef7f868a771a75a4aa6c2be13e9a9617cb8ea240ed84a3a90c8469537393ec3e115d5490565b905073ffffffffffffffffffffffffffffffffffffffff81161561023f576040517fae962d4e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b867f868a771a75a4aa6c2be13e9a9617cb8ea240ed84a3a90c8469537393ec3e115d555083156102c45784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b5f806102f67f868a771a75a4aa6c2be13e9a9617cb8ea240ed84a3a90c8469537393ec3e115d5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610345576040517fae962d4e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b365f80375f80365f845af43d5f803e808015610364573d5ff35b3d5ffd5b5f60208284031215610378575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff8116811461039b575f80fd5b939250505056fea2646970667358221220c4b8f9457567bdcd08b95faef7df86de4e9daead65e2db22018126d9eb77d85864736f6c634300081a0033" -const HANDLER_CONTRACT_BYTECODE = "6080604052600436106102ae575f3560e01c80638456cb5911610165578063c6f1b7e7116100c6578063dcc16b5c1161007c578063f220e73e11610062578063f220e73e14610924578063f8c8765e14610971578063fb46e99d14610990575f80fd5b8063dcc16b5c146108d2578063ec87621c146108f1575f80fd5b8063d17c872c116100ac578063d17c872c14610875578063d547741f14610894578063db9a0daf146108b3575f80fd5b8063c6f1b7e71461080b578063c98018971461083e575f80fd5b8063a861469f1161011b578063b8efe33411610101578063b8efe33414610794578063be0580c0146107c0578063c344869f146107df575f80fd5b8063a861469f14610722578063ad14d38514610766575f80fd5b806391d148541161014b57806391d14854146106805780639be7fdb2146106f0578063a217fddf1461070f575f80fd5b80638456cb591461064d578063870152b714610661575f80fd5b80634eb7d1a11161020f5780636d4008a8116101c557806378a88127116101ab57806378a88127146105b55780637efbce04146105d457806380f5db8c14610621575f80fd5b80636d4008a81461056b578063780ad82714610596575f80fd5b80635c975abb116101f55780635c975abb146104f75780636341c64d1461052d57806364f10e501461054c575f80fd5b80634eb7d1a11461049757806357724c41146104d8575f80fd5b80632f2ff15d116102645780633f4ba83a1161024a5780633f4ba83a146103f157806346c72fdd146104055780634b1d2eeb14610456575f80fd5b80632f2ff15d146103b357806336568abe146103d2575f80fd5b80630ac6eb77116102945780630ac6eb771461030e5780631a4e49d41461032d578063248a9ca314610366575f80fd5b806301ffc9a7146102b95780630379eae8146102ed575f80fd5b366102b557005b5f80fd5b3480156102c4575f80fd5b506102d86102d3366004612be8565b6109a5565b60405190151581526020015b60405180910390f35b3480156102f8575f80fd5b5061030c610307366004612d23565b610a3d565b005b348015610319575f80fd5b5061030c610328366004612d93565b610a9d565b348015610338575f80fd5b50610358610347366004612dca565b5f6020819052908152604090205481565b6040519081526020016102e4565b348015610371575f80fd5b50610358610380366004612dca565b5f9081527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604090206001015490565b3480156103be575f80fd5b5061030c6103cd366004612de1565b610b8a565b3480156103dd575f80fd5b5061030c6103ec366004612de1565b610bd3565b3480156103fc575f80fd5b5061030c610c31565b348015610410575f80fd5b50600a546104319073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102e4565b348015610461575f80fd5b50610431610470366004612dca565b60016020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b3480156104a2575f80fd5b506104316104b1366004612dca565b60026020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b3480156104e3575f80fd5b5061030c6104f2366004612e04565b610ca2565b348015610502575f80fd5b507fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff166102d8565b348015610538575f80fd5b5061030c610547366004612e2e565b610df7565b348015610557575f80fd5b5061030c610566366004612e49565b610f25565b348015610576575f80fd5b50610358610585366004612e2e565b60056020525f908152604090205481565b3480156105a1575f80fd5b5061030c6105b0366004612e9f565b6110ef565b3480156105c0575f80fd5b5061030c6105cf366004612e49565b611a28565b3480156105df575f80fd5b506104316105ee366004612efe565b8051602081830181018051600d8252928201919093012091525473ffffffffffffffffffffffffffffffffffffffff1681565b34801561062c575f80fd5b506007546104319073ffffffffffffffffffffffffffffffffffffffff1681565b348015610658575f80fd5b5061030c611a8f565b34801561066c575f80fd5b5061035861067b366004612f30565b611afe565b34801561068b575f80fd5b506102d861069a366004612de1565b5f9182527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b3480156106fb575f80fd5b5061030c61070a366004612f7c565b611bf9565b34801561071a575f80fd5b506103585f81565b34801561072d575f80fd5b5061075261073c366004612e2e565b60046020525f908152604090205462ffffff1681565b60405162ffffff90911681526020016102e4565b348015610771575f80fd5b506102d8610780366004612e2e565b60036020525f908152604090205460ff1681565b34801561079f575f80fd5b506008546104319073ffffffffffffffffffffffffffffffffffffffff1681565b3480156107cb575f80fd5b5061030c6107da366004612fc0565b611d12565b3480156107ea575f80fd5b506009546104319073ffffffffffffffffffffffffffffffffffffffff1681565b348015610816575f80fd5b506104317f000000000000000000000000000000000000000000000000000000000000000081565b348015610849575f80fd5b50610358610858366004612efe565b8051602081830181018051600b8252928201919093012091525481565b348015610880575f80fd5b5061030c61088f366004612ffd565b611ea7565b34801561089f575f80fd5b5061030c6108ae366004612de1565b612048565b3480156108be575f80fd5b5061030c6108cd366004612dca565b61208b565b3480156108dd575f80fd5b5061030c6108ec366004613030565b612127565b3480156108fc575f80fd5b506103587f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b0881565b34801561092f575f80fd5b5061043161093e366004612efe565b8051602081830181018051600c8252928201919093012091525473ffffffffffffffffffffffffffffffffffffffff1681565b34801561097c575f80fd5b5061030c61098b36600461308c565b6123c3565b34801561099b575f80fd5b5061035860065481565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b000000000000000000000000000000000000000000000000000000001480610a3757507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b80600b83604051610a4e9190613107565b9081526020016040518091039020819055507f6a59d469e3757d6e139cdf95b12740f585d553afac49b90bdbe278502a4427188282604051610a9192919061316b565b60405180910390a15050565b335f9081527fb7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d602052604090205460ff16610b04576040517f49e27cff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82165f8181526003602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168515159081179091558251938452908301527f42cc79f957a9535dc49c660eec62747fb540bef0dd29cd7f6c0a810816af4cff9101610a91565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020526040902060010154610bc3816125b0565b610bcd83836125bd565b50505050565b73ffffffffffffffffffffffffffffffffffffffff81163314610c22576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c2c82826126e2565b505050565b335f9081527fb7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d602052604090205460ff16610c98576040517f49e27cff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ca06127be565b565b335f9081527fb7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d602052604090205460ff16610d09576040517f49e27cff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216610d56576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388811115610d92576040517fc31c0b6e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82165f8181526005602052604090819020839055517fe3e43e0700c35d0879972f000dc93907848b11360702f11ebbe14479866f806090610deb9084815260200190565b60405180910390a25050565b335f9081527fb7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d602052604090205460ff16610e5e576040517f49e27cff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116610eab576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fc2d9f94b2a169da07b0305c4fcdf5e7d988c6e4793af0796516c96727a90b70e906020015b60405180910390a150565b610f2d612855565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480610f9c575073ffffffffffffffffffffffffffffffffffffffff811630145b15610fd3576040517f82d5d76a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8316611020576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f03611059576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f47e7ef2400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8281166004830152602482018490528416906347e7ef24906044016020604051808303815f875af11580156110cb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bcd919061318c565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461115e576040517f53e5172300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611166612855565b61116e6128b1565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806111dd575073ffffffffffffffffffffffffffffffffffffffff841630145b15611214576040517f82d5d76a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8616611261576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845f0361129a576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff86165f9081526003602052604090205460ff166112f8576040517f4e38f95a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8262ffffff165f036113695773ffffffffffffffffffffffffffffffffffffffff86165f9081526004602052604081205462ffffff169350839003611369576040517f3733548a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f0361138b5760065461137e90603c6131d4565b61138890426131eb565b90505b804211156113c5576040517f1ab7da6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600754600a545f9173ffffffffffffffffffffffffffffffffffffffff90811691631698ee8291908116908a161061141557600a5473ffffffffffffffffffffffffffffffffffffffff16611417565b885b600a5473ffffffffffffffffffffffffffffffffffffffff908116908b1610611440578961145a565b600a5473ffffffffffffffffffffffffffffffffffffffff165b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff92831660048201529116602482015262ffffff87166044820152606401602060405180830381865afa1580156114d3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114f791906131fe565b905073ffffffffffffffffffffffffffffffffffffffff8116611546576040517f76ecffc000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825f0361158557600a545f9061157590899073ffffffffffffffffffffffffffffffffffffffff16878a611afe565b90506115818189612932565b9350505b6040517f47e7ef240000000000000000000000000000000000000000000000000000000081523060048201526024810187905273ffffffffffffffffffffffffffffffffffffffff8816906347e7ef24906044016020604051808303815f875af11580156115f5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611619919061318c565b506008546040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9182166004820152602481018890529088169063095ea7b3906044016020604051808303815f875af1158015611690573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116b4919061318c565b50604080516101008101825273ffffffffffffffffffffffffffffffffffffffff808a168252600a548116602083015262ffffff8716828401523060608301526080820185905260a0820189905260c082018690525f60e0830181905260085493517f414bf3890000000000000000000000000000000000000000000000000000000081529293909291169063414bf38990611754908590600401613219565b6020604051808303815f875af1158015611770573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061179491906132d7565b9050848110156117d0576040517f8199f5f300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600a546040517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081526004810183905273ffffffffffffffffffffffffffffffffffffffff90911690632e1a7d4d906024015f604051808303815f87803b158015611839575f80fd5b505af115801561184b573d5f803e3d5ffd5b505050505f8773ffffffffffffffffffffffffffffffffffffffff16826040515f6040518083038185875af1925050503d805f81146118a5576040519150601f19603f3d011682016040523d82523d5f602084013e6118aa565b606091505b50509050806118e5576040517f90b8ec1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6008546040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff91821660048201525f6024820152908b169063095ea7b3906044016020604051808303815f875af115801561195a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061197e919061318c565b50600a546040805173ffffffffffffffffffffffffffffffffffffffff8d81168252602082018d9052928316818301526060810185905262ffffff8a166080820152918a1660a0830152517ff5d6ca9b390b5271e0cbb3d43b4d708d5b17804cb81a4c65e027226d87ccf0e29181900360c00190a150505050611a2060017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050505050565b335f9081527fb7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d602052604090205460ff16610f25576040517f49e27cff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b335f9081527fb7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d602052604090205460ff16611af6576040517f49e27cff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ca06129c2565b6040805160a08101825273ffffffffffffffffffffffffffffffffffffffff86811682528581166020830190815282840185815262ffffff878116606086019081525f6080870181815260095498517fc6a5026a0000000000000000000000000000000000000000000000000000000081528851881660048201529551871660248701529351604486015290519091166064840152905183166084830152938492169063c6a5026a9060a4016080604051808303815f875af1158015611bc6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bea91906132ee565b50919998505050505050505050565b7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b08611c23816125b0565b73ffffffffffffffffffffffffffffffffffffffff8216611c70576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81600c84604051611c819190613107565b908152604051908190036020018120805473ffffffffffffffffffffffffffffffffffffffff939093167fffffffffffffffffffffffff0000000000000000000000000000000000000000909316929092179091557f0c7d242571a289736ea536c54ebe236d31ba62abfd4f22b8d54d2988dc0dd94990611d05908590859061333d565b60405180910390a1505050565b335f9081527fb7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d602052604090205460ff16611d79576040517f49e27cff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff83161580611db0575073ffffffffffffffffffffffffffffffffffffffff8216155b80611dcf575073ffffffffffffffffffffffffffffffffffffffff8116155b15611e06576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007805473ffffffffffffffffffffffffffffffffffffffff8581167fffffffffffffffffffffffff0000000000000000000000000000000000000000928316811790935560088054868316908416811790915560098054928616929093168217909255604080519384526020840192909252908201527f95d3bff4dd1ae411fd49ebc9fcc62f464b6b60cd9b4eacd860da89045c8d4c8290606001611d05565b335f9081527fb7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d602052604090205460ff16611f0e576040517f49e27cff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216611f5b576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8062ffffff166101f414158015611f7957508062ffffff16610bb814155b8015611f8c57508062ffffff1661271014155b15611fc3576040517f3733548a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82165f8181526004602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000001662ffffff861690811790915591519182527f5734dc08ec8c21bd34e0f102d90ea2d1a9dbdcf23e787dc8744d2d0dd227fc739101610deb565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020526040902060010154612081816125b0565b610bcd83836126e2565b335f9081527fb7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d602052604090205460ff166120f2576040517f49e27cff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60068190556040518181527f424b07caa75ce8e1c3985f334273f957db9ce138de114e48e50d8240d4d7300b90602001610f1a565b7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b08612151816125b0565b73ffffffffffffffffffffffffffffffffffffffff831661219e576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600754600a545f9173ffffffffffffffffffffffffffffffffffffffff90811691631698ee82918781169116106121d557856121ef565b600a5473ffffffffffffffffffffffffffffffffffffffff165b600a5473ffffffffffffffffffffffffffffffffffffffff80891691161061222f57600a5473ffffffffffffffffffffffffffffffffffffffff16612231565b865b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff92831660048201529116602482015262ffffff86166044820152606401602060405180830381865afa1580156122aa573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122ce91906131fe565b905073ffffffffffffffffffffffffffffffffffffffff811661231d576040517f76ecffc000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600d8660405161232e9190613107565b908152604051908190036020018120805473ffffffffffffffffffffffffffffffffffffffff939093167fffffffffffffffffffffffff0000000000000000000000000000000000000000909316929092179091557f21e3c1439de176cb39006e603b26a8d890fe2267c804597e40d2954871141d7d906123b490879084908790613374565b60405180910390a15050505050565b5f6123cc612a3b565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f811580156123f85750825b90505f8267ffffffffffffffff1660011480156124145750303b155b905081158015612422575080155b15612459576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016600117855583156124ba5784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b6124c2612a63565b6124ca612a73565b6124d45f336125bd565b50600a805473ffffffffffffffffffffffffffffffffffffffff808c167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255600780548b8416908316179055600880548a8416908316179055600980549289169290911691909117905583156125a55784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050565b6125ba8133612a7b565b50565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020818152604080842073ffffffffffffffffffffffffffffffffffffffff8616855290915282205460ff166126d2575f8481526020828152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905561266e3390565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a46001915050610a37565b5f915050610a37565b5092915050565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020818152604080842073ffffffffffffffffffffffffffffffffffffffff8616855290915282205460ff16156126d2575f8481526020828152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a46001915050610a37565b6127c6612b29565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001681557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610f1a565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff1615610ca0576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0080547ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0161292c576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60029055565b73ffffffffffffffffffffffffffffffffffffffff81165f90815260056020526040812054808203612963575061012c5b835f03612973575f915050610a37565b61271061298082826133b7565b61298a90866131d4565b61299491906133ca565b949350505050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6129ca612855565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011781557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25833612830565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610a37565b612a6b612b84565b610ca0612bc2565b610ca0612b84565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16612b25576040517fe2517d3f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821660048201526024810183905260440160405180910390fd5b5050565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff16610ca0576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612b8c612bca565b610ca0576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61299c612b84565b5f612bd3612a3b565b5468010000000000000000900460ff16919050565b5f60208284031215612bf8575f80fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114612c27575f80fd5b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f830112612c6a575f80fd5b813567ffffffffffffffff811115612c8457612c84612c2e565b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8501160116810181811067ffffffffffffffff82111715612cf057612cf0612c2e565b604052818152838201602001851015612d07575f80fd5b816020850160208301375f918101602001919091529392505050565b5f8060408385031215612d34575f80fd5b823567ffffffffffffffff811115612d4a575f80fd5b612d5685828601612c5b565b95602094909401359450505050565b73ffffffffffffffffffffffffffffffffffffffff811681146125ba575f80fd5b80151581146125ba575f80fd5b5f8060408385031215612da4575f80fd5b8235612daf81612d65565b91506020830135612dbf81612d86565b809150509250929050565b5f60208284031215612dda575f80fd5b5035919050565b5f8060408385031215612df2575f80fd5b823591506020830135612dbf81612d65565b5f8060408385031215612e15575f80fd5b8235612e2081612d65565b946020939093013593505050565b5f60208284031215612e3e575f80fd5b8135612c2781612d65565b5f805f60608486031215612e5b575f80fd5b8335612e6681612d65565b9250602084013591506040840135612e7d81612d65565b809150509250925092565b803562ffffff81168114612e9a575f80fd5b919050565b5f805f805f8060c08789031215612eb4575f80fd5b8635612ebf81612d65565b9550602087013594506040870135612ed681612d65565b9350612ee460608801612e88565b9598949750929560808101359460a0909101359350915050565b5f60208284031215612f0e575f80fd5b813567ffffffffffffffff811115612f24575f80fd5b61299484828501612c5b565b5f805f8060808587031215612f43575f80fd5b8435612f4e81612d65565b93506020850135612f5e81612d65565b9250612f6c60408601612e88565b9396929550929360600135925050565b5f8060408385031215612f8d575f80fd5b823567ffffffffffffffff811115612fa3575f80fd5b612faf85828601612c5b565b9250506020830135612dbf81612d65565b5f805f60608486031215612fd2575f80fd5b8335612fdd81612d65565b92506020840135612fed81612d65565b91506040840135612e7d81612d65565b5f806040838503121561300e575f80fd5b823561301981612d65565b915061302760208401612e88565b90509250929050565b5f805f60608486031215613042575f80fd5b833567ffffffffffffffff811115613058575f80fd5b61306486828701612c5b565b935050602084013561307581612d65565b915061308360408501612e88565b90509250925092565b5f805f806080858703121561309f575f80fd5b84356130aa81612d65565b935060208501356130ba81612d65565b925060408501356130ca81612d65565b915060608501356130da81612d65565b939692955090935050565b5f5b838110156130ff5781810151838201526020016130e7565b50505f910152565b5f82516131188184602087016130e5565b9190910192915050565b5f81518084526131398160208601602086016130e5565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b604081525f61317d6040830185613122565b90508260208301529392505050565b5f6020828403121561319c575f80fd5b8151612c2781612d86565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082028115828204841417610a3757610a376131a7565b80820180821115610a3757610a376131a7565b5f6020828403121561320e575f80fd5b8151612c2781612d65565b5f6101008201905073ffffffffffffffffffffffffffffffffffffffff835116825273ffffffffffffffffffffffffffffffffffffffff602084015116602083015262ffffff60408401511660408301526060830151613291606084018273ffffffffffffffffffffffffffffffffffffffff169052565b506080830151608083015260a083015160a083015260c083015160c083015260e08301516126db60e084018273ffffffffffffffffffffffffffffffffffffffff169052565b5f602082840312156132e7575f80fd5b5051919050565b5f805f8060808587031215613301575f80fd5b8451602086015190945061331481612d65565b604086015190935063ffffffff8116811461332d575f80fd5b6060959095015193969295505050565b604081525f61334f6040830185613122565b905073ffffffffffffffffffffffffffffffffffffffff831660208301529392505050565b606081525f6133866060830186613122565b905073ffffffffffffffffffffffffffffffffffffffff8416602083015262ffffff83166040830152949350505050565b81810381811115610a3757610a376131a7565b5f826133fd577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b50049056fea2646970667358221220be7683826e35c7cef49a08ea8ce84884a78fea00c3f7eced428fd855051f979864736f6c634300081a0033" +const HANDLER_CONTRACT_BYTECODE = "608080604052600436101561001c575b50361561001a575f80fd5b005b5f905f3560e01c908162bc574b146138ee5750806301ffc9a71461384d5780630379eae8146137f05780630ac6eb77146137445780631a4e49d41461371b5780631a873ce4146136e8578063240028e81461369e578063248a9ca31461364c5780632f2ff15d146135ef57806336568abe146135855780633f4ba83a1461347c5780634b1d2eeb1461343c5780634d20d0f8146134095780634eb7d1a1146133c957806355840b7d1461337a57806357724c41146132795780635b549182146132465780635c975abb146132055780636435967b146129d357806364f10e501461294e57806368c70c9e146129035780636d4008a8146128be578063780ad8271461215357806378a88127146120d857806381fbadad146120ba5780638377e2301461208657806383b94a5214611fd05780638456cb5914611ea557806391d1485414611e2e5780639be7fdb214611d43578063a217fddf14611d27578063a5172ddb14611cdc578063a861469f14611c92578063ad14d38514611c48578063af90f35114611b6a578063b5d8349f14611b09578063be0580c014611963578063c6f1b7e714611912578063d17c872c146117c3578063d547741f1461175c578063db9a0daf14611699578063dbc1b46414611638578063dcc16b5c146113d5578063dd19e7551461113d578063e201db9b1461080f578063e798646614610730578063ec87621c146106f5578063f8c8765e146103c3578063fa064472146102d2578063fb46e99d146102b45763fc6b5de80361000f57346102b15760206003193601126102b1576004359067ffffffffffffffff82116102b157602061029e8161028b36600487016139e3565b8160405193828580945193849201613b07565b8101601281520301902054604051908152f35b80fd5b50346102b157806003193601126102b1576020600654604051908152f35b50346102b15760806003193601126102b15760043567ffffffffffffffff81116103bf576103a96103287f5e41bf0052b493123a63e4e0d9095ed4324108e489d58c9a0948b2be366ac8c69236906004016139e3565b602435604435606435908161038a6020604051868851918381818c0194610350818388613b07565b8101600b815203019020558460405183818b5161036e818388613b07565b8101601181520301902055604051809381928a51928391613b07565b8101601281520301902055604051948594608086526080860190613b28565b926020850152604084015260608301520390a180f35b5080fd5b50346102b15760806003193601126102b1576103dd613a29565b6103e5613a4c565b6103ed613a6f565b6064359173ffffffffffffffffffffffffffffffffffffffff83168093036106f1577ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00549360ff8560401c16159467ffffffffffffffff8116801590816106e9575b60011490816106df575b1590816106d6575b506106ae579173ffffffffffffffffffffffffffffffffffffffff80949392838860017fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000859716177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0055610659575b506104d9614253565b6104e1614253565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005561050d614253565b61051633613da7565b50167fffffffffffffffffffffffff0000000000000000000000000000000000000000600a541617600a55167fffffffffffffffffffffffff00000000000000000000000000000000000000006007541617600755167fffffffffffffffffffffffff000000000000000000000000000000000000000060085416176008557fffffffffffffffffffffffff000000000000000000000000000000000000000060095416176009556105c55780f35b7fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054167ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00557fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2602060405160018152a180f35b7fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000001668010000000000000001177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00555f6104d0565b6004877ff92ee8a9000000000000000000000000000000000000000000000000000000008152fd5b9050155f610461565b303b159150610459565b87915061044f565b8480fd5b50346102b157806003193601126102b15760206040517f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b088152f35b50346102b15760406003193601126102b15761074a613a29565b73ffffffffffffffffffffffffffffffffffffffff610767613a92565b91610770613c99565b169081156107e75760207f16ef4de07b0452a43221c91064fb645963a8e2e60bd8a7514da58d56e315c42291838552601082526107db81604087209060ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0083541691151516179055565b6040519015158152a280f35b6004837fd92e233d000000000000000000000000000000000000000000000000000000008152fd5b5060e06003193601126102b157610824613a29565b9061082d613a4c565b91610836613aa1565b9160c4359173ffffffffffffffffffffffffffffffffffffffff83169160a4359190608435606435858703610de35773ffffffffffffffffffffffffffffffffffffffff600e541633036111155761088c6140a8565b6108946140fb565b8492889973ffffffffffffffffffffffffffffffffffffffff86169586156107e75773ffffffffffffffffffffffffffffffffffffffff82169788156110ed5789156110ed5734156110c55784156110c55762ffffff6108f48787613c5d565b9c1615611084575b1561102f575b854211611007576109bd60208d73ffffffffffffffffffffffffffffffffffffffff6007541673ffffffffffffffffffffffffffffffffffffffff600a5416948b861090815f146110005786915b15610ff857905b604051958694859384937f1698ee820000000000000000000000000000000000000000000000000000000085526004850191604091949373ffffffffffffffffffffffffffffffffffffffff62ffffff9281606087019816865216602085015216910152565b03915afa908115610fed579073ffffffffffffffffffffffffffffffffffffffff918591610fbe575b501615610f9657803b15610de35782600491604051928380927fd0e30db000000000000000000000000000000000000000000000000000000000825234905af18015610dd857908391610f81575b50600a546008546040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff918216600482015234602482015292602092849260449284929091165af18015610dd857610f64575b50600a5473ffffffffffffffffffffffffffffffffffffffff169a6040519b610ac78d61391e565b8c528660208d015262ffffff16948560408d01523060608d015260808c01528960a08c01523460c08c01528160e08c01528160085473ffffffffffffffffffffffffffffffffffffffff169b6040519c8d917fdb3e219800000000000000000000000000000000000000000000000000000000835260048301610bb09173ffffffffffffffffffffffffffffffffffffffff60e0809282815116855282602082015116602086015262ffffff60408201511660408601528260608201511660608601526080810151608086015260a081015160a086015260c081015160c0860152015116910152565b815a9361010492602095f19a8b15610f5957829b610f21575b5081602073ffffffffffffffffffffffffffffffffffffffff600a5416604473ffffffffffffffffffffffffffffffffffffffff6008541660405194859384927f095ea7b300000000000000000000000000000000000000000000000000000000845260048401528160248401525af18015610dd857610f04575b506040517f42966c68000000000000000000000000000000000000000000000000000000008152836004820152602081602481868b5af18015610dd857610ed7575b508184610e14575b505089340397348911610de7578a3403610d12575b5050977f8c8071a0a45857f27eaa04a47ecdc04f0549d2150a7a1cb5eaa7111b6cf85f8d9260809260409a8b5193845260208401528a8301526060820152a460017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b73ffffffffffffffffffffffffffffffffffffffff600a5416803b15610de35782809160248c60405194859384927f2e1a7d4d00000000000000000000000000000000000000000000000000000000845260048401525af18015610dd8579183918b93610dbe575b5081809381925af1610d8a613c6a565b5015610d965780610ca3565b807f90b8ec180000000000000000000000000000000000000000000000000000000060049252fd5b610dcb9193508290613968565b6103bf578189915f610d7a565b6040513d85823e3d90fd5b8280fd5b6024827f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000602080830191825273ffffffffffffffffffffffffffffffffffffffff9490941660248301526044808301889052825290610e74606482613968565b519082895af115610ecb5780513d610ec25750843b155b610e96575f81610c8e565b80857f5274afe70000000000000000000000000000000000000000000000000000000060249352600452fd5b60011415610e8b565b604051903d90823e3d90fd5b610ef89060203d602011610efd575b610ef08183613968565b810190613b6b565b610c86565b503d610ee6565b610f1c9060203d602011610efd57610ef08183613968565b610c44565b909a506020813d602011610f51575b81610f3d60209383613968565b81010312610f4d5751995f610bc9565b5f80fd5b3d9150610f30565b6040513d84823e3d90fd5b610f7c9060203d602011610efd57610ef08183613968565b610a9f565b81610f8b91613968565b6103bf57815f610a34565b6004837f76ecffc0000000000000000000000000000000000000000000000000000000008152fd5b610fe0915060203d602011610fe6575b610fd88183613968565b810190613c31565b5f6109e6565b503d610fce565b6040513d86823e3d90fd5b508590610957565b8091610950565b6004837f1ab7da6b000000000000000000000000000000000000000000000000000000008152fd5b9450600654603c810290808204603c1490151715611057576110519042613c5d565b94610902565b6024837f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b8784526004602052604084205462ffffff169c508c6108fc576004847f3733548a000000000000000000000000000000000000000000000000000000008152fd5b6004847f1f2a2005000000000000000000000000000000000000000000000000000000008152fd5b6004847fd92e233d000000000000000000000000000000000000000000000000000000008152fd5b6004837fbce361b0000000000000000000000000000000000000000000000000000000008152fd5b50346102b15760406003193601126102b157611157613a29565b6024359081156113cb575b73ffffffffffffffffffffffffffffffffffffffff166040517fa0c50b690000000000000000000000000000000000000000000000000000000081528381600481855afa908115610fed57849161134e575b506040519173ffffffffffffffffffffffffffffffffffffffff825193602081818601966111e381838a613b07565b8101600c815203019020541692831561132657602061120d91604051809381928751928391613b07565b8101600b815203019020549081156112fe5784820294828604036112d1579460206004949596604051958680927ff97c007a0000000000000000000000000000000000000000000000000000000082525afa908115610ecb579061129d575b6112999350604051958695865260208601526040850152606084015260a0608084015260a0830190613b28565b0390f35b506020833d6020116112c9575b816112b760209383613968565b81010312610f4d57611299925161126c565b3d91506112aa565b6024867f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b6004867fe661aed0000000000000000000000000000000000000000000000000000000008152fd5b6004867fd92e233d000000000000000000000000000000000000000000000000000000008152fd5b90503d8085833e61135f8183613968565b8101906020818303126106f15780519067ffffffffffffffff82116113c7570181601f820112156106f1578051611395816139a9565b926113a36040519485613968565b818452602082840101116113c7576113c19160208085019101613b07565b5f6111b4565b8580fd5b600f549150611162565b50346102b15760606003193601126102b15760043567ffffffffffffffff81116103bf576114079036906004016139e3565b61140f613a4c565b611417613aa1565b90611420613c99565b73ffffffffffffffffffffffffffffffffffffffff8116801561161057826114f29260209273ffffffffffffffffffffffffffffffffffffffff600754169173ffffffffffffffffffffffffffffffffffffffff600a541691821091825f146116095780925b1561160157506040517f1698ee8200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff92831660048201529116602482015262ffffff90921660448301529092839190829081906064820190565b03915afa8015610fed5773ffffffffffffffffffffffffffffffffffffffff9185916115e2575b50169081156115ba57916115a89162ffffff7f21e3c1439de176cb39006e603b26a8d890fe2267c804597e40d2954871141d7d9460405160208186516115628183858b01613b07565b8101600d815203019020837fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055604051948594606086526060860190613b28565b9260208501521660408301520390a180f35b6004847f76ecffc0000000000000000000000000000000000000000000000000000000008152fd5b6115fb915060203d602011610fe657610fd88183613968565b5f611519565b905090610957565b8192611486565b6004857fd92e233d000000000000000000000000000000000000000000000000000000008152fd5b50346102b15760206003193601126102b1576004359067ffffffffffffffff82116102b157602073ffffffffffffffffffffffffffffffffffffffff6116858261028b36600488016139e3565b8101600c8152030190205416604051908152f35b50346102b15760206003193601126102b1576004358180527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020526040822073ffffffffffffffffffffffffffffffffffffffff33165f5260205260ff60405f20541615611734576020817f424b07caa75ce8e1c3985f334273f957db9ce138de114e48e50d8240d4d7300b92600655604051908152a180f35b6004827f49e27cff000000000000000000000000000000000000000000000000000000008152fd5b50346102b15760406003193601126102b1576117bf60043561177c613a4c565b906117ba6117b5825f527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052600160405f20015490565b613d21565b613fa0565b5080f35b50346102b15760406003193601126102b1576117dd613a29565b6024359062ffffff8216809203610de3578280527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020526040832073ffffffffffffffffffffffffffffffffffffffff33165f5260205260ff60405f205416156118ea5773ffffffffffffffffffffffffffffffffffffffff1680156107e7576101f4821415806118de575b806118d2575b6118aa578252600460205260408220907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000082541617905580f35b6004837f3733548a000000000000000000000000000000000000000000000000000000008152fd5b50612710821415611870565b50610bb882141561186a565b6004837f49e27cff000000000000000000000000000000000000000000000000000000008152fd5b50346102b157806003193601126102b157602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b50346102b15760606003193601126102b15761197d613a29565b611985613a4c565b61198d613a6f565b918380527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020526040842073ffffffffffffffffffffffffffffffffffffffff33165f5260205260ff60405f20541615611ae15773ffffffffffffffffffffffffffffffffffffffff1680158015611ac3575b8015611aa5575b6110ed5773ffffffffffffffffffffffffffffffffffffffff929183917fffffffffffffffffffffffff00000000000000000000000000000000000000006007541617600755167fffffffffffffffffffffffff00000000000000000000000000000000000000006008541617600855167fffffffffffffffffffffffff0000000000000000000000000000000000000000600954161760095580f35b5073ffffffffffffffffffffffffffffffffffffffff831615611a08565b5073ffffffffffffffffffffffffffffffffffffffff821615611a01565b6004847f49e27cff000000000000000000000000000000000000000000000000000000008152fd5b50346102b15760206003193601126102b1576004359067ffffffffffffffff82116102b157602073ffffffffffffffffffffffffffffffffffffffff611b568261028b36600488016139e3565b8101600d8152030190205416604051908152f35b50346102b15760206003193601126102b157611b84613a29565b8180527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020526040822073ffffffffffffffffffffffffffffffffffffffff33165f5260205260ff60405f205416156117345773ffffffffffffffffffffffffffffffffffffffff168015611c20577fffffffffffffffffffffffff0000000000000000000000000000000000000000600e541617600e5580f35b6004827fd92e233d000000000000000000000000000000000000000000000000000000008152fd5b50346102b15760206003193601126102b15760ff604060209273ffffffffffffffffffffffffffffffffffffffff611c7e613a29565b168152600384522054166040519015158152f35b50346102b15760206003193601126102b15762ffffff604060209273ffffffffffffffffffffffffffffffffffffffff611cca613a29565b16815260048452205416604051908152f35b50346102b15760206003193601126102b1576004359067ffffffffffffffff82116102b1576020611d148161028b36600487016139e3565b8101600b81520301902054604051908152f35b50346102b157806003193601126102b157602090604051908152f35b50346102b15760406003193601126102b15760043567ffffffffffffffff81116103bf57611d759036906004016139e3565b73ffffffffffffffffffffffffffffffffffffffff611d92613a4c565b611d9a613c99565b1680156107e7577f0c7d242571a289736ea536c54ebe236d31ba62abfd4f22b8d54d2988dc0dd94991611e22916040516020818451611ddc8183858901613b07565b8101600c815203019020817fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055604051928392604084526040840190613b28565b9060208301520390a180f35b50346102b15760406003193601126102b15773ffffffffffffffffffffffffffffffffffffffff6040611e5f613a4c565b9260043581527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020522091165f52602052602060ff60405f2054166040519015158152f35b50346102b157806003193601126102b1578080527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020526040812073ffffffffffffffffffffffffffffffffffffffff33165f5260205260ff60405f20541615611fa857611f126140a8565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005416177fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586020604051338152a180f35b807f49e27cff0000000000000000000000000000000000000000000000000000000060049252fd5b50346102b15760206003193601126102b157611fea613a29565b8180527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020526040822073ffffffffffffffffffffffffffffffffffffffff33165f5260205260ff60405f205416156117345773ffffffffffffffffffffffffffffffffffffffff168015611c20577fffffffffffffffffffffffff0000000000000000000000000000000000000000600a541617600a5580f35b50346102b157806003193601126102b157602073ffffffffffffffffffffffffffffffffffffffff600e5416604051908152f35b50346102b157806003193601126102b1576020600f54604051908152f35b50346102b1576120e736613ab3565b9083809394527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020526040832073ffffffffffffffffffffffffffffffffffffffff33165f5260205260ff60405f205416156118ea57612150929361214b6140a8565b613b83565b80f35b50346102b15760c06003193601126102b15761216d613a29565b60243590612179613a6f565b906064359262ffffff8416908185036113c75760843560a4359373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163303612896576121d86140a8565b6121e06140fb565b6121eb868483614172565b8473ffffffffffffffffffffffffffffffffffffffff821697888a52600360205260ff60408b2054161561286e57941561282d575b156127d8575b8442116127b0576020846122e3928a73ffffffffffffffffffffffffffffffffffffffff600754169173ffffffffffffffffffffffffffffffffffffffff600a541690818d10805f146127a95781935b501561160157506040517f1698ee8200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff92831660048201529116602482015262ffffff90921660448301529092839190829081906064820190565b03915afa80156127125773ffffffffffffffffffffffffffffffffffffffff91899161278a575b50161561276257801561273a576040517f47e7ef24000000000000000000000000000000000000000000000000000000008152306004820152602481018390526020816044818b8b5af180156127125761271d575b506008546040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602481018390526020816044818b8b5af18015612712576126f5575b5062ffffff73ffffffffffffffffffffffffffffffffffffffff600a541693604051946123ee8661391e565b8886526020808701918252929091166040808701828152306060890190815260808901998a5260a0890188815260c08a0188815260e08b018f815260085495517f414bf3890000000000000000000000000000000000000000000000000000000081529b5173ffffffffffffffffffffffffffffffffffffffff90811660048e01529751881660248d0152935162ffffff1660448c01529151861660648b0152995160848a0152985160a4890152975160c48801529651821660e48701529585916101049183918c91165af192831561268e5787936126c1575b5082106126995773ffffffffffffffffffffffffffffffffffffffff60085416604051907f095ea7b300000000000000000000000000000000000000000000000000000000825260048201528660248201526020816044818a8a5af1801561268e57612671575b508573ffffffffffffffffffffffffffffffffffffffff600a5416803b156103bf578180916024604051809481937f2e1a7d4d0000000000000000000000000000000000000000000000000000000083528960048401525af18015610f595761265c575b5080808085885af16125a3613c6a565b501561263457927ff5d6ca9b390b5271e0cbb3d43b4d708d5b17804cb81a4c65e027226d87ccf0e2949273ffffffffffffffffffffffffffffffffffffffff9260c09584600a54169060405196875260208701526040860152606085015260808401521660a0820152a160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005580f35b6004867f90b8ec18000000000000000000000000000000000000000000000000000000008152fd5b8161266691613968565b6113c757855f612593565b6126899060203d602011610efd57610ef08183613968565b61252f565b6040513d89823e3d90fd5b6004867f8199f5f3000000000000000000000000000000000000000000000000000000008152fd5b9092506020813d6020116126ed575b816126dd60209383613968565b81010312610f4d5751915f6124c8565b3d91506126d0565b61270d9060203d602011610efd57610ef08183613968565b6123c2565b6040513d8a823e3d90fd5b6127359060203d602011610efd57610ef08183613968565b61235f565b6004877f1f2a2005000000000000000000000000000000000000000000000000000000008152fd5b6004877f76ecffc0000000000000000000000000000000000000000000000000000000008152fd5b6127a3915060203d602011610fe657610fd88183613968565b5f61230a565b8293612276565b6004887f1ab7da6b000000000000000000000000000000000000000000000000000000008152fd5b9350600654603c810290808204603c1490151715612800576127fa9042613c5d565b93612226565b6024887f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b8789526004602052604089205462ffffff16945084612220576004897f3733548a000000000000000000000000000000000000000000000000000000008152fd5b60048a7f4e38f95a000000000000000000000000000000000000000000000000000000008152fd5b6004887f53e51723000000000000000000000000000000000000000000000000000000008152fd5b50346102b15760206003193601126102b157604060209173ffffffffffffffffffffffffffffffffffffffff6128f2613a29565b168152600583522054604051908152f35b50346102b15760206003193601126102b1576004359067ffffffffffffffff82116102b157602061293b8161028b36600487016139e3565b8101601181520301902054604051908152f35b50346102b15761295d36613ab3565b9073ffffffffffffffffffffffffffffffffffffffff9392937f00000000000000000000000000000000000000000000000000000000000000001633036129ab57612150929361214b6140a8565b6004837f53e51723000000000000000000000000000000000000000000000000000000008152fd5b5034610f4d5760c0600319360112610f4d576129ed613a29565b6024356129f8613a6f565b6064358015918215809203610f4d5760843562ffffff811690818103610f4d5760a43573ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036131dd57612a606140a8565b612a686140fb565b612a7384888a614172565b5f9515612b925750506040517f47e7ef2400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8316600482015260248101869052919050602082806044810103818a73ffffffffffffffffffffffffffffffffffffffff8b165af190811561268e577ffa6ff091ec99bdfd127d51e7786764f2ff7e39f866bbb2a2996e1597052641e49460609473ffffffffffffffffffffffffffffffffffffffff948594612b73575b505b6040519788526020880152604087015216941692a360017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005580f35b612b8b9060203d602011610efd57610ef08183613968565b505f612b35565b809192939550156131b55773ffffffffffffffffffffffffffffffffffffffff871691825f52600360205260ff60405f2054161561318d57921561314b575b600654603c810290808204603c149015171561311e57612bf19042613c5d565b8042116130f657612ca960208573ffffffffffffffffffffffffffffffffffffffff6007541673ffffffffffffffffffffffffffffffffffffffff600a541680881090815f146130ef578d915b156130e7576040517f1698ee8200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff92831660048201529116602482015262ffffff90921660448301529092839190829081906064820190565b03915afa8015612fe25773ffffffffffffffffffffffffffffffffffffffff915f916130c8575b5016156130a0576040517f47e7ef24000000000000000000000000000000000000000000000000000000008152306004820152602481018890526020816044815f885af18015612fe257613083575b506008546040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602481018890526020816044815f885af18015612fe257613066575b5062ffffff73ffffffffffffffffffffffffffffffffffffffff600a54169460405195612dae8761391e565b858752602087015216604085015230606085015260808401528560a08401528060c08401525f60e08401526020612e9861010473ffffffffffffffffffffffffffffffffffffffff60085416955f60405197889485937f414bf389000000000000000000000000000000000000000000000000000000008552600485019073ffffffffffffffffffffffffffffffffffffffff60e0809282815116855282602082015116602086015262ffffff60408201511660408601528260608201511660608601526080810151608086015260a081015160a086015260c081015160c0860152015116910152565b5af1928315612fe2575f93613032575b50821061300a5760205f91604473ffffffffffffffffffffffffffffffffffffffff6008541660405194859384927f095ea7b300000000000000000000000000000000000000000000000000000000845260048401528160248401525af18015612fe257612fed575b5073ffffffffffffffffffffffffffffffffffffffff600a5416803b15610f4d575f80916024604051809481937f2e1a7d4d0000000000000000000000000000000000000000000000000000000083528760048401525af18015612fe257612fcd575b508580808084875af1612f85613c6a565b50156126345773ffffffffffffffffffffffffffffffffffffffff7ffa6ff091ec99bdfd127d51e7786764f2ff7e39f866bbb2a2996e1597052641e493606093829390612b37565b612fda9196505f90613968565b5f945f612f74565b6040513d5f823e3d90fd5b6130059060203d602011610efd57610ef08183613968565b612f11565b7f8199f5f3000000000000000000000000000000000000000000000000000000005f5260045ffd5b9092506020813d60201161305e575b8161304e60209383613968565b81010312610f4d5751915f612ea8565b3d9150613041565b61307e9060203d602011610efd57610ef08183613968565b612d82565b61309b9060203d602011610efd57610ef08183613968565b612d1f565b7f76ecffc0000000000000000000000000000000000000000000000000000000005f5260045ffd5b6130e1915060203d602011610fe657610fd88183613968565b5f612cd0565b508c90610957565b8091612c3e565b7f1ab7da6b000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b9150805f52600460205262ffffff60405f2054169182612bd1577f3733548a000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f4e38f95a000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f22c50cbf000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f53e51723000000000000000000000000000000000000000000000000000000005f5260045ffd5b34610f4d575f600319360112610f4d57602060ff7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330054166040519015158152f35b34610f4d575f600319360112610f4d57602073ffffffffffffffffffffffffffffffffffffffff60075416604051908152f35b34610f4d576040600319360112610f4d57613292613a29565b335f9081527fb7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d6020526040902054602435919060ff16156133525773ffffffffffffffffffffffffffffffffffffffff16801561332a576113888211613302575f52600560205260405f20555f80f35b7fc31c0b6e000000000000000000000000000000000000000000000000000000005f5260045ffd5b7fd92e233d000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f49e27cff000000000000000000000000000000000000000000000000000000005f5260045ffd5b34610f4d576020600319360112610f4d57335f9081527fb7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d602052604090205460ff161561335257600435600f55005b34610f4d576020600319360112610f4d576004355f526002602052602073ffffffffffffffffffffffffffffffffffffffff60405f205416604051908152f35b34610f4d575f600319360112610f4d57602073ffffffffffffffffffffffffffffffffffffffff60095416604051908152f35b34610f4d576020600319360112610f4d576004355f526001602052602073ffffffffffffffffffffffffffffffffffffffff60405f205416604051908152f35b34610f4d575f600319360112610f4d57335f9081527fb7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d602052604090205460ff1615613352577fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff81161561355d577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00167fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6020604051338152a1005b7f8dfc202b000000000000000000000000000000000000000000000000000000005f5260045ffd5b34610f4d576040600319360112610f4d5761359e613a4c565b3373ffffffffffffffffffffffffffffffffffffffff8216036135c75761001a90600435613fa0565b7f6697b232000000000000000000000000000000000000000000000000000000005f5260045ffd5b34610f4d576040600319360112610f4d5761001a60043561360e613a4c565b906136476117b5825f527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052600160405f20015490565b613e8e565b34610f4d576020600319360112610f4d5760206136966004355f527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052600160405f20015490565b604051908152f35b34610f4d576020600319360112610f4d5773ffffffffffffffffffffffffffffffffffffffff6136cc613a29565b165f526010602052602060ff60405f2054166040519015158152f35b34610f4d575f600319360112610f4d57602073ffffffffffffffffffffffffffffffffffffffff600a5416604051908152f35b34610f4d576020600319360112610f4d576004355f525f602052602060405f2054604051908152f35b34610f4d576040600319360112610f4d5761375d613a29565b613765613a92565b335f9081527fb7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d602052604090205460ff16156133525773ffffffffffffffffffffffffffffffffffffffff61001a92165f52600360205260405f209060ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0083541691151516179055565b34610f4d576040600319360112610f4d5760043567ffffffffffffffff8111610f4d576138219036906004016139e3565b60206138366040519283815193849201613b07565b810190600b82526020816024359303019020555f80f35b34610f4d576020600319360112610f4d576004357fffffffff000000000000000000000000000000000000000000000000000000008116809103610f4d57807f7965db0b00000000000000000000000000000000000000000000000000000000602092149081156138c4575b506040519015158152f35b7f01ffc9a700000000000000000000000000000000000000000000000000000000915014826138b9565b34610f4d575f600319360112610f4d5760209073ffffffffffffffffffffffffffffffffffffffff600854168152f35b610100810190811067ffffffffffffffff82111761393b57604052565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761393b57604052565b67ffffffffffffffff811161393b57601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b81601f82011215610f4d578035906139fa826139a9565b92613a086040519485613968565b82845260208383010111610f4d57815f926020809301838601378301015290565b6004359073ffffffffffffffffffffffffffffffffffffffff82168203610f4d57565b6024359073ffffffffffffffffffffffffffffffffffffffff82168203610f4d57565b6044359073ffffffffffffffffffffffffffffffffffffffff82168203610f4d57565b602435908115158203610f4d57565b6044359062ffffff82168203610f4d57565b6003196060910112610f4d5760043573ffffffffffffffffffffffffffffffffffffffff81168103610f4d57906024359060443573ffffffffffffffffffffffffffffffffffffffff81168103610f4d5790565b5f5b838110613b185750505f910152565b8181015183820152602001613b09565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f602093613b6481518092818752878088019101613b07565b0116010190565b90816020910312610f4d57518015158103610f4d5790565b90602091613c0493613b96818484614172565b5f73ffffffffffffffffffffffffffffffffffffffff6040518097819682957f47e7ef24000000000000000000000000000000000000000000000000000000008452600484016020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b0393165af18015612fe257613c165750565b613c2e9060203d602011610efd57610ef08183613968565b50565b90816020910312610f4d575173ffffffffffffffffffffffffffffffffffffffff81168103610f4d5790565b9190820180921161311e57565b3d15613c94573d90613c7b826139a9565b91613c896040519384613968565b82523d5f602084013e565b606090565b335f9081527f06484cc59dc38e4f67c31122333a17ca81b3ca18cdf02bfc298072fa52b0316a602052604090205460ff1615613cd157565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f52336004527f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b0860245260445ffd5b805f527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260405f2073ffffffffffffffffffffffffffffffffffffffff33165f5260205260ff60405f20541615613d785750565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f523360045260245260445ffd5b73ffffffffffffffffffffffffffffffffffffffff81165f9081527fb7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d602052604090205460ff16613e895773ffffffffffffffffffffffffffffffffffffffff165f8181527fb7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d6020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790553391907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d8180a4600190565b505f90565b805f527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260ff60405f205416155f14613f9a57805f527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260405f2060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905573ffffffffffffffffffffffffffffffffffffffff339216907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d5f80a4600190565b50505f90565b805f527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260ff60405f2054165f14613f9a57805f527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260405f207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905573ffffffffffffffffffffffffffffffffffffffff339216907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b5f80a4600190565b60ff7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330054166140d357565b7fd93c0665000000000000000000000000000000000000000000000000000000005f5260045ffd5b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00541461414a5760027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7f3ee5aeb5000000000000000000000000000000000000000000000000000000005f5260045ffd5b90919073ffffffffffffffffffffffffffffffffffffffff161561332a5773ffffffffffffffffffffffffffffffffffffffff16801561332a5773ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168114908115614249575b5061422157156141f957565b7f1f2a2005000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f82d5d76a000000000000000000000000000000000000000000000000000000005f5260045ffd5b905030145f6141ed565b60ff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005460401c161561428257565b7fd7e6bcf8000000000000000000000000000000000000000000000000000000005f5260045ffdfea26469706673582212203646e3ee15c982505d4331c1a1af22a6dce9040f03c82da9a65983e246eeb0a764736f6c634300081a0033" const PRC20_CREATION_BYTECODE = "608060405234801561000f575f80fd5b50600436106101a5575f3560e01c806374be2150116100e8578063c701262611610093578063eddeb1231161006e578063eddeb12314610457578063f687d12a1461046a578063f97c007a1461047d578063fc5fecd514610486575f80fd5b8063c7012626146103cb578063d9eeebed146103de578063dd62ed3e14610412575f80fd5b8063b84c8246116100c3578063b84c82461461037e578063c47f002714610391578063c6f1b7e7146103a4575f80fd5b806374be21501461033c57806395d89b4114610363578063a9059cbb1461036b575f80fd5b806323b872dd1161015357806347e7ef241161012e57806347e7ef24146102a1578063609c92b8146102b4578063701cd43b146102e857806370a0823114610307575f80fd5b806323b872dd14610266578063313ce5671461027957806342966c681461028e575f80fd5b8063091d278811610183578063091d278814610224578063095ea7b31461023b57806318160ddd1461025e575f80fd5b8063044d9371146101a957806306fdde03146101fa57806307e2bd8d1461020f575b5f80fd5b6101d07f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b610202610499565b6040516101f1919061143c565b61022261021d366004611479565b610529565b005b61022d60015481565b6040519081526020016101f1565b61024e610249366004611494565b6105ef565b60405190151581526020016101f1565b60065461022d565b61024e6102743660046114be565b6106ae565b60055460405160ff90911681526020016101f1565b61024e61029c3660046114fc565b61079b565b61024e6102af366004611494565b6107ae565b6102db7f000000000000000000000000000000000000000000000000000000000000000081565b6040516101f19190611513565b5f546101d09073ffffffffffffffffffffffffffffffffffffffff1681565b61022d610315366004611479565b73ffffffffffffffffffffffffffffffffffffffff165f9081526007602052604090205490565b61022d7f000000000000000000000000000000000000000000000000000000000000000081565b610202610879565b61024e610379366004611494565b610888565b61022261038c36600461157f565b61089d565b61022261039f36600461157f565b61091c565b6101d07f000000000000000000000000000000000000000000000000000000000000000081565b61024e6103d936600461166f565b610997565b6103e6610af9565b6040805173ffffffffffffffffffffffffffffffffffffffff90931683526020830191909152016101f1565b61022d6104203660046116e1565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260086020908152604080832093909416825291909152205490565b6102226104653660046114fc565b610d04565b6102226104783660046114fc565b610da8565b61022d60025481565b6103e66104943660046114fc565b610e4c565b6060600380546104a890611718565b80601f01602080910402602001604051908101604052809291908181526020018280546104d490611718565b801561051f5780601f106104f65761010080835404028352916020019161051f565b820191905f5260205f20905b81548152906001019060200180831161050257829003601f168201915b5050505050905090565b73ffffffffffffffffffffffffffffffffffffffff8116610576576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f412d5a95dc32cbb6bd9319bccf1bc1febeda71e734893a440f1f6853252fe99f906020015b60405180910390a150565b5f73ffffffffffffffffffffffffffffffffffffffff831661063d576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b335f81815260086020908152604080832073ffffffffffffffffffffffffffffffffffffffff881680855290835292819020869055518581529192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a35060015b92915050565b5f6106ba848484611055565b73ffffffffffffffffffffffffffffffffffffffff84165f90815260086020908152604080832033845290915290205482811015610724576040517f10bad14700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff85165f81815260086020908152604080832033808552908352928190208786039081905590519081529192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3506001949350505050565b5f6107a6338361119c565b506001919050565b5f6107b983836112ed565b6040517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000060601b1660208201527f67fc7bdaed5b0ec550d8706b87d60568ab70c6b781263c70101d54cd1564aab390603401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290526108689186908690611769565b60405180910390a150600192915050565b6060600480546104a890611718565b5f610894338484611055565b50600192915050565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461090c576040517f6626eaef00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600461091882826117ef565b5050565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461098b576040517f6626eaef00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600361091882826117ef565b5f805f6109a2610af9565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166024830152604482018390529294509092505f918416906323b872dd906064016020604051808303815f875af1158015610a42573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a669190611906565b905080610a9f576040517f0a7cd6d600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610aa9338661119c565b7f9ffbffc04a397460ee1dbe8c9503e098090567d6b7f4b3c02a8617d800b6d9553388888886600254604051610ae496959493929190611925565b60405180910390a15060019695505050505050565b5f80546040517f7471e6970000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000006004820152829173ffffffffffffffffffffffffffffffffffffffff1690637471e69790602401602060405180830381865afa158015610b85573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ba991906119a5565b915073ffffffffffffffffffffffffffffffffffffffff8216610bf8576040517f3d5729c100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80546040517fd7fd7afb0000000000000000000000000000000000000000000000000000000081527f0000000000000000000000000000000000000000000000000000000000000000600482015273ffffffffffffffffffffffffffffffffffffffff9091169063d7fd7afb90602401602060405180830381865afa158015610c84573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ca891906119c0565b9050805f03610ce3576040517fe661aed000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600254600154610cf39083611a04565b610cfd9190611a1b565b9150509091565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610d73576040517f6626eaef00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60028190556040518181527fef13af88e424b5d15f49c77758542c1938b08b8b95b91ed0751f98ba99000d8f906020016105e4565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610e17576040517f6626eaef00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018190556040518181527fff5788270f43bfc1ca41c503606d2594aa3023a1a7547de403a3e2f146a4a80a906020016105e4565b5f80546040517f7471e6970000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000006004820152829173ffffffffffffffffffffffffffffffffffffffff1690637471e69790602401602060405180830381865afa158015610ed8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610efc91906119a5565b915073ffffffffffffffffffffffffffffffffffffffff8216610f4b576040517f3d5729c100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80546040517fd7fd7afb0000000000000000000000000000000000000000000000000000000081527f0000000000000000000000000000000000000000000000000000000000000000600482015273ffffffffffffffffffffffffffffffffffffffff9091169063d7fd7afb90602401602060405180830381865afa158015610fd7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ffb91906119c0565b9050805f03611036576040517fe661aed000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002546110438583611a04565b61104d9190611a1b565b915050915091565b73ffffffffffffffffffffffffffffffffffffffff8316158061108c575073ffffffffffffffffffffffffffffffffffffffff8216155b156110c3576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff83165f9081526007602052604090205481811015611122576040517ffe382aa700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8085165f8181526007602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061118e9086815260200190565b60405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff82166111e9576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f03611222576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82165f9081526007602052604090205481811015611281576040517ffe382aa700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff83165f8181526007602090815260408083208686039055600680548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff821661133a576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f03611373576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600680548201905573ffffffffffffffffffffffffffffffffffffffff82165f818152600760209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b5f81518084525f5b818110156113ff576020818501810151868301820152016113e3565b505f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f61144e60208301846113db565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff81168114611476575f80fd5b50565b5f60208284031215611489575f80fd5b813561144e81611455565b5f80604083850312156114a5575f80fd5b82356114b081611455565b946020939093013593505050565b5f805f606084860312156114d0575f80fd5b83356114db81611455565b925060208401356114eb81611455565b929592945050506040919091013590565b5f6020828403121561150c575f80fd5b5035919050565b602081016003831061154c577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b91905290565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f6020828403121561158f575f80fd5b813567ffffffffffffffff8111156115a5575f80fd5b8201601f810184136115b5575f80fd5b803567ffffffffffffffff8111156115cf576115cf611552565b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8501160116810181811067ffffffffffffffff8211171561163b5761163b611552565b604052818152828201602001861015611652575f80fd5b816020840160208301375f91810160200191909152949350505050565b5f805f60408486031215611681575f80fd5b833567ffffffffffffffff811115611697575f80fd5b8401601f810186136116a7575f80fd5b803567ffffffffffffffff8111156116bd575f80fd5b8660208284010111156116ce575f80fd5b6020918201979096509401359392505050565b5f80604083850312156116f2575f80fd5b82356116fd81611455565b9150602083013561170d81611455565b809150509250929050565b600181811c9082168061172c57607f821691505b602082108103611763577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b606081525f61177b60608301866113db565b73ffffffffffffffffffffffffffffffffffffffff9490941660208301525060400152919050565b601f8211156117ea57805f5260205f20601f840160051c810160208510156117c85750805b601f840160051c820191505b818110156117e7575f81556001016117d4565b50505b505050565b815167ffffffffffffffff81111561180957611809611552565b61181d816118178454611718565b846117a3565b6020601f82116001811461186e575f83156118385750848201515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600385901b1c1916600184901b1784556117e7565b5f848152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08516915b828110156118bb578785015182556020948501946001909201910161189b565b50848210156118f757868401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b60f8161c191681555b50505050600190811b01905550565b5f60208284031215611916575f80fd5b8151801515811461144e575f80fd5b73ffffffffffffffffffffffffffffffffffffffff8716815260a060208201528460a0820152848660c08301375f60c086830101525f60c07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8801168301019050846040830152836060830152826080830152979650505050505050565b5f602082840312156119b5575f80fd5b815161144e81611455565b5f602082840312156119d0575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b80820281158282048414176106a8576106a86119d7565b808201808211156106a8576106a86119d756fea26469706673582212206be692aa215f21df823c52c689a11caa03254730bfade7b8b36788d6a72ba61764736f6c634300081a0033" diff --git a/test/utils/helpers.go b/test/utils/helpers.go index 5a485e3c..037d376e 100644 --- a/test/utils/helpers.go +++ b/test/utils/helpers.go @@ -106,3 +106,35 @@ func ExecVoteGasPrice( _, err := app.AuthzKeeper.Exec(ctx, &execMsg) return err } + +// ExecVoteChainMeta executes a MsgVoteChainMeta on behalf of the core validator +// through the universal validator using authz Exec. +func ExecVoteChainMeta( + t *testing.T, + ctx sdk.Context, + app *app.ChainApp, + universalAddr string, + coreValAddr string, + chainID string, + price uint64, + blockNumber uint64, + observedAt uint64, +) error { + t.Helper() + + msg := &uexecutortypes.MsgVoteChainMeta{ + Signer: coreValAddr, + ObservedChainId: chainID, + Price: price, + ChainHeight: blockNumber, + ObservedAt: observedAt, + } + + execMsg := authz.NewMsgExec( + sdk.MustAccAddressFromBech32(universalAddr), + []sdk.Msg{msg}, + ) + + _, err := app.AuthzKeeper.Exec(ctx, &execMsg) + return err +} From 28eaa4658c0c8d4c3465ac6201286a990b68dd16 Mon Sep 17 00:00:00 2001 From: Nilesh Gupta Date: Thu, 12 Mar 2026 16:12:06 +0530 Subject: [PATCH 14/36] feat: added chain meta queries in query server --- proto/uexecutor/v1/query.proto | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/proto/uexecutor/v1/query.proto b/proto/uexecutor/v1/query.proto index b231151e..b8e9eb25 100755 --- a/proto/uexecutor/v1/query.proto +++ b/proto/uexecutor/v1/query.proto @@ -4,6 +4,7 @@ package uexecutor.v1; import "google/api/annotations.proto"; import "uexecutor/v1/types.proto"; import "uexecutor/v1/gas_price.proto"; +import "uexecutor/v1/chain_meta.proto"; import "cosmos/base/query/v1beta1/pagination.proto"; option go_package = "github.com/pushchain/push-chain-node/x/uexecutor/types"; @@ -39,6 +40,16 @@ service Query { rpc AllGasPrices(QueryAllGasPricesRequest) returns (QueryAllGasPricesResponse) { option (google.api.http).get = "/uexecutor/v1/gas_prices"; } + + // 🔹 Queries chain meta for a specific chain + rpc ChainMeta(QueryChainMetaRequest) returns (QueryChainMetaResponse) { + option (google.api.http).get = "/uexecutor/v1/chain_meta/{chain_id}"; + } + + // 🔹 Queries all chain metas across chains + rpc AllChainMetas(QueryAllChainMetasRequest) returns (QueryAllChainMetasResponse) { + option (google.api.http).get = "/uexecutor/v1/chain_metas"; + } } // ========================== @@ -64,6 +75,25 @@ message QueryAllGasPricesResponse { cosmos.base.query.v1beta1.PageResponse pagination = 2; } +// Single chain meta +message QueryChainMetaRequest { + string chain_id = 1; +} + +message QueryChainMetaResponse { + ChainMeta chain_meta = 1; +} + +// All chain metas +message QueryAllChainMetasRequest { + cosmos.base.query.v1beta1.PageRequest pagination = 1; +} + +message QueryAllChainMetasResponse { + repeated ChainMeta chain_metas = 1; + cosmos.base.query.v1beta1.PageResponse pagination = 2; +} + // Existing types message QueryParamsRequest {} From 4ee9724900e0e4fedf400ede1a732abc0ad22ca3 Mon Sep 17 00:00:00 2001 From: Nilesh Gupta Date: Thu, 12 Mar 2026 16:12:14 +0530 Subject: [PATCH 15/36] refactor: added generated protobuf --- api/uexecutor/v1/query.pulsar.go | 2532 ++++++++++++++++++++++++++--- api/uexecutor/v1/query_grpc.pb.go | 78 + 2 files changed, 2403 insertions(+), 207 deletions(-) diff --git a/api/uexecutor/v1/query.pulsar.go b/api/uexecutor/v1/query.pulsar.go index 484399eb..55b69539 100644 --- a/api/uexecutor/v1/query.pulsar.go +++ b/api/uexecutor/v1/query.pulsar.go @@ -1877,6 +1877,1869 @@ func (x *fastReflection_QueryAllGasPricesResponse) ProtoMethods() *protoiface.Me } } +var ( + md_QueryChainMetaRequest protoreflect.MessageDescriptor + fd_QueryChainMetaRequest_chain_id protoreflect.FieldDescriptor +) + +func init() { + file_uexecutor_v1_query_proto_init() + md_QueryChainMetaRequest = File_uexecutor_v1_query_proto.Messages().ByName("QueryChainMetaRequest") + fd_QueryChainMetaRequest_chain_id = md_QueryChainMetaRequest.Fields().ByName("chain_id") +} + +var _ protoreflect.Message = (*fastReflection_QueryChainMetaRequest)(nil) + +type fastReflection_QueryChainMetaRequest QueryChainMetaRequest + +func (x *QueryChainMetaRequest) ProtoReflect() protoreflect.Message { + return (*fastReflection_QueryChainMetaRequest)(x) +} + +func (x *QueryChainMetaRequest) slowProtoReflect() protoreflect.Message { + mi := &file_uexecutor_v1_query_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +var _fastReflection_QueryChainMetaRequest_messageType fastReflection_QueryChainMetaRequest_messageType +var _ protoreflect.MessageType = fastReflection_QueryChainMetaRequest_messageType{} + +type fastReflection_QueryChainMetaRequest_messageType struct{} + +func (x fastReflection_QueryChainMetaRequest_messageType) Zero() protoreflect.Message { + return (*fastReflection_QueryChainMetaRequest)(nil) +} +func (x fastReflection_QueryChainMetaRequest_messageType) New() protoreflect.Message { + return new(fastReflection_QueryChainMetaRequest) +} +func (x fastReflection_QueryChainMetaRequest_messageType) Descriptor() protoreflect.MessageDescriptor { + return md_QueryChainMetaRequest +} + +// Descriptor returns message descriptor, which contains only the protobuf +// type information for the message. +func (x *fastReflection_QueryChainMetaRequest) Descriptor() protoreflect.MessageDescriptor { + return md_QueryChainMetaRequest +} + +// Type returns the message type, which encapsulates both Go and protobuf +// type information. If the Go type information is not needed, +// it is recommended that the message descriptor be used instead. +func (x *fastReflection_QueryChainMetaRequest) Type() protoreflect.MessageType { + return _fastReflection_QueryChainMetaRequest_messageType +} + +// New returns a newly allocated and mutable empty message. +func (x *fastReflection_QueryChainMetaRequest) New() protoreflect.Message { + return new(fastReflection_QueryChainMetaRequest) +} + +// Interface unwraps the message reflection interface and +// returns the underlying ProtoMessage interface. +func (x *fastReflection_QueryChainMetaRequest) Interface() protoreflect.ProtoMessage { + return (*QueryChainMetaRequest)(x) +} + +// Range iterates over every populated field in an undefined order, +// calling f for each field descriptor and value encountered. +// Range returns immediately if f returns false. +// While iterating, mutating operations may only be performed +// on the current field descriptor. +func (x *fastReflection_QueryChainMetaRequest) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { + if x.ChainId != "" { + value := protoreflect.ValueOfString(x.ChainId) + if !f(fd_QueryChainMetaRequest_chain_id, value) { + return + } + } +} + +// Has reports whether a field is populated. +// +// Some fields have the property of nullability where it is possible to +// distinguish between the default value of a field and whether the field +// was explicitly populated with the default value. Singular message fields, +// member fields of a oneof, and proto2 scalar fields are nullable. Such +// fields are populated only if explicitly set. +// +// In other cases (aside from the nullable cases above), +// a proto3 scalar field is populated if it contains a non-zero value, and +// a repeated field is populated if it is non-empty. +func (x *fastReflection_QueryChainMetaRequest) Has(fd protoreflect.FieldDescriptor) bool { + switch fd.FullName() { + case "uexecutor.v1.QueryChainMetaRequest.chain_id": + return x.ChainId != "" + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: uexecutor.v1.QueryChainMetaRequest")) + } + panic(fmt.Errorf("message uexecutor.v1.QueryChainMetaRequest does not contain field %s", fd.FullName())) + } +} + +// Clear clears the field such that a subsequent Has call reports false. +// +// Clearing an extension field clears both the extension type and value +// associated with the given field number. +// +// Clear is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_QueryChainMetaRequest) Clear(fd protoreflect.FieldDescriptor) { + switch fd.FullName() { + case "uexecutor.v1.QueryChainMetaRequest.chain_id": + x.ChainId = "" + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: uexecutor.v1.QueryChainMetaRequest")) + } + panic(fmt.Errorf("message uexecutor.v1.QueryChainMetaRequest does not contain field %s", fd.FullName())) + } +} + +// Get retrieves the value for a field. +// +// For unpopulated scalars, it returns the default value, where +// the default value of a bytes scalar is guaranteed to be a copy. +// For unpopulated composite types, it returns an empty, read-only view +// of the value; to obtain a mutable reference, use Mutable. +func (x *fastReflection_QueryChainMetaRequest) Get(descriptor protoreflect.FieldDescriptor) protoreflect.Value { + switch descriptor.FullName() { + case "uexecutor.v1.QueryChainMetaRequest.chain_id": + value := x.ChainId + return protoreflect.ValueOfString(value) + default: + if descriptor.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: uexecutor.v1.QueryChainMetaRequest")) + } + panic(fmt.Errorf("message uexecutor.v1.QueryChainMetaRequest does not contain field %s", descriptor.FullName())) + } +} + +// Set stores the value for a field. +// +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType. +// When setting a composite type, it is unspecified whether the stored value +// aliases the source's memory in any way. If the composite value is an +// empty, read-only value, then it panics. +// +// Set is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_QueryChainMetaRequest) Set(fd protoreflect.FieldDescriptor, value protoreflect.Value) { + switch fd.FullName() { + case "uexecutor.v1.QueryChainMetaRequest.chain_id": + x.ChainId = value.Interface().(string) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: uexecutor.v1.QueryChainMetaRequest")) + } + panic(fmt.Errorf("message uexecutor.v1.QueryChainMetaRequest does not contain field %s", fd.FullName())) + } +} + +// Mutable returns a mutable reference to a composite type. +// +// If the field is unpopulated, it may allocate a composite value. +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType +// if not already stored. +// It panics if the field does not contain a composite type. +// +// Mutable is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_QueryChainMetaRequest) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "uexecutor.v1.QueryChainMetaRequest.chain_id": + panic(fmt.Errorf("field chain_id of message uexecutor.v1.QueryChainMetaRequest is not mutable")) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: uexecutor.v1.QueryChainMetaRequest")) + } + panic(fmt.Errorf("message uexecutor.v1.QueryChainMetaRequest does not contain field %s", fd.FullName())) + } +} + +// NewField returns a new value that is assignable to the field +// for the given descriptor. For scalars, this returns the default value. +// For lists, maps, and messages, this returns a new, empty, mutable value. +func (x *fastReflection_QueryChainMetaRequest) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "uexecutor.v1.QueryChainMetaRequest.chain_id": + return protoreflect.ValueOfString("") + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: uexecutor.v1.QueryChainMetaRequest")) + } + panic(fmt.Errorf("message uexecutor.v1.QueryChainMetaRequest does not contain field %s", fd.FullName())) + } +} + +// WhichOneof reports which field within the oneof is populated, +// returning nil if none are populated. +// It panics if the oneof descriptor does not belong to this message. +func (x *fastReflection_QueryChainMetaRequest) WhichOneof(d protoreflect.OneofDescriptor) protoreflect.FieldDescriptor { + switch d.FullName() { + default: + panic(fmt.Errorf("%s is not a oneof field in uexecutor.v1.QueryChainMetaRequest", d.FullName())) + } + panic("unreachable") +} + +// GetUnknown retrieves the entire list of unknown fields. +// The caller may only mutate the contents of the RawFields +// if the mutated bytes are stored back into the message with SetUnknown. +func (x *fastReflection_QueryChainMetaRequest) GetUnknown() protoreflect.RawFields { + return x.unknownFields +} + +// SetUnknown stores an entire list of unknown fields. +// The raw fields must be syntactically valid according to the wire format. +// An implementation may panic if this is not the case. +// Once stored, the caller must not mutate the content of the RawFields. +// An empty RawFields may be passed to clear the fields. +// +// SetUnknown is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_QueryChainMetaRequest) SetUnknown(fields protoreflect.RawFields) { + x.unknownFields = fields +} + +// IsValid reports whether the message is valid. +// +// An invalid message is an empty, read-only value. +// +// An invalid message often corresponds to a nil pointer of the concrete +// message type, but the details are implementation dependent. +// Validity is not part of the protobuf data model, and may not +// be preserved in marshaling or other operations. +func (x *fastReflection_QueryChainMetaRequest) IsValid() bool { + return x != nil +} + +// ProtoMethods returns optional fastReflectionFeature-path implementations of various operations. +// This method may return nil. +// +// The returned methods type is identical to +// "google.golang.org/protobuf/runtime/protoiface".Methods. +// Consult the protoiface package documentation for details. +func (x *fastReflection_QueryChainMetaRequest) ProtoMethods() *protoiface.Methods { + size := func(input protoiface.SizeInput) protoiface.SizeOutput { + x := input.Message.Interface().(*QueryChainMetaRequest) + if x == nil { + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: 0, + } + } + options := runtime.SizeInputToOptions(input) + _ = options + var n int + var l int + _ = l + l = len(x.ChainId) + if l > 0 { + n += 1 + l + runtime.Sov(uint64(l)) + } + if x.unknownFields != nil { + n += len(x.unknownFields) + } + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: n, + } + } + + marshal := func(input protoiface.MarshalInput) (protoiface.MarshalOutput, error) { + x := input.Message.Interface().(*QueryChainMetaRequest) + if x == nil { + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + options := runtime.MarshalInputToOptions(input) + _ = options + size := options.Size(x) + dAtA := make([]byte, size) + i := len(dAtA) + _ = i + var l int + _ = l + if x.unknownFields != nil { + i -= len(x.unknownFields) + copy(dAtA[i:], x.unknownFields) + } + if len(x.ChainId) > 0 { + i -= len(x.ChainId) + copy(dAtA[i:], x.ChainId) + i = runtime.EncodeVarint(dAtA, i, uint64(len(x.ChainId))) + i-- + dAtA[i] = 0xa + } + if input.Buf != nil { + input.Buf = append(input.Buf, dAtA...) + } else { + input.Buf = dAtA + } + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + unmarshal := func(input protoiface.UnmarshalInput) (protoiface.UnmarshalOutput, error) { + x := input.Message.Interface().(*QueryChainMetaRequest) + if x == nil { + return protoiface.UnmarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Flags: input.Flags, + }, nil + } + options := runtime.UnmarshalInputToOptions(input) + _ = options + dAtA := input.Buf + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, 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 protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: QueryChainMetaRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: QueryChainMetaRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field ChainId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if postIndex > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + x.ChainId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := runtime.Skip(dAtA[iNdEx:]) + if err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + if !options.DiscardUnknown { + x.unknownFields = append(x.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + } + iNdEx += skippy + } + } + + if iNdEx > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, nil + } + return &protoiface.Methods{ + NoUnkeyedLiterals: struct{}{}, + Flags: protoiface.SupportMarshalDeterministic | protoiface.SupportUnmarshalDiscardUnknown, + Size: size, + Marshal: marshal, + Unmarshal: unmarshal, + Merge: nil, + CheckInitialized: nil, + } +} + +var ( + md_QueryChainMetaResponse protoreflect.MessageDescriptor + fd_QueryChainMetaResponse_chain_meta protoreflect.FieldDescriptor +) + +func init() { + file_uexecutor_v1_query_proto_init() + md_QueryChainMetaResponse = File_uexecutor_v1_query_proto.Messages().ByName("QueryChainMetaResponse") + fd_QueryChainMetaResponse_chain_meta = md_QueryChainMetaResponse.Fields().ByName("chain_meta") +} + +var _ protoreflect.Message = (*fastReflection_QueryChainMetaResponse)(nil) + +type fastReflection_QueryChainMetaResponse QueryChainMetaResponse + +func (x *QueryChainMetaResponse) ProtoReflect() protoreflect.Message { + return (*fastReflection_QueryChainMetaResponse)(x) +} + +func (x *QueryChainMetaResponse) slowProtoReflect() protoreflect.Message { + mi := &file_uexecutor_v1_query_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +var _fastReflection_QueryChainMetaResponse_messageType fastReflection_QueryChainMetaResponse_messageType +var _ protoreflect.MessageType = fastReflection_QueryChainMetaResponse_messageType{} + +type fastReflection_QueryChainMetaResponse_messageType struct{} + +func (x fastReflection_QueryChainMetaResponse_messageType) Zero() protoreflect.Message { + return (*fastReflection_QueryChainMetaResponse)(nil) +} +func (x fastReflection_QueryChainMetaResponse_messageType) New() protoreflect.Message { + return new(fastReflection_QueryChainMetaResponse) +} +func (x fastReflection_QueryChainMetaResponse_messageType) Descriptor() protoreflect.MessageDescriptor { + return md_QueryChainMetaResponse +} + +// Descriptor returns message descriptor, which contains only the protobuf +// type information for the message. +func (x *fastReflection_QueryChainMetaResponse) Descriptor() protoreflect.MessageDescriptor { + return md_QueryChainMetaResponse +} + +// Type returns the message type, which encapsulates both Go and protobuf +// type information. If the Go type information is not needed, +// it is recommended that the message descriptor be used instead. +func (x *fastReflection_QueryChainMetaResponse) Type() protoreflect.MessageType { + return _fastReflection_QueryChainMetaResponse_messageType +} + +// New returns a newly allocated and mutable empty message. +func (x *fastReflection_QueryChainMetaResponse) New() protoreflect.Message { + return new(fastReflection_QueryChainMetaResponse) +} + +// Interface unwraps the message reflection interface and +// returns the underlying ProtoMessage interface. +func (x *fastReflection_QueryChainMetaResponse) Interface() protoreflect.ProtoMessage { + return (*QueryChainMetaResponse)(x) +} + +// Range iterates over every populated field in an undefined order, +// calling f for each field descriptor and value encountered. +// Range returns immediately if f returns false. +// While iterating, mutating operations may only be performed +// on the current field descriptor. +func (x *fastReflection_QueryChainMetaResponse) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { + if x.ChainMeta != nil { + value := protoreflect.ValueOfMessage(x.ChainMeta.ProtoReflect()) + if !f(fd_QueryChainMetaResponse_chain_meta, value) { + return + } + } +} + +// Has reports whether a field is populated. +// +// Some fields have the property of nullability where it is possible to +// distinguish between the default value of a field and whether the field +// was explicitly populated with the default value. Singular message fields, +// member fields of a oneof, and proto2 scalar fields are nullable. Such +// fields are populated only if explicitly set. +// +// In other cases (aside from the nullable cases above), +// a proto3 scalar field is populated if it contains a non-zero value, and +// a repeated field is populated if it is non-empty. +func (x *fastReflection_QueryChainMetaResponse) Has(fd protoreflect.FieldDescriptor) bool { + switch fd.FullName() { + case "uexecutor.v1.QueryChainMetaResponse.chain_meta": + return x.ChainMeta != nil + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: uexecutor.v1.QueryChainMetaResponse")) + } + panic(fmt.Errorf("message uexecutor.v1.QueryChainMetaResponse does not contain field %s", fd.FullName())) + } +} + +// Clear clears the field such that a subsequent Has call reports false. +// +// Clearing an extension field clears both the extension type and value +// associated with the given field number. +// +// Clear is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_QueryChainMetaResponse) Clear(fd protoreflect.FieldDescriptor) { + switch fd.FullName() { + case "uexecutor.v1.QueryChainMetaResponse.chain_meta": + x.ChainMeta = nil + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: uexecutor.v1.QueryChainMetaResponse")) + } + panic(fmt.Errorf("message uexecutor.v1.QueryChainMetaResponse does not contain field %s", fd.FullName())) + } +} + +// Get retrieves the value for a field. +// +// For unpopulated scalars, it returns the default value, where +// the default value of a bytes scalar is guaranteed to be a copy. +// For unpopulated composite types, it returns an empty, read-only view +// of the value; to obtain a mutable reference, use Mutable. +func (x *fastReflection_QueryChainMetaResponse) Get(descriptor protoreflect.FieldDescriptor) protoreflect.Value { + switch descriptor.FullName() { + case "uexecutor.v1.QueryChainMetaResponse.chain_meta": + value := x.ChainMeta + return protoreflect.ValueOfMessage(value.ProtoReflect()) + default: + if descriptor.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: uexecutor.v1.QueryChainMetaResponse")) + } + panic(fmt.Errorf("message uexecutor.v1.QueryChainMetaResponse does not contain field %s", descriptor.FullName())) + } +} + +// Set stores the value for a field. +// +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType. +// When setting a composite type, it is unspecified whether the stored value +// aliases the source's memory in any way. If the composite value is an +// empty, read-only value, then it panics. +// +// Set is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_QueryChainMetaResponse) Set(fd protoreflect.FieldDescriptor, value protoreflect.Value) { + switch fd.FullName() { + case "uexecutor.v1.QueryChainMetaResponse.chain_meta": + x.ChainMeta = value.Message().Interface().(*ChainMeta) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: uexecutor.v1.QueryChainMetaResponse")) + } + panic(fmt.Errorf("message uexecutor.v1.QueryChainMetaResponse does not contain field %s", fd.FullName())) + } +} + +// Mutable returns a mutable reference to a composite type. +// +// If the field is unpopulated, it may allocate a composite value. +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType +// if not already stored. +// It panics if the field does not contain a composite type. +// +// Mutable is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_QueryChainMetaResponse) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "uexecutor.v1.QueryChainMetaResponse.chain_meta": + if x.ChainMeta == nil { + x.ChainMeta = new(ChainMeta) + } + return protoreflect.ValueOfMessage(x.ChainMeta.ProtoReflect()) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: uexecutor.v1.QueryChainMetaResponse")) + } + panic(fmt.Errorf("message uexecutor.v1.QueryChainMetaResponse does not contain field %s", fd.FullName())) + } +} + +// NewField returns a new value that is assignable to the field +// for the given descriptor. For scalars, this returns the default value. +// For lists, maps, and messages, this returns a new, empty, mutable value. +func (x *fastReflection_QueryChainMetaResponse) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "uexecutor.v1.QueryChainMetaResponse.chain_meta": + m := new(ChainMeta) + return protoreflect.ValueOfMessage(m.ProtoReflect()) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: uexecutor.v1.QueryChainMetaResponse")) + } + panic(fmt.Errorf("message uexecutor.v1.QueryChainMetaResponse does not contain field %s", fd.FullName())) + } +} + +// WhichOneof reports which field within the oneof is populated, +// returning nil if none are populated. +// It panics if the oneof descriptor does not belong to this message. +func (x *fastReflection_QueryChainMetaResponse) WhichOneof(d protoreflect.OneofDescriptor) protoreflect.FieldDescriptor { + switch d.FullName() { + default: + panic(fmt.Errorf("%s is not a oneof field in uexecutor.v1.QueryChainMetaResponse", d.FullName())) + } + panic("unreachable") +} + +// GetUnknown retrieves the entire list of unknown fields. +// The caller may only mutate the contents of the RawFields +// if the mutated bytes are stored back into the message with SetUnknown. +func (x *fastReflection_QueryChainMetaResponse) GetUnknown() protoreflect.RawFields { + return x.unknownFields +} + +// SetUnknown stores an entire list of unknown fields. +// The raw fields must be syntactically valid according to the wire format. +// An implementation may panic if this is not the case. +// Once stored, the caller must not mutate the content of the RawFields. +// An empty RawFields may be passed to clear the fields. +// +// SetUnknown is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_QueryChainMetaResponse) SetUnknown(fields protoreflect.RawFields) { + x.unknownFields = fields +} + +// IsValid reports whether the message is valid. +// +// An invalid message is an empty, read-only value. +// +// An invalid message often corresponds to a nil pointer of the concrete +// message type, but the details are implementation dependent. +// Validity is not part of the protobuf data model, and may not +// be preserved in marshaling or other operations. +func (x *fastReflection_QueryChainMetaResponse) IsValid() bool { + return x != nil +} + +// ProtoMethods returns optional fastReflectionFeature-path implementations of various operations. +// This method may return nil. +// +// The returned methods type is identical to +// "google.golang.org/protobuf/runtime/protoiface".Methods. +// Consult the protoiface package documentation for details. +func (x *fastReflection_QueryChainMetaResponse) ProtoMethods() *protoiface.Methods { + size := func(input protoiface.SizeInput) protoiface.SizeOutput { + x := input.Message.Interface().(*QueryChainMetaResponse) + if x == nil { + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: 0, + } + } + options := runtime.SizeInputToOptions(input) + _ = options + var n int + var l int + _ = l + if x.ChainMeta != nil { + l = options.Size(x.ChainMeta) + n += 1 + l + runtime.Sov(uint64(l)) + } + if x.unknownFields != nil { + n += len(x.unknownFields) + } + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: n, + } + } + + marshal := func(input protoiface.MarshalInput) (protoiface.MarshalOutput, error) { + x := input.Message.Interface().(*QueryChainMetaResponse) + if x == nil { + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + options := runtime.MarshalInputToOptions(input) + _ = options + size := options.Size(x) + dAtA := make([]byte, size) + i := len(dAtA) + _ = i + var l int + _ = l + if x.unknownFields != nil { + i -= len(x.unknownFields) + copy(dAtA[i:], x.unknownFields) + } + if x.ChainMeta != nil { + encoded, err := options.Marshal(x.ChainMeta) + if err != nil { + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, err + } + i -= len(encoded) + copy(dAtA[i:], encoded) + i = runtime.EncodeVarint(dAtA, i, uint64(len(encoded))) + i-- + dAtA[i] = 0xa + } + if input.Buf != nil { + input.Buf = append(input.Buf, dAtA...) + } else { + input.Buf = dAtA + } + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + unmarshal := func(input protoiface.UnmarshalInput) (protoiface.UnmarshalOutput, error) { + x := input.Message.Interface().(*QueryChainMetaResponse) + if x == nil { + return protoiface.UnmarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Flags: input.Flags, + }, nil + } + options := runtime.UnmarshalInputToOptions(input) + _ = options + dAtA := input.Buf + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, 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 protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: QueryChainMetaResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: QueryChainMetaResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field ChainMeta", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if postIndex > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + if x.ChainMeta == nil { + x.ChainMeta = &ChainMeta{} + } + if err := options.Unmarshal(dAtA[iNdEx:postIndex], x.ChainMeta); err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := runtime.Skip(dAtA[iNdEx:]) + if err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + if !options.DiscardUnknown { + x.unknownFields = append(x.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + } + iNdEx += skippy + } + } + + if iNdEx > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, nil + } + return &protoiface.Methods{ + NoUnkeyedLiterals: struct{}{}, + Flags: protoiface.SupportMarshalDeterministic | protoiface.SupportUnmarshalDiscardUnknown, + Size: size, + Marshal: marshal, + Unmarshal: unmarshal, + Merge: nil, + CheckInitialized: nil, + } +} + +var ( + md_QueryAllChainMetasRequest protoreflect.MessageDescriptor + fd_QueryAllChainMetasRequest_pagination protoreflect.FieldDescriptor +) + +func init() { + file_uexecutor_v1_query_proto_init() + md_QueryAllChainMetasRequest = File_uexecutor_v1_query_proto.Messages().ByName("QueryAllChainMetasRequest") + fd_QueryAllChainMetasRequest_pagination = md_QueryAllChainMetasRequest.Fields().ByName("pagination") +} + +var _ protoreflect.Message = (*fastReflection_QueryAllChainMetasRequest)(nil) + +type fastReflection_QueryAllChainMetasRequest QueryAllChainMetasRequest + +func (x *QueryAllChainMetasRequest) ProtoReflect() protoreflect.Message { + return (*fastReflection_QueryAllChainMetasRequest)(x) +} + +func (x *QueryAllChainMetasRequest) slowProtoReflect() protoreflect.Message { + mi := &file_uexecutor_v1_query_proto_msgTypes[6] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +var _fastReflection_QueryAllChainMetasRequest_messageType fastReflection_QueryAllChainMetasRequest_messageType +var _ protoreflect.MessageType = fastReflection_QueryAllChainMetasRequest_messageType{} + +type fastReflection_QueryAllChainMetasRequest_messageType struct{} + +func (x fastReflection_QueryAllChainMetasRequest_messageType) Zero() protoreflect.Message { + return (*fastReflection_QueryAllChainMetasRequest)(nil) +} +func (x fastReflection_QueryAllChainMetasRequest_messageType) New() protoreflect.Message { + return new(fastReflection_QueryAllChainMetasRequest) +} +func (x fastReflection_QueryAllChainMetasRequest_messageType) Descriptor() protoreflect.MessageDescriptor { + return md_QueryAllChainMetasRequest +} + +// Descriptor returns message descriptor, which contains only the protobuf +// type information for the message. +func (x *fastReflection_QueryAllChainMetasRequest) Descriptor() protoreflect.MessageDescriptor { + return md_QueryAllChainMetasRequest +} + +// Type returns the message type, which encapsulates both Go and protobuf +// type information. If the Go type information is not needed, +// it is recommended that the message descriptor be used instead. +func (x *fastReflection_QueryAllChainMetasRequest) Type() protoreflect.MessageType { + return _fastReflection_QueryAllChainMetasRequest_messageType +} + +// New returns a newly allocated and mutable empty message. +func (x *fastReflection_QueryAllChainMetasRequest) New() protoreflect.Message { + return new(fastReflection_QueryAllChainMetasRequest) +} + +// Interface unwraps the message reflection interface and +// returns the underlying ProtoMessage interface. +func (x *fastReflection_QueryAllChainMetasRequest) Interface() protoreflect.ProtoMessage { + return (*QueryAllChainMetasRequest)(x) +} + +// Range iterates over every populated field in an undefined order, +// calling f for each field descriptor and value encountered. +// Range returns immediately if f returns false. +// While iterating, mutating operations may only be performed +// on the current field descriptor. +func (x *fastReflection_QueryAllChainMetasRequest) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { + if x.Pagination != nil { + value := protoreflect.ValueOfMessage(x.Pagination.ProtoReflect()) + if !f(fd_QueryAllChainMetasRequest_pagination, value) { + return + } + } +} + +// Has reports whether a field is populated. +// +// Some fields have the property of nullability where it is possible to +// distinguish between the default value of a field and whether the field +// was explicitly populated with the default value. Singular message fields, +// member fields of a oneof, and proto2 scalar fields are nullable. Such +// fields are populated only if explicitly set. +// +// In other cases (aside from the nullable cases above), +// a proto3 scalar field is populated if it contains a non-zero value, and +// a repeated field is populated if it is non-empty. +func (x *fastReflection_QueryAllChainMetasRequest) Has(fd protoreflect.FieldDescriptor) bool { + switch fd.FullName() { + case "uexecutor.v1.QueryAllChainMetasRequest.pagination": + return x.Pagination != nil + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: uexecutor.v1.QueryAllChainMetasRequest")) + } + panic(fmt.Errorf("message uexecutor.v1.QueryAllChainMetasRequest does not contain field %s", fd.FullName())) + } +} + +// Clear clears the field such that a subsequent Has call reports false. +// +// Clearing an extension field clears both the extension type and value +// associated with the given field number. +// +// Clear is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_QueryAllChainMetasRequest) Clear(fd protoreflect.FieldDescriptor) { + switch fd.FullName() { + case "uexecutor.v1.QueryAllChainMetasRequest.pagination": + x.Pagination = nil + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: uexecutor.v1.QueryAllChainMetasRequest")) + } + panic(fmt.Errorf("message uexecutor.v1.QueryAllChainMetasRequest does not contain field %s", fd.FullName())) + } +} + +// Get retrieves the value for a field. +// +// For unpopulated scalars, it returns the default value, where +// the default value of a bytes scalar is guaranteed to be a copy. +// For unpopulated composite types, it returns an empty, read-only view +// of the value; to obtain a mutable reference, use Mutable. +func (x *fastReflection_QueryAllChainMetasRequest) Get(descriptor protoreflect.FieldDescriptor) protoreflect.Value { + switch descriptor.FullName() { + case "uexecutor.v1.QueryAllChainMetasRequest.pagination": + value := x.Pagination + return protoreflect.ValueOfMessage(value.ProtoReflect()) + default: + if descriptor.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: uexecutor.v1.QueryAllChainMetasRequest")) + } + panic(fmt.Errorf("message uexecutor.v1.QueryAllChainMetasRequest does not contain field %s", descriptor.FullName())) + } +} + +// Set stores the value for a field. +// +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType. +// When setting a composite type, it is unspecified whether the stored value +// aliases the source's memory in any way. If the composite value is an +// empty, read-only value, then it panics. +// +// Set is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_QueryAllChainMetasRequest) Set(fd protoreflect.FieldDescriptor, value protoreflect.Value) { + switch fd.FullName() { + case "uexecutor.v1.QueryAllChainMetasRequest.pagination": + x.Pagination = value.Message().Interface().(*v1beta1.PageRequest) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: uexecutor.v1.QueryAllChainMetasRequest")) + } + panic(fmt.Errorf("message uexecutor.v1.QueryAllChainMetasRequest does not contain field %s", fd.FullName())) + } +} + +// Mutable returns a mutable reference to a composite type. +// +// If the field is unpopulated, it may allocate a composite value. +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType +// if not already stored. +// It panics if the field does not contain a composite type. +// +// Mutable is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_QueryAllChainMetasRequest) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "uexecutor.v1.QueryAllChainMetasRequest.pagination": + if x.Pagination == nil { + x.Pagination = new(v1beta1.PageRequest) + } + return protoreflect.ValueOfMessage(x.Pagination.ProtoReflect()) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: uexecutor.v1.QueryAllChainMetasRequest")) + } + panic(fmt.Errorf("message uexecutor.v1.QueryAllChainMetasRequest does not contain field %s", fd.FullName())) + } +} + +// NewField returns a new value that is assignable to the field +// for the given descriptor. For scalars, this returns the default value. +// For lists, maps, and messages, this returns a new, empty, mutable value. +func (x *fastReflection_QueryAllChainMetasRequest) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "uexecutor.v1.QueryAllChainMetasRequest.pagination": + m := new(v1beta1.PageRequest) + return protoreflect.ValueOfMessage(m.ProtoReflect()) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: uexecutor.v1.QueryAllChainMetasRequest")) + } + panic(fmt.Errorf("message uexecutor.v1.QueryAllChainMetasRequest does not contain field %s", fd.FullName())) + } +} + +// WhichOneof reports which field within the oneof is populated, +// returning nil if none are populated. +// It panics if the oneof descriptor does not belong to this message. +func (x *fastReflection_QueryAllChainMetasRequest) WhichOneof(d protoreflect.OneofDescriptor) protoreflect.FieldDescriptor { + switch d.FullName() { + default: + panic(fmt.Errorf("%s is not a oneof field in uexecutor.v1.QueryAllChainMetasRequest", d.FullName())) + } + panic("unreachable") +} + +// GetUnknown retrieves the entire list of unknown fields. +// The caller may only mutate the contents of the RawFields +// if the mutated bytes are stored back into the message with SetUnknown. +func (x *fastReflection_QueryAllChainMetasRequest) GetUnknown() protoreflect.RawFields { + return x.unknownFields +} + +// SetUnknown stores an entire list of unknown fields. +// The raw fields must be syntactically valid according to the wire format. +// An implementation may panic if this is not the case. +// Once stored, the caller must not mutate the content of the RawFields. +// An empty RawFields may be passed to clear the fields. +// +// SetUnknown is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_QueryAllChainMetasRequest) SetUnknown(fields protoreflect.RawFields) { + x.unknownFields = fields +} + +// IsValid reports whether the message is valid. +// +// An invalid message is an empty, read-only value. +// +// An invalid message often corresponds to a nil pointer of the concrete +// message type, but the details are implementation dependent. +// Validity is not part of the protobuf data model, and may not +// be preserved in marshaling or other operations. +func (x *fastReflection_QueryAllChainMetasRequest) IsValid() bool { + return x != nil +} + +// ProtoMethods returns optional fastReflectionFeature-path implementations of various operations. +// This method may return nil. +// +// The returned methods type is identical to +// "google.golang.org/protobuf/runtime/protoiface".Methods. +// Consult the protoiface package documentation for details. +func (x *fastReflection_QueryAllChainMetasRequest) ProtoMethods() *protoiface.Methods { + size := func(input protoiface.SizeInput) protoiface.SizeOutput { + x := input.Message.Interface().(*QueryAllChainMetasRequest) + if x == nil { + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: 0, + } + } + options := runtime.SizeInputToOptions(input) + _ = options + var n int + var l int + _ = l + if x.Pagination != nil { + l = options.Size(x.Pagination) + n += 1 + l + runtime.Sov(uint64(l)) + } + if x.unknownFields != nil { + n += len(x.unknownFields) + } + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: n, + } + } + + marshal := func(input protoiface.MarshalInput) (protoiface.MarshalOutput, error) { + x := input.Message.Interface().(*QueryAllChainMetasRequest) + if x == nil { + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + options := runtime.MarshalInputToOptions(input) + _ = options + size := options.Size(x) + dAtA := make([]byte, size) + i := len(dAtA) + _ = i + var l int + _ = l + if x.unknownFields != nil { + i -= len(x.unknownFields) + copy(dAtA[i:], x.unknownFields) + } + if x.Pagination != nil { + encoded, err := options.Marshal(x.Pagination) + if err != nil { + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, err + } + i -= len(encoded) + copy(dAtA[i:], encoded) + i = runtime.EncodeVarint(dAtA, i, uint64(len(encoded))) + i-- + dAtA[i] = 0xa + } + if input.Buf != nil { + input.Buf = append(input.Buf, dAtA...) + } else { + input.Buf = dAtA + } + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + unmarshal := func(input protoiface.UnmarshalInput) (protoiface.UnmarshalOutput, error) { + x := input.Message.Interface().(*QueryAllChainMetasRequest) + if x == nil { + return protoiface.UnmarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Flags: input.Flags, + }, nil + } + options := runtime.UnmarshalInputToOptions(input) + _ = options + dAtA := input.Buf + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, 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 protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: QueryAllChainMetasRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: QueryAllChainMetasRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field Pagination", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if postIndex > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + if x.Pagination == nil { + x.Pagination = &v1beta1.PageRequest{} + } + if err := options.Unmarshal(dAtA[iNdEx:postIndex], x.Pagination); err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := runtime.Skip(dAtA[iNdEx:]) + if err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + if !options.DiscardUnknown { + x.unknownFields = append(x.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + } + iNdEx += skippy + } + } + + if iNdEx > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, nil + } + return &protoiface.Methods{ + NoUnkeyedLiterals: struct{}{}, + Flags: protoiface.SupportMarshalDeterministic | protoiface.SupportUnmarshalDiscardUnknown, + Size: size, + Marshal: marshal, + Unmarshal: unmarshal, + Merge: nil, + CheckInitialized: nil, + } +} + +var _ protoreflect.List = (*_QueryAllChainMetasResponse_1_list)(nil) + +type _QueryAllChainMetasResponse_1_list struct { + list *[]*ChainMeta +} + +func (x *_QueryAllChainMetasResponse_1_list) Len() int { + if x.list == nil { + return 0 + } + return len(*x.list) +} + +func (x *_QueryAllChainMetasResponse_1_list) Get(i int) protoreflect.Value { + return protoreflect.ValueOfMessage((*x.list)[i].ProtoReflect()) +} + +func (x *_QueryAllChainMetasResponse_1_list) Set(i int, value protoreflect.Value) { + valueUnwrapped := value.Message() + concreteValue := valueUnwrapped.Interface().(*ChainMeta) + (*x.list)[i] = concreteValue +} + +func (x *_QueryAllChainMetasResponse_1_list) Append(value protoreflect.Value) { + valueUnwrapped := value.Message() + concreteValue := valueUnwrapped.Interface().(*ChainMeta) + *x.list = append(*x.list, concreteValue) +} + +func (x *_QueryAllChainMetasResponse_1_list) AppendMutable() protoreflect.Value { + v := new(ChainMeta) + *x.list = append(*x.list, v) + return protoreflect.ValueOfMessage(v.ProtoReflect()) +} + +func (x *_QueryAllChainMetasResponse_1_list) Truncate(n int) { + for i := n; i < len(*x.list); i++ { + (*x.list)[i] = nil + } + *x.list = (*x.list)[:n] +} + +func (x *_QueryAllChainMetasResponse_1_list) NewElement() protoreflect.Value { + v := new(ChainMeta) + return protoreflect.ValueOfMessage(v.ProtoReflect()) +} + +func (x *_QueryAllChainMetasResponse_1_list) IsValid() bool { + return x.list != nil +} + +var ( + md_QueryAllChainMetasResponse protoreflect.MessageDescriptor + fd_QueryAllChainMetasResponse_chain_metas protoreflect.FieldDescriptor + fd_QueryAllChainMetasResponse_pagination protoreflect.FieldDescriptor +) + +func init() { + file_uexecutor_v1_query_proto_init() + md_QueryAllChainMetasResponse = File_uexecutor_v1_query_proto.Messages().ByName("QueryAllChainMetasResponse") + fd_QueryAllChainMetasResponse_chain_metas = md_QueryAllChainMetasResponse.Fields().ByName("chain_metas") + fd_QueryAllChainMetasResponse_pagination = md_QueryAllChainMetasResponse.Fields().ByName("pagination") +} + +var _ protoreflect.Message = (*fastReflection_QueryAllChainMetasResponse)(nil) + +type fastReflection_QueryAllChainMetasResponse QueryAllChainMetasResponse + +func (x *QueryAllChainMetasResponse) ProtoReflect() protoreflect.Message { + return (*fastReflection_QueryAllChainMetasResponse)(x) +} + +func (x *QueryAllChainMetasResponse) slowProtoReflect() protoreflect.Message { + mi := &file_uexecutor_v1_query_proto_msgTypes[7] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +var _fastReflection_QueryAllChainMetasResponse_messageType fastReflection_QueryAllChainMetasResponse_messageType +var _ protoreflect.MessageType = fastReflection_QueryAllChainMetasResponse_messageType{} + +type fastReflection_QueryAllChainMetasResponse_messageType struct{} + +func (x fastReflection_QueryAllChainMetasResponse_messageType) Zero() protoreflect.Message { + return (*fastReflection_QueryAllChainMetasResponse)(nil) +} +func (x fastReflection_QueryAllChainMetasResponse_messageType) New() protoreflect.Message { + return new(fastReflection_QueryAllChainMetasResponse) +} +func (x fastReflection_QueryAllChainMetasResponse_messageType) Descriptor() protoreflect.MessageDescriptor { + return md_QueryAllChainMetasResponse +} + +// Descriptor returns message descriptor, which contains only the protobuf +// type information for the message. +func (x *fastReflection_QueryAllChainMetasResponse) Descriptor() protoreflect.MessageDescriptor { + return md_QueryAllChainMetasResponse +} + +// Type returns the message type, which encapsulates both Go and protobuf +// type information. If the Go type information is not needed, +// it is recommended that the message descriptor be used instead. +func (x *fastReflection_QueryAllChainMetasResponse) Type() protoreflect.MessageType { + return _fastReflection_QueryAllChainMetasResponse_messageType +} + +// New returns a newly allocated and mutable empty message. +func (x *fastReflection_QueryAllChainMetasResponse) New() protoreflect.Message { + return new(fastReflection_QueryAllChainMetasResponse) +} + +// Interface unwraps the message reflection interface and +// returns the underlying ProtoMessage interface. +func (x *fastReflection_QueryAllChainMetasResponse) Interface() protoreflect.ProtoMessage { + return (*QueryAllChainMetasResponse)(x) +} + +// Range iterates over every populated field in an undefined order, +// calling f for each field descriptor and value encountered. +// Range returns immediately if f returns false. +// While iterating, mutating operations may only be performed +// on the current field descriptor. +func (x *fastReflection_QueryAllChainMetasResponse) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { + if len(x.ChainMetas) != 0 { + value := protoreflect.ValueOfList(&_QueryAllChainMetasResponse_1_list{list: &x.ChainMetas}) + if !f(fd_QueryAllChainMetasResponse_chain_metas, value) { + return + } + } + if x.Pagination != nil { + value := protoreflect.ValueOfMessage(x.Pagination.ProtoReflect()) + if !f(fd_QueryAllChainMetasResponse_pagination, value) { + return + } + } +} + +// Has reports whether a field is populated. +// +// Some fields have the property of nullability where it is possible to +// distinguish between the default value of a field and whether the field +// was explicitly populated with the default value. Singular message fields, +// member fields of a oneof, and proto2 scalar fields are nullable. Such +// fields are populated only if explicitly set. +// +// In other cases (aside from the nullable cases above), +// a proto3 scalar field is populated if it contains a non-zero value, and +// a repeated field is populated if it is non-empty. +func (x *fastReflection_QueryAllChainMetasResponse) Has(fd protoreflect.FieldDescriptor) bool { + switch fd.FullName() { + case "uexecutor.v1.QueryAllChainMetasResponse.chain_metas": + return len(x.ChainMetas) != 0 + case "uexecutor.v1.QueryAllChainMetasResponse.pagination": + return x.Pagination != nil + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: uexecutor.v1.QueryAllChainMetasResponse")) + } + panic(fmt.Errorf("message uexecutor.v1.QueryAllChainMetasResponse does not contain field %s", fd.FullName())) + } +} + +// Clear clears the field such that a subsequent Has call reports false. +// +// Clearing an extension field clears both the extension type and value +// associated with the given field number. +// +// Clear is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_QueryAllChainMetasResponse) Clear(fd protoreflect.FieldDescriptor) { + switch fd.FullName() { + case "uexecutor.v1.QueryAllChainMetasResponse.chain_metas": + x.ChainMetas = nil + case "uexecutor.v1.QueryAllChainMetasResponse.pagination": + x.Pagination = nil + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: uexecutor.v1.QueryAllChainMetasResponse")) + } + panic(fmt.Errorf("message uexecutor.v1.QueryAllChainMetasResponse does not contain field %s", fd.FullName())) + } +} + +// Get retrieves the value for a field. +// +// For unpopulated scalars, it returns the default value, where +// the default value of a bytes scalar is guaranteed to be a copy. +// For unpopulated composite types, it returns an empty, read-only view +// of the value; to obtain a mutable reference, use Mutable. +func (x *fastReflection_QueryAllChainMetasResponse) Get(descriptor protoreflect.FieldDescriptor) protoreflect.Value { + switch descriptor.FullName() { + case "uexecutor.v1.QueryAllChainMetasResponse.chain_metas": + if len(x.ChainMetas) == 0 { + return protoreflect.ValueOfList(&_QueryAllChainMetasResponse_1_list{}) + } + listValue := &_QueryAllChainMetasResponse_1_list{list: &x.ChainMetas} + return protoreflect.ValueOfList(listValue) + case "uexecutor.v1.QueryAllChainMetasResponse.pagination": + value := x.Pagination + return protoreflect.ValueOfMessage(value.ProtoReflect()) + default: + if descriptor.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: uexecutor.v1.QueryAllChainMetasResponse")) + } + panic(fmt.Errorf("message uexecutor.v1.QueryAllChainMetasResponse does not contain field %s", descriptor.FullName())) + } +} + +// Set stores the value for a field. +// +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType. +// When setting a composite type, it is unspecified whether the stored value +// aliases the source's memory in any way. If the composite value is an +// empty, read-only value, then it panics. +// +// Set is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_QueryAllChainMetasResponse) Set(fd protoreflect.FieldDescriptor, value protoreflect.Value) { + switch fd.FullName() { + case "uexecutor.v1.QueryAllChainMetasResponse.chain_metas": + lv := value.List() + clv := lv.(*_QueryAllChainMetasResponse_1_list) + x.ChainMetas = *clv.list + case "uexecutor.v1.QueryAllChainMetasResponse.pagination": + x.Pagination = value.Message().Interface().(*v1beta1.PageResponse) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: uexecutor.v1.QueryAllChainMetasResponse")) + } + panic(fmt.Errorf("message uexecutor.v1.QueryAllChainMetasResponse does not contain field %s", fd.FullName())) + } +} + +// Mutable returns a mutable reference to a composite type. +// +// If the field is unpopulated, it may allocate a composite value. +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType +// if not already stored. +// It panics if the field does not contain a composite type. +// +// Mutable is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_QueryAllChainMetasResponse) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "uexecutor.v1.QueryAllChainMetasResponse.chain_metas": + if x.ChainMetas == nil { + x.ChainMetas = []*ChainMeta{} + } + value := &_QueryAllChainMetasResponse_1_list{list: &x.ChainMetas} + return protoreflect.ValueOfList(value) + case "uexecutor.v1.QueryAllChainMetasResponse.pagination": + if x.Pagination == nil { + x.Pagination = new(v1beta1.PageResponse) + } + return protoreflect.ValueOfMessage(x.Pagination.ProtoReflect()) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: uexecutor.v1.QueryAllChainMetasResponse")) + } + panic(fmt.Errorf("message uexecutor.v1.QueryAllChainMetasResponse does not contain field %s", fd.FullName())) + } +} + +// NewField returns a new value that is assignable to the field +// for the given descriptor. For scalars, this returns the default value. +// For lists, maps, and messages, this returns a new, empty, mutable value. +func (x *fastReflection_QueryAllChainMetasResponse) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "uexecutor.v1.QueryAllChainMetasResponse.chain_metas": + list := []*ChainMeta{} + return protoreflect.ValueOfList(&_QueryAllChainMetasResponse_1_list{list: &list}) + case "uexecutor.v1.QueryAllChainMetasResponse.pagination": + m := new(v1beta1.PageResponse) + return protoreflect.ValueOfMessage(m.ProtoReflect()) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: uexecutor.v1.QueryAllChainMetasResponse")) + } + panic(fmt.Errorf("message uexecutor.v1.QueryAllChainMetasResponse does not contain field %s", fd.FullName())) + } +} + +// WhichOneof reports which field within the oneof is populated, +// returning nil if none are populated. +// It panics if the oneof descriptor does not belong to this message. +func (x *fastReflection_QueryAllChainMetasResponse) WhichOneof(d protoreflect.OneofDescriptor) protoreflect.FieldDescriptor { + switch d.FullName() { + default: + panic(fmt.Errorf("%s is not a oneof field in uexecutor.v1.QueryAllChainMetasResponse", d.FullName())) + } + panic("unreachable") +} + +// GetUnknown retrieves the entire list of unknown fields. +// The caller may only mutate the contents of the RawFields +// if the mutated bytes are stored back into the message with SetUnknown. +func (x *fastReflection_QueryAllChainMetasResponse) GetUnknown() protoreflect.RawFields { + return x.unknownFields +} + +// SetUnknown stores an entire list of unknown fields. +// The raw fields must be syntactically valid according to the wire format. +// An implementation may panic if this is not the case. +// Once stored, the caller must not mutate the content of the RawFields. +// An empty RawFields may be passed to clear the fields. +// +// SetUnknown is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_QueryAllChainMetasResponse) SetUnknown(fields protoreflect.RawFields) { + x.unknownFields = fields +} + +// IsValid reports whether the message is valid. +// +// An invalid message is an empty, read-only value. +// +// An invalid message often corresponds to a nil pointer of the concrete +// message type, but the details are implementation dependent. +// Validity is not part of the protobuf data model, and may not +// be preserved in marshaling or other operations. +func (x *fastReflection_QueryAllChainMetasResponse) IsValid() bool { + return x != nil +} + +// ProtoMethods returns optional fastReflectionFeature-path implementations of various operations. +// This method may return nil. +// +// The returned methods type is identical to +// "google.golang.org/protobuf/runtime/protoiface".Methods. +// Consult the protoiface package documentation for details. +func (x *fastReflection_QueryAllChainMetasResponse) ProtoMethods() *protoiface.Methods { + size := func(input protoiface.SizeInput) protoiface.SizeOutput { + x := input.Message.Interface().(*QueryAllChainMetasResponse) + if x == nil { + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: 0, + } + } + options := runtime.SizeInputToOptions(input) + _ = options + var n int + var l int + _ = l + if len(x.ChainMetas) > 0 { + for _, e := range x.ChainMetas { + l = options.Size(e) + n += 1 + l + runtime.Sov(uint64(l)) + } + } + if x.Pagination != nil { + l = options.Size(x.Pagination) + n += 1 + l + runtime.Sov(uint64(l)) + } + if x.unknownFields != nil { + n += len(x.unknownFields) + } + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: n, + } + } + + marshal := func(input protoiface.MarshalInput) (protoiface.MarshalOutput, error) { + x := input.Message.Interface().(*QueryAllChainMetasResponse) + if x == nil { + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + options := runtime.MarshalInputToOptions(input) + _ = options + size := options.Size(x) + dAtA := make([]byte, size) + i := len(dAtA) + _ = i + var l int + _ = l + if x.unknownFields != nil { + i -= len(x.unknownFields) + copy(dAtA[i:], x.unknownFields) + } + if x.Pagination != nil { + encoded, err := options.Marshal(x.Pagination) + if err != nil { + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, err + } + i -= len(encoded) + copy(dAtA[i:], encoded) + i = runtime.EncodeVarint(dAtA, i, uint64(len(encoded))) + i-- + dAtA[i] = 0x12 + } + if len(x.ChainMetas) > 0 { + for iNdEx := len(x.ChainMetas) - 1; iNdEx >= 0; iNdEx-- { + encoded, err := options.Marshal(x.ChainMetas[iNdEx]) + if err != nil { + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, err + } + i -= len(encoded) + copy(dAtA[i:], encoded) + i = runtime.EncodeVarint(dAtA, i, uint64(len(encoded))) + i-- + dAtA[i] = 0xa + } + } + if input.Buf != nil { + input.Buf = append(input.Buf, dAtA...) + } else { + input.Buf = dAtA + } + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + unmarshal := func(input protoiface.UnmarshalInput) (protoiface.UnmarshalOutput, error) { + x := input.Message.Interface().(*QueryAllChainMetasResponse) + if x == nil { + return protoiface.UnmarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Flags: input.Flags, + }, nil + } + options := runtime.UnmarshalInputToOptions(input) + _ = options + dAtA := input.Buf + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, 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 protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: QueryAllChainMetasResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: QueryAllChainMetasResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field ChainMetas", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if postIndex > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + x.ChainMetas = append(x.ChainMetas, &ChainMeta{}) + if err := options.Unmarshal(dAtA[iNdEx:postIndex], x.ChainMetas[len(x.ChainMetas)-1]); err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field Pagination", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if postIndex > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + if x.Pagination == nil { + x.Pagination = &v1beta1.PageResponse{} + } + if err := options.Unmarshal(dAtA[iNdEx:postIndex], x.Pagination); err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := runtime.Skip(dAtA[iNdEx:]) + if err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + if !options.DiscardUnknown { + x.unknownFields = append(x.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + } + iNdEx += skippy + } + } + + if iNdEx > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, nil + } + return &protoiface.Methods{ + NoUnkeyedLiterals: struct{}{}, + Flags: protoiface.SupportMarshalDeterministic | protoiface.SupportUnmarshalDiscardUnknown, + Size: size, + Marshal: marshal, + Unmarshal: unmarshal, + Merge: nil, + CheckInitialized: nil, + } +} + var ( md_QueryParamsRequest protoreflect.MessageDescriptor ) @@ -1895,7 +3758,7 @@ func (x *QueryParamsRequest) ProtoReflect() protoreflect.Message { } func (x *QueryParamsRequest) slowProtoReflect() protoreflect.Message { - mi := &file_uexecutor_v1_query_proto_msgTypes[4] + mi := &file_uexecutor_v1_query_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2253,7 +4116,7 @@ func (x *QueryParamsResponse) ProtoReflect() protoreflect.Message { } func (x *QueryParamsResponse) slowProtoReflect() protoreflect.Message { - mi := &file_uexecutor_v1_query_proto_msgTypes[5] + mi := &file_uexecutor_v1_query_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2688,7 +4551,7 @@ func (x *QueryAllPendingInboundsRequest) ProtoReflect() protoreflect.Message { } func (x *QueryAllPendingInboundsRequest) slowProtoReflect() protoreflect.Message { - mi := &file_uexecutor_v1_query_proto_msgTypes[6] + mi := &file_uexecutor_v1_query_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3171,7 +5034,7 @@ func (x *QueryAllPendingInboundsResponse) ProtoReflect() protoreflect.Message { } func (x *QueryAllPendingInboundsResponse) slowProtoReflect() protoreflect.Message { - mi := &file_uexecutor_v1_query_proto_msgTypes[7] + mi := &file_uexecutor_v1_query_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3682,7 +5545,7 @@ func (x *QueryGetUniversalTxRequest) ProtoReflect() protoreflect.Message { } func (x *QueryGetUniversalTxRequest) slowProtoReflect() protoreflect.Message { - mi := &file_uexecutor_v1_query_proto_msgTypes[8] + mi := &file_uexecutor_v1_query_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4102,7 +5965,7 @@ func (x *QueryGetUniversalTxResponse) ProtoReflect() protoreflect.Message { } func (x *QueryGetUniversalTxResponse) slowProtoReflect() protoreflect.Message { - mi := &file_uexecutor_v1_query_proto_msgTypes[9] + mi := &file_uexecutor_v1_query_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4537,7 +6400,7 @@ func (x *QueryAllUniversalTxRequest) ProtoReflect() protoreflect.Message { } func (x *QueryAllUniversalTxRequest) slowProtoReflect() protoreflect.Message { - mi := &file_uexecutor_v1_query_proto_msgTypes[10] + mi := &file_uexecutor_v1_query_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5025,7 +6888,7 @@ func (x *QueryAllUniversalTxResponse) ProtoReflect() protoreflect.Message { } func (x *QueryAllUniversalTxResponse) slowProtoReflect() protoreflect.Message { - mi := &file_uexecutor_v1_query_proto_msgTypes[11] + mi := &file_uexecutor_v1_query_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5688,6 +7551,156 @@ func (x *QueryAllGasPricesResponse) GetPagination() *v1beta1.PageResponse { return nil } +// Single chain meta +type QueryChainMetaRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ChainId string `protobuf:"bytes,1,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` +} + +func (x *QueryChainMetaRequest) Reset() { + *x = QueryChainMetaRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_uexecutor_v1_query_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *QueryChainMetaRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*QueryChainMetaRequest) ProtoMessage() {} + +// Deprecated: Use QueryChainMetaRequest.ProtoReflect.Descriptor instead. +func (*QueryChainMetaRequest) Descriptor() ([]byte, []int) { + return file_uexecutor_v1_query_proto_rawDescGZIP(), []int{4} +} + +func (x *QueryChainMetaRequest) GetChainId() string { + if x != nil { + return x.ChainId + } + return "" +} + +type QueryChainMetaResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ChainMeta *ChainMeta `protobuf:"bytes,1,opt,name=chain_meta,json=chainMeta,proto3" json:"chain_meta,omitempty"` +} + +func (x *QueryChainMetaResponse) Reset() { + *x = QueryChainMetaResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_uexecutor_v1_query_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *QueryChainMetaResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*QueryChainMetaResponse) ProtoMessage() {} + +// Deprecated: Use QueryChainMetaResponse.ProtoReflect.Descriptor instead. +func (*QueryChainMetaResponse) Descriptor() ([]byte, []int) { + return file_uexecutor_v1_query_proto_rawDescGZIP(), []int{5} +} + +func (x *QueryChainMetaResponse) GetChainMeta() *ChainMeta { + if x != nil { + return x.ChainMeta + } + return nil +} + +// All chain metas +type QueryAllChainMetasRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Pagination *v1beta1.PageRequest `protobuf:"bytes,1,opt,name=pagination,proto3" json:"pagination,omitempty"` +} + +func (x *QueryAllChainMetasRequest) Reset() { + *x = QueryAllChainMetasRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_uexecutor_v1_query_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *QueryAllChainMetasRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*QueryAllChainMetasRequest) ProtoMessage() {} + +// Deprecated: Use QueryAllChainMetasRequest.ProtoReflect.Descriptor instead. +func (*QueryAllChainMetasRequest) Descriptor() ([]byte, []int) { + return file_uexecutor_v1_query_proto_rawDescGZIP(), []int{6} +} + +func (x *QueryAllChainMetasRequest) GetPagination() *v1beta1.PageRequest { + if x != nil { + return x.Pagination + } + return nil +} + +type QueryAllChainMetasResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ChainMetas []*ChainMeta `protobuf:"bytes,1,rep,name=chain_metas,json=chainMetas,proto3" json:"chain_metas,omitempty"` + Pagination *v1beta1.PageResponse `protobuf:"bytes,2,opt,name=pagination,proto3" json:"pagination,omitempty"` +} + +func (x *QueryAllChainMetasResponse) Reset() { + *x = QueryAllChainMetasResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_uexecutor_v1_query_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *QueryAllChainMetasResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*QueryAllChainMetasResponse) ProtoMessage() {} + +// Deprecated: Use QueryAllChainMetasResponse.ProtoReflect.Descriptor instead. +func (*QueryAllChainMetasResponse) Descriptor() ([]byte, []int) { + return file_uexecutor_v1_query_proto_rawDescGZIP(), []int{7} +} + +func (x *QueryAllChainMetasResponse) GetChainMetas() []*ChainMeta { + if x != nil { + return x.ChainMetas + } + return nil +} + +func (x *QueryAllChainMetasResponse) GetPagination() *v1beta1.PageResponse { + if x != nil { + return x.Pagination + } + return nil +} + // Existing types type QueryParamsRequest struct { state protoimpl.MessageState @@ -5698,7 +7711,7 @@ type QueryParamsRequest struct { func (x *QueryParamsRequest) Reset() { *x = QueryParamsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_uexecutor_v1_query_proto_msgTypes[4] + mi := &file_uexecutor_v1_query_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5712,7 +7725,7 @@ func (*QueryParamsRequest) ProtoMessage() {} // Deprecated: Use QueryParamsRequest.ProtoReflect.Descriptor instead. func (*QueryParamsRequest) Descriptor() ([]byte, []int) { - return file_uexecutor_v1_query_proto_rawDescGZIP(), []int{4} + return file_uexecutor_v1_query_proto_rawDescGZIP(), []int{8} } // QueryParamsResponse is the response type for the Query/Params RPC method. @@ -5728,7 +7741,7 @@ type QueryParamsResponse struct { func (x *QueryParamsResponse) Reset() { *x = QueryParamsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_uexecutor_v1_query_proto_msgTypes[5] + mi := &file_uexecutor_v1_query_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5742,7 +7755,7 @@ func (*QueryParamsResponse) ProtoMessage() {} // Deprecated: Use QueryParamsResponse.ProtoReflect.Descriptor instead. func (*QueryParamsResponse) Descriptor() ([]byte, []int) { - return file_uexecutor_v1_query_proto_rawDescGZIP(), []int{5} + return file_uexecutor_v1_query_proto_rawDescGZIP(), []int{9} } func (x *QueryParamsResponse) GetParams() *Params { @@ -5764,7 +7777,7 @@ type QueryAllPendingInboundsRequest struct { func (x *QueryAllPendingInboundsRequest) Reset() { *x = QueryAllPendingInboundsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_uexecutor_v1_query_proto_msgTypes[6] + mi := &file_uexecutor_v1_query_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5778,7 +7791,7 @@ func (*QueryAllPendingInboundsRequest) ProtoMessage() {} // Deprecated: Use QueryAllPendingInboundsRequest.ProtoReflect.Descriptor instead. func (*QueryAllPendingInboundsRequest) Descriptor() ([]byte, []int) { - return file_uexecutor_v1_query_proto_rawDescGZIP(), []int{6} + return file_uexecutor_v1_query_proto_rawDescGZIP(), []int{10} } func (x *QueryAllPendingInboundsRequest) GetPagination() *v1beta1.PageRequest { @@ -5800,7 +7813,7 @@ type QueryAllPendingInboundsResponse struct { func (x *QueryAllPendingInboundsResponse) Reset() { *x = QueryAllPendingInboundsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_uexecutor_v1_query_proto_msgTypes[7] + mi := &file_uexecutor_v1_query_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5814,7 +7827,7 @@ func (*QueryAllPendingInboundsResponse) ProtoMessage() {} // Deprecated: Use QueryAllPendingInboundsResponse.ProtoReflect.Descriptor instead. func (*QueryAllPendingInboundsResponse) Descriptor() ([]byte, []int) { - return file_uexecutor_v1_query_proto_rawDescGZIP(), []int{7} + return file_uexecutor_v1_query_proto_rawDescGZIP(), []int{11} } func (x *QueryAllPendingInboundsResponse) GetInboundIds() []string { @@ -5843,7 +7856,7 @@ type QueryGetUniversalTxRequest struct { func (x *QueryGetUniversalTxRequest) Reset() { *x = QueryGetUniversalTxRequest{} if protoimpl.UnsafeEnabled { - mi := &file_uexecutor_v1_query_proto_msgTypes[8] + mi := &file_uexecutor_v1_query_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5857,7 +7870,7 @@ func (*QueryGetUniversalTxRequest) ProtoMessage() {} // Deprecated: Use QueryGetUniversalTxRequest.ProtoReflect.Descriptor instead. func (*QueryGetUniversalTxRequest) Descriptor() ([]byte, []int) { - return file_uexecutor_v1_query_proto_rawDescGZIP(), []int{8} + return file_uexecutor_v1_query_proto_rawDescGZIP(), []int{12} } func (x *QueryGetUniversalTxRequest) GetId() string { @@ -5878,7 +7891,7 @@ type QueryGetUniversalTxResponse struct { func (x *QueryGetUniversalTxResponse) Reset() { *x = QueryGetUniversalTxResponse{} if protoimpl.UnsafeEnabled { - mi := &file_uexecutor_v1_query_proto_msgTypes[9] + mi := &file_uexecutor_v1_query_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5892,7 +7905,7 @@ func (*QueryGetUniversalTxResponse) ProtoMessage() {} // Deprecated: Use QueryGetUniversalTxResponse.ProtoReflect.Descriptor instead. func (*QueryGetUniversalTxResponse) Descriptor() ([]byte, []int) { - return file_uexecutor_v1_query_proto_rawDescGZIP(), []int{9} + return file_uexecutor_v1_query_proto_rawDescGZIP(), []int{13} } func (x *QueryGetUniversalTxResponse) GetUniversalTx() *UniversalTxLegacy { @@ -5913,7 +7926,7 @@ type QueryAllUniversalTxRequest struct { func (x *QueryAllUniversalTxRequest) Reset() { *x = QueryAllUniversalTxRequest{} if protoimpl.UnsafeEnabled { - mi := &file_uexecutor_v1_query_proto_msgTypes[10] + mi := &file_uexecutor_v1_query_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5927,7 +7940,7 @@ func (*QueryAllUniversalTxRequest) ProtoMessage() {} // Deprecated: Use QueryAllUniversalTxRequest.ProtoReflect.Descriptor instead. func (*QueryAllUniversalTxRequest) Descriptor() ([]byte, []int) { - return file_uexecutor_v1_query_proto_rawDescGZIP(), []int{10} + return file_uexecutor_v1_query_proto_rawDescGZIP(), []int{14} } func (x *QueryAllUniversalTxRequest) GetPagination() *v1beta1.PageRequest { @@ -5949,7 +7962,7 @@ type QueryAllUniversalTxResponse struct { func (x *QueryAllUniversalTxResponse) Reset() { *x = QueryAllUniversalTxResponse{} if protoimpl.UnsafeEnabled { - mi := &file_uexecutor_v1_query_proto_msgTypes[11] + mi := &file_uexecutor_v1_query_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5963,7 +7976,7 @@ func (*QueryAllUniversalTxResponse) ProtoMessage() {} // Deprecated: Use QueryAllUniversalTxResponse.ProtoReflect.Descriptor instead. func (*QueryAllUniversalTxResponse) Descriptor() ([]byte, []int) { - return file_uexecutor_v1_query_proto_rawDescGZIP(), []int{11} + return file_uexecutor_v1_query_proto_rawDescGZIP(), []int{15} } func (x *QueryAllUniversalTxResponse) GetUniversalTxs() []*UniversalTx { @@ -5990,145 +8003,188 @@ var file_uexecutor_v1_query_proto_rawDesc = []byte{ 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x18, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2f, 0x76, 0x31, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2f, 0x76, 0x31, 0x2f, 0x67, - 0x61, 0x73, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2a, - 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x62, 0x61, 0x73, 0x65, 0x2f, 0x71, 0x75, 0x65, 0x72, - 0x79, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x31, 0x0a, 0x14, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x47, 0x61, 0x73, 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x22, 0x4c, 0x0a, - 0x15, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x61, 0x73, 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x09, 0x67, 0x61, 0x73, 0x5f, 0x70, 0x72, - 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x75, 0x65, 0x78, 0x65, - 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x61, 0x73, 0x50, 0x72, 0x69, 0x63, - 0x65, 0x52, 0x08, 0x67, 0x61, 0x73, 0x50, 0x72, 0x69, 0x63, 0x65, 0x22, 0x62, 0x0a, 0x18, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x47, 0x61, 0x73, 0x50, 0x72, 0x69, 0x63, 0x65, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x46, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x63, 0x6f, - 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, - 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, - 0x9b, 0x01, 0x0a, 0x19, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x47, 0x61, 0x73, 0x50, - 0x72, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, - 0x0a, 0x67, 0x61, 0x73, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x16, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, - 0x2e, 0x47, 0x61, 0x73, 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, 0x09, 0x67, 0x61, 0x73, 0x50, 0x72, - 0x69, 0x63, 0x65, 0x73, 0x12, 0x47, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, - 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x62, - 0x65, 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x14, 0x0a, - 0x12, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x22, 0x43, 0x0a, 0x13, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, 0x72, 0x61, - 0x6d, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2c, 0x0a, 0x06, 0x70, 0x61, - 0x72, 0x61, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x75, 0x65, 0x78, - 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, - 0x52, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x22, 0x68, 0x0a, 0x1e, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x41, 0x6c, 0x6c, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x62, 0x6f, 0x75, - 0x6e, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x46, 0x0a, 0x0a, 0x70, 0x61, - 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, - 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x71, 0x75, 0x65, - 0x72, 0x79, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x22, 0x8b, 0x01, 0x0a, 0x1f, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x50, - 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, - 0x64, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x62, - 0x6f, 0x75, 0x6e, 0x64, 0x49, 0x64, 0x73, 0x12, 0x47, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x6f, - 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, - 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x22, 0x2c, 0x0a, 0x1a, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x55, 0x6e, 0x69, 0x76, - 0x65, 0x72, 0x73, 0x61, 0x6c, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x61, - 0x0a, 0x1b, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, - 0x73, 0x61, 0x6c, 0x54, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, 0x0a, - 0x0c, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x5f, 0x74, 0x78, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, - 0x76, 0x31, 0x2e, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x54, 0x78, 0x4c, 0x65, - 0x67, 0x61, 0x63, 0x79, 0x52, 0x0b, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x54, - 0x78, 0x22, 0x64, 0x0a, 0x1a, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x55, 0x6e, 0x69, - 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x61, 0x73, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1d, + 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x68, 0x61, + 0x69, 0x6e, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2a, 0x63, + 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x62, 0x61, 0x73, 0x65, 0x2f, 0x71, 0x75, 0x65, 0x72, 0x79, + 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x31, 0x0a, 0x14, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x47, 0x61, 0x73, 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x19, 0x0a, 0x08, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x22, 0x4c, 0x0a, 0x15, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x61, 0x73, 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x09, 0x67, 0x61, 0x73, 0x5f, 0x70, 0x72, 0x69, + 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, + 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x61, 0x73, 0x50, 0x72, 0x69, 0x63, 0x65, + 0x52, 0x08, 0x67, 0x61, 0x73, 0x50, 0x72, 0x69, 0x63, 0x65, 0x22, 0x62, 0x0a, 0x18, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x47, 0x61, 0x73, 0x50, 0x72, 0x69, 0x63, 0x65, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x46, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x63, 0x6f, 0x73, + 0x6d, 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, + 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x9b, + 0x01, 0x0a, 0x19, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x47, 0x61, 0x73, 0x50, 0x72, + 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x0a, + 0x67, 0x61, 0x73, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x16, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, + 0x47, 0x61, 0x73, 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, 0x09, 0x67, 0x61, 0x73, 0x50, 0x72, 0x69, + 0x63, 0x65, 0x73, 0x12, 0x47, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, + 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x62, 0x65, + 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x32, 0x0a, 0x15, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, + 0x22, 0x50, 0x0a, 0x16, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x4d, 0x65, + 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x0a, 0x63, 0x68, + 0x61, 0x69, 0x6e, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, + 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, + 0x61, 0x69, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x09, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x4d, 0x65, + 0x74, 0x61, 0x22, 0x63, 0x0a, 0x19, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x43, 0x68, + 0x61, 0x69, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x46, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x70, 0x61, 0x67, - 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xa6, 0x01, 0x0a, 0x1b, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x41, 0x6c, 0x6c, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x54, 0x78, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x0d, 0x75, 0x6e, 0x69, 0x76, 0x65, - 0x72, 0x73, 0x61, 0x6c, 0x5f, 0x74, 0x78, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, - 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x6e, - 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x54, 0x78, 0x52, 0x0c, 0x75, 0x6e, 0x69, 0x76, 0x65, - 0x72, 0x73, 0x61, 0x6c, 0x54, 0x78, 0x73, 0x12, 0x47, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x6f, - 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, - 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x32, 0xb4, 0x06, 0x0a, 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x6b, 0x0a, 0x06, 0x50, 0x61, - 0x72, 0x61, 0x6d, 0x73, 0x12, 0x20, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, - 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, - 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1c, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x16, 0x12, 0x14, 0x2f, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2f, 0x76, 0x31, - 0x2f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x99, 0x01, 0x0a, 0x12, 0x41, 0x6c, 0x6c, 0x50, - 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x12, 0x2c, - 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x62, - 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x75, - 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x41, 0x6c, 0x6c, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x62, 0x6f, 0x75, - 0x6e, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x20, 0x12, 0x1e, 0x2f, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2f, - 0x76, 0x31, 0x2f, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x6e, 0x62, 0x6f, 0x75, - 0x6e, 0x64, 0x73, 0x12, 0x8f, 0x01, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x55, 0x6e, 0x69, 0x76, 0x65, - 0x72, 0x73, 0x61, 0x6c, 0x54, 0x78, 0x12, 0x28, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, - 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x55, 0x6e, - 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x29, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, + 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x9f, 0x01, 0x0a, 0x1a, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x41, 0x6c, 0x6c, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x0b, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, + 0x6d, 0x65, 0x74, 0x61, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x75, 0x65, + 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x69, 0x6e, + 0x4d, 0x65, 0x74, 0x61, 0x52, 0x0a, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x73, + 0x12, 0x47, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x62, 0x61, + 0x73, 0x65, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, + 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x0a, 0x70, + 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x14, 0x0a, 0x12, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, + 0x43, 0x0a, 0x13, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2c, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, + 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x06, 0x70, 0x61, + 0x72, 0x61, 0x6d, 0x73, 0x22, 0x68, 0x0a, 0x1e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, + 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x46, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x63, 0x6f, 0x73, + 0x6d, 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, + 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x8b, + 0x01, 0x0a, 0x1f, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x50, 0x65, 0x6e, 0x64, 0x69, + 0x6e, 0x67, 0x49, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x69, 0x64, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, + 0x49, 0x64, 0x73, 0x12, 0x47, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, + 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x62, 0x65, + 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2c, 0x0a, 0x1a, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, - 0x6c, 0x54, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x22, 0x12, 0x20, 0x2f, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2f, - 0x76, 0x31, 0x2f, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x5f, 0x74, 0x78, 0x73, - 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x12, 0x8a, 0x01, 0x0a, 0x0e, 0x41, 0x6c, 0x6c, 0x55, 0x6e, 0x69, - 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x54, 0x78, 0x12, 0x28, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, + 0x6c, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x61, 0x0a, 0x1b, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x54, + 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, 0x0a, 0x0c, 0x75, 0x6e, 0x69, + 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x5f, 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1f, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x55, + 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x54, 0x78, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, + 0x52, 0x0b, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x54, 0x78, 0x22, 0x64, 0x0a, + 0x1a, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, + 0x61, 0x6c, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x46, 0x0a, 0x0a, 0x70, + 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x26, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x71, 0x75, + 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0xa6, 0x01, 0x0a, 0x1b, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, + 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x54, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x0d, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, + 0x5f, 0x74, 0x78, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x75, 0x65, 0x78, + 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, + 0x73, 0x61, 0x6c, 0x54, 0x78, 0x52, 0x0c, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, + 0x54, 0x78, 0x73, 0x12, 0x47, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, + 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x62, 0x65, + 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x32, 0xc2, 0x08, 0x0a, + 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x6b, 0x0a, 0x06, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, + 0x12, 0x20, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, + 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x12, 0x14, 0x2f, + 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x61, 0x72, + 0x61, 0x6d, 0x73, 0x12, 0x99, 0x01, 0x0a, 0x12, 0x41, 0x6c, 0x6c, 0x50, 0x65, 0x6e, 0x64, 0x69, + 0x6e, 0x67, 0x49, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x12, 0x2c, 0x2e, 0x75, 0x65, 0x78, + 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, + 0x6c, 0x6c, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, - 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, - 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, - 0x73, 0x61, 0x6c, 0x54, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x23, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x1d, 0x12, 0x1b, 0x2f, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, - 0x72, 0x2f, 0x76, 0x31, 0x2f, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x5f, 0x74, - 0x78, 0x73, 0x12, 0x7f, 0x0a, 0x08, 0x47, 0x61, 0x73, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x22, - 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x47, 0x61, 0x73, 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, - 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x61, 0x73, 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x24, 0x12, - 0x22, 0x2f, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2f, 0x76, 0x31, 0x2f, 0x67, - 0x61, 0x73, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x2f, 0x7b, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, - 0x69, 0x64, 0x7d, 0x12, 0x81, 0x01, 0x0a, 0x0c, 0x41, 0x6c, 0x6c, 0x47, 0x61, 0x73, 0x50, 0x72, - 0x69, 0x63, 0x65, 0x73, 0x12, 0x26, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, - 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x47, 0x61, 0x73, 0x50, - 0x72, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x75, + 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x12, + 0x1e, 0x2f, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2f, 0x76, 0x31, 0x2f, 0x70, + 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x12, + 0x8f, 0x01, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, + 0x54, 0x78, 0x12, 0x28, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, + 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, + 0x73, 0x61, 0x6c, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x41, 0x6c, 0x6c, 0x47, 0x61, 0x73, 0x50, 0x72, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x12, 0x18, 0x2f, - 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2f, 0x76, 0x31, 0x2f, 0x67, 0x61, 0x73, - 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x73, 0x42, 0xb2, 0x01, 0x0a, 0x10, 0x63, 0x6f, 0x6d, 0x2e, - 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x42, 0x0a, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x41, 0x67, 0x69, 0x74, 0x68, - 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x75, 0x73, 0x68, 0x63, 0x68, 0x61, 0x69, 0x6e, - 0x2f, 0x70, 0x75, 0x73, 0x68, 0x2d, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x2d, 0x6e, 0x6f, 0x64, 0x65, - 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2f, 0x76, - 0x31, 0x3b, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x76, 0x31, 0xa2, 0x02, 0x03, - 0x55, 0x58, 0x58, 0xaa, 0x02, 0x0c, 0x55, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, - 0x56, 0x31, 0xca, 0x02, 0x0c, 0x55, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x5c, 0x56, - 0x31, 0xe2, 0x02, 0x18, 0x55, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x5c, 0x56, 0x31, - 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0d, 0x55, - 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x33, + 0x79, 0x47, 0x65, 0x74, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x54, 0x78, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x12, + 0x20, 0x2f, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2f, 0x76, 0x31, 0x2f, 0x75, + 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x5f, 0x74, 0x78, 0x73, 0x2f, 0x7b, 0x69, 0x64, + 0x7d, 0x12, 0x8a, 0x01, 0x0a, 0x0e, 0x41, 0x6c, 0x6c, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, + 0x61, 0x6c, 0x54, 0x78, 0x12, 0x28, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, + 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x55, 0x6e, 0x69, 0x76, + 0x65, 0x72, 0x73, 0x61, 0x6c, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, + 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x54, + 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x23, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x1d, 0x12, 0x1b, 0x2f, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2f, 0x76, 0x31, + 0x2f, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x5f, 0x74, 0x78, 0x73, 0x12, 0x7f, + 0x0a, 0x08, 0x47, 0x61, 0x73, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x22, 0x2e, 0x75, 0x65, 0x78, + 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, + 0x61, 0x73, 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, + 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x47, 0x61, 0x73, 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x24, 0x12, 0x22, 0x2f, 0x75, 0x65, + 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2f, 0x76, 0x31, 0x2f, 0x67, 0x61, 0x73, 0x5f, 0x70, + 0x72, 0x69, 0x63, 0x65, 0x2f, 0x7b, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x12, + 0x81, 0x01, 0x0a, 0x0c, 0x41, 0x6c, 0x6c, 0x47, 0x61, 0x73, 0x50, 0x72, 0x69, 0x63, 0x65, 0x73, + 0x12, 0x26, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x47, 0x61, 0x73, 0x50, 0x72, 0x69, 0x63, 0x65, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, + 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, + 0x47, 0x61, 0x73, 0x50, 0x72, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x12, 0x18, 0x2f, 0x75, 0x65, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2f, 0x76, 0x31, 0x2f, 0x67, 0x61, 0x73, 0x5f, 0x70, 0x72, 0x69, + 0x63, 0x65, 0x73, 0x12, 0x83, 0x01, 0x0a, 0x09, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x4d, 0x65, 0x74, + 0x61, 0x12, 0x23, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, + 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, + 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x68, 0x61, 0x69, 0x6e, + 0x4d, 0x65, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x25, 0x12, 0x23, 0x2f, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, + 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x2f, 0x7b, + 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x85, 0x01, 0x0a, 0x0d, 0x41, 0x6c, + 0x6c, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x73, 0x12, 0x27, 0x2e, 0x75, 0x65, + 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x41, 0x6c, 0x6c, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, + 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x43, 0x68, 0x61, 0x69, + 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x21, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x12, 0x19, 0x2f, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, + 0x6f, 0x72, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x6d, 0x65, 0x74, 0x61, + 0x73, 0x42, 0xb2, 0x01, 0x0a, 0x10, 0x63, 0x6f, 0x6d, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x42, 0x0a, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x72, 0x6f, + 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x41, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x70, 0x75, 0x73, 0x68, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x2f, 0x70, 0x75, 0x73, 0x68, 0x2d, + 0x63, 0x68, 0x61, 0x69, 0x6e, 0x2d, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x75, + 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2f, 0x76, 0x31, 0x3b, 0x75, 0x65, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x6f, 0x72, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x55, 0x58, 0x58, 0xaa, 0x02, 0x0c, + 0x55, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x0c, 0x55, + 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x18, 0x55, 0x65, + 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0d, 0x55, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, + 0x6f, 0x72, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -6143,56 +8199,69 @@ func file_uexecutor_v1_query_proto_rawDescGZIP() []byte { return file_uexecutor_v1_query_proto_rawDescData } -var file_uexecutor_v1_query_proto_msgTypes = make([]protoimpl.MessageInfo, 12) +var file_uexecutor_v1_query_proto_msgTypes = make([]protoimpl.MessageInfo, 16) var file_uexecutor_v1_query_proto_goTypes = []interface{}{ (*QueryGasPriceRequest)(nil), // 0: uexecutor.v1.QueryGasPriceRequest (*QueryGasPriceResponse)(nil), // 1: uexecutor.v1.QueryGasPriceResponse (*QueryAllGasPricesRequest)(nil), // 2: uexecutor.v1.QueryAllGasPricesRequest (*QueryAllGasPricesResponse)(nil), // 3: uexecutor.v1.QueryAllGasPricesResponse - (*QueryParamsRequest)(nil), // 4: uexecutor.v1.QueryParamsRequest - (*QueryParamsResponse)(nil), // 5: uexecutor.v1.QueryParamsResponse - (*QueryAllPendingInboundsRequest)(nil), // 6: uexecutor.v1.QueryAllPendingInboundsRequest - (*QueryAllPendingInboundsResponse)(nil), // 7: uexecutor.v1.QueryAllPendingInboundsResponse - (*QueryGetUniversalTxRequest)(nil), // 8: uexecutor.v1.QueryGetUniversalTxRequest - (*QueryGetUniversalTxResponse)(nil), // 9: uexecutor.v1.QueryGetUniversalTxResponse - (*QueryAllUniversalTxRequest)(nil), // 10: uexecutor.v1.QueryAllUniversalTxRequest - (*QueryAllUniversalTxResponse)(nil), // 11: uexecutor.v1.QueryAllUniversalTxResponse - (*GasPrice)(nil), // 12: uexecutor.v1.GasPrice - (*v1beta1.PageRequest)(nil), // 13: cosmos.base.query.v1beta1.PageRequest - (*v1beta1.PageResponse)(nil), // 14: cosmos.base.query.v1beta1.PageResponse - (*Params)(nil), // 15: uexecutor.v1.Params - (*UniversalTxLegacy)(nil), // 16: uexecutor.v1.UniversalTxLegacy - (*UniversalTx)(nil), // 17: uexecutor.v1.UniversalTx + (*QueryChainMetaRequest)(nil), // 4: uexecutor.v1.QueryChainMetaRequest + (*QueryChainMetaResponse)(nil), // 5: uexecutor.v1.QueryChainMetaResponse + (*QueryAllChainMetasRequest)(nil), // 6: uexecutor.v1.QueryAllChainMetasRequest + (*QueryAllChainMetasResponse)(nil), // 7: uexecutor.v1.QueryAllChainMetasResponse + (*QueryParamsRequest)(nil), // 8: uexecutor.v1.QueryParamsRequest + (*QueryParamsResponse)(nil), // 9: uexecutor.v1.QueryParamsResponse + (*QueryAllPendingInboundsRequest)(nil), // 10: uexecutor.v1.QueryAllPendingInboundsRequest + (*QueryAllPendingInboundsResponse)(nil), // 11: uexecutor.v1.QueryAllPendingInboundsResponse + (*QueryGetUniversalTxRequest)(nil), // 12: uexecutor.v1.QueryGetUniversalTxRequest + (*QueryGetUniversalTxResponse)(nil), // 13: uexecutor.v1.QueryGetUniversalTxResponse + (*QueryAllUniversalTxRequest)(nil), // 14: uexecutor.v1.QueryAllUniversalTxRequest + (*QueryAllUniversalTxResponse)(nil), // 15: uexecutor.v1.QueryAllUniversalTxResponse + (*GasPrice)(nil), // 16: uexecutor.v1.GasPrice + (*v1beta1.PageRequest)(nil), // 17: cosmos.base.query.v1beta1.PageRequest + (*v1beta1.PageResponse)(nil), // 18: cosmos.base.query.v1beta1.PageResponse + (*ChainMeta)(nil), // 19: uexecutor.v1.ChainMeta + (*Params)(nil), // 20: uexecutor.v1.Params + (*UniversalTxLegacy)(nil), // 21: uexecutor.v1.UniversalTxLegacy + (*UniversalTx)(nil), // 22: uexecutor.v1.UniversalTx } var file_uexecutor_v1_query_proto_depIdxs = []int32{ - 12, // 0: uexecutor.v1.QueryGasPriceResponse.gas_price:type_name -> uexecutor.v1.GasPrice - 13, // 1: uexecutor.v1.QueryAllGasPricesRequest.pagination:type_name -> cosmos.base.query.v1beta1.PageRequest - 12, // 2: uexecutor.v1.QueryAllGasPricesResponse.gas_prices:type_name -> uexecutor.v1.GasPrice - 14, // 3: uexecutor.v1.QueryAllGasPricesResponse.pagination:type_name -> cosmos.base.query.v1beta1.PageResponse - 15, // 4: uexecutor.v1.QueryParamsResponse.params:type_name -> uexecutor.v1.Params - 13, // 5: uexecutor.v1.QueryAllPendingInboundsRequest.pagination:type_name -> cosmos.base.query.v1beta1.PageRequest - 14, // 6: uexecutor.v1.QueryAllPendingInboundsResponse.pagination:type_name -> cosmos.base.query.v1beta1.PageResponse - 16, // 7: uexecutor.v1.QueryGetUniversalTxResponse.universal_tx:type_name -> uexecutor.v1.UniversalTxLegacy - 13, // 8: uexecutor.v1.QueryAllUniversalTxRequest.pagination:type_name -> cosmos.base.query.v1beta1.PageRequest - 17, // 9: uexecutor.v1.QueryAllUniversalTxResponse.universal_txs:type_name -> uexecutor.v1.UniversalTx - 14, // 10: uexecutor.v1.QueryAllUniversalTxResponse.pagination:type_name -> cosmos.base.query.v1beta1.PageResponse - 4, // 11: uexecutor.v1.Query.Params:input_type -> uexecutor.v1.QueryParamsRequest - 6, // 12: uexecutor.v1.Query.AllPendingInbounds:input_type -> uexecutor.v1.QueryAllPendingInboundsRequest - 8, // 13: uexecutor.v1.Query.GetUniversalTx:input_type -> uexecutor.v1.QueryGetUniversalTxRequest - 10, // 14: uexecutor.v1.Query.AllUniversalTx:input_type -> uexecutor.v1.QueryAllUniversalTxRequest - 0, // 15: uexecutor.v1.Query.GasPrice:input_type -> uexecutor.v1.QueryGasPriceRequest - 2, // 16: uexecutor.v1.Query.AllGasPrices:input_type -> uexecutor.v1.QueryAllGasPricesRequest - 5, // 17: uexecutor.v1.Query.Params:output_type -> uexecutor.v1.QueryParamsResponse - 7, // 18: uexecutor.v1.Query.AllPendingInbounds:output_type -> uexecutor.v1.QueryAllPendingInboundsResponse - 9, // 19: uexecutor.v1.Query.GetUniversalTx:output_type -> uexecutor.v1.QueryGetUniversalTxResponse - 11, // 20: uexecutor.v1.Query.AllUniversalTx:output_type -> uexecutor.v1.QueryAllUniversalTxResponse - 1, // 21: uexecutor.v1.Query.GasPrice:output_type -> uexecutor.v1.QueryGasPriceResponse - 3, // 22: uexecutor.v1.Query.AllGasPrices:output_type -> uexecutor.v1.QueryAllGasPricesResponse - 17, // [17:23] is the sub-list for method output_type - 11, // [11:17] is the sub-list for method input_type - 11, // [11:11] is the sub-list for extension type_name - 11, // [11:11] is the sub-list for extension extendee - 0, // [0:11] is the sub-list for field type_name + 16, // 0: uexecutor.v1.QueryGasPriceResponse.gas_price:type_name -> uexecutor.v1.GasPrice + 17, // 1: uexecutor.v1.QueryAllGasPricesRequest.pagination:type_name -> cosmos.base.query.v1beta1.PageRequest + 16, // 2: uexecutor.v1.QueryAllGasPricesResponse.gas_prices:type_name -> uexecutor.v1.GasPrice + 18, // 3: uexecutor.v1.QueryAllGasPricesResponse.pagination:type_name -> cosmos.base.query.v1beta1.PageResponse + 19, // 4: uexecutor.v1.QueryChainMetaResponse.chain_meta:type_name -> uexecutor.v1.ChainMeta + 17, // 5: uexecutor.v1.QueryAllChainMetasRequest.pagination:type_name -> cosmos.base.query.v1beta1.PageRequest + 19, // 6: uexecutor.v1.QueryAllChainMetasResponse.chain_metas:type_name -> uexecutor.v1.ChainMeta + 18, // 7: uexecutor.v1.QueryAllChainMetasResponse.pagination:type_name -> cosmos.base.query.v1beta1.PageResponse + 20, // 8: uexecutor.v1.QueryParamsResponse.params:type_name -> uexecutor.v1.Params + 17, // 9: uexecutor.v1.QueryAllPendingInboundsRequest.pagination:type_name -> cosmos.base.query.v1beta1.PageRequest + 18, // 10: uexecutor.v1.QueryAllPendingInboundsResponse.pagination:type_name -> cosmos.base.query.v1beta1.PageResponse + 21, // 11: uexecutor.v1.QueryGetUniversalTxResponse.universal_tx:type_name -> uexecutor.v1.UniversalTxLegacy + 17, // 12: uexecutor.v1.QueryAllUniversalTxRequest.pagination:type_name -> cosmos.base.query.v1beta1.PageRequest + 22, // 13: uexecutor.v1.QueryAllUniversalTxResponse.universal_txs:type_name -> uexecutor.v1.UniversalTx + 18, // 14: uexecutor.v1.QueryAllUniversalTxResponse.pagination:type_name -> cosmos.base.query.v1beta1.PageResponse + 8, // 15: uexecutor.v1.Query.Params:input_type -> uexecutor.v1.QueryParamsRequest + 10, // 16: uexecutor.v1.Query.AllPendingInbounds:input_type -> uexecutor.v1.QueryAllPendingInboundsRequest + 12, // 17: uexecutor.v1.Query.GetUniversalTx:input_type -> uexecutor.v1.QueryGetUniversalTxRequest + 14, // 18: uexecutor.v1.Query.AllUniversalTx:input_type -> uexecutor.v1.QueryAllUniversalTxRequest + 0, // 19: uexecutor.v1.Query.GasPrice:input_type -> uexecutor.v1.QueryGasPriceRequest + 2, // 20: uexecutor.v1.Query.AllGasPrices:input_type -> uexecutor.v1.QueryAllGasPricesRequest + 4, // 21: uexecutor.v1.Query.ChainMeta:input_type -> uexecutor.v1.QueryChainMetaRequest + 6, // 22: uexecutor.v1.Query.AllChainMetas:input_type -> uexecutor.v1.QueryAllChainMetasRequest + 9, // 23: uexecutor.v1.Query.Params:output_type -> uexecutor.v1.QueryParamsResponse + 11, // 24: uexecutor.v1.Query.AllPendingInbounds:output_type -> uexecutor.v1.QueryAllPendingInboundsResponse + 13, // 25: uexecutor.v1.Query.GetUniversalTx:output_type -> uexecutor.v1.QueryGetUniversalTxResponse + 15, // 26: uexecutor.v1.Query.AllUniversalTx:output_type -> uexecutor.v1.QueryAllUniversalTxResponse + 1, // 27: uexecutor.v1.Query.GasPrice:output_type -> uexecutor.v1.QueryGasPriceResponse + 3, // 28: uexecutor.v1.Query.AllGasPrices:output_type -> uexecutor.v1.QueryAllGasPricesResponse + 5, // 29: uexecutor.v1.Query.ChainMeta:output_type -> uexecutor.v1.QueryChainMetaResponse + 7, // 30: uexecutor.v1.Query.AllChainMetas:output_type -> uexecutor.v1.QueryAllChainMetasResponse + 23, // [23:31] is the sub-list for method output_type + 15, // [15:23] is the sub-list for method input_type + 15, // [15:15] is the sub-list for extension type_name + 15, // [15:15] is the sub-list for extension extendee + 0, // [0:15] is the sub-list for field type_name } func init() { file_uexecutor_v1_query_proto_init() } @@ -6202,6 +8271,7 @@ func file_uexecutor_v1_query_proto_init() { } file_uexecutor_v1_types_proto_init() file_uexecutor_v1_gas_price_proto_init() + file_uexecutor_v1_chain_meta_proto_init() if !protoimpl.UnsafeEnabled { file_uexecutor_v1_query_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*QueryGasPriceRequest); i { @@ -6252,7 +8322,7 @@ func file_uexecutor_v1_query_proto_init() { } } file_uexecutor_v1_query_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QueryParamsRequest); i { + switch v := v.(*QueryChainMetaRequest); i { case 0: return &v.state case 1: @@ -6264,7 +8334,7 @@ func file_uexecutor_v1_query_proto_init() { } } file_uexecutor_v1_query_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QueryParamsResponse); i { + switch v := v.(*QueryChainMetaResponse); i { case 0: return &v.state case 1: @@ -6276,7 +8346,7 @@ func file_uexecutor_v1_query_proto_init() { } } file_uexecutor_v1_query_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QueryAllPendingInboundsRequest); i { + switch v := v.(*QueryAllChainMetasRequest); i { case 0: return &v.state case 1: @@ -6288,7 +8358,7 @@ func file_uexecutor_v1_query_proto_init() { } } file_uexecutor_v1_query_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QueryAllPendingInboundsResponse); i { + switch v := v.(*QueryAllChainMetasResponse); i { case 0: return &v.state case 1: @@ -6300,7 +8370,7 @@ func file_uexecutor_v1_query_proto_init() { } } file_uexecutor_v1_query_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QueryGetUniversalTxRequest); i { + switch v := v.(*QueryParamsRequest); i { case 0: return &v.state case 1: @@ -6312,7 +8382,7 @@ func file_uexecutor_v1_query_proto_init() { } } file_uexecutor_v1_query_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QueryGetUniversalTxResponse); i { + switch v := v.(*QueryParamsResponse); i { case 0: return &v.state case 1: @@ -6324,7 +8394,7 @@ func file_uexecutor_v1_query_proto_init() { } } file_uexecutor_v1_query_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QueryAllUniversalTxRequest); i { + switch v := v.(*QueryAllPendingInboundsRequest); i { case 0: return &v.state case 1: @@ -6336,6 +8406,54 @@ func file_uexecutor_v1_query_proto_init() { } } file_uexecutor_v1_query_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*QueryAllPendingInboundsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_uexecutor_v1_query_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*QueryGetUniversalTxRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_uexecutor_v1_query_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*QueryGetUniversalTxResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_uexecutor_v1_query_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*QueryAllUniversalTxRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_uexecutor_v1_query_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*QueryAllUniversalTxResponse); i { case 0: return &v.state @@ -6354,7 +8472,7 @@ func file_uexecutor_v1_query_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_uexecutor_v1_query_proto_rawDesc, NumEnums: 0, - NumMessages: 12, + NumMessages: 16, NumExtensions: 0, NumServices: 1, }, diff --git a/api/uexecutor/v1/query_grpc.pb.go b/api/uexecutor/v1/query_grpc.pb.go index 0a921c47..8299a71b 100644 --- a/api/uexecutor/v1/query_grpc.pb.go +++ b/api/uexecutor/v1/query_grpc.pb.go @@ -25,6 +25,8 @@ const ( Query_AllUniversalTx_FullMethodName = "/uexecutor.v1.Query/AllUniversalTx" Query_GasPrice_FullMethodName = "/uexecutor.v1.Query/GasPrice" Query_AllGasPrices_FullMethodName = "/uexecutor.v1.Query/AllGasPrices" + Query_ChainMeta_FullMethodName = "/uexecutor.v1.Query/ChainMeta" + Query_AllChainMetas_FullMethodName = "/uexecutor.v1.Query/AllChainMetas" ) // QueryClient is the client API for Query service. @@ -43,6 +45,10 @@ type QueryClient interface { GasPrice(ctx context.Context, in *QueryGasPriceRequest, opts ...grpc.CallOption) (*QueryGasPriceResponse, error) // 🔹 Queries all gas prices across chains AllGasPrices(ctx context.Context, in *QueryAllGasPricesRequest, opts ...grpc.CallOption) (*QueryAllGasPricesResponse, error) + // 🔹 Queries chain meta for a specific chain + ChainMeta(ctx context.Context, in *QueryChainMetaRequest, opts ...grpc.CallOption) (*QueryChainMetaResponse, error) + // 🔹 Queries all chain metas across chains + AllChainMetas(ctx context.Context, in *QueryAllChainMetasRequest, opts ...grpc.CallOption) (*QueryAllChainMetasResponse, error) } type queryClient struct { @@ -107,6 +113,24 @@ func (c *queryClient) AllGasPrices(ctx context.Context, in *QueryAllGasPricesReq return out, nil } +func (c *queryClient) ChainMeta(ctx context.Context, in *QueryChainMetaRequest, opts ...grpc.CallOption) (*QueryChainMetaResponse, error) { + out := new(QueryChainMetaResponse) + err := c.cc.Invoke(ctx, Query_ChainMeta_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *queryClient) AllChainMetas(ctx context.Context, in *QueryAllChainMetasRequest, opts ...grpc.CallOption) (*QueryAllChainMetasResponse, error) { + out := new(QueryAllChainMetasResponse) + err := c.cc.Invoke(ctx, Query_AllChainMetas_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // QueryServer is the server API for Query service. // All implementations must embed UnimplementedQueryServer // for forward compatibility @@ -123,6 +147,10 @@ type QueryServer interface { GasPrice(context.Context, *QueryGasPriceRequest) (*QueryGasPriceResponse, error) // 🔹 Queries all gas prices across chains AllGasPrices(context.Context, *QueryAllGasPricesRequest) (*QueryAllGasPricesResponse, error) + // 🔹 Queries chain meta for a specific chain + ChainMeta(context.Context, *QueryChainMetaRequest) (*QueryChainMetaResponse, error) + // 🔹 Queries all chain metas across chains + AllChainMetas(context.Context, *QueryAllChainMetasRequest) (*QueryAllChainMetasResponse, error) mustEmbedUnimplementedQueryServer() } @@ -148,6 +176,12 @@ func (UnimplementedQueryServer) GasPrice(context.Context, *QueryGasPriceRequest) func (UnimplementedQueryServer) AllGasPrices(context.Context, *QueryAllGasPricesRequest) (*QueryAllGasPricesResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method AllGasPrices not implemented") } +func (UnimplementedQueryServer) ChainMeta(context.Context, *QueryChainMetaRequest) (*QueryChainMetaResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ChainMeta not implemented") +} +func (UnimplementedQueryServer) AllChainMetas(context.Context, *QueryAllChainMetasRequest) (*QueryAllChainMetasResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method AllChainMetas not implemented") +} func (UnimplementedQueryServer) mustEmbedUnimplementedQueryServer() {} // UnsafeQueryServer may be embedded to opt out of forward compatibility for this service. @@ -269,6 +303,42 @@ func _Query_AllGasPrices_Handler(srv interface{}, ctx context.Context, dec func( return interceptor(ctx, in, info, handler) } +func _Query_ChainMeta_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryChainMetaRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).ChainMeta(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Query_ChainMeta_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).ChainMeta(ctx, req.(*QueryChainMetaRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Query_AllChainMetas_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryAllChainMetasRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).AllChainMetas(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Query_AllChainMetas_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).AllChainMetas(ctx, req.(*QueryAllChainMetasRequest)) + } + return interceptor(ctx, in, info, handler) +} + // Query_ServiceDesc is the grpc.ServiceDesc for Query service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -300,6 +370,14 @@ var Query_ServiceDesc = grpc.ServiceDesc{ MethodName: "AllGasPrices", Handler: _Query_AllGasPrices_Handler, }, + { + MethodName: "ChainMeta", + Handler: _Query_ChainMeta_Handler, + }, + { + MethodName: "AllChainMetas", + Handler: _Query_AllChainMetas_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "uexecutor/v1/query.proto", From ae4f7f9d576e0c2942da9c850034fb06407abe94 Mon Sep 17 00:00:00 2001 From: Nilesh Gupta Date: Thu, 12 Mar 2026 16:12:32 +0530 Subject: [PATCH 16/36] feat: added chain meta query server implementation --- x/uexecutor/keeper/query_server.go | 79 +++++++++++++++++++++++++++--- 1 file changed, 73 insertions(+), 6 deletions(-) diff --git a/x/uexecutor/keeper/query_server.go b/x/uexecutor/keeper/query_server.go index 1dbf79ed..d9e50aa9 100755 --- a/x/uexecutor/keeper/query_server.go +++ b/x/uexecutor/keeper/query_server.go @@ -179,6 +179,7 @@ func (k Keeper) AllPendingInbounds(goCtx context.Context, req *types.QueryAllPen } // GasPrice implements types.QueryServer. +// Sources data from ChainMetas (the new unified store) to maintain backward compatibility. func (k Querier) GasPrice(goCtx context.Context, req *types.QueryGasPriceRequest) (*types.QueryGasPriceResponse, error) { if req == nil || req.ChainId == "" { return nil, status.Error(codes.InvalidArgument, "chain_id is required") @@ -186,7 +187,18 @@ func (k Querier) GasPrice(goCtx context.Context, req *types.QueryGasPriceRequest ctx := sdk.UnwrapSDKContext(goCtx) - // Try to fetch the gas price from keeper + // Source from ChainMetas first (preferred post-upgrade storage) + cm, err := k.ChainMetas.Get(ctx, req.ChainId) + if err == nil { + return &types.QueryGasPriceResponse{ + GasPrice: chainMetaToGasPrice(&cm), + }, nil + } + if !errors.Is(err, collections.ErrNotFound) { + return nil, status.Error(codes.Internal, err.Error()) + } + + // Fallback to legacy GasPrices store (pre-upgrade nodes) gasPrice, err := k.GasPrices.Get(ctx, req.ChainId) if err != nil { if errors.Is(err, collections.ErrNotFound) { @@ -195,12 +207,12 @@ func (k Querier) GasPrice(goCtx context.Context, req *types.QueryGasPriceRequest return nil, status.Error(codes.Internal, err.Error()) } - return &types.QueryGasPriceResponse{ - GasPrice: &gasPrice, - }, nil + return &types.QueryGasPriceResponse{GasPrice: &gasPrice}, nil } // AllGasPrices implements types.QueryServer. +// Sources data from ChainMetas (the new unified store) to maintain backward compatibility. +// Falls back to the legacy GasPrices store for entries not yet migrated. func (k Querier) AllGasPrices(goCtx context.Context, req *types.QueryAllGasPricesRequest) (*types.QueryAllGasPricesResponse, error) { if req == nil { return nil, status.Error(codes.InvalidArgument, "invalid request") @@ -210,8 +222,9 @@ func (k Querier) AllGasPrices(goCtx context.Context, req *types.QueryAllGasPrice var all []*types.GasPrice - items, pageRes, err := query.CollectionPaginate(ctx, k.GasPrices, req.Pagination, func(key string, value types.GasPrice) (*types.GasPrice, error) { - return &value, nil + // Primary: read from ChainMetas + items, pageRes, err := query.CollectionPaginate(ctx, k.ChainMetas, req.Pagination, func(_ string, value types.ChainMeta) (*types.GasPrice, error) { + return chainMetaToGasPrice(&value), nil }) if err != nil { return nil, status.Error(codes.Internal, err.Error()) @@ -224,3 +237,57 @@ func (k Querier) AllGasPrices(goCtx context.Context, req *types.QueryAllGasPrice Pagination: pageRes, }, nil } + +// ChainMeta implements types.QueryServer. +// Returns the aggregated chain metadata (gas price + chain height) for a specific chain. +func (k Querier) ChainMeta(goCtx context.Context, req *types.QueryChainMetaRequest) (*types.QueryChainMetaResponse, error) { + if req == nil || req.ChainId == "" { + return nil, status.Error(codes.InvalidArgument, "chain_id is required") + } + + ctx := sdk.UnwrapSDKContext(goCtx) + + cm, err := k.ChainMetas.Get(ctx, req.ChainId) + if err != nil { + if errors.Is(err, collections.ErrNotFound) { + return nil, status.Errorf(codes.NotFound, "no chain meta found for chain_id: %s", req.ChainId) + } + return nil, status.Error(codes.Internal, err.Error()) + } + + return &types.QueryChainMetaResponse{ChainMeta: &cm}, nil +} + +// AllChainMetas implements types.QueryServer. +// Returns paginated chain meta entries for all registered chains. +func (k Querier) AllChainMetas(goCtx context.Context, req *types.QueryAllChainMetasRequest) (*types.QueryAllChainMetasResponse, error) { + if req == nil { + return nil, status.Error(codes.InvalidArgument, "invalid request") + } + + ctx := sdk.UnwrapSDKContext(goCtx) + + items, pageRes, err := query.CollectionPaginate(ctx, k.ChainMetas, req.Pagination, func(_ string, value types.ChainMeta) (*types.ChainMeta, error) { + return &value, nil + }) + if err != nil { + return nil, status.Error(codes.Internal, err.Error()) + } + + return &types.QueryAllChainMetasResponse{ + ChainMetas: items, + Pagination: pageRes, + }, nil +} + +// chainMetaToGasPrice converts a ChainMeta into the legacy GasPrice shape +// so that existing API consumers see no breaking change. +func chainMetaToGasPrice(cm *types.ChainMeta) *types.GasPrice { + return &types.GasPrice{ + ObservedChainId: cm.ObservedChainId, + Signers: cm.Signers, + BlockNums: cm.ChainHeights, + Prices: cm.Prices, + MedianIndex: cm.MedianIndex, + } +} From c5627b5d4333c68c4c150640bf2a4b4878ebd792 Mon Sep 17 00:00:00 2001 From: Nilesh Gupta Date: Thu, 12 Mar 2026 16:12:38 +0530 Subject: [PATCH 17/36] refactor: added generated protobuf --- x/uexecutor/types/query.pb.go | 1071 +++++++++++++++++++++++++++--- x/uexecutor/types/query.pb.gw.go | 184 +++++ 2 files changed, 1147 insertions(+), 108 deletions(-) diff --git a/x/uexecutor/types/query.pb.go b/x/uexecutor/types/query.pb.go index 9d058555..d47a8f5c 100644 --- a/x/uexecutor/types/query.pb.go +++ b/x/uexecutor/types/query.pb.go @@ -215,6 +215,192 @@ func (m *QueryAllGasPricesResponse) GetPagination() *query.PageResponse { return nil } +// Single chain meta +type QueryChainMetaRequest struct { + ChainId string `protobuf:"bytes,1,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` +} + +func (m *QueryChainMetaRequest) Reset() { *m = QueryChainMetaRequest{} } +func (m *QueryChainMetaRequest) String() string { return proto.CompactTextString(m) } +func (*QueryChainMetaRequest) ProtoMessage() {} +func (*QueryChainMetaRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_94816af5d57d33a7, []int{4} +} +func (m *QueryChainMetaRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryChainMetaRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryChainMetaRequest.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 *QueryChainMetaRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryChainMetaRequest.Merge(m, src) +} +func (m *QueryChainMetaRequest) XXX_Size() int { + return m.Size() +} +func (m *QueryChainMetaRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryChainMetaRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryChainMetaRequest proto.InternalMessageInfo + +func (m *QueryChainMetaRequest) GetChainId() string { + if m != nil { + return m.ChainId + } + return "" +} + +type QueryChainMetaResponse struct { + ChainMeta *ChainMeta `protobuf:"bytes,1,opt,name=chain_meta,json=chainMeta,proto3" json:"chain_meta,omitempty"` +} + +func (m *QueryChainMetaResponse) Reset() { *m = QueryChainMetaResponse{} } +func (m *QueryChainMetaResponse) String() string { return proto.CompactTextString(m) } +func (*QueryChainMetaResponse) ProtoMessage() {} +func (*QueryChainMetaResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_94816af5d57d33a7, []int{5} +} +func (m *QueryChainMetaResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryChainMetaResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryChainMetaResponse.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 *QueryChainMetaResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryChainMetaResponse.Merge(m, src) +} +func (m *QueryChainMetaResponse) XXX_Size() int { + return m.Size() +} +func (m *QueryChainMetaResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryChainMetaResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryChainMetaResponse proto.InternalMessageInfo + +func (m *QueryChainMetaResponse) GetChainMeta() *ChainMeta { + if m != nil { + return m.ChainMeta + } + return nil +} + +// All chain metas +type QueryAllChainMetasRequest struct { + Pagination *query.PageRequest `protobuf:"bytes,1,opt,name=pagination,proto3" json:"pagination,omitempty"` +} + +func (m *QueryAllChainMetasRequest) Reset() { *m = QueryAllChainMetasRequest{} } +func (m *QueryAllChainMetasRequest) String() string { return proto.CompactTextString(m) } +func (*QueryAllChainMetasRequest) ProtoMessage() {} +func (*QueryAllChainMetasRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_94816af5d57d33a7, []int{6} +} +func (m *QueryAllChainMetasRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryAllChainMetasRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryAllChainMetasRequest.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 *QueryAllChainMetasRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryAllChainMetasRequest.Merge(m, src) +} +func (m *QueryAllChainMetasRequest) XXX_Size() int { + return m.Size() +} +func (m *QueryAllChainMetasRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryAllChainMetasRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryAllChainMetasRequest proto.InternalMessageInfo + +func (m *QueryAllChainMetasRequest) GetPagination() *query.PageRequest { + if m != nil { + return m.Pagination + } + return nil +} + +type QueryAllChainMetasResponse struct { + ChainMetas []*ChainMeta `protobuf:"bytes,1,rep,name=chain_metas,json=chainMetas,proto3" json:"chain_metas,omitempty"` + Pagination *query.PageResponse `protobuf:"bytes,2,opt,name=pagination,proto3" json:"pagination,omitempty"` +} + +func (m *QueryAllChainMetasResponse) Reset() { *m = QueryAllChainMetasResponse{} } +func (m *QueryAllChainMetasResponse) String() string { return proto.CompactTextString(m) } +func (*QueryAllChainMetasResponse) ProtoMessage() {} +func (*QueryAllChainMetasResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_94816af5d57d33a7, []int{7} +} +func (m *QueryAllChainMetasResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryAllChainMetasResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryAllChainMetasResponse.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 *QueryAllChainMetasResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryAllChainMetasResponse.Merge(m, src) +} +func (m *QueryAllChainMetasResponse) XXX_Size() int { + return m.Size() +} +func (m *QueryAllChainMetasResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryAllChainMetasResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryAllChainMetasResponse proto.InternalMessageInfo + +func (m *QueryAllChainMetasResponse) GetChainMetas() []*ChainMeta { + if m != nil { + return m.ChainMetas + } + return nil +} + +func (m *QueryAllChainMetasResponse) GetPagination() *query.PageResponse { + if m != nil { + return m.Pagination + } + return nil +} + // Existing types type QueryParamsRequest struct { } @@ -223,7 +409,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_94816af5d57d33a7, []int{4} + return fileDescriptor_94816af5d57d33a7, []int{8} } func (m *QueryParamsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -262,7 +448,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_94816af5d57d33a7, []int{5} + return fileDescriptor_94816af5d57d33a7, []int{9} } func (m *QueryParamsResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -307,7 +493,7 @@ func (m *QueryAllPendingInboundsRequest) Reset() { *m = QueryAllPendingI func (m *QueryAllPendingInboundsRequest) String() string { return proto.CompactTextString(m) } func (*QueryAllPendingInboundsRequest) ProtoMessage() {} func (*QueryAllPendingInboundsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_94816af5d57d33a7, []int{6} + return fileDescriptor_94816af5d57d33a7, []int{10} } func (m *QueryAllPendingInboundsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -352,7 +538,7 @@ func (m *QueryAllPendingInboundsResponse) Reset() { *m = QueryAllPending func (m *QueryAllPendingInboundsResponse) String() string { return proto.CompactTextString(m) } func (*QueryAllPendingInboundsResponse) ProtoMessage() {} func (*QueryAllPendingInboundsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_94816af5d57d33a7, []int{7} + return fileDescriptor_94816af5d57d33a7, []int{11} } func (m *QueryAllPendingInboundsResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -404,7 +590,7 @@ func (m *QueryGetUniversalTxRequest) Reset() { *m = QueryGetUniversalTxR func (m *QueryGetUniversalTxRequest) String() string { return proto.CompactTextString(m) } func (*QueryGetUniversalTxRequest) ProtoMessage() {} func (*QueryGetUniversalTxRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_94816af5d57d33a7, []int{8} + return fileDescriptor_94816af5d57d33a7, []int{12} } func (m *QueryGetUniversalTxRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -448,7 +634,7 @@ func (m *QueryGetUniversalTxResponse) Reset() { *m = QueryGetUniversalTx func (m *QueryGetUniversalTxResponse) String() string { return proto.CompactTextString(m) } func (*QueryGetUniversalTxResponse) ProtoMessage() {} func (*QueryGetUniversalTxResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_94816af5d57d33a7, []int{9} + return fileDescriptor_94816af5d57d33a7, []int{13} } func (m *QueryGetUniversalTxResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -492,7 +678,7 @@ func (m *QueryAllUniversalTxRequest) Reset() { *m = QueryAllUniversalTxR func (m *QueryAllUniversalTxRequest) String() string { return proto.CompactTextString(m) } func (*QueryAllUniversalTxRequest) ProtoMessage() {} func (*QueryAllUniversalTxRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_94816af5d57d33a7, []int{10} + return fileDescriptor_94816af5d57d33a7, []int{14} } func (m *QueryAllUniversalTxRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -537,7 +723,7 @@ func (m *QueryAllUniversalTxResponse) Reset() { *m = QueryAllUniversalTx func (m *QueryAllUniversalTxResponse) String() string { return proto.CompactTextString(m) } func (*QueryAllUniversalTxResponse) ProtoMessage() {} func (*QueryAllUniversalTxResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_94816af5d57d33a7, []int{11} + return fileDescriptor_94816af5d57d33a7, []int{15} } func (m *QueryAllUniversalTxResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -585,6 +771,10 @@ func init() { proto.RegisterType((*QueryGasPriceResponse)(nil), "uexecutor.v1.QueryGasPriceResponse") proto.RegisterType((*QueryAllGasPricesRequest)(nil), "uexecutor.v1.QueryAllGasPricesRequest") proto.RegisterType((*QueryAllGasPricesResponse)(nil), "uexecutor.v1.QueryAllGasPricesResponse") + proto.RegisterType((*QueryChainMetaRequest)(nil), "uexecutor.v1.QueryChainMetaRequest") + proto.RegisterType((*QueryChainMetaResponse)(nil), "uexecutor.v1.QueryChainMetaResponse") + proto.RegisterType((*QueryAllChainMetasRequest)(nil), "uexecutor.v1.QueryAllChainMetasRequest") + proto.RegisterType((*QueryAllChainMetasResponse)(nil), "uexecutor.v1.QueryAllChainMetasResponse") proto.RegisterType((*QueryParamsRequest)(nil), "uexecutor.v1.QueryParamsRequest") proto.RegisterType((*QueryParamsResponse)(nil), "uexecutor.v1.QueryParamsResponse") proto.RegisterType((*QueryAllPendingInboundsRequest)(nil), "uexecutor.v1.QueryAllPendingInboundsRequest") @@ -598,53 +788,61 @@ func init() { func init() { proto.RegisterFile("uexecutor/v1/query.proto", fileDescriptor_94816af5d57d33a7) } var fileDescriptor_94816af5d57d33a7 = []byte{ - // 735 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x96, 0x41, 0x4f, 0x13, 0x4d, - 0x18, 0xc7, 0xd9, 0xbe, 0x79, 0xfb, 0xd2, 0x87, 0xbe, 0x1c, 0xc6, 0x4a, 0xca, 0x82, 0x4b, 0x5d, - 0x0c, 0x20, 0x81, 0xdd, 0x14, 0xa2, 0x47, 0x13, 0x30, 0x91, 0x90, 0x70, 0xa8, 0x8d, 0x5e, 0xbc, - 0x34, 0xd3, 0xee, 0x64, 0x3b, 0xb1, 0xec, 0x2e, 0x9d, 0xdd, 0xa6, 0x84, 0x10, 0xa3, 0x47, 0x3d, - 0x68, 0xe2, 0xc9, 0x78, 0xf7, 0x13, 0xf8, 0x21, 0x3c, 0x92, 0x78, 0xf1, 0x68, 0xc0, 0x0f, 0x62, - 0x98, 0x9d, 0x29, 0x3b, 0x65, 0x5a, 0x38, 0xf4, 0xb6, 0x7d, 0xe6, 0x3f, 0xcf, 0xf3, 0xfb, 0x3f, - 0x7d, 0x66, 0x67, 0xa1, 0x9c, 0x90, 0x3e, 0x69, 0x25, 0x71, 0xd8, 0x75, 0x7b, 0x55, 0xf7, 0x28, - 0x21, 0xdd, 0x63, 0x27, 0xea, 0x86, 0x71, 0x88, 0x8a, 0x83, 0x15, 0xa7, 0x57, 0x35, 0x17, 0xfd, - 0x30, 0xf4, 0x3b, 0xc4, 0xc5, 0x11, 0x75, 0x71, 0x10, 0x84, 0x31, 0x8e, 0x69, 0x18, 0xb0, 0x54, - 0x6b, 0xaa, 0x59, 0xe2, 0xe3, 0x88, 0xc8, 0x95, 0x45, 0x65, 0xc5, 0xc7, 0xac, 0x11, 0x75, 0x69, - 0x8b, 0x88, 0xd5, 0xf5, 0x56, 0xc8, 0x0e, 0x43, 0xe6, 0x36, 0x31, 0x23, 0x69, 0x71, 0xb7, 0x57, - 0x6d, 0x92, 0x18, 0x57, 0xdd, 0x08, 0xfb, 0x34, 0xe0, 0x45, 0x52, 0xad, 0x5d, 0x85, 0xd2, 0xf3, - 0x4b, 0xc5, 0x1e, 0x66, 0xb5, 0xcb, 0x14, 0x75, 0x72, 0x94, 0x10, 0x16, 0xa3, 0x79, 0x98, 0x6e, - 0xb5, 0x31, 0x0d, 0x1a, 0xd4, 0x2b, 0x1b, 0x15, 0x63, 0xad, 0x50, 0xff, 0x8f, 0xff, 0xde, 0xf7, - 0xec, 0x03, 0xb8, 0x3b, 0xb4, 0x85, 0x45, 0x61, 0xc0, 0x08, 0xda, 0x86, 0xc2, 0x00, 0x85, 0x6f, - 0x9a, 0xd9, 0x9a, 0x73, 0xb2, 0x7e, 0x9d, 0xc1, 0x96, 0x69, 0x5f, 0x3c, 0xd9, 0x4d, 0x28, 0xf3, - 0x6c, 0x3b, 0x9d, 0x8e, 0x5c, 0x65, 0x12, 0xe2, 0x19, 0xc0, 0x15, 0xb0, 0xc8, 0xb8, 0xe2, 0xa4, - 0xee, 0x9c, 0x4b, 0x77, 0x4e, 0xda, 0x5a, 0xe1, 0xce, 0xa9, 0x61, 0x5f, 0x1a, 0xa8, 0x67, 0x76, - 0xda, 0x5f, 0x0d, 0x98, 0xd7, 0x14, 0x11, 0xd8, 0x8f, 0x00, 0x06, 0xd8, 0xac, 0x6c, 0x54, 0xfe, - 0x19, 0xc3, 0x5d, 0x90, 0xdc, 0x0c, 0xed, 0x29, 0x70, 0x39, 0x0e, 0xb7, 0x7a, 0x23, 0x5c, 0x5a, - 0x53, 0xa1, 0x2b, 0x01, 0xe2, 0x70, 0x35, 0xdc, 0xc5, 0x87, 0xd2, 0xbb, 0xfd, 0x14, 0xee, 0x28, - 0x51, 0x01, 0xbb, 0x01, 0xf9, 0x88, 0x47, 0x44, 0x3b, 0x4a, 0x2a, 0xa8, 0x50, 0x0b, 0x8d, 0xdd, - 0x06, 0x4b, 0xfa, 0xae, 0x91, 0xc0, 0xa3, 0x81, 0xbf, 0x1f, 0x34, 0xc3, 0x24, 0xf0, 0x26, 0xde, - 0xe2, 0x0f, 0x06, 0x2c, 0x8d, 0x2c, 0x25, 0xd8, 0x97, 0x60, 0x86, 0xa6, 0xb1, 0x06, 0xf5, 0xd2, - 0x4e, 0x17, 0xea, 0x20, 0x42, 0xfb, 0xde, 0x04, 0x5b, 0xba, 0x01, 0x66, 0x3a, 0xa2, 0x24, 0x7e, - 0x19, 0xd0, 0x1e, 0xe9, 0x32, 0xdc, 0x79, 0xd1, 0x97, 0x9e, 0x67, 0x21, 0x37, 0x98, 0xea, 0x1c, - 0xf5, 0x6c, 0x0c, 0x0b, 0x5a, 0xb5, 0xc0, 0xde, 0x85, 0x62, 0x22, 0xc3, 0x8d, 0xb8, 0x2f, 0x9a, - 0xb4, 0xa4, 0x36, 0x3e, 0xb3, 0xf1, 0x80, 0xf8, 0xb8, 0x75, 0x5c, 0x9f, 0x49, 0xae, 0x42, 0xb6, - 0x27, 0x80, 0x76, 0x3a, 0x1d, 0x0d, 0xd0, 0xa4, 0xfe, 0x84, 0x6f, 0x86, 0x70, 0x32, 0x5c, 0x46, - 0x38, 0x79, 0x02, 0xff, 0x67, 0x9d, 0xc8, 0x61, 0x9f, 0x1f, 0x69, 0xa5, 0x5e, 0xcc, 0x98, 0x98, - 0xdc, 0xff, 0xb3, 0xf5, 0x3d, 0x0f, 0xff, 0x72, 0x50, 0xf4, 0x1a, 0xf2, 0xe9, 0xcc, 0xa2, 0x8a, - 0x4a, 0x71, 0xfd, 0x48, 0x98, 0xf7, 0xc7, 0x28, 0xd2, 0x22, 0xf6, 0xe2, 0xbb, 0x9f, 0x7f, 0x3e, - 0xe7, 0xe6, 0x50, 0xc9, 0x55, 0xde, 0x90, 0xe9, 0x71, 0x40, 0x5f, 0x0c, 0x40, 0xd7, 0xe7, 0x13, - 0x6d, 0x68, 0xf2, 0x8e, 0x3c, 0x31, 0xe6, 0xe6, 0x2d, 0xd5, 0x82, 0x68, 0x85, 0x13, 0x55, 0x90, - 0x35, 0x44, 0x94, 0xca, 0x1b, 0x54, 0x42, 0x7c, 0x34, 0x60, 0x56, 0x1d, 0x40, 0xb4, 0xa6, 0xa9, - 0xa4, 0x9d, 0x68, 0xf3, 0xe1, 0x2d, 0x94, 0x82, 0x67, 0x8d, 0xf3, 0xd8, 0xa8, 0xa2, 0xf2, 0x28, - 0x73, 0xe1, 0x9e, 0x50, 0xef, 0x14, 0xbd, 0x37, 0x60, 0x56, 0x1d, 0x24, 0x2d, 0x91, 0x76, 0xa4, - 0xb5, 0x44, 0xfa, 0xa9, 0xb4, 0x97, 0x39, 0xd1, 0x3d, 0xb4, 0x30, 0x86, 0x08, 0xbd, 0x81, 0x69, - 0xf9, 0x12, 0x46, 0xb6, 0xce, 0xad, 0x7a, 0x7f, 0x99, 0xcb, 0x63, 0x35, 0xa2, 0xf2, 0x3a, 0xaf, - 0xfc, 0x00, 0xd9, 0xae, 0xfe, 0x3e, 0x75, 0x4f, 0xe4, 0x1d, 0x78, 0x8a, 0xde, 0x1a, 0x50, 0xcc, - 0x5e, 0x1f, 0x68, 0x45, 0xef, 0x70, 0xf8, 0x12, 0x33, 0x57, 0x6f, 0xd4, 0x09, 0x9a, 0x0a, 0xa7, - 0x31, 0x51, 0x79, 0x04, 0x0d, 0xdb, 0xad, 0xfd, 0x38, 0xb7, 0x8c, 0xb3, 0x73, 0xcb, 0xf8, 0x7d, - 0x6e, 0x19, 0x9f, 0x2e, 0xac, 0xa9, 0xb3, 0x0b, 0x6b, 0xea, 0xd7, 0x85, 0x35, 0xf5, 0xea, 0xb1, - 0x4f, 0xe3, 0x76, 0xd2, 0x74, 0x5a, 0xe1, 0xa1, 0x1b, 0x25, 0xac, 0xcd, 0xb9, 0xf9, 0xd3, 0x26, - 0x7f, 0xdc, 0x0c, 0x42, 0x8f, 0xb8, 0xfd, 0x4c, 0x66, 0xfe, 0x39, 0xd1, 0xcc, 0xf3, 0xaf, 0x80, - 0xed, 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x67, 0x0b, 0x8a, 0x2c, 0xb1, 0x08, 0x00, 0x00, + // 862 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x96, 0x41, 0x6f, 0xeb, 0x44, + 0x10, 0xc7, 0xbb, 0x41, 0x94, 0x64, 0x92, 0xd7, 0xc3, 0x12, 0x4a, 0xe2, 0xf6, 0xb9, 0x79, 0x6e, + 0x69, 0x43, 0x69, 0x6d, 0xa5, 0x15, 0x15, 0x27, 0x24, 0x5a, 0x89, 0xaa, 0x52, 0x91, 0x42, 0x04, + 0x17, 0x2e, 0xd1, 0xc6, 0x5e, 0x39, 0x16, 0x89, 0xed, 0x66, 0xed, 0x28, 0x55, 0x55, 0x21, 0x40, + 0x5c, 0xe0, 0x00, 0x12, 0x27, 0xc4, 0x81, 0x1b, 0x1f, 0x84, 0x13, 0xc7, 0x4a, 0x5c, 0x38, 0xa2, + 0x96, 0x0f, 0xf2, 0x94, 0xf5, 0xda, 0xf1, 0xa6, 0x76, 0xda, 0x43, 0x6e, 0xeb, 0x9d, 0x99, 0x9d, + 0xdf, 0x7f, 0x76, 0xac, 0x59, 0xa8, 0x85, 0x74, 0x42, 0xcd, 0x30, 0xf0, 0x46, 0xc6, 0xb8, 0x65, + 0x5c, 0x85, 0x74, 0x74, 0xad, 0xfb, 0x23, 0x2f, 0xf0, 0x70, 0x25, 0xb1, 0xe8, 0xe3, 0x96, 0xb2, + 0x69, 0x7b, 0x9e, 0x3d, 0xa0, 0x06, 0xf1, 0x1d, 0x83, 0xb8, 0xae, 0x17, 0x90, 0xc0, 0xf1, 0x5c, + 0x16, 0xf9, 0x2a, 0xf2, 0x29, 0xc1, 0xb5, 0x4f, 0x63, 0xcb, 0xa6, 0x64, 0xb1, 0x09, 0xeb, 0xfa, + 0x23, 0xc7, 0xa4, 0xc2, 0xfa, 0x52, 0xb2, 0x9a, 0x7d, 0xe2, 0xb8, 0xdd, 0x21, 0x0d, 0x88, 0x30, + 0xef, 0x9b, 0x1e, 0x1b, 0x7a, 0xcc, 0xe8, 0x11, 0x46, 0x23, 0x36, 0x63, 0xdc, 0xea, 0xd1, 0x80, + 0xb4, 0x0c, 0x9f, 0xd8, 0x8e, 0xcb, 0x19, 0x22, 0x5f, 0xad, 0x05, 0xd5, 0xcf, 0xa7, 0x1e, 0xe7, + 0x84, 0xb5, 0xa7, 0x19, 0x3a, 0xf4, 0x2a, 0xa4, 0x2c, 0xc0, 0x75, 0x28, 0x46, 0xe7, 0x3a, 0x56, + 0x0d, 0x35, 0x50, 0xb3, 0xd4, 0x79, 0x8b, 0x7f, 0x5f, 0x58, 0xda, 0x25, 0xbc, 0x33, 0x17, 0xc2, + 0x7c, 0xcf, 0x65, 0x14, 0x1f, 0x43, 0x29, 0x21, 0xe5, 0x41, 0xe5, 0xa3, 0x75, 0x3d, 0x5d, 0x0e, + 0x3d, 0x09, 0x29, 0xda, 0x62, 0xa5, 0xf5, 0xa0, 0xc6, 0x4f, 0xfb, 0x64, 0x30, 0x88, 0xad, 0x2c, + 0x86, 0xf8, 0x14, 0x60, 0x06, 0x2c, 0x4e, 0xdc, 0xd5, 0x23, 0x75, 0xfa, 0x54, 0x9d, 0x1e, 0x55, + 0x5e, 0xa8, 0xd3, 0xdb, 0xc4, 0x8e, 0x05, 0x74, 0x52, 0x91, 0xda, 0xef, 0x08, 0xea, 0x19, 0x49, + 0x04, 0xf6, 0x87, 0x00, 0x09, 0x36, 0xab, 0xa1, 0xc6, 0x1b, 0x0b, 0xb8, 0x4b, 0x31, 0x37, 0xc3, + 0xe7, 0x12, 0x5c, 0x81, 0xc3, 0xed, 0x3d, 0x09, 0x17, 0xe5, 0x94, 0xe8, 0x8e, 0x44, 0x3d, 0xcf, + 0xa6, 0xf5, 0xfd, 0x8c, 0x06, 0xe4, 0x19, 0x77, 0xd0, 0x86, 0xf5, 0xf9, 0x18, 0xa1, 0xe6, 0x04, + 0x60, 0xd6, 0x10, 0xa2, 0x66, 0xef, 0xca, 0x6a, 0x66, 0x41, 0x25, 0x33, 0x5e, 0x6a, 0xe6, 0xac, + 0x44, 0x89, 0x7d, 0xe9, 0x17, 0xf1, 0x07, 0x02, 0x25, 0x2b, 0x8b, 0x60, 0xff, 0x08, 0xca, 0x33, + 0xf6, 0xf8, 0x2a, 0x72, 0xe1, 0x21, 0x81, 0x5f, 0xe2, 0x65, 0x54, 0x01, 0x73, 0xc0, 0x36, 0x19, + 0x91, 0x61, 0xac, 0x5f, 0x3b, 0x83, 0xb7, 0xa5, 0x5d, 0xc1, 0x7b, 0x00, 0xab, 0x3e, 0xdf, 0x11, + 0x25, 0xa9, 0xca, 0xa8, 0xc2, 0x5b, 0xf8, 0x68, 0x7d, 0x50, 0x63, 0xed, 0x6d, 0xea, 0x5a, 0x8e, + 0x6b, 0x5f, 0xb8, 0x3d, 0x2f, 0x74, 0xad, 0xa5, 0x97, 0xf9, 0x27, 0x04, 0x5b, 0xb9, 0xa9, 0x04, + 0xfb, 0x16, 0x94, 0x9d, 0x68, 0xaf, 0xeb, 0x58, 0x51, 0xad, 0x4b, 0x1d, 0x10, 0x5b, 0x17, 0xd6, + 0x12, 0x4b, 0x7a, 0x20, 0xee, 0xfc, 0x9c, 0x06, 0x5f, 0xba, 0xce, 0x98, 0x8e, 0x18, 0x19, 0x7c, + 0x31, 0x89, 0x35, 0xaf, 0x41, 0x21, 0x69, 0xef, 0x82, 0x63, 0x69, 0x04, 0x36, 0x32, 0xbd, 0x05, + 0xf6, 0x29, 0x54, 0xc2, 0x78, 0xbb, 0x1b, 0x4c, 0x44, 0x91, 0xb6, 0xe4, 0xc2, 0xa7, 0x02, 0x2f, + 0xa9, 0x4d, 0xcc, 0xeb, 0x4e, 0x39, 0x9c, 0x6d, 0x69, 0xd6, 0xac, 0x09, 0x33, 0x80, 0x96, 0x75, + 0x09, 0x7f, 0x22, 0xa1, 0x64, 0x3e, 0x8d, 0x50, 0xf2, 0x31, 0xbc, 0x48, 0x2b, 0x89, 0xdb, 0xbd, + 0x9e, 0x2b, 0xa5, 0x53, 0x49, 0x89, 0x58, 0xde, 0xfd, 0x1c, 0xfd, 0x55, 0x84, 0x37, 0x39, 0x28, + 0xfe, 0x1a, 0x56, 0xa3, 0x9e, 0xc5, 0x0d, 0x99, 0xe2, 0xf1, 0x2f, 0xa1, 0xbc, 0x5a, 0xe0, 0x11, + 0x25, 0xd1, 0x36, 0xbf, 0xfb, 0xe7, 0xff, 0x5f, 0x0b, 0xeb, 0xb8, 0x6a, 0x48, 0xf3, 0x2a, 0xfa, + 0x1d, 0xf0, 0x6f, 0x08, 0xf0, 0xe3, 0xfe, 0xc4, 0x07, 0x19, 0xe7, 0xe6, 0xfe, 0x31, 0xca, 0xe1, + 0x33, 0xbd, 0x05, 0xd1, 0x2e, 0x27, 0x6a, 0x60, 0x75, 0x8e, 0x28, 0x72, 0xef, 0x3a, 0x31, 0xc4, + 0xcf, 0x08, 0xd6, 0xe4, 0x06, 0xc4, 0xcd, 0x8c, 0x4c, 0x99, 0x1d, 0xad, 0xbc, 0xff, 0x0c, 0x4f, + 0xc1, 0xd3, 0xe4, 0x3c, 0x1a, 0x6e, 0xc8, 0x3c, 0x52, 0x5f, 0x18, 0x37, 0x8e, 0x75, 0x8b, 0x7f, + 0x44, 0xb0, 0x26, 0x37, 0x52, 0x26, 0x51, 0x66, 0x4b, 0x67, 0x12, 0x65, 0x77, 0xa5, 0xb6, 0xcd, + 0x89, 0x5e, 0xe2, 0x8d, 0x05, 0x44, 0xf8, 0x1b, 0x28, 0xc6, 0x13, 0x11, 0x6b, 0x59, 0x6a, 0xe5, + 0xc7, 0x84, 0xb2, 0xbd, 0xd0, 0x47, 0x64, 0xde, 0xe7, 0x99, 0x77, 0xb0, 0x66, 0x64, 0xbf, 0x7d, + 0x8c, 0x9b, 0x78, 0x18, 0xde, 0xe2, 0x6f, 0x11, 0x54, 0xd2, 0xb3, 0x1c, 0xef, 0x66, 0x2b, 0x9c, + 0x7f, 0x51, 0x28, 0x7b, 0x4f, 0xfa, 0x09, 0x9a, 0x06, 0xa7, 0x51, 0x70, 0x2d, 0x87, 0x86, 0xe1, + 0xef, 0x11, 0x94, 0x92, 0x61, 0x84, 0xb3, 0x24, 0xce, 0x0f, 0x74, 0x65, 0x67, 0xb1, 0x93, 0x48, + 0xfd, 0x01, 0x4f, 0xfd, 0x1e, 0xde, 0x36, 0x72, 0x9e, 0x79, 0xe9, 0x4a, 0xfc, 0x80, 0xe0, 0x85, + 0x34, 0x4c, 0x71, 0x8e, 0xc4, 0x47, 0x43, 0x5d, 0x69, 0x3e, 0xed, 0x28, 0x88, 0x5e, 0x71, 0xa2, + 0x0d, 0x5c, 0xcf, 0x23, 0x62, 0xa7, 0xed, 0xbf, 0xef, 0x55, 0x74, 0x77, 0xaf, 0xa2, 0xff, 0xee, + 0x55, 0xf4, 0xcb, 0x83, 0xba, 0x72, 0xf7, 0xa0, 0xae, 0xfc, 0xfb, 0xa0, 0xae, 0x7c, 0x75, 0x62, + 0x3b, 0x41, 0x3f, 0xec, 0xe9, 0xa6, 0x37, 0x34, 0xfc, 0x90, 0xf5, 0x79, 0x14, 0x5f, 0x1d, 0xf2, + 0xe5, 0xa1, 0xeb, 0x59, 0xd4, 0x98, 0xa4, 0x8e, 0xe6, 0x0f, 0xe1, 0xde, 0x2a, 0x7f, 0xa0, 0x1e, + 0xbf, 0x0e, 0x00, 0x00, 0xff, 0xff, 0x1e, 0x2c, 0x9d, 0xe7, 0x6b, 0x0b, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -671,6 +869,10 @@ type QueryClient interface { GasPrice(ctx context.Context, in *QueryGasPriceRequest, opts ...grpc.CallOption) (*QueryGasPriceResponse, error) // 🔹 Queries all gas prices across chains AllGasPrices(ctx context.Context, in *QueryAllGasPricesRequest, opts ...grpc.CallOption) (*QueryAllGasPricesResponse, error) + // 🔹 Queries chain meta for a specific chain + ChainMeta(ctx context.Context, in *QueryChainMetaRequest, opts ...grpc.CallOption) (*QueryChainMetaResponse, error) + // 🔹 Queries all chain metas across chains + AllChainMetas(ctx context.Context, in *QueryAllChainMetasRequest, opts ...grpc.CallOption) (*QueryAllChainMetasResponse, error) } type queryClient struct { @@ -735,6 +937,24 @@ func (c *queryClient) AllGasPrices(ctx context.Context, in *QueryAllGasPricesReq return out, nil } +func (c *queryClient) ChainMeta(ctx context.Context, in *QueryChainMetaRequest, opts ...grpc.CallOption) (*QueryChainMetaResponse, error) { + out := new(QueryChainMetaResponse) + err := c.cc.Invoke(ctx, "/uexecutor.v1.Query/ChainMeta", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *queryClient) AllChainMetas(ctx context.Context, in *QueryAllChainMetasRequest, opts ...grpc.CallOption) (*QueryAllChainMetasResponse, error) { + out := new(QueryAllChainMetasResponse) + err := c.cc.Invoke(ctx, "/uexecutor.v1.Query/AllChainMetas", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // QueryServer is the server API for Query service. type QueryServer interface { // Params queries all parameters of the module. @@ -749,6 +969,10 @@ type QueryServer interface { GasPrice(context.Context, *QueryGasPriceRequest) (*QueryGasPriceResponse, error) // 🔹 Queries all gas prices across chains AllGasPrices(context.Context, *QueryAllGasPricesRequest) (*QueryAllGasPricesResponse, error) + // 🔹 Queries chain meta for a specific chain + ChainMeta(context.Context, *QueryChainMetaRequest) (*QueryChainMetaResponse, error) + // 🔹 Queries all chain metas across chains + AllChainMetas(context.Context, *QueryAllChainMetasRequest) (*QueryAllChainMetasResponse, error) } // UnimplementedQueryServer can be embedded to have forward compatible implementations. @@ -773,6 +997,12 @@ func (*UnimplementedQueryServer) GasPrice(ctx context.Context, req *QueryGasPric func (*UnimplementedQueryServer) AllGasPrices(ctx context.Context, req *QueryAllGasPricesRequest) (*QueryAllGasPricesResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method AllGasPrices not implemented") } +func (*UnimplementedQueryServer) ChainMeta(ctx context.Context, req *QueryChainMetaRequest) (*QueryChainMetaResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ChainMeta not implemented") +} +func (*UnimplementedQueryServer) AllChainMetas(ctx context.Context, req *QueryAllChainMetasRequest) (*QueryAllChainMetasResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method AllChainMetas not implemented") +} func RegisterQueryServer(s grpc1.Server, srv QueryServer) { s.RegisterService(&_Query_serviceDesc, srv) @@ -886,6 +1116,42 @@ func _Query_AllGasPrices_Handler(srv interface{}, ctx context.Context, dec func( return interceptor(ctx, in, info, handler) } +func _Query_ChainMeta_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryChainMetaRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).ChainMeta(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/uexecutor.v1.Query/ChainMeta", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).ChainMeta(ctx, req.(*QueryChainMetaRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Query_AllChainMetas_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryAllChainMetasRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).AllChainMetas(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/uexecutor.v1.Query/AllChainMetas", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).AllChainMetas(ctx, req.(*QueryAllChainMetasRequest)) + } + return interceptor(ctx, in, info, handler) +} + var _Query_serviceDesc = grpc.ServiceDesc{ ServiceName: "uexecutor.v1.Query", HandlerType: (*QueryServer)(nil), @@ -914,6 +1180,14 @@ var _Query_serviceDesc = grpc.ServiceDesc{ MethodName: "AllGasPrices", Handler: _Query_AllGasPrices_Handler, }, + { + MethodName: "ChainMeta", + Handler: _Query_ChainMeta_Handler, + }, + { + MethodName: "AllChainMetas", + Handler: _Query_AllChainMetas_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "uexecutor/v1/query.proto", @@ -1068,7 +1342,7 @@ func (m *QueryAllGasPricesResponse) MarshalToSizedBuffer(dAtA []byte) (int, erro return len(dAtA) - i, nil } -func (m *QueryParamsRequest) Marshal() (dAtA []byte, err error) { +func (m *QueryChainMetaRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1078,20 +1352,27 @@ func (m *QueryParamsRequest) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *QueryParamsRequest) MarshalTo(dAtA []byte) (int, error) { +func (m *QueryChainMetaRequest) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *QueryParamsRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *QueryChainMetaRequest) 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 + } return len(dAtA) - i, nil } -func (m *QueryParamsResponse) Marshal() (dAtA []byte, err error) { +func (m *QueryChainMetaResponse) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1101,19 +1382,19 @@ func (m *QueryParamsResponse) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *QueryParamsResponse) MarshalTo(dAtA []byte) (int, error) { +func (m *QueryChainMetaResponse) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *QueryParamsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *QueryChainMetaResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - if m.Params != nil { + if m.ChainMeta != nil { { - size, err := m.Params.MarshalToSizedBuffer(dAtA[:i]) + size, err := m.ChainMeta.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -1126,7 +1407,7 @@ func (m *QueryParamsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *QueryAllPendingInboundsRequest) Marshal() (dAtA []byte, err error) { +func (m *QueryAllChainMetasRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1136,12 +1417,12 @@ func (m *QueryAllPendingInboundsRequest) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *QueryAllPendingInboundsRequest) MarshalTo(dAtA []byte) (int, error) { +func (m *QueryAllChainMetasRequest) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *QueryAllPendingInboundsRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *QueryAllChainMetasRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -1161,7 +1442,7 @@ func (m *QueryAllPendingInboundsRequest) MarshalToSizedBuffer(dAtA []byte) (int, return len(dAtA) - i, nil } -func (m *QueryAllPendingInboundsResponse) Marshal() (dAtA []byte, err error) { +func (m *QueryAllChainMetasResponse) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1171,12 +1452,12 @@ func (m *QueryAllPendingInboundsResponse) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *QueryAllPendingInboundsResponse) MarshalTo(dAtA []byte) (int, error) { +func (m *QueryAllChainMetasResponse) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *QueryAllPendingInboundsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *QueryAllChainMetasResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -1193,11 +1474,16 @@ func (m *QueryAllPendingInboundsResponse) MarshalToSizedBuffer(dAtA []byte) (int i-- dAtA[i] = 0x12 } - if len(m.InboundIds) > 0 { - for iNdEx := len(m.InboundIds) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.InboundIds[iNdEx]) - copy(dAtA[i:], m.InboundIds[iNdEx]) - i = encodeVarintQuery(dAtA, i, uint64(len(m.InboundIds[iNdEx]))) + if len(m.ChainMetas) > 0 { + for iNdEx := len(m.ChainMetas) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.ChainMetas[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } i-- dAtA[i] = 0xa } @@ -1205,7 +1491,7 @@ func (m *QueryAllPendingInboundsResponse) MarshalToSizedBuffer(dAtA []byte) (int return len(dAtA) - i, nil } -func (m *QueryGetUniversalTxRequest) Marshal() (dAtA []byte, err error) { +func (m *QueryParamsRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1215,27 +1501,20 @@ func (m *QueryGetUniversalTxRequest) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *QueryGetUniversalTxRequest) MarshalTo(dAtA []byte) (int, error) { +func (m *QueryParamsRequest) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *QueryGetUniversalTxRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *QueryParamsRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintQuery(dAtA, i, uint64(len(m.Id))) - i-- - dAtA[i] = 0xa - } return len(dAtA) - i, nil } -func (m *QueryGetUniversalTxResponse) Marshal() (dAtA []byte, err error) { +func (m *QueryParamsResponse) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1245,19 +1524,19 @@ func (m *QueryGetUniversalTxResponse) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *QueryGetUniversalTxResponse) MarshalTo(dAtA []byte) (int, error) { +func (m *QueryParamsResponse) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *QueryGetUniversalTxResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *QueryParamsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - if m.UniversalTx != nil { + if m.Params != nil { { - size, err := m.UniversalTx.MarshalToSizedBuffer(dAtA[:i]) + size, err := m.Params.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -1270,7 +1549,7 @@ func (m *QueryGetUniversalTxResponse) MarshalToSizedBuffer(dAtA []byte) (int, er return len(dAtA) - i, nil } -func (m *QueryAllUniversalTxRequest) Marshal() (dAtA []byte, err error) { +func (m *QueryAllPendingInboundsRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1280,12 +1559,12 @@ func (m *QueryAllUniversalTxRequest) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *QueryAllUniversalTxRequest) MarshalTo(dAtA []byte) (int, error) { +func (m *QueryAllPendingInboundsRequest) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *QueryAllUniversalTxRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *QueryAllPendingInboundsRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -1305,7 +1584,7 @@ func (m *QueryAllUniversalTxRequest) MarshalToSizedBuffer(dAtA []byte) (int, err return len(dAtA) - i, nil } -func (m *QueryAllUniversalTxResponse) Marshal() (dAtA []byte, err error) { +func (m *QueryAllPendingInboundsResponse) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1315,12 +1594,12 @@ func (m *QueryAllUniversalTxResponse) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *QueryAllUniversalTxResponse) MarshalTo(dAtA []byte) (int, error) { +func (m *QueryAllPendingInboundsResponse) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *QueryAllUniversalTxResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *QueryAllPendingInboundsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -1337,19 +1616,163 @@ func (m *QueryAllUniversalTxResponse) MarshalToSizedBuffer(dAtA []byte) (int, er i-- dAtA[i] = 0x12 } - if len(m.UniversalTxs) > 0 { - for iNdEx := len(m.UniversalTxs) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.UniversalTxs[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } + if len(m.InboundIds) > 0 { + for iNdEx := len(m.InboundIds) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.InboundIds[iNdEx]) + copy(dAtA[i:], m.InboundIds[iNdEx]) + i = encodeVarintQuery(dAtA, i, uint64(len(m.InboundIds[iNdEx]))) + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *QueryGetUniversalTxRequest) 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 *QueryGetUniversalTxRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryGetUniversalTxRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintQuery(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *QueryGetUniversalTxResponse) 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 *QueryGetUniversalTxResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryGetUniversalTxResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.UniversalTx != nil { + { + size, err := m.UniversalTx.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 *QueryAllUniversalTxRequest) 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 *QueryAllUniversalTxRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryAllUniversalTxRequest) 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 *QueryAllUniversalTxResponse) 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 *QueryAllUniversalTxResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryAllUniversalTxResponse) 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.UniversalTxs) > 0 { + for iNdEx := len(m.UniversalTxs) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.UniversalTxs[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 } @@ -1423,6 +1846,64 @@ func (m *QueryAllGasPricesResponse) Size() (n int) { return n } +func (m *QueryChainMetaRequest) 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)) + } + return n +} + +func (m *QueryChainMetaResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.ChainMeta != nil { + l = m.ChainMeta.Size() + n += 1 + l + sovQuery(uint64(l)) + } + return n +} + +func (m *QueryAllChainMetasRequest) 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 *QueryAllChainMetasResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.ChainMetas) > 0 { + for _, e := range m.ChainMetas { + 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 *QueryParamsRequest) Size() (n int) { if m == nil { return 0 @@ -1915,6 +2396,380 @@ func (m *QueryAllGasPricesResponse) Unmarshal(dAtA []byte) error { } return nil } +func (m *QueryChainMetaRequest) 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: QueryChainMetaRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryChainMetaRequest: 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 ErrIntOverflowQuery + } + 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 ErrInvalidLengthQuery + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ChainId = string(dAtA[iNdEx:postIndex]) + 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 *QueryChainMetaResponse) 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: QueryChainMetaResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryChainMetaResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ChainMeta", 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.ChainMeta == nil { + m.ChainMeta = &ChainMeta{} + } + if err := m.ChainMeta.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 *QueryAllChainMetasRequest) 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: QueryAllChainMetasRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryAllChainMetasRequest: 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 *QueryAllChainMetasResponse) 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: QueryAllChainMetasResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryAllChainMetasResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ChainMetas", 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.ChainMetas = append(m.ChainMetas, &ChainMeta{}) + if err := m.ChainMetas[len(m.ChainMetas)-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 *QueryParamsRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/x/uexecutor/types/query.pb.gw.go b/x/uexecutor/types/query.pb.gw.go index cb34f647..1317b283 100644 --- a/x/uexecutor/types/query.pb.gw.go +++ b/x/uexecutor/types/query.pb.gw.go @@ -267,6 +267,96 @@ func local_request_Query_AllGasPrices_0(ctx context.Context, marshaler runtime.M } +func request_Query_ChainMeta_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryChainMetaRequest + 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) + } + + msg, err := client.ChainMeta(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_ChainMeta_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryChainMetaRequest + 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) + } + + msg, err := server.ChainMeta(ctx, &protoReq) + return msg, metadata, err + +} + +var ( + filter_Query_AllChainMetas_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} +) + +func request_Query_AllChainMetas_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryAllChainMetasRequest + 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_AllChainMetas_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.AllChainMetas(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_AllChainMetas_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryAllChainMetasRequest + 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_AllChainMetas_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.AllChainMetas(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. @@ -411,6 +501,52 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv }) + mux.Handle("GET", pattern_Query_ChainMeta_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_ChainMeta_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_ChainMeta_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_AllChainMetas_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_AllChainMetas_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_AllChainMetas_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -572,6 +708,46 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie }) + mux.Handle("GET", pattern_Query_ChainMeta_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_ChainMeta_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_ChainMeta_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_AllChainMetas_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_AllChainMetas_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_AllChainMetas_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -587,6 +763,10 @@ var ( pattern_Query_GasPrice_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"uexecutor", "v1", "gas_price", "chain_id"}, "", runtime.AssumeColonVerbOpt(false))) pattern_Query_AllGasPrices_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"uexecutor", "v1", "gas_prices"}, "", runtime.AssumeColonVerbOpt(false))) + + pattern_Query_ChainMeta_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"uexecutor", "v1", "chain_meta", "chain_id"}, "", runtime.AssumeColonVerbOpt(false))) + + pattern_Query_AllChainMetas_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"uexecutor", "v1", "chain_metas"}, "", runtime.AssumeColonVerbOpt(false))) ) var ( @@ -601,4 +781,8 @@ var ( forward_Query_GasPrice_0 = runtime.ForwardResponseMessage forward_Query_AllGasPrices_0 = runtime.ForwardResponseMessage + + forward_Query_ChainMeta_0 = runtime.ForwardResponseMessage + + forward_Query_AllChainMetas_0 = runtime.ForwardResponseMessage ) From 1b3236a6a24cbb5398856056ce9155d9e8101806 Mon Sep 17 00:00:00 2001 From: Nilesh Gupta Date: Thu, 12 Mar 2026 16:12:50 +0530 Subject: [PATCH 18/36] tests: added integration tests for chain meta queries --- .../uexecutor/query_chain_meta_test.go | 156 ++++++++++++++++++ 1 file changed, 156 insertions(+) create mode 100644 test/integration/uexecutor/query_chain_meta_test.go diff --git a/test/integration/uexecutor/query_chain_meta_test.go b/test/integration/uexecutor/query_chain_meta_test.go new file mode 100644 index 00000000..2e63dbc5 --- /dev/null +++ b/test/integration/uexecutor/query_chain_meta_test.go @@ -0,0 +1,156 @@ +package integrationtest + +import ( + "testing" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/stretchr/testify/require" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + + utils "github.com/pushchain/push-chain-node/test/utils" + uexecutorkeeper "github.com/pushchain/push-chain-node/x/uexecutor/keeper" + uexecutortypes "github.com/pushchain/push-chain-node/x/uexecutor/types" +) + +// TestQueryChainMeta tests the ChainMeta and AllChainMetas query handlers +func TestQueryChainMeta(t *testing.T) { + chainId := "eip155:11155111" + chainId2 := "eip155:1" + + t.Run("returns not found when chain meta absent", func(t *testing.T) { + testApp, ctx, _, _ := utils.SetAppWithMultipleValidators(t, 1) + + querier := uexecutorkeeper.NewQuerier(testApp.UexecutorKeeper) + _, err := querier.ChainMeta(ctx, &uexecutortypes.QueryChainMetaRequest{ChainId: chainId}) + require.Error(t, err) + require.Equal(t, codes.NotFound, status.Code(err)) + }) + + t.Run("returns error for empty chain_id", func(t *testing.T) { + testApp, ctx, _, _ := utils.SetAppWithMultipleValidators(t, 1) + + querier := uexecutorkeeper.NewQuerier(testApp.UexecutorKeeper) + _, err := querier.ChainMeta(ctx, &uexecutortypes.QueryChainMetaRequest{ChainId: ""}) + require.Error(t, err) + require.Equal(t, codes.InvalidArgument, status.Code(err)) + }) + + t.Run("returns chain meta after vote", func(t *testing.T) { + testApp, ctx, uvals, vals := setupVoteChainMetaTest(t, 2) + + coreVal0, _ := sdk.ValAddressFromBech32(vals[0].OperatorAddress) + coreVal1, _ := sdk.ValAddressFromBech32(vals[1].OperatorAddress) + + require.NoError(t, utils.ExecVoteChainMeta(t, ctx, testApp, uvals[0], sdk.AccAddress(coreVal0).String(), chainId, 100_000_000_000, 12345, 1700000000)) + require.NoError(t, utils.ExecVoteChainMeta(t, ctx, testApp, uvals[1], sdk.AccAddress(coreVal1).String(), chainId, 200_000_000_000, 12346, 1700000001)) + + querier := uexecutorkeeper.NewQuerier(testApp.UexecutorKeeper) + resp, err := querier.ChainMeta(ctx, &uexecutortypes.QueryChainMetaRequest{ChainId: chainId}) + require.NoError(t, err) + require.NotNil(t, resp.ChainMeta) + require.Equal(t, chainId, resp.ChainMeta.ObservedChainId) + require.Len(t, resp.ChainMeta.Prices, 2) + require.Len(t, resp.ChainMeta.ChainHeights, 2) + require.Len(t, resp.ChainMeta.ObservedAts, 2) + }) + + t.Run("all chain metas returns empty when nothing stored", func(t *testing.T) { + testApp, ctx, _, _ := utils.SetAppWithMultipleValidators(t, 1) + + querier := uexecutorkeeper.NewQuerier(testApp.UexecutorKeeper) + resp, err := querier.AllChainMetas(ctx, &uexecutortypes.QueryAllChainMetasRequest{}) + require.NoError(t, err) + require.Empty(t, resp.ChainMetas) + }) + + t.Run("all chain metas returns all entries", func(t *testing.T) { + testApp, ctx, _, _ := utils.SetAppWithMultipleValidators(t, 1) + + require.NoError(t, testApp.UexecutorKeeper.SetChainMeta(ctx, chainId, uexecutortypes.ChainMeta{ + ObservedChainId: chainId, + Signers: []string{"cosmos1abc"}, + Prices: []uint64{100}, + ChainHeights: []uint64{1}, + ObservedAts: []uint64{0}, + MedianIndex: 0, + })) + require.NoError(t, testApp.UexecutorKeeper.SetChainMeta(ctx, chainId2, uexecutortypes.ChainMeta{ + ObservedChainId: chainId2, + Signers: []string{"cosmos1def"}, + Prices: []uint64{200}, + ChainHeights: []uint64{2}, + ObservedAts: []uint64{0}, + MedianIndex: 0, + })) + + querier := uexecutorkeeper.NewQuerier(testApp.UexecutorKeeper) + resp, err := querier.AllChainMetas(ctx, &uexecutortypes.QueryAllChainMetasRequest{}) + require.NoError(t, err) + require.Len(t, resp.ChainMetas, 2) + }) +} + +// TestQueryGasPriceFromChainMeta ensures the legacy GasPrice query routes through ChainMetas +func TestQueryGasPriceFromChainMeta(t *testing.T) { + chainId := "eip155:11155111" + + t.Run("gas price query reads from chain metas", func(t *testing.T) { + testApp, ctx, _, _ := utils.SetAppWithMultipleValidators(t, 1) + + require.NoError(t, testApp.UexecutorKeeper.SetChainMeta(ctx, chainId, uexecutortypes.ChainMeta{ + ObservedChainId: chainId, + Signers: []string{"cosmos1abc", "cosmos1def"}, + Prices: []uint64{100_000_000_000, 200_000_000_000}, + ChainHeights: []uint64{12345, 12346}, + ObservedAts: []uint64{17000000, 17000001}, + MedianIndex: 1, + })) + + querier := uexecutorkeeper.NewQuerier(testApp.UexecutorKeeper) + resp, err := querier.GasPrice(ctx, &uexecutortypes.QueryGasPriceRequest{ChainId: chainId}) + require.NoError(t, err) + require.NotNil(t, resp.GasPrice) + require.Equal(t, chainId, resp.GasPrice.ObservedChainId) + require.Equal(t, []uint64{100_000_000_000, 200_000_000_000}, resp.GasPrice.Prices) + // ChainHeights should be mapped back to BlockNums for backward compat + require.Equal(t, []uint64{12345, 12346}, resp.GasPrice.BlockNums) + require.Equal(t, uint64(1), resp.GasPrice.MedianIndex) + }) + + t.Run("gas price query falls back to legacy store when chain meta absent", func(t *testing.T) { + testApp, ctx, _, _ := utils.SetAppWithMultipleValidators(t, 1) + + require.NoError(t, testApp.UexecutorKeeper.SetGasPrice(ctx, chainId, uexecutortypes.GasPrice{ + ObservedChainId: chainId, + Signers: []string{"cosmos1abc"}, + Prices: []uint64{50_000_000_000}, + BlockNums: []uint64{9999}, + MedianIndex: 0, + })) + + querier := uexecutorkeeper.NewQuerier(testApp.UexecutorKeeper) + resp, err := querier.GasPrice(ctx, &uexecutortypes.QueryGasPriceRequest{ChainId: chainId}) + require.NoError(t, err) + require.Equal(t, uint64(50_000_000_000), resp.GasPrice.Prices[0]) + require.Equal(t, uint64(9999), resp.GasPrice.BlockNums[0]) + }) + + t.Run("all gas prices sources from chain metas", func(t *testing.T) { + testApp, ctx, _, _ := utils.SetAppWithMultipleValidators(t, 1) + + require.NoError(t, testApp.UexecutorKeeper.SetChainMeta(ctx, chainId, uexecutortypes.ChainMeta{ + ObservedChainId: chainId, + Prices: []uint64{100}, + ChainHeights: []uint64{1}, + ObservedAts: []uint64{0}, + MedianIndex: 0, + })) + + querier := uexecutorkeeper.NewQuerier(testApp.UexecutorKeeper) + resp, err := querier.AllGasPrices(ctx, &uexecutortypes.QueryAllGasPricesRequest{}) + require.NoError(t, err) + require.Len(t, resp.GasPrices, 1) + require.Equal(t, chainId, resp.GasPrices[0].ObservedChainId) + }) +} From 766dc91ac20c4ba00756a60b66a7f5c2aa933a3a Mon Sep 17 00:00:00 2001 From: Nilesh Gupta Date: Fri, 13 Mar 2026 15:20:51 +0530 Subject: [PATCH 19/36] feat: added abi of uniswap quoter v2 --- x/uexecutor/types/abi.go | 62 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/x/uexecutor/types/abi.go b/x/uexecutor/types/abi.go index c484d446..b318f58c 100644 --- a/x/uexecutor/types/abi.go +++ b/x/uexecutor/types/abi.go @@ -332,9 +332,58 @@ const UNIVERSAL_CORE_ABI = `[ "inputs": [{ "name": "", "type": "string", "internalType": "string" }], "outputs": [{ "name": "", "type": "uint256", "internalType": "uint256" }], "stateMutability": "view" + }, + { + "type": "function", + "name": "uniswapV3Quoter", + "inputs": [], + "outputs": [{ "name": "", "type": "address", "internalType": "address" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "WPC", + "inputs": [], + "outputs": [{ "name": "", "type": "address", "internalType": "address" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "defaultFeeTier", + "inputs": [{ "name": "", "type": "address", "internalType": "address" }], + "outputs": [{ "name": "", "type": "uint24", "internalType": "uint24" }], + "stateMutability": "view" } ]` +const UNISWAP_QUOTER_V2_ABI = `[ + { + "type": "function", + "name": "quoteExactInputSingle", + "inputs": [ + { + "name": "params", + "type": "tuple", + "internalType": "struct IQuoterV2.QuoteExactInputSingleParams", + "components": [ + { "name": "tokenIn", "type": "address", "internalType": "address" }, + { "name": "tokenOut", "type": "address", "internalType": "address" }, + { "name": "amountIn", "type": "uint256", "internalType": "uint256" }, + { "name": "fee", "type": "uint24", "internalType": "uint24" }, + { "name": "sqrtPriceLimitX96", "type": "uint160", "internalType": "uint160" } + ] + } + ], + "outputs": [ + { "name": "amountOut", "type": "uint256", "internalType": "uint256" }, + { "name": "sqrtPriceX96After", "type": "uint160", "internalType": "uint160" }, + { "name": "initializedTicksCrossed", "type": "uint32", "internalType": "uint32" }, + { "name": "gasEstimate", "type": "uint256", "internalType": "uint256" } + ], + "stateMutability": "nonpayable" + } +]` + const PRC20ABI = `[ { "type": "function", @@ -724,6 +773,10 @@ func ParseFactoryABI() (abi.ABI, error) { return abi.JSON(strings.NewReader(FactoryV1ABI)) } +func ParseUniswapQuoterV2ABI() (abi.ABI, error) { + return abi.JSON(strings.NewReader(UNISWAP_QUOTER_V2_ABI)) +} + func ParseUeaABI() (abi.ABI, error) { return abi.JSON(strings.NewReader(UeaV1ABI)) } @@ -801,3 +854,12 @@ func NewAbiUniversalAccountId(proto *UniversalAccountId) (AbiUniversalAccountId, Owner: owner, }, nil } + +// AbiQuoteExactInputSingleParams matches IQuoterV2.QuoteExactInputSingleParams +type AbiQuoteExactInputSingleParams struct { + TokenIn common.Address + TokenOut common.Address + AmountIn *big.Int + Fee *big.Int // uint24 + SqrtPriceLimitX96 *big.Int // uint160, 0 = no limit +} From 9586e9b3e8e176dd9d587667236bb559b9dd0963 Mon Sep 17 00:00:00 2001 From: Nilesh Gupta Date: Fri, 13 Mar 2026 15:21:58 +0530 Subject: [PATCH 20/36] feat: added evm getter methods for uniswap quoter --- x/uexecutor/keeper/evm.go | 129 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 124 insertions(+), 5 deletions(-) diff --git a/x/uexecutor/keeper/evm.go b/x/uexecutor/keeper/evm.go index 956ba68f..39fbe003 100644 --- a/x/uexecutor/keeper/evm.go +++ b/x/uexecutor/keeper/evm.go @@ -361,11 +361,130 @@ func (k Keeper) CallUniversalCoreSetChainMeta( ) } -// Calls Handler Contract to deposit prc20 tokens +// GetUniversalCoreQuoterAddress reads the uniswapV3Quoter address stored in UniversalCore. +func (k Keeper) GetUniversalCoreQuoterAddress(ctx sdk.Context) (common.Address, error) { + handlerAddr := common.HexToAddress(uregistrytypes.SYSTEM_CONTRACTS["UNIVERSAL_CORE"].Address) + + abi, err := types.ParseUniversalCoreABI() + if err != nil { + return common.Address{}, errors.Wrap(err, "failed to parse UniversalCore ABI") + } + + ueModuleAccAddress, _ := k.GetUeModuleAddress(ctx) + + receipt, err := k.evmKeeper.CallEVM(ctx, abi, ueModuleAccAddress, handlerAddr, false, "uniswapV3Quoter") + if err != nil { + return common.Address{}, errors.Wrap(err, "failed to call uniswapV3Quoter") + } + + results, err := abi.Methods["uniswapV3Quoter"].Outputs.Unpack(receipt.Ret) + if err != nil { + return common.Address{}, errors.Wrap(err, "failed to unpack uniswapV3Quoter result") + } + + return results[0].(common.Address), nil +} + +// GetUniversalCoreWPCAddress reads the WPC (wrapped PC) address stored in UniversalCore. +func (k Keeper) GetUniversalCoreWPCAddress(ctx sdk.Context) (common.Address, error) { + handlerAddr := common.HexToAddress(uregistrytypes.SYSTEM_CONTRACTS["UNIVERSAL_CORE"].Address) + + abi, err := types.ParseUniversalCoreABI() + if err != nil { + return common.Address{}, errors.Wrap(err, "failed to parse UniversalCore ABI") + } + + ueModuleAccAddress, _ := k.GetUeModuleAddress(ctx) + + receipt, err := k.evmKeeper.CallEVM(ctx, abi, ueModuleAccAddress, handlerAddr, false, "WPC") + if err != nil { + return common.Address{}, errors.Wrap(err, "failed to call WPC") + } + + results, err := abi.Methods["WPC"].Outputs.Unpack(receipt.Ret) + if err != nil { + return common.Address{}, errors.Wrap(err, "failed to unpack WPC result") + } + + return results[0].(common.Address), nil +} + +// GetDefaultFeeTierForToken reads defaultFeeTier[prc20] from UniversalCore. +func (k Keeper) GetDefaultFeeTierForToken(ctx sdk.Context, prc20Address common.Address) (*big.Int, error) { + handlerAddr := common.HexToAddress(uregistrytypes.SYSTEM_CONTRACTS["UNIVERSAL_CORE"].Address) + + abi, err := types.ParseUniversalCoreABI() + if err != nil { + return nil, errors.Wrap(err, "failed to parse UniversalCore ABI") + } + + ueModuleAccAddress, _ := k.GetUeModuleAddress(ctx) + + receipt, err := k.evmKeeper.CallEVM(ctx, abi, ueModuleAccAddress, handlerAddr, false, "defaultFeeTier", prc20Address) + if err != nil { + return nil, errors.Wrap(err, "failed to call defaultFeeTier") + } + + results, err := abi.Methods["defaultFeeTier"].Outputs.Unpack(receipt.Ret) + if err != nil { + return nil, errors.Wrap(err, "failed to unpack defaultFeeTier result") + } + + // go-ethereum unpacks uint24 as uint32 + fee, ok := results[0].(uint32) + if !ok { + return nil, fmt.Errorf("unexpected type for defaultFeeTier: %T", results[0]) + } + + return new(big.Int).SetUint64(uint64(fee)), nil +} + +// GetSwapQuote calls QuoterV2.quoteExactInputSingle (commit=false) to get the expected +// output amount for swapping prc20 → wpc. +func (k Keeper) GetSwapQuote( + ctx sdk.Context, + quoterAddr, prc20Address, wpcAddress common.Address, + fee, amount *big.Int, +) (*big.Int, error) { + quoterABI, err := types.ParseUniswapQuoterV2ABI() + if err != nil { + return nil, errors.Wrap(err, "failed to parse QuoterV2 ABI") + } + + ueModuleAccAddress, _ := k.GetUeModuleAddress(ctx) + + params := types.AbiQuoteExactInputSingleParams{ + TokenIn: prc20Address, + TokenOut: wpcAddress, + AmountIn: amount, + Fee: fee, + SqrtPriceLimitX96: big.NewInt(0), + } + + receipt, err := k.evmKeeper.CallEVM(ctx, quoterABI, ueModuleAccAddress, quoterAddr, false, "quoteExactInputSingle", params) + if err != nil { + return nil, errors.Wrap(err, "QuoterV2 quoteExactInputSingle failed") + } + + results, err := quoterABI.Methods["quoteExactInputSingle"].Outputs.Unpack(receipt.Ret) + if err != nil { + return nil, errors.Wrap(err, "failed to unpack quoteExactInputSingle result") + } + + amountOut, ok := results[0].(*big.Int) + if !ok { + return nil, fmt.Errorf("unexpected type for amountOut: %T", results[0]) + } + + return amountOut, nil +} + +// Calls Handler Contract to deposit prc20 tokens with auto-swap. +// fee and minPCOut must be pre-computed by the caller (see GetDefaultFeeTierForToken / GetSwapQuote). func (k Keeper) CallPRC20DepositAutoSwap( ctx sdk.Context, prc20Address, to common.Address, - amount *big.Int, + amount, fee, minPCOut *big.Int, ) (*evmtypes.MsgEthereumTxResponse, error) { handlerAddr := common.HexToAddress(uregistrytypes.SYSTEM_CONTRACTS["UNIVERSAL_CORE"].Address) @@ -402,8 +521,8 @@ func (k Keeper) CallPRC20DepositAutoSwap( prc20Address, amount, to, - big.NewInt(0), - big.NewInt(0), - big.NewInt(0), + fee, + minPCOut, + big.NewInt(0), // deadline = 0 → contract uses its default ) } From 9858c04c18be4547a8a1c92b7b7742714c8c8c54 Mon Sep 17 00:00:00 2001 From: Nilesh Gupta Date: Fri, 13 Mar 2026 15:22:40 +0530 Subject: [PATCH 21/36] feat: added fetching of minPC on chain side for inbound gas --- x/uexecutor/keeper/execute_inbound_gas.go | 48 ++++++++++++++++++++++- 1 file changed, 46 insertions(+), 2 deletions(-) diff --git a/x/uexecutor/keeper/execute_inbound_gas.go b/x/uexecutor/keeper/execute_inbound_gas.go index f1388e8e..3d28d083 100644 --- a/x/uexecutor/keeper/execute_inbound_gas.go +++ b/x/uexecutor/keeper/execute_inbound_gas.go @@ -87,12 +87,56 @@ func (k Keeper) ExecuteInboundGas(ctx context.Context, inbound types.Inbound) er } if execErr == nil { - // --- step 4: deposit + swap - receipt, execErr = k.CallPRC20DepositAutoSwap(sdkCtx, prc20AddressHex, ueaAddr, amount) + // --- step 4: fetch swap quote and compute minPCOut with 5% slippage + var ( + quoterAddr common.Address + wpcAddr common.Address + fee *big.Int + quote *big.Int + ) + + quoterAddr, execErr = k.GetUniversalCoreQuoterAddress(sdkCtx) if execErr != nil { shouldRevert = true revertReason = execErr.Error() } + + if execErr == nil { + wpcAddr, execErr = k.GetUniversalCoreWPCAddress(sdkCtx) + if execErr != nil { + shouldRevert = true + revertReason = execErr.Error() + } + } + + if execErr == nil { + fee, execErr = k.GetDefaultFeeTierForToken(sdkCtx, prc20AddressHex) + if execErr != nil { + shouldRevert = true + revertReason = execErr.Error() + } + } + + if execErr == nil { + quote, execErr = k.GetSwapQuote(sdkCtx, quoterAddr, prc20AddressHex, wpcAddr, fee, amount) + if execErr != nil { + shouldRevert = true + revertReason = execErr.Error() + } + } + + if execErr == nil { + // 5% slippage: minPCOut = quote * 95 / 100 + minPCOut := new(big.Int).Mul(quote, big.NewInt(95)) + minPCOut.Div(minPCOut, big.NewInt(100)) + + // --- step 5: deposit + swap + receipt, execErr = k.CallPRC20DepositAutoSwap(sdkCtx, prc20AddressHex, ueaAddr, amount, fee, minPCOut) + if execErr != nil { + shouldRevert = true + revertReason = execErr.Error() + } + } } } } From 84a2daeef4d5a4b38b1efdae787d95f18349c20c Mon Sep 17 00:00:00 2001 From: Nilesh Gupta Date: Fri, 13 Mar 2026 15:22:46 +0530 Subject: [PATCH 22/36] feat: added fetching of minPC on chain side for inbound gas and payload --- .../keeper/execute_inbound_gas_and_payload.go | 56 ++++++++++++++++--- 1 file changed, 48 insertions(+), 8 deletions(-) diff --git a/x/uexecutor/keeper/execute_inbound_gas_and_payload.go b/x/uexecutor/keeper/execute_inbound_gas_and_payload.go index b6b52fc1..9a9f4420 100644 --- a/x/uexecutor/keeper/execute_inbound_gas_and_payload.go +++ b/x/uexecutor/keeper/execute_inbound_gas_and_payload.go @@ -84,20 +84,60 @@ func (k Keeper) ExecuteInboundGasAndPayload(ctx context.Context, utx types.Unive } if execErr == nil { - // --- Step 4: deposit + autoswap + // --- Step 4: fetch swap quote and compute minPCOut with 5% slippage prc20AddressHex := common.HexToAddress( tokenConfig.NativeRepresentation.ContractAddress, ) - receipt, execErr = k.CallPRC20DepositAutoSwap( - sdkCtx, - prc20AddressHex, - ueaAddr, - amount, + + var ( + quoterAddr common.Address + wpcAddr common.Address + fee *big.Int + quote *big.Int ) + + quoterAddr, execErr = k.GetUniversalCoreQuoterAddress(sdkCtx) if execErr != nil { shouldRevert = true revertReason = execErr.Error() } + + if execErr == nil { + wpcAddr, execErr = k.GetUniversalCoreWPCAddress(sdkCtx) + if execErr != nil { + shouldRevert = true + revertReason = execErr.Error() + } + } + + if execErr == nil { + fee, execErr = k.GetDefaultFeeTierForToken(sdkCtx, prc20AddressHex) + if execErr != nil { + shouldRevert = true + revertReason = execErr.Error() + } + } + + if execErr == nil { + quote, execErr = k.GetSwapQuote(sdkCtx, quoterAddr, prc20AddressHex, wpcAddr, fee, amount) + if execErr != nil { + shouldRevert = true + revertReason = execErr.Error() + } + } + + if execErr == nil { + // 5% slippage: minPCOut = quote * 95 / 100 + minPCOut := new(big.Int).Mul(quote, big.NewInt(95)) + minPCOut.Div(minPCOut, big.NewInt(100)) + + // --- Step 5: deposit + autoswap + receipt, execErr = k.CallPRC20DepositAutoSwap(sdkCtx, prc20AddressHex, ueaAddr, amount, fee, minPCOut) + if execErr != nil { + shouldRevert = true + revertReason = execErr.Error() + } + } } } } @@ -160,7 +200,7 @@ func (k Keeper) ExecuteInboundGasAndPayload(ctx context.Context, utx types.Unive ueModuleAddr, _ := k.GetUeModuleAddress(ctx) - // --- Step 5: payload hash + // --- Step 6: payload hash payloadHashErr := k.StoreVerifiedPayloadHash(sdkCtx, utx, ueaAddr, ueModuleAddr) if payloadHashErr != nil { errorPcTx := types.PCTx{ @@ -177,7 +217,7 @@ func (k Keeper) ExecuteInboundGasAndPayload(ctx context.Context, utx types.Unive return nil } - // --- Step 6: execute payload + // --- Step 7: execute payload // ueaAddr is already resolved and validated in step 3 receipt, err = k.ExecutePayloadV2( ctx, From 83c4cdc08b66bc1df4e74c682125dae141af6b36 Mon Sep 17 00:00:00 2001 From: Nilesh Gupta Date: Fri, 13 Mar 2026 17:26:39 +0530 Subject: [PATCH 23/36] feat: added gas_price and gas_fee in Outbound proto --- proto/uexecutor/v1/types.proto | 2 ++ 1 file changed, 2 insertions(+) diff --git a/proto/uexecutor/v1/types.proto b/proto/uexecutor/v1/types.proto index 63a552fd..58fb1d06 100644 --- a/proto/uexecutor/v1/types.proto +++ b/proto/uexecutor/v1/types.proto @@ -167,6 +167,8 @@ message OutboundTx { Status outbound_status = 13; // status of outbound tx RevertInstructions revert_instructions = 14; PCTx pc_revert_execution = 15; + string gas_price = 16; // gas price on destination chain at time of outbound + string gas_fee = 17; // gas fee paid to relayer on destination chain } message UniversalTx { From 281bae659f576cd7c09b7f90e32eee0b97f13f0f Mon Sep 17 00:00:00 2001 From: Nilesh Gupta Date: Fri, 13 Mar 2026 17:26:51 +0530 Subject: [PATCH 24/36] refactor: added generated protobuf --- api/uexecutor/v1/types.pulsar.go | 423 +++++++++++++++++++++---------- 1 file changed, 287 insertions(+), 136 deletions(-) diff --git a/api/uexecutor/v1/types.pulsar.go b/api/uexecutor/v1/types.pulsar.go index 6f3d4cbd..e41fdf0c 100644 --- a/api/uexecutor/v1/types.pulsar.go +++ b/api/uexecutor/v1/types.pulsar.go @@ -5779,6 +5779,8 @@ var ( fd_OutboundTx_outbound_status protoreflect.FieldDescriptor fd_OutboundTx_revert_instructions protoreflect.FieldDescriptor fd_OutboundTx_pc_revert_execution protoreflect.FieldDescriptor + fd_OutboundTx_gas_price protoreflect.FieldDescriptor + fd_OutboundTx_gas_fee protoreflect.FieldDescriptor ) func init() { @@ -5799,6 +5801,8 @@ func init() { fd_OutboundTx_outbound_status = md_OutboundTx.Fields().ByName("outbound_status") fd_OutboundTx_revert_instructions = md_OutboundTx.Fields().ByName("revert_instructions") fd_OutboundTx_pc_revert_execution = md_OutboundTx.Fields().ByName("pc_revert_execution") + fd_OutboundTx_gas_price = md_OutboundTx.Fields().ByName("gas_price") + fd_OutboundTx_gas_fee = md_OutboundTx.Fields().ByName("gas_fee") } var _ protoreflect.Message = (*fastReflection_OutboundTx)(nil) @@ -5956,6 +5960,18 @@ func (x *fastReflection_OutboundTx) Range(f func(protoreflect.FieldDescriptor, p return } } + if x.GasPrice != "" { + value := protoreflect.ValueOfString(x.GasPrice) + if !f(fd_OutboundTx_gas_price, value) { + return + } + } + if x.GasFee != "" { + value := protoreflect.ValueOfString(x.GasFee) + if !f(fd_OutboundTx_gas_fee, value) { + return + } + } } // Has reports whether a field is populated. @@ -6001,6 +6017,10 @@ func (x *fastReflection_OutboundTx) Has(fd protoreflect.FieldDescriptor) bool { return x.RevertInstructions != nil case "uexecutor.v1.OutboundTx.pc_revert_execution": return x.PcRevertExecution != nil + case "uexecutor.v1.OutboundTx.gas_price": + return x.GasPrice != "" + case "uexecutor.v1.OutboundTx.gas_fee": + return x.GasFee != "" default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: uexecutor.v1.OutboundTx")) @@ -6047,6 +6067,10 @@ func (x *fastReflection_OutboundTx) Clear(fd protoreflect.FieldDescriptor) { x.RevertInstructions = nil case "uexecutor.v1.OutboundTx.pc_revert_execution": x.PcRevertExecution = nil + case "uexecutor.v1.OutboundTx.gas_price": + x.GasPrice = "" + case "uexecutor.v1.OutboundTx.gas_fee": + x.GasFee = "" default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: uexecutor.v1.OutboundTx")) @@ -6108,6 +6132,12 @@ func (x *fastReflection_OutboundTx) Get(descriptor protoreflect.FieldDescriptor) case "uexecutor.v1.OutboundTx.pc_revert_execution": value := x.PcRevertExecution return protoreflect.ValueOfMessage(value.ProtoReflect()) + case "uexecutor.v1.OutboundTx.gas_price": + value := x.GasPrice + return protoreflect.ValueOfString(value) + case "uexecutor.v1.OutboundTx.gas_fee": + value := x.GasFee + return protoreflect.ValueOfString(value) default: if descriptor.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: uexecutor.v1.OutboundTx")) @@ -6158,6 +6188,10 @@ func (x *fastReflection_OutboundTx) Set(fd protoreflect.FieldDescriptor, value p x.RevertInstructions = value.Message().Interface().(*RevertInstructions) case "uexecutor.v1.OutboundTx.pc_revert_execution": x.PcRevertExecution = value.Message().Interface().(*PCTx) + case "uexecutor.v1.OutboundTx.gas_price": + x.GasPrice = value.Interface().(string) + case "uexecutor.v1.OutboundTx.gas_fee": + x.GasFee = value.Interface().(string) default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: uexecutor.v1.OutboundTx")) @@ -6220,6 +6254,10 @@ func (x *fastReflection_OutboundTx) Mutable(fd protoreflect.FieldDescriptor) pro panic(fmt.Errorf("field id of message uexecutor.v1.OutboundTx is not mutable")) case "uexecutor.v1.OutboundTx.outbound_status": panic(fmt.Errorf("field outbound_status of message uexecutor.v1.OutboundTx is not mutable")) + case "uexecutor.v1.OutboundTx.gas_price": + panic(fmt.Errorf("field gas_price of message uexecutor.v1.OutboundTx is not mutable")) + case "uexecutor.v1.OutboundTx.gas_fee": + panic(fmt.Errorf("field gas_fee of message uexecutor.v1.OutboundTx is not mutable")) default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: uexecutor.v1.OutboundTx")) @@ -6267,6 +6305,10 @@ func (x *fastReflection_OutboundTx) NewField(fd protoreflect.FieldDescriptor) pr case "uexecutor.v1.OutboundTx.pc_revert_execution": m := new(PCTx) return protoreflect.ValueOfMessage(m.ProtoReflect()) + case "uexecutor.v1.OutboundTx.gas_price": + return protoreflect.ValueOfString("") + case "uexecutor.v1.OutboundTx.gas_fee": + return protoreflect.ValueOfString("") default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: uexecutor.v1.OutboundTx")) @@ -6394,6 +6436,14 @@ func (x *fastReflection_OutboundTx) ProtoMethods() *protoiface.Methods { l = options.Size(x.PcRevertExecution) n += 1 + l + runtime.Sov(uint64(l)) } + l = len(x.GasPrice) + if l > 0 { + n += 2 + l + runtime.Sov(uint64(l)) + } + l = len(x.GasFee) + if l > 0 { + n += 2 + l + runtime.Sov(uint64(l)) + } if x.unknownFields != nil { n += len(x.unknownFields) } @@ -6423,6 +6473,24 @@ func (x *fastReflection_OutboundTx) ProtoMethods() *protoiface.Methods { i -= len(x.unknownFields) copy(dAtA[i:], x.unknownFields) } + if len(x.GasFee) > 0 { + i -= len(x.GasFee) + copy(dAtA[i:], x.GasFee) + i = runtime.EncodeVarint(dAtA, i, uint64(len(x.GasFee))) + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0x8a + } + if len(x.GasPrice) > 0 { + i -= len(x.GasPrice) + copy(dAtA[i:], x.GasPrice) + i = runtime.EncodeVarint(dAtA, i, uint64(len(x.GasPrice))) + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0x82 + } if x.PcRevertExecution != nil { encoded, err := options.Marshal(x.PcRevertExecution) if err != nil { @@ -7071,6 +7139,70 @@ func (x *fastReflection_OutboundTx) ProtoMethods() *protoiface.Methods { return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err } iNdEx = postIndex + case 16: + if wireType != 2 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field GasPrice", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if postIndex > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + x.GasPrice = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 17: + if wireType != 2 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field GasFee", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if postIndex > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + x.GasFee = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := runtime.Skip(dAtA[iNdEx:]) @@ -11194,6 +11326,8 @@ type OutboundTx struct { OutboundStatus Status `protobuf:"varint,13,opt,name=outbound_status,json=outboundStatus,proto3,enum=uexecutor.v1.Status" json:"outbound_status,omitempty"` // status of outbound tx RevertInstructions *RevertInstructions `protobuf:"bytes,14,opt,name=revert_instructions,json=revertInstructions,proto3" json:"revert_instructions,omitempty"` PcRevertExecution *PCTx `protobuf:"bytes,15,opt,name=pc_revert_execution,json=pcRevertExecution,proto3" json:"pc_revert_execution,omitempty"` + GasPrice string `protobuf:"bytes,16,opt,name=gas_price,json=gasPrice,proto3" json:"gas_price,omitempty"` // gas price on destination chain at time of outbound + GasFee string `protobuf:"bytes,17,opt,name=gas_fee,json=gasFee,proto3" json:"gas_fee,omitempty"` // gas fee paid to relayer on destination chain } func (x *OutboundTx) Reset() { @@ -11321,6 +11455,20 @@ func (x *OutboundTx) GetPcRevertExecution() *PCTx { return nil } +func (x *OutboundTx) GetGasPrice() string { + if x != nil { + return x.GasPrice + } + return "" +} + +func (x *OutboundTx) GetGasFee() string { + if x != nil { + return x.GasFee + } + return "" +} + type UniversalTx struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -11742,7 +11890,7 @@ var file_uexecutor_v1_types_proto_rawDesc = []byte{ 0x28, 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x3a, 0x24, 0xe8, 0xa0, 0x1f, 0x01, 0x8a, 0xe7, 0xb0, 0x2a, 0x1b, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2f, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x63, 0x5f, - 0x74, 0x78, 0x22, 0xaf, 0x05, 0x0a, 0x0a, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x54, + 0x74, 0x78, 0x22, 0xe5, 0x05, 0x0a, 0x0a, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x54, 0x78, 0x12, 0x2b, 0x0a, 0x11, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x12, 0x1c, @@ -11784,142 +11932,145 @@ var file_uexecutor_v1_types_proto_rawDesc = []byte{ 0x65, 0x72, 0x74, 0x5f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x43, 0x54, 0x78, 0x52, 0x11, 0x70, 0x63, 0x52, 0x65, 0x76, 0x65, 0x72, - 0x74, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x08, 0x98, 0xa0, 0x1f, 0x00, - 0xe8, 0xa0, 0x1f, 0x01, 0x22, 0xa8, 0x02, 0x0a, 0x0b, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, - 0x61, 0x6c, 0x54, 0x78, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x02, 0x69, 0x64, 0x12, 0x34, 0x0a, 0x0a, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x5f, - 0x74, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, - 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, - 0x09, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x54, 0x78, 0x12, 0x27, 0x0a, 0x05, 0x70, 0x63, - 0x5f, 0x74, 0x78, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x75, 0x65, 0x78, 0x65, - 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x43, 0x54, 0x78, 0x52, 0x04, 0x70, - 0x63, 0x54, 0x78, 0x12, 0x39, 0x0a, 0x0b, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x5f, - 0x74, 0x78, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, - 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, - 0x54, 0x78, 0x52, 0x0a, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x54, 0x78, 0x12, 0x4a, - 0x0a, 0x10, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x5f, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1f, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, - 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, - 0x6c, 0x54, 0x78, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0f, 0x75, 0x6e, 0x69, 0x76, 0x65, - 0x72, 0x73, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3a, 0x23, 0x98, 0xa0, 0x1f, 0x00, - 0xe8, 0xa0, 0x1f, 0x01, 0x8a, 0xe7, 0xb0, 0x2a, 0x16, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, - 0x6f, 0x72, 0x2f, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x5f, 0x74, 0x78, 0x22, - 0xab, 0x03, 0x0a, 0x0d, 0x49, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x4c, 0x65, 0x67, 0x61, 0x63, - 0x79, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x63, 0x68, 0x61, 0x69, - 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, - 0x68, 0x61, 0x69, 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x78, 0x48, 0x61, 0x73, 0x68, 0x12, 0x16, 0x0a, - 0x06, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, - 0x65, 0x6e, 0x64, 0x65, 0x72, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, - 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x63, 0x69, 0x70, 0x69, - 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x61, - 0x73, 0x73, 0x65, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x61, 0x73, 0x73, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x6f, - 0x67, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, - 0x6f, 0x67, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x3a, 0x0a, 0x07, 0x74, 0x78, 0x5f, 0x74, 0x79, - 0x70, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, - 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x54, - 0x78, 0x54, 0x79, 0x70, 0x65, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x52, 0x06, 0x74, 0x78, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x4b, 0x0a, 0x11, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, - 0x5f, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, + 0x74, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x61, + 0x73, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x67, + 0x61, 0x73, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x67, 0x61, 0x73, 0x5f, 0x66, + 0x65, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x67, 0x61, 0x73, 0x46, 0x65, 0x65, + 0x3a, 0x08, 0x98, 0xa0, 0x1f, 0x00, 0xe8, 0xa0, 0x1f, 0x01, 0x22, 0xa8, 0x02, 0x0a, 0x0b, 0x55, + 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x54, 0x78, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x34, 0x0a, 0x0a, 0x69, 0x6e, + 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x74, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, + 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, + 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x09, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x54, 0x78, + 0x12, 0x27, 0x0a, 0x05, 0x70, 0x63, 0x5f, 0x74, 0x78, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x12, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, + 0x43, 0x54, 0x78, 0x52, 0x04, 0x70, 0x63, 0x54, 0x78, 0x12, 0x39, 0x0a, 0x0b, 0x6f, 0x75, 0x74, + 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x74, 0x78, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, + 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x75, + 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x54, 0x78, 0x52, 0x0a, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, + 0x6e, 0x64, 0x54, 0x78, 0x12, 0x4a, 0x0a, 0x10, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, + 0x6c, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1f, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x6e, - 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x10, - 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, - 0x12, 0x2b, 0x0a, 0x11, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x76, 0x65, 0x72, - 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x3a, 0x1e, 0x98, - 0xa0, 0x1f, 0x01, 0xe8, 0xa0, 0x1f, 0x01, 0x8a, 0xe7, 0xb0, 0x2a, 0x11, 0x75, 0x65, 0x78, 0x65, - 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x22, 0xd1, 0x01, - 0x0a, 0x10, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x54, 0x78, 0x4c, 0x65, 0x67, 0x61, - 0x63, 0x79, 0x12, 0x2b, 0x0a, 0x11, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x64, - 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x12, - 0x17, 0x0a, 0x07, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x74, 0x78, 0x48, 0x61, 0x73, 0x68, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x63, 0x69, - 0x70, 0x69, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x63, - 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1d, - 0x0a, 0x0a, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x61, 0x73, 0x73, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x3a, 0x22, 0x98, - 0xa0, 0x1f, 0x01, 0xe8, 0xa0, 0x1f, 0x01, 0x8a, 0xe7, 0xb0, 0x2a, 0x15, 0x75, 0x65, 0x78, 0x65, - 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2f, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x74, - 0x78, 0x22, 0xaa, 0x02, 0x0a, 0x11, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x54, - 0x78, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x12, 0x3a, 0x0a, 0x0a, 0x69, 0x6e, 0x62, 0x6f, 0x75, - 0x6e, 0x64, 0x5f, 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x75, 0x65, - 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x62, 0x6f, 0x75, - 0x6e, 0x64, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x52, 0x09, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, - 0x64, 0x54, 0x78, 0x12, 0x27, 0x0a, 0x05, 0x70, 0x63, 0x5f, 0x74, 0x78, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, - 0x31, 0x2e, 0x50, 0x43, 0x54, 0x78, 0x52, 0x04, 0x70, 0x63, 0x54, 0x78, 0x12, 0x3f, 0x0a, 0x0b, - 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x74, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1e, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, - 0x2e, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x54, 0x78, 0x4c, 0x65, 0x67, 0x61, 0x63, - 0x79, 0x52, 0x0a, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x54, 0x78, 0x12, 0x4a, 0x0a, - 0x10, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1f, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, - 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, - 0x54, 0x78, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0f, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, - 0x73, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3a, 0x23, 0x98, 0xa0, 0x1f, 0x01, 0xe8, - 0xa0, 0x1f, 0x01, 0x8a, 0xe7, 0xb0, 0x2a, 0x16, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, - 0x72, 0x2f, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x5f, 0x74, 0x78, 0x2a, 0x47, - 0x0a, 0x10, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, - 0x70, 0x65, 0x12, 0x16, 0x0a, 0x12, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x56, 0x65, 0x72, 0x69, - 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x10, 0x00, 0x12, 0x1b, 0x0a, 0x17, 0x75, 0x6e, - 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x54, 0x78, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x10, 0x01, 0x2a, 0x83, 0x02, 0x0a, 0x11, 0x55, 0x6e, 0x69, 0x76, - 0x65, 0x72, 0x73, 0x61, 0x6c, 0x54, 0x78, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x23, 0x0a, - 0x1f, 0x55, 0x4e, 0x49, 0x56, 0x45, 0x52, 0x53, 0x41, 0x4c, 0x5f, 0x54, 0x58, 0x5f, 0x53, 0x54, - 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, - 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x49, 0x4e, 0x42, 0x4f, 0x55, 0x4e, 0x44, 0x5f, 0x53, 0x55, - 0x43, 0x43, 0x45, 0x53, 0x53, 0x10, 0x01, 0x12, 0x1d, 0x0a, 0x19, 0x50, 0x45, 0x4e, 0x44, 0x49, - 0x4e, 0x47, 0x5f, 0x49, 0x4e, 0x42, 0x4f, 0x55, 0x4e, 0x44, 0x5f, 0x45, 0x58, 0x45, 0x43, 0x55, - 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x02, 0x12, 0x17, 0x0a, 0x13, 0x50, 0x43, 0x5f, 0x45, 0x58, 0x45, - 0x43, 0x55, 0x54, 0x45, 0x44, 0x5f, 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x10, 0x03, 0x12, - 0x16, 0x0a, 0x12, 0x50, 0x43, 0x5f, 0x45, 0x58, 0x45, 0x43, 0x55, 0x54, 0x45, 0x44, 0x5f, 0x46, - 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x04, 0x12, 0x15, 0x0a, 0x11, 0x50, 0x43, 0x5f, 0x50, 0x45, - 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x52, 0x45, 0x56, 0x45, 0x52, 0x54, 0x10, 0x05, 0x12, 0x14, - 0x0a, 0x10, 0x4f, 0x55, 0x54, 0x42, 0x4f, 0x55, 0x4e, 0x44, 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, - 0x4e, 0x47, 0x10, 0x06, 0x12, 0x14, 0x0a, 0x10, 0x4f, 0x55, 0x54, 0x42, 0x4f, 0x55, 0x4e, 0x44, - 0x5f, 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x10, 0x07, 0x12, 0x13, 0x0a, 0x0f, 0x4f, 0x55, - 0x54, 0x42, 0x4f, 0x55, 0x4e, 0x44, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x08, 0x12, - 0x0c, 0x0a, 0x08, 0x43, 0x41, 0x4e, 0x43, 0x45, 0x4c, 0x45, 0x44, 0x10, 0x09, 0x2a, 0x42, 0x0a, - 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0f, 0x0a, 0x0b, 0x55, 0x4e, 0x53, 0x50, 0x45, - 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x45, 0x4e, 0x44, - 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x4f, 0x42, 0x53, 0x45, 0x52, 0x56, 0x45, - 0x44, 0x10, 0x02, 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x45, 0x56, 0x45, 0x52, 0x54, 0x45, 0x44, 0x10, - 0x03, 0x2a, 0x7d, 0x0a, 0x06, 0x54, 0x78, 0x54, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x0e, 0x55, - 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x5f, 0x54, 0x58, 0x10, 0x00, 0x12, - 0x07, 0x0a, 0x03, 0x47, 0x41, 0x53, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x47, 0x41, 0x53, 0x5f, - 0x41, 0x4e, 0x44, 0x5f, 0x50, 0x41, 0x59, 0x4c, 0x4f, 0x41, 0x44, 0x10, 0x02, 0x12, 0x09, 0x0a, - 0x05, 0x46, 0x55, 0x4e, 0x44, 0x53, 0x10, 0x03, 0x12, 0x15, 0x0a, 0x11, 0x46, 0x55, 0x4e, 0x44, - 0x53, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x50, 0x41, 0x59, 0x4c, 0x4f, 0x41, 0x44, 0x10, 0x04, 0x12, - 0x0b, 0x0a, 0x07, 0x50, 0x41, 0x59, 0x4c, 0x4f, 0x41, 0x44, 0x10, 0x05, 0x12, 0x12, 0x0a, 0x0e, - 0x49, 0x4e, 0x42, 0x4f, 0x55, 0x4e, 0x44, 0x5f, 0x52, 0x45, 0x56, 0x45, 0x52, 0x54, 0x10, 0x06, - 0x2a, 0xb4, 0x01, 0x0a, 0x13, 0x49, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x54, 0x78, 0x54, 0x79, - 0x70, 0x65, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x12, 0x21, 0x0a, 0x1d, 0x49, 0x4e, 0x42, 0x4f, - 0x55, 0x4e, 0x44, 0x5f, 0x4c, 0x45, 0x47, 0x41, 0x43, 0x59, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, - 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x5f, 0x54, 0x58, 0x10, 0x00, 0x12, 0x16, 0x0a, 0x12, 0x49, - 0x4e, 0x42, 0x4f, 0x55, 0x4e, 0x44, 0x5f, 0x4c, 0x45, 0x47, 0x41, 0x43, 0x59, 0x5f, 0x47, 0x41, - 0x53, 0x10, 0x01, 0x12, 0x18, 0x0a, 0x14, 0x49, 0x4e, 0x42, 0x4f, 0x55, 0x4e, 0x44, 0x5f, 0x4c, - 0x45, 0x47, 0x41, 0x43, 0x59, 0x5f, 0x46, 0x55, 0x4e, 0x44, 0x53, 0x10, 0x02, 0x12, 0x24, 0x0a, - 0x20, 0x49, 0x4e, 0x42, 0x4f, 0x55, 0x4e, 0x44, 0x5f, 0x4c, 0x45, 0x47, 0x41, 0x43, 0x59, 0x5f, - 0x46, 0x55, 0x4e, 0x44, 0x53, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x50, 0x41, 0x59, 0x4c, 0x4f, 0x41, - 0x44, 0x10, 0x03, 0x12, 0x22, 0x0a, 0x1e, 0x49, 0x4e, 0x42, 0x4f, 0x55, 0x4e, 0x44, 0x5f, 0x4c, - 0x45, 0x47, 0x41, 0x43, 0x59, 0x5f, 0x47, 0x41, 0x53, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x50, 0x41, - 0x59, 0x4c, 0x4f, 0x41, 0x44, 0x10, 0x04, 0x42, 0xb2, 0x01, 0x0a, 0x10, 0x63, 0x6f, 0x6d, 0x2e, - 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x42, 0x0a, 0x54, 0x79, - 0x70, 0x65, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x41, 0x67, 0x69, 0x74, 0x68, - 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x75, 0x73, 0x68, 0x63, 0x68, 0x61, 0x69, 0x6e, - 0x2f, 0x70, 0x75, 0x73, 0x68, 0x2d, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x2d, 0x6e, 0x6f, 0x64, 0x65, - 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2f, 0x76, - 0x31, 0x3b, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x76, 0x31, 0xa2, 0x02, 0x03, - 0x55, 0x58, 0x58, 0xaa, 0x02, 0x0c, 0x55, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, - 0x56, 0x31, 0xca, 0x02, 0x0c, 0x55, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x5c, 0x56, - 0x31, 0xe2, 0x02, 0x18, 0x55, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x5c, 0x56, 0x31, - 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0d, 0x55, - 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x33, + 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x54, 0x78, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x0f, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x3a, 0x23, 0x98, 0xa0, 0x1f, 0x00, 0xe8, 0xa0, 0x1f, 0x01, 0x8a, 0xe7, 0xb0, 0x2a, 0x16, 0x75, + 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2f, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, + 0x61, 0x6c, 0x5f, 0x74, 0x78, 0x22, 0xab, 0x03, 0x0a, 0x0d, 0x49, 0x6e, 0x62, 0x6f, 0x75, 0x6e, + 0x64, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x5f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x78, + 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x78, 0x48, + 0x61, 0x73, 0x68, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x12, 0x1c, 0x0a, 0x09, 0x72, + 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x72, 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x6d, 0x6f, + 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, + 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x73, 0x73, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, + 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x3a, 0x0a, + 0x07, 0x74, 0x78, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x21, + 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, + 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x54, 0x78, 0x54, 0x79, 0x70, 0x65, 0x4c, 0x65, 0x67, 0x61, 0x63, + 0x79, 0x52, 0x06, 0x74, 0x78, 0x54, 0x79, 0x70, 0x65, 0x12, 0x4b, 0x0a, 0x11, 0x75, 0x6e, 0x69, + 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x5f, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, + 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x50, 0x61, 0x79, + 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x10, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x50, + 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x2b, 0x0a, 0x11, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x0a, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x10, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, + 0x61, 0x74, 0x61, 0x3a, 0x1e, 0x98, 0xa0, 0x1f, 0x01, 0xe8, 0xa0, 0x1f, 0x01, 0x8a, 0xe7, 0xb0, + 0x2a, 0x11, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2f, 0x69, 0x6e, 0x62, 0x6f, + 0x75, 0x6e, 0x64, 0x22, 0xd1, 0x01, 0x0a, 0x10, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, + 0x54, 0x78, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x12, 0x2b, 0x0a, 0x11, 0x64, 0x65, 0x73, 0x74, + 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x10, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x43, 0x68, 0x61, 0x69, 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x78, 0x48, 0x61, 0x73, 0x68, 0x12, 0x1c, + 0x0a, 0x09, 0x72, 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x72, 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, + 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x6d, + 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x61, 0x64, + 0x64, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x73, 0x73, 0x65, 0x74, 0x41, + 0x64, 0x64, 0x72, 0x3a, 0x22, 0x98, 0xa0, 0x1f, 0x01, 0xe8, 0xa0, 0x1f, 0x01, 0x8a, 0xe7, 0xb0, + 0x2a, 0x15, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2f, 0x6f, 0x75, 0x74, 0x62, + 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x74, 0x78, 0x22, 0xaa, 0x02, 0x0a, 0x11, 0x55, 0x6e, 0x69, 0x76, + 0x65, 0x72, 0x73, 0x61, 0x6c, 0x54, 0x78, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x12, 0x3a, 0x0a, + 0x0a, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1b, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, + 0x2e, 0x49, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x52, 0x09, + 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x54, 0x78, 0x12, 0x27, 0x0a, 0x05, 0x70, 0x63, 0x5f, + 0x74, 0x78, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, + 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x43, 0x54, 0x78, 0x52, 0x04, 0x70, 0x63, + 0x54, 0x78, 0x12, 0x3f, 0x0a, 0x0b, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x74, + 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x54, + 0x78, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x52, 0x0a, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, + 0x64, 0x54, 0x78, 0x12, 0x4a, 0x0a, 0x10, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, + 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1f, 0x2e, + 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x6e, 0x69, + 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x54, 0x78, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0f, + 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3a, + 0x23, 0x98, 0xa0, 0x1f, 0x01, 0xe8, 0xa0, 0x1f, 0x01, 0x8a, 0xe7, 0xb0, 0x2a, 0x16, 0x75, 0x65, + 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2f, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, + 0x6c, 0x5f, 0x74, 0x78, 0x2a, 0x47, 0x0a, 0x10, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x12, 0x73, 0x69, 0x67, 0x6e, + 0x65, 0x64, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x10, 0x00, + 0x12, 0x1b, 0x0a, 0x17, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x54, 0x78, 0x56, + 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x10, 0x01, 0x2a, 0x83, 0x02, + 0x0a, 0x11, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x54, 0x78, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x23, 0x0a, 0x1f, 0x55, 0x4e, 0x49, 0x56, 0x45, 0x52, 0x53, 0x41, 0x4c, + 0x5f, 0x54, 0x58, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, + 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x49, 0x4e, 0x42, 0x4f, + 0x55, 0x4e, 0x44, 0x5f, 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x10, 0x01, 0x12, 0x1d, 0x0a, + 0x19, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x49, 0x4e, 0x42, 0x4f, 0x55, 0x4e, 0x44, + 0x5f, 0x45, 0x58, 0x45, 0x43, 0x55, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x02, 0x12, 0x17, 0x0a, 0x13, + 0x50, 0x43, 0x5f, 0x45, 0x58, 0x45, 0x43, 0x55, 0x54, 0x45, 0x44, 0x5f, 0x53, 0x55, 0x43, 0x43, + 0x45, 0x53, 0x53, 0x10, 0x03, 0x12, 0x16, 0x0a, 0x12, 0x50, 0x43, 0x5f, 0x45, 0x58, 0x45, 0x43, + 0x55, 0x54, 0x45, 0x44, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x04, 0x12, 0x15, 0x0a, + 0x11, 0x50, 0x43, 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x52, 0x45, 0x56, 0x45, + 0x52, 0x54, 0x10, 0x05, 0x12, 0x14, 0x0a, 0x10, 0x4f, 0x55, 0x54, 0x42, 0x4f, 0x55, 0x4e, 0x44, + 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x06, 0x12, 0x14, 0x0a, 0x10, 0x4f, 0x55, + 0x54, 0x42, 0x4f, 0x55, 0x4e, 0x44, 0x5f, 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x10, 0x07, + 0x12, 0x13, 0x0a, 0x0f, 0x4f, 0x55, 0x54, 0x42, 0x4f, 0x55, 0x4e, 0x44, 0x5f, 0x46, 0x41, 0x49, + 0x4c, 0x45, 0x44, 0x10, 0x08, 0x12, 0x0c, 0x0a, 0x08, 0x43, 0x41, 0x4e, 0x43, 0x45, 0x4c, 0x45, + 0x44, 0x10, 0x09, 0x2a, 0x42, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0f, 0x0a, + 0x0b, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0b, + 0x0a, 0x07, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x4f, + 0x42, 0x53, 0x45, 0x52, 0x56, 0x45, 0x44, 0x10, 0x02, 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x45, 0x56, + 0x45, 0x52, 0x54, 0x45, 0x44, 0x10, 0x03, 0x2a, 0x7d, 0x0a, 0x06, 0x54, 0x78, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x12, 0x0a, 0x0e, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, + 0x5f, 0x54, 0x58, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x47, 0x41, 0x53, 0x10, 0x01, 0x12, 0x13, + 0x0a, 0x0f, 0x47, 0x41, 0x53, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x50, 0x41, 0x59, 0x4c, 0x4f, 0x41, + 0x44, 0x10, 0x02, 0x12, 0x09, 0x0a, 0x05, 0x46, 0x55, 0x4e, 0x44, 0x53, 0x10, 0x03, 0x12, 0x15, + 0x0a, 0x11, 0x46, 0x55, 0x4e, 0x44, 0x53, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x50, 0x41, 0x59, 0x4c, + 0x4f, 0x41, 0x44, 0x10, 0x04, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x41, 0x59, 0x4c, 0x4f, 0x41, 0x44, + 0x10, 0x05, 0x12, 0x12, 0x0a, 0x0e, 0x49, 0x4e, 0x42, 0x4f, 0x55, 0x4e, 0x44, 0x5f, 0x52, 0x45, + 0x56, 0x45, 0x52, 0x54, 0x10, 0x06, 0x2a, 0xb4, 0x01, 0x0a, 0x13, 0x49, 0x6e, 0x62, 0x6f, 0x75, + 0x6e, 0x64, 0x54, 0x78, 0x54, 0x79, 0x70, 0x65, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x12, 0x21, + 0x0a, 0x1d, 0x49, 0x4e, 0x42, 0x4f, 0x55, 0x4e, 0x44, 0x5f, 0x4c, 0x45, 0x47, 0x41, 0x43, 0x59, + 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x5f, 0x54, 0x58, 0x10, + 0x00, 0x12, 0x16, 0x0a, 0x12, 0x49, 0x4e, 0x42, 0x4f, 0x55, 0x4e, 0x44, 0x5f, 0x4c, 0x45, 0x47, + 0x41, 0x43, 0x59, 0x5f, 0x47, 0x41, 0x53, 0x10, 0x01, 0x12, 0x18, 0x0a, 0x14, 0x49, 0x4e, 0x42, + 0x4f, 0x55, 0x4e, 0x44, 0x5f, 0x4c, 0x45, 0x47, 0x41, 0x43, 0x59, 0x5f, 0x46, 0x55, 0x4e, 0x44, + 0x53, 0x10, 0x02, 0x12, 0x24, 0x0a, 0x20, 0x49, 0x4e, 0x42, 0x4f, 0x55, 0x4e, 0x44, 0x5f, 0x4c, + 0x45, 0x47, 0x41, 0x43, 0x59, 0x5f, 0x46, 0x55, 0x4e, 0x44, 0x53, 0x5f, 0x41, 0x4e, 0x44, 0x5f, + 0x50, 0x41, 0x59, 0x4c, 0x4f, 0x41, 0x44, 0x10, 0x03, 0x12, 0x22, 0x0a, 0x1e, 0x49, 0x4e, 0x42, + 0x4f, 0x55, 0x4e, 0x44, 0x5f, 0x4c, 0x45, 0x47, 0x41, 0x43, 0x59, 0x5f, 0x47, 0x41, 0x53, 0x5f, + 0x41, 0x4e, 0x44, 0x5f, 0x50, 0x41, 0x59, 0x4c, 0x4f, 0x41, 0x44, 0x10, 0x04, 0x42, 0xb2, 0x01, + 0x0a, 0x10, 0x63, 0x6f, 0x6d, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, + 0x76, 0x31, 0x42, 0x0a, 0x54, 0x79, 0x70, 0x65, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, + 0x5a, 0x41, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x75, 0x73, + 0x68, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x2f, 0x70, 0x75, 0x73, 0x68, 0x2d, 0x63, 0x68, 0x61, 0x69, + 0x6e, 0x2d, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x75, 0x65, 0x78, 0x65, 0x63, + 0x75, 0x74, 0x6f, 0x72, 0x2f, 0x76, 0x31, 0x3b, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, + 0x72, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x55, 0x58, 0x58, 0xaa, 0x02, 0x0c, 0x55, 0x65, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x0c, 0x55, 0x65, 0x78, 0x65, 0x63, + 0x75, 0x74, 0x6f, 0x72, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x18, 0x55, 0x65, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x6f, 0x72, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0xea, 0x02, 0x0d, 0x55, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x3a, 0x3a, + 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( From 8ded3f2c2443714291d92464abce36b54af4d9ab Mon Sep 17 00:00:00 2001 From: Nilesh Gupta Date: Fri, 13 Mar 2026 17:27:44 +0530 Subject: [PATCH 25/36] feat: updated Outbound event parsing for gasPrice --- x/uexecutor/types/gateway_pc_event_decode.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/x/uexecutor/types/gateway_pc_event_decode.go b/x/uexecutor/types/gateway_pc_event_decode.go index 8a2da39b..9cfc1a36 100644 --- a/x/uexecutor/types/gateway_pc_event_decode.go +++ b/x/uexecutor/types/gateway_pc_event_decode.go @@ -24,6 +24,7 @@ type UniversalTxOutboundEvent struct { ProtocolFee *big.Int // fee kept by protocol RevertRecipient string // where funds go on full revert TxType TxType // ← single source of truth from proto + GasPrice *big.Int // gas price on destination chain at time of outbound } func DecodeUniversalTxOutboundFromLog(log *evmtypes.Log) (*UniversalTxOutboundEvent, error) { @@ -58,6 +59,7 @@ func DecodeUniversalTxOutboundFromLog(log *evmtypes.Log) (*UniversalTxOutboundEv {Type: uint256Type}, // protocolFee {Type: addressType}, // revertRecipient {Type: uint8Type}, // txType + {Type: uint256Type}, // gasPrice } values, err := arguments.Unpack(log.Data) @@ -65,7 +67,7 @@ func DecodeUniversalTxOutboundFromLog(log *evmtypes.Log) (*UniversalTxOutboundEv return nil, fmt.Errorf("failed to unpack UniversalTxOutbound: %w", err) } - if len(values) != 10 { + if len(values) != 11 { return nil, fmt.Errorf("unexpected number of unpacked values: %d", len(values)) } @@ -89,6 +91,8 @@ func DecodeUniversalTxOutboundFromLog(log *evmtypes.Log) (*UniversalTxOutboundEv event.RevertRecipient = values[i].(common.Address).Hex() i++ event.TxType = SolidityTxTypeToProto(values[i].(uint8)) + i++ + event.GasPrice = values[i].(*big.Int) return event, nil } From 7a9be1bc29a14f625a3120b7d896d796746f2abf Mon Sep 17 00:00:00 2001 From: Nilesh Gupta Date: Fri, 13 Mar 2026 17:28:21 +0530 Subject: [PATCH 26/36] feat: updated Chain Outbound event --- x/uexecutor/keeper/create_outbound.go | 4 ++++ x/uexecutor/types/events.go | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/x/uexecutor/keeper/create_outbound.go b/x/uexecutor/keeper/create_outbound.go index 04ba8121..3f9e6f4d 100644 --- a/x/uexecutor/keeper/create_outbound.go +++ b/x/uexecutor/keeper/create_outbound.go @@ -70,7 +70,9 @@ func (k Keeper) BuildOutboundsFromReceipt( Prc20AssetAddr: event.Token, Sender: event.Sender, Payload: event.Payload, + GasFee: event.GasFee.String(), GasLimit: event.GasLimit.String(), + GasPrice: event.GasPrice.String(), TxType: event.TxType, PcTx: &types.OriginatingPcTx{ TxHash: receipt.Hash, @@ -201,7 +203,9 @@ func (k Keeper) attachOutboundsToUtx( AssetAddr: outbound.ExternalAssetAddr, Sender: outbound.Sender, Payload: outbound.Payload, + GasFee: outbound.GasFee, GasLimit: outbound.GasLimit, + GasPrice: outbound.GasPrice, TxType: outbound.TxType.String(), PcTxHash: pcTxHash, LogIndex: logIndex, diff --git a/x/uexecutor/types/events.go b/x/uexecutor/types/events.go index 8ad2f911..599c937e 100644 --- a/x/uexecutor/types/events.go +++ b/x/uexecutor/types/events.go @@ -21,7 +21,9 @@ type OutboundCreatedEvent struct { AssetAddr string `json:"asset_addr"` Sender string `json:"sender"` Payload string `json:"payload"` + GasFee string `json:"gas_fee"` GasLimit string `json:"gas_limit"` + GasPrice string `json:"gas_price"` TxType string `json:"tx_type"` PcTxHash string `json:"pc_tx_hash"` LogIndex string `json:"log_index"` @@ -49,7 +51,9 @@ func NewOutboundCreatedEvent(e OutboundCreatedEvent) (sdk.Event, error) { sdk.NewAttribute("asset_addr", e.AssetAddr), sdk.NewAttribute("sender", e.Sender), sdk.NewAttribute("payload", e.Payload), + sdk.NewAttribute("gas_fee", e.GasFee), sdk.NewAttribute("gas_limit", e.GasLimit), + sdk.NewAttribute("gas_price", e.GasPrice), sdk.NewAttribute("tx_type", e.TxType), sdk.NewAttribute("pc_tx_hash", e.PcTxHash), sdk.NewAttribute("log_index", e.LogIndex), From a16e40c52742d95b4435325c4e2e69efb0d6f057 Mon Sep 17 00:00:00 2001 From: Nilesh Gupta Date: Fri, 13 Mar 2026 17:28:36 +0530 Subject: [PATCH 27/36] feat: updated UniversalTxOutboundEventSig --- x/uexecutor/types/constants.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x/uexecutor/types/constants.go b/x/uexecutor/types/constants.go index 35d94535..53285709 100644 --- a/x/uexecutor/types/constants.go +++ b/x/uexecutor/types/constants.go @@ -43,5 +43,5 @@ const ( ) var UniversalTxOutboundEventSig = crypto.Keccak256Hash([]byte( - "UniversalTxOutbound(bytes32,address,string,address,bytes,uint256,address,uint256,uint256,bytes,uint256,address,uint8)", + "UniversalTxOutbound(bytes32,address,string,address,bytes,uint256,address,uint256,uint256,bytes,uint256,address,uint8,uint256)", )).Hex() From f11d687b988dc6750ef4ceaa282c294c04482e48 Mon Sep 17 00:00:00 2001 From: Nilesh Gupta Date: Fri, 13 Mar 2026 17:29:10 +0530 Subject: [PATCH 28/36] tests: updated uvCore and ugPC bytecodes in test --- test/utils/bytecode.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/utils/bytecode.go b/test/utils/bytecode.go index 18b36c61..72bf82bb 100644 --- a/test/utils/bytecode.go +++ b/test/utils/bytecode.go @@ -6,11 +6,11 @@ const UEA_SVM_BYTECODE = "6080604052348015600e575f80fd5b5060015f55611cf780610020 const UEA_PROXY_BYTECODE = "608060405260043610610028575f3560e01c806323efa7ec14610032578063aaf10f4214610051575b6100306100a8565b005b34801561003d575f80fd5b5061003061004c366004610368565b6100ba565b34801561005c575f80fd5b507f868a771a75a4aa6c2be13e9a9617cb8ea240ed84a3a90c8469537393ec3e115d5460405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b6100b86100b36102cc565b61034a565b565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff165f811580156101045750825b90505f8267ffffffffffffffff1660011480156101205750303b155b90508115801561012e575080155b15610165576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016600117855583156101c65784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b5f6101ef7f868a771a75a4aa6c2be13e9a9617cb8ea240ed84a3a90c8469537393ec3e115d5490565b905073ffffffffffffffffffffffffffffffffffffffff81161561023f576040517fae962d4e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b867f868a771a75a4aa6c2be13e9a9617cb8ea240ed84a3a90c8469537393ec3e115d555083156102c45784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b5f806102f67f868a771a75a4aa6c2be13e9a9617cb8ea240ed84a3a90c8469537393ec3e115d5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610345576040517fae962d4e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b365f80375f80365f845af43d5f803e808015610364573d5ff35b3d5ffd5b5f60208284031215610378575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff8116811461039b575f80fd5b939250505056fea2646970667358221220c4b8f9457567bdcd08b95faef7df86de4e9daead65e2db22018126d9eb77d85864736f6c634300081a0033" -const HANDLER_CONTRACT_BYTECODE = "608080604052600436101561001c575b50361561001a575f80fd5b005b5f905f3560e01c908162bc574b146138ee5750806301ffc9a71461384d5780630379eae8146137f05780630ac6eb77146137445780631a4e49d41461371b5780631a873ce4146136e8578063240028e81461369e578063248a9ca31461364c5780632f2ff15d146135ef57806336568abe146135855780633f4ba83a1461347c5780634b1d2eeb1461343c5780634d20d0f8146134095780634eb7d1a1146133c957806355840b7d1461337a57806357724c41146132795780635b549182146132465780635c975abb146132055780636435967b146129d357806364f10e501461294e57806368c70c9e146129035780636d4008a8146128be578063780ad8271461215357806378a88127146120d857806381fbadad146120ba5780638377e2301461208657806383b94a5214611fd05780638456cb5914611ea557806391d1485414611e2e5780639be7fdb214611d43578063a217fddf14611d27578063a5172ddb14611cdc578063a861469f14611c92578063ad14d38514611c48578063af90f35114611b6a578063b5d8349f14611b09578063be0580c014611963578063c6f1b7e714611912578063d17c872c146117c3578063d547741f1461175c578063db9a0daf14611699578063dbc1b46414611638578063dcc16b5c146113d5578063dd19e7551461113d578063e201db9b1461080f578063e798646614610730578063ec87621c146106f5578063f8c8765e146103c3578063fa064472146102d2578063fb46e99d146102b45763fc6b5de80361000f57346102b15760206003193601126102b1576004359067ffffffffffffffff82116102b157602061029e8161028b36600487016139e3565b8160405193828580945193849201613b07565b8101601281520301902054604051908152f35b80fd5b50346102b157806003193601126102b1576020600654604051908152f35b50346102b15760806003193601126102b15760043567ffffffffffffffff81116103bf576103a96103287f5e41bf0052b493123a63e4e0d9095ed4324108e489d58c9a0948b2be366ac8c69236906004016139e3565b602435604435606435908161038a6020604051868851918381818c0194610350818388613b07565b8101600b815203019020558460405183818b5161036e818388613b07565b8101601181520301902055604051809381928a51928391613b07565b8101601281520301902055604051948594608086526080860190613b28565b926020850152604084015260608301520390a180f35b5080fd5b50346102b15760806003193601126102b1576103dd613a29565b6103e5613a4c565b6103ed613a6f565b6064359173ffffffffffffffffffffffffffffffffffffffff83168093036106f1577ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00549360ff8560401c16159467ffffffffffffffff8116801590816106e9575b60011490816106df575b1590816106d6575b506106ae579173ffffffffffffffffffffffffffffffffffffffff80949392838860017fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000859716177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0055610659575b506104d9614253565b6104e1614253565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005561050d614253565b61051633613da7565b50167fffffffffffffffffffffffff0000000000000000000000000000000000000000600a541617600a55167fffffffffffffffffffffffff00000000000000000000000000000000000000006007541617600755167fffffffffffffffffffffffff000000000000000000000000000000000000000060085416176008557fffffffffffffffffffffffff000000000000000000000000000000000000000060095416176009556105c55780f35b7fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054167ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00557fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2602060405160018152a180f35b7fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000001668010000000000000001177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00555f6104d0565b6004877ff92ee8a9000000000000000000000000000000000000000000000000000000008152fd5b9050155f610461565b303b159150610459565b87915061044f565b8480fd5b50346102b157806003193601126102b15760206040517f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b088152f35b50346102b15760406003193601126102b15761074a613a29565b73ffffffffffffffffffffffffffffffffffffffff610767613a92565b91610770613c99565b169081156107e75760207f16ef4de07b0452a43221c91064fb645963a8e2e60bd8a7514da58d56e315c42291838552601082526107db81604087209060ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0083541691151516179055565b6040519015158152a280f35b6004837fd92e233d000000000000000000000000000000000000000000000000000000008152fd5b5060e06003193601126102b157610824613a29565b9061082d613a4c565b91610836613aa1565b9160c4359173ffffffffffffffffffffffffffffffffffffffff83169160a4359190608435606435858703610de35773ffffffffffffffffffffffffffffffffffffffff600e541633036111155761088c6140a8565b6108946140fb565b8492889973ffffffffffffffffffffffffffffffffffffffff86169586156107e75773ffffffffffffffffffffffffffffffffffffffff82169788156110ed5789156110ed5734156110c55784156110c55762ffffff6108f48787613c5d565b9c1615611084575b1561102f575b854211611007576109bd60208d73ffffffffffffffffffffffffffffffffffffffff6007541673ffffffffffffffffffffffffffffffffffffffff600a5416948b861090815f146110005786915b15610ff857905b604051958694859384937f1698ee820000000000000000000000000000000000000000000000000000000085526004850191604091949373ffffffffffffffffffffffffffffffffffffffff62ffffff9281606087019816865216602085015216910152565b03915afa908115610fed579073ffffffffffffffffffffffffffffffffffffffff918591610fbe575b501615610f9657803b15610de35782600491604051928380927fd0e30db000000000000000000000000000000000000000000000000000000000825234905af18015610dd857908391610f81575b50600a546008546040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff918216600482015234602482015292602092849260449284929091165af18015610dd857610f64575b50600a5473ffffffffffffffffffffffffffffffffffffffff169a6040519b610ac78d61391e565b8c528660208d015262ffffff16948560408d01523060608d015260808c01528960a08c01523460c08c01528160e08c01528160085473ffffffffffffffffffffffffffffffffffffffff169b6040519c8d917fdb3e219800000000000000000000000000000000000000000000000000000000835260048301610bb09173ffffffffffffffffffffffffffffffffffffffff60e0809282815116855282602082015116602086015262ffffff60408201511660408601528260608201511660608601526080810151608086015260a081015160a086015260c081015160c0860152015116910152565b815a9361010492602095f19a8b15610f5957829b610f21575b5081602073ffffffffffffffffffffffffffffffffffffffff600a5416604473ffffffffffffffffffffffffffffffffffffffff6008541660405194859384927f095ea7b300000000000000000000000000000000000000000000000000000000845260048401528160248401525af18015610dd857610f04575b506040517f42966c68000000000000000000000000000000000000000000000000000000008152836004820152602081602481868b5af18015610dd857610ed7575b508184610e14575b505089340397348911610de7578a3403610d12575b5050977f8c8071a0a45857f27eaa04a47ecdc04f0549d2150a7a1cb5eaa7111b6cf85f8d9260809260409a8b5193845260208401528a8301526060820152a460017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b73ffffffffffffffffffffffffffffffffffffffff600a5416803b15610de35782809160248c60405194859384927f2e1a7d4d00000000000000000000000000000000000000000000000000000000845260048401525af18015610dd8579183918b93610dbe575b5081809381925af1610d8a613c6a565b5015610d965780610ca3565b807f90b8ec180000000000000000000000000000000000000000000000000000000060049252fd5b610dcb9193508290613968565b6103bf578189915f610d7a565b6040513d85823e3d90fd5b8280fd5b6024827f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000602080830191825273ffffffffffffffffffffffffffffffffffffffff9490941660248301526044808301889052825290610e74606482613968565b519082895af115610ecb5780513d610ec25750843b155b610e96575f81610c8e565b80857f5274afe70000000000000000000000000000000000000000000000000000000060249352600452fd5b60011415610e8b565b604051903d90823e3d90fd5b610ef89060203d602011610efd575b610ef08183613968565b810190613b6b565b610c86565b503d610ee6565b610f1c9060203d602011610efd57610ef08183613968565b610c44565b909a506020813d602011610f51575b81610f3d60209383613968565b81010312610f4d5751995f610bc9565b5f80fd5b3d9150610f30565b6040513d84823e3d90fd5b610f7c9060203d602011610efd57610ef08183613968565b610a9f565b81610f8b91613968565b6103bf57815f610a34565b6004837f76ecffc0000000000000000000000000000000000000000000000000000000008152fd5b610fe0915060203d602011610fe6575b610fd88183613968565b810190613c31565b5f6109e6565b503d610fce565b6040513d86823e3d90fd5b508590610957565b8091610950565b6004837f1ab7da6b000000000000000000000000000000000000000000000000000000008152fd5b9450600654603c810290808204603c1490151715611057576110519042613c5d565b94610902565b6024837f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b8784526004602052604084205462ffffff169c508c6108fc576004847f3733548a000000000000000000000000000000000000000000000000000000008152fd5b6004847f1f2a2005000000000000000000000000000000000000000000000000000000008152fd5b6004847fd92e233d000000000000000000000000000000000000000000000000000000008152fd5b6004837fbce361b0000000000000000000000000000000000000000000000000000000008152fd5b50346102b15760406003193601126102b157611157613a29565b6024359081156113cb575b73ffffffffffffffffffffffffffffffffffffffff166040517fa0c50b690000000000000000000000000000000000000000000000000000000081528381600481855afa908115610fed57849161134e575b506040519173ffffffffffffffffffffffffffffffffffffffff825193602081818601966111e381838a613b07565b8101600c815203019020541692831561132657602061120d91604051809381928751928391613b07565b8101600b815203019020549081156112fe5784820294828604036112d1579460206004949596604051958680927ff97c007a0000000000000000000000000000000000000000000000000000000082525afa908115610ecb579061129d575b6112999350604051958695865260208601526040850152606084015260a0608084015260a0830190613b28565b0390f35b506020833d6020116112c9575b816112b760209383613968565b81010312610f4d57611299925161126c565b3d91506112aa565b6024867f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b6004867fe661aed0000000000000000000000000000000000000000000000000000000008152fd5b6004867fd92e233d000000000000000000000000000000000000000000000000000000008152fd5b90503d8085833e61135f8183613968565b8101906020818303126106f15780519067ffffffffffffffff82116113c7570181601f820112156106f1578051611395816139a9565b926113a36040519485613968565b818452602082840101116113c7576113c19160208085019101613b07565b5f6111b4565b8580fd5b600f549150611162565b50346102b15760606003193601126102b15760043567ffffffffffffffff81116103bf576114079036906004016139e3565b61140f613a4c565b611417613aa1565b90611420613c99565b73ffffffffffffffffffffffffffffffffffffffff8116801561161057826114f29260209273ffffffffffffffffffffffffffffffffffffffff600754169173ffffffffffffffffffffffffffffffffffffffff600a541691821091825f146116095780925b1561160157506040517f1698ee8200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff92831660048201529116602482015262ffffff90921660448301529092839190829081906064820190565b03915afa8015610fed5773ffffffffffffffffffffffffffffffffffffffff9185916115e2575b50169081156115ba57916115a89162ffffff7f21e3c1439de176cb39006e603b26a8d890fe2267c804597e40d2954871141d7d9460405160208186516115628183858b01613b07565b8101600d815203019020837fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055604051948594606086526060860190613b28565b9260208501521660408301520390a180f35b6004847f76ecffc0000000000000000000000000000000000000000000000000000000008152fd5b6115fb915060203d602011610fe657610fd88183613968565b5f611519565b905090610957565b8192611486565b6004857fd92e233d000000000000000000000000000000000000000000000000000000008152fd5b50346102b15760206003193601126102b1576004359067ffffffffffffffff82116102b157602073ffffffffffffffffffffffffffffffffffffffff6116858261028b36600488016139e3565b8101600c8152030190205416604051908152f35b50346102b15760206003193601126102b1576004358180527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020526040822073ffffffffffffffffffffffffffffffffffffffff33165f5260205260ff60405f20541615611734576020817f424b07caa75ce8e1c3985f334273f957db9ce138de114e48e50d8240d4d7300b92600655604051908152a180f35b6004827f49e27cff000000000000000000000000000000000000000000000000000000008152fd5b50346102b15760406003193601126102b1576117bf60043561177c613a4c565b906117ba6117b5825f527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052600160405f20015490565b613d21565b613fa0565b5080f35b50346102b15760406003193601126102b1576117dd613a29565b6024359062ffffff8216809203610de3578280527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020526040832073ffffffffffffffffffffffffffffffffffffffff33165f5260205260ff60405f205416156118ea5773ffffffffffffffffffffffffffffffffffffffff1680156107e7576101f4821415806118de575b806118d2575b6118aa578252600460205260408220907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000082541617905580f35b6004837f3733548a000000000000000000000000000000000000000000000000000000008152fd5b50612710821415611870565b50610bb882141561186a565b6004837f49e27cff000000000000000000000000000000000000000000000000000000008152fd5b50346102b157806003193601126102b157602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b50346102b15760606003193601126102b15761197d613a29565b611985613a4c565b61198d613a6f565b918380527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020526040842073ffffffffffffffffffffffffffffffffffffffff33165f5260205260ff60405f20541615611ae15773ffffffffffffffffffffffffffffffffffffffff1680158015611ac3575b8015611aa5575b6110ed5773ffffffffffffffffffffffffffffffffffffffff929183917fffffffffffffffffffffffff00000000000000000000000000000000000000006007541617600755167fffffffffffffffffffffffff00000000000000000000000000000000000000006008541617600855167fffffffffffffffffffffffff0000000000000000000000000000000000000000600954161760095580f35b5073ffffffffffffffffffffffffffffffffffffffff831615611a08565b5073ffffffffffffffffffffffffffffffffffffffff821615611a01565b6004847f49e27cff000000000000000000000000000000000000000000000000000000008152fd5b50346102b15760206003193601126102b1576004359067ffffffffffffffff82116102b157602073ffffffffffffffffffffffffffffffffffffffff611b568261028b36600488016139e3565b8101600d8152030190205416604051908152f35b50346102b15760206003193601126102b157611b84613a29565b8180527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020526040822073ffffffffffffffffffffffffffffffffffffffff33165f5260205260ff60405f205416156117345773ffffffffffffffffffffffffffffffffffffffff168015611c20577fffffffffffffffffffffffff0000000000000000000000000000000000000000600e541617600e5580f35b6004827fd92e233d000000000000000000000000000000000000000000000000000000008152fd5b50346102b15760206003193601126102b15760ff604060209273ffffffffffffffffffffffffffffffffffffffff611c7e613a29565b168152600384522054166040519015158152f35b50346102b15760206003193601126102b15762ffffff604060209273ffffffffffffffffffffffffffffffffffffffff611cca613a29565b16815260048452205416604051908152f35b50346102b15760206003193601126102b1576004359067ffffffffffffffff82116102b1576020611d148161028b36600487016139e3565b8101600b81520301902054604051908152f35b50346102b157806003193601126102b157602090604051908152f35b50346102b15760406003193601126102b15760043567ffffffffffffffff81116103bf57611d759036906004016139e3565b73ffffffffffffffffffffffffffffffffffffffff611d92613a4c565b611d9a613c99565b1680156107e7577f0c7d242571a289736ea536c54ebe236d31ba62abfd4f22b8d54d2988dc0dd94991611e22916040516020818451611ddc8183858901613b07565b8101600c815203019020817fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055604051928392604084526040840190613b28565b9060208301520390a180f35b50346102b15760406003193601126102b15773ffffffffffffffffffffffffffffffffffffffff6040611e5f613a4c565b9260043581527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020522091165f52602052602060ff60405f2054166040519015158152f35b50346102b157806003193601126102b1578080527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020526040812073ffffffffffffffffffffffffffffffffffffffff33165f5260205260ff60405f20541615611fa857611f126140a8565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005416177fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586020604051338152a180f35b807f49e27cff0000000000000000000000000000000000000000000000000000000060049252fd5b50346102b15760206003193601126102b157611fea613a29565b8180527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020526040822073ffffffffffffffffffffffffffffffffffffffff33165f5260205260ff60405f205416156117345773ffffffffffffffffffffffffffffffffffffffff168015611c20577fffffffffffffffffffffffff0000000000000000000000000000000000000000600a541617600a5580f35b50346102b157806003193601126102b157602073ffffffffffffffffffffffffffffffffffffffff600e5416604051908152f35b50346102b157806003193601126102b1576020600f54604051908152f35b50346102b1576120e736613ab3565b9083809394527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020526040832073ffffffffffffffffffffffffffffffffffffffff33165f5260205260ff60405f205416156118ea57612150929361214b6140a8565b613b83565b80f35b50346102b15760c06003193601126102b15761216d613a29565b60243590612179613a6f565b906064359262ffffff8416908185036113c75760843560a4359373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163303612896576121d86140a8565b6121e06140fb565b6121eb868483614172565b8473ffffffffffffffffffffffffffffffffffffffff821697888a52600360205260ff60408b2054161561286e57941561282d575b156127d8575b8442116127b0576020846122e3928a73ffffffffffffffffffffffffffffffffffffffff600754169173ffffffffffffffffffffffffffffffffffffffff600a541690818d10805f146127a95781935b501561160157506040517f1698ee8200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff92831660048201529116602482015262ffffff90921660448301529092839190829081906064820190565b03915afa80156127125773ffffffffffffffffffffffffffffffffffffffff91899161278a575b50161561276257801561273a576040517f47e7ef24000000000000000000000000000000000000000000000000000000008152306004820152602481018390526020816044818b8b5af180156127125761271d575b506008546040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602481018390526020816044818b8b5af18015612712576126f5575b5062ffffff73ffffffffffffffffffffffffffffffffffffffff600a541693604051946123ee8661391e565b8886526020808701918252929091166040808701828152306060890190815260808901998a5260a0890188815260c08a0188815260e08b018f815260085495517f414bf3890000000000000000000000000000000000000000000000000000000081529b5173ffffffffffffffffffffffffffffffffffffffff90811660048e01529751881660248d0152935162ffffff1660448c01529151861660648b0152995160848a0152985160a4890152975160c48801529651821660e48701529585916101049183918c91165af192831561268e5787936126c1575b5082106126995773ffffffffffffffffffffffffffffffffffffffff60085416604051907f095ea7b300000000000000000000000000000000000000000000000000000000825260048201528660248201526020816044818a8a5af1801561268e57612671575b508573ffffffffffffffffffffffffffffffffffffffff600a5416803b156103bf578180916024604051809481937f2e1a7d4d0000000000000000000000000000000000000000000000000000000083528960048401525af18015610f595761265c575b5080808085885af16125a3613c6a565b501561263457927ff5d6ca9b390b5271e0cbb3d43b4d708d5b17804cb81a4c65e027226d87ccf0e2949273ffffffffffffffffffffffffffffffffffffffff9260c09584600a54169060405196875260208701526040860152606085015260808401521660a0820152a160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005580f35b6004867f90b8ec18000000000000000000000000000000000000000000000000000000008152fd5b8161266691613968565b6113c757855f612593565b6126899060203d602011610efd57610ef08183613968565b61252f565b6040513d89823e3d90fd5b6004867f8199f5f3000000000000000000000000000000000000000000000000000000008152fd5b9092506020813d6020116126ed575b816126dd60209383613968565b81010312610f4d5751915f6124c8565b3d91506126d0565b61270d9060203d602011610efd57610ef08183613968565b6123c2565b6040513d8a823e3d90fd5b6127359060203d602011610efd57610ef08183613968565b61235f565b6004877f1f2a2005000000000000000000000000000000000000000000000000000000008152fd5b6004877f76ecffc0000000000000000000000000000000000000000000000000000000008152fd5b6127a3915060203d602011610fe657610fd88183613968565b5f61230a565b8293612276565b6004887f1ab7da6b000000000000000000000000000000000000000000000000000000008152fd5b9350600654603c810290808204603c1490151715612800576127fa9042613c5d565b93612226565b6024887f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b8789526004602052604089205462ffffff16945084612220576004897f3733548a000000000000000000000000000000000000000000000000000000008152fd5b60048a7f4e38f95a000000000000000000000000000000000000000000000000000000008152fd5b6004887f53e51723000000000000000000000000000000000000000000000000000000008152fd5b50346102b15760206003193601126102b157604060209173ffffffffffffffffffffffffffffffffffffffff6128f2613a29565b168152600583522054604051908152f35b50346102b15760206003193601126102b1576004359067ffffffffffffffff82116102b157602061293b8161028b36600487016139e3565b8101601181520301902054604051908152f35b50346102b15761295d36613ab3565b9073ffffffffffffffffffffffffffffffffffffffff9392937f00000000000000000000000000000000000000000000000000000000000000001633036129ab57612150929361214b6140a8565b6004837f53e51723000000000000000000000000000000000000000000000000000000008152fd5b5034610f4d5760c0600319360112610f4d576129ed613a29565b6024356129f8613a6f565b6064358015918215809203610f4d5760843562ffffff811690818103610f4d5760a43573ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036131dd57612a606140a8565b612a686140fb565b612a7384888a614172565b5f9515612b925750506040517f47e7ef2400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8316600482015260248101869052919050602082806044810103818a73ffffffffffffffffffffffffffffffffffffffff8b165af190811561268e577ffa6ff091ec99bdfd127d51e7786764f2ff7e39f866bbb2a2996e1597052641e49460609473ffffffffffffffffffffffffffffffffffffffff948594612b73575b505b6040519788526020880152604087015216941692a360017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005580f35b612b8b9060203d602011610efd57610ef08183613968565b505f612b35565b809192939550156131b55773ffffffffffffffffffffffffffffffffffffffff871691825f52600360205260ff60405f2054161561318d57921561314b575b600654603c810290808204603c149015171561311e57612bf19042613c5d565b8042116130f657612ca960208573ffffffffffffffffffffffffffffffffffffffff6007541673ffffffffffffffffffffffffffffffffffffffff600a541680881090815f146130ef578d915b156130e7576040517f1698ee8200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff92831660048201529116602482015262ffffff90921660448301529092839190829081906064820190565b03915afa8015612fe25773ffffffffffffffffffffffffffffffffffffffff915f916130c8575b5016156130a0576040517f47e7ef24000000000000000000000000000000000000000000000000000000008152306004820152602481018890526020816044815f885af18015612fe257613083575b506008546040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602481018890526020816044815f885af18015612fe257613066575b5062ffffff73ffffffffffffffffffffffffffffffffffffffff600a54169460405195612dae8761391e565b858752602087015216604085015230606085015260808401528560a08401528060c08401525f60e08401526020612e9861010473ffffffffffffffffffffffffffffffffffffffff60085416955f60405197889485937f414bf389000000000000000000000000000000000000000000000000000000008552600485019073ffffffffffffffffffffffffffffffffffffffff60e0809282815116855282602082015116602086015262ffffff60408201511660408601528260608201511660608601526080810151608086015260a081015160a086015260c081015160c0860152015116910152565b5af1928315612fe2575f93613032575b50821061300a5760205f91604473ffffffffffffffffffffffffffffffffffffffff6008541660405194859384927f095ea7b300000000000000000000000000000000000000000000000000000000845260048401528160248401525af18015612fe257612fed575b5073ffffffffffffffffffffffffffffffffffffffff600a5416803b15610f4d575f80916024604051809481937f2e1a7d4d0000000000000000000000000000000000000000000000000000000083528760048401525af18015612fe257612fcd575b508580808084875af1612f85613c6a565b50156126345773ffffffffffffffffffffffffffffffffffffffff7ffa6ff091ec99bdfd127d51e7786764f2ff7e39f866bbb2a2996e1597052641e493606093829390612b37565b612fda9196505f90613968565b5f945f612f74565b6040513d5f823e3d90fd5b6130059060203d602011610efd57610ef08183613968565b612f11565b7f8199f5f3000000000000000000000000000000000000000000000000000000005f5260045ffd5b9092506020813d60201161305e575b8161304e60209383613968565b81010312610f4d5751915f612ea8565b3d9150613041565b61307e9060203d602011610efd57610ef08183613968565b612d82565b61309b9060203d602011610efd57610ef08183613968565b612d1f565b7f76ecffc0000000000000000000000000000000000000000000000000000000005f5260045ffd5b6130e1915060203d602011610fe657610fd88183613968565b5f612cd0565b508c90610957565b8091612c3e565b7f1ab7da6b000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b9150805f52600460205262ffffff60405f2054169182612bd1577f3733548a000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f4e38f95a000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f22c50cbf000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f53e51723000000000000000000000000000000000000000000000000000000005f5260045ffd5b34610f4d575f600319360112610f4d57602060ff7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330054166040519015158152f35b34610f4d575f600319360112610f4d57602073ffffffffffffffffffffffffffffffffffffffff60075416604051908152f35b34610f4d576040600319360112610f4d57613292613a29565b335f9081527fb7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d6020526040902054602435919060ff16156133525773ffffffffffffffffffffffffffffffffffffffff16801561332a576113888211613302575f52600560205260405f20555f80f35b7fc31c0b6e000000000000000000000000000000000000000000000000000000005f5260045ffd5b7fd92e233d000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f49e27cff000000000000000000000000000000000000000000000000000000005f5260045ffd5b34610f4d576020600319360112610f4d57335f9081527fb7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d602052604090205460ff161561335257600435600f55005b34610f4d576020600319360112610f4d576004355f526002602052602073ffffffffffffffffffffffffffffffffffffffff60405f205416604051908152f35b34610f4d575f600319360112610f4d57602073ffffffffffffffffffffffffffffffffffffffff60095416604051908152f35b34610f4d576020600319360112610f4d576004355f526001602052602073ffffffffffffffffffffffffffffffffffffffff60405f205416604051908152f35b34610f4d575f600319360112610f4d57335f9081527fb7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d602052604090205460ff1615613352577fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff81161561355d577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00167fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6020604051338152a1005b7f8dfc202b000000000000000000000000000000000000000000000000000000005f5260045ffd5b34610f4d576040600319360112610f4d5761359e613a4c565b3373ffffffffffffffffffffffffffffffffffffffff8216036135c75761001a90600435613fa0565b7f6697b232000000000000000000000000000000000000000000000000000000005f5260045ffd5b34610f4d576040600319360112610f4d5761001a60043561360e613a4c565b906136476117b5825f527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052600160405f20015490565b613e8e565b34610f4d576020600319360112610f4d5760206136966004355f527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052600160405f20015490565b604051908152f35b34610f4d576020600319360112610f4d5773ffffffffffffffffffffffffffffffffffffffff6136cc613a29565b165f526010602052602060ff60405f2054166040519015158152f35b34610f4d575f600319360112610f4d57602073ffffffffffffffffffffffffffffffffffffffff600a5416604051908152f35b34610f4d576020600319360112610f4d576004355f525f602052602060405f2054604051908152f35b34610f4d576040600319360112610f4d5761375d613a29565b613765613a92565b335f9081527fb7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d602052604090205460ff16156133525773ffffffffffffffffffffffffffffffffffffffff61001a92165f52600360205260405f209060ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0083541691151516179055565b34610f4d576040600319360112610f4d5760043567ffffffffffffffff8111610f4d576138219036906004016139e3565b60206138366040519283815193849201613b07565b810190600b82526020816024359303019020555f80f35b34610f4d576020600319360112610f4d576004357fffffffff000000000000000000000000000000000000000000000000000000008116809103610f4d57807f7965db0b00000000000000000000000000000000000000000000000000000000602092149081156138c4575b506040519015158152f35b7f01ffc9a700000000000000000000000000000000000000000000000000000000915014826138b9565b34610f4d575f600319360112610f4d5760209073ffffffffffffffffffffffffffffffffffffffff600854168152f35b610100810190811067ffffffffffffffff82111761393b57604052565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761393b57604052565b67ffffffffffffffff811161393b57601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b81601f82011215610f4d578035906139fa826139a9565b92613a086040519485613968565b82845260208383010111610f4d57815f926020809301838601378301015290565b6004359073ffffffffffffffffffffffffffffffffffffffff82168203610f4d57565b6024359073ffffffffffffffffffffffffffffffffffffffff82168203610f4d57565b6044359073ffffffffffffffffffffffffffffffffffffffff82168203610f4d57565b602435908115158203610f4d57565b6044359062ffffff82168203610f4d57565b6003196060910112610f4d5760043573ffffffffffffffffffffffffffffffffffffffff81168103610f4d57906024359060443573ffffffffffffffffffffffffffffffffffffffff81168103610f4d5790565b5f5b838110613b185750505f910152565b8181015183820152602001613b09565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f602093613b6481518092818752878088019101613b07565b0116010190565b90816020910312610f4d57518015158103610f4d5790565b90602091613c0493613b96818484614172565b5f73ffffffffffffffffffffffffffffffffffffffff6040518097819682957f47e7ef24000000000000000000000000000000000000000000000000000000008452600484016020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b0393165af18015612fe257613c165750565b613c2e9060203d602011610efd57610ef08183613968565b50565b90816020910312610f4d575173ffffffffffffffffffffffffffffffffffffffff81168103610f4d5790565b9190820180921161311e57565b3d15613c94573d90613c7b826139a9565b91613c896040519384613968565b82523d5f602084013e565b606090565b335f9081527f06484cc59dc38e4f67c31122333a17ca81b3ca18cdf02bfc298072fa52b0316a602052604090205460ff1615613cd157565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f52336004527f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b0860245260445ffd5b805f527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260405f2073ffffffffffffffffffffffffffffffffffffffff33165f5260205260ff60405f20541615613d785750565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f523360045260245260445ffd5b73ffffffffffffffffffffffffffffffffffffffff81165f9081527fb7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d602052604090205460ff16613e895773ffffffffffffffffffffffffffffffffffffffff165f8181527fb7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d6020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790553391907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d8180a4600190565b505f90565b805f527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260ff60405f205416155f14613f9a57805f527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260405f2060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905573ffffffffffffffffffffffffffffffffffffffff339216907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d5f80a4600190565b50505f90565b805f527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260ff60405f2054165f14613f9a57805f527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260405f207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905573ffffffffffffffffffffffffffffffffffffffff339216907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b5f80a4600190565b60ff7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330054166140d357565b7fd93c0665000000000000000000000000000000000000000000000000000000005f5260045ffd5b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00541461414a5760027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7f3ee5aeb5000000000000000000000000000000000000000000000000000000005f5260045ffd5b90919073ffffffffffffffffffffffffffffffffffffffff161561332a5773ffffffffffffffffffffffffffffffffffffffff16801561332a5773ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168114908115614249575b5061422157156141f957565b7f1f2a2005000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f82d5d76a000000000000000000000000000000000000000000000000000000005f5260045ffd5b905030145f6141ed565b60ff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005460401c161561428257565b7fd7e6bcf8000000000000000000000000000000000000000000000000000000005f5260045ffdfea26469706673582212203646e3ee15c982505d4331c1a1af22a6dce9040f03c82da9a65983e246eeb0a764736f6c634300081a0033" +const HANDLER_CONTRACT_BYTECODE = "608080604052600436101561001c575b50361561001a575f80fd5b005b5f905f3560e01c908162bc574b146137825750806301ffc9a7146136e15780630379eae8146136815780630ac6eb77146135d5578063172bfc1c146135595780631a4e49d4146135305780631a873ce4146134fd578063240028e8146134b3578063248a9ca3146134615780632f2ff15d1461340457806336568abe1461339a5780633f4ba83a146132915780634b1d2eeb146132515780634d20d0f81461321e5780634eb7d1a1146131de57806357724c41146130dd5780635b549182146130aa5780635c975abb14613069578063606b05a414612ffc5780636435967b1461282f57806364f10e501461281457806368c70c9e146127c95780636ca752e31461277e5780636d4008a814612739578063780ad8271461203357806378a8812714611fb857806381fbadad14611f9a5780638377e23014611f6657806383b94a5214611eb05780638456cb5914611d8557806391d1485414611d0e5780639be7fdb214611c23578063a217fddf14611c07578063a5172ddb14611bbc578063a861469f14611b72578063ad14d38514611b28578063af90f35114611a4a578063b5d8349f146119e9578063be0580c014611843578063c6f1b7e7146117f2578063cd20c6e8146117ad578063d17c872c14611687578063d547741f14611620578063db9a0daf1461155d578063dbc1b464146114fc578063dcc16b5c146112be578063dd19e7551461102a578063e798646614610f4b578063ec87621c14610f10578063f881446714610716578063f8c8765e146103e4578063fa064472146102f3578063fb46e99d146102d55763fc6b5de80361000f57346102d25760206003193601126102d2576004359067ffffffffffffffff82116102d25760206102bf816102ac3660048701613877565b81604051938285809451938492016139cd565b8101601281520301902054604051908152f35b80fd5b50346102d257806003193601126102d2576020600654604051908152f35b50346102d25760806003193601126102d25760043567ffffffffffffffff81116103e0576103ca6103497f5e41bf0052b493123a63e4e0d9095ed4324108e489d58c9a0948b2be366ac8c6923690600401613877565b60243560443560643590816103ab6020604051868851918381818c01946103718183886139cd565b8101600b815203019020558460405183818b5161038f8183886139cd565b8101601181520301902055604051809381928a519283916139cd565b81016012815203019020556040519485946080865260808601906139ee565b926020850152604084015260608301520390a180f35b5080fd5b50346102d25760806003193601126102d2576103fe6138ef565b610406613912565b61040e613935565b6064359173ffffffffffffffffffffffffffffffffffffffff8316809303610712577ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00549360ff8560401c16159467ffffffffffffffff81168015908161070a575b6001149081610700575b1590816106f7575b506106cf579173ffffffffffffffffffffffffffffffffffffffff80949392838860017fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000859716177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005561067a575b506104fa614135565b610502614135565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005561052e614135565b61053733613c89565b50167fffffffffffffffffffffffff0000000000000000000000000000000000000000600a541617600a55167fffffffffffffffffffffffff00000000000000000000000000000000000000006007541617600755167fffffffffffffffffffffffff000000000000000000000000000000000000000060085416176008557fffffffffffffffffffffffff000000000000000000000000000000000000000060095416176009556105e65780f35b7fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054167ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00557fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2602060405160018152a180f35b7fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000001668010000000000000001177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00555f6104f1565b6004877ff92ee8a9000000000000000000000000000000000000000000000000000000008152fd5b9050155f610482565b303b15915061047a565b879150610470565b8480fd5b5060a06003193601126102d25761072b6138ef565b90610734613967565b9160443591606435936084359273ffffffffffffffffffffffffffffffffffffffff8416928385036102d25773ffffffffffffffffffffffffffffffffffffffff601054163303610ee857610787613f8a565b61078f613fdd565b8691839773ffffffffffffffffffffffffffffffffffffffff8216948515610ec0578615610ec0573415610e98578815610e985762ffffff1615610e56575b15610e2e575b824211610e065761088f60208973ffffffffffffffffffffffffffffffffffffffff6007541673ffffffffffffffffffffffffffffffffffffffff600a54169488861090815f14610dff5786915b15610df757905b604051958694859384937f1698ee820000000000000000000000000000000000000000000000000000000085526004850191604091949373ffffffffffffffffffffffffffffffffffffffff62ffffff9281606087019816865216602085015216910152565b03915afa908115610c98579073ffffffffffffffffffffffffffffffffffffffff918491610dc8575b501615610da057803b156103e05781600491604051928380927fd0e30db000000000000000000000000000000000000000000000000000000000825234905af18015610d0157908291610d8b575b50600a546008546040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff918216600482015234602482015292602092849260449284929091165af18015610d0157610d6e575b5062ffffff73ffffffffffffffffffffffffffffffffffffffff600a5416976040519861099d8a6137b2565b89528460208a0152169182604089015230606089015260808801528560a08801523460c08801528060e08801526020610a8961010473ffffffffffffffffffffffffffffffffffffffff6008541699846040519b8c9485937fdb3e2198000000000000000000000000000000000000000000000000000000008552600485019073ffffffffffffffffffffffffffffffffffffffff60e0809282815116855282602082015116602086015262ffffff60408201511660408601528260608201511660608601526080810151608086015260a081015160a086015260c081015160c0860152015116910152565b5af1968715610d61578197610d29575b5080602073ffffffffffffffffffffffffffffffffffffffff600a5416604473ffffffffffffffffffffffffffffffffffffffff6008541660405194859384927f095ea7b300000000000000000000000000000000000000000000000000000000845260048401528160248401525af18015610d0157610d0c575b506040517f42966c6800000000000000000000000000000000000000000000000000000000815286600482015260208160248185885af18015610d0157610cd4575b5086340394348611610ca757873403610bd3575b505060606040967f01fd625a5ce1109c10761818e2ef64ea92cd4966d78086d37e5a4b50e322687892885191825287602083015288820152a360017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b73ffffffffffffffffffffffffffffffffffffffff600a5416803b15610ca3578280916024604051809481937f2e1a7d4d0000000000000000000000000000000000000000000000000000000083528c60048401525af18015610c98579183918893610c7e575b5081809381925af1610c4a613b4c565b5015610c565780610b6a565b807f90b8ec180000000000000000000000000000000000000000000000000000000060049252fd5b610c8b91935082906137fc565b6103e0578186915f610c3a565b6040513d85823e3d90fd5b8280fd5b6024827f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b610cf59060203d602011610cfa575b610ced81836137fc565b810190613a4d565b610b56565b503d610ce3565b6040513d84823e3d90fd5b610d249060203d602011610cfa57610ced81836137fc565b610b14565b9096506020813d602011610d59575b81610d45602093836137fc565b81010312610d555751955f610a99565b5f80fd5b3d9150610d38565b50604051903d90823e3d90fd5b610d869060203d602011610cfa57610ced81836137fc565b610971565b81610d95916137fc565b6102d257805f610906565b6004827f76ecffc0000000000000000000000000000000000000000000000000000000008152fd5b610dea915060203d602011610df0575b610de281836137fc565b810190613b13565b5f6108b8565b503d610dd8565b508590610829565b8091610822565b6004827f1ab7da6b000000000000000000000000000000000000000000000000000000008152fd5b9150600654603c810290808204603c1490151715610ca757610e509042613b3f565b916107d4565b8483526004602052604083205462ffffff169850886107ce575b6004837f3733548a000000000000000000000000000000000000000000000000000000008152fd5b6004847f1f2a2005000000000000000000000000000000000000000000000000000000008152fd5b6004847fd92e233d000000000000000000000000000000000000000000000000000000008152fd5b807fbce361b00000000000000000000000000000000000000000000000000000000060049252fd5b50346102d257806003193601126102d25760206040517f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b088152f35b50346102d25760406003193601126102d257610f656138ef565b73ffffffffffffffffffffffffffffffffffffffff610f82613958565b91610f8b613b7b565b169081156110025760207f16ef4de07b0452a43221c91064fb645963a8e2e60bd8a7514da58d56e315c42291838552600f8252610ff681604087209060ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0083541691151516179055565b6040519015158152a280f35b6004837fd92e233d000000000000000000000000000000000000000000000000000000008152fd5b50346102d25760406003193601126102d2576110446138ef565b73ffffffffffffffffffffffffffffffffffffffff6024359116906040517fa0c50b690000000000000000000000000000000000000000000000000000000081528381600481865afa9081156112b3578491611236575b5060405191815192602081818501956110b58183896139cd565b81016014815203019020549080155f146111f75750925b73ffffffffffffffffffffffffffffffffffffffff60405160208185516110f481838a6139cd565b8101600c81520301902054169283156111cf57602061111e916040518093819287519283916139cd565b8101600b815203019020549081156111a757848202948286040361117a57856040916111769596975260136020522054604051958695865260208601526040850152606084015260a0608084015260a08301906139ee565b0390f35b6024867f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b6004867fe661aed0000000000000000000000000000000000000000000000000000000008152fd5b6004867fd92e233d000000000000000000000000000000000000000000000000000000008152fd5b939080851061120657506110cc565b85604491867fff632bea000000000000000000000000000000000000000000000000000000008352600452602452fd5b90503d8085833e61124781836137fc565b8101906020818303126107125780519067ffffffffffffffff82116112af570181601f8201121561071257805161127d8161383d565b9261128b60405194856137fc565b818452602082840101116112af576112a991602080850191016139cd565b5f61109b565b8580fd5b6040513d86823e3d90fd5b50346102d25760606003193601126102d25760043567ffffffffffffffff81116103e0576112f0903690600401613877565b6112f8613912565b60443562ffffff81169182820361071257611311613b7b565b73ffffffffffffffffffffffffffffffffffffffff811680156111cf57916020916113e39373ffffffffffffffffffffffffffffffffffffffff600754169173ffffffffffffffffffffffffffffffffffffffff600a541691821091825f146114f55780925b156114ed57506040517f1698ee8200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff92831660048201529116602482015262ffffff90921660448301529092839190829081906064820190565b03915afa80156112b35773ffffffffffffffffffffffffffffffffffffffff9185916114ce575b50169081156114a65791611495917f21e3c1439de176cb39006e603b26a8d890fe2267c804597e40d2954871141d7d93604051602081855161144f8183858a016139cd565b8101600d815203019020827fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790556040519384936060855260608501906139ee565b91602084015260408301520390a180f35b6004847f76ecffc0000000000000000000000000000000000000000000000000000000008152fd5b6114e7915060203d602011610df057610de281836137fc565b5f61140a565b905090610829565b8192611377565b50346102d25760206003193601126102d2576004359067ffffffffffffffff82116102d257602073ffffffffffffffffffffffffffffffffffffffff611549826102ac3660048801613877565b8101600c8152030190205416604051908152f35b50346102d25760206003193601126102d2576004358180527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020526040822073ffffffffffffffffffffffffffffffffffffffff33165f5260205260ff60405f205416156115f8576020817f424b07caa75ce8e1c3985f334273f957db9ce138de114e48e50d8240d4d7300b92600655604051908152a180f35b6004827f49e27cff000000000000000000000000000000000000000000000000000000008152fd5b50346102d25760406003193601126102d257611683600435611640613912565b9061167e611679825f527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052600160405f20015490565b613c03565b613e82565b5080f35b50346102d25760406003193601126102d2576116a16138ef565b6116a9613967565b908280527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020526040832073ffffffffffffffffffffffffffffffffffffffff33165f5260205260ff60405f205416156117855773ffffffffffffffffffffffffffffffffffffffff169081156110025762ffffff16906101f482141580611779575b8061176d575b610e70578252600460205260408220907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000082541617905580f35b50612710821415611733565b50610bb882141561172d565b6004837f49e27cff000000000000000000000000000000000000000000000000000000008152fd5b50346102d25760206003193601126102d257604060209173ffffffffffffffffffffffffffffffffffffffff6117e16138ef565b168152601383522054604051908152f35b50346102d257806003193601126102d257602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b50346102d25760606003193601126102d25761185d6138ef565b611865613912565b61186d613935565b918380527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020526040842073ffffffffffffffffffffffffffffffffffffffff33165f5260205260ff60405f205416156119c15773ffffffffffffffffffffffffffffffffffffffff16801580156119a3575b8015611985575b610ec05773ffffffffffffffffffffffffffffffffffffffff929183917fffffffffffffffffffffffff00000000000000000000000000000000000000006007541617600755167fffffffffffffffffffffffff00000000000000000000000000000000000000006008541617600855167fffffffffffffffffffffffff0000000000000000000000000000000000000000600954161760095580f35b5073ffffffffffffffffffffffffffffffffffffffff8316156118e8565b5073ffffffffffffffffffffffffffffffffffffffff8216156118e1565b6004847f49e27cff000000000000000000000000000000000000000000000000000000008152fd5b50346102d25760206003193601126102d2576004359067ffffffffffffffff82116102d257602073ffffffffffffffffffffffffffffffffffffffff611a36826102ac3660048801613877565b8101600d8152030190205416604051908152f35b50346102d25760206003193601126102d257611a646138ef565b8180527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020526040822073ffffffffffffffffffffffffffffffffffffffff33165f5260205260ff60405f205416156115f85773ffffffffffffffffffffffffffffffffffffffff168015611b00577fffffffffffffffffffffffff0000000000000000000000000000000000000000601054161760105580f35b6004827fd92e233d000000000000000000000000000000000000000000000000000000008152fd5b50346102d25760206003193601126102d25760ff604060209273ffffffffffffffffffffffffffffffffffffffff611b5e6138ef565b168152600384522054166040519015158152f35b50346102d25760206003193601126102d25762ffffff604060209273ffffffffffffffffffffffffffffffffffffffff611baa6138ef565b16815260048452205416604051908152f35b50346102d25760206003193601126102d2576004359067ffffffffffffffff82116102d2576020611bf4816102ac3660048701613877565b8101600b81520301902054604051908152f35b50346102d257806003193601126102d257602090604051908152f35b50346102d25760406003193601126102d25760043567ffffffffffffffff81116103e057611c55903690600401613877565b73ffffffffffffffffffffffffffffffffffffffff611c72613912565b611c7a613b7b565b168015611002577f0c7d242571a289736ea536c54ebe236d31ba62abfd4f22b8d54d2988dc0dd94991611d02916040516020818451611cbc81838589016139cd565b8101600c815203019020817fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790556040519283926040845260408401906139ee565b9060208301520390a180f35b50346102d25760406003193601126102d25773ffffffffffffffffffffffffffffffffffffffff6040611d3f613912565b9260043581527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020522091165f52602052602060ff60405f2054166040519015158152f35b50346102d257806003193601126102d2578080527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020526040812073ffffffffffffffffffffffffffffffffffffffff33165f5260205260ff60405f20541615611e8857611df2613f8a565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005416177fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586020604051338152a180f35b807f49e27cff0000000000000000000000000000000000000000000000000000000060049252fd5b50346102d25760206003193601126102d257611eca6138ef565b8180527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020526040822073ffffffffffffffffffffffffffffffffffffffff33165f5260205260ff60405f205416156115f85773ffffffffffffffffffffffffffffffffffffffff168015611b00577fffffffffffffffffffffffff0000000000000000000000000000000000000000600a541617600a5580f35b50346102d257806003193601126102d257602073ffffffffffffffffffffffffffffffffffffffff60105416604051908152f35b50346102d257806003193601126102d2576020600e54604051908152f35b50346102d257611fc736613979565b9083809394527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020526040832073ffffffffffffffffffffffffffffffffffffffff33165f5260205260ff60405f2054161561178557612030929361202b613f8a565b613a65565b80f35b50346102d25760c06003193601126102d25761204d6138ef565b60243590612059613935565b906064359262ffffff8416908185036112af5760843560a4359361207b613f8a565b612083613fdd565b61208e868483614054565b8473ffffffffffffffffffffffffffffffffffffffff821697888a52600360205260ff60408b205416156127115794156126d0575b1561267b575b84421161265357602084612186928a73ffffffffffffffffffffffffffffffffffffffff600754169173ffffffffffffffffffffffffffffffffffffffff600a541690818d10805f1461264c5781935b50156114ed57506040517f1698ee8200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff92831660048201529116602482015262ffffff90921660448301529092839190829081906064820190565b03915afa80156125b55773ffffffffffffffffffffffffffffffffffffffff91899161262d575b5016156126055780156125dd576040517f47e7ef24000000000000000000000000000000000000000000000000000000008152306004820152602481018390526020816044818b8b5af180156125b5576125c0575b506008546040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602481018390526020816044818b8b5af180156125b557612598575b5062ffffff73ffffffffffffffffffffffffffffffffffffffff600a54169360405194612291866137b2565b8886526020808701918252929091166040808701828152306060890190815260808901998a5260a0890188815260c08a0188815260e08b018f815260085495517f414bf3890000000000000000000000000000000000000000000000000000000081529b5173ffffffffffffffffffffffffffffffffffffffff90811660048e01529751881660248d0152935162ffffff1660448c01529151861660648b0152995160848a0152985160a4890152975160c48801529651821660e48701529585916101049183918c91165af1928315612531578793612564575b50821061253c5773ffffffffffffffffffffffffffffffffffffffff60085416604051907f095ea7b300000000000000000000000000000000000000000000000000000000825260048201528660248201526020816044818a8a5af1801561253157612514575b508573ffffffffffffffffffffffffffffffffffffffff600a5416803b156103e0578180916024604051809481937f2e1a7d4d0000000000000000000000000000000000000000000000000000000083528960048401525af18015610d01576124ff575b5080808085885af1612446613b4c565b50156124d757927ff5d6ca9b390b5271e0cbb3d43b4d708d5b17804cb81a4c65e027226d87ccf0e2949273ffffffffffffffffffffffffffffffffffffffff9260c09584600a54169060405196875260208701526040860152606085015260808401521660a0820152a160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005580f35b6004867f90b8ec18000000000000000000000000000000000000000000000000000000008152fd5b81612509916137fc565b6112af57855f612436565b61252c9060203d602011610cfa57610ced81836137fc565b6123d2565b6040513d89823e3d90fd5b6004867f8199f5f3000000000000000000000000000000000000000000000000000000008152fd5b9092506020813d602011612590575b81612580602093836137fc565b81010312610d555751915f61236b565b3d9150612573565b6125b09060203d602011610cfa57610ced81836137fc565b612265565b6040513d8a823e3d90fd5b6125d89060203d602011610cfa57610ced81836137fc565b612202565b6004877f1f2a2005000000000000000000000000000000000000000000000000000000008152fd5b6004877f76ecffc0000000000000000000000000000000000000000000000000000000008152fd5b612646915060203d602011610df057610de281836137fc565b5f6121ad565b8293612119565b6004887f1ab7da6b000000000000000000000000000000000000000000000000000000008152fd5b9350600654603c810290808204603c14901517156126a35761269d9042613b3f565b936120c9565b6024887f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b8789526004602052604089205462ffffff169450846120c3576004897f3733548a000000000000000000000000000000000000000000000000000000008152fd5b60048a7f4e38f95a000000000000000000000000000000000000000000000000000000008152fd5b50346102d25760206003193601126102d257604060209173ffffffffffffffffffffffffffffffffffffffff61276d6138ef565b168152600583522054604051908152f35b50346102d25760206003193601126102d2576004359067ffffffffffffffff82116102d25760206127b6816102ac3660048701613877565b8101601481520301902054604051908152f35b50346102d25760206003193601126102d2576004359067ffffffffffffffff82116102d2576020612801816102ac3660048701613877565b8101601181520301902054604051908152f35b50346102d25761203061282636613979565b9161202b613f8a565b5034610d555760c0600319360112610d55576128496138ef565b602435612854613935565b6064358015918215809203610d555760843562ffffff811690818103610d555760a43561287f613f8a565b612887613fdd565b61289284888a614054565b5f95156129b15750506040517f47e7ef2400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8316600482015260248101869052919050602082806044810103818a73ffffffffffffffffffffffffffffffffffffffff8b165af1908115612531577ffa6ff091ec99bdfd127d51e7786764f2ff7e39f866bbb2a2996e1597052641e49460609473ffffffffffffffffffffffffffffffffffffffff948594612992575b505b6040519788526020880152604087015216941692a360017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005580f35b6129aa9060203d602011610cfa57610ced81836137fc565b505f612954565b80919293955015612fd45773ffffffffffffffffffffffffffffffffffffffff871691825f52600360205260ff60405f20541615612fac579215612f6a575b600654603c810290808204603c1490151715612f3d57612a109042613b3f565b804211612f1557612ac860208573ffffffffffffffffffffffffffffffffffffffff6007541673ffffffffffffffffffffffffffffffffffffffff600a541680881090815f14612f0e578d915b15612f06576040517f1698ee8200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff92831660048201529116602482015262ffffff90921660448301529092839190829081906064820190565b03915afa8015612e015773ffffffffffffffffffffffffffffffffffffffff915f91612ee7575b501615612ebf576040517f47e7ef24000000000000000000000000000000000000000000000000000000008152306004820152602481018890526020816044815f885af18015612e0157612ea2575b506008546040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602481018890526020816044815f885af18015612e0157612e85575b5062ffffff73ffffffffffffffffffffffffffffffffffffffff600a54169460405195612bcd876137b2565b858752602087015216604085015230606085015260808401528560a08401528060c08401525f60e08401526020612cb761010473ffffffffffffffffffffffffffffffffffffffff60085416955f60405197889485937f414bf389000000000000000000000000000000000000000000000000000000008552600485019073ffffffffffffffffffffffffffffffffffffffff60e0809282815116855282602082015116602086015262ffffff60408201511660408601528260608201511660608601526080810151608086015260a081015160a086015260c081015160c0860152015116910152565b5af1928315612e01575f93612e51575b508210612e295760205f91604473ffffffffffffffffffffffffffffffffffffffff6008541660405194859384927f095ea7b300000000000000000000000000000000000000000000000000000000845260048401528160248401525af18015612e0157612e0c575b5073ffffffffffffffffffffffffffffffffffffffff600a5416803b15610d55575f80916024604051809481937f2e1a7d4d0000000000000000000000000000000000000000000000000000000083528760048401525af18015612e0157612dec575b508580808084875af1612da4613b4c565b50156124d75773ffffffffffffffffffffffffffffffffffffffff7ffa6ff091ec99bdfd127d51e7786764f2ff7e39f866bbb2a2996e1597052641e493606093829390612956565b612df99196505f906137fc565b5f945f612d93565b6040513d5f823e3d90fd5b612e249060203d602011610cfa57610ced81836137fc565b612d30565b7f8199f5f3000000000000000000000000000000000000000000000000000000005f5260045ffd5b9092506020813d602011612e7d575b81612e6d602093836137fc565b81010312610d555751915f612cc7565b3d9150612e60565b612e9d9060203d602011610cfa57610ced81836137fc565b612ba1565b612eba9060203d602011610cfa57610ced81836137fc565b612b3e565b7f76ecffc0000000000000000000000000000000000000000000000000000000005f5260045ffd5b612f00915060203d602011610df057610de281836137fc565b5f612aef565b508c90610829565b8091612a5d565b7f1ab7da6b000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b9150805f52600460205262ffffff60405f20541691826129f0577f3733548a000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f4e38f95a000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f22c50cbf000000000000000000000000000000000000000000000000000000005f5260045ffd5b34610d55577f882f47825d4043cd04a564cad4f524a7fe00a604ae024c23dbc8065b77668b4761302b366138bd565b90613034613b7b565b81604051602081845161304a81838589016139cd565b810160148152030190205561306460405192839283613a31565b0390a1005b34610d55575f600319360112610d5557602060ff7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330054166040519015158152f35b34610d55575f600319360112610d5557602073ffffffffffffffffffffffffffffffffffffffff60075416604051908152f35b34610d55576040600319360112610d55576130f66138ef565b335f9081527fb7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d6020526040902054602435919060ff16156131b65773ffffffffffffffffffffffffffffffffffffffff16801561318e576113888211613166575f52600560205260405f20555f80f35b7fc31c0b6e000000000000000000000000000000000000000000000000000000005f5260045ffd5b7fd92e233d000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f49e27cff000000000000000000000000000000000000000000000000000000005f5260045ffd5b34610d55576020600319360112610d55576004355f526002602052602073ffffffffffffffffffffffffffffffffffffffff60405f205416604051908152f35b34610d55575f600319360112610d5557602073ffffffffffffffffffffffffffffffffffffffff60095416604051908152f35b34610d55576020600319360112610d55576004355f526001602052602073ffffffffffffffffffffffffffffffffffffffff60405f205416604051908152f35b34610d55575f600319360112610d5557335f9081527fb7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d602052604090205460ff16156131b6577fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff811615613372577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00167fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6020604051338152a1005b7f8dfc202b000000000000000000000000000000000000000000000000000000005f5260045ffd5b34610d55576040600319360112610d55576133b3613912565b3373ffffffffffffffffffffffffffffffffffffffff8216036133dc5761001a90600435613e82565b7f6697b232000000000000000000000000000000000000000000000000000000005f5260045ffd5b34610d55576040600319360112610d555761001a600435613423613912565b9061345c611679825f527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052600160405f20015490565b613d70565b34610d55576020600319360112610d555760206134ab6004355f527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052600160405f20015490565b604051908152f35b34610d55576020600319360112610d555773ffffffffffffffffffffffffffffffffffffffff6134e16138ef565b165f52600f602052602060ff60405f2054166040519015158152f35b34610d55575f600319360112610d5557602073ffffffffffffffffffffffffffffffffffffffff600a5416604051908152f35b34610d55576020600319360112610d55576004355f525f602052602060405f2054604051908152f35b34610d55576040600319360112610d55576135726138ef565b73ffffffffffffffffffffffffffffffffffffffff60243591613593613b7b565b1690811561318e5760207f911a025fb070fa2a29c37a3bf4c00d16acf15583cd050f17bdbacbab7e72320391835f52601382528060405f2055604051908152a2005b34610d55576040600319360112610d55576135ee6138ef565b6135f6613958565b335f9081527fb7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d602052604090205460ff16156131b65773ffffffffffffffffffffffffffffffffffffffff61001a92165f52600360205260405f209060ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0083541691151516179055565b34610d55577f6a59d469e3757d6e139cdf95b12740f585d553afac49b90bdbe278502a4427186136b0366138bd565b908160405160208184516136c781838589016139cd565b8101600b8152030190205561306460405192839283613a31565b34610d55576020600319360112610d55576004357fffffffff000000000000000000000000000000000000000000000000000000008116809103610d5557807f7965db0b0000000000000000000000000000000000000000000000000000000060209214908115613758575b506040519015158152f35b7f01ffc9a7000000000000000000000000000000000000000000000000000000009150148261374d565b34610d55575f600319360112610d555760209073ffffffffffffffffffffffffffffffffffffffff600854168152f35b610100810190811067ffffffffffffffff8211176137cf57604052565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176137cf57604052565b67ffffffffffffffff81116137cf57601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b81601f82011215610d555780359061388e8261383d565b9261389c60405194856137fc565b82845260208383010111610d5557815f926020809301838601378301015290565b6040600319820112610d55576004359067ffffffffffffffff8211610d55576138e891600401613877565b9060243590565b6004359073ffffffffffffffffffffffffffffffffffffffff82168203610d5557565b6024359073ffffffffffffffffffffffffffffffffffffffff82168203610d5557565b6044359073ffffffffffffffffffffffffffffffffffffffff82168203610d5557565b602435908115158203610d5557565b6024359062ffffff82168203610d5557565b6003196060910112610d555760043573ffffffffffffffffffffffffffffffffffffffff81168103610d5557906024359060443573ffffffffffffffffffffffffffffffffffffffff81168103610d555790565b5f5b8381106139de5750505f910152565b81810151838201526020016139cf565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f602093613a2a815180928187528780880191016139cd565b0116010190565b929190613a486020916040865260408601906139ee565b930152565b90816020910312610d5557518015158103610d555790565b90602091613ae693613a78818484614054565b5f73ffffffffffffffffffffffffffffffffffffffff6040518097819682957f47e7ef24000000000000000000000000000000000000000000000000000000008452600484016020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b0393165af18015612e0157613af85750565b613b109060203d602011610cfa57610ced81836137fc565b50565b90816020910312610d55575173ffffffffffffffffffffffffffffffffffffffff81168103610d555790565b91908201809211612f3d57565b3d15613b76573d90613b5d8261383d565b91613b6b60405193846137fc565b82523d5f602084013e565b606090565b335f9081527f06484cc59dc38e4f67c31122333a17ca81b3ca18cdf02bfc298072fa52b0316a602052604090205460ff1615613bb357565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f52336004527f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b0860245260445ffd5b805f527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260405f2073ffffffffffffffffffffffffffffffffffffffff33165f5260205260ff60405f20541615613c5a5750565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f523360045260245260445ffd5b73ffffffffffffffffffffffffffffffffffffffff81165f9081527fb7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d602052604090205460ff16613d6b5773ffffffffffffffffffffffffffffffffffffffff165f8181527fb7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d6020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790553391907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d8180a4600190565b505f90565b805f527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260ff60405f205416155f14613e7c57805f527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260405f2060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905573ffffffffffffffffffffffffffffffffffffffff339216907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d5f80a4600190565b50505f90565b805f527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260ff60405f2054165f14613e7c57805f527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260405f207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905573ffffffffffffffffffffffffffffffffffffffff339216907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b5f80a4600190565b60ff7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005416613fb557565b7fd93c0665000000000000000000000000000000000000000000000000000000005f5260045ffd5b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00541461402c5760027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7f3ee5aeb5000000000000000000000000000000000000000000000000000000005f5260045ffd5b90919073ffffffffffffffffffffffffffffffffffffffff161561318e5773ffffffffffffffffffffffffffffffffffffffff16801561318e5773ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016811490811561412b575b5061410357156140db57565b7f1f2a2005000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f82d5d76a000000000000000000000000000000000000000000000000000000005f5260045ffd5b905030145f6140cf565b60ff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005460401c161561416457565b7fd7e6bcf8000000000000000000000000000000000000000000000000000000005f5260045ffdfea26469706673582212200a731130a8c5bcf01626a6f678a302cf572f981bffc866cffc5f6e8689e9ff9e64736f6c634300081a0033" const PRC20_CREATION_BYTECODE = "608060405234801561000f575f80fd5b50600436106101a5575f3560e01c806374be2150116100e8578063c701262611610093578063eddeb1231161006e578063eddeb12314610457578063f687d12a1461046a578063f97c007a1461047d578063fc5fecd514610486575f80fd5b8063c7012626146103cb578063d9eeebed146103de578063dd62ed3e14610412575f80fd5b8063b84c8246116100c3578063b84c82461461037e578063c47f002714610391578063c6f1b7e7146103a4575f80fd5b806374be21501461033c57806395d89b4114610363578063a9059cbb1461036b575f80fd5b806323b872dd1161015357806347e7ef241161012e57806347e7ef24146102a1578063609c92b8146102b4578063701cd43b146102e857806370a0823114610307575f80fd5b806323b872dd14610266578063313ce5671461027957806342966c681461028e575f80fd5b8063091d278811610183578063091d278814610224578063095ea7b31461023b57806318160ddd1461025e575f80fd5b8063044d9371146101a957806306fdde03146101fa57806307e2bd8d1461020f575b5f80fd5b6101d07f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b610202610499565b6040516101f1919061143c565b61022261021d366004611479565b610529565b005b61022d60015481565b6040519081526020016101f1565b61024e610249366004611494565b6105ef565b60405190151581526020016101f1565b60065461022d565b61024e6102743660046114be565b6106ae565b60055460405160ff90911681526020016101f1565b61024e61029c3660046114fc565b61079b565b61024e6102af366004611494565b6107ae565b6102db7f000000000000000000000000000000000000000000000000000000000000000081565b6040516101f19190611513565b5f546101d09073ffffffffffffffffffffffffffffffffffffffff1681565b61022d610315366004611479565b73ffffffffffffffffffffffffffffffffffffffff165f9081526007602052604090205490565b61022d7f000000000000000000000000000000000000000000000000000000000000000081565b610202610879565b61024e610379366004611494565b610888565b61022261038c36600461157f565b61089d565b61022261039f36600461157f565b61091c565b6101d07f000000000000000000000000000000000000000000000000000000000000000081565b61024e6103d936600461166f565b610997565b6103e6610af9565b6040805173ffffffffffffffffffffffffffffffffffffffff90931683526020830191909152016101f1565b61022d6104203660046116e1565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260086020908152604080832093909416825291909152205490565b6102226104653660046114fc565b610d04565b6102226104783660046114fc565b610da8565b61022d60025481565b6103e66104943660046114fc565b610e4c565b6060600380546104a890611718565b80601f01602080910402602001604051908101604052809291908181526020018280546104d490611718565b801561051f5780601f106104f65761010080835404028352916020019161051f565b820191905f5260205f20905b81548152906001019060200180831161050257829003601f168201915b5050505050905090565b73ffffffffffffffffffffffffffffffffffffffff8116610576576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f412d5a95dc32cbb6bd9319bccf1bc1febeda71e734893a440f1f6853252fe99f906020015b60405180910390a150565b5f73ffffffffffffffffffffffffffffffffffffffff831661063d576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b335f81815260086020908152604080832073ffffffffffffffffffffffffffffffffffffffff881680855290835292819020869055518581529192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a35060015b92915050565b5f6106ba848484611055565b73ffffffffffffffffffffffffffffffffffffffff84165f90815260086020908152604080832033845290915290205482811015610724576040517f10bad14700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff85165f81815260086020908152604080832033808552908352928190208786039081905590519081529192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3506001949350505050565b5f6107a6338361119c565b506001919050565b5f6107b983836112ed565b6040517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000060601b1660208201527f67fc7bdaed5b0ec550d8706b87d60568ab70c6b781263c70101d54cd1564aab390603401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290526108689186908690611769565b60405180910390a150600192915050565b6060600480546104a890611718565b5f610894338484611055565b50600192915050565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461090c576040517f6626eaef00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600461091882826117ef565b5050565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461098b576040517f6626eaef00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600361091882826117ef565b5f805f6109a2610af9565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166024830152604482018390529294509092505f918416906323b872dd906064016020604051808303815f875af1158015610a42573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a669190611906565b905080610a9f576040517f0a7cd6d600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610aa9338661119c565b7f9ffbffc04a397460ee1dbe8c9503e098090567d6b7f4b3c02a8617d800b6d9553388888886600254604051610ae496959493929190611925565b60405180910390a15060019695505050505050565b5f80546040517f7471e6970000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000006004820152829173ffffffffffffffffffffffffffffffffffffffff1690637471e69790602401602060405180830381865afa158015610b85573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ba991906119a5565b915073ffffffffffffffffffffffffffffffffffffffff8216610bf8576040517f3d5729c100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80546040517fd7fd7afb0000000000000000000000000000000000000000000000000000000081527f0000000000000000000000000000000000000000000000000000000000000000600482015273ffffffffffffffffffffffffffffffffffffffff9091169063d7fd7afb90602401602060405180830381865afa158015610c84573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ca891906119c0565b9050805f03610ce3576040517fe661aed000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600254600154610cf39083611a04565b610cfd9190611a1b565b9150509091565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610d73576040517f6626eaef00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60028190556040518181527fef13af88e424b5d15f49c77758542c1938b08b8b95b91ed0751f98ba99000d8f906020016105e4565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610e17576040517f6626eaef00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018190556040518181527fff5788270f43bfc1ca41c503606d2594aa3023a1a7547de403a3e2f146a4a80a906020016105e4565b5f80546040517f7471e6970000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000006004820152829173ffffffffffffffffffffffffffffffffffffffff1690637471e69790602401602060405180830381865afa158015610ed8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610efc91906119a5565b915073ffffffffffffffffffffffffffffffffffffffff8216610f4b576040517f3d5729c100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80546040517fd7fd7afb0000000000000000000000000000000000000000000000000000000081527f0000000000000000000000000000000000000000000000000000000000000000600482015273ffffffffffffffffffffffffffffffffffffffff9091169063d7fd7afb90602401602060405180830381865afa158015610fd7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ffb91906119c0565b9050805f03611036576040517fe661aed000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002546110438583611a04565b61104d9190611a1b565b915050915091565b73ffffffffffffffffffffffffffffffffffffffff8316158061108c575073ffffffffffffffffffffffffffffffffffffffff8216155b156110c3576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff83165f9081526007602052604090205481811015611122576040517ffe382aa700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8085165f8181526007602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061118e9086815260200190565b60405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff82166111e9576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f03611222576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82165f9081526007602052604090205481811015611281576040517ffe382aa700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff83165f8181526007602090815260408083208686039055600680548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff821661133a576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f03611373576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600680548201905573ffffffffffffffffffffffffffffffffffffffff82165f818152600760209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b5f81518084525f5b818110156113ff576020818501810151868301820152016113e3565b505f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f61144e60208301846113db565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff81168114611476575f80fd5b50565b5f60208284031215611489575f80fd5b813561144e81611455565b5f80604083850312156114a5575f80fd5b82356114b081611455565b946020939093013593505050565b5f805f606084860312156114d0575f80fd5b83356114db81611455565b925060208401356114eb81611455565b929592945050506040919091013590565b5f6020828403121561150c575f80fd5b5035919050565b602081016003831061154c577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b91905290565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f6020828403121561158f575f80fd5b813567ffffffffffffffff8111156115a5575f80fd5b8201601f810184136115b5575f80fd5b803567ffffffffffffffff8111156115cf576115cf611552565b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8501160116810181811067ffffffffffffffff8211171561163b5761163b611552565b604052818152828201602001861015611652575f80fd5b816020840160208301375f91810160200191909152949350505050565b5f805f60408486031215611681575f80fd5b833567ffffffffffffffff811115611697575f80fd5b8401601f810186136116a7575f80fd5b803567ffffffffffffffff8111156116bd575f80fd5b8660208284010111156116ce575f80fd5b6020918201979096509401359392505050565b5f80604083850312156116f2575f80fd5b82356116fd81611455565b9150602083013561170d81611455565b809150509250929050565b600181811c9082168061172c57607f821691505b602082108103611763577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b606081525f61177b60608301866113db565b73ffffffffffffffffffffffffffffffffffffffff9490941660208301525060400152919050565b601f8211156117ea57805f5260205f20601f840160051c810160208510156117c85750805b601f840160051c820191505b818110156117e7575f81556001016117d4565b50505b505050565b815167ffffffffffffffff81111561180957611809611552565b61181d816118178454611718565b846117a3565b6020601f82116001811461186e575f83156118385750848201515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600385901b1c1916600184901b1784556117e7565b5f848152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08516915b828110156118bb578785015182556020948501946001909201910161189b565b50848210156118f757868401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b60f8161c191681555b50505050600190811b01905550565b5f60208284031215611916575f80fd5b8151801515811461144e575f80fd5b73ffffffffffffffffffffffffffffffffffffffff8716815260a060208201528460a0820152848660c08301375f60c086830101525f60c07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8801168301019050846040830152836060830152826080830152979650505050505050565b5f602082840312156119b5575f80fd5b815161144e81611455565b5f602082840312156119d0575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b80820281158282048414176106a8576106a86119d7565b808201808211156106a8576106a86119d756fea26469706673582212206be692aa215f21df823c52c689a11caa03254730bfade7b8b36788d6a72ba61764736f6c634300081a0033" -const UNIVERSAL_GATEWAY_PC_BYTECODE = "6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a714610f6857508063248a9ca314610ef85780632f2ff15d14610e7d57806336568abe14610df55780633f4ba83a14610d1d5780635c975abb14610cbe5780637f57735014610c6e5780638456cb5914610b935780638e61856014610a6a57806391d14854146109d6578063a217fddf1461099e578063affed0e014610963578063b3ca1fbc1461058e578063c1ee135a1461053d578063d547741f146104bb578063e63ab1e9146104635763f8c8765e146100d7575f80fd5b3461045f5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261045f5761010e611047565b610116611024565b9060443573ffffffffffffffffffffffffffffffffffffffff811680910361045f576064359173ffffffffffffffffffffffffffffffffffffffff831680930361045f577ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00549360ff8560401c16159467ffffffffffffffff811680159081610457575b600114908161044d575b159081610444575b5061041c578560017fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008316177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00556103c7575b5073ffffffffffffffffffffffffffffffffffffffff82161580156103a9575b80156103a1575b8015610399575b61037157610281610287926102406117ef565b6102486117ef565b6102506117ef565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005561027c6117ef565b6112c6565b506113ad565b507fffffffffffffffffffffffff00000000000000000000000000000000000000005f5416175f557fffffffffffffffffffffffff000000000000000000000000000000000000000060015416176001556102de57005b7fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054167ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00557fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2602060405160018152a1005b7fd92e233d000000000000000000000000000000000000000000000000000000005f5260045ffd5b50831561022d565b508215610226565b5073ffffffffffffffffffffffffffffffffffffffff81161561021f565b7fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000001668010000000000000001177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00555f6101ff565b7ff92ee8a9000000000000000000000000000000000000000000000000000000005f5260045ffd5b9050155f6101ac565b303b1591506101a4565b87915061019a565b5f80fd5b3461045f575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261045f5760206040517f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a8152f35b3461045f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261045f5761053b6004356104f8611024565b90610536610531825f527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052600160405f20015490565b611240565b6115c3565b005b3461045f575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261045f57602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b3461045f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261045f5760043567ffffffffffffffff811161045f578060040160c07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc833603011261045f5761060761171f565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00541461093b5761063981611772565b6040805191610648828461106a565b600f83527f6569703135353a313131353531313100000000000000000000000000000000006020840152600254946001860180871161090e576002556024810193610692856110ab565b9360448301359460848401936106a8858a6110cc565b97909a67ffffffffffffffff89116108e1578451956106ef601f8b017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0166020018861106a565b8987526020870197368e8c011161045f576107e36107da6107f99f8f9d60a499610807976107c273ffffffffffffffffffffffffffffffffffffffff9f61082f9f908f915f6020886107cb996107d29b8637830101525190209281519373ffffffffffffffffffffffffffffffffffffffff928593602085019733895216908401528d6060840152608083015260c060a083015261079060e083018c61111d565b9060c0830152037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0810183528261106a565b5190209f6110ab565b9d806110cc565b93909f6110cc565b979096016110ab565b9c87519e8f93610140855261014085019061111d565b92602081850391015261117a565b938b0152600160608b015261520860808b015261520860a08b015289830360c08b015261117a565b9461520860e08801521661010086015260048110156108b4577fd8352005a8b681f8cf230f28f60cef58ebe9a25d92e88f72cb6cb78799a6ca6d9173ffffffffffffffffffffffffffffffffffffffff9161012087015216938033940390a460017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b7f3ee5aeb5000000000000000000000000000000000000000000000000000000005f5260045ffd5b3461045f575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261045f576020600254604051908152f35b3461045f575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261045f5760206040515f8152f35b3461045f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261045f57610a0d611024565b6004355f527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205273ffffffffffffffffffffffffffffffffffffffff60405f2091165f52602052602060ff60405f2054166040519015158152f35b3461045f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261045f57610aa1611047565b335f9081527fb7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d602052604090205460ff1615610b635773ffffffffffffffffffffffffffffffffffffffff90610af561171f565b1680156103715773ffffffffffffffffffffffffffffffffffffffff600154827fffffffffffffffffffffffff0000000000000000000000000000000000000000821617600155167fd0ef78509e8ed82196200827f0d10672cfab667994f990456881f413c1c475eb5f80a3005b7fe2517d3f000000000000000000000000000000000000000000000000000000005f52336004525f60245260445ffd5b3461045f575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261045f57610bc96111b8565b610bd161171f565b610bd961171f565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005416177fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586020604051338152a1005b3461045f575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261045f57602073ffffffffffffffffffffffffffffffffffffffff5f5416604051908152f35b3461045f575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261045f57602060ff7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330054166040519015158152f35b3461045f575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261045f57610d536111b8565b610d5b6116cb565b610d636116cb565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330054167fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6020604051338152a1005b3461045f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261045f57610e2c611024565b3373ffffffffffffffffffffffffffffffffffffffff821603610e555761053b906004356115c3565b7f6697b232000000000000000000000000000000000000000000000000000000005f5260045ffd5b3461045f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261045f5761053b600435610eba611024565b90610ef3610531825f527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052600160405f20015490565b6114b1565b3461045f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261045f576020610f606004355f527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052600160405f20015490565b604051908152f35b3461045f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261045f57600435907fffffffff00000000000000000000000000000000000000000000000000000000821680920361045f57817f7965db0b0000000000000000000000000000000000000000000000000000000060209314908115610ffa575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501483610ff3565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361045f57565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361045f57565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176108e157604052565b3573ffffffffffffffffffffffffffffffffffffffff8116810361045f5790565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18136030182121561045f570180359067ffffffffffffffff821161045f5760200191813603831361045f57565b91908251928382525f5b8481106111655750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f845f6020809697860101520116010190565b80602080928401015182828601015201611127565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe093818652868601375f8582860101520116010190565b335f9081527f75442b0a96088b5456bc4ed01394c96a4feec0f883c9494257d76b96ab1c9b6b602052604090205460ff16156111f057565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f52336004527f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a60245260445ffd5b805f527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260405f2073ffffffffffffffffffffffffffffffffffffffff33165f5260205260ff60405f205416156112975750565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f523360045260245260445ffd5b73ffffffffffffffffffffffffffffffffffffffff81165f9081527fb7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d602052604090205460ff166113a85773ffffffffffffffffffffffffffffffffffffffff165f8181527fb7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d6020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790553391907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d8180a4600190565b505f90565b73ffffffffffffffffffffffffffffffffffffffff81165f9081527f75442b0a96088b5456bc4ed01394c96a4feec0f883c9494257d76b96ab1c9b6b602052604090205460ff166113a85773ffffffffffffffffffffffffffffffffffffffff165f8181527f75442b0a96088b5456bc4ed01394c96a4feec0f883c9494257d76b96ab1c9b6b6020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790553391907f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9080a4600190565b805f527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260ff60405f205416155f146115bd57805f527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260405f2060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905573ffffffffffffffffffffffffffffffffffffffff339216907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d5f80a4600190565b50505f90565b805f527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260ff60405f2054165f146115bd57805f527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260405f207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905573ffffffffffffffffffffffffffffffffffffffff339216907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b5f80a4600190565b60ff7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005416156116f757565b7f8dfc202b000000000000000000000000000000000000000000000000000000005f5260045ffd5b60ff7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300541661174a57565b7fd93c0665000000000000000000000000000000000000000000000000000000005f5260045ffd5b61177f60808201826110cc565b15801592604001351591506117e85781806117e0575b6117d957816117d1575b506117cc577fb4fa3fb3000000000000000000000000000000000000000000000000000000005f5260045ffd5b600190565b90505f61179f565b5050600390565b508015611795565b5050600290565b60ff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005460401c161561181e57565b7fd7e6bcf8000000000000000000000000000000000000000000000000000000005f5260045ffdfea26469706673582212206796924c3fa73cff81856f96b0134a35adc90b65de0eff7f3363998084206a5064736f6c634300081a0033" +const UNIVERSAL_GATEWAY_PC_BYTECODE = "6080806040526004361015610012575f80fd5b5f3560e01c9081637f577350146102f757508063affed0e0146102da578063b3ca1fbc146100745763c1ee135a14610048575f80fd5b34610070575f366003190112610070576001546040516001600160a01b039091168152602090f35b5f80fd5b60203660031901126100705760043567ffffffffffffffff8111610070578060040160c0600319833603011261007057600254600181018082116102c6576002556100bf8280610319565b91909360248101926100d08461034c565b60448301359060848401976100e58989610319565b67ffffffffffffffff81969296116102b2576040519061010f601f8201601f191660200183610360565b80825260208201933682890111610070577f8882d1d8f7b1750e49d021ea8d62e07c2d163645b8fa31c035905d6572ffc637996101d060a49787610186965f60208861027f9f996101e49a6101ed9e37830101525190206040519687956020870199338b5260e06040890152610100880191610382565b6001600160a01b039092166060860152608085018b905260a0850152838103601f190160c0850152600f81526e6569703135353a313131353531313160881b602082015260400190565b9060e083015203601f198101835282610360565b5190209661034c565b936102556102126102096102018b80610319565b9c909b610319565b9490930161034c565b986040519a6101608c526102476101608d01604090600f81526e6569703135353a313131353531313160881b60208201520190565b8c810360208e015291610382565b9260408a015261111160608a0152606f60808a015261520860a08a015288830360c08a0152610382565b5f60e087018190526001600160a01b039586166101008801526002610120880152610140870152931693339381900390a4005b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b34610070575f366003190112610070576020600254604051908152f35b34610070575f366003190112610070575f546001600160a01b03168152602090f35b903590601e1981360301821215610070570180359067ffffffffffffffff82116100705760200191813603831361007057565b356001600160a01b03811681036100705790565b90601f8019910116810190811067ffffffffffffffff8211176102b257604052565b908060209392818452848401375f828201840152601f01601f191601019056fea264697066735822122079614179005ddf0c314633ad63c96a5c52a1a1b032f71791f9eddc160bd868ed64736f6c634300081a0033" const UEA_MIGRATION_BYTECODE = "608060405234801561000f575f80fd5b506004361061006f575f3560e01c80639538c4b31161004d5780639538c4b3146100e7578063a5df53a01461010b578063f6829c321461012a575f80fd5b806352fa5c221461007357806367f102111461007d5780638c9ec7f5146100c7575b5f80fd5b61007b610132565b005b60025461009d9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b60015461009d9073ffffffffffffffffffffffffffffffffffffffff1681565b6100fb6100f5366004610248565b3b151590565b60405190151581526020016100be565b5f5461009d9073ffffffffffffffffffffffffffffffffffffffff1681565b61007b61018a565b610e077f868a771a75a4aa6c2be13e9a9617cb8ea240ed84a3a90c8469537393ec3e115d81815560405190919081907f310ba5f1d2ed074b51e2eccd052a47ae9ab7c6b800d1fca3db3999d6a592ca03905f90a25050565b5f5473ffffffffffffffffffffffffffffffffffffffff1630036101da576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025473ffffffffffffffffffffffffffffffffffffffff167f868a771a75a4aa6c2be13e9a9617cb8ea240ed84a3a90c8469537393ec3e115d81815560405190919081907f310ba5f1d2ed074b51e2eccd052a47ae9ab7c6b800d1fca3db3999d6a592ca03905f90a25050565b5f60208284031215610258575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff8116811461027b575f80fd5b939250505056fea2646970667358221220b7392b390eabe1d8398ca6a63c585fe969825199b6bfe2a285e4edf564c16b6a64736f6c634300081a0033" From a3b701254d55d221f876d63855568ba6a16a0a1a Mon Sep 17 00:00:00 2001 From: Nilesh Gupta Date: Fri, 13 Mar 2026 17:29:19 +0530 Subject: [PATCH 29/36] refactor: added generated protobuf --- x/uexecutor/types/types.pb.go | 327 +++++++++++++++++++++++----------- 1 file changed, 220 insertions(+), 107 deletions(-) diff --git a/x/uexecutor/types/types.pb.go b/x/uexecutor/types/types.pb.go index 41fbf44e..b1656633 100644 --- a/x/uexecutor/types/types.pb.go +++ b/x/uexecutor/types/types.pb.go @@ -871,6 +871,8 @@ type OutboundTx struct { OutboundStatus Status `protobuf:"varint,13,opt,name=outbound_status,json=outboundStatus,proto3,enum=uexecutor.v1.Status" json:"outbound_status,omitempty"` RevertInstructions *RevertInstructions `protobuf:"bytes,14,opt,name=revert_instructions,json=revertInstructions,proto3" json:"revert_instructions,omitempty"` PcRevertExecution *PCTx `protobuf:"bytes,15,opt,name=pc_revert_execution,json=pcRevertExecution,proto3" json:"pc_revert_execution,omitempty"` + GasPrice string `protobuf:"bytes,16,opt,name=gas_price,json=gasPrice,proto3" json:"gas_price,omitempty"` + GasFee string `protobuf:"bytes,17,opt,name=gas_fee,json=gasFee,proto3" json:"gas_fee,omitempty"` } func (m *OutboundTx) Reset() { *m = OutboundTx{} } @@ -1010,6 +1012,20 @@ func (m *OutboundTx) GetPcRevertExecution() *PCTx { return nil } +func (m *OutboundTx) GetGasPrice() string { + if m != nil { + return m.GasPrice + } + return "" +} + +func (m *OutboundTx) GetGasFee() string { + if m != nil { + return m.GasFee + } + return "" +} + type UniversalTx struct { Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` InboundTx *Inbound `protobuf:"bytes,2,opt,name=inbound_tx,json=inboundTx,proto3" json:"inbound_tx,omitempty"` @@ -1370,115 +1386,116 @@ func init() { func init() { proto.RegisterFile("uexecutor/v1/types.proto", fileDescriptor_fab6d3ca71d1e2a5) } var fileDescriptor_fab6d3ca71d1e2a5 = []byte{ - // 1717 bytes of a gzipped FileDescriptorProto + // 1742 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x58, 0x4b, 0x6f, 0xdb, 0xd8, 0x15, 0x36, 0xa9, 0xf7, 0x91, 0x63, 0x51, 0xd7, 0x4e, 0xc2, 0x24, 0x63, 0xd9, 0xd1, 0xcc, 0x34, - 0x86, 0x8b, 0xd8, 0x1d, 0xb7, 0x1d, 0xa0, 0x02, 0x8a, 0x42, 0x96, 0x69, 0x8f, 0x5a, 0x8f, 0xac, - 0x52, 0x92, 0x91, 0xe9, 0x86, 0xa0, 0xc9, 0x1b, 0x9a, 0xa8, 0x44, 0x0a, 0x7c, 0xa8, 0xf4, 0xa2, - 0xab, 0xee, 0x8a, 0x2e, 0xba, 0xcc, 0x32, 0xcb, 0xa2, 0x5d, 0xb4, 0x05, 0xfa, 0x23, 0x66, 0x39, - 0xdd, 0x15, 0xe8, 0xa6, 0x48, 0x16, 0x2d, 0xd0, 0x3f, 0x51, 0xdc, 0x07, 0x45, 0x52, 0x8f, 0xc9, - 0x14, 0x59, 0x14, 0xe8, 0x26, 0xe6, 0x79, 0xdc, 0x73, 0xbf, 0x73, 0xbe, 0x73, 0xce, 0x75, 0x0c, - 0x72, 0x88, 0x23, 0x6c, 0x84, 0x81, 0xeb, 0x1d, 0xcf, 0x3e, 0x39, 0x0e, 0xee, 0xa6, 0xd8, 0x3f, - 0x9a, 0x7a, 0x6e, 0xe0, 0xa2, 0xcd, 0xb9, 0xe5, 0x68, 0xf6, 0xc9, 0xe3, 0x1d, 0xcb, 0xb5, 0x5c, - 0x6a, 0x38, 0x26, 0x5f, 0xcc, 0xe7, 0x71, 0x5d, 0x9f, 0xd8, 0x8e, 0x7b, 0x4c, 0xff, 0x65, 0xaa, - 0xe6, 0x39, 0x14, 0xfb, 0xba, 0xa7, 0x4f, 0x7c, 0xb4, 0x0b, 0xe0, 0xbb, 0x13, 0xac, 0xcd, 0xf4, - 0x71, 0x88, 0x65, 0x71, 0x5f, 0x38, 0x28, 0xab, 0x15, 0xa2, 0xb9, 0x26, 0x8a, 0xd6, 0xee, 0xab, - 0xd7, 0x7b, 0x1b, 0xff, 0x7a, 0xbd, 0x27, 0xfc, 0xfa, 0x9f, 0x7f, 0x3a, 0x94, 0x12, 0x18, 0x53, - 0x7a, 0xba, 0xf9, 0x77, 0x11, 0xa4, 0x91, 0x63, 0xcf, 0xb0, 0xe7, 0xeb, 0xe3, 0xbe, 0x7e, 0x37, - 0x76, 0x75, 0x13, 0x6d, 0x81, 0x18, 0xb8, 0xb2, 0xb0, 0x2f, 0x1c, 0x54, 0x54, 0x31, 0x70, 0xd1, - 0x0e, 0x14, 0x92, 0xe8, 0x15, 0x95, 0x09, 0x08, 0x41, 0xde, 0xd4, 0x03, 0x5d, 0xce, 0x51, 0x25, - 0xfd, 0x46, 0x4f, 0xa0, 0x62, 0xe9, 0xbe, 0x36, 0xb6, 0x27, 0x76, 0x20, 0xe7, 0xa9, 0xa1, 0x6c, - 0xe9, 0xfe, 0x25, 0x91, 0xd1, 0xc7, 0x50, 0x9b, 0xe8, 0x91, 0xf6, 0x12, 0x63, 0x6d, 0x8a, 0x3d, - 0xcd, 0xd2, 0x7d, 0xb9, 0x40, 0x5d, 0x36, 0x27, 0x7a, 0x74, 0x8e, 0x71, 0x1f, 0x7b, 0x17, 0xba, - 0x8f, 0x3e, 0x05, 0x99, 0xb8, 0x4d, 0x3d, 0xdb, 0xf5, 0xec, 0xe0, 0x2e, 0xe3, 0x5f, 0xa4, 0xfe, - 0x3b, 0x13, 0x3d, 0xea, 0x73, 0x73, 0x72, 0x6e, 0x07, 0x0a, 0x8e, 0xeb, 0x18, 0x58, 0x2e, 0x31, - 0x94, 0x54, 0x40, 0x8f, 0xa1, 0x6c, 0x62, 0xdd, 0x1c, 0xdb, 0x0e, 0x96, 0xcb, 0x0c, 0x50, 0x2c, - 0xa3, 0xef, 0x43, 0x71, 0xa6, 0x11, 0x32, 0xe4, 0xca, 0xbe, 0x70, 0xb0, 0x75, 0xd2, 0x38, 0x4a, - 0x93, 0x71, 0x74, 0x8d, 0x3d, 0xfb, 0xa5, 0x6d, 0xe8, 0x81, 0xed, 0x3a, 0xc3, 0xbb, 0x29, 0x56, - 0x0b, 0x33, 0xf2, 0xa3, 0x75, 0x90, 0x2e, 0xe9, 0x93, 0xa4, 0xa4, 0x61, 0x5c, 0x47, 0x6d, 0xca, - 0x0a, 0xd9, 0xfc, 0x8d, 0x00, 0xd2, 0xe7, 0xb6, 0xe5, 0xd1, 0x10, 0x71, 0x75, 0x3f, 0x80, 0xca, - 0x24, 0xd6, 0xf1, 0x22, 0x27, 0x8a, 0x24, 0x0b, 0x71, 0x5d, 0x16, 0xb9, 0x6c, 0x16, 0x6b, 0xe1, - 0xcc, 0x63, 0xce, 0xe1, 0xbc, 0x12, 0x00, 0xcd, 0xc9, 0x6e, 0x1b, 0x86, 0x1b, 0x3a, 0x41, 0xd7, - 0x44, 0xcf, 0xa0, 0x66, 0xdc, 0xea, 0xb6, 0xa3, 0x39, 0xfa, 0x04, 0xfb, 0x53, 0xdd, 0xc0, 0x1c, - 0xd6, 0x16, 0x55, 0xf7, 0x62, 0x2d, 0x7a, 0x04, 0x65, 0xe6, 0x68, 0x9b, 0x1c, 0x5e, 0x89, 0xca, - 0x5d, 0x93, 0xc0, 0x76, 0x7f, 0xe1, 0x60, 0x8f, 0xa3, 0x63, 0xc2, 0x37, 0xa8, 0x94, 0xce, 0x50, - 0x34, 0x0d, 0x40, 0x2a, 0x9e, 0x61, 0x2f, 0xe8, 0x3a, 0x7e, 0xe0, 0x85, 0x06, 0xc1, 0xed, 0xa3, - 0x8f, 0x61, 0xeb, 0x65, 0xe8, 0x98, 0x9a, 0x87, 0x0d, 0x7b, 0x6a, 0x63, 0x27, 0xe0, 0xc0, 0xee, - 0x11, 0xad, 0x1a, 0x2b, 0x5b, 0xdf, 0x8a, 0xaf, 0xd8, 0x4d, 0xae, 0xf0, 0x68, 0x34, 0xcd, 0x4e, - 0x85, 0x6b, 0xfe, 0x3b, 0x07, 0xa5, 0xae, 0x73, 0xe3, 0x86, 0x8e, 0x89, 0x9e, 0xc2, 0xa6, 0xef, - 0x86, 0x9e, 0x81, 0x35, 0x9a, 0x02, 0x0f, 0x5c, 0x65, 0xba, 0x0e, 0x51, 0xa1, 0x87, 0x50, 0x0a, - 0x22, 0xed, 0x56, 0xf7, 0x6f, 0x79, 0xb6, 0xc5, 0x20, 0xfa, 0x4c, 0xf7, 0x6f, 0xd1, 0x03, 0x28, - 0xfa, 0xd8, 0x31, 0xe7, 0xd9, 0x72, 0x89, 0x30, 0x9b, 0x20, 0x65, 0xdd, 0x9f, 0x28, 0xc8, 0x29, - 0x7d, 0x42, 0x92, 0xe5, 0x5d, 0xcf, 0x25, 0x32, 0xc0, 0xba, 0xef, 0xe3, 0x40, 0xd3, 0x4d, 0xd3, - 0xe3, 0x1d, 0x5e, 0xa1, 0x9a, 0xb6, 0x69, 0x7a, 0x64, 0xa4, 0xc6, 0xae, 0xa5, 0xd9, 0x8e, 0x89, - 0x23, 0xde, 0xda, 0xe5, 0xb1, 0x6b, 0x75, 0x89, 0x8c, 0x9e, 0x53, 0x88, 0xb4, 0x85, 0xcb, 0xb4, - 0x85, 0x77, 0xb2, 0x2d, 0x3c, 0x8c, 0x68, 0xe3, 0x16, 0x03, 0xfa, 0x13, 0xfd, 0x04, 0xea, 0x4b, - 0x4d, 0x4a, 0x7b, 0xbf, 0xba, 0xd8, 0xfb, 0x8b, 0x3b, 0x41, 0x95, 0xc2, 0xc5, 0x2d, 0xf1, 0x6d, - 0xa8, 0xcf, 0x52, 0x13, 0xa2, 0xd1, 0x65, 0x00, 0x14, 0xa0, 0x94, 0x36, 0x9c, 0x91, 0xc5, 0xf0, - 0x53, 0xd8, 0x5e, 0xc1, 0x88, 0x5c, 0xa5, 0x77, 0xef, 0x67, 0xef, 0x5e, 0x6e, 0x04, 0x15, 0x79, - 0xcb, 0xcd, 0xb1, 0x03, 0x05, 0xdb, 0xef, 0x28, 0x6d, 0x79, 0x93, 0xee, 0x3c, 0x26, 0xb4, 0xca, - 0x71, 0xcb, 0x35, 0xbf, 0x14, 0x20, 0xdf, 0xef, 0x0c, 0xa3, 0x34, 0x8f, 0xc2, 0x1a, 0x1e, 0xc5, - 0x0c, 0x8f, 0x8f, 0x80, 0x2c, 0x2d, 0x2d, 0xf4, 0xb1, 0x49, 0x19, 0xce, 0xab, 0x25, 0x4b, 0xf7, - 0x47, 0x3e, 0xa6, 0x6d, 0x73, 0x33, 0x76, 0x8d, 0x9f, 0x6b, 0xb7, 0xd8, 0xb6, 0x6e, 0x19, 0xcb, - 0x79, 0xb5, 0x4a, 0x75, 0x9f, 0x51, 0x15, 0x8d, 0x1a, 0xe8, 0x41, 0x18, 0x6f, 0x2b, 0x2e, 0x11, - 0x22, 0xb1, 0xe7, 0xb9, 0x9e, 0x36, 0xf1, 0xad, 0x98, 0x48, 0xaa, 0xf8, 0xdc, 0xb7, 0x5a, 0x1f, - 0xa4, 0x27, 0xa5, 0x96, 0x5a, 0xd3, 0x86, 0x16, 0x44, 0xcd, 0x3f, 0x0b, 0xb0, 0x7d, 0x15, 0x06, - 0xb4, 0x73, 0xaf, 0x6e, 0x7c, 0xec, 0xcd, 0xd8, 0xb2, 0x90, 0xa1, 0xe4, 0x87, 0x86, 0x81, 0x7d, - 0x9f, 0x66, 0x56, 0x56, 0x63, 0x71, 0x09, 0xa7, 0xb8, 0x8c, 0x33, 0x55, 0x96, 0x5c, 0xa6, 0x2c, - 0x19, 0xa0, 0xf9, 0x05, 0xa0, 0xcf, 0x62, 0x90, 0x8d, 0x04, 0xa4, 0xcb, 0xa1, 0x69, 0x6e, 0x82, - 0xad, 0x39, 0x81, 0xda, 0x95, 0x67, 0x5b, 0xb6, 0xa3, 0x07, 0xb6, 0x63, 0xf5, 0x8d, 0xaf, 0x23, - 0x22, 0xd3, 0xe3, 0x62, 0xb6, 0xc7, 0x5b, 0x1f, 0xad, 0x58, 0x20, 0x6e, 0x12, 0x59, 0x63, 0x25, - 0xfa, 0x63, 0x01, 0x20, 0x2e, 0xd1, 0x30, 0x22, 0xcd, 0x69, 0x62, 0x3f, 0xa0, 0x3e, 0xae, 0x93, - 0x99, 0x71, 0x29, 0x65, 0x60, 0x83, 0x9e, 0x99, 0x5b, 0x71, 0xfd, 0xdc, 0xe6, 0x32, 0x73, 0x7b, - 0x04, 0xdb, 0x38, 0x0a, 0xb0, 0xe7, 0x90, 0x35, 0x96, 0x0c, 0x30, 0x2b, 0x58, 0x3d, 0x36, 0xb5, - 0xe7, 0x83, 0x7c, 0x00, 0xd2, 0xd4, 0x33, 0x4e, 0xbe, 0x93, 0x76, 0x66, 0x9b, 0x60, 0x8b, 0xea, - 0x13, 0xcf, 0xa4, 0x2f, 0x8b, 0x99, 0xbe, 0x94, 0xa1, 0x14, 0x0f, 0x2d, 0xeb, 0x9f, 0x58, 0xcc, - 0xbe, 0xbb, 0xe5, 0x85, 0x77, 0x37, 0xb5, 0x24, 0x2a, 0xdf, 0x60, 0x49, 0x9c, 0x40, 0x81, 0x96, - 0x94, 0xce, 0x72, 0xf5, 0x64, 0x37, 0xeb, 0xbc, 0xc0, 0xa9, 0x9a, 0x9f, 0x12, 0x66, 0x4f, 0xa1, - 0xca, 0xb8, 0xc7, 0x26, 0x39, 0xc9, 0xc6, 0xfa, 0xe9, 0xc2, 0xc9, 0xe5, 0x06, 0x56, 0x21, 0x3e, - 0x35, 0x8c, 0xc8, 0x6f, 0x1d, 0xb6, 0x49, 0x87, 0xb9, 0xa2, 0x8a, 0xb6, 0x89, 0x7e, 0x08, 0xb5, - 0x79, 0x63, 0xf1, 0x81, 0xba, 0xb7, 0x0a, 0xfe, 0x80, 0xda, 0xd4, 0xad, 0xd8, 0x99, 0xc9, 0xeb, - 0x36, 0xce, 0xd6, 0x7b, 0x6c, 0x9c, 0x53, 0xd8, 0x9e, 0x1a, 0x1a, 0x8f, 0xca, 0xce, 0x93, 0x37, - 0xbc, 0x46, 0x43, 0xa2, 0x6c, 0x48, 0xb2, 0x79, 0xd4, 0xfa, 0xd4, 0x60, 0xa1, 0x95, 0xd8, 0x39, - 0xb5, 0x9f, 0x7e, 0x27, 0x42, 0x75, 0xbe, 0x66, 0xe7, 0xf9, 0x0b, 0xf3, 0xfc, 0xbf, 0x07, 0x60, - 0xb3, 0xc7, 0x8a, 0x94, 0x54, 0xa4, 0x97, 0xdc, 0xcf, 0x5e, 0xc2, 0x1f, 0x33, 0xb5, 0xc2, 0x1d, - 0x87, 0x11, 0x7a, 0x16, 0xb3, 0x97, 0xdb, 0xcf, 0xad, 0x41, 0xc5, 0x28, 0xfb, 0x01, 0x54, 0xe7, - 0xe5, 0x0d, 0x22, 0x39, 0x4f, 0xdd, 0xe5, 0xd5, 0x94, 0x0d, 0x23, 0x15, 0xdc, 0x64, 0xb8, 0x7e, - 0x0c, 0xc9, 0x6b, 0x10, 0x53, 0x53, 0xa0, 0xd4, 0xec, 0xad, 0x79, 0x45, 0x86, 0x11, 0x67, 0xa9, - 0x36, 0x3f, 0xc8, 0x14, 0xad, 0x0f, 0xd3, 0x8b, 0xef, 0xc1, 0xaa, 0x5f, 0x11, 0x82, 0xa8, 0xf9, - 0x87, 0x1c, 0xdc, 0xe3, 0xb9, 0x5e, 0x62, 0x4b, 0x37, 0xee, 0xfe, 0x4f, 0x9e, 0xef, 0xd6, 0xe2, - 0xf3, 0xfd, 0x74, 0x25, 0xbf, 0x6c, 0x40, 0x59, 0xe6, 0xff, 0xfb, 0xb7, 0xbc, 0xd5, 0x78, 0xf5, - 0x7a, 0x4f, 0x88, 0x29, 0xab, 0x27, 0x94, 0xf1, 0x26, 0x6c, 0xfe, 0x55, 0x00, 0x29, 0xe9, 0x1c, - 0x4e, 0xd8, 0x7f, 0xb5, 0x90, 0xd7, 0x52, 0x97, 0xa1, 0x28, 0xb7, 0x9e, 0xa2, 0xfc, 0xd7, 0x50, - 0x54, 0x58, 0xa0, 0xa8, 0xd5, 0x4c, 0xe7, 0x73, 0x7f, 0xc5, 0xb3, 0x16, 0x44, 0xcd, 0xdf, 0x8b, - 0x50, 0x4f, 0x75, 0x33, 0x4f, 0xaa, 0x95, 0x19, 0x51, 0x81, 0x16, 0xff, 0xc9, 0x4a, 0x0a, 0x39, - 0x79, 0xab, 0x06, 0x55, 0x7c, 0xc7, 0xa0, 0xfe, 0x28, 0x3b, 0xa8, 0xb9, 0x55, 0x14, 0x2f, 0x96, - 0xfb, 0x9d, 0xe3, 0x9a, 0x7f, 0x8f, 0x71, 0x15, 0xde, 0x31, 0xae, 0x87, 0x17, 0x20, 0x2d, 0xfe, - 0xdf, 0x09, 0x3d, 0x00, 0xe4, 0xdb, 0x96, 0x83, 0xcd, 0xb4, 0x45, 0xda, 0x40, 0x4f, 0xe0, 0x61, - 0x98, 0x5c, 0x9b, 0x31, 0x0a, 0x87, 0xbf, 0xca, 0x56, 0x9d, 0x6f, 0xf6, 0x0f, 0x61, 0x6f, 0xd4, - 0xeb, 0x5e, 0x2b, 0xea, 0xa0, 0x7d, 0xa9, 0x0d, 0x5f, 0x68, 0x83, 0x61, 0x7b, 0x38, 0x1a, 0x68, - 0xa3, 0xde, 0xa0, 0xaf, 0x74, 0xba, 0xe7, 0x5d, 0xe5, 0x4c, 0xda, 0x40, 0xdb, 0x50, 0xeb, 0xf6, - 0x4e, 0xaf, 0x46, 0xbd, 0x33, 0x6d, 0x30, 0xea, 0x74, 0x94, 0xc1, 0x40, 0x12, 0xd0, 0x2e, 0x3c, - 0xea, 0x2b, 0xbd, 0xb3, 0x6e, 0xef, 0x42, 0x8b, 0x8d, 0xca, 0x0b, 0xa5, 0x33, 0x1a, 0x76, 0xaf, - 0x7a, 0x92, 0x88, 0x1e, 0xc2, 0x76, 0xbf, 0xc3, 0x35, 0x4a, 0x72, 0x2e, 0x47, 0xc0, 0xa7, 0x0d, - 0xe7, 0xed, 0xee, 0xa5, 0x72, 0x26, 0xe5, 0xd1, 0x7d, 0xa8, 0xf7, 0x3b, 0x5a, 0x1c, 0x52, 0x55, - 0xae, 0x15, 0x75, 0x28, 0x15, 0xd0, 0x0e, 0x48, 0x57, 0xa3, 0x21, 0x8b, 0xcf, 0x8d, 0x52, 0x31, - 0xa3, 0x8d, 0x43, 0x97, 0x08, 0xce, 0xb9, 0x96, 0xc7, 0x2d, 0xa3, 0x4d, 0x28, 0x77, 0xda, 0xbd, - 0x8e, 0x42, 0xa4, 0xca, 0xe1, 0x29, 0x14, 0x79, 0xe6, 0x35, 0xa8, 0x66, 0xb3, 0xac, 0x42, 0x29, - 0xbe, 0x40, 0x20, 0xa7, 0xae, 0x4e, 0x07, 0x8a, 0x7a, 0xad, 0x9c, 0x49, 0x22, 0x91, 0x18, 0x20, - 0xe5, 0x4c, 0xca, 0x1d, 0xfe, 0x12, 0x8a, 0x6c, 0x8b, 0x20, 0x04, 0x5b, 0xa9, 0x18, 0xda, 0xf0, - 0x85, 0xb4, 0x81, 0x4a, 0x90, 0xbb, 0x68, 0x93, 0x02, 0x6d, 0x43, 0xed, 0xa2, 0x3d, 0xd0, 0xda, - 0x04, 0x78, 0xfb, 0x8b, 0xcb, 0xab, 0x36, 0x89, 0x54, 0x81, 0xc2, 0xf9, 0xa8, 0x77, 0x46, 0x0a, - 0x71, 0x1f, 0xea, 0xf4, 0x33, 0xe3, 0x91, 0xa7, 0x30, 0xb8, 0x50, 0x20, 0x17, 0xc4, 0xc5, 0xe5, - 0x15, 0x29, 0x1e, 0xfe, 0x45, 0x80, 0xed, 0x15, 0xcb, 0x0c, 0x3d, 0x85, 0xdd, 0xd8, 0xf7, 0x52, - 0xb9, 0x68, 0x77, 0xbe, 0xd0, 0x96, 0xb0, 0x3d, 0x00, 0xb4, 0xe0, 0xc2, 0xa0, 0xca, 0xb0, 0xb3, - 0xa0, 0x67, 0x20, 0x45, 0xf4, 0x11, 0xec, 0xaf, 0xb2, 0x64, 0x30, 0xe7, 0x50, 0x13, 0x1a, 0xcb, - 0x71, 0xb3, 0x79, 0x9d, 0xf6, 0xbf, 0x7c, 0xd3, 0x10, 0xbe, 0x7a, 0xd3, 0x10, 0xfe, 0xf1, 0xa6, - 0x21, 0xfc, 0xf6, 0x6d, 0x63, 0xe3, 0xab, 0xb7, 0x8d, 0x8d, 0xbf, 0xbd, 0x6d, 0x6c, 0xfc, 0xec, - 0x53, 0xcb, 0x0e, 0x6e, 0xc3, 0x9b, 0x23, 0xc3, 0x9d, 0x1c, 0x4f, 0x43, 0xff, 0x96, 0xee, 0x33, - 0xfa, 0xf5, 0x9c, 0x7e, 0x3e, 0x77, 0x5c, 0x13, 0x1f, 0x47, 0xc7, 0xc9, 0x84, 0xd0, 0x3f, 0xfa, - 0xdc, 0x14, 0xe9, 0x9f, 0x6f, 0xbe, 0xfb, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x4b, 0x67, 0xec, - 0x6e, 0x11, 0x12, 0x00, 0x00, + 0x86, 0x8b, 0xd8, 0x9d, 0xb4, 0x1d, 0xa0, 0x02, 0x8a, 0x42, 0x96, 0x69, 0x8f, 0x5a, 0x8f, 0xac, + 0x52, 0x92, 0x91, 0xe9, 0x86, 0xa0, 0xc9, 0x6b, 0x9a, 0xa8, 0x44, 0x0a, 0x7c, 0xa8, 0xf4, 0xa2, + 0xab, 0xee, 0x8a, 0x2e, 0xba, 0xcc, 0x32, 0xcb, 0xa2, 0xdd, 0xb4, 0x40, 0x7f, 0xc4, 0x2c, 0xa7, + 0xbb, 0x02, 0xdd, 0x14, 0x09, 0x8a, 0x16, 0xe8, 0x9f, 0x28, 0xee, 0x83, 0x22, 0xa9, 0xc7, 0x64, + 0x8a, 0x2c, 0x0a, 0x74, 0x63, 0xf1, 0x3c, 0xee, 0xe1, 0x77, 0xce, 0x77, 0xce, 0xb9, 0xb2, 0x40, + 0x0e, 0x71, 0x84, 0x8d, 0x30, 0x70, 0xbd, 0xe3, 0xd9, 0x27, 0xc7, 0xc1, 0xdd, 0x14, 0xfb, 0x47, + 0x53, 0xcf, 0x0d, 0x5c, 0xb4, 0x39, 0xb7, 0x1c, 0xcd, 0x3e, 0x79, 0xbc, 0x63, 0xb9, 0x96, 0x4b, + 0x0d, 0xc7, 0xe4, 0x89, 0xf9, 0x3c, 0xae, 0xeb, 0x13, 0xdb, 0x71, 0x8f, 0xe9, 0x5f, 0xa6, 0x6a, + 0x9e, 0x41, 0xb1, 0xaf, 0x7b, 0xfa, 0xc4, 0x47, 0xbb, 0x00, 0xbe, 0x3b, 0xc1, 0xda, 0x4c, 0x1f, + 0x87, 0x58, 0x16, 0xf7, 0x85, 0x83, 0xb2, 0x5a, 0x21, 0x9a, 0x2b, 0xa2, 0x68, 0xed, 0xbe, 0x7a, + 0xbd, 0xb7, 0xf1, 0xaf, 0xd7, 0x7b, 0xc2, 0xaf, 0xff, 0xf9, 0xc7, 0x43, 0x29, 0x81, 0x31, 0xa5, + 0xa7, 0x9b, 0x7f, 0x13, 0x41, 0x1a, 0x39, 0xf6, 0x0c, 0x7b, 0xbe, 0x3e, 0xee, 0xeb, 0x77, 0x63, + 0x57, 0x37, 0xd1, 0x16, 0x88, 0x81, 0x2b, 0x0b, 0xfb, 0xc2, 0x41, 0x45, 0x15, 0x03, 0x17, 0xed, + 0x40, 0x21, 0x89, 0x5e, 0x51, 0x99, 0x80, 0x10, 0xe4, 0x4d, 0x3d, 0xd0, 0xe5, 0x1c, 0x55, 0xd2, + 0x67, 0xf4, 0x04, 0x2a, 0x96, 0xee, 0x6b, 0x63, 0x7b, 0x62, 0x07, 0x72, 0x9e, 0x1a, 0xca, 0x96, + 0xee, 0x5f, 0x10, 0x19, 0x7d, 0x0c, 0xb5, 0x89, 0x1e, 0x69, 0x37, 0x18, 0x6b, 0x53, 0xec, 0x69, + 0x96, 0xee, 0xcb, 0x05, 0xea, 0xb2, 0x39, 0xd1, 0xa3, 0x33, 0x8c, 0xfb, 0xd8, 0x3b, 0xd7, 0x7d, + 0xf4, 0x29, 0xc8, 0xc4, 0x6d, 0xea, 0xd9, 0xae, 0x67, 0x07, 0x77, 0x19, 0xff, 0x22, 0xf5, 0xdf, + 0x99, 0xe8, 0x51, 0x9f, 0x9b, 0x93, 0x73, 0x3b, 0x50, 0x70, 0x5c, 0xc7, 0xc0, 0x72, 0x89, 0xa1, + 0xa4, 0x02, 0x7a, 0x0c, 0x65, 0x13, 0xeb, 0xe6, 0xd8, 0x76, 0xb0, 0x5c, 0x66, 0x80, 0x62, 0x19, + 0x7d, 0x1f, 0x8a, 0x33, 0x8d, 0x90, 0x21, 0x57, 0xf6, 0x85, 0x83, 0xad, 0x17, 0x8d, 0xa3, 0x34, + 0x19, 0x47, 0x57, 0xd8, 0xb3, 0x6f, 0x6c, 0x43, 0x0f, 0x6c, 0xd7, 0x19, 0xde, 0x4d, 0xb1, 0x5a, + 0x98, 0x91, 0x8f, 0xd6, 0x41, 0xba, 0xa4, 0x4f, 0x92, 0x92, 0x86, 0x71, 0x1d, 0xb5, 0x29, 0x2b, + 0x64, 0xf3, 0x37, 0x02, 0x48, 0x9f, 0xdb, 0x96, 0x47, 0x43, 0xc4, 0xd5, 0xfd, 0x00, 0x2a, 0x93, + 0x58, 0xc7, 0x8b, 0x9c, 0x28, 0x92, 0x2c, 0xc4, 0x75, 0x59, 0xe4, 0xb2, 0x59, 0xac, 0x85, 0x33, + 0x8f, 0x39, 0x87, 0xf3, 0x4a, 0x00, 0x34, 0x27, 0xbb, 0x6d, 0x18, 0x6e, 0xe8, 0x04, 0x5d, 0x13, + 0x3d, 0x83, 0x9a, 0x71, 0xab, 0xdb, 0x8e, 0xe6, 0xe8, 0x13, 0xec, 0x4f, 0x75, 0x03, 0x73, 0x58, + 0x5b, 0x54, 0xdd, 0x8b, 0xb5, 0xe8, 0x11, 0x94, 0x99, 0xa3, 0x6d, 0x72, 0x78, 0x25, 0x2a, 0x77, + 0x4d, 0x02, 0xdb, 0xfd, 0x85, 0x83, 0x3d, 0x8e, 0x8e, 0x09, 0xdf, 0xa0, 0x52, 0x3a, 0x43, 0xd1, + 0x34, 0x00, 0xa9, 0x78, 0x86, 0xbd, 0xa0, 0xeb, 0xf8, 0x81, 0x17, 0x1a, 0x04, 0xb7, 0x8f, 0x3e, + 0x86, 0xad, 0x9b, 0xd0, 0x31, 0x35, 0x0f, 0x1b, 0xf6, 0xd4, 0xc6, 0x4e, 0xc0, 0x81, 0xdd, 0x23, + 0x5a, 0x35, 0x56, 0xb6, 0xbe, 0x15, 0xbf, 0x62, 0x37, 0x79, 0x85, 0x47, 0xa3, 0x69, 0x76, 0x2a, + 0x5c, 0xf3, 0xdf, 0x39, 0x28, 0x75, 0x9d, 0x6b, 0x37, 0x74, 0x4c, 0xf4, 0x14, 0x36, 0x7d, 0x37, + 0xf4, 0x0c, 0xac, 0xd1, 0x14, 0x78, 0xe0, 0x2a, 0xd3, 0x75, 0x88, 0x0a, 0x3d, 0x84, 0x52, 0x10, + 0x69, 0xb7, 0xba, 0x7f, 0xcb, 0xb3, 0x2d, 0x06, 0xd1, 0x67, 0xba, 0x7f, 0x8b, 0x1e, 0x40, 0xd1, + 0xc7, 0x8e, 0x39, 0xcf, 0x96, 0x4b, 0x84, 0xd9, 0x04, 0x29, 0xeb, 0xfe, 0x44, 0x41, 0x4e, 0xe9, + 0x13, 0x92, 0x2c, 0xef, 0x7a, 0x2e, 0x91, 0x01, 0xd6, 0x7d, 0x1f, 0x07, 0x9a, 0x6e, 0x9a, 0x1e, + 0xef, 0xf0, 0x0a, 0xd5, 0xb4, 0x4d, 0xd3, 0x23, 0x23, 0x35, 0x76, 0x2d, 0xcd, 0x76, 0x4c, 0x1c, + 0xf1, 0xd6, 0x2e, 0x8f, 0x5d, 0xab, 0x4b, 0x64, 0xf4, 0x9c, 0x42, 0xa4, 0x2d, 0x5c, 0xa6, 0x2d, + 0xbc, 0x93, 0x6d, 0xe1, 0x61, 0x44, 0x1b, 0xb7, 0x18, 0xd0, 0x4f, 0xf4, 0x13, 0xa8, 0x2f, 0x35, + 0x29, 0xed, 0xfd, 0xea, 0x62, 0xef, 0x2f, 0xee, 0x04, 0x55, 0x0a, 0x17, 0xb7, 0xc4, 0xb7, 0xa1, + 0x3e, 0x4b, 0x4d, 0x88, 0x46, 0x97, 0x01, 0x50, 0x80, 0x52, 0xda, 0x70, 0x4a, 0x16, 0xc3, 0x4f, + 0x61, 0x7b, 0x05, 0x23, 0x72, 0x95, 0xbe, 0x7b, 0x3f, 0xfb, 0xee, 0xe5, 0x46, 0x50, 0x91, 0xb7, + 0xdc, 0x1c, 0x3b, 0x50, 0xb0, 0xfd, 0x8e, 0xd2, 0x96, 0x37, 0xe9, 0xce, 0x63, 0x42, 0xab, 0x1c, + 0xb7, 0x5c, 0xf3, 0x4b, 0x01, 0xf2, 0xfd, 0xce, 0x30, 0x4a, 0xf3, 0x28, 0xac, 0xe1, 0x51, 0xcc, + 0xf0, 0xf8, 0x08, 0xc8, 0xd2, 0xd2, 0x42, 0x1f, 0x9b, 0x94, 0xe1, 0xbc, 0x5a, 0xb2, 0x74, 0x7f, + 0xe4, 0x63, 0xda, 0x36, 0xd7, 0x63, 0xd7, 0xf8, 0xb9, 0x76, 0x8b, 0x6d, 0xeb, 0x96, 0xb1, 0x9c, + 0x57, 0xab, 0x54, 0xf7, 0x19, 0x55, 0xd1, 0xa8, 0x81, 0x1e, 0x84, 0xf1, 0xb6, 0xe2, 0x12, 0x21, + 0x12, 0x7b, 0x9e, 0xeb, 0x69, 0x13, 0xdf, 0x8a, 0x89, 0xa4, 0x8a, 0xcf, 0x7d, 0xab, 0xf5, 0x41, + 0x7a, 0x52, 0x6a, 0xa9, 0x35, 0x6d, 0x68, 0x41, 0xd4, 0xfc, 0x93, 0x00, 0xdb, 0x97, 0x61, 0x40, + 0x3b, 0xf7, 0xf2, 0xda, 0xc7, 0xde, 0x8c, 0x2d, 0x0b, 0x19, 0x4a, 0x7e, 0x68, 0x18, 0xd8, 0xf7, + 0x69, 0x66, 0x65, 0x35, 0x16, 0x97, 0x70, 0x8a, 0xcb, 0x38, 0x53, 0x65, 0xc9, 0x65, 0xca, 0x92, + 0x01, 0x9a, 0x5f, 0x00, 0xfa, 0x2c, 0x06, 0xd9, 0x48, 0x40, 0xba, 0x1c, 0x9a, 0xe6, 0x26, 0xd8, + 0x9a, 0x13, 0xa8, 0x5d, 0x7a, 0xb6, 0x65, 0x3b, 0x7a, 0x60, 0x3b, 0x56, 0xdf, 0xf8, 0x3a, 0x22, + 0x32, 0x3d, 0x2e, 0x66, 0x7b, 0xbc, 0xf5, 0xd1, 0x8a, 0x05, 0xe2, 0x26, 0x91, 0x35, 0x56, 0xa2, + 0x7f, 0x14, 0x00, 0xe2, 0x12, 0x0d, 0x23, 0xd2, 0x9c, 0x26, 0xf6, 0x03, 0xea, 0xe3, 0x3a, 0x99, + 0x19, 0x97, 0x52, 0x06, 0x36, 0xe8, 0x99, 0xb9, 0x15, 0xd7, 0xcf, 0x6d, 0x2e, 0x33, 0xb7, 0x47, + 0xb0, 0x8d, 0xa3, 0x00, 0x7b, 0x0e, 0x59, 0x63, 0xc9, 0x00, 0xb3, 0x82, 0xd5, 0x63, 0x53, 0x7b, + 0x3e, 0xc8, 0x07, 0x20, 0x4d, 0x3d, 0xe3, 0xc5, 0x77, 0xd2, 0xce, 0x6c, 0x13, 0x6c, 0x51, 0x7d, + 0xe2, 0x99, 0xf4, 0x65, 0x31, 0xd3, 0x97, 0x32, 0x94, 0xe2, 0xa1, 0x65, 0xfd, 0x13, 0x8b, 0xd9, + 0x7b, 0xb7, 0xbc, 0x70, 0xef, 0xa6, 0x96, 0x44, 0xe5, 0x1b, 0x2c, 0x89, 0x17, 0x50, 0xa0, 0x25, + 0xa5, 0xb3, 0x5c, 0x7d, 0xb1, 0x9b, 0x75, 0x5e, 0xe0, 0x54, 0xcd, 0x4f, 0x09, 0xb3, 0x27, 0x50, + 0x65, 0xdc, 0x63, 0x93, 0x9c, 0x64, 0x63, 0xfd, 0x74, 0xe1, 0xe4, 0x72, 0x03, 0xab, 0x10, 0x9f, + 0x1a, 0x46, 0xe4, 0x5b, 0x87, 0x6d, 0xd2, 0x61, 0xae, 0xa8, 0xa2, 0x6d, 0xa2, 0x1f, 0x42, 0x6d, + 0xde, 0x58, 0x7c, 0xa0, 0xee, 0xad, 0x82, 0x3f, 0xa0, 0x36, 0x75, 0x2b, 0x76, 0x66, 0xf2, 0xba, + 0x8d, 0xb3, 0xf5, 0x1e, 0x1b, 0xe7, 0x04, 0xb6, 0xa7, 0x86, 0xc6, 0xa3, 0xb2, 0xf3, 0xe4, 0x0e, + 0xaf, 0xd1, 0x90, 0x28, 0x1b, 0x92, 0x6c, 0x1e, 0xb5, 0x3e, 0x35, 0x58, 0x68, 0x25, 0x76, 0x8e, + 0x99, 0x9a, 0x7a, 0xb6, 0x81, 0x65, 0x69, 0xce, 0x54, 0x9f, 0xc8, 0x64, 0x40, 0x88, 0xf1, 0x06, + 0x63, 0xb9, 0xce, 0x98, 0xb7, 0x74, 0xff, 0x0c, 0xe3, 0xd4, 0x56, 0xfb, 0x9d, 0x08, 0xd5, 0xf9, + 0x72, 0x9e, 0x57, 0x4d, 0x98, 0x57, 0xed, 0x7b, 0x00, 0x36, 0xbb, 0xe2, 0x08, 0x11, 0x22, 0x85, + 0x76, 0x3f, 0x0b, 0x8d, 0x5f, 0x81, 0x6a, 0x85, 0x3b, 0x0e, 0x23, 0xf4, 0x2c, 0xe6, 0x3c, 0xb7, + 0x9f, 0x5b, 0x93, 0x0b, 0x23, 0xfa, 0x07, 0x50, 0x9d, 0x93, 0x12, 0x44, 0x72, 0x9e, 0xba, 0xcb, + 0xab, 0x89, 0x1e, 0x46, 0x2a, 0xb8, 0xc9, 0x48, 0xfe, 0x18, 0x92, 0x3b, 0x24, 0x26, 0xb4, 0x40, + 0x09, 0xdd, 0x5b, 0x73, 0xf7, 0x0c, 0x23, 0xce, 0x6d, 0x6d, 0x7e, 0x90, 0x29, 0x5a, 0x1f, 0xa6, + 0xd7, 0xe5, 0x83, 0x55, 0x5f, 0x2c, 0x82, 0xa8, 0xf9, 0x87, 0x1c, 0xdc, 0xe3, 0xb9, 0x5e, 0x60, + 0x4b, 0x37, 0xee, 0xfe, 0x4f, 0x2e, 0xfd, 0xd6, 0xe2, 0xa5, 0xff, 0x74, 0x25, 0xbf, 0x6c, 0xac, + 0x59, 0xe6, 0xff, 0xfb, 0x6f, 0x00, 0xad, 0xc6, 0xab, 0xd7, 0x7b, 0x42, 0x4c, 0x59, 0x3d, 0xa1, + 0x8c, 0x37, 0x61, 0xf3, 0x2f, 0x02, 0x48, 0x49, 0xe7, 0x70, 0xc2, 0xfe, 0xab, 0x35, 0xbe, 0x96, + 0xba, 0x0c, 0x45, 0xb9, 0xf5, 0x14, 0xe5, 0xbf, 0x86, 0xa2, 0xc2, 0x02, 0x45, 0xad, 0x66, 0x3a, + 0x9f, 0xfb, 0x2b, 0x2e, 0xc3, 0x20, 0x6a, 0xfe, 0x5e, 0x84, 0x7a, 0xaa, 0x9b, 0x79, 0x52, 0xad, + 0xcc, 0x88, 0x0a, 0xb4, 0xf8, 0x4f, 0x56, 0x52, 0xc8, 0xc9, 0x5b, 0x35, 0xa8, 0xe2, 0x3b, 0x06, + 0xf5, 0x47, 0xd9, 0x41, 0xcd, 0xad, 0xa2, 0x78, 0xb1, 0xdc, 0xef, 0x1c, 0xd7, 0xfc, 0x7b, 0x8c, + 0xab, 0xf0, 0x8e, 0x71, 0x3d, 0x3c, 0x07, 0x69, 0xf1, 0x3f, 0x2e, 0xf4, 0x00, 0x90, 0x6f, 0x5b, + 0x0e, 0x36, 0xd3, 0x16, 0x69, 0x03, 0x3d, 0x81, 0x87, 0x61, 0xf2, 0xda, 0x8c, 0x51, 0x38, 0xfc, + 0x55, 0xb6, 0xea, 0xfc, 0x3e, 0xf8, 0x10, 0xf6, 0x46, 0xbd, 0xee, 0x95, 0xa2, 0x0e, 0xda, 0x17, + 0xda, 0xf0, 0xa5, 0x36, 0x18, 0xb6, 0x87, 0xa3, 0x81, 0x36, 0xea, 0x0d, 0xfa, 0x4a, 0xa7, 0x7b, + 0xd6, 0x55, 0x4e, 0xa5, 0x0d, 0xb4, 0x0d, 0xb5, 0x6e, 0xef, 0xe4, 0x72, 0xd4, 0x3b, 0xd5, 0x06, + 0xa3, 0x4e, 0x47, 0x19, 0x0c, 0x24, 0x01, 0xed, 0xc2, 0xa3, 0xbe, 0xd2, 0x3b, 0xed, 0xf6, 0xce, + 0xb5, 0xd8, 0xa8, 0xbc, 0x54, 0x3a, 0xa3, 0x61, 0xf7, 0xb2, 0x27, 0x89, 0xe8, 0x21, 0x6c, 0xf7, + 0x3b, 0x5c, 0xa3, 0x24, 0xe7, 0x72, 0x04, 0x7c, 0xda, 0x70, 0xd6, 0xee, 0x5e, 0x28, 0xa7, 0x52, + 0x1e, 0xdd, 0x87, 0x7a, 0xbf, 0xa3, 0xc5, 0x21, 0x55, 0xe5, 0x4a, 0x51, 0x87, 0x52, 0x01, 0xed, + 0x80, 0x74, 0x39, 0x1a, 0xb2, 0xf8, 0xdc, 0x28, 0x15, 0x33, 0xda, 0x38, 0x74, 0x89, 0xe0, 0x9c, + 0x6b, 0x79, 0xdc, 0x32, 0xda, 0x84, 0x72, 0xa7, 0xdd, 0xeb, 0x28, 0x44, 0xaa, 0x1c, 0x9e, 0x40, + 0x91, 0x67, 0x5e, 0x83, 0x6a, 0x36, 0xcb, 0x2a, 0x94, 0xe2, 0x17, 0x08, 0xe4, 0xd4, 0xe5, 0xc9, + 0x40, 0x51, 0xaf, 0x94, 0x53, 0x49, 0x24, 0x12, 0x03, 0xa4, 0x9c, 0x4a, 0xb9, 0xc3, 0x5f, 0x42, + 0x91, 0x6d, 0x11, 0x84, 0x60, 0x2b, 0x15, 0x43, 0x1b, 0xbe, 0x94, 0x36, 0x50, 0x09, 0x72, 0xe7, + 0x6d, 0x52, 0xa0, 0x6d, 0xa8, 0x9d, 0xb7, 0x07, 0x5a, 0x9b, 0x00, 0x6f, 0x7f, 0x71, 0x71, 0xd9, + 0x26, 0x91, 0x2a, 0x50, 0x38, 0x1b, 0xf5, 0x4e, 0x49, 0x21, 0xee, 0x43, 0x9d, 0x3e, 0x66, 0x3c, + 0xf2, 0x14, 0x06, 0x17, 0x0a, 0xe4, 0x05, 0x71, 0x71, 0x79, 0x45, 0x8a, 0x87, 0x7f, 0x16, 0x60, + 0x7b, 0xc5, 0x32, 0x43, 0x4f, 0x61, 0x37, 0xf6, 0xbd, 0x50, 0xce, 0xdb, 0x9d, 0x2f, 0xb4, 0x25, + 0x6c, 0x0f, 0x00, 0x2d, 0xb8, 0x30, 0xa8, 0x32, 0xec, 0x2c, 0xe8, 0x19, 0x48, 0x11, 0x7d, 0x04, + 0xfb, 0xab, 0x2c, 0x19, 0xcc, 0x39, 0xd4, 0x84, 0xc6, 0x72, 0xdc, 0x6c, 0x5e, 0x27, 0xfd, 0x2f, + 0xdf, 0x34, 0x84, 0xaf, 0xde, 0x34, 0x84, 0xbf, 0xbf, 0x69, 0x08, 0xbf, 0x7d, 0xdb, 0xd8, 0xf8, + 0xea, 0x6d, 0x63, 0xe3, 0xaf, 0x6f, 0x1b, 0x1b, 0x3f, 0xfb, 0xd4, 0xb2, 0x83, 0xdb, 0xf0, 0xfa, + 0xc8, 0x70, 0x27, 0xc7, 0xd3, 0xd0, 0xbf, 0xa5, 0xfb, 0x8c, 0x3e, 0x3d, 0xa7, 0x8f, 0xcf, 0x1d, + 0xd7, 0xc4, 0xc7, 0xd1, 0x71, 0x32, 0x21, 0xf4, 0xa7, 0xa2, 0xeb, 0x22, 0xfd, 0xd1, 0xe7, 0xbb, + 0xff, 0x09, 0x00, 0x00, 0xff, 0xff, 0xaf, 0x3e, 0x6c, 0xeb, 0x47, 0x12, 0x00, 0x00, } func (this *Params) Equal(that interface{}) bool { @@ -1857,6 +1874,12 @@ func (this *OutboundTx) Equal(that interface{}) bool { if !this.PcRevertExecution.Equal(that1.PcRevertExecution) { return false } + if this.GasPrice != that1.GasPrice { + return false + } + if this.GasFee != that1.GasFee { + return false + } return true } func (this *UniversalTx) Equal(that interface{}) bool { @@ -2553,6 +2576,24 @@ func (m *OutboundTx) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if len(m.GasFee) > 0 { + i -= len(m.GasFee) + copy(dAtA[i:], m.GasFee) + i = encodeVarintTypes(dAtA, i, uint64(len(m.GasFee))) + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0x8a + } + if len(m.GasPrice) > 0 { + i -= len(m.GasPrice) + copy(dAtA[i:], m.GasPrice) + i = encodeVarintTypes(dAtA, i, uint64(len(m.GasPrice))) + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0x82 + } if m.PcRevertExecution != nil { { size, err := m.PcRevertExecution.MarshalToSizedBuffer(dAtA[:i]) @@ -3284,6 +3325,14 @@ func (m *OutboundTx) Size() (n int) { l = m.PcRevertExecution.Size() n += 1 + l + sovTypes(uint64(l)) } + l = len(m.GasPrice) + if l > 0 { + n += 2 + l + sovTypes(uint64(l)) + } + l = len(m.GasFee) + if l > 0 { + n += 2 + l + sovTypes(uint64(l)) + } return n } @@ -5596,6 +5645,70 @@ func (m *OutboundTx) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 16: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field GasPrice", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + 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 ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.GasPrice = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 17: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field GasFee", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + 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 ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.GasFee = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) From 7d4d56702698463f95cb930f437c82f2a4cc14c9 Mon Sep 17 00:00:00 2001 From: Nilesh Gupta Date: Fri, 13 Mar 2026 18:56:36 +0530 Subject: [PATCH 30/36] feat: added gas_fee_used in the outbound proto --- proto/uexecutor/v1/types.proto | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/proto/uexecutor/v1/types.proto b/proto/uexecutor/v1/types.proto index 58fb1d06..a68d8dad 100644 --- a/proto/uexecutor/v1/types.proto +++ b/proto/uexecutor/v1/types.proto @@ -137,6 +137,7 @@ message OutboundObservation { uint64 block_height = 2; // block height on external chain string tx_hash = 3; // external chain tx hash string error_msg = 4; + string gas_fee_used = 5; // actual gas fee consumed on destination chain; used to compute excess refund } message OriginatingPcTx { @@ -169,6 +170,9 @@ message OutboundTx { PCTx pc_revert_execution = 15; string gas_price = 16; // gas price on destination chain at time of outbound string gas_fee = 17; // gas fee paid to relayer on destination chain + PCTx pc_refund_execution = 18; // PC tx that executed the gas refund (non-nil if refund ran) + string refund_swap_error = 19; // non-empty if swap-refund failed and we fell back to no-swap + string gas_token = 20; // gas token PRC20 address used to pay relayer fee } message UniversalTx { From 810a14dd1d84cc4cb2d5302dec9db2ee12284659 Mon Sep 17 00:00:00 2001 From: Nilesh Gupta Date: Fri, 13 Mar 2026 18:56:43 +0530 Subject: [PATCH 31/36] refactor: added generated protobuf --- api/uexecutor/v1/types.pulsar.go | 727 ++++++++++++++++++++++--------- 1 file changed, 524 insertions(+), 203 deletions(-) diff --git a/api/uexecutor/v1/types.pulsar.go b/api/uexecutor/v1/types.pulsar.go index e41fdf0c..228be4f2 100644 --- a/api/uexecutor/v1/types.pulsar.go +++ b/api/uexecutor/v1/types.pulsar.go @@ -4698,6 +4698,7 @@ var ( fd_OutboundObservation_block_height protoreflect.FieldDescriptor fd_OutboundObservation_tx_hash protoreflect.FieldDescriptor fd_OutboundObservation_error_msg protoreflect.FieldDescriptor + fd_OutboundObservation_gas_fee_used protoreflect.FieldDescriptor ) func init() { @@ -4707,6 +4708,7 @@ func init() { fd_OutboundObservation_block_height = md_OutboundObservation.Fields().ByName("block_height") fd_OutboundObservation_tx_hash = md_OutboundObservation.Fields().ByName("tx_hash") fd_OutboundObservation_error_msg = md_OutboundObservation.Fields().ByName("error_msg") + fd_OutboundObservation_gas_fee_used = md_OutboundObservation.Fields().ByName("gas_fee_used") } var _ protoreflect.Message = (*fastReflection_OutboundObservation)(nil) @@ -4798,6 +4800,12 @@ func (x *fastReflection_OutboundObservation) Range(f func(protoreflect.FieldDesc return } } + if x.GasFeeUsed != "" { + value := protoreflect.ValueOfString(x.GasFeeUsed) + if !f(fd_OutboundObservation_gas_fee_used, value) { + return + } + } } // Has reports whether a field is populated. @@ -4821,6 +4829,8 @@ func (x *fastReflection_OutboundObservation) Has(fd protoreflect.FieldDescriptor return x.TxHash != "" case "uexecutor.v1.OutboundObservation.error_msg": return x.ErrorMsg != "" + case "uexecutor.v1.OutboundObservation.gas_fee_used": + return x.GasFeeUsed != "" default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: uexecutor.v1.OutboundObservation")) @@ -4845,6 +4855,8 @@ func (x *fastReflection_OutboundObservation) Clear(fd protoreflect.FieldDescript x.TxHash = "" case "uexecutor.v1.OutboundObservation.error_msg": x.ErrorMsg = "" + case "uexecutor.v1.OutboundObservation.gas_fee_used": + x.GasFeeUsed = "" default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: uexecutor.v1.OutboundObservation")) @@ -4873,6 +4885,9 @@ func (x *fastReflection_OutboundObservation) Get(descriptor protoreflect.FieldDe case "uexecutor.v1.OutboundObservation.error_msg": value := x.ErrorMsg return protoreflect.ValueOfString(value) + case "uexecutor.v1.OutboundObservation.gas_fee_used": + value := x.GasFeeUsed + return protoreflect.ValueOfString(value) default: if descriptor.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: uexecutor.v1.OutboundObservation")) @@ -4901,6 +4916,8 @@ func (x *fastReflection_OutboundObservation) Set(fd protoreflect.FieldDescriptor x.TxHash = value.Interface().(string) case "uexecutor.v1.OutboundObservation.error_msg": x.ErrorMsg = value.Interface().(string) + case "uexecutor.v1.OutboundObservation.gas_fee_used": + x.GasFeeUsed = value.Interface().(string) default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: uexecutor.v1.OutboundObservation")) @@ -4929,6 +4946,8 @@ func (x *fastReflection_OutboundObservation) Mutable(fd protoreflect.FieldDescri panic(fmt.Errorf("field tx_hash of message uexecutor.v1.OutboundObservation is not mutable")) case "uexecutor.v1.OutboundObservation.error_msg": panic(fmt.Errorf("field error_msg of message uexecutor.v1.OutboundObservation is not mutable")) + case "uexecutor.v1.OutboundObservation.gas_fee_used": + panic(fmt.Errorf("field gas_fee_used of message uexecutor.v1.OutboundObservation is not mutable")) default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: uexecutor.v1.OutboundObservation")) @@ -4950,6 +4969,8 @@ func (x *fastReflection_OutboundObservation) NewField(fd protoreflect.FieldDescr return protoreflect.ValueOfString("") case "uexecutor.v1.OutboundObservation.error_msg": return protoreflect.ValueOfString("") + case "uexecutor.v1.OutboundObservation.gas_fee_used": + return protoreflect.ValueOfString("") default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: uexecutor.v1.OutboundObservation")) @@ -5033,6 +5054,10 @@ func (x *fastReflection_OutboundObservation) ProtoMethods() *protoiface.Methods if l > 0 { n += 1 + l + runtime.Sov(uint64(l)) } + l = len(x.GasFeeUsed) + if l > 0 { + n += 1 + l + runtime.Sov(uint64(l)) + } if x.unknownFields != nil { n += len(x.unknownFields) } @@ -5062,6 +5087,13 @@ func (x *fastReflection_OutboundObservation) ProtoMethods() *protoiface.Methods i -= len(x.unknownFields) copy(dAtA[i:], x.unknownFields) } + if len(x.GasFeeUsed) > 0 { + i -= len(x.GasFeeUsed) + copy(dAtA[i:], x.GasFeeUsed) + i = runtime.EncodeVarint(dAtA, i, uint64(len(x.GasFeeUsed))) + i-- + dAtA[i] = 0x2a + } if len(x.ErrorMsg) > 0 { i -= len(x.ErrorMsg) copy(dAtA[i:], x.ErrorMsg) @@ -5243,6 +5275,38 @@ func (x *fastReflection_OutboundObservation) ProtoMethods() *protoiface.Methods } x.ErrorMsg = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 5: + if wireType != 2 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field GasFeeUsed", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if postIndex > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + x.GasFeeUsed = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := runtime.Skip(dAtA[iNdEx:]) @@ -5781,6 +5845,9 @@ var ( fd_OutboundTx_pc_revert_execution protoreflect.FieldDescriptor fd_OutboundTx_gas_price protoreflect.FieldDescriptor fd_OutboundTx_gas_fee protoreflect.FieldDescriptor + fd_OutboundTx_pc_refund_execution protoreflect.FieldDescriptor + fd_OutboundTx_refund_swap_error protoreflect.FieldDescriptor + fd_OutboundTx_gas_token protoreflect.FieldDescriptor ) func init() { @@ -5803,6 +5870,9 @@ func init() { fd_OutboundTx_pc_revert_execution = md_OutboundTx.Fields().ByName("pc_revert_execution") fd_OutboundTx_gas_price = md_OutboundTx.Fields().ByName("gas_price") fd_OutboundTx_gas_fee = md_OutboundTx.Fields().ByName("gas_fee") + fd_OutboundTx_pc_refund_execution = md_OutboundTx.Fields().ByName("pc_refund_execution") + fd_OutboundTx_refund_swap_error = md_OutboundTx.Fields().ByName("refund_swap_error") + fd_OutboundTx_gas_token = md_OutboundTx.Fields().ByName("gas_token") } var _ protoreflect.Message = (*fastReflection_OutboundTx)(nil) @@ -5972,6 +6042,24 @@ func (x *fastReflection_OutboundTx) Range(f func(protoreflect.FieldDescriptor, p return } } + if x.PcRefundExecution != nil { + value := protoreflect.ValueOfMessage(x.PcRefundExecution.ProtoReflect()) + if !f(fd_OutboundTx_pc_refund_execution, value) { + return + } + } + if x.RefundSwapError != "" { + value := protoreflect.ValueOfString(x.RefundSwapError) + if !f(fd_OutboundTx_refund_swap_error, value) { + return + } + } + if x.GasToken != "" { + value := protoreflect.ValueOfString(x.GasToken) + if !f(fd_OutboundTx_gas_token, value) { + return + } + } } // Has reports whether a field is populated. @@ -6021,6 +6109,12 @@ func (x *fastReflection_OutboundTx) Has(fd protoreflect.FieldDescriptor) bool { return x.GasPrice != "" case "uexecutor.v1.OutboundTx.gas_fee": return x.GasFee != "" + case "uexecutor.v1.OutboundTx.pc_refund_execution": + return x.PcRefundExecution != nil + case "uexecutor.v1.OutboundTx.refund_swap_error": + return x.RefundSwapError != "" + case "uexecutor.v1.OutboundTx.gas_token": + return x.GasToken != "" default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: uexecutor.v1.OutboundTx")) @@ -6071,6 +6165,12 @@ func (x *fastReflection_OutboundTx) Clear(fd protoreflect.FieldDescriptor) { x.GasPrice = "" case "uexecutor.v1.OutboundTx.gas_fee": x.GasFee = "" + case "uexecutor.v1.OutboundTx.pc_refund_execution": + x.PcRefundExecution = nil + case "uexecutor.v1.OutboundTx.refund_swap_error": + x.RefundSwapError = "" + case "uexecutor.v1.OutboundTx.gas_token": + x.GasToken = "" default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: uexecutor.v1.OutboundTx")) @@ -6138,6 +6238,15 @@ func (x *fastReflection_OutboundTx) Get(descriptor protoreflect.FieldDescriptor) case "uexecutor.v1.OutboundTx.gas_fee": value := x.GasFee return protoreflect.ValueOfString(value) + case "uexecutor.v1.OutboundTx.pc_refund_execution": + value := x.PcRefundExecution + return protoreflect.ValueOfMessage(value.ProtoReflect()) + case "uexecutor.v1.OutboundTx.refund_swap_error": + value := x.RefundSwapError + return protoreflect.ValueOfString(value) + case "uexecutor.v1.OutboundTx.gas_token": + value := x.GasToken + return protoreflect.ValueOfString(value) default: if descriptor.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: uexecutor.v1.OutboundTx")) @@ -6192,6 +6301,12 @@ func (x *fastReflection_OutboundTx) Set(fd protoreflect.FieldDescriptor, value p x.GasPrice = value.Interface().(string) case "uexecutor.v1.OutboundTx.gas_fee": x.GasFee = value.Interface().(string) + case "uexecutor.v1.OutboundTx.pc_refund_execution": + x.PcRefundExecution = value.Message().Interface().(*PCTx) + case "uexecutor.v1.OutboundTx.refund_swap_error": + x.RefundSwapError = value.Interface().(string) + case "uexecutor.v1.OutboundTx.gas_token": + x.GasToken = value.Interface().(string) default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: uexecutor.v1.OutboundTx")) @@ -6232,6 +6347,11 @@ func (x *fastReflection_OutboundTx) Mutable(fd protoreflect.FieldDescriptor) pro x.PcRevertExecution = new(PCTx) } return protoreflect.ValueOfMessage(x.PcRevertExecution.ProtoReflect()) + case "uexecutor.v1.OutboundTx.pc_refund_execution": + if x.PcRefundExecution == nil { + x.PcRefundExecution = new(PCTx) + } + return protoreflect.ValueOfMessage(x.PcRefundExecution.ProtoReflect()) case "uexecutor.v1.OutboundTx.destination_chain": panic(fmt.Errorf("field destination_chain of message uexecutor.v1.OutboundTx is not mutable")) case "uexecutor.v1.OutboundTx.recipient": @@ -6258,6 +6378,10 @@ func (x *fastReflection_OutboundTx) Mutable(fd protoreflect.FieldDescriptor) pro panic(fmt.Errorf("field gas_price of message uexecutor.v1.OutboundTx is not mutable")) case "uexecutor.v1.OutboundTx.gas_fee": panic(fmt.Errorf("field gas_fee of message uexecutor.v1.OutboundTx is not mutable")) + case "uexecutor.v1.OutboundTx.refund_swap_error": + panic(fmt.Errorf("field refund_swap_error of message uexecutor.v1.OutboundTx is not mutable")) + case "uexecutor.v1.OutboundTx.gas_token": + panic(fmt.Errorf("field gas_token of message uexecutor.v1.OutboundTx is not mutable")) default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: uexecutor.v1.OutboundTx")) @@ -6309,6 +6433,13 @@ func (x *fastReflection_OutboundTx) NewField(fd protoreflect.FieldDescriptor) pr return protoreflect.ValueOfString("") case "uexecutor.v1.OutboundTx.gas_fee": return protoreflect.ValueOfString("") + case "uexecutor.v1.OutboundTx.pc_refund_execution": + m := new(PCTx) + return protoreflect.ValueOfMessage(m.ProtoReflect()) + case "uexecutor.v1.OutboundTx.refund_swap_error": + return protoreflect.ValueOfString("") + case "uexecutor.v1.OutboundTx.gas_token": + return protoreflect.ValueOfString("") default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: uexecutor.v1.OutboundTx")) @@ -6444,6 +6575,18 @@ func (x *fastReflection_OutboundTx) ProtoMethods() *protoiface.Methods { if l > 0 { n += 2 + l + runtime.Sov(uint64(l)) } + if x.PcRefundExecution != nil { + l = options.Size(x.PcRefundExecution) + n += 2 + l + runtime.Sov(uint64(l)) + } + l = len(x.RefundSwapError) + if l > 0 { + n += 2 + l + runtime.Sov(uint64(l)) + } + l = len(x.GasToken) + if l > 0 { + n += 2 + l + runtime.Sov(uint64(l)) + } if x.unknownFields != nil { n += len(x.unknownFields) } @@ -6473,6 +6616,40 @@ func (x *fastReflection_OutboundTx) ProtoMethods() *protoiface.Methods { i -= len(x.unknownFields) copy(dAtA[i:], x.unknownFields) } + if len(x.GasToken) > 0 { + i -= len(x.GasToken) + copy(dAtA[i:], x.GasToken) + i = runtime.EncodeVarint(dAtA, i, uint64(len(x.GasToken))) + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0xa2 + } + if len(x.RefundSwapError) > 0 { + i -= len(x.RefundSwapError) + copy(dAtA[i:], x.RefundSwapError) + i = runtime.EncodeVarint(dAtA, i, uint64(len(x.RefundSwapError))) + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0x9a + } + if x.PcRefundExecution != nil { + encoded, err := options.Marshal(x.PcRefundExecution) + if err != nil { + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, err + } + i -= len(encoded) + copy(dAtA[i:], encoded) + i = runtime.EncodeVarint(dAtA, i, uint64(len(encoded))) + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0x92 + } if len(x.GasFee) > 0 { i -= len(x.GasFee) copy(dAtA[i:], x.GasFee) @@ -7203,6 +7380,106 @@ func (x *fastReflection_OutboundTx) ProtoMethods() *protoiface.Methods { } x.GasFee = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 18: + if wireType != 2 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field PcRefundExecution", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if postIndex > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + if x.PcRefundExecution == nil { + x.PcRefundExecution = &PCTx{} + } + if err := options.Unmarshal(dAtA[iNdEx:postIndex], x.PcRefundExecution); err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + iNdEx = postIndex + case 19: + if wireType != 2 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field RefundSwapError", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if postIndex > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + x.RefundSwapError = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 20: + if wireType != 2 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field GasToken", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if postIndex > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + x.GasToken = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := runtime.Skip(dAtA[iNdEx:]) @@ -11213,6 +11490,7 @@ type OutboundObservation struct { BlockHeight uint64 `protobuf:"varint,2,opt,name=block_height,json=blockHeight,proto3" json:"block_height,omitempty"` // block height on external chain TxHash string `protobuf:"bytes,3,opt,name=tx_hash,json=txHash,proto3" json:"tx_hash,omitempty"` // external chain tx hash ErrorMsg string `protobuf:"bytes,4,opt,name=error_msg,json=errorMsg,proto3" json:"error_msg,omitempty"` + GasFeeUsed string `protobuf:"bytes,5,opt,name=gas_fee_used,json=gasFeeUsed,proto3" json:"gas_fee_used,omitempty"` // actual gas fee consumed on destination chain; used to compute excess refund } func (x *OutboundObservation) Reset() { @@ -11263,6 +11541,13 @@ func (x *OutboundObservation) GetErrorMsg() string { return "" } +func (x *OutboundObservation) GetGasFeeUsed() string { + if x != nil { + return x.GasFeeUsed + } + return "" +} + type OriginatingPcTx struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -11326,8 +11611,11 @@ type OutboundTx struct { OutboundStatus Status `protobuf:"varint,13,opt,name=outbound_status,json=outboundStatus,proto3,enum=uexecutor.v1.Status" json:"outbound_status,omitempty"` // status of outbound tx RevertInstructions *RevertInstructions `protobuf:"bytes,14,opt,name=revert_instructions,json=revertInstructions,proto3" json:"revert_instructions,omitempty"` PcRevertExecution *PCTx `protobuf:"bytes,15,opt,name=pc_revert_execution,json=pcRevertExecution,proto3" json:"pc_revert_execution,omitempty"` - GasPrice string `protobuf:"bytes,16,opt,name=gas_price,json=gasPrice,proto3" json:"gas_price,omitempty"` // gas price on destination chain at time of outbound - GasFee string `protobuf:"bytes,17,opt,name=gas_fee,json=gasFee,proto3" json:"gas_fee,omitempty"` // gas fee paid to relayer on destination chain + GasPrice string `protobuf:"bytes,16,opt,name=gas_price,json=gasPrice,proto3" json:"gas_price,omitempty"` // gas price on destination chain at time of outbound + GasFee string `protobuf:"bytes,17,opt,name=gas_fee,json=gasFee,proto3" json:"gas_fee,omitempty"` // gas fee paid to relayer on destination chain + PcRefundExecution *PCTx `protobuf:"bytes,18,opt,name=pc_refund_execution,json=pcRefundExecution,proto3" json:"pc_refund_execution,omitempty"` // PC tx that executed the gas refund (non-nil if refund ran) + RefundSwapError string `protobuf:"bytes,19,opt,name=refund_swap_error,json=refundSwapError,proto3" json:"refund_swap_error,omitempty"` // non-empty if swap-refund failed and we fell back to no-swap + GasToken string `protobuf:"bytes,20,opt,name=gas_token,json=gasToken,proto3" json:"gas_token,omitempty"` // gas token PRC20 address used to pay relayer fee } func (x *OutboundTx) Reset() { @@ -11469,6 +11757,27 @@ func (x *OutboundTx) GetGasFee() string { return "" } +func (x *OutboundTx) GetPcRefundExecution() *PCTx { + if x != nil { + return x.PcRefundExecution + } + return nil +} + +func (x *OutboundTx) GetRefundSwapError() string { + if x != nil { + return x.RefundSwapError + } + return "" +} + +func (x *OutboundTx) GetGasToken() string { + if x != nil { + return x.GasToken + } + return "" +} + type UniversalTx struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -11872,7 +12181,7 @@ var file_uexecutor_v1_types_proto_rawDesc = []byte{ 0x67, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x73, 0x67, 0x3a, 0x1c, 0x98, 0xa0, 0x1f, 0x00, 0xe8, 0xa0, 0x1f, 0x01, 0x8a, 0xe7, 0xb0, 0x2a, 0x0f, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2f, 0x70, 0x63, 0x5f, 0x74, 0x78, 0x22, - 0xb1, 0x01, 0x0a, 0x13, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x4f, 0x62, 0x73, 0x65, + 0xd3, 0x01, 0x0a, 0x13, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, @@ -11880,197 +12189,208 @@ var file_uexecutor_v1_types_proto_rawDesc = []byte{ 0x69, 0x67, 0x68, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x78, 0x48, 0x61, 0x73, 0x68, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x73, 0x67, 0x3a, 0x27, 0xe8, 0xa0, 0x1f, 0x01, - 0x8a, 0xe7, 0xb0, 0x2a, 0x1e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2f, 0x6f, - 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x6f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x22, 0x6d, 0x0a, 0x0f, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, - 0x6e, 0x67, 0x50, 0x63, 0x54, 0x78, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, - 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x78, 0x48, 0x61, 0x73, 0x68, 0x12, - 0x1b, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x3a, 0x24, 0xe8, 0xa0, - 0x1f, 0x01, 0x8a, 0xe7, 0xb0, 0x2a, 0x1b, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, - 0x2f, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x63, 0x5f, - 0x74, 0x78, 0x22, 0xe5, 0x05, 0x0a, 0x0a, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x54, - 0x78, 0x12, 0x2b, 0x0a, 0x11, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x64, 0x65, - 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x12, 0x1c, - 0x0a, 0x09, 0x72, 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x72, 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, - 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x6d, - 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, - 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x11, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x41, 0x73, 0x73, 0x65, 0x74, - 0x41, 0x64, 0x64, 0x72, 0x12, 0x28, 0x0a, 0x10, 0x70, 0x72, 0x63, 0x32, 0x30, 0x5f, 0x61, 0x73, - 0x73, 0x65, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, - 0x70, 0x72, 0x63, 0x32, 0x30, 0x41, 0x73, 0x73, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x12, 0x16, - 0x0a, 0x06, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, - 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, - 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x61, 0x73, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x67, 0x61, 0x73, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x2d, 0x0a, - 0x07, 0x74, 0x78, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, - 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x78, - 0x54, 0x79, 0x70, 0x65, 0x52, 0x06, 0x74, 0x78, 0x54, 0x79, 0x70, 0x65, 0x12, 0x32, 0x0a, 0x05, - 0x70, 0x63, 0x5f, 0x74, 0x78, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x75, 0x65, - 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x69, 0x67, 0x69, - 0x6e, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x63, 0x54, 0x78, 0x52, 0x04, 0x70, 0x63, 0x54, 0x78, - 0x12, 0x42, 0x0a, 0x0b, 0x6f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5f, 0x74, 0x78, 0x18, - 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, - 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x4f, 0x62, 0x73, - 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, 0x62, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x64, 0x54, 0x78, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x02, 0x69, 0x64, 0x12, 0x3d, 0x0a, 0x0f, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, - 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, - 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x52, 0x0e, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x12, 0x51, 0x0a, 0x13, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x5f, 0x69, 0x6e, - 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x20, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, - 0x52, 0x65, 0x76, 0x65, 0x72, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x52, 0x12, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x42, 0x0a, 0x13, 0x70, 0x63, 0x5f, 0x72, 0x65, 0x76, - 0x65, 0x72, 0x74, 0x5f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0f, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, - 0x76, 0x31, 0x2e, 0x50, 0x43, 0x54, 0x78, 0x52, 0x11, 0x70, 0x63, 0x52, 0x65, 0x76, 0x65, 0x72, - 0x74, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x61, - 0x73, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x67, - 0x61, 0x73, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x67, 0x61, 0x73, 0x5f, 0x66, - 0x65, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x67, 0x61, 0x73, 0x46, 0x65, 0x65, - 0x3a, 0x08, 0x98, 0xa0, 0x1f, 0x00, 0xe8, 0xa0, 0x1f, 0x01, 0x22, 0xa8, 0x02, 0x0a, 0x0b, 0x55, - 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x54, 0x78, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x34, 0x0a, 0x0a, 0x69, 0x6e, - 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x74, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, - 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, - 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x09, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x54, 0x78, - 0x12, 0x27, 0x0a, 0x05, 0x70, 0x63, 0x5f, 0x74, 0x78, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x52, 0x08, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x20, 0x0a, 0x0c, 0x67, 0x61, + 0x73, 0x5f, 0x66, 0x65, 0x65, 0x5f, 0x75, 0x73, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x67, 0x61, 0x73, 0x46, 0x65, 0x65, 0x55, 0x73, 0x65, 0x64, 0x3a, 0x27, 0xe8, 0xa0, + 0x1f, 0x01, 0x8a, 0xe7, 0xb0, 0x2a, 0x1e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, + 0x2f, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x6f, 0x62, 0x73, 0x65, 0x72, 0x76, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x6d, 0x0a, 0x0f, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, + 0x74, 0x69, 0x6e, 0x67, 0x50, 0x63, 0x54, 0x78, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x78, 0x5f, 0x68, + 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x78, 0x48, 0x61, 0x73, + 0x68, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x3a, 0x24, + 0xe8, 0xa0, 0x1f, 0x01, 0x8a, 0xe7, 0xb0, 0x2a, 0x1b, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, + 0x6f, 0x72, 0x2f, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x70, + 0x63, 0x5f, 0x74, 0x78, 0x22, 0xf2, 0x06, 0x0a, 0x0a, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, + 0x64, 0x54, 0x78, 0x12, 0x2b, 0x0a, 0x11, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, + 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x69, 0x6e, + 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x16, + 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x11, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x41, 0x73, 0x73, + 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x12, 0x28, 0x0a, 0x10, 0x70, 0x72, 0x63, 0x32, 0x30, 0x5f, + 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0e, 0x70, 0x72, 0x63, 0x32, 0x30, 0x41, 0x73, 0x73, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, + 0x12, 0x16, 0x0a, 0x06, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, + 0x6f, 0x61, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, + 0x61, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x61, 0x73, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x67, 0x61, 0x73, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, + 0x2d, 0x0a, 0x07, 0x74, 0x78, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x14, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, + 0x54, 0x78, 0x54, 0x79, 0x70, 0x65, 0x52, 0x06, 0x74, 0x78, 0x54, 0x79, 0x70, 0x65, 0x12, 0x32, + 0x0a, 0x05, 0x70, 0x63, 0x5f, 0x74, 0x78, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, + 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x69, + 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x63, 0x54, 0x78, 0x52, 0x04, 0x70, 0x63, + 0x54, 0x78, 0x12, 0x42, 0x0a, 0x0b, 0x6f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5f, 0x74, + 0x78, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x4f, + 0x62, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, 0x62, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x64, 0x54, 0x78, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x0c, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3d, 0x0a, 0x0f, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, + 0x6e, 0x64, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x14, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0e, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x51, 0x0a, 0x13, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x5f, + 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0e, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, + 0x31, 0x2e, 0x52, 0x65, 0x76, 0x65, 0x72, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x12, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x49, 0x6e, 0x73, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x42, 0x0a, 0x13, 0x70, 0x63, 0x5f, 0x72, + 0x65, 0x76, 0x65, 0x72, 0x74, 0x5f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, + 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x43, 0x54, 0x78, 0x52, 0x11, 0x70, 0x63, 0x52, 0x65, 0x76, + 0x65, 0x72, 0x74, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, + 0x67, 0x61, 0x73, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x67, 0x61, 0x73, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x67, 0x61, 0x73, + 0x5f, 0x66, 0x65, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x67, 0x61, 0x73, 0x46, + 0x65, 0x65, 0x12, 0x42, 0x0a, 0x13, 0x70, 0x63, 0x5f, 0x72, 0x65, 0x66, 0x75, 0x6e, 0x64, 0x5f, + 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, - 0x43, 0x54, 0x78, 0x52, 0x04, 0x70, 0x63, 0x54, 0x78, 0x12, 0x39, 0x0a, 0x0b, 0x6f, 0x75, 0x74, - 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x74, 0x78, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, - 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x75, - 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x54, 0x78, 0x52, 0x0a, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, - 0x6e, 0x64, 0x54, 0x78, 0x12, 0x4a, 0x0a, 0x10, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, - 0x6c, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1f, - 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x6e, - 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x54, 0x78, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x0f, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x3a, 0x23, 0x98, 0xa0, 0x1f, 0x00, 0xe8, 0xa0, 0x1f, 0x01, 0x8a, 0xe7, 0xb0, 0x2a, 0x16, 0x75, - 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2f, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, - 0x61, 0x6c, 0x5f, 0x74, 0x78, 0x22, 0xab, 0x03, 0x0a, 0x0d, 0x49, 0x6e, 0x62, 0x6f, 0x75, 0x6e, - 0x64, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x5f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x78, - 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x78, 0x48, - 0x61, 0x73, 0x68, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x12, 0x1c, 0x0a, 0x09, 0x72, - 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x72, 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x6d, 0x6f, - 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, - 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x73, 0x73, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, - 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x3a, 0x0a, - 0x07, 0x74, 0x78, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x21, - 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, - 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x54, 0x78, 0x54, 0x79, 0x70, 0x65, 0x4c, 0x65, 0x67, 0x61, 0x63, - 0x79, 0x52, 0x06, 0x74, 0x78, 0x54, 0x79, 0x70, 0x65, 0x12, 0x4b, 0x0a, 0x11, 0x75, 0x6e, 0x69, - 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x5f, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, - 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x50, 0x61, 0x79, - 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x10, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x50, - 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x2b, 0x0a, 0x11, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x0a, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x10, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, - 0x61, 0x74, 0x61, 0x3a, 0x1e, 0x98, 0xa0, 0x1f, 0x01, 0xe8, 0xa0, 0x1f, 0x01, 0x8a, 0xe7, 0xb0, - 0x2a, 0x11, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2f, 0x69, 0x6e, 0x62, 0x6f, - 0x75, 0x6e, 0x64, 0x22, 0xd1, 0x01, 0x0a, 0x10, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, - 0x54, 0x78, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x12, 0x2b, 0x0a, 0x11, 0x64, 0x65, 0x73, 0x74, - 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x10, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x43, 0x68, 0x61, 0x69, 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x78, 0x48, 0x61, 0x73, 0x68, 0x12, 0x1c, - 0x0a, 0x09, 0x72, 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x72, 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, - 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x6d, - 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x61, 0x64, - 0x64, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x73, 0x73, 0x65, 0x74, 0x41, - 0x64, 0x64, 0x72, 0x3a, 0x22, 0x98, 0xa0, 0x1f, 0x01, 0xe8, 0xa0, 0x1f, 0x01, 0x8a, 0xe7, 0xb0, - 0x2a, 0x15, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2f, 0x6f, 0x75, 0x74, 0x62, - 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x74, 0x78, 0x22, 0xaa, 0x02, 0x0a, 0x11, 0x55, 0x6e, 0x69, 0x76, - 0x65, 0x72, 0x73, 0x61, 0x6c, 0x54, 0x78, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x12, 0x3a, 0x0a, - 0x0a, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1b, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, - 0x2e, 0x49, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x52, 0x09, - 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x54, 0x78, 0x12, 0x27, 0x0a, 0x05, 0x70, 0x63, 0x5f, - 0x74, 0x78, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, - 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x43, 0x54, 0x78, 0x52, 0x04, 0x70, 0x63, - 0x54, 0x78, 0x12, 0x3f, 0x0a, 0x0b, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x74, - 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, - 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x54, - 0x78, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x52, 0x0a, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, + 0x43, 0x54, 0x78, 0x52, 0x11, 0x70, 0x63, 0x52, 0x65, 0x66, 0x75, 0x6e, 0x64, 0x45, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x0a, 0x11, 0x72, 0x65, 0x66, 0x75, 0x6e, 0x64, + 0x5f, 0x73, 0x77, 0x61, 0x70, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x13, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0f, 0x72, 0x65, 0x66, 0x75, 0x6e, 0x64, 0x53, 0x77, 0x61, 0x70, 0x45, 0x72, 0x72, + 0x6f, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x61, 0x73, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, + 0x14, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x67, 0x61, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x3a, + 0x08, 0x98, 0xa0, 0x1f, 0x00, 0xe8, 0xa0, 0x1f, 0x01, 0x22, 0xa8, 0x02, 0x0a, 0x0b, 0x55, 0x6e, + 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x54, 0x78, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x34, 0x0a, 0x0a, 0x69, 0x6e, 0x62, + 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x74, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, + 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x62, + 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x09, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x54, 0x78, 0x12, + 0x27, 0x0a, 0x05, 0x70, 0x63, 0x5f, 0x74, 0x78, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, + 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x43, + 0x54, 0x78, 0x52, 0x04, 0x70, 0x63, 0x54, 0x78, 0x12, 0x39, 0x0a, 0x0b, 0x6f, 0x75, 0x74, 0x62, + 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x74, 0x78, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, + 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x75, 0x74, + 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x54, 0x78, 0x52, 0x0a, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x54, 0x78, 0x12, 0x4a, 0x0a, 0x10, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, - 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1f, 0x2e, + 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1f, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x54, 0x78, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0f, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3a, - 0x23, 0x98, 0xa0, 0x1f, 0x01, 0xe8, 0xa0, 0x1f, 0x01, 0x8a, 0xe7, 0xb0, 0x2a, 0x16, 0x75, 0x65, + 0x23, 0x98, 0xa0, 0x1f, 0x00, 0xe8, 0xa0, 0x1f, 0x01, 0x8a, 0xe7, 0xb0, 0x2a, 0x16, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2f, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, - 0x6c, 0x5f, 0x74, 0x78, 0x2a, 0x47, 0x0a, 0x10, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x12, 0x73, 0x69, 0x67, 0x6e, - 0x65, 0x64, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x10, 0x00, - 0x12, 0x1b, 0x0a, 0x17, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x54, 0x78, 0x56, - 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x10, 0x01, 0x2a, 0x83, 0x02, - 0x0a, 0x11, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x54, 0x78, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x12, 0x23, 0x0a, 0x1f, 0x55, 0x4e, 0x49, 0x56, 0x45, 0x52, 0x53, 0x41, 0x4c, - 0x5f, 0x54, 0x58, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, - 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x49, 0x4e, 0x42, 0x4f, - 0x55, 0x4e, 0x44, 0x5f, 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x10, 0x01, 0x12, 0x1d, 0x0a, - 0x19, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x49, 0x4e, 0x42, 0x4f, 0x55, 0x4e, 0x44, - 0x5f, 0x45, 0x58, 0x45, 0x43, 0x55, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x02, 0x12, 0x17, 0x0a, 0x13, - 0x50, 0x43, 0x5f, 0x45, 0x58, 0x45, 0x43, 0x55, 0x54, 0x45, 0x44, 0x5f, 0x53, 0x55, 0x43, 0x43, - 0x45, 0x53, 0x53, 0x10, 0x03, 0x12, 0x16, 0x0a, 0x12, 0x50, 0x43, 0x5f, 0x45, 0x58, 0x45, 0x43, - 0x55, 0x54, 0x45, 0x44, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x04, 0x12, 0x15, 0x0a, - 0x11, 0x50, 0x43, 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x52, 0x45, 0x56, 0x45, - 0x52, 0x54, 0x10, 0x05, 0x12, 0x14, 0x0a, 0x10, 0x4f, 0x55, 0x54, 0x42, 0x4f, 0x55, 0x4e, 0x44, - 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x06, 0x12, 0x14, 0x0a, 0x10, 0x4f, 0x55, - 0x54, 0x42, 0x4f, 0x55, 0x4e, 0x44, 0x5f, 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x10, 0x07, - 0x12, 0x13, 0x0a, 0x0f, 0x4f, 0x55, 0x54, 0x42, 0x4f, 0x55, 0x4e, 0x44, 0x5f, 0x46, 0x41, 0x49, - 0x4c, 0x45, 0x44, 0x10, 0x08, 0x12, 0x0c, 0x0a, 0x08, 0x43, 0x41, 0x4e, 0x43, 0x45, 0x4c, 0x45, - 0x44, 0x10, 0x09, 0x2a, 0x42, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0f, 0x0a, - 0x0b, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0b, - 0x0a, 0x07, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x4f, - 0x42, 0x53, 0x45, 0x52, 0x56, 0x45, 0x44, 0x10, 0x02, 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x45, 0x56, - 0x45, 0x52, 0x54, 0x45, 0x44, 0x10, 0x03, 0x2a, 0x7d, 0x0a, 0x06, 0x54, 0x78, 0x54, 0x79, 0x70, - 0x65, 0x12, 0x12, 0x0a, 0x0e, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, - 0x5f, 0x54, 0x58, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x47, 0x41, 0x53, 0x10, 0x01, 0x12, 0x13, - 0x0a, 0x0f, 0x47, 0x41, 0x53, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x50, 0x41, 0x59, 0x4c, 0x4f, 0x41, - 0x44, 0x10, 0x02, 0x12, 0x09, 0x0a, 0x05, 0x46, 0x55, 0x4e, 0x44, 0x53, 0x10, 0x03, 0x12, 0x15, - 0x0a, 0x11, 0x46, 0x55, 0x4e, 0x44, 0x53, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x50, 0x41, 0x59, 0x4c, - 0x4f, 0x41, 0x44, 0x10, 0x04, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x41, 0x59, 0x4c, 0x4f, 0x41, 0x44, - 0x10, 0x05, 0x12, 0x12, 0x0a, 0x0e, 0x49, 0x4e, 0x42, 0x4f, 0x55, 0x4e, 0x44, 0x5f, 0x52, 0x45, - 0x56, 0x45, 0x52, 0x54, 0x10, 0x06, 0x2a, 0xb4, 0x01, 0x0a, 0x13, 0x49, 0x6e, 0x62, 0x6f, 0x75, - 0x6e, 0x64, 0x54, 0x78, 0x54, 0x79, 0x70, 0x65, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x12, 0x21, - 0x0a, 0x1d, 0x49, 0x4e, 0x42, 0x4f, 0x55, 0x4e, 0x44, 0x5f, 0x4c, 0x45, 0x47, 0x41, 0x43, 0x59, - 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x5f, 0x54, 0x58, 0x10, - 0x00, 0x12, 0x16, 0x0a, 0x12, 0x49, 0x4e, 0x42, 0x4f, 0x55, 0x4e, 0x44, 0x5f, 0x4c, 0x45, 0x47, - 0x41, 0x43, 0x59, 0x5f, 0x47, 0x41, 0x53, 0x10, 0x01, 0x12, 0x18, 0x0a, 0x14, 0x49, 0x4e, 0x42, - 0x4f, 0x55, 0x4e, 0x44, 0x5f, 0x4c, 0x45, 0x47, 0x41, 0x43, 0x59, 0x5f, 0x46, 0x55, 0x4e, 0x44, - 0x53, 0x10, 0x02, 0x12, 0x24, 0x0a, 0x20, 0x49, 0x4e, 0x42, 0x4f, 0x55, 0x4e, 0x44, 0x5f, 0x4c, - 0x45, 0x47, 0x41, 0x43, 0x59, 0x5f, 0x46, 0x55, 0x4e, 0x44, 0x53, 0x5f, 0x41, 0x4e, 0x44, 0x5f, - 0x50, 0x41, 0x59, 0x4c, 0x4f, 0x41, 0x44, 0x10, 0x03, 0x12, 0x22, 0x0a, 0x1e, 0x49, 0x4e, 0x42, - 0x4f, 0x55, 0x4e, 0x44, 0x5f, 0x4c, 0x45, 0x47, 0x41, 0x43, 0x59, 0x5f, 0x47, 0x41, 0x53, 0x5f, - 0x41, 0x4e, 0x44, 0x5f, 0x50, 0x41, 0x59, 0x4c, 0x4f, 0x41, 0x44, 0x10, 0x04, 0x42, 0xb2, 0x01, - 0x0a, 0x10, 0x63, 0x6f, 0x6d, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, - 0x76, 0x31, 0x42, 0x0a, 0x54, 0x79, 0x70, 0x65, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, - 0x5a, 0x41, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x75, 0x73, - 0x68, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x2f, 0x70, 0x75, 0x73, 0x68, 0x2d, 0x63, 0x68, 0x61, 0x69, - 0x6e, 0x2d, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x75, 0x65, 0x78, 0x65, 0x63, - 0x75, 0x74, 0x6f, 0x72, 0x2f, 0x76, 0x31, 0x3b, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, - 0x72, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x55, 0x58, 0x58, 0xaa, 0x02, 0x0c, 0x55, 0x65, 0x78, 0x65, - 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x0c, 0x55, 0x65, 0x78, 0x65, 0x63, - 0x75, 0x74, 0x6f, 0x72, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x18, 0x55, 0x65, 0x78, 0x65, 0x63, 0x75, - 0x74, 0x6f, 0x72, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0xea, 0x02, 0x0d, 0x55, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x3a, 0x3a, - 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6c, 0x5f, 0x74, 0x78, 0x22, 0xab, 0x03, 0x0a, 0x0d, 0x49, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, + 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x5f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x78, 0x5f, + 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x78, 0x48, 0x61, + 0x73, 0x68, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, + 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, + 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, + 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, + 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x73, 0x73, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x12, + 0x1b, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x3a, 0x0a, 0x07, + 0x74, 0x78, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x21, 0x2e, + 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x62, + 0x6f, 0x75, 0x6e, 0x64, 0x54, 0x78, 0x54, 0x79, 0x70, 0x65, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, + 0x52, 0x06, 0x74, 0x78, 0x54, 0x79, 0x70, 0x65, 0x12, 0x4b, 0x0a, 0x11, 0x75, 0x6e, 0x69, 0x76, + 0x65, 0x72, 0x73, 0x61, 0x6c, 0x5f, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, + 0x76, 0x31, 0x2e, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x50, 0x61, 0x79, 0x6c, + 0x6f, 0x61, 0x64, 0x52, 0x10, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x50, 0x61, + 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x2b, 0x0a, 0x11, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x10, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, + 0x74, 0x61, 0x3a, 0x1e, 0x98, 0xa0, 0x1f, 0x01, 0xe8, 0xa0, 0x1f, 0x01, 0x8a, 0xe7, 0xb0, 0x2a, + 0x11, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2f, 0x69, 0x6e, 0x62, 0x6f, 0x75, + 0x6e, 0x64, 0x22, 0xd1, 0x01, 0x0a, 0x10, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x54, + 0x78, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x12, 0x2b, 0x0a, 0x11, 0x64, 0x65, 0x73, 0x74, 0x69, + 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x10, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, + 0x68, 0x61, 0x69, 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x78, 0x48, 0x61, 0x73, 0x68, 0x12, 0x1c, 0x0a, + 0x09, 0x72, 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x72, 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x61, + 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x6d, 0x6f, + 0x75, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x61, 0x64, 0x64, + 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x73, 0x73, 0x65, 0x74, 0x41, 0x64, + 0x64, 0x72, 0x3a, 0x22, 0x98, 0xa0, 0x1f, 0x01, 0xe8, 0xa0, 0x1f, 0x01, 0x8a, 0xe7, 0xb0, 0x2a, + 0x15, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2f, 0x6f, 0x75, 0x74, 0x62, 0x6f, + 0x75, 0x6e, 0x64, 0x5f, 0x74, 0x78, 0x22, 0xaa, 0x02, 0x0a, 0x11, 0x55, 0x6e, 0x69, 0x76, 0x65, + 0x72, 0x73, 0x61, 0x6c, 0x54, 0x78, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x12, 0x3a, 0x0a, 0x0a, + 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1b, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, + 0x49, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x52, 0x09, 0x69, + 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x54, 0x78, 0x12, 0x27, 0x0a, 0x05, 0x70, 0x63, 0x5f, 0x74, + 0x78, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x43, 0x54, 0x78, 0x52, 0x04, 0x70, 0x63, 0x54, + 0x78, 0x12, 0x3f, 0x0a, 0x0b, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x74, 0x78, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, + 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x54, 0x78, + 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x52, 0x0a, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, + 0x54, 0x78, 0x12, 0x4a, 0x0a, 0x10, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x5f, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1f, 0x2e, 0x75, + 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x6e, 0x69, 0x76, + 0x65, 0x72, 0x73, 0x61, 0x6c, 0x54, 0x78, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0f, 0x75, + 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3a, 0x23, + 0x98, 0xa0, 0x1f, 0x01, 0xe8, 0xa0, 0x1f, 0x01, 0x8a, 0xe7, 0xb0, 0x2a, 0x16, 0x75, 0x65, 0x78, + 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2f, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, + 0x5f, 0x74, 0x78, 0x2a, 0x47, 0x0a, 0x10, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x12, 0x73, 0x69, 0x67, 0x6e, 0x65, + 0x64, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x10, 0x00, 0x12, + 0x1b, 0x0a, 0x17, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x54, 0x78, 0x56, 0x65, + 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x10, 0x01, 0x2a, 0x83, 0x02, 0x0a, + 0x11, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x54, 0x78, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x23, 0x0a, 0x1f, 0x55, 0x4e, 0x49, 0x56, 0x45, 0x52, 0x53, 0x41, 0x4c, 0x5f, + 0x54, 0x58, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, + 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x49, 0x4e, 0x42, 0x4f, 0x55, + 0x4e, 0x44, 0x5f, 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x10, 0x01, 0x12, 0x1d, 0x0a, 0x19, + 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x49, 0x4e, 0x42, 0x4f, 0x55, 0x4e, 0x44, 0x5f, + 0x45, 0x58, 0x45, 0x43, 0x55, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x02, 0x12, 0x17, 0x0a, 0x13, 0x50, + 0x43, 0x5f, 0x45, 0x58, 0x45, 0x43, 0x55, 0x54, 0x45, 0x44, 0x5f, 0x53, 0x55, 0x43, 0x43, 0x45, + 0x53, 0x53, 0x10, 0x03, 0x12, 0x16, 0x0a, 0x12, 0x50, 0x43, 0x5f, 0x45, 0x58, 0x45, 0x43, 0x55, + 0x54, 0x45, 0x44, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x04, 0x12, 0x15, 0x0a, 0x11, + 0x50, 0x43, 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x52, 0x45, 0x56, 0x45, 0x52, + 0x54, 0x10, 0x05, 0x12, 0x14, 0x0a, 0x10, 0x4f, 0x55, 0x54, 0x42, 0x4f, 0x55, 0x4e, 0x44, 0x5f, + 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x06, 0x12, 0x14, 0x0a, 0x10, 0x4f, 0x55, 0x54, + 0x42, 0x4f, 0x55, 0x4e, 0x44, 0x5f, 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x10, 0x07, 0x12, + 0x13, 0x0a, 0x0f, 0x4f, 0x55, 0x54, 0x42, 0x4f, 0x55, 0x4e, 0x44, 0x5f, 0x46, 0x41, 0x49, 0x4c, + 0x45, 0x44, 0x10, 0x08, 0x12, 0x0c, 0x0a, 0x08, 0x43, 0x41, 0x4e, 0x43, 0x45, 0x4c, 0x45, 0x44, + 0x10, 0x09, 0x2a, 0x42, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0f, 0x0a, 0x0b, + 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0b, 0x0a, + 0x07, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x4f, 0x42, + 0x53, 0x45, 0x52, 0x56, 0x45, 0x44, 0x10, 0x02, 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x45, 0x56, 0x45, + 0x52, 0x54, 0x45, 0x44, 0x10, 0x03, 0x2a, 0x7d, 0x0a, 0x06, 0x54, 0x78, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x12, 0x0a, 0x0e, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x5f, + 0x54, 0x58, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x47, 0x41, 0x53, 0x10, 0x01, 0x12, 0x13, 0x0a, + 0x0f, 0x47, 0x41, 0x53, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x50, 0x41, 0x59, 0x4c, 0x4f, 0x41, 0x44, + 0x10, 0x02, 0x12, 0x09, 0x0a, 0x05, 0x46, 0x55, 0x4e, 0x44, 0x53, 0x10, 0x03, 0x12, 0x15, 0x0a, + 0x11, 0x46, 0x55, 0x4e, 0x44, 0x53, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x50, 0x41, 0x59, 0x4c, 0x4f, + 0x41, 0x44, 0x10, 0x04, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x41, 0x59, 0x4c, 0x4f, 0x41, 0x44, 0x10, + 0x05, 0x12, 0x12, 0x0a, 0x0e, 0x49, 0x4e, 0x42, 0x4f, 0x55, 0x4e, 0x44, 0x5f, 0x52, 0x45, 0x56, + 0x45, 0x52, 0x54, 0x10, 0x06, 0x2a, 0xb4, 0x01, 0x0a, 0x13, 0x49, 0x6e, 0x62, 0x6f, 0x75, 0x6e, + 0x64, 0x54, 0x78, 0x54, 0x79, 0x70, 0x65, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x12, 0x21, 0x0a, + 0x1d, 0x49, 0x4e, 0x42, 0x4f, 0x55, 0x4e, 0x44, 0x5f, 0x4c, 0x45, 0x47, 0x41, 0x43, 0x59, 0x5f, + 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x5f, 0x54, 0x58, 0x10, 0x00, + 0x12, 0x16, 0x0a, 0x12, 0x49, 0x4e, 0x42, 0x4f, 0x55, 0x4e, 0x44, 0x5f, 0x4c, 0x45, 0x47, 0x41, + 0x43, 0x59, 0x5f, 0x47, 0x41, 0x53, 0x10, 0x01, 0x12, 0x18, 0x0a, 0x14, 0x49, 0x4e, 0x42, 0x4f, + 0x55, 0x4e, 0x44, 0x5f, 0x4c, 0x45, 0x47, 0x41, 0x43, 0x59, 0x5f, 0x46, 0x55, 0x4e, 0x44, 0x53, + 0x10, 0x02, 0x12, 0x24, 0x0a, 0x20, 0x49, 0x4e, 0x42, 0x4f, 0x55, 0x4e, 0x44, 0x5f, 0x4c, 0x45, + 0x47, 0x41, 0x43, 0x59, 0x5f, 0x46, 0x55, 0x4e, 0x44, 0x53, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x50, + 0x41, 0x59, 0x4c, 0x4f, 0x41, 0x44, 0x10, 0x03, 0x12, 0x22, 0x0a, 0x1e, 0x49, 0x4e, 0x42, 0x4f, + 0x55, 0x4e, 0x44, 0x5f, 0x4c, 0x45, 0x47, 0x41, 0x43, 0x59, 0x5f, 0x47, 0x41, 0x53, 0x5f, 0x41, + 0x4e, 0x44, 0x5f, 0x50, 0x41, 0x59, 0x4c, 0x4f, 0x41, 0x44, 0x10, 0x04, 0x42, 0xb2, 0x01, 0x0a, + 0x10, 0x63, 0x6f, 0x6d, 0x2e, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x76, + 0x31, 0x42, 0x0a, 0x54, 0x79, 0x70, 0x65, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, + 0x41, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x75, 0x73, 0x68, + 0x63, 0x68, 0x61, 0x69, 0x6e, 0x2f, 0x70, 0x75, 0x73, 0x68, 0x2d, 0x63, 0x68, 0x61, 0x69, 0x6e, + 0x2d, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x6f, 0x72, 0x2f, 0x76, 0x31, 0x3b, 0x75, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, + 0x76, 0x31, 0xa2, 0x02, 0x03, 0x55, 0x58, 0x58, 0xaa, 0x02, 0x0c, 0x55, 0x65, 0x78, 0x65, 0x63, + 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x0c, 0x55, 0x65, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x6f, 0x72, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x18, 0x55, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, + 0x6f, 0x72, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0xea, 0x02, 0x0d, 0x55, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x3a, 0x3a, 0x56, + 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -12119,21 +12439,22 @@ var file_uexecutor_v1_types_proto_depIdxs = []int32{ 2, // 7: uexecutor.v1.OutboundTx.outbound_status:type_name -> uexecutor.v1.Status 9, // 8: uexecutor.v1.OutboundTx.revert_instructions:type_name -> uexecutor.v1.RevertInstructions 11, // 9: uexecutor.v1.OutboundTx.pc_revert_execution:type_name -> uexecutor.v1.PCTx - 10, // 10: uexecutor.v1.UniversalTx.inbound_tx:type_name -> uexecutor.v1.Inbound - 11, // 11: uexecutor.v1.UniversalTx.pc_tx:type_name -> uexecutor.v1.PCTx - 14, // 12: uexecutor.v1.UniversalTx.outbound_tx:type_name -> uexecutor.v1.OutboundTx - 1, // 13: uexecutor.v1.UniversalTx.universal_status:type_name -> uexecutor.v1.UniversalTxStatus - 4, // 14: uexecutor.v1.InboundLegacy.tx_type:type_name -> uexecutor.v1.InboundTxTypeLegacy - 6, // 15: uexecutor.v1.InboundLegacy.universal_payload:type_name -> uexecutor.v1.UniversalPayload - 16, // 16: uexecutor.v1.UniversalTxLegacy.inbound_tx:type_name -> uexecutor.v1.InboundLegacy - 11, // 17: uexecutor.v1.UniversalTxLegacy.pc_tx:type_name -> uexecutor.v1.PCTx - 17, // 18: uexecutor.v1.UniversalTxLegacy.outbound_tx:type_name -> uexecutor.v1.OutboundTxLegacy - 1, // 19: uexecutor.v1.UniversalTxLegacy.universal_status:type_name -> uexecutor.v1.UniversalTxStatus - 20, // [20:20] is the sub-list for method output_type - 20, // [20:20] is the sub-list for method input_type - 20, // [20:20] is the sub-list for extension type_name - 20, // [20:20] is the sub-list for extension extendee - 0, // [0:20] is the sub-list for field type_name + 11, // 10: uexecutor.v1.OutboundTx.pc_refund_execution:type_name -> uexecutor.v1.PCTx + 10, // 11: uexecutor.v1.UniversalTx.inbound_tx:type_name -> uexecutor.v1.Inbound + 11, // 12: uexecutor.v1.UniversalTx.pc_tx:type_name -> uexecutor.v1.PCTx + 14, // 13: uexecutor.v1.UniversalTx.outbound_tx:type_name -> uexecutor.v1.OutboundTx + 1, // 14: uexecutor.v1.UniversalTx.universal_status:type_name -> uexecutor.v1.UniversalTxStatus + 4, // 15: uexecutor.v1.InboundLegacy.tx_type:type_name -> uexecutor.v1.InboundTxTypeLegacy + 6, // 16: uexecutor.v1.InboundLegacy.universal_payload:type_name -> uexecutor.v1.UniversalPayload + 16, // 17: uexecutor.v1.UniversalTxLegacy.inbound_tx:type_name -> uexecutor.v1.InboundLegacy + 11, // 18: uexecutor.v1.UniversalTxLegacy.pc_tx:type_name -> uexecutor.v1.PCTx + 17, // 19: uexecutor.v1.UniversalTxLegacy.outbound_tx:type_name -> uexecutor.v1.OutboundTxLegacy + 1, // 20: uexecutor.v1.UniversalTxLegacy.universal_status:type_name -> uexecutor.v1.UniversalTxStatus + 21, // [21:21] is the sub-list for method output_type + 21, // [21:21] is the sub-list for method input_type + 21, // [21:21] is the sub-list for extension type_name + 21, // [21:21] is the sub-list for extension extendee + 0, // [0:21] is the sub-list for field type_name } func init() { file_uexecutor_v1_types_proto_init() } From 346ca45df1792808e43d90891fdf7aa275a20cfd Mon Sep 17 00:00:00 2001 From: Nilesh Gupta Date: Fri, 13 Mar 2026 18:57:40 +0530 Subject: [PATCH 32/36] feat: added GasToken in the chain outbound event --- x/uexecutor/keeper/create_outbound.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/x/uexecutor/keeper/create_outbound.go b/x/uexecutor/keeper/create_outbound.go index 3f9e6f4d..5c59967f 100644 --- a/x/uexecutor/keeper/create_outbound.go +++ b/x/uexecutor/keeper/create_outbound.go @@ -73,6 +73,7 @@ func (k Keeper) BuildOutboundsFromReceipt( GasFee: event.GasFee.String(), GasLimit: event.GasLimit.String(), GasPrice: event.GasPrice.String(), + GasToken: event.GasToken, TxType: event.TxType, PcTx: &types.OriginatingPcTx{ TxHash: receipt.Hash, @@ -206,6 +207,7 @@ func (k Keeper) attachOutboundsToUtx( GasFee: outbound.GasFee, GasLimit: outbound.GasLimit, GasPrice: outbound.GasPrice, + GasToken: outbound.GasToken, TxType: outbound.TxType.String(), PcTxHash: pcTxHash, LogIndex: logIndex, From f5b1d9eafe3fe44f1b1a16a533e73c0e14b4c51c Mon Sep 17 00:00:00 2001 From: Nilesh Gupta Date: Fri, 13 Mar 2026 18:58:35 +0530 Subject: [PATCH 33/36] feat: added refund unused gas implementation --- x/uexecutor/keeper/evm.go | 57 ++++++++++++++- x/uexecutor/keeper/outbound.go | 124 ++++++++++++++++++++++++++++++--- x/uexecutor/types/abi.go | 14 ++++ x/uexecutor/types/events.go | 2 + 4 files changed, 186 insertions(+), 11 deletions(-) diff --git a/x/uexecutor/keeper/evm.go b/x/uexecutor/keeper/evm.go index 39fbe003..05ec3fc8 100644 --- a/x/uexecutor/keeper/evm.go +++ b/x/uexecutor/keeper/evm.go @@ -430,13 +430,13 @@ func (k Keeper) GetDefaultFeeTierForToken(ctx sdk.Context, prc20Address common.A return nil, errors.Wrap(err, "failed to unpack defaultFeeTier result") } - // go-ethereum unpacks uint24 as uint32 - fee, ok := results[0].(uint32) + // go-ethereum unpacks uint24 as *big.Int (non-standard widths always map to *big.Int) + fee, ok := results[0].(*big.Int) if !ok { return nil, fmt.Errorf("unexpected type for defaultFeeTier: %T", results[0]) } - return new(big.Int).SetUint64(uint64(fee)), nil + return fee, nil } // GetSwapQuote calls QuoterV2.quoteExactInputSingle (commit=false) to get the expected @@ -526,3 +526,54 @@ func (k Keeper) CallPRC20DepositAutoSwap( big.NewInt(0), // deadline = 0 → contract uses its default ) } + +// CallUniversalCoreRefundUnusedGas calls refundUnusedGas on UniversalCore to return excess gas fee +// to the recipient. withSwap=true swaps the gas token back to PC; withSwap=false deposits PRC20 directly. +func (k Keeper) CallUniversalCoreRefundUnusedGas( + ctx sdk.Context, + gasToken common.Address, + amount *big.Int, + recipient common.Address, + withSwap bool, + fee *big.Int, + minPCOut *big.Int, +) (*evmtypes.MsgEthereumTxResponse, error) { + handlerAddr := common.HexToAddress(uregistrytypes.SYSTEM_CONTRACTS["UNIVERSAL_CORE"].Address) + + abi, err := types.ParseUniversalCoreABI() + if err != nil { + return nil, errors.Wrap(err, "failed to parse UniversalCore ABI") + } + + ueModuleAccAddress, _ := k.GetUeModuleAddress(ctx) + + nonce, err := k.GetModuleAccountNonce(ctx) + if err != nil { + return nil, err + } + + if _, err := k.IncrementModuleAccountNonce(ctx); err != nil { + return nil, err + } + + // fee is uint24 in Solidity — pass as *big.Int (go-ethereum ABI packs non-standard widths as *big.Int) + return k.evmKeeper.DerivedEVMCall( + ctx, + abi, + ueModuleAccAddress, + handlerAddr, + big.NewInt(0), + nil, + true, + false, + true, + &nonce, + "refundUnusedGas", + gasToken, + amount, + recipient, + withSwap, + fee, + minPCOut, + ) +} diff --git a/x/uexecutor/keeper/outbound.go b/x/uexecutor/keeper/outbound.go index 11d6042d..9839c21f 100644 --- a/x/uexecutor/keeper/outbound.go +++ b/x/uexecutor/keeper/outbound.go @@ -44,18 +44,27 @@ func (k Keeper) FinalizeOutbound(ctx context.Context, utxId string, outbound typ } obs := outbound.ObservedTx - if obs == nil || obs.Success { + if obs == nil { return nil } + sdkCtx := sdk.UnwrapSDKContext(ctx) + + if !obs.Success { + return k.handleFailedOutbound(sdkCtx, utxId, outbound) + } + + return k.handleSuccessfulOutbound(sdkCtx, utxId, outbound, obs) +} + +// handleFailedOutbound mints back the bridged tokens to the revert recipient. +func (k Keeper) handleFailedOutbound(ctx sdk.Context, utxId string, outbound types.OutboundTx) error { // Only refund for funds-related tx types if outbound.TxType != types.TxType_FUNDS && outbound.TxType != types.TxType_GAS_AND_PAYLOAD && outbound.TxType != types.TxType_FUNDS_AND_PAYLOAD { return nil } - sdkCtx := sdk.UnwrapSDKContext(ctx) - // Decide refund recipient safely recipient := outbound.Sender if outbound.RevertInstructions != nil && @@ -69,16 +78,16 @@ func (k Keeper) FinalizeOutbound(ctx context.Context, utxId string, outbound typ if !ok { return fmt.Errorf("invalid amount: %s", outbound.Amount) } - receipt, err := k.CallPRC20Deposit(sdkCtx, common.HexToAddress(outbound.Prc20AssetAddr), common.HexToAddress(recipient), amount) + receipt, err := k.CallPRC20Deposit(ctx, common.HexToAddress(outbound.Prc20AssetAddr), common.HexToAddress(recipient), amount) // Update outbound status outbound.OutboundStatus = types.Status_REVERTED pcTx := types.PCTx{ - TxHash: "", // no hash if depositPRC20 failed + TxHash: "", Sender: outbound.Sender, GasUsed: 0, - BlockHeight: uint64(sdkCtx.BlockHeight()), + BlockHeight: uint64(ctx.BlockHeight()), } if err != nil { @@ -88,11 +97,110 @@ func (k Keeper) FinalizeOutbound(ctx context.Context, utxId string, outbound typ pcTx.TxHash = receipt.Hash pcTx.GasUsed = receipt.GasUsed pcTx.Status = "SUCCESS" - pcTx.ErrorMsg = "" } outbound.PcRevertExecution = &pcTx - // Store Reverted tx in Outbound return k.UpdateOutbound(ctx, utxId, outbound) } + +// handleSuccessfulOutbound refunds unused gas fee when gasFee > gasFeeUsed. +func (k Keeper) handleSuccessfulOutbound(ctx sdk.Context, utxId string, outbound types.OutboundTx, obs *types.OutboundObservation) error { + // Only attempt refund if gas_fee_used is populated and gas token is known + if obs.GasFeeUsed == "" || outbound.GasFee == "" || outbound.GasToken == "" { + return k.UpdateOutbound(ctx, utxId, outbound) + } + + gasFee := new(big.Int) + if _, ok := gasFee.SetString(outbound.GasFee, 10); !ok { + return k.UpdateOutbound(ctx, utxId, outbound) + } + + gasFeeUsed := new(big.Int) + if _, ok := gasFeeUsed.SetString(obs.GasFeeUsed, 10); !ok { + return k.UpdateOutbound(ctx, utxId, outbound) + } + + // No refund needed + if gasFee.Cmp(gasFeeUsed) <= 0 { + return k.UpdateOutbound(ctx, utxId, outbound) + } + + refundAmount := new(big.Int).Sub(gasFee, gasFeeUsed) + gasToken := common.HexToAddress(outbound.GasToken) + + // Refund recipient: prefer fund_recipient in revert_instructions, fall back to sender + refundRecipient := outbound.Sender + if outbound.RevertInstructions != nil && outbound.RevertInstructions.FundRecipient != "" { + refundRecipient = outbound.RevertInstructions.FundRecipient + } + recipientAddr := common.HexToAddress(refundRecipient) + + refundPcTx := &types.PCTx{ + Sender: outbound.Sender, + BlockHeight: uint64(ctx.BlockHeight()), + } + + // Step 1: try refund with swap (gasToken → PC native) + fee, swapErr := k.GetDefaultFeeTierForToken(ctx, gasToken) + var swapFallbackReason string + var receipt interface{ GetHash() string } + + if swapErr == nil { + quote, quoteErr := k.getSwapQuoteForRefund(ctx, gasToken, fee, refundAmount) + if quoteErr == nil { + minPCOut := new(big.Int).Mul(quote, big.NewInt(95)) + minPCOut.Div(minPCOut, big.NewInt(100)) + + resp, err := k.CallUniversalCoreRefundUnusedGas(ctx, gasToken, refundAmount, recipientAddr, true, fee, minPCOut) + if err == nil { + refundPcTx.TxHash = resp.Hash + refundPcTx.GasUsed = resp.GasUsed + refundPcTx.Status = "SUCCESS" + outbound.PcRefundExecution = refundPcTx + return k.UpdateOutbound(ctx, utxId, outbound) + } + swapFallbackReason = fmt.Sprintf("swap refund failed: %s", err.Error()) + } else { + swapFallbackReason = fmt.Sprintf("quote fetch failed: %s", quoteErr.Error()) + } + } else { + swapFallbackReason = fmt.Sprintf("fee tier fetch failed: %s", swapErr.Error()) + } + + _ = receipt + + // Step 2: fallback — refund without swap (deposit PRC20 directly to recipient) + ctx.Logger().Error("FinalizeOutbound: swap refund failed, falling back to no-swap", + "outbound_id", outbound.Id, + "reason", swapFallbackReason, + ) + + resp, err := k.CallUniversalCoreRefundUnusedGas(ctx, gasToken, refundAmount, recipientAddr, false, big.NewInt(0), big.NewInt(0)) + if err != nil { + refundPcTx.Status = "FAILED" + refundPcTx.ErrorMsg = err.Error() + } else { + refundPcTx.TxHash = resp.Hash + refundPcTx.GasUsed = resp.GasUsed + refundPcTx.Status = "SUCCESS" + } + + outbound.PcRefundExecution = refundPcTx + outbound.RefundSwapError = swapFallbackReason + + return k.UpdateOutbound(ctx, utxId, outbound) +} + +// getSwapQuoteForRefund fetches a Uniswap quote for the gas token refund swap. +func (k Keeper) getSwapQuoteForRefund(ctx sdk.Context, gasToken common.Address, fee *big.Int, amount *big.Int) (*big.Int, error) { + quoterAddr, err := k.GetUniversalCoreQuoterAddress(ctx) + if err != nil { + return nil, err + } + wpcAddr, err := k.GetUniversalCoreWPCAddress(ctx) + if err != nil { + return nil, err + } + return k.GetSwapQuote(ctx, quoterAddr, gasToken, wpcAddr, fee, amount) +} diff --git a/x/uexecutor/types/abi.go b/x/uexecutor/types/abi.go index b318f58c..37587e4a 100644 --- a/x/uexecutor/types/abi.go +++ b/x/uexecutor/types/abi.go @@ -353,6 +353,20 @@ const UNIVERSAL_CORE_ABI = `[ "inputs": [{ "name": "", "type": "address", "internalType": "address" }], "outputs": [{ "name": "", "type": "uint24", "internalType": "uint24" }], "stateMutability": "view" + }, + { + "type": "function", + "name": "refundUnusedGas", + "inputs": [ + { "name": "gasToken", "type": "address", "internalType": "address" }, + { "name": "amount", "type": "uint256", "internalType": "uint256" }, + { "name": "recipient", "type": "address", "internalType": "address" }, + { "name": "withSwap", "type": "bool", "internalType": "bool" }, + { "name": "fee", "type": "uint24", "internalType": "uint24" }, + { "name": "minPCOut", "type": "uint256", "internalType": "uint256" } + ], + "outputs": [], + "stateMutability": "nonpayable" } ]` diff --git a/x/uexecutor/types/events.go b/x/uexecutor/types/events.go index 599c937e..59e62187 100644 --- a/x/uexecutor/types/events.go +++ b/x/uexecutor/types/events.go @@ -24,6 +24,7 @@ type OutboundCreatedEvent struct { GasFee string `json:"gas_fee"` GasLimit string `json:"gas_limit"` GasPrice string `json:"gas_price"` + GasToken string `json:"gas_token"` TxType string `json:"tx_type"` PcTxHash string `json:"pc_tx_hash"` LogIndex string `json:"log_index"` @@ -54,6 +55,7 @@ func NewOutboundCreatedEvent(e OutboundCreatedEvent) (sdk.Event, error) { sdk.NewAttribute("gas_fee", e.GasFee), sdk.NewAttribute("gas_limit", e.GasLimit), sdk.NewAttribute("gas_price", e.GasPrice), + sdk.NewAttribute("gas_token", e.GasToken), sdk.NewAttribute("tx_type", e.TxType), sdk.NewAttribute("pc_tx_hash", e.PcTxHash), sdk.NewAttribute("log_index", e.LogIndex), From 0d6731f5bddc660639a784d333a46c51d2263025 Mon Sep 17 00:00:00 2001 From: Nilesh Gupta Date: Fri, 13 Mar 2026 18:58:55 +0530 Subject: [PATCH 34/36] tests: added integration tests for refund gas --- .../uexecutor/gas_fee_refund_test.go | 249 ++++++++++++++++++ .../uexecutor/vote_outbound_test.go | 11 + 2 files changed, 260 insertions(+) create mode 100644 test/integration/uexecutor/gas_fee_refund_test.go diff --git a/test/integration/uexecutor/gas_fee_refund_test.go b/test/integration/uexecutor/gas_fee_refund_test.go new file mode 100644 index 00000000..2194488d --- /dev/null +++ b/test/integration/uexecutor/gas_fee_refund_test.go @@ -0,0 +1,249 @@ +package integrationtest + +import ( + "fmt" + "testing" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/stretchr/testify/require" + + utils "github.com/pushchain/push-chain-node/test/utils" + uexecutortypes "github.com/pushchain/push-chain-node/x/uexecutor/types" +) + +func TestGasFeeRefund(t *testing.T) { + + t.Run("no refund when gasFeeUsed is empty", func(t *testing.T) { + app, ctx, vals, utxId, outbound, coreVals := + setupOutboundVotingTest(t, 4) + + for i := 0; i < 3; i++ { + valAddr, err := sdk.ValAddressFromBech32(coreVals[i].OperatorAddress) + require.NoError(t, err) + coreAcc := sdk.AccAddress(valAddr).String() + + err = utils.ExecVoteOutbound( + t, + ctx, + app, + vals[i], + coreAcc, + utxId, + outbound, + true, + "", + "", // gasFeeUsed empty → no refund + ) + require.NoError(t, err) + } + + utx, _, err := app.UexecutorKeeper.GetUniversalTx(ctx, utxId) + require.NoError(t, err) + + ob := utx.OutboundTx[0] + require.Equal(t, uexecutortypes.Status_OBSERVED, ob.OutboundStatus) + require.True(t, ob.ObservedTx.Success) + // No refund should be triggered + require.Nil(t, ob.PcRefundExecution, "no refund expected when gasFeeUsed is empty") + require.Empty(t, ob.RefundSwapError) + }) + + t.Run("no refund when gasFeeUsed equals gasFee", func(t *testing.T) { + app, ctx, vals, utxId, outbound, coreVals := + setupOutboundVotingTest(t, 4) + + // The mock contract sets GasFee = 111; reporting all 111 consumed → no excess + for i := 0; i < 3; i++ { + valAddr, err := sdk.ValAddressFromBech32(coreVals[i].OperatorAddress) + require.NoError(t, err) + coreAcc := sdk.AccAddress(valAddr).String() + + err = utils.ExecVoteOutbound( + t, + ctx, + app, + vals[i], + coreAcc, + utxId, + outbound, + true, + "", + outbound.GasFee, // gasFeeUsed == gasFee → no excess + ) + require.NoError(t, err) + } + + utx, _, err := app.UexecutorKeeper.GetUniversalTx(ctx, utxId) + require.NoError(t, err) + + ob := utx.OutboundTx[0] + require.Equal(t, uexecutortypes.Status_OBSERVED, ob.OutboundStatus) + require.Nil(t, ob.PcRefundExecution, "no refund expected when gasFeeUsed equals gasFee") + require.Empty(t, ob.RefundSwapError) + }) + + t.Run("no refund when gasFeeUsed exceeds gasFee", func(t *testing.T) { + app, ctx, vals, utxId, outbound, coreVals := + setupOutboundVotingTest(t, 4) + + // gasFeeUsed > gasFee (e.g. 999 > 111) → gasFee - gasFeeUsed <= 0 → no refund + for i := 0; i < 3; i++ { + valAddr, err := sdk.ValAddressFromBech32(coreVals[i].OperatorAddress) + require.NoError(t, err) + coreAcc := sdk.AccAddress(valAddr).String() + + err = utils.ExecVoteOutbound( + t, + ctx, + app, + vals[i], + coreAcc, + utxId, + outbound, + true, + "", + "999", // gasFeeUsed > gasFee(111) → no excess + ) + require.NoError(t, err) + } + + utx, _, err := app.UexecutorKeeper.GetUniversalTx(ctx, utxId) + require.NoError(t, err) + + ob := utx.OutboundTx[0] + require.Equal(t, uexecutortypes.Status_OBSERVED, ob.OutboundStatus) + require.Nil(t, ob.PcRefundExecution, "no refund expected when gasFeeUsed > gasFee") + require.Empty(t, ob.RefundSwapError) + }) + + t.Run("refund execution recorded when gasFee exceeds gasFeeUsed", func(t *testing.T) { + app, ctx, vals, utxId, outbound, coreVals := + setupOutboundVotingTest(t, 4) + + // gasFee = 111 (set by mock), gasFeeUsed = 50 → 61 excess to refund + gasFeeUsed := "50" + + for i := 0; i < 3; i++ { + valAddr, err := sdk.ValAddressFromBech32(coreVals[i].OperatorAddress) + require.NoError(t, err) + coreAcc := sdk.AccAddress(valAddr).String() + + err = utils.ExecVoteOutbound( + t, + ctx, + app, + vals[i], + coreAcc, + utxId, + outbound, + true, + "", + gasFeeUsed, + ) + require.NoError(t, err) + } + + utx, _, err := app.UexecutorKeeper.GetUniversalTx(ctx, utxId) + require.NoError(t, err) + + fmt.Println(utx) + + ob := utx.OutboundTx[0] + require.Equal(t, uexecutortypes.Status_OBSERVED, ob.OutboundStatus) + require.True(t, ob.ObservedTx.Success) + + // Refund was attempted → PcRefundExecution must be set + require.NotNil(t, ob.PcRefundExecution, + "PcRefundExecution must be set when excess gas fee exists") + + // In the test environment the UniversalCore stub may or may not implement + // refundUnusedGas. The important invariant is that the execution record + // is stored regardless of EVM success/failure. + require.NotEmpty(t, ob.PcRefundExecution.Status, + "PcRefundExecution.Status must be set") + }) + + t.Run("swap fallback reason stored when swap refund fails", func(t *testing.T) { + app, ctx, vals, utxId, outbound, coreVals := + setupOutboundVotingTest(t, 4) + + // gasFee = 111, gasFeeUsed = 1 → large excess triggers refund attempt. + // The test handler's defaultFeeTier for an unknown gas token will either + // return 0 or fail, causing the swap path to fall back. In either case + // RefundSwapError must be non-empty (swap was not clean) or PcRefundExecution + // must exist. + gasFeeUsed := "1" + + for i := 0; i < 3; i++ { + valAddr, err := sdk.ValAddressFromBech32(coreVals[i].OperatorAddress) + require.NoError(t, err) + coreAcc := sdk.AccAddress(valAddr).String() + + err = utils.ExecVoteOutbound( + t, + ctx, + app, + vals[i], + coreAcc, + utxId, + outbound, + true, + "", + gasFeeUsed, + ) + require.NoError(t, err) + } + + utx, _, err := app.UexecutorKeeper.GetUniversalTx(ctx, utxId) + require.NoError(t, err) + + ob := utx.OutboundTx[0] + require.Equal(t, uexecutortypes.Status_OBSERVED, ob.OutboundStatus) + + // Refund execution must always be recorded when excess gas exists + require.NotNil(t, ob.PcRefundExecution) + + // The outbound status stays OBSERVED (refund failure does not revert the outbound) + require.Equal(t, uexecutortypes.Status_OBSERVED, ob.OutboundStatus) + }) + + t.Run("failed outbound still performs revert not refund", func(t *testing.T) { + app, ctx, vals, utxId, outbound, coreVals := + setupOutboundVotingTest(t, 4) + + // Vote as FAILED with gasFeeUsed set — refund should NOT run for failed outbounds + for i := 0; i < 3; i++ { + valAddr, err := sdk.ValAddressFromBech32(coreVals[i].OperatorAddress) + require.NoError(t, err) + coreAcc := sdk.AccAddress(valAddr).String() + + err = utils.ExecVoteOutbound( + t, + ctx, + app, + vals[i], + coreAcc, + utxId, + outbound, + false, + "execution failed", + "50", // gasFeeUsed provided but shouldn't trigger refund on failure + ) + require.NoError(t, err) + } + + utx, _, err := app.UexecutorKeeper.GetUniversalTx(ctx, utxId) + require.NoError(t, err) + + ob := utx.OutboundTx[0] + require.Equal(t, uexecutortypes.Status_REVERTED, ob.OutboundStatus) + + // Revert was executed (funds minted back) + require.NotNil(t, ob.PcRevertExecution) + require.Equal(t, "SUCCESS", ob.PcRevertExecution.Status) + + // Gas refund must NOT run for failed outbounds + require.Nil(t, ob.PcRefundExecution, + "gas refund must not run when outbound failed") + }) +} diff --git a/test/integration/uexecutor/vote_outbound_test.go b/test/integration/uexecutor/vote_outbound_test.go index 55312e7c..39d47be5 100644 --- a/test/integration/uexecutor/vote_outbound_test.go +++ b/test/integration/uexecutor/vote_outbound_test.go @@ -94,6 +94,7 @@ func TestOutboundVoting(t *testing.T) { outbound, true, "", + "", ) require.NoError(t, err) @@ -125,6 +126,7 @@ func TestOutboundVoting(t *testing.T) { outbound, true, "", + "", ) require.NoError(t, err) } @@ -155,6 +157,7 @@ func TestOutboundVoting(t *testing.T) { outbound, true, "", + "", ) require.NoError(t, err) @@ -168,6 +171,7 @@ func TestOutboundVoting(t *testing.T) { outbound, true, "", + "", ) require.Error(t, err) require.Contains(t, err.Error(), "already voted") @@ -192,6 +196,7 @@ func TestOutboundVoting(t *testing.T) { outbound, true, "", + "", ) require.NoError(t, err) } @@ -210,6 +215,7 @@ func TestOutboundVoting(t *testing.T) { outbound, true, "", + "", ) require.Error(t, err) require.Contains(t, err.Error(), "already finalized") @@ -234,6 +240,7 @@ func TestOutboundVoting(t *testing.T) { outbound, false, "execution reverted", // revert reason + "", ) require.NoError(t, err) } @@ -274,6 +281,7 @@ func TestOutboundVoting(t *testing.T) { outbound, false, "failed", + "", ) require.NoError(t, err) } @@ -312,6 +320,7 @@ func TestOutboundVoting(t *testing.T) { &prefixedOutbound, true, "", + "", ) require.NoError(t, err) } @@ -342,6 +351,7 @@ func TestOutboundVoting(t *testing.T) { outbound, true, "", + "", ) require.Error(t, err) require.Contains(t, err.Error(), "not found") @@ -367,6 +377,7 @@ func TestOutboundVoting(t *testing.T) { &badOutbound, true, "", + "", ) require.Error(t, err) require.Contains(t, err.Error(), "not found") From 6fc159933ce4f6d11f43798a16298267d38cb7ad Mon Sep 17 00:00:00 2001 From: Nilesh Gupta Date: Fri, 13 Mar 2026 18:59:02 +0530 Subject: [PATCH 35/36] tests: added integration tests for refund gas --- test/utils/helpers.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/utils/helpers.go b/test/utils/helpers.go index 037d376e..c06787d8 100644 --- a/test/utils/helpers.go +++ b/test/utils/helpers.go @@ -48,6 +48,7 @@ func ExecVoteOutbound( outbound *uexecutortypes.OutboundTx, success bool, errorMsg string, + gasFeeUsed string, // actual gas fee consumed on destination chain; "" means no refund ) error { t.Helper() @@ -56,6 +57,7 @@ func ExecVoteOutbound( ErrorMsg: errorMsg, TxHash: fmt.Sprintf("0xobserved-%s", outbound.Id), BlockHeight: 1, + GasFeeUsed: gasFeeUsed, } msg := &uexecutortypes.MsgVoteOutbound{ From 82703f37b7cd06ba323b055fe3e6a185af8522c0 Mon Sep 17 00:00:00 2001 From: Nilesh Gupta Date: Fri, 13 Mar 2026 18:59:08 +0530 Subject: [PATCH 36/36] refactor: added generated protobuf --- x/uexecutor/types/types.pb.go | 456 ++++++++++++++++++++++++++-------- 1 file changed, 346 insertions(+), 110 deletions(-) diff --git a/x/uexecutor/types/types.pb.go b/x/uexecutor/types/types.pb.go index b1656633..462d4216 100644 --- a/x/uexecutor/types/types.pb.go +++ b/x/uexecutor/types/types.pb.go @@ -740,6 +740,7 @@ type OutboundObservation struct { BlockHeight uint64 `protobuf:"varint,2,opt,name=block_height,json=blockHeight,proto3" json:"block_height,omitempty"` TxHash string `protobuf:"bytes,3,opt,name=tx_hash,json=txHash,proto3" json:"tx_hash,omitempty"` ErrorMsg string `protobuf:"bytes,4,opt,name=error_msg,json=errorMsg,proto3" json:"error_msg,omitempty"` + GasFeeUsed string `protobuf:"bytes,5,opt,name=gas_fee_used,json=gasFeeUsed,proto3" json:"gas_fee_used,omitempty"` } func (m *OutboundObservation) Reset() { *m = OutboundObservation{} } @@ -803,6 +804,13 @@ func (m *OutboundObservation) GetErrorMsg() string { return "" } +func (m *OutboundObservation) GetGasFeeUsed() string { + if m != nil { + return m.GasFeeUsed + } + return "" +} + type OriginatingPcTx struct { TxHash string `protobuf:"bytes,1,opt,name=tx_hash,json=txHash,proto3" json:"tx_hash,omitempty"` LogIndex string `protobuf:"bytes,2,opt,name=log_index,json=logIndex,proto3" json:"log_index,omitempty"` @@ -873,6 +881,9 @@ type OutboundTx struct { PcRevertExecution *PCTx `protobuf:"bytes,15,opt,name=pc_revert_execution,json=pcRevertExecution,proto3" json:"pc_revert_execution,omitempty"` GasPrice string `protobuf:"bytes,16,opt,name=gas_price,json=gasPrice,proto3" json:"gas_price,omitempty"` GasFee string `protobuf:"bytes,17,opt,name=gas_fee,json=gasFee,proto3" json:"gas_fee,omitempty"` + PcRefundExecution *PCTx `protobuf:"bytes,18,opt,name=pc_refund_execution,json=pcRefundExecution,proto3" json:"pc_refund_execution,omitempty"` + RefundSwapError string `protobuf:"bytes,19,opt,name=refund_swap_error,json=refundSwapError,proto3" json:"refund_swap_error,omitempty"` + GasToken string `protobuf:"bytes,20,opt,name=gas_token,json=gasToken,proto3" json:"gas_token,omitempty"` } func (m *OutboundTx) Reset() { *m = OutboundTx{} } @@ -1026,6 +1037,27 @@ func (m *OutboundTx) GetGasFee() string { return "" } +func (m *OutboundTx) GetPcRefundExecution() *PCTx { + if m != nil { + return m.PcRefundExecution + } + return nil +} + +func (m *OutboundTx) GetRefundSwapError() string { + if m != nil { + return m.RefundSwapError + } + return "" +} + +func (m *OutboundTx) GetGasToken() string { + if m != nil { + return m.GasToken + } + return "" +} + type UniversalTx struct { Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` InboundTx *Inbound `protobuf:"bytes,2,opt,name=inbound_tx,json=inboundTx,proto3" json:"inbound_tx,omitempty"` @@ -1386,116 +1418,121 @@ func init() { func init() { proto.RegisterFile("uexecutor/v1/types.proto", fileDescriptor_fab6d3ca71d1e2a5) } var fileDescriptor_fab6d3ca71d1e2a5 = []byte{ - // 1742 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x58, 0x4b, 0x6f, 0xdb, 0xd8, - 0x15, 0x36, 0xa9, 0xf7, 0x91, 0x63, 0x51, 0xd7, 0x4e, 0xc2, 0x24, 0x63, 0xd9, 0xd1, 0xcc, 0x34, - 0x86, 0x8b, 0xd8, 0x9d, 0xb4, 0x1d, 0xa0, 0x02, 0x8a, 0x42, 0x96, 0x69, 0x8f, 0x5a, 0x8f, 0xac, - 0x52, 0x92, 0x91, 0xe9, 0x86, 0xa0, 0xc9, 0x6b, 0x9a, 0xa8, 0x44, 0x0a, 0x7c, 0xa8, 0xf4, 0xa2, - 0xab, 0xee, 0x8a, 0x2e, 0xba, 0xcc, 0x32, 0xcb, 0xa2, 0xdd, 0xb4, 0x40, 0x7f, 0xc4, 0x2c, 0xa7, - 0xbb, 0x02, 0xdd, 0x14, 0x09, 0x8a, 0x16, 0xe8, 0x9f, 0x28, 0xee, 0x83, 0x22, 0xa9, 0xc7, 0x64, - 0x8a, 0x2c, 0x0a, 0x74, 0x63, 0xf1, 0x3c, 0xee, 0xe1, 0x77, 0xce, 0x77, 0xce, 0xb9, 0xb2, 0x40, - 0x0e, 0x71, 0x84, 0x8d, 0x30, 0x70, 0xbd, 0xe3, 0xd9, 0x27, 0xc7, 0xc1, 0xdd, 0x14, 0xfb, 0x47, - 0x53, 0xcf, 0x0d, 0x5c, 0xb4, 0x39, 0xb7, 0x1c, 0xcd, 0x3e, 0x79, 0xbc, 0x63, 0xb9, 0x96, 0x4b, - 0x0d, 0xc7, 0xe4, 0x89, 0xf9, 0x3c, 0xae, 0xeb, 0x13, 0xdb, 0x71, 0x8f, 0xe9, 0x5f, 0xa6, 0x6a, - 0x9e, 0x41, 0xb1, 0xaf, 0x7b, 0xfa, 0xc4, 0x47, 0xbb, 0x00, 0xbe, 0x3b, 0xc1, 0xda, 0x4c, 0x1f, - 0x87, 0x58, 0x16, 0xf7, 0x85, 0x83, 0xb2, 0x5a, 0x21, 0x9a, 0x2b, 0xa2, 0x68, 0xed, 0xbe, 0x7a, - 0xbd, 0xb7, 0xf1, 0xaf, 0xd7, 0x7b, 0xc2, 0xaf, 0xff, 0xf9, 0xc7, 0x43, 0x29, 0x81, 0x31, 0xa5, - 0xa7, 0x9b, 0x7f, 0x13, 0x41, 0x1a, 0x39, 0xf6, 0x0c, 0x7b, 0xbe, 0x3e, 0xee, 0xeb, 0x77, 0x63, - 0x57, 0x37, 0xd1, 0x16, 0x88, 0x81, 0x2b, 0x0b, 0xfb, 0xc2, 0x41, 0x45, 0x15, 0x03, 0x17, 0xed, - 0x40, 0x21, 0x89, 0x5e, 0x51, 0x99, 0x80, 0x10, 0xe4, 0x4d, 0x3d, 0xd0, 0xe5, 0x1c, 0x55, 0xd2, - 0x67, 0xf4, 0x04, 0x2a, 0x96, 0xee, 0x6b, 0x63, 0x7b, 0x62, 0x07, 0x72, 0x9e, 0x1a, 0xca, 0x96, - 0xee, 0x5f, 0x10, 0x19, 0x7d, 0x0c, 0xb5, 0x89, 0x1e, 0x69, 0x37, 0x18, 0x6b, 0x53, 0xec, 0x69, - 0x96, 0xee, 0xcb, 0x05, 0xea, 0xb2, 0x39, 0xd1, 0xa3, 0x33, 0x8c, 0xfb, 0xd8, 0x3b, 0xd7, 0x7d, - 0xf4, 0x29, 0xc8, 0xc4, 0x6d, 0xea, 0xd9, 0xae, 0x67, 0x07, 0x77, 0x19, 0xff, 0x22, 0xf5, 0xdf, - 0x99, 0xe8, 0x51, 0x9f, 0x9b, 0x93, 0x73, 0x3b, 0x50, 0x70, 0x5c, 0xc7, 0xc0, 0x72, 0x89, 0xa1, - 0xa4, 0x02, 0x7a, 0x0c, 0x65, 0x13, 0xeb, 0xe6, 0xd8, 0x76, 0xb0, 0x5c, 0x66, 0x80, 0x62, 0x19, - 0x7d, 0x1f, 0x8a, 0x33, 0x8d, 0x90, 0x21, 0x57, 0xf6, 0x85, 0x83, 0xad, 0x17, 0x8d, 0xa3, 0x34, - 0x19, 0x47, 0x57, 0xd8, 0xb3, 0x6f, 0x6c, 0x43, 0x0f, 0x6c, 0xd7, 0x19, 0xde, 0x4d, 0xb1, 0x5a, - 0x98, 0x91, 0x8f, 0xd6, 0x41, 0xba, 0xa4, 0x4f, 0x92, 0x92, 0x86, 0x71, 0x1d, 0xb5, 0x29, 0x2b, - 0x64, 0xf3, 0x37, 0x02, 0x48, 0x9f, 0xdb, 0x96, 0x47, 0x43, 0xc4, 0xd5, 0xfd, 0x00, 0x2a, 0x93, - 0x58, 0xc7, 0x8b, 0x9c, 0x28, 0x92, 0x2c, 0xc4, 0x75, 0x59, 0xe4, 0xb2, 0x59, 0xac, 0x85, 0x33, - 0x8f, 0x39, 0x87, 0xf3, 0x4a, 0x00, 0x34, 0x27, 0xbb, 0x6d, 0x18, 0x6e, 0xe8, 0x04, 0x5d, 0x13, - 0x3d, 0x83, 0x9a, 0x71, 0xab, 0xdb, 0x8e, 0xe6, 0xe8, 0x13, 0xec, 0x4f, 0x75, 0x03, 0x73, 0x58, - 0x5b, 0x54, 0xdd, 0x8b, 0xb5, 0xe8, 0x11, 0x94, 0x99, 0xa3, 0x6d, 0x72, 0x78, 0x25, 0x2a, 0x77, - 0x4d, 0x02, 0xdb, 0xfd, 0x85, 0x83, 0x3d, 0x8e, 0x8e, 0x09, 0xdf, 0xa0, 0x52, 0x3a, 0x43, 0xd1, - 0x34, 0x00, 0xa9, 0x78, 0x86, 0xbd, 0xa0, 0xeb, 0xf8, 0x81, 0x17, 0x1a, 0x04, 0xb7, 0x8f, 0x3e, - 0x86, 0xad, 0x9b, 0xd0, 0x31, 0x35, 0x0f, 0x1b, 0xf6, 0xd4, 0xc6, 0x4e, 0xc0, 0x81, 0xdd, 0x23, - 0x5a, 0x35, 0x56, 0xb6, 0xbe, 0x15, 0xbf, 0x62, 0x37, 0x79, 0x85, 0x47, 0xa3, 0x69, 0x76, 0x2a, - 0x5c, 0xf3, 0xdf, 0x39, 0x28, 0x75, 0x9d, 0x6b, 0x37, 0x74, 0x4c, 0xf4, 0x14, 0x36, 0x7d, 0x37, - 0xf4, 0x0c, 0xac, 0xd1, 0x14, 0x78, 0xe0, 0x2a, 0xd3, 0x75, 0x88, 0x0a, 0x3d, 0x84, 0x52, 0x10, - 0x69, 0xb7, 0xba, 0x7f, 0xcb, 0xb3, 0x2d, 0x06, 0xd1, 0x67, 0xba, 0x7f, 0x8b, 0x1e, 0x40, 0xd1, - 0xc7, 0x8e, 0x39, 0xcf, 0x96, 0x4b, 0x84, 0xd9, 0x04, 0x29, 0xeb, 0xfe, 0x44, 0x41, 0x4e, 0xe9, - 0x13, 0x92, 0x2c, 0xef, 0x7a, 0x2e, 0x91, 0x01, 0xd6, 0x7d, 0x1f, 0x07, 0x9a, 0x6e, 0x9a, 0x1e, - 0xef, 0xf0, 0x0a, 0xd5, 0xb4, 0x4d, 0xd3, 0x23, 0x23, 0x35, 0x76, 0x2d, 0xcd, 0x76, 0x4c, 0x1c, - 0xf1, 0xd6, 0x2e, 0x8f, 0x5d, 0xab, 0x4b, 0x64, 0xf4, 0x9c, 0x42, 0xa4, 0x2d, 0x5c, 0xa6, 0x2d, - 0xbc, 0x93, 0x6d, 0xe1, 0x61, 0x44, 0x1b, 0xb7, 0x18, 0xd0, 0x4f, 0xf4, 0x13, 0xa8, 0x2f, 0x35, - 0x29, 0xed, 0xfd, 0xea, 0x62, 0xef, 0x2f, 0xee, 0x04, 0x55, 0x0a, 0x17, 0xb7, 0xc4, 0xb7, 0xa1, - 0x3e, 0x4b, 0x4d, 0x88, 0x46, 0x97, 0x01, 0x50, 0x80, 0x52, 0xda, 0x70, 0x4a, 0x16, 0xc3, 0x4f, - 0x61, 0x7b, 0x05, 0x23, 0x72, 0x95, 0xbe, 0x7b, 0x3f, 0xfb, 0xee, 0xe5, 0x46, 0x50, 0x91, 0xb7, - 0xdc, 0x1c, 0x3b, 0x50, 0xb0, 0xfd, 0x8e, 0xd2, 0x96, 0x37, 0xe9, 0xce, 0x63, 0x42, 0xab, 0x1c, - 0xb7, 0x5c, 0xf3, 0x4b, 0x01, 0xf2, 0xfd, 0xce, 0x30, 0x4a, 0xf3, 0x28, 0xac, 0xe1, 0x51, 0xcc, - 0xf0, 0xf8, 0x08, 0xc8, 0xd2, 0xd2, 0x42, 0x1f, 0x9b, 0x94, 0xe1, 0xbc, 0x5a, 0xb2, 0x74, 0x7f, - 0xe4, 0x63, 0xda, 0x36, 0xd7, 0x63, 0xd7, 0xf8, 0xb9, 0x76, 0x8b, 0x6d, 0xeb, 0x96, 0xb1, 0x9c, - 0x57, 0xab, 0x54, 0xf7, 0x19, 0x55, 0xd1, 0xa8, 0x81, 0x1e, 0x84, 0xf1, 0xb6, 0xe2, 0x12, 0x21, - 0x12, 0x7b, 0x9e, 0xeb, 0x69, 0x13, 0xdf, 0x8a, 0x89, 0xa4, 0x8a, 0xcf, 0x7d, 0xab, 0xf5, 0x41, - 0x7a, 0x52, 0x6a, 0xa9, 0x35, 0x6d, 0x68, 0x41, 0xd4, 0xfc, 0x93, 0x00, 0xdb, 0x97, 0x61, 0x40, - 0x3b, 0xf7, 0xf2, 0xda, 0xc7, 0xde, 0x8c, 0x2d, 0x0b, 0x19, 0x4a, 0x7e, 0x68, 0x18, 0xd8, 0xf7, - 0x69, 0x66, 0x65, 0x35, 0x16, 0x97, 0x70, 0x8a, 0xcb, 0x38, 0x53, 0x65, 0xc9, 0x65, 0xca, 0x92, - 0x01, 0x9a, 0x5f, 0x00, 0xfa, 0x2c, 0x06, 0xd9, 0x48, 0x40, 0xba, 0x1c, 0x9a, 0xe6, 0x26, 0xd8, - 0x9a, 0x13, 0xa8, 0x5d, 0x7a, 0xb6, 0x65, 0x3b, 0x7a, 0x60, 0x3b, 0x56, 0xdf, 0xf8, 0x3a, 0x22, - 0x32, 0x3d, 0x2e, 0x66, 0x7b, 0xbc, 0xf5, 0xd1, 0x8a, 0x05, 0xe2, 0x26, 0x91, 0x35, 0x56, 0xa2, - 0x7f, 0x14, 0x00, 0xe2, 0x12, 0x0d, 0x23, 0xd2, 0x9c, 0x26, 0xf6, 0x03, 0xea, 0xe3, 0x3a, 0x99, - 0x19, 0x97, 0x52, 0x06, 0x36, 0xe8, 0x99, 0xb9, 0x15, 0xd7, 0xcf, 0x6d, 0x2e, 0x33, 0xb7, 0x47, - 0xb0, 0x8d, 0xa3, 0x00, 0x7b, 0x0e, 0x59, 0x63, 0xc9, 0x00, 0xb3, 0x82, 0xd5, 0x63, 0x53, 0x7b, - 0x3e, 0xc8, 0x07, 0x20, 0x4d, 0x3d, 0xe3, 0xc5, 0x77, 0xd2, 0xce, 0x6c, 0x13, 0x6c, 0x51, 0x7d, - 0xe2, 0x99, 0xf4, 0x65, 0x31, 0xd3, 0x97, 0x32, 0x94, 0xe2, 0xa1, 0x65, 0xfd, 0x13, 0x8b, 0xd9, - 0x7b, 0xb7, 0xbc, 0x70, 0xef, 0xa6, 0x96, 0x44, 0xe5, 0x1b, 0x2c, 0x89, 0x17, 0x50, 0xa0, 0x25, - 0xa5, 0xb3, 0x5c, 0x7d, 0xb1, 0x9b, 0x75, 0x5e, 0xe0, 0x54, 0xcd, 0x4f, 0x09, 0xb3, 0x27, 0x50, - 0x65, 0xdc, 0x63, 0x93, 0x9c, 0x64, 0x63, 0xfd, 0x74, 0xe1, 0xe4, 0x72, 0x03, 0xab, 0x10, 0x9f, - 0x1a, 0x46, 0xe4, 0x5b, 0x87, 0x6d, 0xd2, 0x61, 0xae, 0xa8, 0xa2, 0x6d, 0xa2, 0x1f, 0x42, 0x6d, - 0xde, 0x58, 0x7c, 0xa0, 0xee, 0xad, 0x82, 0x3f, 0xa0, 0x36, 0x75, 0x2b, 0x76, 0x66, 0xf2, 0xba, - 0x8d, 0xb3, 0xf5, 0x1e, 0x1b, 0xe7, 0x04, 0xb6, 0xa7, 0x86, 0xc6, 0xa3, 0xb2, 0xf3, 0xe4, 0x0e, - 0xaf, 0xd1, 0x90, 0x28, 0x1b, 0x92, 0x6c, 0x1e, 0xb5, 0x3e, 0x35, 0x58, 0x68, 0x25, 0x76, 0x8e, - 0x99, 0x9a, 0x7a, 0xb6, 0x81, 0x65, 0x69, 0xce, 0x54, 0x9f, 0xc8, 0x64, 0x40, 0x88, 0xf1, 0x06, - 0x63, 0xb9, 0xce, 0x98, 0xb7, 0x74, 0xff, 0x0c, 0xe3, 0xd4, 0x56, 0xfb, 0x9d, 0x08, 0xd5, 0xf9, - 0x72, 0x9e, 0x57, 0x4d, 0x98, 0x57, 0xed, 0x7b, 0x00, 0x36, 0xbb, 0xe2, 0x08, 0x11, 0x22, 0x85, - 0x76, 0x3f, 0x0b, 0x8d, 0x5f, 0x81, 0x6a, 0x85, 0x3b, 0x0e, 0x23, 0xf4, 0x2c, 0xe6, 0x3c, 0xb7, - 0x9f, 0x5b, 0x93, 0x0b, 0x23, 0xfa, 0x07, 0x50, 0x9d, 0x93, 0x12, 0x44, 0x72, 0x9e, 0xba, 0xcb, - 0xab, 0x89, 0x1e, 0x46, 0x2a, 0xb8, 0xc9, 0x48, 0xfe, 0x18, 0x92, 0x3b, 0x24, 0x26, 0xb4, 0x40, - 0x09, 0xdd, 0x5b, 0x73, 0xf7, 0x0c, 0x23, 0xce, 0x6d, 0x6d, 0x7e, 0x90, 0x29, 0x5a, 0x1f, 0xa6, - 0xd7, 0xe5, 0x83, 0x55, 0x5f, 0x2c, 0x82, 0xa8, 0xf9, 0x87, 0x1c, 0xdc, 0xe3, 0xb9, 0x5e, 0x60, - 0x4b, 0x37, 0xee, 0xfe, 0x4f, 0x2e, 0xfd, 0xd6, 0xe2, 0xa5, 0xff, 0x74, 0x25, 0xbf, 0x6c, 0xac, - 0x59, 0xe6, 0xff, 0xfb, 0x6f, 0x00, 0xad, 0xc6, 0xab, 0xd7, 0x7b, 0x42, 0x4c, 0x59, 0x3d, 0xa1, - 0x8c, 0x37, 0x61, 0xf3, 0x2f, 0x02, 0x48, 0x49, 0xe7, 0x70, 0xc2, 0xfe, 0xab, 0x35, 0xbe, 0x96, - 0xba, 0x0c, 0x45, 0xb9, 0xf5, 0x14, 0xe5, 0xbf, 0x86, 0xa2, 0xc2, 0x02, 0x45, 0xad, 0x66, 0x3a, - 0x9f, 0xfb, 0x2b, 0x2e, 0xc3, 0x20, 0x6a, 0xfe, 0x5e, 0x84, 0x7a, 0xaa, 0x9b, 0x79, 0x52, 0xad, - 0xcc, 0x88, 0x0a, 0xb4, 0xf8, 0x4f, 0x56, 0x52, 0xc8, 0xc9, 0x5b, 0x35, 0xa8, 0xe2, 0x3b, 0x06, - 0xf5, 0x47, 0xd9, 0x41, 0xcd, 0xad, 0xa2, 0x78, 0xb1, 0xdc, 0xef, 0x1c, 0xd7, 0xfc, 0x7b, 0x8c, - 0xab, 0xf0, 0x8e, 0x71, 0x3d, 0x3c, 0x07, 0x69, 0xf1, 0x3f, 0x2e, 0xf4, 0x00, 0x90, 0x6f, 0x5b, - 0x0e, 0x36, 0xd3, 0x16, 0x69, 0x03, 0x3d, 0x81, 0x87, 0x61, 0xf2, 0xda, 0x8c, 0x51, 0x38, 0xfc, - 0x55, 0xb6, 0xea, 0xfc, 0x3e, 0xf8, 0x10, 0xf6, 0x46, 0xbd, 0xee, 0x95, 0xa2, 0x0e, 0xda, 0x17, - 0xda, 0xf0, 0xa5, 0x36, 0x18, 0xb6, 0x87, 0xa3, 0x81, 0x36, 0xea, 0x0d, 0xfa, 0x4a, 0xa7, 0x7b, - 0xd6, 0x55, 0x4e, 0xa5, 0x0d, 0xb4, 0x0d, 0xb5, 0x6e, 0xef, 0xe4, 0x72, 0xd4, 0x3b, 0xd5, 0x06, - 0xa3, 0x4e, 0x47, 0x19, 0x0c, 0x24, 0x01, 0xed, 0xc2, 0xa3, 0xbe, 0xd2, 0x3b, 0xed, 0xf6, 0xce, - 0xb5, 0xd8, 0xa8, 0xbc, 0x54, 0x3a, 0xa3, 0x61, 0xf7, 0xb2, 0x27, 0x89, 0xe8, 0x21, 0x6c, 0xf7, - 0x3b, 0x5c, 0xa3, 0x24, 0xe7, 0x72, 0x04, 0x7c, 0xda, 0x70, 0xd6, 0xee, 0x5e, 0x28, 0xa7, 0x52, - 0x1e, 0xdd, 0x87, 0x7a, 0xbf, 0xa3, 0xc5, 0x21, 0x55, 0xe5, 0x4a, 0x51, 0x87, 0x52, 0x01, 0xed, - 0x80, 0x74, 0x39, 0x1a, 0xb2, 0xf8, 0xdc, 0x28, 0x15, 0x33, 0xda, 0x38, 0x74, 0x89, 0xe0, 0x9c, - 0x6b, 0x79, 0xdc, 0x32, 0xda, 0x84, 0x72, 0xa7, 0xdd, 0xeb, 0x28, 0x44, 0xaa, 0x1c, 0x9e, 0x40, - 0x91, 0x67, 0x5e, 0x83, 0x6a, 0x36, 0xcb, 0x2a, 0x94, 0xe2, 0x17, 0x08, 0xe4, 0xd4, 0xe5, 0xc9, - 0x40, 0x51, 0xaf, 0x94, 0x53, 0x49, 0x24, 0x12, 0x03, 0xa4, 0x9c, 0x4a, 0xb9, 0xc3, 0x5f, 0x42, - 0x91, 0x6d, 0x11, 0x84, 0x60, 0x2b, 0x15, 0x43, 0x1b, 0xbe, 0x94, 0x36, 0x50, 0x09, 0x72, 0xe7, - 0x6d, 0x52, 0xa0, 0x6d, 0xa8, 0x9d, 0xb7, 0x07, 0x5a, 0x9b, 0x00, 0x6f, 0x7f, 0x71, 0x71, 0xd9, - 0x26, 0x91, 0x2a, 0x50, 0x38, 0x1b, 0xf5, 0x4e, 0x49, 0x21, 0xee, 0x43, 0x9d, 0x3e, 0x66, 0x3c, - 0xf2, 0x14, 0x06, 0x17, 0x0a, 0xe4, 0x05, 0x71, 0x71, 0x79, 0x45, 0x8a, 0x87, 0x7f, 0x16, 0x60, - 0x7b, 0xc5, 0x32, 0x43, 0x4f, 0x61, 0x37, 0xf6, 0xbd, 0x50, 0xce, 0xdb, 0x9d, 0x2f, 0xb4, 0x25, - 0x6c, 0x0f, 0x00, 0x2d, 0xb8, 0x30, 0xa8, 0x32, 0xec, 0x2c, 0xe8, 0x19, 0x48, 0x11, 0x7d, 0x04, - 0xfb, 0xab, 0x2c, 0x19, 0xcc, 0x39, 0xd4, 0x84, 0xc6, 0x72, 0xdc, 0x6c, 0x5e, 0x27, 0xfd, 0x2f, - 0xdf, 0x34, 0x84, 0xaf, 0xde, 0x34, 0x84, 0xbf, 0xbf, 0x69, 0x08, 0xbf, 0x7d, 0xdb, 0xd8, 0xf8, - 0xea, 0x6d, 0x63, 0xe3, 0xaf, 0x6f, 0x1b, 0x1b, 0x3f, 0xfb, 0xd4, 0xb2, 0x83, 0xdb, 0xf0, 0xfa, - 0xc8, 0x70, 0x27, 0xc7, 0xd3, 0xd0, 0xbf, 0xa5, 0xfb, 0x8c, 0x3e, 0x3d, 0xa7, 0x8f, 0xcf, 0x1d, - 0xd7, 0xc4, 0xc7, 0xd1, 0x71, 0x32, 0x21, 0xf4, 0xa7, 0xa2, 0xeb, 0x22, 0xfd, 0xd1, 0xe7, 0xbb, - 0xff, 0x09, 0x00, 0x00, 0xff, 0xff, 0xaf, 0x3e, 0x6c, 0xeb, 0x47, 0x12, 0x00, 0x00, + // 1811 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x58, 0x4f, 0x6f, 0xdb, 0xd8, + 0x11, 0x37, 0xf5, 0x5f, 0x23, 0xc7, 0xa2, 0x9e, 0x94, 0x84, 0x49, 0xd6, 0xb2, 0xa3, 0xdd, 0x6d, + 0x0c, 0x17, 0xb1, 0xbb, 0x69, 0xbb, 0x40, 0x05, 0x14, 0x85, 0x2c, 0xd3, 0x5e, 0xb5, 0x5e, 0x59, + 0xa5, 0x24, 0x23, 0xdb, 0x0b, 0xf1, 0x4c, 0xbe, 0xd0, 0xc4, 0x5a, 0xa4, 0x40, 0x52, 0x0a, 0x7d, + 0xe8, 0xa9, 0xb7, 0xa2, 0x87, 0x1e, 0x73, 0xcc, 0xb1, 0x68, 0x2f, 0x3d, 0xf4, 0x43, 0xec, 0x71, + 0x8b, 0x5e, 0x0a, 0xf4, 0x52, 0x24, 0x87, 0x16, 0xe8, 0xad, 0x9f, 0xa0, 0x78, 0x7f, 0x28, 0x92, + 0xb2, 0x94, 0x6c, 0xb1, 0x87, 0x02, 0xbd, 0x58, 0x9c, 0x79, 0xf3, 0xe6, 0xfd, 0x66, 0xe6, 0x37, + 0xf3, 0x68, 0x82, 0x32, 0x23, 0x21, 0x31, 0x66, 0x81, 0xeb, 0x1d, 0xce, 0x3f, 0x39, 0x0c, 0x6e, + 0xa6, 0xc4, 0x3f, 0x98, 0x7a, 0x6e, 0xe0, 0xa2, 0xcd, 0xc5, 0xca, 0xc1, 0xfc, 0x93, 0x87, 0x0d, + 0xcb, 0xb5, 0x5c, 0xb6, 0x70, 0x48, 0x9f, 0xb8, 0xcd, 0xc3, 0x1a, 0x9e, 0xd8, 0x8e, 0x7b, 0xc8, + 0xfe, 0x72, 0x55, 0xeb, 0x04, 0x0a, 0x03, 0xec, 0xe1, 0x89, 0x8f, 0xb6, 0x01, 0x7c, 0x77, 0x42, + 0xf4, 0x39, 0xbe, 0x9e, 0x11, 0x25, 0xb3, 0x2b, 0xed, 0x95, 0xb4, 0x32, 0xd5, 0x5c, 0x50, 0x45, + 0x7b, 0xfb, 0xd5, 0xeb, 0x9d, 0x8d, 0x7f, 0xbe, 0xde, 0x91, 0x7e, 0xfd, 0x8f, 0x3f, 0xee, 0xcb, + 0x31, 0x8c, 0x29, 0xdb, 0xdd, 0xfa, 0x5b, 0x06, 0xe4, 0xb1, 0x63, 0xcf, 0x89, 0xe7, 0xe3, 0xeb, + 0x01, 0xbe, 0xb9, 0x76, 0xb1, 0x89, 0xb6, 0x20, 0x13, 0xb8, 0x8a, 0xb4, 0x2b, 0xed, 0x95, 0xb5, + 0x4c, 0xe0, 0xa2, 0x06, 0xe4, 0x63, 0xef, 0x65, 0x8d, 0x0b, 0x08, 0x41, 0xce, 0xc4, 0x01, 0x56, + 0xb2, 0x4c, 0xc9, 0x9e, 0xd1, 0x23, 0x28, 0x5b, 0xd8, 0xd7, 0xaf, 0xed, 0x89, 0x1d, 0x28, 0x39, + 0xb6, 0x50, 0xb2, 0xb0, 0x7f, 0x46, 0x65, 0xf4, 0x31, 0x54, 0x27, 0x38, 0xd4, 0x5f, 0x10, 0xa2, + 0x4f, 0x89, 0xa7, 0x5b, 0xd8, 0x57, 0xf2, 0xcc, 0x64, 0x73, 0x82, 0xc3, 0x13, 0x42, 0x06, 0xc4, + 0x3b, 0xc5, 0x3e, 0xfa, 0x14, 0x14, 0x6a, 0x36, 0xf5, 0x6c, 0xd7, 0xb3, 0x83, 0x9b, 0x94, 0x7d, + 0x81, 0xd9, 0x37, 0x26, 0x38, 0x1c, 0x88, 0xe5, 0x78, 0x5f, 0x03, 0xf2, 0x8e, 0xeb, 0x18, 0x44, + 0x29, 0x72, 0x94, 0x4c, 0x40, 0x0f, 0xa1, 0x64, 0x12, 0x6c, 0x5e, 0xdb, 0x0e, 0x51, 0x4a, 0x1c, + 0x50, 0x24, 0xa3, 0x1f, 0x42, 0x61, 0xae, 0xd3, 0x62, 0x28, 0xe5, 0x5d, 0x69, 0x6f, 0xeb, 0x59, + 0xf3, 0x20, 0x59, 0x8c, 0x83, 0x0b, 0xe2, 0xd9, 0x2f, 0x6c, 0x03, 0x07, 0xb6, 0xeb, 0x8c, 0x6e, + 0xa6, 0x44, 0xcb, 0xcf, 0xe9, 0x4f, 0x7b, 0x2f, 0x99, 0xd2, 0x47, 0x71, 0x4a, 0x67, 0x51, 0x1e, + 0xf5, 0x29, 0x4f, 0x64, 0xeb, 0x37, 0x12, 0xc8, 0x9f, 0xdb, 0x96, 0xc7, 0x5c, 0x44, 0xd9, 0xfd, + 0x00, 0xca, 0x93, 0x48, 0x27, 0x92, 0x1c, 0x2b, 0xe2, 0x28, 0x32, 0xeb, 0xa2, 0xc8, 0xa6, 0xa3, + 0x58, 0x0b, 0x67, 0xe1, 0x73, 0x01, 0xe7, 0x95, 0x04, 0x68, 0x51, 0xec, 0x8e, 0x61, 0xb8, 0x33, + 0x27, 0xe8, 0x99, 0xe8, 0x09, 0x54, 0x8d, 0x2b, 0x6c, 0x3b, 0xba, 0x83, 0x27, 0xc4, 0x9f, 0x62, + 0x83, 0x08, 0x58, 0x5b, 0x4c, 0xdd, 0x8f, 0xb4, 0xe8, 0x01, 0x94, 0xb8, 0xa1, 0x6d, 0x0a, 0x78, + 0x45, 0x26, 0xf7, 0x4c, 0x0a, 0xdb, 0x7d, 0xe9, 0x10, 0x4f, 0xa0, 0xe3, 0xc2, 0x37, 0xc8, 0x14, + 0xe6, 0x28, 0x5a, 0x06, 0x20, 0x8d, 0xcc, 0x89, 0x17, 0xf4, 0x1c, 0x3f, 0xf0, 0x66, 0x06, 0xc5, + 0xed, 0xa3, 0x8f, 0x61, 0xeb, 0xc5, 0xcc, 0x31, 0x75, 0x8f, 0x18, 0xf6, 0xd4, 0x26, 0x4e, 0x20, + 0x80, 0xdd, 0xa1, 0x5a, 0x2d, 0x52, 0xb6, 0xbf, 0x13, 0x1d, 0xb1, 0x1d, 0x1f, 0xe1, 0x31, 0x6f, + 0xba, 0x9d, 0x70, 0xd7, 0xfa, 0x57, 0x16, 0x8a, 0x3d, 0xe7, 0xd2, 0x9d, 0x39, 0x26, 0x7a, 0x0c, + 0x9b, 0xbe, 0x3b, 0xf3, 0x0c, 0xa2, 0xb3, 0x10, 0x84, 0xe3, 0x0a, 0xd7, 0x75, 0xa9, 0x0a, 0xdd, + 0x87, 0x62, 0x10, 0xea, 0x57, 0xd8, 0xbf, 0x12, 0xd1, 0x16, 0x82, 0xf0, 0x33, 0xec, 0x5f, 0xa1, + 0x7b, 0x50, 0xf0, 0x89, 0x63, 0x2e, 0xa2, 0x15, 0x12, 0xad, 0x6c, 0x8c, 0x94, 0xb3, 0x3f, 0x56, + 0xd0, 0x5d, 0x78, 0x42, 0x83, 0x15, 0xac, 0x17, 0x12, 0x6d, 0x60, 0xec, 0xfb, 0x24, 0xd0, 0xb1, + 0x69, 0x7a, 0x82, 0xe1, 0x65, 0xa6, 0xe9, 0x98, 0xa6, 0x47, 0x5b, 0xea, 0xda, 0xb5, 0x74, 0xdb, + 0x31, 0x49, 0x28, 0xa8, 0x5d, 0xba, 0x76, 0xad, 0x1e, 0x95, 0xd1, 0x53, 0x06, 0x91, 0x51, 0xb8, + 0xc4, 0x28, 0xdc, 0x48, 0x53, 0x78, 0x14, 0x32, 0xe2, 0x16, 0x02, 0xf6, 0x8b, 0x7e, 0x06, 0xb5, + 0x5b, 0x24, 0x65, 0xdc, 0xaf, 0x2c, 0x73, 0x7f, 0x79, 0x26, 0x68, 0xf2, 0x6c, 0x79, 0x4a, 0x7c, + 0x17, 0x6a, 0xf3, 0x44, 0x87, 0xe8, 0x6c, 0x18, 0x00, 0x03, 0x28, 0x27, 0x17, 0x8e, 0xe9, 0x60, + 0xf8, 0x39, 0xd4, 0x57, 0x54, 0x44, 0xa9, 0xb0, 0xb3, 0x77, 0xd3, 0x67, 0xdf, 0x26, 0x82, 0x86, + 0xbc, 0xdb, 0xe4, 0x68, 0x40, 0xde, 0xf6, 0xbb, 0x6a, 0x47, 0xd9, 0x64, 0x33, 0x8f, 0x0b, 0xed, + 0x52, 0x44, 0xb9, 0xd6, 0x57, 0x12, 0xe4, 0x06, 0xdd, 0x51, 0x98, 0xac, 0xa3, 0xb4, 0xa6, 0x8e, + 0x99, 0x54, 0x1d, 0x1f, 0x00, 0x1d, 0x5a, 0xfa, 0xcc, 0x27, 0x26, 0xab, 0x70, 0x4e, 0x2b, 0x5a, + 0xd8, 0x1f, 0xfb, 0x84, 0xd1, 0xe6, 0xf2, 0xda, 0x35, 0xbe, 0xd4, 0xaf, 0x88, 0x6d, 0x5d, 0xf1, + 0x2a, 0xe7, 0xb4, 0x0a, 0xd3, 0x7d, 0xc6, 0x54, 0xcc, 0x6b, 0x80, 0x83, 0x59, 0x34, 0xad, 0x84, + 0x44, 0x0b, 0x49, 0x3c, 0xcf, 0xf5, 0xf4, 0x89, 0x6f, 0x45, 0x85, 0x64, 0x8a, 0xcf, 0x7d, 0xab, + 0xfd, 0x41, 0xb2, 0x53, 0xaa, 0x89, 0x31, 0x6d, 0xe8, 0x41, 0xd8, 0xfa, 0x8b, 0x04, 0xf5, 0xf3, + 0x59, 0xc0, 0x98, 0x7b, 0x7e, 0xe9, 0x13, 0x6f, 0xce, 0x87, 0x85, 0x02, 0x45, 0x7f, 0x66, 0x18, + 0xc4, 0xf7, 0x59, 0x64, 0x25, 0x2d, 0x12, 0x6f, 0xe1, 0xcc, 0xdc, 0xc6, 0x99, 0x48, 0x4b, 0x36, + 0x95, 0x96, 0x14, 0xd0, 0x5c, 0x1a, 0x28, 0xda, 0x85, 0x4d, 0x9a, 0x1b, 0x3a, 0x94, 0x59, 0x7e, + 0x38, 0x97, 0xc1, 0xc2, 0xfe, 0x09, 0x21, 0x34, 0x45, 0xed, 0x27, 0x51, 0x18, 0xcd, 0x38, 0x0c, + 0x57, 0x80, 0xd7, 0xdd, 0x18, 0x7d, 0x6b, 0x02, 0xd5, 0x73, 0xcf, 0xb6, 0x6c, 0x07, 0x07, 0xb6, + 0x63, 0x0d, 0x8c, 0x77, 0x95, 0x2a, 0xd5, 0x05, 0x99, 0x74, 0x17, 0xb4, 0x3f, 0x5a, 0x31, 0x62, + 0xdc, 0xd8, 0xb3, 0xce, 0x93, 0xf8, 0xef, 0x02, 0x40, 0x94, 0xc4, 0x51, 0x48, 0xe9, 0x6b, 0x12, + 0x3f, 0x60, 0x36, 0xae, 0x93, 0x9a, 0x02, 0x72, 0x62, 0x81, 0x8f, 0x82, 0x54, 0x67, 0x67, 0xd6, + 0x77, 0x76, 0x36, 0xd5, 0xd9, 0x07, 0x50, 0x27, 0x61, 0x40, 0x3c, 0x87, 0x0e, 0xba, 0xb8, 0xc5, + 0x79, 0x4a, 0x6b, 0xd1, 0x52, 0x67, 0xd1, 0xea, 0x7b, 0x20, 0x4f, 0x3d, 0xe3, 0xd9, 0xf7, 0x92, + 0xc6, 0x3c, 0xbf, 0x5b, 0x4c, 0x1f, 0x5b, 0xc6, 0xcc, 0x2d, 0xa4, 0x98, 0xab, 0x40, 0x31, 0x6a, + 0x6b, 0xce, 0xb0, 0x48, 0x4c, 0xdf, 0xcc, 0xa5, 0xa5, 0x9b, 0x39, 0x31, 0x46, 0xca, 0xdf, 0x60, + 0x8c, 0x3c, 0x83, 0x3c, 0x4b, 0x29, 0xeb, 0xf6, 0xca, 0xb3, 0xed, 0xb4, 0xf1, 0x52, 0x4d, 0xb5, + 0xdc, 0x94, 0x56, 0xf6, 0x08, 0x2a, 0xbc, 0xf6, 0xc4, 0xa4, 0x3b, 0x79, 0xe3, 0x3f, 0x5e, 0xda, + 0x79, 0x9b, 0xe2, 0x1a, 0x44, 0xbb, 0x46, 0x21, 0x7d, 0x2f, 0xb1, 0x4d, 0xd6, 0xee, 0x65, 0x2d, + 0x63, 0x9b, 0xe8, 0xc7, 0x50, 0x5d, 0x10, 0x4b, 0xb4, 0xdc, 0x9d, 0x55, 0xf0, 0x87, 0x6c, 0x4d, + 0xdb, 0x8a, 0x8c, 0xb9, 0xbc, 0x6e, 0x26, 0x6d, 0x7d, 0x8b, 0x99, 0x74, 0x04, 0xf5, 0xa9, 0xa1, + 0x0b, 0xaf, 0x7c, 0x3f, 0xbd, 0xe5, 0xab, 0xcc, 0x25, 0x4a, 0xbb, 0xa4, 0xb3, 0x49, 0xab, 0x4d, + 0x0d, 0xee, 0x5a, 0x8d, 0x8c, 0xa3, 0x4a, 0x4d, 0x3d, 0xdb, 0x20, 0x8a, 0xbc, 0xa8, 0xd4, 0x80, + 0xca, 0xb4, 0x41, 0x44, 0xfb, 0x29, 0x35, 0x5e, 0x79, 0xde, 0x79, 0x8b, 0x93, 0xd9, 0x7d, 0x19, + 0x9f, 0x8c, 0xde, 0x7d, 0x32, 0xb5, 0x8e, 0x4f, 0xde, 0x87, 0x9a, 0x70, 0xe0, 0xbf, 0xc4, 0x53, + 0x9d, 0xf5, 0xbc, 0x52, 0x67, 0xc7, 0x54, 0xf9, 0xc2, 0xf0, 0x25, 0x9e, 0xaa, 0x54, 0x1d, 0xa1, + 0x0c, 0xdc, 0x2f, 0x89, 0xa3, 0x34, 0x16, 0x28, 0x47, 0x54, 0x4e, 0x0c, 0xe1, 0xdf, 0x65, 0xa0, + 0xb2, 0xb8, 0x4b, 0x16, 0x25, 0x94, 0x16, 0x25, 0xfc, 0x01, 0x80, 0xcd, 0x6f, 0x64, 0xca, 0x8a, + 0x0c, 0x43, 0x7b, 0x37, 0x8d, 0x56, 0xdc, 0xd8, 0x5a, 0x59, 0x18, 0x8e, 0x42, 0xf4, 0x24, 0x22, + 0x60, 0x76, 0x37, 0xbb, 0x26, 0x3c, 0xce, 0xba, 0x1f, 0x41, 0x65, 0xc1, 0x90, 0x20, 0x54, 0x72, + 0xcc, 0x5c, 0x59, 0xcd, 0xba, 0x51, 0xa8, 0x81, 0x1b, 0xcf, 0x87, 0x9f, 0x42, 0x7c, 0xe5, 0x45, + 0xec, 0xca, 0x33, 0x76, 0xed, 0xac, 0xb9, 0x2a, 0x47, 0xa1, 0x20, 0x5a, 0x75, 0xb1, 0x91, 0x2b, + 0xda, 0x1f, 0x26, 0xa7, 0xfb, 0xbd, 0x55, 0xef, 0x41, 0x41, 0xd8, 0xfa, 0x43, 0x16, 0xee, 0x88, + 0x58, 0xcf, 0x88, 0x85, 0x8d, 0x9b, 0xff, 0x93, 0x77, 0x94, 0xf6, 0xf2, 0x3b, 0xca, 0xe3, 0x95, + 0xf5, 0xe5, 0x33, 0x86, 0x47, 0xfe, 0xbf, 0x7f, 0x61, 0x69, 0x37, 0x5f, 0xbd, 0xde, 0x91, 0xa2, + 0x92, 0xd5, 0xe2, 0x92, 0x09, 0x12, 0xb6, 0xfe, 0x2c, 0x81, 0x1c, 0x33, 0x47, 0x14, 0xec, 0xbf, + 0xba, 0x53, 0xd6, 0x96, 0x2e, 0x55, 0xa2, 0xec, 0xfa, 0x12, 0xe5, 0xde, 0x51, 0xa2, 0xfc, 0x52, + 0x89, 0xda, 0xad, 0x64, 0x3c, 0x77, 0x57, 0xdc, 0xcc, 0x41, 0xd8, 0xfa, 0x7d, 0x06, 0x6a, 0x09, + 0x36, 0x8b, 0xa0, 0xda, 0xa9, 0x16, 0x95, 0x58, 0xf2, 0x1f, 0xad, 0x2c, 0xa1, 0x28, 0xde, 0xaa, + 0x46, 0xcd, 0xbc, 0xa7, 0x51, 0x7f, 0x92, 0x6e, 0xd4, 0xec, 0xaa, 0x12, 0x2f, 0xa7, 0xfb, 0xbd, + 0xed, 0x9a, 0xfb, 0x16, 0xed, 0x2a, 0xbd, 0xa7, 0x5d, 0xf7, 0x4f, 0x41, 0x5e, 0xfe, 0x07, 0x11, + 0xdd, 0x03, 0xe4, 0xdb, 0x96, 0x43, 0xcc, 0xe4, 0x8a, 0xbc, 0x81, 0x1e, 0xc1, 0xfd, 0x59, 0x7c, + 0x6c, 0x6a, 0x51, 0xda, 0xff, 0x55, 0x3a, 0xeb, 0xe2, 0x72, 0xfa, 0x10, 0x76, 0xc6, 0xfd, 0xde, + 0x85, 0xaa, 0x0d, 0x3b, 0x67, 0xfa, 0xe8, 0xb9, 0x3e, 0x1c, 0x75, 0x46, 0xe3, 0xa1, 0x3e, 0xee, + 0x0f, 0x07, 0x6a, 0xb7, 0x77, 0xd2, 0x53, 0x8f, 0xe5, 0x0d, 0x54, 0x87, 0x6a, 0xaf, 0x7f, 0x74, + 0x3e, 0xee, 0x1f, 0xeb, 0xc3, 0x71, 0xb7, 0xab, 0x0e, 0x87, 0xb2, 0x84, 0xb6, 0xe1, 0xc1, 0x40, + 0xed, 0x1f, 0xf7, 0xfa, 0xa7, 0x7a, 0xb4, 0xa8, 0x3e, 0x57, 0xbb, 0xe3, 0x51, 0xef, 0xbc, 0x2f, + 0x67, 0xd0, 0x7d, 0xa8, 0x0f, 0xba, 0x42, 0xa3, 0xc6, 0xfb, 0xb2, 0x14, 0x7c, 0x72, 0xe1, 0xa4, + 0xd3, 0x3b, 0x53, 0x8f, 0xe5, 0x1c, 0xba, 0x0b, 0xb5, 0x41, 0x57, 0x8f, 0x5c, 0x6a, 0xea, 0x85, + 0xaa, 0x8d, 0xe4, 0x3c, 0x6a, 0x80, 0x7c, 0x3e, 0x1e, 0x71, 0xff, 0x62, 0x51, 0x2e, 0xa4, 0xb4, + 0x91, 0xeb, 0x22, 0xc5, 0xb9, 0xd0, 0x0a, 0xbf, 0x25, 0xb4, 0x09, 0xa5, 0x6e, 0xa7, 0xdf, 0x55, + 0xa9, 0x54, 0xde, 0x3f, 0x82, 0x82, 0x88, 0xbc, 0x0a, 0x95, 0x74, 0x94, 0x15, 0x28, 0x46, 0x07, + 0x48, 0x74, 0xd7, 0xf9, 0xd1, 0x50, 0xd5, 0x2e, 0xd4, 0x63, 0x39, 0x43, 0x25, 0x0e, 0x48, 0x3d, + 0x96, 0xb3, 0xfb, 0xbf, 0x84, 0x02, 0x9f, 0x22, 0x08, 0xc1, 0x56, 0xc2, 0x87, 0x3e, 0x7a, 0x2e, + 0x6f, 0xa0, 0x22, 0x64, 0x4f, 0x3b, 0x34, 0x41, 0x75, 0xa8, 0x9e, 0x76, 0x86, 0x7a, 0x87, 0x02, + 0xef, 0x7c, 0x71, 0x76, 0xde, 0xa1, 0x9e, 0xca, 0x90, 0x3f, 0x19, 0xf7, 0x8f, 0x69, 0x22, 0xee, + 0x42, 0x8d, 0x3d, 0xa6, 0x2c, 0x72, 0x0c, 0x86, 0x10, 0xf2, 0xf4, 0x80, 0x28, 0xb9, 0x22, 0x23, + 0x85, 0xfd, 0x3f, 0x49, 0x50, 0x5f, 0x31, 0xcc, 0xd0, 0x63, 0xd8, 0x8e, 0x6c, 0xcf, 0xd4, 0xd3, + 0x4e, 0xf7, 0x0b, 0xfd, 0x16, 0xb6, 0x7b, 0x80, 0x96, 0x4c, 0x38, 0x54, 0x05, 0x1a, 0x4b, 0x7a, + 0x0e, 0x32, 0x83, 0x3e, 0x82, 0xdd, 0x55, 0x2b, 0x29, 0xcc, 0x59, 0xd4, 0x82, 0xe6, 0x6d, 0xbf, + 0xe9, 0xb8, 0x8e, 0x06, 0x5f, 0xbd, 0x69, 0x4a, 0x5f, 0xbf, 0x69, 0x4a, 0x7f, 0x7f, 0xd3, 0x94, + 0x7e, 0xfb, 0xb6, 0xb9, 0xf1, 0xf5, 0xdb, 0xe6, 0xc6, 0x5f, 0xdf, 0x36, 0x37, 0x7e, 0xf1, 0xa9, + 0x65, 0x07, 0x57, 0xb3, 0xcb, 0x03, 0xc3, 0x9d, 0x1c, 0x4e, 0x67, 0xfe, 0x15, 0x9b, 0x67, 0xec, + 0xe9, 0x29, 0x7b, 0x7c, 0xea, 0xb8, 0x26, 0x39, 0x0c, 0x0f, 0xe3, 0x0e, 0x61, 0x5f, 0xb6, 0x2e, + 0x0b, 0xec, 0x1b, 0xd5, 0xf7, 0xff, 0x13, 0x00, 0x00, 0xff, 0xff, 0xd2, 0xba, 0xeb, 0xd8, 0xf6, + 0x12, 0x00, 0x00, } func (this *Params) Equal(that interface{}) bool { @@ -1781,6 +1818,9 @@ func (this *OutboundObservation) Equal(that interface{}) bool { if this.ErrorMsg != that1.ErrorMsg { return false } + if this.GasFeeUsed != that1.GasFeeUsed { + return false + } return true } func (this *OriginatingPcTx) Equal(that interface{}) bool { @@ -1880,6 +1920,15 @@ func (this *OutboundTx) Equal(that interface{}) bool { if this.GasFee != that1.GasFee { return false } + if !this.PcRefundExecution.Equal(that1.PcRefundExecution) { + return false + } + if this.RefundSwapError != that1.RefundSwapError { + return false + } + if this.GasToken != that1.GasToken { + return false + } return true } func (this *UniversalTx) Equal(that interface{}) bool { @@ -2487,6 +2536,13 @@ func (m *OutboundObservation) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if len(m.GasFeeUsed) > 0 { + i -= len(m.GasFeeUsed) + copy(dAtA[i:], m.GasFeeUsed) + i = encodeVarintTypes(dAtA, i, uint64(len(m.GasFeeUsed))) + i-- + dAtA[i] = 0x2a + } if len(m.ErrorMsg) > 0 { i -= len(m.ErrorMsg) copy(dAtA[i:], m.ErrorMsg) @@ -2576,6 +2632,38 @@ func (m *OutboundTx) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if len(m.GasToken) > 0 { + i -= len(m.GasToken) + copy(dAtA[i:], m.GasToken) + i = encodeVarintTypes(dAtA, i, uint64(len(m.GasToken))) + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0xa2 + } + if len(m.RefundSwapError) > 0 { + i -= len(m.RefundSwapError) + copy(dAtA[i:], m.RefundSwapError) + i = encodeVarintTypes(dAtA, i, uint64(len(m.RefundSwapError))) + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0x9a + } + if m.PcRefundExecution != nil { + { + size, err := m.PcRefundExecution.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0x92 + } if len(m.GasFee) > 0 { i -= len(m.GasFee) copy(dAtA[i:], m.GasFee) @@ -3241,6 +3329,10 @@ func (m *OutboundObservation) Size() (n int) { if l > 0 { n += 1 + l + sovTypes(uint64(l)) } + l = len(m.GasFeeUsed) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } return n } @@ -3333,6 +3425,18 @@ func (m *OutboundTx) Size() (n int) { if l > 0 { n += 2 + l + sovTypes(uint64(l)) } + if m.PcRefundExecution != nil { + l = m.PcRefundExecution.Size() + n += 2 + l + sovTypes(uint64(l)) + } + l = len(m.RefundSwapError) + if l > 0 { + n += 2 + l + sovTypes(uint64(l)) + } + l = len(m.GasToken) + if l > 0 { + n += 2 + l + sovTypes(uint64(l)) + } return n } @@ -5011,6 +5115,38 @@ func (m *OutboundObservation) Unmarshal(dAtA []byte) error { } m.ErrorMsg = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field GasFeeUsed", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + 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 ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.GasFeeUsed = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) @@ -5709,6 +5845,106 @@ func (m *OutboundTx) Unmarshal(dAtA []byte) error { } m.GasFee = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 18: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PcRefundExecution", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.PcRefundExecution == nil { + m.PcRefundExecution = &PCTx{} + } + if err := m.PcRefundExecution.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 19: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RefundSwapError", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + 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 ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.RefundSwapError = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 20: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field GasToken", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + 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 ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.GasToken = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:])