diff --git a/CHANGELOG.md b/CHANGELOG.md index b837f2dbd8..b047b46e27 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -31,6 +31,7 @@ - [\#815](https://github.com/cosmos/evm/pull/815) Support for multi gRPC query clients serve with old binary. - [\#1082](https://github.com/cosmos/evm/pull/1082) Enable incarnation cache for verify result. - [\#1096](https://github.com/cosmos/evm/pull/1096) Allow eth_call overrides work with static precompiles. +- [\#1181](https://github.com/cosmos/evm/pull/1181) Support state overrides in `debug_traceCall`. ### BUG FIXES diff --git a/api/cosmos/evm/erc20/v1/query_grpc.pb.go b/api/cosmos/evm/erc20/v1/query_grpc.pb.go index f951212192..ad75814be4 100644 --- a/api/cosmos/evm/erc20/v1/query_grpc.pb.go +++ b/api/cosmos/evm/erc20/v1/query_grpc.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: -// - protoc-gen-go-grpc v1.6.0 +// - protoc-gen-go-grpc v1.6.1 // - protoc (unknown) // source: cosmos/evm/erc20/v1/query.proto diff --git a/api/cosmos/evm/erc20/v1/tx_grpc.pb.go b/api/cosmos/evm/erc20/v1/tx_grpc.pb.go index bb7434588f..404564401b 100644 --- a/api/cosmos/evm/erc20/v1/tx_grpc.pb.go +++ b/api/cosmos/evm/erc20/v1/tx_grpc.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: -// - protoc-gen-go-grpc v1.6.0 +// - protoc-gen-go-grpc v1.6.1 // - protoc (unknown) // source: cosmos/evm/erc20/v1/tx.proto diff --git a/api/cosmos/evm/feemarket/v1/query_grpc.pb.go b/api/cosmos/evm/feemarket/v1/query_grpc.pb.go index d395a7518d..f7fdd223fd 100644 --- a/api/cosmos/evm/feemarket/v1/query_grpc.pb.go +++ b/api/cosmos/evm/feemarket/v1/query_grpc.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: -// - protoc-gen-go-grpc v1.6.0 +// - protoc-gen-go-grpc v1.6.1 // - protoc (unknown) // source: cosmos/evm/feemarket/v1/query.proto diff --git a/api/cosmos/evm/feemarket/v1/tx_grpc.pb.go b/api/cosmos/evm/feemarket/v1/tx_grpc.pb.go index 8596271909..f34196af40 100644 --- a/api/cosmos/evm/feemarket/v1/tx_grpc.pb.go +++ b/api/cosmos/evm/feemarket/v1/tx_grpc.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: -// - protoc-gen-go-grpc v1.6.0 +// - protoc-gen-go-grpc v1.6.1 // - protoc (unknown) // source: cosmos/evm/feemarket/v1/tx.proto diff --git a/api/cosmos/evm/vm/v1/evm.pulsar.go b/api/cosmos/evm/vm/v1/evm.pulsar.go index 2839bba4e4..2c95b83908 100644 --- a/api/cosmos/evm/vm/v1/evm.pulsar.go +++ b/api/cosmos/evm/vm/v1/evm.pulsar.go @@ -9928,9 +9928,12 @@ type Params struct { AccessControl *AccessControl `protobuf:"bytes,8,opt,name=access_control,json=accessControl,proto3" json:"access_control,omitempty"` // active_static_precompiles defines the slice of hex addresses of the // precompiled contracts that are active - ActiveStaticPrecompiles []string `protobuf:"bytes,9,rep,name=active_static_precompiles,json=activeStaticPrecompiles,proto3" json:"active_static_precompiles,omitempty"` - HistoryServeWindow uint64 `protobuf:"varint,10,opt,name=history_serve_window,json=historyServeWindow,proto3" json:"history_serve_window,omitempty"` - ExtendedDenomOptions *ExtendedDenomOptions `protobuf:"bytes,11,opt,name=extended_denom_options,json=extendedDenomOptions,proto3" json:"extended_denom_options,omitempty"` + ActiveStaticPrecompiles []string `protobuf:"bytes,9,rep,name=active_static_precompiles,json=activeStaticPrecompiles,proto3" json:"active_static_precompiles,omitempty"` + // history_serve_window defines the block range for serving historical EVM + // state + HistoryServeWindow uint64 `protobuf:"varint,10,opt,name=history_serve_window,json=historyServeWindow,proto3" json:"history_serve_window,omitempty"` + // extended_denom_options defines the extended denom options for the EVM + ExtendedDenomOptions *ExtendedDenomOptions `protobuf:"bytes,11,opt,name=extended_denom_options,json=extendedDenomOptions,proto3" json:"extended_denom_options,omitempty"` } func (x *Params) Reset() { @@ -10002,11 +10005,13 @@ func (x *Params) GetExtendedDenomOptions() *ExtendedDenomOptions { return nil } +// ExtendedDenomOptions defines the extended denom options for the EVM type ExtendedDenomOptions struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields + // extended_denom defines the extended denom used by the EVM ExtendedDenom string `protobuf:"bytes,1,opt,name=extended_denom,json=extendedDenom,proto3" json:"extended_denom,omitempty"` } @@ -10925,16 +10930,20 @@ func (x *Preinstall) GetCode() string { return "" } +// EvmCoinInfo defines the EVM coin denomination metadata type EvmCoinInfo struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Denom string `protobuf:"bytes,1,opt,name=denom,proto3" json:"denom,omitempty"` + // denom defines the base coin denomination + Denom string `protobuf:"bytes,1,opt,name=denom,proto3" json:"denom,omitempty"` + // extended_denom defines the extended EVM coin denomination ExtendedDenom string `protobuf:"bytes,2,opt,name=extended_denom,json=extendedDenom,proto3" json:"extended_denom,omitempty"` - DisplayDenom string `protobuf:"bytes,3,opt,name=display_denom,json=displayDenom,proto3" json:"display_denom,omitempty"` - // decimals is now deprecated and will be removed in a future release. When it is removed we will assume - // the evm token denom is 18 decimal precision. + // display_denom defines the display denomination + DisplayDenom string `protobuf:"bytes,3,opt,name=display_denom,json=displayDenom,proto3" json:"display_denom,omitempty"` + // decimals is now deprecated and will be removed in a future release. When it + // is removed we will assume the evm token denom is 18 decimal precision. // // Deprecated: Do not use. Decimals uint32 `protobuf:"varint,4,opt,name=decimals,proto3" json:"decimals,omitempty"` diff --git a/api/cosmos/evm/vm/v1/query.pulsar.go b/api/cosmos/evm/vm/v1/query.pulsar.go index 470635d479..202c116e20 100644 --- a/api/cosmos/evm/vm/v1/query.pulsar.go +++ b/api/cosmos/evm/vm/v1/query.pulsar.go @@ -12050,6 +12050,7 @@ var ( fd_QueryTraceCallRequest_block_hash protoreflect.FieldDescriptor fd_QueryTraceCallRequest_block_time protoreflect.FieldDescriptor fd_QueryTraceCallRequest_chain_id protoreflect.FieldDescriptor + fd_QueryTraceCallRequest_overrides protoreflect.FieldDescriptor ) func init() { @@ -12063,6 +12064,7 @@ func init() { fd_QueryTraceCallRequest_block_hash = md_QueryTraceCallRequest.Fields().ByName("block_hash") fd_QueryTraceCallRequest_block_time = md_QueryTraceCallRequest.Fields().ByName("block_time") fd_QueryTraceCallRequest_chain_id = md_QueryTraceCallRequest.Fields().ByName("chain_id") + fd_QueryTraceCallRequest_overrides = md_QueryTraceCallRequest.Fields().ByName("overrides") } var _ protoreflect.Message = (*fastReflection_QueryTraceCallRequest)(nil) @@ -12178,6 +12180,12 @@ func (x *fastReflection_QueryTraceCallRequest) Range(f func(protoreflect.FieldDe return } } + if len(x.Overrides) != 0 { + value := protoreflect.ValueOfBytes(x.Overrides) + if !f(fd_QueryTraceCallRequest_overrides, value) { + return + } + } } // Has reports whether a field is populated. @@ -12209,6 +12217,8 @@ func (x *fastReflection_QueryTraceCallRequest) Has(fd protoreflect.FieldDescript return x.BlockTime != nil case "cosmos.evm.vm.v1.QueryTraceCallRequest.chain_id": return x.ChainId != int64(0) + case "cosmos.evm.vm.v1.QueryTraceCallRequest.overrides": + return len(x.Overrides) != 0 default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.evm.vm.v1.QueryTraceCallRequest")) @@ -12241,6 +12251,8 @@ func (x *fastReflection_QueryTraceCallRequest) Clear(fd protoreflect.FieldDescri x.BlockTime = nil case "cosmos.evm.vm.v1.QueryTraceCallRequest.chain_id": x.ChainId = int64(0) + case "cosmos.evm.vm.v1.QueryTraceCallRequest.overrides": + x.Overrides = nil default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.evm.vm.v1.QueryTraceCallRequest")) @@ -12281,6 +12293,9 @@ func (x *fastReflection_QueryTraceCallRequest) Get(descriptor protoreflect.Field case "cosmos.evm.vm.v1.QueryTraceCallRequest.chain_id": value := x.ChainId return protoreflect.ValueOfInt64(value) + case "cosmos.evm.vm.v1.QueryTraceCallRequest.overrides": + value := x.Overrides + return protoreflect.ValueOfBytes(value) default: if descriptor.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.evm.vm.v1.QueryTraceCallRequest")) @@ -12317,6 +12332,8 @@ func (x *fastReflection_QueryTraceCallRequest) Set(fd protoreflect.FieldDescript x.BlockTime = value.Message().Interface().(*timestamppb.Timestamp) case "cosmos.evm.vm.v1.QueryTraceCallRequest.chain_id": x.ChainId = value.Int() + case "cosmos.evm.vm.v1.QueryTraceCallRequest.overrides": + x.Overrides = value.Bytes() default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.evm.vm.v1.QueryTraceCallRequest")) @@ -12359,6 +12376,8 @@ func (x *fastReflection_QueryTraceCallRequest) Mutable(fd protoreflect.FieldDesc panic(fmt.Errorf("field block_hash of message cosmos.evm.vm.v1.QueryTraceCallRequest is not mutable")) case "cosmos.evm.vm.v1.QueryTraceCallRequest.chain_id": panic(fmt.Errorf("field chain_id of message cosmos.evm.vm.v1.QueryTraceCallRequest is not mutable")) + case "cosmos.evm.vm.v1.QueryTraceCallRequest.overrides": + panic(fmt.Errorf("field overrides of message cosmos.evm.vm.v1.QueryTraceCallRequest is not mutable")) default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.evm.vm.v1.QueryTraceCallRequest")) @@ -12390,6 +12409,8 @@ func (x *fastReflection_QueryTraceCallRequest) NewField(fd protoreflect.FieldDes return protoreflect.ValueOfMessage(m.ProtoReflect()) case "cosmos.evm.vm.v1.QueryTraceCallRequest.chain_id": return protoreflect.ValueOfInt64(int64(0)) + case "cosmos.evm.vm.v1.QueryTraceCallRequest.overrides": + return protoreflect.ValueOfBytes(nil) default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.evm.vm.v1.QueryTraceCallRequest")) @@ -12488,6 +12509,10 @@ func (x *fastReflection_QueryTraceCallRequest) ProtoMethods() *protoiface.Method if x.ChainId != 0 { n += 1 + runtime.Sov(uint64(x.ChainId)) } + l = len(x.Overrides) + if l > 0 { + n += 1 + l + runtime.Sov(uint64(l)) + } if x.unknownFields != nil { n += len(x.unknownFields) } @@ -12517,6 +12542,13 @@ func (x *fastReflection_QueryTraceCallRequest) ProtoMethods() *protoiface.Method i -= len(x.unknownFields) copy(dAtA[i:], x.unknownFields) } + if len(x.Overrides) > 0 { + i -= len(x.Overrides) + copy(dAtA[i:], x.Overrides) + i = runtime.EncodeVarint(dAtA, i, uint64(len(x.Overrides))) + i-- + dAtA[i] = 0x4a + } if x.ChainId != 0 { i = runtime.EncodeVarint(dAtA, i, uint64(x.ChainId)) i-- @@ -12859,6 +12891,40 @@ func (x *fastReflection_QueryTraceCallRequest) ProtoMethods() *protoiface.Method break } } + case 9: + if wireType != 2 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field Overrides", wireType) + } + var byteLen 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++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + postIndex := iNdEx + byteLen + 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.Overrides = append(x.Overrides[:0], dAtA[iNdEx:postIndex]...) + if x.Overrides == nil { + x.Overrides = []byte{} + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := runtime.Skip(dAtA[iNdEx:]) @@ -15628,7 +15694,7 @@ type EthCallRequest struct { ProposerAddress []byte `protobuf:"bytes,3,opt,name=proposer_address,json=proposerAddress,proto3" json:"proposer_address,omitempty"` // chain_id is the eip155 chain id parsed from the requested block header ChainId int64 `protobuf:"varint,4,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` - // state overrides encoded as json + // overrides contains state overrides encoded as json Overrides []byte `protobuf:"bytes,5,opt,name=overrides,proto3" json:"overrides,omitempty"` } @@ -16049,6 +16115,8 @@ type QueryTraceCallRequest struct { BlockTime *timestamppb.Timestamp `protobuf:"bytes,7,opt,name=block_time,json=blockTime,proto3" json:"block_time,omitempty"` // chain_id is the the eip155 chain id parsed from the requested block header ChainId int64 `protobuf:"varint,8,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` + // overrides contains state overrides in JSON format + Overrides []byte `protobuf:"bytes,9,opt,name=overrides,proto3" json:"overrides,omitempty"` } func (x *QueryTraceCallRequest) Reset() { @@ -16127,6 +16195,13 @@ func (x *QueryTraceCallRequest) GetChainId() int64 { return 0 } +func (x *QueryTraceCallRequest) GetOverrides() []byte { + if x != nil { + return x.Overrides + } + return nil +} + // QueryTraceCallResponse defines TraceCall response type QueryTraceCallResponse struct { state protoimpl.MessageState @@ -16483,7 +16558,7 @@ var file_cosmos_evm_vm_v1_query_proto_rawDesc = []byte{ 0x28, 0x03, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4d, 0x61, 0x78, 0x47, 0x61, 0x73, 0x22, 0x2d, 0x0a, 0x17, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x63, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, - 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x87, + 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0xa5, 0x03, 0x0a, 0x15, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x63, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x72, 0x67, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x61, 0x72, 0x67, 0x73, 0x12, 0x17, 0x0a, 0x07, @@ -16508,165 +16583,167 @@ var file_cosmos_evm_vm_v1_query_proto_rawDesc = []byte{ 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x08, 0xc8, 0xde, 0x1f, 0x00, 0x90, 0xdf, 0x1f, 0x01, 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x07, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x22, 0x2c, 0x0a, 0x16, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x54, 0x72, 0x61, 0x63, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x15, 0x0a, 0x13, 0x51, 0x75, 0x65, 0x72, 0x79, 0x42, - 0x61, 0x73, 0x65, 0x46, 0x65, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x4c, 0x0a, - 0x14, 0x51, 0x75, 0x65, 0x72, 0x79, 0x42, 0x61, 0x73, 0x65, 0x46, 0x65, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, 0x08, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x66, 0x65, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x19, 0xda, 0xde, 0x1f, 0x15, 0x63, 0x6f, 0x73, + 0x07, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6f, 0x76, 0x65, 0x72, + 0x72, 0x69, 0x64, 0x65, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x6f, 0x76, 0x65, + 0x72, 0x72, 0x69, 0x64, 0x65, 0x73, 0x22, 0x2c, 0x0a, 0x16, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, + 0x72, 0x61, 0x63, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, + 0x64, 0x61, 0x74, 0x61, 0x22, 0x15, 0x0a, 0x13, 0x51, 0x75, 0x65, 0x72, 0x79, 0x42, 0x61, 0x73, + 0x65, 0x46, 0x65, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x4c, 0x0a, 0x14, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x42, 0x61, 0x73, 0x65, 0x46, 0x65, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, 0x08, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x66, 0x65, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x19, 0xda, 0xde, 0x1f, 0x15, 0x63, 0x6f, 0x73, 0x6d, 0x6f, + 0x73, 0x73, 0x64, 0x6b, 0x2e, 0x69, 0x6f, 0x2f, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x49, 0x6e, 0x74, + 0x52, 0x07, 0x62, 0x61, 0x73, 0x65, 0x46, 0x65, 0x65, 0x22, 0x1f, 0x0a, 0x1d, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x4d, 0x69, 0x6e, 0x47, 0x61, 0x73, 0x50, 0x72, + 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x63, 0x0a, 0x1e, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x4d, 0x69, 0x6e, 0x47, 0x61, 0x73, 0x50, + 0x72, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x41, 0x0a, 0x0d, + 0x6d, 0x69, 0x6e, 0x5f, 0x67, 0x61, 0x73, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x1d, 0xc8, 0xde, 0x1f, 0x00, 0xda, 0xde, 0x1f, 0x15, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x73, 0x64, 0x6b, 0x2e, 0x69, 0x6f, 0x2f, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x49, - 0x6e, 0x74, 0x52, 0x07, 0x62, 0x61, 0x73, 0x65, 0x46, 0x65, 0x65, 0x22, 0x1f, 0x0a, 0x1d, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x4d, 0x69, 0x6e, 0x47, 0x61, 0x73, - 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x63, 0x0a, 0x1e, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x4d, 0x69, 0x6e, 0x47, 0x61, - 0x73, 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x41, - 0x0a, 0x0d, 0x6d, 0x69, 0x6e, 0x5f, 0x67, 0x61, 0x73, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x1d, 0xc8, 0xde, 0x1f, 0x00, 0xda, 0xde, 0x1f, 0x15, 0x63, - 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x73, 0x64, 0x6b, 0x2e, 0x69, 0x6f, 0x2f, 0x6d, 0x61, 0x74, 0x68, - 0x2e, 0x49, 0x6e, 0x74, 0x52, 0x0b, 0x6d, 0x69, 0x6e, 0x47, 0x61, 0x73, 0x50, 0x72, 0x69, 0x63, - 0x65, 0x32, 0x91, 0x10, 0x0a, 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x85, 0x01, 0x0a, 0x07, - 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x25, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, + 0x6e, 0x74, 0x52, 0x0b, 0x6d, 0x69, 0x6e, 0x47, 0x61, 0x73, 0x50, 0x72, 0x69, 0x63, 0x65, 0x32, + 0x91, 0x10, 0x0a, 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x85, 0x01, 0x0a, 0x07, 0x41, 0x63, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x25, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, + 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x63, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x63, + 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x12, 0x23, 0x2f, 0x63, + 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x65, 0x76, 0x6d, 0x2f, 0x76, 0x6d, 0x2f, 0x76, 0x31, 0x2f, + 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x7b, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x7d, 0x12, 0x9e, 0x01, 0x0a, 0x0d, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x41, 0x63, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x12, 0x2b, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, + 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x73, 0x6d, + 0x6f, 0x73, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x2c, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, + 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x41, + 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x32, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2c, 0x12, 0x2a, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, + 0x65, 0x76, 0x6d, 0x2f, 0x76, 0x6d, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, + 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x7b, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x7d, 0x12, 0xaf, 0x01, 0x0a, 0x10, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, + 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2e, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, - 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, - 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x12, 0x23, - 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x65, 0x76, 0x6d, 0x2f, 0x76, 0x6d, 0x2f, 0x76, - 0x31, 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x7b, 0x61, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x7d, 0x12, 0x9e, 0x01, 0x0a, 0x0d, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x41, 0x63, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2b, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, - 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6f, - 0x73, 0x6d, 0x6f, 0x73, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, - 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x73, 0x6d, 0x6f, - 0x73, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x32, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2c, 0x12, 0x2a, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, - 0x73, 0x2f, 0x65, 0x76, 0x6d, 0x2f, 0x76, 0x6d, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x73, 0x6d, - 0x6f, 0x73, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x7b, 0x61, 0x64, 0x64, 0x72, - 0x65, 0x73, 0x73, 0x7d, 0x12, 0xaf, 0x01, 0x0a, 0x10, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x6f, 0x72, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2e, 0x2e, 0x63, 0x6f, 0x73, 0x6d, - 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x41, 0x63, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x63, 0x6f, 0x73, 0x6d, - 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x41, 0x63, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3a, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x34, 0x12, 0x32, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x65, 0x76, 0x6d, 0x2f, - 0x76, 0x6d, 0x2f, 0x76, 0x31, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, - 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x5f, 0x61, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x7d, 0x12, 0x86, 0x01, 0x0a, 0x07, 0x42, 0x61, 0x6c, 0x61, 0x6e, - 0x63, 0x65, 0x12, 0x25, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, - 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x42, 0x61, 0x6c, 0x61, 0x6e, - 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x63, 0x6f, 0x73, 0x6d, - 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x26, 0x12, 0x24, 0x2f, 0x63, 0x6f, 0x73, 0x6d, - 0x6f, 0x73, 0x2f, 0x65, 0x76, 0x6d, 0x2f, 0x76, 0x6d, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x61, 0x6c, - 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x7d, 0x12, - 0x8b, 0x01, 0x0a, 0x07, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x12, 0x25, 0x2e, 0x63, 0x6f, - 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, - 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x74, 0x6f, 0x72, 0x61, - 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x31, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x2b, 0x12, 0x29, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x65, 0x76, 0x6d, 0x2f, - 0x76, 0x6d, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2f, 0x7b, 0x61, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x7d, 0x2f, 0x7b, 0x6b, 0x65, 0x79, 0x7d, 0x12, 0x7a, 0x0a, - 0x04, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x22, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, - 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6f, - 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x63, 0x6f, 0x73, 0x6d, - 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x12, 0x21, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, - 0x65, 0x76, 0x6d, 0x2f, 0x76, 0x6d, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x73, 0x2f, - 0x7b, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x7d, 0x12, 0x77, 0x0a, 0x06, 0x50, 0x61, 0x72, - 0x61, 0x6d, 0x73, 0x12, 0x24, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, - 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, 0x72, 0x61, - 0x6d, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x63, 0x6f, 0x73, 0x6d, + 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, + 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x34, + 0x12, 0x32, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x65, 0x76, 0x6d, 0x2f, 0x76, 0x6d, + 0x2f, 0x76, 0x31, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x61, 0x63, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x5f, 0x61, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x7d, 0x12, 0x86, 0x01, 0x0a, 0x07, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, + 0x12, 0x25, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, + 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, + 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x26, 0x12, 0x24, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, + 0x2f, 0x65, 0x76, 0x6d, 0x2f, 0x76, 0x6d, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x61, 0x6c, 0x61, 0x6e, + 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x7d, 0x12, 0x8b, 0x01, + 0x0a, 0x07, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x12, 0x25, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x12, 0x18, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, - 0x73, 0x2f, 0x65, 0x76, 0x6d, 0x2f, 0x76, 0x6d, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x61, 0x72, 0x61, - 0x6d, 0x73, 0x12, 0x78, 0x0a, 0x07, 0x45, 0x74, 0x68, 0x43, 0x61, 0x6c, 0x6c, 0x12, 0x20, 0x2e, - 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, - 0x2e, 0x45, 0x74, 0x68, 0x43, 0x61, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x27, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, - 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x54, 0x78, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, - 0x12, 0x1a, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x65, 0x76, 0x6d, 0x2f, 0x76, 0x6d, - 0x2f, 0x76, 0x31, 0x2f, 0x65, 0x74, 0x68, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x12, 0x7e, 0x0a, 0x0b, - 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x47, 0x61, 0x73, 0x12, 0x20, 0x2e, 0x63, 0x6f, + 0x72, 0x79, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x26, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, + 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x31, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2b, + 0x12, 0x29, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x65, 0x76, 0x6d, 0x2f, 0x76, 0x6d, + 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2f, 0x7b, 0x61, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x7d, 0x2f, 0x7b, 0x6b, 0x65, 0x79, 0x7d, 0x12, 0x7a, 0x0a, 0x04, 0x43, + 0x6f, 0x64, 0x65, 0x12, 0x22, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, + 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x64, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, + 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x43, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x23, 0x12, 0x21, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x65, 0x76, + 0x6d, 0x2f, 0x76, 0x6d, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x73, 0x2f, 0x7b, 0x61, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x7d, 0x12, 0x77, 0x0a, 0x06, 0x50, 0x61, 0x72, 0x61, 0x6d, + 0x73, 0x12, 0x24, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, + 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, + 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x20, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x12, 0x18, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, + 0x65, 0x76, 0x6d, 0x2f, 0x76, 0x6d, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, + 0x12, 0x78, 0x0a, 0x07, 0x45, 0x74, 0x68, 0x43, 0x61, 0x6c, 0x6c, 0x12, 0x20, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x45, - 0x74, 0x68, 0x43, 0x61, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, + 0x74, 0x68, 0x43, 0x61, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, - 0x2e, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x47, 0x61, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x12, 0x1e, 0x2f, 0x63, - 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x65, 0x76, 0x6d, 0x2f, 0x76, 0x6d, 0x2f, 0x76, 0x31, 0x2f, - 0x65, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x5f, 0x67, 0x61, 0x73, 0x12, 0x7c, 0x0a, 0x07, - 0x54, 0x72, 0x61, 0x63, 0x65, 0x54, 0x78, 0x12, 0x25, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, - 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x54, 0x72, 0x61, 0x63, 0x65, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, - 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, - 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x63, 0x65, 0x54, 0x78, 0x52, 0x65, + 0x2e, 0x4d, 0x73, 0x67, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x54, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, 0x12, 0x1a, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x65, 0x76, 0x6d, 0x2f, 0x76, 0x6d, 0x2f, 0x76, - 0x31, 0x2f, 0x74, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x74, 0x78, 0x12, 0x88, 0x01, 0x0a, 0x0a, 0x54, - 0x72, 0x61, 0x63, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x28, 0x2e, 0x63, 0x6f, 0x73, 0x6d, - 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x54, 0x72, 0x61, 0x63, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, - 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x63, - 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x25, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1f, 0x12, 0x1d, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, - 0x65, 0x76, 0x6d, 0x2f, 0x76, 0x6d, 0x2f, 0x76, 0x31, 0x2f, 0x74, 0x72, 0x61, 0x63, 0x65, 0x5f, - 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x84, 0x01, 0x0a, 0x09, 0x54, 0x72, 0x61, 0x63, 0x65, 0x43, - 0x61, 0x6c, 0x6c, 0x12, 0x27, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, - 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x63, - 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x63, + 0x31, 0x2f, 0x65, 0x74, 0x68, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x12, 0x7e, 0x0a, 0x0b, 0x45, 0x73, + 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x47, 0x61, 0x73, 0x12, 0x20, 0x2e, 0x63, 0x6f, 0x73, 0x6d, + 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x74, 0x68, + 0x43, 0x61, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x63, 0x6f, + 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x45, + 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x47, 0x61, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x12, 0x1e, 0x2f, 0x63, 0x6f, 0x73, + 0x6d, 0x6f, 0x73, 0x2f, 0x65, 0x76, 0x6d, 0x2f, 0x76, 0x6d, 0x2f, 0x76, 0x31, 0x2f, 0x65, 0x73, + 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x5f, 0x67, 0x61, 0x73, 0x12, 0x7c, 0x0a, 0x07, 0x54, 0x72, + 0x61, 0x63, 0x65, 0x54, 0x78, 0x12, 0x25, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, + 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, + 0x61, 0x63, 0x65, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x63, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x24, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1e, 0x12, 0x1c, - 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x65, 0x76, 0x6d, 0x2f, 0x76, 0x6d, 0x2f, 0x76, - 0x31, 0x2f, 0x74, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x12, 0x7c, 0x0a, 0x07, - 0x42, 0x61, 0x73, 0x65, 0x46, 0x65, 0x65, 0x12, 0x25, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x63, 0x65, 0x54, 0x78, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, 0x12, 0x1a, 0x2f, 0x63, + 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x65, 0x76, 0x6d, 0x2f, 0x76, 0x6d, 0x2f, 0x76, 0x31, 0x2f, + 0x74, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x74, 0x78, 0x12, 0x88, 0x01, 0x0a, 0x0a, 0x54, 0x72, 0x61, + 0x63, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x28, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x42, 0x61, 0x73, 0x65, 0x46, 0x65, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, - 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, - 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x42, 0x61, 0x73, 0x65, 0x46, 0x65, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, 0x12, 0x1a, - 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x65, 0x76, 0x6d, 0x2f, 0x76, 0x6d, 0x2f, 0x76, - 0x31, 0x2f, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x66, 0x65, 0x65, 0x12, 0x77, 0x0a, 0x06, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x12, 0x24, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, - 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x63, 0x6f, 0x73, - 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x12, 0x18, 0x2f, 0x63, 0x6f, 0x73, 0x6d, - 0x6f, 0x73, 0x2f, 0x65, 0x76, 0x6d, 0x2f, 0x76, 0x6d, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x12, 0x9f, 0x01, 0x0a, 0x11, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x4d, 0x69, - 0x6e, 0x47, 0x61, 0x73, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x2f, 0x2e, 0x63, 0x6f, 0x73, 0x6d, - 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x4d, 0x69, 0x6e, 0x47, 0x61, 0x73, 0x50, 0x72, - 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x63, 0x6f, 0x73, + 0x54, 0x72, 0x61, 0x63, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x29, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, + 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x63, 0x65, 0x42, + 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x25, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x1f, 0x12, 0x1d, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x65, 0x76, + 0x6d, 0x2f, 0x76, 0x6d, 0x2f, 0x76, 0x31, 0x2f, 0x74, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x12, 0x84, 0x01, 0x0a, 0x09, 0x54, 0x72, 0x61, 0x63, 0x65, 0x43, 0x61, 0x6c, + 0x6c, 0x12, 0x27, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, + 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x63, 0x65, 0x43, + 0x61, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x4d, 0x69, 0x6e, 0x47, 0x61, 0x73, 0x50, - 0x72, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x27, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x21, 0x12, 0x1f, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x65, 0x76, - 0x6d, 0x2f, 0x76, 0x6d, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x69, 0x6e, 0x5f, 0x67, 0x61, 0x73, 0x5f, - 0x70, 0x72, 0x69, 0x63, 0x65, 0x42, 0xad, 0x01, 0x0a, 0x14, 0x63, 0x6f, 0x6d, 0x2e, 0x63, 0x6f, - 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x42, 0x0a, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x26, 0x63, 0x6f, - 0x73, 0x6d, 0x6f, 0x73, 0x73, 0x64, 0x6b, 0x2e, 0x69, 0x6f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, - 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x65, 0x76, 0x6d, 0x2f, 0x76, 0x6d, 0x2f, 0x76, 0x31, 0x3b, - 0x76, 0x6d, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x43, 0x45, 0x56, 0xaa, 0x02, 0x10, 0x43, 0x6f, 0x73, - 0x6d, 0x6f, 0x73, 0x2e, 0x45, 0x76, 0x6d, 0x2e, 0x56, 0x6d, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x10, - 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x5c, 0x45, 0x76, 0x6d, 0x5c, 0x56, 0x6d, 0x5c, 0x56, 0x31, - 0xe2, 0x02, 0x1c, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x5c, 0x45, 0x76, 0x6d, 0x5c, 0x56, 0x6d, - 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, - 0x02, 0x13, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x3a, 0x3a, 0x45, 0x76, 0x6d, 0x3a, 0x3a, 0x56, - 0x6d, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x63, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x24, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1e, 0x12, 0x1c, 0x2f, 0x63, + 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x65, 0x76, 0x6d, 0x2f, 0x76, 0x6d, 0x2f, 0x76, 0x31, 0x2f, + 0x74, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x12, 0x7c, 0x0a, 0x07, 0x42, 0x61, + 0x73, 0x65, 0x46, 0x65, 0x65, 0x12, 0x25, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, + 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x42, 0x61, + 0x73, 0x65, 0x46, 0x65, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x63, + 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x42, 0x61, 0x73, 0x65, 0x46, 0x65, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, 0x12, 0x1a, 0x2f, 0x63, + 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x65, 0x76, 0x6d, 0x2f, 0x76, 0x6d, 0x2f, 0x76, 0x31, 0x2f, + 0x62, 0x61, 0x73, 0x65, 0x5f, 0x66, 0x65, 0x65, 0x12, 0x77, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x12, 0x24, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, + 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, + 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x12, 0x18, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, + 0x2f, 0x65, 0x76, 0x6d, 0x2f, 0x76, 0x6d, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x12, 0x9f, 0x01, 0x0a, 0x11, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x4d, 0x69, 0x6e, 0x47, + 0x61, 0x73, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x2f, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, + 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x4d, 0x69, 0x6e, 0x47, 0x61, 0x73, 0x50, 0x72, 0x69, 0x63, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, + 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x4d, 0x69, 0x6e, 0x47, 0x61, 0x73, 0x50, 0x72, 0x69, + 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x27, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x21, 0x12, 0x1f, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x65, 0x76, 0x6d, 0x2f, + 0x76, 0x6d, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x69, 0x6e, 0x5f, 0x67, 0x61, 0x73, 0x5f, 0x70, 0x72, + 0x69, 0x63, 0x65, 0x42, 0xad, 0x01, 0x0a, 0x14, 0x63, 0x6f, 0x6d, 0x2e, 0x63, 0x6f, 0x73, 0x6d, + 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x42, 0x0a, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x26, 0x63, 0x6f, 0x73, 0x6d, + 0x6f, 0x73, 0x73, 0x64, 0x6b, 0x2e, 0x69, 0x6f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6f, 0x73, + 0x6d, 0x6f, 0x73, 0x2f, 0x65, 0x76, 0x6d, 0x2f, 0x76, 0x6d, 0x2f, 0x76, 0x31, 0x3b, 0x76, 0x6d, + 0x76, 0x31, 0xa2, 0x02, 0x03, 0x43, 0x45, 0x56, 0xaa, 0x02, 0x10, 0x43, 0x6f, 0x73, 0x6d, 0x6f, + 0x73, 0x2e, 0x45, 0x76, 0x6d, 0x2e, 0x56, 0x6d, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x10, 0x43, 0x6f, + 0x73, 0x6d, 0x6f, 0x73, 0x5c, 0x45, 0x76, 0x6d, 0x5c, 0x56, 0x6d, 0x5c, 0x56, 0x31, 0xe2, 0x02, + 0x1c, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x5c, 0x45, 0x76, 0x6d, 0x5c, 0x56, 0x6d, 0x5c, 0x56, + 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x13, + 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x3a, 0x3a, 0x45, 0x76, 0x6d, 0x3a, 0x3a, 0x56, 0x6d, 0x3a, + 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/api/cosmos/evm/vm/v1/query_grpc.pb.go b/api/cosmos/evm/vm/v1/query_grpc.pb.go index 14b1b7fe8a..fa83e52707 100644 --- a/api/cosmos/evm/vm/v1/query_grpc.pb.go +++ b/api/cosmos/evm/vm/v1/query_grpc.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: -// - protoc-gen-go-grpc v1.6.0 +// - protoc-gen-go-grpc v1.6.1 // - protoc (unknown) // source: cosmos/evm/vm/v1/query.proto diff --git a/api/cosmos/evm/vm/v1/tx.pulsar.go b/api/cosmos/evm/vm/v1/tx.pulsar.go index 46df45cb88..b4f034be70 100644 --- a/api/cosmos/evm/vm/v1/tx.pulsar.go +++ b/api/cosmos/evm/vm/v1/tx.pulsar.go @@ -3639,9 +3639,9 @@ type MsgEthereumTxResponse struct { // max_used_gas specifies the gas consumed by the transaction, not including // refunds MaxUsedGas uint64 `protobuf:"varint,6,opt,name=max_used_gas,json=maxUsedGas,proto3" json:"max_used_gas,omitempty"` - // include the block hash for json-rpc to use + // block_hash is included for json-rpc to use BlockHash []byte `protobuf:"bytes,7,opt,name=block_hash,json=blockHash,proto3" json:"block_hash,omitempty"` - // include the block timestamp for json-rpc to use + // block_timestamp is included for json-rpc to use BlockTimestamp uint64 `protobuf:"varint,8,opt,name=block_timestamp,json=blockTimestamp,proto3" json:"block_timestamp,omitempty"` } diff --git a/api/cosmos/evm/vm/v1/tx_grpc.pb.go b/api/cosmos/evm/vm/v1/tx_grpc.pb.go index d1108fcb36..44c4d1c7f5 100644 --- a/api/cosmos/evm/vm/v1/tx_grpc.pb.go +++ b/api/cosmos/evm/vm/v1/tx_grpc.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: -// - protoc-gen-go-grpc v1.6.0 +// - protoc-gen-go-grpc v1.6.1 // - protoc (unknown) // source: cosmos/evm/vm/v1/tx.proto diff --git a/mempool/txpool/legacypool/tx_store_test.go b/mempool/txpool/legacypool/tx_store_test.go index 8f581ccb94..b856c56a68 100644 --- a/mempool/txpool/legacypool/tx_store_test.go +++ b/mempool/txpool/legacypool/tx_store_test.go @@ -42,7 +42,7 @@ func TestTxStoreAddAndGet(t *testing.T) { store.AddTx(addr1, tx2) store.AddTx(addr2, tx3) - result := store.Txs(context.Background(),txpool.PendingFilter{}) + result := store.Txs(context.Background(), txpool.PendingFilter{}) require.Len(t, result[addr1], 2) require.Len(t, result[addr2], 1) } @@ -63,7 +63,7 @@ func TestTxStoreMinTipFilter(t *testing.T) { MinTip: uint256.MustFromBig(big.NewInt(1e9)), BaseFee: uint256.MustFromBig(big.NewInt(1e9)), } - result := store.Txs(context.Background(),filter) + result := store.Txs(context.Background(), filter) // should only get the high tip tx (nonce 0), low tip at nonce 1 is // filtered @@ -81,7 +81,7 @@ func TestTxStoreSortedByNonce(t *testing.T) { store.AddTx(addr1, createTestTx(0, big.NewInt(1e9), big.NewInt(2e9))) store.AddTx(addr1, createTestTx(1, big.NewInt(1e9), big.NewInt(2e9))) - result := store.Txs(context.Background(),txpool.PendingFilter{}) + result := store.Txs(context.Background(), txpool.PendingFilter{}) require.Len(t, result[addr1], 3) for i, lazy := range result[addr1] { @@ -107,7 +107,7 @@ func TestTxStoreRetainsPreviousTxs(t *testing.T) { store.RemoveTx(addr1, tx4) - result := store.Txs(context.Background(),txpool.PendingFilter{}) + result := store.Txs(context.Background(), txpool.PendingFilter{}) require.Len(t, result[addr1], 3) // should just have 0,1,2. for i, tx := range result[addr1] { require.Equal(t, uint64(i), tx.Tx.Nonce()) @@ -125,7 +125,7 @@ func TestTxStoreRemoveTx(t *testing.T) { store.AddTx(addr1, tx2) store.RemoveTx(addr1, tx1) - result := store.Txs(context.Background(),txpool.PendingFilter{}) + result := store.Txs(context.Background(), txpool.PendingFilter{}) require.Len(t, result[addr1], 0) } @@ -135,6 +135,6 @@ func TestTxStoreBlobTxsFiltered(t *testing.T) { addr1 := common.HexToAddress("0x1") store.AddTx(addr1, createTestTx(0, big.NewInt(1e9), big.NewInt(2e9))) - result := store.Txs(context.Background(),txpool.PendingFilter{OnlyBlobTxs: true}) + result := store.Txs(context.Background(), txpool.PendingFilter{OnlyBlobTxs: true}) require.Nil(t, result) } diff --git a/mempool/txpool/txpool_test.go b/mempool/txpool/txpool_test.go index 2a9dfee9d8..ff072e0200 100644 --- a/mempool/txpool/txpool_test.go +++ b/mempool/txpool/txpool_test.go @@ -265,6 +265,7 @@ func TestTxPoolContent_EmptySubpools(t *testing.T) { require.Empty(t, runnable) require.Empty(t, blocked) } + // minimal tx encoder to construct a testing reaplist type stubTxEncoder struct{} diff --git a/proto/cosmos/evm/vm/v1/evm.proto b/proto/cosmos/evm/vm/v1/evm.proto index 0a87af0c0b..03805ef8ed 100644 --- a/proto/cosmos/evm/vm/v1/evm.proto +++ b/proto/cosmos/evm/vm/v1/evm.proto @@ -35,11 +35,18 @@ message Params { // active_static_precompiles defines the slice of hex addresses of the // precompiled contracts that are active repeated string active_static_precompiles = 9; + // history_serve_window defines the block range for serving historical EVM + // state uint64 history_serve_window = 10; + // extended_denom_options defines the extended denom options for the EVM ExtendedDenomOptions extended_denom_options = 11; } -message ExtendedDenomOptions { string extended_denom = 1; } +// ExtendedDenomOptions defines the extended denom options for the EVM +message ExtendedDenomOptions { + // extended_denom defines the extended denom used by the EVM + string extended_denom = 1; +} // AccessControl defines the permission policy of the EVM // for creating and calling contracts @@ -352,9 +359,13 @@ message Preinstall { string code = 3; } +// EvmCoinInfo defines the EVM coin denomination metadata message EvmCoinInfo { + // denom defines the base coin denomination string denom = 1; + // extended_denom defines the extended EVM coin denomination string extended_denom = 2; + // display_denom defines the display denomination string display_denom = 3; // decimals is now deprecated and will be removed in a future release. When it // is removed we will assume the evm token denom is 18 decimal precision. diff --git a/proto/cosmos/evm/vm/v1/query.proto b/proto/cosmos/evm/vm/v1/query.proto index bdaad05aea..440a4913c6 100644 --- a/proto/cosmos/evm/vm/v1/query.proto +++ b/proto/cosmos/evm/vm/v1/query.proto @@ -263,7 +263,7 @@ message EthCallRequest { "github.com/cosmos/cosmos-sdk/types.ConsAddress" ]; // chain_id is the eip155 chain id parsed from the requested block header int64 chain_id = 4; - // state overrides encoded as json + // overrides contains state overrides encoded as json bytes overrides = 5; } @@ -369,6 +369,8 @@ message QueryTraceCallRequest { [ (gogoproto.nullable) = false, (gogoproto.stdtime) = true ]; // chain_id is the the eip155 chain id parsed from the requested block header int64 chain_id = 8; + // overrides contains state overrides in JSON format + bytes overrides = 9; } // QueryTraceCallResponse defines TraceCall response diff --git a/proto/cosmos/evm/vm/v1/tx.proto b/proto/cosmos/evm/vm/v1/tx.proto index 96d195bfc0..4bf8231a08 100644 --- a/proto/cosmos/evm/vm/v1/tx.proto +++ b/proto/cosmos/evm/vm/v1/tx.proto @@ -74,9 +74,9 @@ message MsgEthereumTxResponse { // max_used_gas specifies the gas consumed by the transaction, not including // refunds uint64 max_used_gas = 6; - // include the block hash for json-rpc to use + // block_hash is included for json-rpc to use bytes block_hash = 7; - // include the block timestamp for json-rpc to use + // block_timestamp is included for json-rpc to use uint64 block_timestamp = 8; } diff --git a/rpc/backend/backend.go b/rpc/backend/backend.go index e39fc9ad7c..abd96ec8a2 100644 --- a/rpc/backend/backend.go +++ b/rpc/backend/backend.go @@ -136,7 +136,7 @@ type EVMBackend interface { // Tracing TraceTransaction(ctx context.Context, hash common.Hash, config *types.TraceConfig) (interface{}, error) TraceBlock(ctx context.Context, height types.BlockNumber, config *types.TraceConfig, block *tmrpctypes.ResultBlock) ([]*evmtypes.TxTraceResult, error) - TraceCall(ctx context.Context, args evmtypes.TransactionArgs, blockNrOrHash types.BlockNumberOrHash, config *types.TraceConfig) (interface{}, error) + TraceCall(ctx context.Context, args evmtypes.TransactionArgs, blockNrOrHash types.BlockNumberOrHash, config *types.TraceCallConfig) (interface{}, error) } // TrackingMempool is a set of methods that a mempool may implement in order to diff --git a/rpc/backend/tracing.go b/rpc/backend/tracing.go index 0c476daa64..5612082a4a 100644 --- a/rpc/backend/tracing.go +++ b/rpc/backend/tracing.go @@ -247,7 +247,7 @@ func (b *Backend) TraceCall( ctx context.Context, args evmtypes.TransactionArgs, blockNrOrHash rpctypes.BlockNumberOrHash, - config *rpctypes.TraceConfig, + config *rpctypes.TraceCallConfig, ) (result interface{}, err error) { var toAddr string if args.To != nil { @@ -286,7 +286,8 @@ func (b *Backend) TraceCall( } if config != nil { - traceCallRequest.TraceConfig = b.convertConfig(config) + traceCallRequest.TraceConfig = b.convertConfig(&config.TraceConfig) + traceCallRequest.Overrides = config.StateOverrides } // get the context of provided block diff --git a/rpc/namespaces/ethereum/debug/api.go b/rpc/namespaces/ethereum/debug/api.go index 4b0de57d4c..3778d6cd3c 100644 --- a/rpc/namespaces/ethereum/debug/api.go +++ b/rpc/namespaces/ethereum/debug/api.go @@ -157,7 +157,7 @@ func (a *API) TraceBlock(ctx context.Context, tblockRlp hexutil.Bytes, config *r // TraceCall lets you trace a given eth_call. It collects the structured logs // created during the execution of EVM if the given transaction was added on // top of the provided block and returns them as a JSON object. -func (a *API) TraceCall(ctx context.Context, args evmtypes.TransactionArgs, blockNrOrHash rpctypes.BlockNumberOrHash, config *rpctypes.TraceConfig) (interface{}, error) { +func (a *API) TraceCall(ctx context.Context, args evmtypes.TransactionArgs, blockNrOrHash rpctypes.BlockNumberOrHash, config *rpctypes.TraceCallConfig) (interface{}, error) { a.logger.Debug("debug_traceCall", "args", args, "block number or hash", blockNrOrHash) ctx, span := tracer.Start(ctx, "eth_traceCall") defer span.End() diff --git a/rpc/types/types.go b/rpc/types/types.go index adaed22bc8..97607fb7db 100644 --- a/rpc/types/types.go +++ b/rpc/types/types.go @@ -189,3 +189,9 @@ type TraceConfig struct { evmtypes.TraceConfig TracerConfig json.RawMessage `json:"tracerConfig"` } + +// TraceCallConfig extends TraceConfig with state overrides for debug_traceCall. +type TraceCallConfig struct { + TraceConfig + StateOverrides json.RawMessage `json:"stateOverrides"` +} diff --git a/tests/integration/rpc/backend/test_evm_query_client.go b/tests/integration/rpc/backend/test_evm_query_client.go index 7225c2e784..19a52fb7cb 100644 --- a/tests/integration/rpc/backend/test_evm_query_client.go +++ b/tests/integration/rpc/backend/test_evm_query_client.go @@ -98,6 +98,13 @@ func RegisterTraceCallWithTracer(queryClient *mocks.EVMQueryClient, msgEthTx *ev })).Return(&evmtypes.QueryTraceCallResponse{Data: data}, nil) } +func RegisterTraceCallWithOverrides(queryClient *mocks.EVMQueryClient, overrides []byte) { + data := []byte{0x7b, 0x22, 0x74, 0x65, 0x73, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x74, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x22, 0x7d} // {"test": "trace_call"} + queryClient.EXPECT().TraceCall(mock.Anything, mock.MatchedBy(func(req *evmtypes.QueryTraceCallRequest) bool { + return req.TraceConfig != nil && bytes.Equal(req.Overrides, overrides) + })).Return(&evmtypes.QueryTraceCallResponse{Data: data}, nil) +} + func RegisterTraceCallError(queryClient *mocks.EVMQueryClient) { queryClient.EXPECT().TraceCall(mock.Anything, mock.AnythingOfType("*types.QueryTraceCallRequest")). Return(nil, errortypes.ErrInvalidRequest) diff --git a/tests/integration/rpc/backend/test_tracing.go b/tests/integration/rpc/backend/test_tracing.go index 8a5193c2ff..7bfba0867b 100644 --- a/tests/integration/rpc/backend/test_tracing.go +++ b/tests/integration/rpc/backend/test_tracing.go @@ -216,7 +216,7 @@ func (s *TestSuite) TestTraceCall() { registerMock func() args evmtypes.TransactionArgs blockNrOrHash rpctypes.BlockNumberOrHash - config *rpctypes.TraceConfig + config *rpctypes.TraceCallConfig expResult interface{} expPass bool }{ @@ -241,7 +241,7 @@ func (s *TestSuite) TestTraceCall() { return &bn }(), }, - &rpctypes.TraceConfig{}, + &rpctypes.TraceCallConfig{}, map[string]interface{}{"test": "trace_call"}, true, }, @@ -268,7 +268,7 @@ func (s *TestSuite) TestTraceCall() { return &h }(), }, - &rpctypes.TraceConfig{}, + &rpctypes.TraceCallConfig{}, map[string]interface{}{"test": "trace_call"}, true, }, @@ -293,14 +293,43 @@ func (s *TestSuite) TestTraceCall() { return &bn }(), }, - &rpctypes.TraceConfig{ - TraceConfig: evmtypes.TraceConfig{ - Tracer: "callTracer", + &rpctypes.TraceCallConfig{ + TraceConfig: rpctypes.TraceConfig{ + TraceConfig: evmtypes.TraceConfig{ + Tracer: "callTracer", + }, }, }, map[string]interface{}{"type": "CALL"}, true, }, + { + "pass - trace call with state overrides", + func() { + var ( + QueryClient = s.backend.QueryClient.QueryClient.(*mocks.EVMQueryClient) + client = s.backend.ClientCtx.Client.(*mocks.Client) + height = int64(1) + ) + RegisterHeader(client, &height, nil) + RegisterTraceCallWithOverrides(QueryClient, []byte(`{"0x0000000000000000000000000000000000000002":{"code":"0x00"}}`)) + }, + evmtypes.TransactionArgs{ + From: &common.Address{0x1}, + To: &common.Address{0x2}, + }, + rpctypes.BlockNumberOrHash{ + BlockNumber: func() *rpctypes.BlockNumber { + bn := rpctypes.BlockNumber(1) + return &bn + }(), + }, + &rpctypes.TraceCallConfig{ + StateOverrides: []byte(`{"0x0000000000000000000000000000000000000002":{"code":"0x00"}}`), + }, + map[string]interface{}{"test": "trace_call"}, + true, + }, { "fail - invalid block number or hash", func() {}, diff --git a/tests/integration/x/vm/test_grpc_query.go b/tests/integration/x/vm/test_grpc_query.go index 7867bd31b1..a8ad580343 100644 --- a/tests/integration/x/vm/test_grpc_query.go +++ b/tests/integration/x/vm/test_grpc_query.go @@ -18,6 +18,7 @@ import ( "github.com/holiman/uint256" "github.com/stretchr/testify/require" + rpctypes "github.com/cosmos/evm/rpc/types" "github.com/cosmos/evm/server/config" testconstants "github.com/cosmos/evm/testutil/constants" "github.com/cosmos/evm/testutil/integration/evm/factory" @@ -1696,12 +1697,18 @@ func (s *KeeperTestSuite) TestTraceCall() { s.Require().NoError(err) s.Require().NoError(s.Network.NextBlock()) + balanceSlot := crypto.Keccak256Hash( + common.LeftPadBytes(senderKey.Addr.Bytes(), 32), + common.LeftPadBytes(big.NewInt(0).Bytes(), 32), + ) + testCases := []struct { - msg string - getCallArgs func() []byte - getTraceConfig func() *types.TraceConfig - expPass bool - traceResponse string + msg string + getCallArgs func() []byte + traceCallConfig *rpctypes.TraceCallConfig + expPass bool + traceResponse string + postTraceResponse string }{ { msg: "default trace with contract call", @@ -1716,9 +1723,6 @@ func (s *KeeperTestSuite) TestTraceCall() { s.Require().NoError(err) return input }, - getTraceConfig: func() *types.TraceConfig { - return nil // Use default tracer - }, expPass: true, traceResponse: "\"gas\":", }, @@ -1734,10 +1738,12 @@ func (s *KeeperTestSuite) TestTraceCall() { s.Require().NoError(err) return input }, - getTraceConfig: func() *types.TraceConfig { - return &types.TraceConfig{ - Tracer: "callTracer", - } + traceCallConfig: &rpctypes.TraceCallConfig{ + TraceConfig: rpctypes.TraceConfig{ + TraceConfig: types.TraceConfig{ + Tracer: "callTracer", + }, + }, }, expPass: true, traceResponse: "\"type\":\"CALL\"", @@ -1754,10 +1760,12 @@ func (s *KeeperTestSuite) TestTraceCall() { s.Require().NoError(err) return input }, - getTraceConfig: func() *types.TraceConfig { - return &types.TraceConfig{ - Tracer: "prestateTracer", - } + traceCallConfig: &rpctypes.TraceCallConfig{ + TraceConfig: rpctypes.TraceConfig{ + TraceConfig: types.TraceConfig{ + Tracer: "prestateTracer", + }, + }, }, expPass: true, traceResponse: "\"balance\":", @@ -1774,13 +1782,15 @@ func (s *KeeperTestSuite) TestTraceCall() { s.Require().NoError(err) return input }, - getTraceConfig: func() *types.TraceConfig { - return &types.TraceConfig{ - DisableStack: true, - DisableStorage: true, - EnableMemory: false, - EnableReturnData: true, - } + traceCallConfig: &rpctypes.TraceCallConfig{ + TraceConfig: rpctypes.TraceConfig{ + TraceConfig: types.TraceConfig{ + DisableStack: true, + DisableStorage: true, + EnableMemory: false, + EnableReturnData: true, + }, + }, }, expPass: true, traceResponse: "\"returnValue\":", @@ -1797,10 +1807,12 @@ func (s *KeeperTestSuite) TestTraceCall() { s.Require().NoError(err) return input }, - getTraceConfig: func() *types.TraceConfig { - return &types.TraceConfig{ - Tracer: "{data: [], fault: function(log) {}, step: function(log) { if(log.op.toString() == \"CALL\") this.data.push(log.stack.peek(0)); }, result: function() { return this.data; }}", - } + traceCallConfig: &rpctypes.TraceCallConfig{ + TraceConfig: rpctypes.TraceConfig{ + TraceConfig: types.TraceConfig{ + Tracer: "{data: [], fault: function(log) {}, step: function(log) { if(log.op.toString() == \"CALL\") this.data.push(log.stack.peek(0)); }, result: function() { return this.data; }}", + }, + }, }, expPass: true, traceResponse: "[", @@ -1810,10 +1822,12 @@ func (s *KeeperTestSuite) TestTraceCall() { getCallArgs: func() []byte { return nil // Simple value transfer, no data }, - getTraceConfig: func() *types.TraceConfig { - return &types.TraceConfig{ - Tracer: "callTracer", - } + traceCallConfig: &rpctypes.TraceCallConfig{ + TraceConfig: rpctypes.TraceConfig{ + TraceConfig: types.TraceConfig{ + Tracer: "callTracer", + }, + }, }, expPass: true, traceResponse: "\"type\":\"CALL\"", @@ -1823,10 +1837,12 @@ func (s *KeeperTestSuite) TestTraceCall() { getCallArgs: func() []byte { return nil }, - getTraceConfig: func() *types.TraceConfig { - return &types.TraceConfig{ - Limit: -1, - } + traceCallConfig: &rpctypes.TraceCallConfig{ + TraceConfig: rpctypes.TraceConfig{ + TraceConfig: types.TraceConfig{ + Limit: -1, + }, + }, }, expPass: false, }, @@ -1835,10 +1851,12 @@ func (s *KeeperTestSuite) TestTraceCall() { getCallArgs: func() []byte { return nil }, - getTraceConfig: func() *types.TraceConfig { - return &types.TraceConfig{ - Tracer: "invalid_tracer", - } + traceCallConfig: &rpctypes.TraceCallConfig{ + TraceConfig: rpctypes.TraceConfig{ + TraceConfig: types.TraceConfig{ + Tracer: "invalid_tracer", + }, + }, }, expPass: false, }, @@ -1847,10 +1865,78 @@ func (s *KeeperTestSuite) TestTraceCall() { getCallArgs: func() []byte { return nil }, - getTraceConfig: func() *types.TraceConfig { - return &types.TraceConfig{ - Timeout: "wrong_time", + traceCallConfig: &rpctypes.TraceCallConfig{ + TraceConfig: rpctypes.TraceConfig{ + TraceConfig: types.TraceConfig{ + Timeout: "wrong_time", + }, + }, + }, + expPass: false, + }, + { + msg: "trace call without state override", + getCallArgs: func() []byte { + callArgs := testutiltypes.CallArgs{ + ContractABI: erc20Contract.ABI, + MethodName: "balanceOf", + Args: []interface{}{senderKey.Addr}, } + input, err := factory.GenerateContractCallArgs(callArgs) + s.Require().NoError(err) + return input + }, + traceCallConfig: &rpctypes.TraceCallConfig{ + TraceConfig: rpctypes.TraceConfig{ + TraceConfig: types.TraceConfig{ + Tracer: "callTracer", + }, + }, + }, + expPass: true, + traceResponse: `"output":"0x00000000000000000000000000000000000000000000003635c9adc5dea00000"`, + }, + { + msg: "trace call with balance override", + getCallArgs: func() []byte { + callArgs := testutiltypes.CallArgs{ + ContractABI: erc20Contract.ABI, + MethodName: "balanceOf", + Args: []interface{}{senderKey.Addr}, + } + input, err := factory.GenerateContractCallArgs(callArgs) + s.Require().NoError(err) + return input + }, + traceCallConfig: &rpctypes.TraceCallConfig{ + TraceConfig: rpctypes.TraceConfig{ + TraceConfig: types.TraceConfig{ + Tracer: "callTracer", + }, + }, + StateOverrides: []byte(fmt.Sprintf( + `{"%s":{"stateDiff":{"%s":"%s"}}}`, + contractAddr.Hex(), + balanceSlot.Hex(), + common.BigToHash(big.NewInt(1)).Hex(), + )), + }, + expPass: true, + traceResponse: `"output":"0x0000000000000000000000000000000000000000000000000000000000000001"`, + postTraceResponse: `"output":"0x00000000000000000000000000000000000000000000003635c9adc5dea00000"`, + }, + { + msg: "invalid state overrides", + getCallArgs: func() []byte { + return []byte{} + }, + traceCallConfig: &rpctypes.TraceCallConfig{ + TraceConfig: rpctypes.TraceConfig{ + TraceConfig: types.TraceConfig{ + Tracer: "callTracer", + }, + }, + StateOverrides: []byte(fmt.Sprintf(`{"%s":{"code":`, contractAddr.Hex())), }, expPass: false, }, @@ -1898,14 +1984,20 @@ func (s *KeeperTestSuite) TestTraceCall() { // Build trace request ctx := s.Network.GetContext() + traceCallConfig := tc.traceCallConfig + if traceCallConfig == nil { + traceCallConfig = &rpctypes.TraceCallConfig{} + } + traceReq := &types.QueryTraceCallRequest{ Args: argsBytes, - TraceConfig: tc.getTraceConfig(), + TraceConfig: &traceCallConfig.TraceConfig.TraceConfig, BlockNumber: currentBlock, BlockTime: ctx.BlockTime(), BlockHash: common.BytesToHash(ctx.HeaderHash()).Hex(), ProposerAddress: sdk.ConsAddress(ctx.BlockHeader().ProposerAddress), ChainId: s.Network.GetEIP155ChainID().Int64(), + Overrides: traceCallConfig.StateOverrides, } // Execute trace call @@ -1920,8 +2012,15 @@ func (s *KeeperTestSuite) TestTraceCall() { s.Require().Contains(string(res.Data), tc.traceResponse) } + if tc.postTraceResponse != "" { + traceReq.Overrides = nil + res, err = s.Network.GetEvmClient().TraceCall(s.Network.GetContext(), traceReq) + s.Require().NoError(err) + s.Require().Contains(string(res.Data), tc.postTraceResponse) + } + // For non-custom tracers, verify the result structure - if tc.getTraceConfig() == nil || tc.getTraceConfig().Tracer == "" { + if traceCallConfig.Tracer == "" { var result ethlogger.ExecutionResult s.Require().NoError(json.Unmarshal(res.Data, &result)) s.Require().NotNil(result.Gas) diff --git a/x/vm/keeper/grpc_query.go b/x/vm/keeper/grpc_query.go index 8f8ff567f6..999cfcd46e 100644 --- a/x/vm/keeper/grpc_query.go +++ b/x/vm/keeper/grpc_query.go @@ -519,6 +519,14 @@ func (k Keeper) EstimateGasInternal(c context.Context, req *types.EthCallRequest return &types.EstimateGasResponse{Gas: hi}, nil } +type traceTxConfig struct { + evmConfig *statedb.EVMConfig + txConfig statedb.TxConfig + traceConfig *types.TraceConfig + commit bool + stateOverrides *rpctypes.StateOverride +} + // TraceTx configures a new tracer according to the provided configuration, and // executes the given message in the provided environment. The return value will // be tracer-dependent. @@ -615,7 +623,11 @@ func (k Keeper) TraceTx(c context.Context, req *types.QueryTraceTxRequest) (_ *t txConfig.TxIndex++ } - result, err := k.traceTx(ctx, cfg, txConfig, signer, tx, req.TraceConfig, false) + result, err := k.traceTx(ctx, signer, tx, traceTxConfig{ + evmConfig: cfg, + txConfig: txConfig, + traceConfig: req.TraceConfig, + }) if err != nil { // error will be returned with detail status from traceTx return nil, err @@ -690,7 +702,12 @@ func (k Keeper) TraceBlock(c context.Context, req *types.QueryTraceBlockRequest) ethTx := tx.AsTransaction() txConfig.TxHash = ethTx.Hash() txConfig.TxIndex = uint(i) - traceResult, err := k.traceTx(ctx, cfg, txConfig, signer, ethTx, req.TraceConfig, true) + traceResult, err := k.traceTx(ctx, signer, ethTx, traceTxConfig{ + evmConfig: cfg, + txConfig: txConfig, + traceConfig: req.TraceConfig, + commit: true, + }) if err != nil { result.Error = err.Error() } else { @@ -773,8 +790,22 @@ func (k Keeper) TraceCall(c context.Context, req *types.QueryTraceCallRequest) ( } msg := args.ToMessage(baseFee, true, true) + // Get state overrides + var overrides *rpctypes.StateOverride + if len(req.Overrides) > 0 { + overrides = new(rpctypes.StateOverride) + if err = json.Unmarshal(req.Overrides, overrides); err != nil { + return nil, status.Error(codes.InvalidArgument, fmt.Sprintf("invalid state overrides format: %s", err.Error())) + } + } + // trace call - result, err := k.traceTxWithMsg(ctx, cfg, txConfig, msg, req.GetTraceConfig(), false) + result, err := k.traceTxWithMsg(ctx, msg, traceTxConfig{ + evmConfig: cfg, + txConfig: txConfig, + traceConfig: req.GetTraceConfig(), + stateOverrides: overrides, + }) if err != nil { // error will be returned with detail status from traceTx return nil, err @@ -793,34 +824,34 @@ func (k Keeper) TraceCall(c context.Context, req *types.QueryTraceCallRequest) ( // traceTx do trace on one transaction, it returns a tuple: (traceResult, error). func (k *Keeper) traceTx( ctx sdk.Context, - cfg *statedb.EVMConfig, - txConfig statedb.TxConfig, signer ethtypes.Signer, tx *ethtypes.Transaction, - traceConfig *types.TraceConfig, - commitMessage bool, + config traceTxConfig, ) (_ *any, err error) { ctx, span := ctx.StartSpan(tracer, "traceTx", trace.WithAttributes( attribute.String("tx_hash", tx.Hash().Hex()), )) defer func() { evmtrace.EndSpanErr(span, err) }() - msg, err := core.TransactionToMessage(tx, signer, cfg.BaseFee) + msg, err := core.TransactionToMessage(tx, signer, config.evmConfig.BaseFee) if err != nil { return nil, status.Error(codes.Internal, err.Error()) } - return k.traceTxWithMsg(ctx, cfg, txConfig, msg, traceConfig, commitMessage) + return k.traceTxWithMsg(ctx, msg, config) } // traceTxWithMsg do trace on one Ethereum message, it returns a tuple: (traceResult, error). func (k *Keeper) traceTxWithMsg( ctx sdk.Context, - cfg *statedb.EVMConfig, - txConfig statedb.TxConfig, msg *core.Message, - traceConfig *types.TraceConfig, - commitMessage bool, + config traceTxConfig, ) (_ *any, err error) { + txConfig := config.txConfig + traceConfig := config.traceConfig + if traceConfig == nil { + traceConfig = &types.TraceConfig{} + } + ctx, span := ctx.StartSpan(tracer, "traceTxWithMsg", trace.WithAttributes( attribute.String("tx_hash", txConfig.TxHash.Hex()), attribute.Int("tx_index", int(txConfig.TxIndex)), @@ -830,22 +861,18 @@ func (k *Keeper) traceTxWithMsg( // Assemble the structured logger or the JavaScript tracer var ( tracer *tracers.Tracer - overrides *ethparams.ChainConfig + chainOverrides *ethparams.ChainConfig jsonTracerConfig json.RawMessage timeout = defaultTraceTimeout ) - if traceConfig == nil { - traceConfig = &types.TraceConfig{} - } - - if traceConfig != nil && traceConfig.TracerJsonConfig != "" { + if traceConfig.TracerJsonConfig != "" { // ignore error. default to no traceConfig _ = json.Unmarshal([]byte(traceConfig.TracerJsonConfig), &jsonTracerConfig) } if traceConfig.Overrides != nil { - overrides = traceConfig.Overrides.EthereumConfig(types.GetEthChainConfig().ChainID) + chainOverrides = traceConfig.Overrides.EthereumConfig(types.GetEthChainConfig().ChainID) } logConfig := logger.Config{ @@ -854,7 +881,7 @@ func (k *Keeper) traceTxWithMsg( DisableStack: traceConfig.DisableStack, EnableReturnData: traceConfig.EnableReturnData, Limit: int(traceConfig.Limit), - Overrides: overrides, + Overrides: chainOverrides, } sLogger := logger.NewStructLogger(&logConfig) @@ -902,7 +929,7 @@ func (k *Keeper) traceTxWithMsg( // Build EVM execution context ctx = buildTraceCtx(ctx, msg.GasLimit) stateDB := statedb.New(ctx, k, txConfig) - _, err = k.ApplyMessageWithConfig(ctx, stateDB, *msg, tracer.Hooks, commitMessage, false, cfg, txConfig, false, nil) + _, err = k.ApplyMessageWithConfig(ctx, stateDB, *msg, tracer.Hooks, config.commit, false, config.evmConfig, txConfig, false, config.stateOverrides) if err != nil { return nil, status.Error(codes.Internal, err.Error()) } diff --git a/x/vm/types/evm.pb.go b/x/vm/types/evm.pb.go index 912f47df63..0dff88b3ca 100644 --- a/x/vm/types/evm.pb.go +++ b/x/vm/types/evm.pb.go @@ -70,9 +70,12 @@ type Params struct { AccessControl AccessControl `protobuf:"bytes,8,opt,name=access_control,json=accessControl,proto3" json:"access_control"` // active_static_precompiles defines the slice of hex addresses of the // precompiled contracts that are active - ActiveStaticPrecompiles []string `protobuf:"bytes,9,rep,name=active_static_precompiles,json=activeStaticPrecompiles,proto3" json:"active_static_precompiles,omitempty"` - HistoryServeWindow uint64 `protobuf:"varint,10,opt,name=history_serve_window,json=historyServeWindow,proto3" json:"history_serve_window,omitempty"` - ExtendedDenomOptions *ExtendedDenomOptions `protobuf:"bytes,11,opt,name=extended_denom_options,json=extendedDenomOptions,proto3" json:"extended_denom_options,omitempty"` + ActiveStaticPrecompiles []string `protobuf:"bytes,9,rep,name=active_static_precompiles,json=activeStaticPrecompiles,proto3" json:"active_static_precompiles,omitempty"` + // history_serve_window defines the block range for serving historical EVM + // state + HistoryServeWindow uint64 `protobuf:"varint,10,opt,name=history_serve_window,json=historyServeWindow,proto3" json:"history_serve_window,omitempty"` + // extended_denom_options defines the extended denom options for the EVM + ExtendedDenomOptions *ExtendedDenomOptions `protobuf:"bytes,11,opt,name=extended_denom_options,json=extendedDenomOptions,proto3" json:"extended_denom_options,omitempty"` } func (m *Params) Reset() { *m = Params{} } @@ -157,7 +160,9 @@ func (m *Params) GetExtendedDenomOptions() *ExtendedDenomOptions { return nil } +// ExtendedDenomOptions defines the extended denom options for the EVM type ExtendedDenomOptions struct { + // extended_denom defines the extended denom used by the EVM ExtendedDenom string `protobuf:"bytes,1,opt,name=extended_denom,json=extendedDenom,proto3" json:"extended_denom,omitempty"` } @@ -983,12 +988,16 @@ func (m *Preinstall) GetCode() string { return "" } +// EvmCoinInfo defines the EVM coin denomination metadata type EvmCoinInfo struct { - Denom string `protobuf:"bytes,1,opt,name=denom,proto3" json:"denom,omitempty"` + // denom defines the base coin denomination + Denom string `protobuf:"bytes,1,opt,name=denom,proto3" json:"denom,omitempty"` + // extended_denom defines the extended EVM coin denomination ExtendedDenom string `protobuf:"bytes,2,opt,name=extended_denom,json=extendedDenom,proto3" json:"extended_denom,omitempty"` - DisplayDenom string `protobuf:"bytes,3,opt,name=display_denom,json=displayDenom,proto3" json:"display_denom,omitempty"` - // decimals is now deprecated and will be removed in a future release. When it is removed we will assume - // the evm token denom is 18 decimal precision. + // display_denom defines the display denomination + DisplayDenom string `protobuf:"bytes,3,opt,name=display_denom,json=displayDenom,proto3" json:"display_denom,omitempty"` + // decimals is now deprecated and will be removed in a future release. When it + // is removed we will assume the evm token denom is 18 decimal precision. Decimals uint32 `protobuf:"varint,4,opt,name=decimals,proto3" json:"decimals,omitempty"` // Deprecated: Do not use. } diff --git a/x/vm/types/query.pb.go b/x/vm/types/query.pb.go index ecb82c7902..b26ac49bf3 100644 --- a/x/vm/types/query.pb.go +++ b/x/vm/types/query.pb.go @@ -881,7 +881,7 @@ type EthCallRequest struct { ProposerAddress github_com_cosmos_cosmos_sdk_types.ConsAddress `protobuf:"bytes,3,opt,name=proposer_address,json=proposerAddress,proto3,casttype=github.com/cosmos/cosmos-sdk/types.ConsAddress" json:"proposer_address,omitempty"` // chain_id is the eip155 chain id parsed from the requested block header ChainId int64 `protobuf:"varint,4,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` - // state overrides encoded as json + // overrides contains state overrides encoded as json Overrides []byte `protobuf:"bytes,5,opt,name=overrides,proto3" json:"overrides,omitempty"` } @@ -1356,6 +1356,8 @@ type QueryTraceCallRequest struct { BlockTime time.Time `protobuf:"bytes,7,opt,name=block_time,json=blockTime,proto3,stdtime" json:"block_time"` // chain_id is the the eip155 chain id parsed from the requested block header ChainId int64 `protobuf:"varint,8,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` + // overrides contains state overrides in JSON format + Overrides []byte `protobuf:"bytes,9,opt,name=overrides,proto3" json:"overrides,omitempty"` } func (m *QueryTraceCallRequest) Reset() { *m = QueryTraceCallRequest{} } @@ -1447,6 +1449,13 @@ func (m *QueryTraceCallRequest) GetChainId() int64 { return 0 } +func (m *QueryTraceCallRequest) GetOverrides() []byte { + if m != nil { + return m.Overrides + } + return nil +} + // QueryTraceCallResponse defines TraceCall response type QueryTraceCallResponse struct { // data is the response serialized in bytes @@ -1683,115 +1692,115 @@ func init() { func init() { proto.RegisterFile("cosmos/evm/vm/v1/query.proto", fileDescriptor_0e8f08e175b3ef0c) } var fileDescriptor_0e8f08e175b3ef0c = []byte{ - // 1716 bytes of a gzipped FileDescriptorProto + // 1721 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x58, 0xcd, 0x6f, 0xdb, 0x46, 0x16, 0x37, 0x2d, 0xd9, 0x92, 0x46, 0x76, 0xa2, 0x4c, 0xec, 0x8d, 0xcc, 0xb5, 0x25, 0x87, 0xf1, 0x77, 0x1c, 0x32, 0xf6, 0x66, 0x17, 0xd8, 0xec, 0x61, 0xd7, 0x36, 0x1c, 0x27, 0x9b, 0x64, 0x91, 0x55, 0x8d, 0x1e, 0x0a, 0x14, 0xc2, 0x88, 0x9a, 0x50, 0x84, 0x45, 0x52, 0xe1, 0x50, 0xaa, 0x9c, - 0x8f, 0x1e, 0x8a, 0x36, 0x4d, 0x90, 0x4b, 0x8a, 0xde, 0xdb, 0x1c, 0x7b, 0x6b, 0x6f, 0xfd, 0x17, - 0x72, 0x0c, 0x50, 0x14, 0x28, 0x7a, 0x48, 0x8b, 0xa4, 0x40, 0xfb, 0x37, 0xf4, 0x54, 0xcc, 0x07, - 0x25, 0x52, 0x14, 0x25, 0xa7, 0x48, 0xd1, 0x1e, 0x0a, 0x18, 0x09, 0x67, 0xe6, 0xcd, 0x7b, 0xbf, - 0x79, 0xdf, 0x4f, 0x60, 0x56, 0x77, 0x88, 0xe5, 0x10, 0x0d, 0xb7, 0x2c, 0x8d, 0xfe, 0x6d, 0x68, - 0xb7, 0x9a, 0xd8, 0x3d, 0x54, 0x1b, 0xae, 0xe3, 0x39, 0x30, 0xc7, 0x4f, 0x55, 0xdc, 0xb2, 0x54, - 0xfa, 0xb7, 0x21, 0x9f, 0x40, 0x96, 0x69, 0x3b, 0x1a, 0xfb, 0x97, 0x13, 0xc9, 0x6b, 0x82, 0x45, - 0x05, 0x11, 0xcc, 0x6f, 0x6b, 0xad, 0x8d, 0x0a, 0xf6, 0xd0, 0x86, 0xd6, 0x40, 0x86, 0x69, 0x23, - 0xcf, 0x74, 0x6c, 0x41, 0x2b, 0x47, 0xc4, 0x51, 0xd6, 0xfc, 0x6c, 0x26, 0x72, 0xe6, 0xb5, 0xc5, - 0xd1, 0x94, 0xe1, 0x18, 0x0e, 0xfb, 0xd4, 0xe8, 0x97, 0xd8, 0x9d, 0x35, 0x1c, 0xc7, 0xa8, 0x63, - 0x0d, 0x35, 0x4c, 0x0d, 0xd9, 0xb6, 0xe3, 0x31, 0x49, 0x44, 0x9c, 0x16, 0xc5, 0x29, 0x5b, 0x55, - 0x9a, 0x37, 0x35, 0xcf, 0xb4, 0x30, 0xf1, 0x90, 0xd5, 0xe0, 0x04, 0xca, 0x14, 0x80, 0xff, 0xa7, - 0x68, 0x77, 0x1c, 0xfb, 0xa6, 0x69, 0x94, 0xf0, 0xad, 0x26, 0x26, 0x9e, 0x72, 0x0d, 0x9c, 0x0c, - 0xed, 0x92, 0x86, 0x63, 0x13, 0x0c, 0xff, 0x0e, 0xc6, 0x75, 0xb6, 0x93, 0x97, 0xe6, 0xa5, 0x95, - 0xec, 0xe6, 0x9c, 0xda, 0xab, 0x1a, 0x75, 0xa7, 0x86, 0x4c, 0x5b, 0x5c, 0x13, 0xc4, 0xca, 0x3f, - 0x05, 0xb7, 0x2d, 0x5d, 0x77, 0x9a, 0xb6, 0x27, 0x84, 0xc0, 0x3c, 0x48, 0xa1, 0x6a, 0xd5, 0xc5, - 0x84, 0x30, 0x76, 0x99, 0x92, 0xbf, 0xbc, 0x98, 0x7e, 0xf0, 0xa4, 0x38, 0xf2, 0xd3, 0x93, 0xe2, - 0x88, 0xa2, 0x83, 0xa9, 0xf0, 0x55, 0x81, 0x24, 0x0f, 0x52, 0x15, 0x54, 0x47, 0xb6, 0x8e, 0xfd, - 0xbb, 0x62, 0x09, 0xff, 0x0a, 0x32, 0xba, 0x53, 0xc5, 0xe5, 0x1a, 0x22, 0xb5, 0xfc, 0x28, 0x3b, - 0x4b, 0xd3, 0x8d, 0xcb, 0x88, 0xd4, 0xe0, 0x14, 0x18, 0xb3, 0x1d, 0x7a, 0x29, 0x31, 0x2f, 0xad, - 0x24, 0x4b, 0x7c, 0xa1, 0xfc, 0x1b, 0xcc, 0x88, 0xd7, 0xd2, 0xc7, 0xfc, 0x0a, 0x94, 0xf7, 0x25, - 0x20, 0xf7, 0xe3, 0x20, 0xc0, 0x2e, 0x82, 0x63, 0x5c, 0x4f, 0xe5, 0x30, 0xa7, 0x49, 0xbe, 0xbb, - 0xc5, 0x37, 0xa1, 0x0c, 0xd2, 0x84, 0x0a, 0xa5, 0xf8, 0x46, 0x19, 0xbe, 0xce, 0x9a, 0xb2, 0x40, - 0x9c, 0x6b, 0xd9, 0x6e, 0x5a, 0x15, 0xec, 0x8a, 0x17, 0x4c, 0x8a, 0xdd, 0xff, 0xb1, 0x4d, 0xe5, - 0x2a, 0x98, 0x65, 0x38, 0xde, 0x44, 0x75, 0xb3, 0x8a, 0x3c, 0xc7, 0xed, 0x79, 0xcc, 0x69, 0x30, - 0xa1, 0x3b, 0x76, 0x2f, 0x8e, 0x2c, 0xdd, 0xdb, 0x8a, 0xbc, 0xea, 0x91, 0x04, 0xe6, 0x62, 0xb8, - 0x89, 0x87, 0x2d, 0x83, 0xe3, 0x3e, 0xaa, 0x30, 0x47, 0x1f, 0xec, 0x6b, 0x7c, 0x9a, 0xef, 0x44, - 0xdb, 0xdc, 0xce, 0xaf, 0x62, 0x9e, 0xf3, 0xc2, 0x89, 0x3a, 0x57, 0x87, 0x39, 0x91, 0x72, 0x55, - 0x08, 0x7b, 0xc3, 0x73, 0x5c, 0x64, 0x0c, 0x17, 0x06, 0x73, 0x20, 0x71, 0x80, 0x0f, 0x85, 0xbf, - 0xd1, 0xcf, 0x80, 0xf8, 0x75, 0x21, 0xbe, 0xc3, 0x4c, 0x88, 0x9f, 0x02, 0x63, 0x2d, 0x54, 0x6f, - 0xfa, 0xc2, 0xf9, 0x42, 0xf9, 0x07, 0xc8, 0x09, 0x57, 0xaa, 0xbe, 0xd2, 0x23, 0x97, 0xc1, 0x89, - 0xc0, 0x3d, 0x21, 0x02, 0x82, 0x24, 0xf5, 0x7d, 0x76, 0x6b, 0xa2, 0xc4, 0xbe, 0x95, 0xdb, 0x22, - 0xe2, 0xf7, 0xdb, 0xd7, 0x1c, 0x83, 0xf8, 0x22, 0x20, 0x48, 0xb2, 0x88, 0xe1, 0xfc, 0xd9, 0x37, - 0xbc, 0x04, 0x40, 0x37, 0x77, 0xb1, 0xb7, 0x65, 0x37, 0x97, 0xfc, 0x90, 0xa7, 0x89, 0x4e, 0xe5, - 0x69, 0x52, 0x24, 0x3a, 0xf5, 0x46, 0x57, 0x55, 0xa5, 0xc0, 0xcd, 0x00, 0xc8, 0x87, 0x92, 0x50, - 0xac, 0x2f, 0x5c, 0xe0, 0x5c, 0x05, 0xc9, 0xba, 0x63, 0xd0, 0xd7, 0x25, 0x56, 0xb2, 0x9b, 0xd3, - 0xd1, 0xb4, 0x72, 0xcd, 0x31, 0x4a, 0x8c, 0x04, 0xee, 0xf5, 0x01, 0xb5, 0x3c, 0x14, 0x14, 0x97, - 0x13, 0x44, 0xd5, 0xc9, 0x7c, 0x37, 0x90, 0x8b, 0x2c, 0x5f, 0x0f, 0x4a, 0x49, 0x00, 0xf4, 0x77, - 0x05, 0xc0, 0x7f, 0x81, 0xf1, 0x06, 0xdb, 0x11, 0x99, 0x2f, 0x1f, 0x85, 0xc8, 0x6f, 0x6c, 0x67, - 0x9e, 0x3e, 0x2f, 0x8e, 0x7c, 0xf6, 0xe3, 0x17, 0x6b, 0x52, 0x49, 0x5c, 0x51, 0xbe, 0x96, 0xc0, - 0xb1, 0x5d, 0xaf, 0xb6, 0x83, 0xea, 0xf5, 0x80, 0xba, 0x91, 0x6b, 0x10, 0xdf, 0x30, 0xf4, 0x1b, - 0x9e, 0x02, 0x29, 0x03, 0x91, 0xb2, 0x8e, 0x1a, 0x22, 0x46, 0xc6, 0x0d, 0x44, 0x76, 0x50, 0x03, - 0xbe, 0x0d, 0x72, 0x0d, 0xd7, 0x69, 0x38, 0x04, 0xbb, 0x9d, 0x38, 0xa3, 0x31, 0x32, 0xb1, 0xbd, - 0xf9, 0xf3, 0xf3, 0xa2, 0x6a, 0x98, 0x5e, 0xad, 0x59, 0x51, 0x75, 0xc7, 0xd2, 0x44, 0xf1, 0xe0, - 0xff, 0x9d, 0x23, 0xd5, 0x03, 0xcd, 0x3b, 0x6c, 0x60, 0xa2, 0xee, 0x74, 0x03, 0xbc, 0x74, 0xdc, - 0xe7, 0xe5, 0x07, 0xe7, 0x0c, 0x48, 0xeb, 0x34, 0x6b, 0x97, 0xcd, 0x6a, 0x3e, 0x39, 0x2f, 0xad, - 0x24, 0x4a, 0x29, 0xb6, 0xbe, 0x52, 0x85, 0xb3, 0x20, 0xe3, 0xb4, 0xb0, 0xeb, 0x9a, 0x55, 0x4c, - 0xf2, 0x63, 0x0c, 0x6b, 0x77, 0x43, 0xd9, 0x07, 0x27, 0x77, 0x89, 0x67, 0x5a, 0xc8, 0xc3, 0x7b, - 0xa8, 0xab, 0xab, 0x1c, 0x48, 0x18, 0x88, 0x3f, 0x2d, 0x59, 0xa2, 0x9f, 0x74, 0xc7, 0xc5, 0x1e, - 0x7b, 0xd5, 0x44, 0x89, 0x7e, 0x52, 0x99, 0x2d, 0xab, 0x8c, 0x5d, 0xd7, 0xe1, 0xe1, 0x9e, 0x29, - 0xa5, 0x5a, 0xd6, 0x2e, 0x5d, 0x2a, 0x0f, 0x93, 0xbe, 0x8f, 0xb8, 0x48, 0xc7, 0xfb, 0x6d, 0x5f, - 0x65, 0x1b, 0x20, 0x61, 0x11, 0xbf, 0xf2, 0x14, 0xa3, 0xfa, 0xbf, 0x4e, 0x8c, 0x5d, 0xaf, 0x86, - 0x5d, 0xdc, 0xb4, 0xf6, 0xdb, 0x25, 0x4a, 0x0b, 0xff, 0x03, 0x26, 0x3c, 0xca, 0xa4, 0x2c, 0xaa, - 0x56, 0x22, 0xae, 0x6a, 0x31, 0x51, 0xa2, 0x6a, 0x65, 0xbd, 0xee, 0x02, 0xee, 0x80, 0x89, 0x86, - 0x8b, 0xab, 0x58, 0xc7, 0x84, 0x38, 0x2e, 0xc9, 0x27, 0x99, 0x83, 0x0e, 0x95, 0x1e, 0xba, 0x44, - 0xb3, 0x6e, 0xa5, 0xee, 0xe8, 0x07, 0x7e, 0x7e, 0x1b, 0x63, 0x4a, 0xce, 0xb2, 0x3d, 0x9e, 0xdd, - 0xe0, 0x1c, 0x00, 0x9c, 0x84, 0x05, 0xe1, 0x38, 0xd3, 0x48, 0x86, 0xed, 0xb0, 0xba, 0x75, 0xd9, - 0x3f, 0xa6, 0xe5, 0x3b, 0x9f, 0x62, 0xcf, 0x90, 0x55, 0x5e, 0xdb, 0x55, 0xbf, 0xb6, 0xab, 0xfb, - 0x7e, 0x6d, 0xdf, 0x9e, 0xa4, 0x4e, 0xf8, 0xf8, 0xbb, 0xa2, 0xc4, 0x1d, 0x91, 0x73, 0xa2, 0xc7, - 0x7d, 0x7d, 0x29, 0xfd, 0xdb, 0xf8, 0x52, 0x26, 0xec, 0x4b, 0x0a, 0x98, 0xe4, 0x6f, 0xb0, 0x50, - 0xbb, 0x4c, 0x1d, 0x04, 0x04, 0xd4, 0x70, 0x1d, 0xb5, 0xf7, 0x10, 0xf9, 0x6f, 0x32, 0x3d, 0x9a, - 0x4b, 0x94, 0xd2, 0x5e, 0xbb, 0x6c, 0xda, 0x55, 0xdc, 0x56, 0xd6, 0x44, 0xea, 0xec, 0xb8, 0x42, - 0x37, 0xaf, 0x55, 0x91, 0x87, 0xfc, 0xf0, 0xa1, 0xdf, 0xca, 0x97, 0x09, 0xf0, 0x97, 0x2e, 0xf1, - 0x36, 0xe5, 0x1a, 0x70, 0x1d, 0xaf, 0xed, 0x67, 0x97, 0xe1, 0xae, 0xe3, 0xb5, 0xc9, 0x6b, 0x70, - 0x9d, 0x3f, 0xad, 0x7e, 0x44, 0xab, 0x2b, 0xe7, 0xc0, 0xa9, 0x88, 0xe1, 0x06, 0x18, 0xfa, 0xc3, - 0x04, 0x98, 0xee, 0xd2, 0xff, 0x51, 0xb3, 0x6a, 0xaf, 0x03, 0x25, 0x7f, 0x07, 0x07, 0xda, 0x79, - 0x45, 0x07, 0x4a, 0xfb, 0x0e, 0x14, 0xf4, 0x9d, 0xa0, 0x71, 0xd3, 0x21, 0xe3, 0x2a, 0xeb, 0xc1, - 0x88, 0xe3, 0x86, 0x18, 0x60, 0xb7, 0xe9, 0x4e, 0x07, 0x47, 0xf0, 0x25, 0x8c, 0xbb, 0xb3, 0xc6, - 0x54, 0x78, 0x5b, 0xb0, 0xb8, 0x00, 0xd2, 0xb4, 0x9c, 0x97, 0x6f, 0x62, 0xd1, 0x21, 0x6d, 0xcf, - 0x7c, 0xfb, 0xbc, 0x38, 0xcd, 0xf5, 0x47, 0xaa, 0x07, 0xaa, 0xe9, 0x68, 0x16, 0xf2, 0x6a, 0xea, - 0x15, 0xdb, 0xa3, 0x9d, 0x1b, 0xbb, 0xad, 0x14, 0x45, 0xcf, 0xba, 0x57, 0x77, 0x2a, 0xa8, 0x7e, - 0xdd, 0xb4, 0xf7, 0x10, 0xb9, 0xe1, 0x9a, 0x9d, 0x86, 0x51, 0xd1, 0x41, 0x21, 0x8e, 0x40, 0x08, - 0xde, 0x02, 0x93, 0x96, 0x69, 0x53, 0x67, 0x2d, 0x37, 0xe8, 0x81, 0x90, 0x3e, 0x47, 0x95, 0x13, - 0x8f, 0x20, 0x6b, 0x75, 0x59, 0x6d, 0x7e, 0x94, 0x03, 0x63, 0x4c, 0x0a, 0xfc, 0x40, 0x02, 0x29, - 0xd1, 0x36, 0xc3, 0xc5, 0xa8, 0xf1, 0xfb, 0xcc, 0x45, 0xf2, 0xd2, 0x30, 0x32, 0x8e, 0x53, 0x39, - 0xfb, 0xde, 0x57, 0x3f, 0x7c, 0x3c, 0xba, 0x08, 0xcf, 0x68, 0x91, 0x99, 0x51, 0xb4, 0xce, 0xda, - 0x1d, 0xe1, 0xd8, 0xf7, 0xe0, 0x27, 0x12, 0x98, 0x0c, 0x4d, 0x27, 0xf0, 0x6c, 0x8c, 0x98, 0x7e, - 0x53, 0x90, 0xbc, 0x7e, 0x34, 0x62, 0x81, 0x6c, 0x93, 0x21, 0x5b, 0x87, 0x6b, 0x51, 0x64, 0xfe, - 0x20, 0x14, 0x01, 0xf8, 0xb9, 0x04, 0x72, 0xbd, 0x83, 0x06, 0x54, 0x63, 0xc4, 0xc6, 0xcc, 0x37, - 0xb2, 0x76, 0x64, 0x7a, 0x81, 0xf4, 0x22, 0x43, 0x7a, 0x01, 0x6e, 0x46, 0x91, 0xb6, 0xfc, 0x3b, - 0x5d, 0xb0, 0xc1, 0xd9, 0xe9, 0x1e, 0xbc, 0x2f, 0x81, 0x94, 0x18, 0x29, 0x62, 0x4d, 0x1b, 0x9e, - 0x56, 0x62, 0x4d, 0xdb, 0x33, 0x99, 0x28, 0xeb, 0x0c, 0xd6, 0x12, 0x5c, 0x88, 0xc2, 0x12, 0x23, - 0x0a, 0x09, 0xa8, 0xee, 0x91, 0x04, 0x52, 0x62, 0xb8, 0x88, 0x05, 0x12, 0x9e, 0x64, 0x62, 0x81, - 0xf4, 0xcc, 0x28, 0xca, 0x06, 0x03, 0x72, 0x16, 0xae, 0x46, 0x81, 0x10, 0x4e, 0xda, 0xc5, 0xa1, - 0xdd, 0x39, 0xc0, 0x87, 0xf7, 0xe0, 0x6d, 0x90, 0xa4, 0x33, 0x08, 0x54, 0x62, 0x5d, 0xa6, 0x33, - 0xd8, 0xc8, 0x67, 0x06, 0xd2, 0x08, 0x0c, 0xab, 0x0c, 0xc3, 0x19, 0x78, 0xba, 0x9f, 0x37, 0x55, - 0x43, 0x9a, 0x78, 0x07, 0x8c, 0xf3, 0x36, 0x1c, 0x2e, 0xc4, 0x70, 0x0e, 0x75, 0xfb, 0xf2, 0xe2, - 0x10, 0x2a, 0x81, 0x60, 0x9e, 0x21, 0x90, 0x61, 0x3e, 0x8a, 0x80, 0xb7, 0xf8, 0xb0, 0x0d, 0x52, - 0xa2, 0xc3, 0x87, 0xf3, 0x51, 0x9e, 0xe1, 0xe6, 0x5f, 0x5e, 0x1e, 0xd6, 0x81, 0xf8, 0x72, 0x15, - 0x26, 0x77, 0x16, 0xca, 0x51, 0xb9, 0xd8, 0xab, 0x95, 0x75, 0x2a, 0xee, 0x5d, 0x90, 0x0d, 0x34, - 0xe1, 0x47, 0x90, 0xde, 0xe7, 0xcd, 0x7d, 0xba, 0x78, 0x65, 0x89, 0xc9, 0x9e, 0x87, 0x85, 0x3e, - 0xb2, 0x05, 0x39, 0x4d, 0x91, 0xf0, 0x2e, 0x48, 0x89, 0xee, 0x2c, 0xd6, 0xf7, 0xc2, 0x8d, 0x7c, - 0xac, 0xef, 0xf5, 0x34, 0x79, 0x83, 0x5e, 0xcf, 0x2b, 0xab, 0xd7, 0x86, 0x0f, 0x24, 0x00, 0xba, - 0x6d, 0x03, 0x5c, 0x19, 0xc4, 0x3a, 0xd8, 0x12, 0xca, 0xab, 0x47, 0xa0, 0x14, 0x38, 0x16, 0x19, - 0x8e, 0x22, 0x9c, 0x8b, 0xc3, 0xc1, 0x6a, 0x25, 0x7c, 0x5f, 0x02, 0x99, 0x4e, 0x21, 0x84, 0xcb, - 0x83, 0xf8, 0x07, 0xcd, 0xb1, 0x32, 0x9c, 0x50, 0xe0, 0x58, 0x60, 0x38, 0x0a, 0x70, 0x36, 0x0e, - 0x07, 0xf3, 0x87, 0xbb, 0x34, 0x29, 0xb1, 0x5a, 0x38, 0x20, 0x29, 0x05, 0x0b, 0xf0, 0x80, 0xa4, - 0x14, 0x2a, 0xc8, 0x83, 0xec, 0xe1, 0x17, 0x6a, 0x1a, 0x80, 0xa2, 0x7b, 0x59, 0x88, 0x0d, 0xed, - 0xc0, 0x0f, 0x8d, 0xb1, 0x01, 0x18, 0xfe, 0xe1, 0x71, 0x50, 0x00, 0xf2, 0xf6, 0x0a, 0x7e, 0x2a, - 0x81, 0x13, 0x91, 0x92, 0x0e, 0xe3, 0xea, 0x41, 0x5c, 0x77, 0x20, 0x9f, 0x3f, 0xfa, 0x05, 0x01, - 0x6d, 0x99, 0x41, 0x3b, 0x0d, 0x8b, 0x51, 0x68, 0xa1, 0x2e, 0x62, 0xfb, 0xe2, 0xd3, 0x17, 0x05, - 0xe9, 0xd9, 0x8b, 0x82, 0xf4, 0xfd, 0x8b, 0x82, 0xf4, 0xf8, 0x65, 0x61, 0xe4, 0xd9, 0xcb, 0xc2, - 0xc8, 0x37, 0x2f, 0x0b, 0x23, 0x6f, 0xcd, 0x47, 0x7b, 0x4d, 0xca, 0xa4, 0x4d, 0xd9, 0xb0, 0x4e, - 0xb3, 0x32, 0xce, 0x9a, 0xb5, 0xbf, 0xfd, 0x12, 0x00, 0x00, 0xff, 0xff, 0xb2, 0xe7, 0xce, 0x3f, - 0xa9, 0x16, 0x00, 0x00, + 0x8f, 0x1e, 0x8a, 0x36, 0x48, 0x90, 0x4b, 0x8a, 0xde, 0xdb, 0x5c, 0x0a, 0xf4, 0xd6, 0xde, 0xfa, + 0x2f, 0xe4, 0x18, 0xa0, 0x28, 0x50, 0xf4, 0x90, 0x16, 0x49, 0x81, 0xf6, 0x6f, 0xe8, 0xa9, 0x98, + 0x0f, 0x4a, 0xa4, 0x28, 0x4a, 0x4e, 0x91, 0xa2, 0x3d, 0x14, 0x30, 0x12, 0xce, 0xcc, 0x9b, 0xf7, + 0x7e, 0xef, 0xcd, 0xfb, 0x14, 0x98, 0xd5, 0x1d, 0x62, 0x39, 0x44, 0xc3, 0x2d, 0x4b, 0xa3, 0x7f, + 0x1b, 0xda, 0xad, 0x26, 0x76, 0x0f, 0xd5, 0x86, 0xeb, 0x78, 0x0e, 0xcc, 0xf1, 0x53, 0x15, 0xb7, + 0x2c, 0x95, 0xfe, 0x6d, 0xc8, 0x27, 0x90, 0x65, 0xda, 0x8e, 0xc6, 0xfe, 0xe5, 0x44, 0xf2, 0x9a, + 0x60, 0x51, 0x41, 0x04, 0xf3, 0xdb, 0x5a, 0x6b, 0xa3, 0x82, 0x3d, 0xb4, 0xa1, 0x35, 0x90, 0x61, + 0xda, 0xc8, 0x33, 0x1d, 0x5b, 0xd0, 0xca, 0x11, 0x71, 0x94, 0x35, 0x3f, 0x9b, 0x89, 0x9c, 0x79, + 0x6d, 0x71, 0x34, 0x65, 0x38, 0x86, 0xc3, 0x3e, 0x35, 0xfa, 0x25, 0x76, 0x67, 0x0d, 0xc7, 0x31, + 0xea, 0x58, 0x43, 0x0d, 0x53, 0x43, 0xb6, 0xed, 0x78, 0x4c, 0x12, 0x11, 0xa7, 0x45, 0x71, 0xca, + 0x56, 0x95, 0xe6, 0x4d, 0xcd, 0x33, 0x2d, 0x4c, 0x3c, 0x64, 0x35, 0x38, 0x81, 0x32, 0x05, 0xe0, + 0xff, 0x29, 0xda, 0x1d, 0xc7, 0xbe, 0x69, 0x1a, 0x25, 0x7c, 0xab, 0x89, 0x89, 0xa7, 0x5c, 0x03, + 0x27, 0x43, 0xbb, 0xa4, 0xe1, 0xd8, 0x04, 0xc3, 0xbf, 0x83, 0x71, 0x9d, 0xed, 0xe4, 0xa5, 0x79, + 0x69, 0x25, 0xbb, 0x39, 0xa7, 0xf6, 0x9a, 0x46, 0xdd, 0xa9, 0x21, 0xd3, 0x16, 0xd7, 0x04, 0xb1, + 0xf2, 0x4f, 0xc1, 0x6d, 0x4b, 0xd7, 0x9d, 0xa6, 0xed, 0x09, 0x21, 0x30, 0x0f, 0x52, 0xa8, 0x5a, + 0x75, 0x31, 0x21, 0x8c, 0x5d, 0xa6, 0xe4, 0x2f, 0x2f, 0xa6, 0x1f, 0x3c, 0x29, 0x8e, 0xfc, 0xf4, + 0xa4, 0x38, 0xa2, 0xe8, 0x60, 0x2a, 0x7c, 0x55, 0x20, 0xc9, 0x83, 0x54, 0x05, 0xd5, 0x91, 0xad, + 0x63, 0xff, 0xae, 0x58, 0xc2, 0xbf, 0x82, 0x8c, 0xee, 0x54, 0x71, 0xb9, 0x86, 0x48, 0x2d, 0x3f, + 0xca, 0xce, 0xd2, 0x74, 0xe3, 0x32, 0x22, 0x35, 0x38, 0x05, 0xc6, 0x6c, 0x87, 0x5e, 0x4a, 0xcc, + 0x4b, 0x2b, 0xc9, 0x12, 0x5f, 0x28, 0xff, 0x06, 0x33, 0x42, 0x5b, 0xaa, 0xcc, 0xaf, 0x40, 0x79, + 0x5f, 0x02, 0x72, 0x3f, 0x0e, 0x02, 0xec, 0x22, 0x38, 0xc6, 0xed, 0x54, 0x0e, 0x73, 0x9a, 0xe4, + 0xbb, 0x5b, 0x7c, 0x13, 0xca, 0x20, 0x4d, 0xa8, 0x50, 0x8a, 0x6f, 0x94, 0xe1, 0xeb, 0xac, 0x29, + 0x0b, 0xc4, 0xb9, 0x96, 0xed, 0xa6, 0x55, 0xc1, 0xae, 0xd0, 0x60, 0x52, 0xec, 0xfe, 0x8f, 0x6d, + 0x2a, 0x57, 0xc1, 0x2c, 0xc3, 0xf1, 0x26, 0xaa, 0x9b, 0x55, 0xe4, 0x39, 0x6e, 0x8f, 0x32, 0xa7, + 0xc1, 0x84, 0xee, 0xd8, 0xbd, 0x38, 0xb2, 0x74, 0x6f, 0x2b, 0xa2, 0xd5, 0x23, 0x09, 0xcc, 0xc5, + 0x70, 0x13, 0x8a, 0x2d, 0x83, 0xe3, 0x3e, 0xaa, 0x30, 0x47, 0x1f, 0xec, 0x6b, 0x54, 0xcd, 0x77, + 0xa2, 0x6d, 0xfe, 0xce, 0xaf, 0xf2, 0x3c, 0xe7, 0x85, 0x13, 0x75, 0xae, 0x0e, 0x73, 0x22, 0xe5, + 0xaa, 0x10, 0xf6, 0x86, 0xe7, 0xb8, 0xc8, 0x18, 0x2e, 0x0c, 0xe6, 0x40, 0xe2, 0x00, 0x1f, 0x0a, + 0x7f, 0xa3, 0x9f, 0x01, 0xf1, 0xeb, 0x42, 0x7c, 0x87, 0x99, 0x10, 0x3f, 0x05, 0xc6, 0x5a, 0xa8, + 0xde, 0xf4, 0x85, 0xf3, 0x85, 0xf2, 0x0f, 0x90, 0x13, 0xae, 0x54, 0x7d, 0x25, 0x25, 0x97, 0xc1, + 0x89, 0xc0, 0x3d, 0x21, 0x02, 0x82, 0x24, 0xf5, 0x7d, 0x76, 0x6b, 0xa2, 0xc4, 0xbe, 0x95, 0xdb, + 0x22, 0xe2, 0xf7, 0xdb, 0xd7, 0x1c, 0x83, 0xf8, 0x22, 0x20, 0x48, 0xb2, 0x88, 0xe1, 0xfc, 0xd9, + 0x37, 0xbc, 0x04, 0x40, 0x37, 0x77, 0x31, 0xdd, 0xb2, 0x9b, 0x4b, 0x7e, 0xc8, 0xd3, 0x44, 0xa7, + 0xf2, 0x34, 0x29, 0x12, 0x9d, 0x7a, 0xa3, 0x6b, 0xaa, 0x52, 0xe0, 0x66, 0x00, 0xe4, 0x43, 0x49, + 0x18, 0xd6, 0x17, 0x2e, 0x70, 0xae, 0x82, 0x64, 0xdd, 0x31, 0xa8, 0x76, 0x89, 0x95, 0xec, 0xe6, + 0x74, 0x34, 0xad, 0x5c, 0x73, 0x8c, 0x12, 0x23, 0x81, 0x7b, 0x7d, 0x40, 0x2d, 0x0f, 0x05, 0xc5, + 0xe5, 0x04, 0x51, 0x75, 0x32, 0xdf, 0x0d, 0xe4, 0x22, 0xcb, 0xb7, 0x83, 0x52, 0x12, 0x00, 0xfd, + 0x5d, 0x01, 0xf0, 0x5f, 0x60, 0xbc, 0xc1, 0x76, 0x44, 0xe6, 0xcb, 0x47, 0x21, 0xf2, 0x1b, 0xdb, + 0x99, 0xa7, 0xcf, 0x8b, 0x23, 0x9f, 0xfd, 0xf8, 0xc5, 0x9a, 0x54, 0x12, 0x57, 0x94, 0xaf, 0x25, + 0x70, 0x6c, 0xd7, 0xab, 0xed, 0xa0, 0x7a, 0x3d, 0x60, 0x6e, 0xe4, 0x1a, 0xc4, 0x7f, 0x18, 0xfa, + 0x0d, 0x4f, 0x81, 0x94, 0x81, 0x48, 0x59, 0x47, 0x0d, 0x11, 0x23, 0xe3, 0x06, 0x22, 0x3b, 0xa8, + 0x01, 0xdf, 0x06, 0xb9, 0x86, 0xeb, 0x34, 0x1c, 0x82, 0xdd, 0x4e, 0x9c, 0xd1, 0x18, 0x99, 0xd8, + 0xde, 0xfc, 0xf9, 0x79, 0x51, 0x35, 0x4c, 0xaf, 0xd6, 0xac, 0xa8, 0xba, 0x63, 0x69, 0xa2, 0x78, + 0xf0, 0xff, 0xce, 0x91, 0xea, 0x81, 0xe6, 0x1d, 0x36, 0x30, 0x51, 0x77, 0xba, 0x01, 0x5e, 0x3a, + 0xee, 0xf3, 0xf2, 0x83, 0x73, 0x06, 0xa4, 0x75, 0x9a, 0xb5, 0xcb, 0x66, 0x35, 0x9f, 0x9c, 0x97, + 0x56, 0x12, 0xa5, 0x14, 0x5b, 0x5f, 0xa9, 0xc2, 0x59, 0x90, 0x71, 0x5a, 0xd8, 0x75, 0xcd, 0x2a, + 0x26, 0xf9, 0x31, 0x86, 0xb5, 0xbb, 0xa1, 0xec, 0x83, 0x93, 0xbb, 0xc4, 0x33, 0x2d, 0xe4, 0xe1, + 0x3d, 0xd4, 0xb5, 0x55, 0x0e, 0x24, 0x0c, 0xc4, 0x55, 0x4b, 0x96, 0xe8, 0x27, 0xdd, 0x71, 0xb1, + 0xc7, 0xb4, 0x9a, 0x28, 0xd1, 0x4f, 0x2a, 0xb3, 0x65, 0x95, 0xb1, 0xeb, 0x3a, 0x3c, 0xdc, 0x33, + 0xa5, 0x54, 0xcb, 0xda, 0xa5, 0x4b, 0xe5, 0x61, 0xd2, 0xf7, 0x11, 0x17, 0xe9, 0x78, 0xbf, 0xed, + 0x9b, 0x6c, 0x03, 0x24, 0x2c, 0xe2, 0x57, 0x9e, 0x62, 0xd4, 0xfe, 0xd7, 0x89, 0xb1, 0xeb, 0xd5, + 0xb0, 0x8b, 0x9b, 0xd6, 0x7e, 0xbb, 0x44, 0x69, 0xe1, 0x7f, 0xc0, 0x84, 0x47, 0x99, 0x94, 0x45, + 0xd5, 0x4a, 0xc4, 0x55, 0x2d, 0x26, 0x4a, 0x54, 0xad, 0xac, 0xd7, 0x5d, 0xc0, 0x1d, 0x30, 0xd1, + 0x70, 0x71, 0x15, 0xeb, 0x98, 0x10, 0xc7, 0x25, 0xf9, 0x24, 0x73, 0xd0, 0xa1, 0xd2, 0x43, 0x97, + 0x68, 0xd6, 0xad, 0xd4, 0x1d, 0xfd, 0xc0, 0xcf, 0x6f, 0x63, 0xcc, 0xc8, 0x59, 0xb6, 0xc7, 0xb3, + 0x1b, 0x9c, 0x03, 0x80, 0x93, 0xb0, 0x20, 0x1c, 0x67, 0x16, 0xc9, 0xb0, 0x1d, 0x56, 0xb7, 0x2e, + 0xfb, 0xc7, 0xb4, 0x7c, 0xe7, 0x53, 0x4c, 0x0d, 0x59, 0xe5, 0xb5, 0x5d, 0xf5, 0x6b, 0xbb, 0xba, + 0xef, 0xd7, 0xf6, 0xed, 0x49, 0xea, 0x84, 0x8f, 0xbf, 0x2b, 0x4a, 0xdc, 0x11, 0x39, 0x27, 0x7a, + 0xdc, 0xd7, 0x97, 0xd2, 0xbf, 0x8d, 0x2f, 0x65, 0xc2, 0xbe, 0xa4, 0x80, 0x49, 0xae, 0x83, 0x85, + 0xda, 0x65, 0xea, 0x20, 0x20, 0x60, 0x86, 0xeb, 0xa8, 0xbd, 0x87, 0xc8, 0x7f, 0x93, 0xe9, 0xd1, + 0x5c, 0xa2, 0x94, 0xf6, 0xda, 0x65, 0xd3, 0xae, 0xe2, 0xb6, 0xb2, 0x26, 0x52, 0x67, 0xc7, 0x15, + 0xba, 0x79, 0xad, 0x8a, 0x3c, 0xe4, 0x87, 0x0f, 0xfd, 0x56, 0xbe, 0x4c, 0x80, 0xbf, 0x74, 0x89, + 0xb7, 0x29, 0xd7, 0x80, 0xeb, 0x78, 0x6d, 0x3f, 0xbb, 0x0c, 0x77, 0x1d, 0xaf, 0x4d, 0x5e, 0x83, + 0xeb, 0xfc, 0xf9, 0xea, 0x47, 0x7c, 0x75, 0xe5, 0x1c, 0x38, 0x15, 0x79, 0xb8, 0x01, 0x0f, 0xfd, + 0x69, 0x02, 0x4c, 0x77, 0xe9, 0xff, 0xa8, 0x59, 0xb5, 0xd7, 0x81, 0x92, 0xbf, 0x83, 0x03, 0xed, + 0xbc, 0xa2, 0x03, 0xa5, 0x7d, 0x07, 0x0a, 0xfa, 0x4e, 0xf0, 0x71, 0xd3, 0x03, 0xca, 0x43, 0xa6, + 0xb7, 0x3c, 0xac, 0x07, 0xe3, 0x91, 0x3f, 0xd3, 0x80, 0x57, 0x9d, 0xee, 0xf4, 0x77, 0x04, 0x5f, + 0xc2, 0xb8, 0x3b, 0x89, 0x4c, 0x85, 0xb7, 0x05, 0x8b, 0x0b, 0x20, 0x4d, 0x8b, 0x7d, 0xf9, 0x26, + 0x16, 0xfd, 0xd3, 0xf6, 0xcc, 0xb7, 0xcf, 0x8b, 0xd3, 0xdc, 0xba, 0xa4, 0x7a, 0xa0, 0x9a, 0x8e, + 0x66, 0x21, 0xaf, 0xa6, 0x5e, 0xb1, 0x3d, 0xda, 0xd7, 0xb1, 0xdb, 0x4a, 0x51, 0x74, 0xb4, 0x7b, + 0x75, 0xa7, 0x82, 0xea, 0xd7, 0x4d, 0x7b, 0x0f, 0x91, 0x1b, 0xae, 0xd9, 0x69, 0x27, 0x15, 0x1d, + 0x14, 0xe2, 0x08, 0x84, 0xe0, 0x2d, 0x30, 0x69, 0x99, 0x36, 0x75, 0xe5, 0x72, 0x83, 0x1e, 0x08, + 0xe9, 0x73, 0xd4, 0x74, 0xf1, 0x08, 0xb2, 0x56, 0x97, 0xd5, 0xe6, 0x87, 0x39, 0x30, 0xc6, 0xa4, + 0xc0, 0x0f, 0x24, 0x90, 0x12, 0x4d, 0x35, 0x5c, 0x8c, 0xba, 0x46, 0x9f, 0xa9, 0x49, 0x5e, 0x1a, + 0x46, 0xc6, 0x71, 0x2a, 0x67, 0xdf, 0xfb, 0xea, 0x87, 0x8f, 0x46, 0x17, 0xe1, 0x19, 0x2d, 0x32, + 0x51, 0x8a, 0xc6, 0x5a, 0xbb, 0x23, 0xdc, 0xfe, 0x1e, 0xfc, 0x58, 0x02, 0x93, 0xa1, 0xd9, 0x05, + 0x9e, 0x8d, 0x11, 0xd3, 0x6f, 0x46, 0x92, 0xd7, 0x8f, 0x46, 0x2c, 0x90, 0x6d, 0x32, 0x64, 0xeb, + 0x70, 0x2d, 0x8a, 0xcc, 0x1f, 0x93, 0x22, 0x00, 0x3f, 0x97, 0x40, 0xae, 0x77, 0x0c, 0x81, 0x6a, + 0x8c, 0xd8, 0x98, 0xe9, 0x47, 0xd6, 0x8e, 0x4c, 0x2f, 0x90, 0x5e, 0x64, 0x48, 0x2f, 0xc0, 0xcd, + 0x28, 0xd2, 0x96, 0x7f, 0xa7, 0x0b, 0x36, 0x38, 0x59, 0xdd, 0x83, 0xf7, 0x25, 0x90, 0x12, 0x03, + 0x47, 0xec, 0xd3, 0x86, 0x67, 0x99, 0xd8, 0xa7, 0xed, 0x99, 0x5b, 0x94, 0x75, 0x06, 0x6b, 0x09, + 0x2e, 0x44, 0x61, 0x89, 0x01, 0x86, 0x04, 0x4c, 0xf7, 0x48, 0x02, 0x29, 0x31, 0x7a, 0xc4, 0x02, + 0x09, 0xcf, 0x39, 0xb1, 0x40, 0x7a, 0x26, 0x18, 0x65, 0x83, 0x01, 0x39, 0x0b, 0x57, 0xa3, 0x40, + 0x08, 0x27, 0xed, 0xe2, 0xd0, 0xee, 0x1c, 0xe0, 0xc3, 0x7b, 0xf0, 0x36, 0x48, 0xd2, 0x09, 0x05, + 0x2a, 0xb1, 0x2e, 0xd3, 0x19, 0x7b, 0xe4, 0x33, 0x03, 0x69, 0x04, 0x86, 0x55, 0x86, 0xe1, 0x0c, + 0x3c, 0xdd, 0xcf, 0x9b, 0xaa, 0x21, 0x4b, 0xbc, 0x03, 0xc6, 0x79, 0x93, 0x0e, 0x17, 0x62, 0x38, + 0x87, 0x66, 0x01, 0x79, 0x71, 0x08, 0x95, 0x40, 0x30, 0xcf, 0x10, 0xc8, 0x30, 0x1f, 0x45, 0xc0, + 0x07, 0x00, 0xd8, 0x06, 0x29, 0xd1, 0xff, 0xc3, 0xf9, 0x28, 0xcf, 0xf0, 0x68, 0x20, 0x2f, 0x0f, + 0xeb, 0x4f, 0x7c, 0xb9, 0x0a, 0x93, 0x3b, 0x0b, 0xe5, 0xa8, 0x5c, 0xec, 0xd5, 0xca, 0x3a, 0x15, + 0xf7, 0x2e, 0xc8, 0x06, 0x5a, 0xf4, 0x23, 0x48, 0xef, 0xa3, 0x73, 0x9f, 0x1e, 0x5f, 0x59, 0x62, + 0xb2, 0xe7, 0x61, 0xa1, 0x8f, 0x6c, 0x41, 0x4e, 0x53, 0x24, 0xbc, 0x0b, 0x52, 0xa2, 0x77, 0x8b, + 0xf5, 0xbd, 0x70, 0x9b, 0x1f, 0xeb, 0x7b, 0x3d, 0x2d, 0xe0, 0x20, 0xed, 0x79, 0xdd, 0xf5, 0xda, + 0xf0, 0x81, 0x04, 0x40, 0xb7, 0xa9, 0x80, 0x2b, 0x83, 0x58, 0x07, 0x1b, 0x46, 0x79, 0xf5, 0x08, + 0x94, 0x02, 0xc7, 0x22, 0xc3, 0x51, 0x84, 0x73, 0x71, 0x38, 0x58, 0x25, 0x85, 0xef, 0x4b, 0x20, + 0xd3, 0x29, 0x84, 0x70, 0x79, 0x10, 0xff, 0xe0, 0x73, 0xac, 0x0c, 0x27, 0x14, 0x38, 0x16, 0x18, + 0x8e, 0x02, 0x9c, 0x8d, 0xc3, 0xc1, 0xfc, 0xe1, 0x2e, 0x4d, 0x4a, 0xac, 0x16, 0x0e, 0x48, 0x4a, + 0xc1, 0x02, 0x3c, 0x20, 0x29, 0x85, 0x0a, 0xf2, 0xa0, 0xf7, 0xf0, 0x0b, 0x35, 0x0d, 0x40, 0xd1, + 0xdb, 0x2c, 0xc4, 0x86, 0x76, 0xe0, 0x67, 0xc8, 0xd8, 0x00, 0x0c, 0xff, 0x2c, 0x39, 0x28, 0x00, + 0x79, 0xf3, 0x05, 0x3f, 0x91, 0xc0, 0x89, 0x48, 0x49, 0x87, 0x71, 0xf5, 0x20, 0xae, 0x3b, 0x90, + 0xcf, 0x1f, 0xfd, 0x82, 0x80, 0xb6, 0xcc, 0xa0, 0x9d, 0x86, 0xc5, 0x28, 0xb4, 0x50, 0x17, 0xb1, + 0x7d, 0xf1, 0xe9, 0x8b, 0x82, 0xf4, 0xec, 0x45, 0x41, 0xfa, 0xfe, 0x45, 0x41, 0x7a, 0xfc, 0xb2, + 0x30, 0xf2, 0xec, 0x65, 0x61, 0xe4, 0x9b, 0x97, 0x85, 0x91, 0xb7, 0xe6, 0xa3, 0x9d, 0x28, 0x65, + 0xd2, 0xa6, 0x6c, 0x58, 0x1f, 0x5a, 0x19, 0x67, 0xad, 0xdc, 0xdf, 0x7e, 0x09, 0x00, 0x00, 0xff, + 0xff, 0xe5, 0x54, 0x5a, 0x79, 0xc7, 0x16, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -3389,6 +3398,13 @@ func (m *QueryTraceCallRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if len(m.Overrides) > 0 { + i -= len(m.Overrides) + copy(dAtA[i:], m.Overrides) + i = encodeVarintQuery(dAtA, i, uint64(len(m.Overrides))) + i-- + dAtA[i] = 0x4a + } if m.ChainId != 0 { i = encodeVarintQuery(dAtA, i, uint64(m.ChainId)) i-- @@ -4046,6 +4062,10 @@ func (m *QueryTraceCallRequest) Size() (n int) { if m.ChainId != 0 { n += 1 + sovQuery(uint64(m.ChainId)) } + l = len(m.Overrides) + if l > 0 { + n += 1 + l + sovQuery(uint64(l)) + } return n } @@ -7098,6 +7118,40 @@ func (m *QueryTraceCallRequest) Unmarshal(dAtA []byte) error { break } } + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Overrides", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Overrides = append(m.Overrides[:0], dAtA[iNdEx:postIndex]...) + if m.Overrides == nil { + m.Overrides = []byte{} + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipQuery(dAtA[iNdEx:]) diff --git a/x/vm/types/tx.pb.go b/x/vm/types/tx.pb.go index 4247dfe4db..87ebd9b66c 100644 --- a/x/vm/types/tx.pb.go +++ b/x/vm/types/tx.pb.go @@ -131,9 +131,9 @@ type MsgEthereumTxResponse struct { // max_used_gas specifies the gas consumed by the transaction, not including // refunds MaxUsedGas uint64 `protobuf:"varint,6,opt,name=max_used_gas,json=maxUsedGas,proto3" json:"max_used_gas,omitempty"` - // include the block hash for json-rpc to use + // block_hash is included for json-rpc to use BlockHash []byte `protobuf:"bytes,7,opt,name=block_hash,json=blockHash,proto3" json:"block_hash,omitempty"` - // include the block timestamp for json-rpc to use + // block_timestamp is included for json-rpc to use BlockTimestamp uint64 `protobuf:"varint,8,opt,name=block_timestamp,json=blockTimestamp,proto3" json:"block_timestamp,omitempty"` }