diff --git a/node/cmd/guardiand/adminserver.go b/node/cmd/guardiand/adminserver.go index 1ca6084d4..a05cc6895 100644 --- a/node/cmd/guardiand/adminserver.go +++ b/node/cmd/guardiand/adminserver.go @@ -162,6 +162,43 @@ func tokenBridgeUpgradeContract(req *nodev1.BridgeUpgradeContract, timestamp tim return v, nil } +// wormchainStoreCode converts a nodev1.WormchainStoreCode to its canonical VAA representation +// Returns an error if the data is invalid +func wormchainStoreCode(req *nodev1.WormchainStoreCode, timestamp time.Time, guardianSetIndex uint32, nonce uint32, sequence uint64) (*vaa.VAA, error) { + // validate the length of the hex passed in + b, err := hex.DecodeString(req.WasmHash) + if err != nil { + return nil, fmt.Errorf("invalid cosmwasm bytecode hash (expected hex): %w", err) + } + + if len(b) != 32 { + return nil, fmt.Errorf("invalid cosmwasm bytecode hash (expected 32 bytes but received %d bytes)", len(b)) + } + + wasmHash := [32]byte{} + copy(wasmHash[:], b) + + v := vaa.CreateGovernanceVAA(timestamp, nonce, sequence, guardianSetIndex, + vaa.BodyWormchainStoreCode{ + WasmHash: wasmHash, + }.Serialize()) + + return v, nil +} + +// wormchainInstantiateContract converts a nodev1.WormchainInstantiateContract to its canonical VAA representation +// Returns an error if the data is invalid +func wormchainInstantiateContract(req *nodev1.WormchainInstantiateContract, timestamp time.Time, guardianSetIndex uint32, nonce uint32, sequence uint64) (*vaa.VAA, error) { + instantiationParams_hash := vaa.CreateInstatiateCosmwasmContractHash(req.CodeId, req.Label, []byte(req.InstantiationMsg)) + + v := vaa.CreateGovernanceVAA(timestamp, nonce, sequence, guardianSetIndex, + vaa.BodyWormchainInstantiateContract{ + InstantiationParamsHash: instantiationParams_hash, + }.Serialize()) + + return v, nil +} + func (s *nodePrivilegedService) InjectGovernanceVAA(ctx context.Context, req *nodev1.InjectGovernanceVAARequest) (*nodev1.InjectGovernanceVAAResponse, error) { s.logger.Info("governance VAA injected via admin socket", zap.String("request", req.String())) @@ -184,6 +221,10 @@ func (s *nodePrivilegedService) InjectGovernanceVAA(ctx context.Context, req *no v, err = tokenBridgeRegisterChain(payload.BridgeRegisterChain, timestamp, req.CurrentSetIndex, message.Nonce, message.Sequence) case *nodev1.GovernanceMessage_BridgeContractUpgrade: v, err = tokenBridgeUpgradeContract(payload.BridgeContractUpgrade, timestamp, req.CurrentSetIndex, message.Nonce, message.Sequence) + case *nodev1.GovernanceMessage_WormchainStoreCode: + v, err = wormchainStoreCode(payload.WormchainStoreCode, timestamp, req.CurrentSetIndex, message.Nonce, message.Sequence) + case *nodev1.GovernanceMessage_WormchainInstantiateContract: + v, err = wormchainInstantiateContract(payload.WormchainInstantiateContract, timestamp, req.CurrentSetIndex, message.Nonce, message.Sequence) default: panic(fmt.Sprintf("unsupported VAA type: %T", payload)) } diff --git a/node/pkg/proto/node/v1/node.pb.go b/node/pkg/proto/node/v1/node.pb.go index a0adb96c5..e457230e8 100644 --- a/node/pkg/proto/node/v1/node.pb.go +++ b/node/pkg/proto/node/v1/node.pb.go @@ -106,6 +106,8 @@ type GovernanceMessage struct { // *GovernanceMessage_ContractUpgrade // *GovernanceMessage_BridgeRegisterChain // *GovernanceMessage_BridgeContractUpgrade + // *GovernanceMessage_WormchainStoreCode + // *GovernanceMessage_WormchainInstantiateContract Payload isGovernanceMessage_Payload `protobuf_oneof:"payload"` } @@ -190,6 +192,20 @@ func (x *GovernanceMessage) GetBridgeContractUpgrade() *BridgeUpgradeContract { return nil } +func (x *GovernanceMessage) GetWormchainStoreCode() *WormchainStoreCode { + if x, ok := x.GetPayload().(*GovernanceMessage_WormchainStoreCode); ok { + return x.WormchainStoreCode + } + return nil +} + +func (x *GovernanceMessage) GetWormchainInstantiateContract() *WormchainInstantiateContract { + if x, ok := x.GetPayload().(*GovernanceMessage_WormchainInstantiateContract); ok { + return x.WormchainInstantiateContract + } + return nil +} + type isGovernanceMessage_Payload interface { isGovernanceMessage_Payload() } @@ -210,6 +226,14 @@ type GovernanceMessage_BridgeContractUpgrade struct { BridgeContractUpgrade *BridgeUpgradeContract `protobuf:"bytes,13,opt,name=bridge_contract_upgrade,json=bridgeContractUpgrade,proto3,oneof"` } +type GovernanceMessage_WormchainStoreCode struct { + WormchainStoreCode *WormchainStoreCode `protobuf:"bytes,14,opt,name=wormchain_store_code,json=wormchainStoreCode,proto3,oneof"` +} + +type GovernanceMessage_WormchainInstantiateContract struct { + WormchainInstantiateContract *WormchainInstantiateContract `protobuf:"bytes,15,opt,name=wormchain_instantiate_contract,json=wormchainInstantiateContract,proto3,oneof"` +} + func (*GovernanceMessage_GuardianSet) isGovernanceMessage_Payload() {} func (*GovernanceMessage_ContractUpgrade) isGovernanceMessage_Payload() {} @@ -218,6 +242,10 @@ func (*GovernanceMessage_BridgeRegisterChain) isGovernanceMessage_Payload() {} func (*GovernanceMessage_BridgeContractUpgrade) isGovernanceMessage_Payload() {} +func (*GovernanceMessage_WormchainStoreCode) isGovernanceMessage_Payload() {} + +func (*GovernanceMessage_WormchainInstantiateContract) isGovernanceMessage_Payload() {} + type InjectGovernanceVAAResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -564,6 +592,120 @@ func (x *BridgeUpgradeContract) GetNewContract() string { return "" } +type WormchainStoreCode struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // payload is the hex string of the sha3 256 hash of the wasm binary being uploaded + WasmHash string `protobuf:"bytes,1,opt,name=wasm_hash,json=wasmHash,proto3" json:"wasm_hash,omitempty"` +} + +func (x *WormchainStoreCode) Reset() { + *x = WormchainStoreCode{} + if protoimpl.UnsafeEnabled { + mi := &file_node_v1_node_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *WormchainStoreCode) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*WormchainStoreCode) ProtoMessage() {} + +func (x *WormchainStoreCode) ProtoReflect() protoreflect.Message { + mi := &file_node_v1_node_proto_msgTypes[8] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use WormchainStoreCode.ProtoReflect.Descriptor instead. +func (*WormchainStoreCode) Descriptor() ([]byte, []int) { + return file_node_v1_node_proto_rawDescGZIP(), []int{8} +} + +func (x *WormchainStoreCode) GetWasmHash() string { + if x != nil { + return x.WasmHash + } + return "" +} + +type WormchainInstantiateContract struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // CodeID is the reference to the stored WASM code + CodeId uint64 `protobuf:"varint,1,opt,name=code_id,json=codeId,proto3" json:"code_id,omitempty"` + // Label is optional metadata to be stored with a contract instance. + Label string `protobuf:"bytes,2,opt,name=label,proto3" json:"label,omitempty"` + // Json encoded message to be passed to the contract on instantiation + InstantiationMsg string `protobuf:"bytes,3,opt,name=instantiation_msg,json=instantiationMsg,proto3" json:"instantiation_msg,omitempty"` +} + +func (x *WormchainInstantiateContract) Reset() { + *x = WormchainInstantiateContract{} + if protoimpl.UnsafeEnabled { + mi := &file_node_v1_node_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *WormchainInstantiateContract) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*WormchainInstantiateContract) ProtoMessage() {} + +func (x *WormchainInstantiateContract) ProtoReflect() protoreflect.Message { + mi := &file_node_v1_node_proto_msgTypes[9] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use WormchainInstantiateContract.ProtoReflect.Descriptor instead. +func (*WormchainInstantiateContract) Descriptor() ([]byte, []int) { + return file_node_v1_node_proto_rawDescGZIP(), []int{9} +} + +func (x *WormchainInstantiateContract) GetCodeId() uint64 { + if x != nil { + return x.CodeId + } + return 0 +} + +func (x *WormchainInstantiateContract) GetLabel() string { + if x != nil { + return x.Label + } + return "" +} + +func (x *WormchainInstantiateContract) GetInstantiationMsg() string { + if x != nil { + return x.InstantiationMsg + } + return "" +} + type FindMissingMessagesRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -582,7 +724,7 @@ type FindMissingMessagesRequest struct { func (x *FindMissingMessagesRequest) Reset() { *x = FindMissingMessagesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_node_v1_node_proto_msgTypes[8] + mi := &file_node_v1_node_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -595,7 +737,7 @@ func (x *FindMissingMessagesRequest) String() string { func (*FindMissingMessagesRequest) ProtoMessage() {} func (x *FindMissingMessagesRequest) ProtoReflect() protoreflect.Message { - mi := &file_node_v1_node_proto_msgTypes[8] + mi := &file_node_v1_node_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -608,7 +750,7 @@ func (x *FindMissingMessagesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use FindMissingMessagesRequest.ProtoReflect.Descriptor instead. func (*FindMissingMessagesRequest) Descriptor() ([]byte, []int) { - return file_node_v1_node_proto_rawDescGZIP(), []int{8} + return file_node_v1_node_proto_rawDescGZIP(), []int{10} } func (x *FindMissingMessagesRequest) GetEmitterChain() uint32 { @@ -654,7 +796,7 @@ type FindMissingMessagesResponse struct { func (x *FindMissingMessagesResponse) Reset() { *x = FindMissingMessagesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_node_v1_node_proto_msgTypes[9] + mi := &file_node_v1_node_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -667,7 +809,7 @@ func (x *FindMissingMessagesResponse) String() string { func (*FindMissingMessagesResponse) ProtoMessage() {} func (x *FindMissingMessagesResponse) ProtoReflect() protoreflect.Message { - mi := &file_node_v1_node_proto_msgTypes[9] + mi := &file_node_v1_node_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -680,7 +822,7 @@ func (x *FindMissingMessagesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use FindMissingMessagesResponse.ProtoReflect.Descriptor instead. func (*FindMissingMessagesResponse) Descriptor() ([]byte, []int) { - return file_node_v1_node_proto_rawDescGZIP(), []int{9} + return file_node_v1_node_proto_rawDescGZIP(), []int{11} } func (x *FindMissingMessagesResponse) GetMissingMessages() []string { @@ -715,7 +857,7 @@ type SendObservationRequestRequest struct { func (x *SendObservationRequestRequest) Reset() { *x = SendObservationRequestRequest{} if protoimpl.UnsafeEnabled { - mi := &file_node_v1_node_proto_msgTypes[10] + mi := &file_node_v1_node_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -728,7 +870,7 @@ func (x *SendObservationRequestRequest) String() string { func (*SendObservationRequestRequest) ProtoMessage() {} func (x *SendObservationRequestRequest) ProtoReflect() protoreflect.Message { - mi := &file_node_v1_node_proto_msgTypes[10] + mi := &file_node_v1_node_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -741,7 +883,7 @@ func (x *SendObservationRequestRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SendObservationRequestRequest.ProtoReflect.Descriptor instead. func (*SendObservationRequestRequest) Descriptor() ([]byte, []int) { - return file_node_v1_node_proto_rawDescGZIP(), []int{10} + return file_node_v1_node_proto_rawDescGZIP(), []int{12} } func (x *SendObservationRequestRequest) GetObservationRequest() *v1.ObservationRequest { @@ -760,7 +902,7 @@ type SendObservationRequestResponse struct { func (x *SendObservationRequestResponse) Reset() { *x = SendObservationRequestResponse{} if protoimpl.UnsafeEnabled { - mi := &file_node_v1_node_proto_msgTypes[11] + mi := &file_node_v1_node_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -773,7 +915,7 @@ func (x *SendObservationRequestResponse) String() string { func (*SendObservationRequestResponse) ProtoMessage() {} func (x *SendObservationRequestResponse) ProtoReflect() protoreflect.Message { - mi := &file_node_v1_node_proto_msgTypes[11] + mi := &file_node_v1_node_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -786,7 +928,7 @@ func (x *SendObservationRequestResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SendObservationRequestResponse.ProtoReflect.Descriptor instead. func (*SendObservationRequestResponse) Descriptor() ([]byte, []int) { - return file_node_v1_node_proto_rawDescGZIP(), []int{11} + return file_node_v1_node_proto_rawDescGZIP(), []int{13} } type ChainGovernorStatusRequest struct { @@ -798,7 +940,7 @@ type ChainGovernorStatusRequest struct { func (x *ChainGovernorStatusRequest) Reset() { *x = ChainGovernorStatusRequest{} if protoimpl.UnsafeEnabled { - mi := &file_node_v1_node_proto_msgTypes[12] + mi := &file_node_v1_node_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -811,7 +953,7 @@ func (x *ChainGovernorStatusRequest) String() string { func (*ChainGovernorStatusRequest) ProtoMessage() {} func (x *ChainGovernorStatusRequest) ProtoReflect() protoreflect.Message { - mi := &file_node_v1_node_proto_msgTypes[12] + mi := &file_node_v1_node_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -824,7 +966,7 @@ func (x *ChainGovernorStatusRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ChainGovernorStatusRequest.ProtoReflect.Descriptor instead. func (*ChainGovernorStatusRequest) Descriptor() ([]byte, []int) { - return file_node_v1_node_proto_rawDescGZIP(), []int{12} + return file_node_v1_node_proto_rawDescGZIP(), []int{14} } type ChainGovernorStatusResponse struct { @@ -838,7 +980,7 @@ type ChainGovernorStatusResponse struct { func (x *ChainGovernorStatusResponse) Reset() { *x = ChainGovernorStatusResponse{} if protoimpl.UnsafeEnabled { - mi := &file_node_v1_node_proto_msgTypes[13] + mi := &file_node_v1_node_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -851,7 +993,7 @@ func (x *ChainGovernorStatusResponse) String() string { func (*ChainGovernorStatusResponse) ProtoMessage() {} func (x *ChainGovernorStatusResponse) ProtoReflect() protoreflect.Message { - mi := &file_node_v1_node_proto_msgTypes[13] + mi := &file_node_v1_node_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -864,7 +1006,7 @@ func (x *ChainGovernorStatusResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ChainGovernorStatusResponse.ProtoReflect.Descriptor instead. func (*ChainGovernorStatusResponse) Descriptor() ([]byte, []int) { - return file_node_v1_node_proto_rawDescGZIP(), []int{13} + return file_node_v1_node_proto_rawDescGZIP(), []int{15} } func (x *ChainGovernorStatusResponse) GetResponse() string { @@ -883,7 +1025,7 @@ type ChainGovernorReloadRequest struct { func (x *ChainGovernorReloadRequest) Reset() { *x = ChainGovernorReloadRequest{} if protoimpl.UnsafeEnabled { - mi := &file_node_v1_node_proto_msgTypes[14] + mi := &file_node_v1_node_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -896,7 +1038,7 @@ func (x *ChainGovernorReloadRequest) String() string { func (*ChainGovernorReloadRequest) ProtoMessage() {} func (x *ChainGovernorReloadRequest) ProtoReflect() protoreflect.Message { - mi := &file_node_v1_node_proto_msgTypes[14] + mi := &file_node_v1_node_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -909,7 +1051,7 @@ func (x *ChainGovernorReloadRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ChainGovernorReloadRequest.ProtoReflect.Descriptor instead. func (*ChainGovernorReloadRequest) Descriptor() ([]byte, []int) { - return file_node_v1_node_proto_rawDescGZIP(), []int{14} + return file_node_v1_node_proto_rawDescGZIP(), []int{16} } type ChainGovernorReloadResponse struct { @@ -923,7 +1065,7 @@ type ChainGovernorReloadResponse struct { func (x *ChainGovernorReloadResponse) Reset() { *x = ChainGovernorReloadResponse{} if protoimpl.UnsafeEnabled { - mi := &file_node_v1_node_proto_msgTypes[15] + mi := &file_node_v1_node_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -936,7 +1078,7 @@ func (x *ChainGovernorReloadResponse) String() string { func (*ChainGovernorReloadResponse) ProtoMessage() {} func (x *ChainGovernorReloadResponse) ProtoReflect() protoreflect.Message { - mi := &file_node_v1_node_proto_msgTypes[15] + mi := &file_node_v1_node_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -949,7 +1091,7 @@ func (x *ChainGovernorReloadResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ChainGovernorReloadResponse.ProtoReflect.Descriptor instead. func (*ChainGovernorReloadResponse) Descriptor() ([]byte, []int) { - return file_node_v1_node_proto_rawDescGZIP(), []int{15} + return file_node_v1_node_proto_rawDescGZIP(), []int{17} } func (x *ChainGovernorReloadResponse) GetResponse() string { @@ -970,7 +1112,7 @@ type ChainGovernorDropPendingVAARequest struct { func (x *ChainGovernorDropPendingVAARequest) Reset() { *x = ChainGovernorDropPendingVAARequest{} if protoimpl.UnsafeEnabled { - mi := &file_node_v1_node_proto_msgTypes[16] + mi := &file_node_v1_node_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -983,7 +1125,7 @@ func (x *ChainGovernorDropPendingVAARequest) String() string { func (*ChainGovernorDropPendingVAARequest) ProtoMessage() {} func (x *ChainGovernorDropPendingVAARequest) ProtoReflect() protoreflect.Message { - mi := &file_node_v1_node_proto_msgTypes[16] + mi := &file_node_v1_node_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -996,7 +1138,7 @@ func (x *ChainGovernorDropPendingVAARequest) ProtoReflect() protoreflect.Message // Deprecated: Use ChainGovernorDropPendingVAARequest.ProtoReflect.Descriptor instead. func (*ChainGovernorDropPendingVAARequest) Descriptor() ([]byte, []int) { - return file_node_v1_node_proto_rawDescGZIP(), []int{16} + return file_node_v1_node_proto_rawDescGZIP(), []int{18} } func (x *ChainGovernorDropPendingVAARequest) GetVaaId() string { @@ -1017,7 +1159,7 @@ type ChainGovernorDropPendingVAAResponse struct { func (x *ChainGovernorDropPendingVAAResponse) Reset() { *x = ChainGovernorDropPendingVAAResponse{} if protoimpl.UnsafeEnabled { - mi := &file_node_v1_node_proto_msgTypes[17] + mi := &file_node_v1_node_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1030,7 +1172,7 @@ func (x *ChainGovernorDropPendingVAAResponse) String() string { func (*ChainGovernorDropPendingVAAResponse) ProtoMessage() {} func (x *ChainGovernorDropPendingVAAResponse) ProtoReflect() protoreflect.Message { - mi := &file_node_v1_node_proto_msgTypes[17] + mi := &file_node_v1_node_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1043,7 +1185,7 @@ func (x *ChainGovernorDropPendingVAAResponse) ProtoReflect() protoreflect.Messag // Deprecated: Use ChainGovernorDropPendingVAAResponse.ProtoReflect.Descriptor instead. func (*ChainGovernorDropPendingVAAResponse) Descriptor() ([]byte, []int) { - return file_node_v1_node_proto_rawDescGZIP(), []int{17} + return file_node_v1_node_proto_rawDescGZIP(), []int{19} } func (x *ChainGovernorDropPendingVAAResponse) GetResponse() string { @@ -1064,7 +1206,7 @@ type ChainGovernorReleasePendingVAARequest struct { func (x *ChainGovernorReleasePendingVAARequest) Reset() { *x = ChainGovernorReleasePendingVAARequest{} if protoimpl.UnsafeEnabled { - mi := &file_node_v1_node_proto_msgTypes[18] + mi := &file_node_v1_node_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1077,7 +1219,7 @@ func (x *ChainGovernorReleasePendingVAARequest) String() string { func (*ChainGovernorReleasePendingVAARequest) ProtoMessage() {} func (x *ChainGovernorReleasePendingVAARequest) ProtoReflect() protoreflect.Message { - mi := &file_node_v1_node_proto_msgTypes[18] + mi := &file_node_v1_node_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1090,7 +1232,7 @@ func (x *ChainGovernorReleasePendingVAARequest) ProtoReflect() protoreflect.Mess // Deprecated: Use ChainGovernorReleasePendingVAARequest.ProtoReflect.Descriptor instead. func (*ChainGovernorReleasePendingVAARequest) Descriptor() ([]byte, []int) { - return file_node_v1_node_proto_rawDescGZIP(), []int{18} + return file_node_v1_node_proto_rawDescGZIP(), []int{20} } func (x *ChainGovernorReleasePendingVAARequest) GetVaaId() string { @@ -1111,7 +1253,7 @@ type ChainGovernorReleasePendingVAAResponse struct { func (x *ChainGovernorReleasePendingVAAResponse) Reset() { *x = ChainGovernorReleasePendingVAAResponse{} if protoimpl.UnsafeEnabled { - mi := &file_node_v1_node_proto_msgTypes[19] + mi := &file_node_v1_node_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1124,7 +1266,7 @@ func (x *ChainGovernorReleasePendingVAAResponse) String() string { func (*ChainGovernorReleasePendingVAAResponse) ProtoMessage() {} func (x *ChainGovernorReleasePendingVAAResponse) ProtoReflect() protoreflect.Message { - mi := &file_node_v1_node_proto_msgTypes[19] + mi := &file_node_v1_node_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1137,7 +1279,7 @@ func (x *ChainGovernorReleasePendingVAAResponse) ProtoReflect() protoreflect.Mes // Deprecated: Use ChainGovernorReleasePendingVAAResponse.ProtoReflect.Descriptor instead. func (*ChainGovernorReleasePendingVAAResponse) Descriptor() ([]byte, []int) { - return file_node_v1_node_proto_rawDescGZIP(), []int{19} + return file_node_v1_node_proto_rawDescGZIP(), []int{21} } func (x *ChainGovernorReleasePendingVAAResponse) GetResponse() string { @@ -1158,7 +1300,7 @@ type ChainGovernorResetReleaseTimerRequest struct { func (x *ChainGovernorResetReleaseTimerRequest) Reset() { *x = ChainGovernorResetReleaseTimerRequest{} if protoimpl.UnsafeEnabled { - mi := &file_node_v1_node_proto_msgTypes[20] + mi := &file_node_v1_node_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1171,7 +1313,7 @@ func (x *ChainGovernorResetReleaseTimerRequest) String() string { func (*ChainGovernorResetReleaseTimerRequest) ProtoMessage() {} func (x *ChainGovernorResetReleaseTimerRequest) ProtoReflect() protoreflect.Message { - mi := &file_node_v1_node_proto_msgTypes[20] + mi := &file_node_v1_node_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1184,7 +1326,7 @@ func (x *ChainGovernorResetReleaseTimerRequest) ProtoReflect() protoreflect.Mess // Deprecated: Use ChainGovernorResetReleaseTimerRequest.ProtoReflect.Descriptor instead. func (*ChainGovernorResetReleaseTimerRequest) Descriptor() ([]byte, []int) { - return file_node_v1_node_proto_rawDescGZIP(), []int{20} + return file_node_v1_node_proto_rawDescGZIP(), []int{22} } func (x *ChainGovernorResetReleaseTimerRequest) GetVaaId() string { @@ -1205,7 +1347,7 @@ type ChainGovernorResetReleaseTimerResponse struct { func (x *ChainGovernorResetReleaseTimerResponse) Reset() { *x = ChainGovernorResetReleaseTimerResponse{} if protoimpl.UnsafeEnabled { - mi := &file_node_v1_node_proto_msgTypes[21] + mi := &file_node_v1_node_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1218,7 +1360,7 @@ func (x *ChainGovernorResetReleaseTimerResponse) String() string { func (*ChainGovernorResetReleaseTimerResponse) ProtoMessage() {} func (x *ChainGovernorResetReleaseTimerResponse) ProtoReflect() protoreflect.Message { - mi := &file_node_v1_node_proto_msgTypes[21] + mi := &file_node_v1_node_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1231,7 +1373,7 @@ func (x *ChainGovernorResetReleaseTimerResponse) ProtoReflect() protoreflect.Mes // Deprecated: Use ChainGovernorResetReleaseTimerResponse.ProtoReflect.Descriptor instead. func (*ChainGovernorResetReleaseTimerResponse) Descriptor() ([]byte, []int) { - return file_node_v1_node_proto_rawDescGZIP(), []int{21} + return file_node_v1_node_proto_rawDescGZIP(), []int{23} } func (x *ChainGovernorResetReleaseTimerResponse) GetResponse() string { @@ -1253,7 +1395,7 @@ type PurgePythNetVaasRequest struct { func (x *PurgePythNetVaasRequest) Reset() { *x = PurgePythNetVaasRequest{} if protoimpl.UnsafeEnabled { - mi := &file_node_v1_node_proto_msgTypes[22] + mi := &file_node_v1_node_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1266,7 +1408,7 @@ func (x *PurgePythNetVaasRequest) String() string { func (*PurgePythNetVaasRequest) ProtoMessage() {} func (x *PurgePythNetVaasRequest) ProtoReflect() protoreflect.Message { - mi := &file_node_v1_node_proto_msgTypes[22] + mi := &file_node_v1_node_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1279,7 +1421,7 @@ func (x *PurgePythNetVaasRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use PurgePythNetVaasRequest.ProtoReflect.Descriptor instead. func (*PurgePythNetVaasRequest) Descriptor() ([]byte, []int) { - return file_node_v1_node_proto_rawDescGZIP(), []int{22} + return file_node_v1_node_proto_rawDescGZIP(), []int{24} } func (x *PurgePythNetVaasRequest) GetDaysOld() uint64 { @@ -1307,7 +1449,7 @@ type PurgePythNetVaasResponse struct { func (x *PurgePythNetVaasResponse) Reset() { *x = PurgePythNetVaasResponse{} if protoimpl.UnsafeEnabled { - mi := &file_node_v1_node_proto_msgTypes[23] + mi := &file_node_v1_node_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1320,7 +1462,7 @@ func (x *PurgePythNetVaasResponse) String() string { func (*PurgePythNetVaasResponse) ProtoMessage() {} func (x *PurgePythNetVaasResponse) ProtoReflect() protoreflect.Message { - mi := &file_node_v1_node_proto_msgTypes[23] + mi := &file_node_v1_node_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1333,7 +1475,7 @@ func (x *PurgePythNetVaasResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use PurgePythNetVaasResponse.ProtoReflect.Descriptor instead. func (*PurgePythNetVaasResponse) Descriptor() ([]byte, []int) { - return file_node_v1_node_proto_rawDescGZIP(), []int{23} + return file_node_v1_node_proto_rawDescGZIP(), []int{25} } func (x *PurgePythNetVaasResponse) GetResponse() string { @@ -1359,7 +1501,7 @@ type GuardianSetUpdate_Guardian struct { func (x *GuardianSetUpdate_Guardian) Reset() { *x = GuardianSetUpdate_Guardian{} if protoimpl.UnsafeEnabled { - mi := &file_node_v1_node_proto_msgTypes[24] + mi := &file_node_v1_node_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1372,7 +1514,7 @@ func (x *GuardianSetUpdate_Guardian) String() string { func (*GuardianSetUpdate_Guardian) ProtoMessage() {} func (x *GuardianSetUpdate_Guardian) ProtoReflect() protoreflect.Message { - mi := &file_node_v1_node_proto_msgTypes[24] + mi := &file_node_v1_node_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1418,7 +1560,7 @@ var file_node_v1_node_proto_rawDesc = []byte{ 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x08, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x74, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x86, 0x03, 0x0a, 0x11, 0x47, 0x6f, 0x76, 0x65, 0x72, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0xc6, 0x04, 0x0a, 0x11, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x6f, 0x6e, 0x63, @@ -1442,7 +1584,19 @@ var file_node_v1_node_proto_rawDesc = []byte{ 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x48, 0x00, 0x52, 0x15, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x55, 0x70, 0x67, - 0x72, 0x61, 0x64, 0x65, 0x42, 0x09, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, + 0x72, 0x61, 0x64, 0x65, 0x12, 0x4f, 0x0a, 0x14, 0x77, 0x6f, 0x72, 0x6d, 0x63, 0x68, 0x61, 0x69, + 0x6e, 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x0e, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, + 0x6d, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x48, + 0x00, 0x52, 0x12, 0x77, 0x6f, 0x72, 0x6d, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x53, 0x74, 0x6f, 0x72, + 0x65, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x6d, 0x0a, 0x1e, 0x77, 0x6f, 0x72, 0x6d, 0x63, 0x68, 0x61, + 0x69, 0x6e, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x69, 0x61, 0x74, 0x65, 0x5f, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, + 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6d, 0x63, 0x68, 0x61, 0x69, + 0x6e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x69, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x74, + 0x72, 0x61, 0x63, 0x74, 0x48, 0x00, 0x52, 0x1c, 0x77, 0x6f, 0x72, 0x6d, 0x63, 0x68, 0x61, 0x69, + 0x6e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x69, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x74, + 0x72, 0x61, 0x63, 0x74, 0x42, 0x09, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x37, 0x0a, 0x1b, 0x49, 0x6e, 0x6a, 0x65, 0x63, 0x74, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x56, 0x41, 0x41, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0c, 0x52, @@ -1481,148 +1635,159 @@ var file_node_v1_node_proto_rawDesc = []byte{ 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x6e, 0x65, 0x77, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6e, 0x65, 0x77, 0x43, 0x6f, - 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x22, 0xb4, 0x01, 0x0a, 0x1a, 0x46, 0x69, 0x6e, 0x64, 0x4d, - 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x72, - 0x5f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x65, 0x6d, - 0x69, 0x74, 0x74, 0x65, 0x72, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x65, 0x6d, - 0x69, 0x74, 0x74, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0e, 0x65, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, - 0x65, 0x73, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x72, 0x70, 0x63, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x66, - 0x69, 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x72, 0x70, 0x63, 0x42, 0x61, - 0x63, 0x6b, 0x66, 0x69, 0x6c, 0x6c, 0x12, 0x25, 0x0a, 0x0e, 0x62, 0x61, 0x63, 0x6b, 0x66, 0x69, - 0x6c, 0x6c, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, - 0x62, 0x61, 0x63, 0x6b, 0x66, 0x69, 0x6c, 0x6c, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x22, 0x94, 0x01, - 0x0a, 0x1b, 0x46, 0x69, 0x6e, 0x64, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x4d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, - 0x10, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, - 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x66, 0x69, 0x72, 0x73, - 0x74, 0x5f, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x0d, 0x66, 0x69, 0x72, 0x73, 0x74, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, - 0x23, 0x0a, 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x71, 0x75, - 0x65, 0x6e, 0x63, 0x65, 0x22, 0x6f, 0x0a, 0x1d, 0x53, 0x65, 0x6e, 0x64, 0x4f, 0x62, 0x73, 0x65, + 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x22, 0x31, 0x0a, 0x12, 0x57, 0x6f, 0x72, 0x6d, 0x63, 0x68, + 0x61, 0x69, 0x6e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x1b, 0x0a, 0x09, + 0x77, 0x61, 0x73, 0x6d, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x77, 0x61, 0x73, 0x6d, 0x48, 0x61, 0x73, 0x68, 0x22, 0x7a, 0x0a, 0x1c, 0x57, 0x6f, 0x72, + 0x6d, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x69, 0x61, 0x74, + 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x63, 0x6f, 0x64, + 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x63, 0x6f, 0x64, 0x65, + 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x2b, 0x0a, 0x11, 0x69, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x74, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x10, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x69, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x4d, 0x73, 0x67, 0x22, 0xb4, 0x01, 0x0a, 0x1a, 0x46, 0x69, 0x6e, 0x64, 0x4d, 0x69, + 0x73, 0x73, 0x69, 0x6e, 0x67, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x72, 0x5f, + 0x63, 0x68, 0x61, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x65, 0x6d, 0x69, + 0x74, 0x74, 0x65, 0x72, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x65, 0x6d, 0x69, + 0x74, 0x74, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0e, 0x65, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x72, 0x70, 0x63, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x66, 0x69, + 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x72, 0x70, 0x63, 0x42, 0x61, 0x63, + 0x6b, 0x66, 0x69, 0x6c, 0x6c, 0x12, 0x25, 0x0a, 0x0e, 0x62, 0x61, 0x63, 0x6b, 0x66, 0x69, 0x6c, + 0x6c, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x62, + 0x61, 0x63, 0x6b, 0x66, 0x69, 0x6c, 0x6c, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x22, 0x94, 0x01, 0x0a, + 0x1b, 0x46, 0x69, 0x6e, 0x64, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x4d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x10, + 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x4d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x66, 0x69, 0x72, 0x73, 0x74, + 0x5f, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x0d, 0x66, 0x69, 0x72, 0x73, 0x74, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x23, + 0x0a, 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x71, 0x75, 0x65, + 0x6e, 0x63, 0x65, 0x22, 0x6f, 0x0a, 0x1d, 0x53, 0x65, 0x6e, 0x64, 0x4f, 0x62, 0x73, 0x65, 0x72, + 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x4e, 0x0a, 0x13, 0x6f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x6f, 0x73, 0x73, 0x69, 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x62, + 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x52, 0x12, 0x6f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x22, 0x20, 0x0a, 0x1e, 0x53, 0x65, 0x6e, 0x64, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x4e, 0x0a, 0x13, 0x6f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x6f, 0x73, 0x73, 0x69, 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x4f, - 0x62, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x52, 0x12, 0x6f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x20, 0x0a, 0x1e, 0x53, 0x65, 0x6e, 0x64, 0x4f, 0x62, 0x73, - 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1c, 0x0a, 0x1a, 0x43, 0x68, 0x61, 0x69, 0x6e, - 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x39, 0x0a, 0x1b, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x47, 0x6f, - 0x76, 0x65, 0x72, 0x6e, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x1c, 0x0a, 0x1a, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x6f, - 0x72, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x39, - 0x0a, 0x1b, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x6f, 0x72, 0x52, - 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, - 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3b, 0x0a, 0x22, 0x43, 0x68, 0x61, - 0x69, 0x6e, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x6f, 0x72, 0x44, 0x72, 0x6f, 0x70, 0x50, 0x65, - 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x56, 0x41, 0x41, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x15, 0x0a, 0x06, 0x76, 0x61, 0x61, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x76, 0x61, 0x61, 0x49, 0x64, 0x22, 0x41, 0x0a, 0x23, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x47, - 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x6f, 0x72, 0x44, 0x72, 0x6f, 0x70, 0x50, 0x65, 0x6e, 0x64, 0x69, - 0x6e, 0x67, 0x56, 0x41, 0x41, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, - 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3e, 0x0a, 0x25, 0x43, 0x68, 0x61, - 0x69, 0x6e, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x6f, 0x72, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, - 0x65, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x56, 0x41, 0x41, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x76, 0x61, 0x61, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x61, 0x49, 0x64, 0x22, 0x44, 0x0a, 0x26, 0x43, 0x68, 0x61, - 0x69, 0x6e, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x6f, 0x72, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, - 0x65, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x56, 0x41, 0x41, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1c, 0x0a, 0x1a, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x47, + 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x22, 0x39, 0x0a, 0x1b, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x47, 0x6f, 0x76, + 0x65, 0x72, 0x6e, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x3e, 0x0a, 0x25, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x6f, 0x72, - 0x52, 0x65, 0x73, 0x65, 0x74, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x54, 0x69, 0x6d, 0x65, - 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x76, 0x61, 0x61, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x61, 0x49, 0x64, 0x22, - 0x44, 0x0a, 0x26, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x6f, 0x72, - 0x52, 0x65, 0x73, 0x65, 0x74, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x54, 0x69, 0x6d, 0x65, - 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4f, 0x0a, 0x17, 0x50, 0x75, 0x72, 0x67, 0x65, 0x50, 0x79, - 0x74, 0x68, 0x4e, 0x65, 0x74, 0x56, 0x61, 0x61, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x19, 0x0a, 0x08, 0x64, 0x61, 0x79, 0x73, 0x5f, 0x6f, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x07, 0x64, 0x61, 0x79, 0x73, 0x4f, 0x6c, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x6c, - 0x6f, 0x67, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x6c, - 0x6f, 0x67, 0x4f, 0x6e, 0x6c, 0x79, 0x22, 0x36, 0x0a, 0x18, 0x50, 0x75, 0x72, 0x67, 0x65, 0x50, - 0x79, 0x74, 0x68, 0x4e, 0x65, 0x74, 0x56, 0x61, 0x61, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x1c, 0x0a, 0x1a, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x6f, 0x72, + 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x39, 0x0a, + 0x1b, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x6f, 0x72, 0x52, 0x65, + 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, + 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3b, 0x0a, 0x22, 0x43, 0x68, 0x61, 0x69, + 0x6e, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x6f, 0x72, 0x44, 0x72, 0x6f, 0x70, 0x50, 0x65, 0x6e, + 0x64, 0x69, 0x6e, 0x67, 0x56, 0x41, 0x41, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x15, + 0x0a, 0x06, 0x76, 0x61, 0x61, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x76, 0x61, 0x61, 0x49, 0x64, 0x22, 0x41, 0x0a, 0x23, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x47, 0x6f, + 0x76, 0x65, 0x72, 0x6e, 0x6f, 0x72, 0x44, 0x72, 0x6f, 0x70, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, + 0x67, 0x56, 0x41, 0x41, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, + 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3e, 0x0a, 0x25, 0x43, 0x68, 0x61, 0x69, + 0x6e, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x6f, 0x72, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, + 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x56, 0x41, 0x41, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x15, 0x0a, 0x06, 0x76, 0x61, 0x61, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x61, 0x49, 0x64, 0x22, 0x44, 0x0a, 0x26, 0x43, 0x68, 0x61, 0x69, + 0x6e, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x6f, 0x72, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, + 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x56, 0x41, 0x41, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0xe5, - 0x07, 0x0a, 0x15, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x72, 0x69, 0x76, 0x69, 0x6c, 0x65, 0x67, 0x65, - 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x60, 0x0a, 0x13, 0x49, 0x6e, 0x6a, 0x65, - 0x63, 0x74, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x56, 0x41, 0x41, 0x12, - 0x23, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x6a, 0x65, 0x63, 0x74, - 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x56, 0x41, 0x41, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, - 0x6e, 0x6a, 0x65, 0x63, 0x74, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x56, - 0x41, 0x41, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x60, 0x0a, 0x13, 0x46, 0x69, - 0x6e, 0x64, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x73, 0x12, 0x23, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x69, 0x6e, 0x64, - 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, - 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x4d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x69, 0x0a, 0x16, - 0x53, 0x65, 0x6e, 0x64, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, - 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, - 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x4f, 0x62, 0x73, - 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x60, 0x0a, 0x13, 0x43, 0x68, 0x61, 0x69, 0x6e, - 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x23, - 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x47, 0x6f, - 0x76, 0x65, 0x72, 0x6e, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, - 0x61, 0x69, 0x6e, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x60, 0x0a, 0x13, 0x43, 0x68, 0x61, - 0x69, 0x6e, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x6f, 0x72, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, - 0x12, 0x23, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x69, 0x6e, - 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x6f, 0x72, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3e, + 0x0a, 0x25, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x6f, 0x72, 0x52, + 0x65, 0x73, 0x65, 0x74, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x72, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x76, 0x61, 0x61, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x61, 0x49, 0x64, 0x22, 0x44, + 0x0a, 0x26, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x6f, 0x72, 0x52, + 0x65, 0x73, 0x65, 0x74, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x72, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4f, 0x0a, 0x17, 0x50, 0x75, 0x72, 0x67, 0x65, 0x50, 0x79, 0x74, + 0x68, 0x4e, 0x65, 0x74, 0x56, 0x61, 0x61, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x19, 0x0a, 0x08, 0x64, 0x61, 0x79, 0x73, 0x5f, 0x6f, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x07, 0x64, 0x61, 0x79, 0x73, 0x4f, 0x6c, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x6c, 0x6f, + 0x67, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x6c, 0x6f, + 0x67, 0x4f, 0x6e, 0x6c, 0x79, 0x22, 0x36, 0x0a, 0x18, 0x50, 0x75, 0x72, 0x67, 0x65, 0x50, 0x79, + 0x74, 0x68, 0x4e, 0x65, 0x74, 0x56, 0x61, 0x61, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0xe5, 0x07, + 0x0a, 0x15, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x72, 0x69, 0x76, 0x69, 0x6c, 0x65, 0x67, 0x65, 0x64, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x60, 0x0a, 0x13, 0x49, 0x6e, 0x6a, 0x65, 0x63, + 0x74, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x56, 0x41, 0x41, 0x12, 0x23, + 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x6a, 0x65, 0x63, 0x74, 0x47, + 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x56, 0x41, 0x41, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, + 0x6a, 0x65, 0x63, 0x74, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x56, 0x41, + 0x41, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x60, 0x0a, 0x13, 0x46, 0x69, 0x6e, + 0x64, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, + 0x12, 0x23, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x4d, + 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, - 0x43, 0x68, 0x61, 0x69, 0x6e, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x6f, 0x72, 0x52, 0x65, 0x6c, - 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x78, 0x0a, 0x1b, 0x43, - 0x68, 0x61, 0x69, 0x6e, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x6f, 0x72, 0x44, 0x72, 0x6f, 0x70, - 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x56, 0x41, 0x41, 0x12, 0x2b, 0x2e, 0x6e, 0x6f, 0x64, - 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, - 0x6f, 0x72, 0x44, 0x72, 0x6f, 0x70, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x56, 0x41, 0x41, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, - 0x31, 0x2e, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x6f, 0x72, 0x44, - 0x72, 0x6f, 0x70, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x56, 0x41, 0x41, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x81, 0x01, 0x0a, 0x1e, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x47, - 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x6f, 0x72, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x50, 0x65, - 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x56, 0x41, 0x41, 0x12, 0x2e, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x6f, 0x72, - 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x56, 0x41, - 0x41, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x6f, 0x72, - 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x56, 0x41, - 0x41, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x81, 0x01, 0x0a, 0x1e, 0x43, 0x68, - 0x61, 0x69, 0x6e, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x65, 0x74, - 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x12, 0x2e, 0x2e, 0x6e, - 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x47, 0x6f, 0x76, 0x65, - 0x72, 0x6e, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x65, 0x74, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, - 0x54, 0x69, 0x6d, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x6e, - 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x47, 0x6f, 0x76, 0x65, - 0x72, 0x6e, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x65, 0x74, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, - 0x54, 0x69, 0x6d, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x57, 0x0a, - 0x10, 0x50, 0x75, 0x72, 0x67, 0x65, 0x50, 0x79, 0x74, 0x68, 0x4e, 0x65, 0x74, 0x56, 0x61, 0x61, - 0x73, 0x12, 0x20, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x72, 0x67, - 0x65, 0x50, 0x79, 0x74, 0x68, 0x4e, 0x65, 0x74, 0x56, 0x61, 0x61, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, - 0x72, 0x67, 0x65, 0x50, 0x79, 0x74, 0x68, 0x4e, 0x65, 0x74, 0x56, 0x61, 0x61, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x3d, 0x5a, 0x3b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, - 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x65, 0x72, 0x74, 0x75, 0x73, 0x6f, 0x6e, 0x65, 0x2f, 0x77, - 0x6f, 0x72, 0x6d, 0x68, 0x6f, 0x6c, 0x65, 0x2f, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x70, 0x6b, 0x67, - 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x76, 0x31, 0x3b, 0x6e, - 0x6f, 0x64, 0x65, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x46, 0x69, 0x6e, 0x64, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x4d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x69, 0x0a, 0x16, 0x53, + 0x65, 0x6e, 0x64, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x53, 0x65, 0x6e, 0x64, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, + 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x4f, 0x62, 0x73, 0x65, + 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x60, 0x0a, 0x13, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x47, + 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x23, 0x2e, + 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x47, 0x6f, 0x76, + 0x65, 0x72, 0x6e, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, + 0x69, 0x6e, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x60, 0x0a, 0x13, 0x43, 0x68, 0x61, 0x69, + 0x6e, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x6f, 0x72, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x12, + 0x23, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x47, + 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x6f, 0x72, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, + 0x68, 0x61, 0x69, 0x6e, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x6f, 0x72, 0x52, 0x65, 0x6c, 0x6f, + 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x78, 0x0a, 0x1b, 0x43, 0x68, + 0x61, 0x69, 0x6e, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x6f, 0x72, 0x44, 0x72, 0x6f, 0x70, 0x50, + 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x56, 0x41, 0x41, 0x12, 0x2b, 0x2e, 0x6e, 0x6f, 0x64, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x6f, + 0x72, 0x44, 0x72, 0x6f, 0x70, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x56, 0x41, 0x41, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, + 0x2e, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x6f, 0x72, 0x44, 0x72, + 0x6f, 0x70, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x56, 0x41, 0x41, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x81, 0x01, 0x0a, 0x1e, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x47, 0x6f, + 0x76, 0x65, 0x72, 0x6e, 0x6f, 0x72, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x50, 0x65, 0x6e, + 0x64, 0x69, 0x6e, 0x67, 0x56, 0x41, 0x41, 0x12, 0x2e, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x6f, 0x72, 0x52, + 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x56, 0x41, 0x41, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x6f, 0x72, 0x52, + 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x56, 0x41, 0x41, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x81, 0x01, 0x0a, 0x1e, 0x43, 0x68, 0x61, + 0x69, 0x6e, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x65, 0x74, 0x52, + 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x12, 0x2e, 0x2e, 0x6e, 0x6f, + 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x47, 0x6f, 0x76, 0x65, 0x72, + 0x6e, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x65, 0x74, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x54, + 0x69, 0x6d, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x6e, 0x6f, + 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x47, 0x6f, 0x76, 0x65, 0x72, + 0x6e, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x65, 0x74, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x54, + 0x69, 0x6d, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x57, 0x0a, 0x10, + 0x50, 0x75, 0x72, 0x67, 0x65, 0x50, 0x79, 0x74, 0x68, 0x4e, 0x65, 0x74, 0x56, 0x61, 0x61, 0x73, + 0x12, 0x20, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x72, 0x67, 0x65, + 0x50, 0x79, 0x74, 0x68, 0x4e, 0x65, 0x74, 0x56, 0x61, 0x61, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x72, + 0x67, 0x65, 0x50, 0x79, 0x74, 0x68, 0x4e, 0x65, 0x74, 0x56, 0x61, 0x61, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x3d, 0x5a, 0x3b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x65, 0x72, 0x74, 0x75, 0x73, 0x6f, 0x6e, 0x65, 0x2f, 0x77, 0x6f, + 0x72, 0x6d, 0x68, 0x6f, 0x6c, 0x65, 0x2f, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x70, 0x6b, 0x67, 0x2f, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x76, 0x31, 0x3b, 0x6e, 0x6f, + 0x64, 0x65, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1637,7 +1802,7 @@ func file_node_v1_node_proto_rawDescGZIP() []byte { return file_node_v1_node_proto_rawDescData } -var file_node_v1_node_proto_msgTypes = make([]protoimpl.MessageInfo, 25) +var file_node_v1_node_proto_msgTypes = make([]protoimpl.MessageInfo, 27) var file_node_v1_node_proto_goTypes = []interface{}{ (*InjectGovernanceVAARequest)(nil), // 0: node.v1.InjectGovernanceVAARequest (*GovernanceMessage)(nil), // 1: node.v1.GovernanceMessage @@ -1647,24 +1812,26 @@ var file_node_v1_node_proto_goTypes = []interface{}{ (*BridgeRegisterChain)(nil), // 5: node.v1.BridgeRegisterChain (*ContractUpgrade)(nil), // 6: node.v1.ContractUpgrade (*BridgeUpgradeContract)(nil), // 7: node.v1.BridgeUpgradeContract - (*FindMissingMessagesRequest)(nil), // 8: node.v1.FindMissingMessagesRequest - (*FindMissingMessagesResponse)(nil), // 9: node.v1.FindMissingMessagesResponse - (*SendObservationRequestRequest)(nil), // 10: node.v1.SendObservationRequestRequest - (*SendObservationRequestResponse)(nil), // 11: node.v1.SendObservationRequestResponse - (*ChainGovernorStatusRequest)(nil), // 12: node.v1.ChainGovernorStatusRequest - (*ChainGovernorStatusResponse)(nil), // 13: node.v1.ChainGovernorStatusResponse - (*ChainGovernorReloadRequest)(nil), // 14: node.v1.ChainGovernorReloadRequest - (*ChainGovernorReloadResponse)(nil), // 15: node.v1.ChainGovernorReloadResponse - (*ChainGovernorDropPendingVAARequest)(nil), // 16: node.v1.ChainGovernorDropPendingVAARequest - (*ChainGovernorDropPendingVAAResponse)(nil), // 17: node.v1.ChainGovernorDropPendingVAAResponse - (*ChainGovernorReleasePendingVAARequest)(nil), // 18: node.v1.ChainGovernorReleasePendingVAARequest - (*ChainGovernorReleasePendingVAAResponse)(nil), // 19: node.v1.ChainGovernorReleasePendingVAAResponse - (*ChainGovernorResetReleaseTimerRequest)(nil), // 20: node.v1.ChainGovernorResetReleaseTimerRequest - (*ChainGovernorResetReleaseTimerResponse)(nil), // 21: node.v1.ChainGovernorResetReleaseTimerResponse - (*PurgePythNetVaasRequest)(nil), // 22: node.v1.PurgePythNetVaasRequest - (*PurgePythNetVaasResponse)(nil), // 23: node.v1.PurgePythNetVaasResponse - (*GuardianSetUpdate_Guardian)(nil), // 24: node.v1.GuardianSetUpdate.Guardian - (*v1.ObservationRequest)(nil), // 25: gossip.v1.ObservationRequest + (*WormchainStoreCode)(nil), // 8: node.v1.WormchainStoreCode + (*WormchainInstantiateContract)(nil), // 9: node.v1.WormchainInstantiateContract + (*FindMissingMessagesRequest)(nil), // 10: node.v1.FindMissingMessagesRequest + (*FindMissingMessagesResponse)(nil), // 11: node.v1.FindMissingMessagesResponse + (*SendObservationRequestRequest)(nil), // 12: node.v1.SendObservationRequestRequest + (*SendObservationRequestResponse)(nil), // 13: node.v1.SendObservationRequestResponse + (*ChainGovernorStatusRequest)(nil), // 14: node.v1.ChainGovernorStatusRequest + (*ChainGovernorStatusResponse)(nil), // 15: node.v1.ChainGovernorStatusResponse + (*ChainGovernorReloadRequest)(nil), // 16: node.v1.ChainGovernorReloadRequest + (*ChainGovernorReloadResponse)(nil), // 17: node.v1.ChainGovernorReloadResponse + (*ChainGovernorDropPendingVAARequest)(nil), // 18: node.v1.ChainGovernorDropPendingVAARequest + (*ChainGovernorDropPendingVAAResponse)(nil), // 19: node.v1.ChainGovernorDropPendingVAAResponse + (*ChainGovernorReleasePendingVAARequest)(nil), // 20: node.v1.ChainGovernorReleasePendingVAARequest + (*ChainGovernorReleasePendingVAAResponse)(nil), // 21: node.v1.ChainGovernorReleasePendingVAAResponse + (*ChainGovernorResetReleaseTimerRequest)(nil), // 22: node.v1.ChainGovernorResetReleaseTimerRequest + (*ChainGovernorResetReleaseTimerResponse)(nil), // 23: node.v1.ChainGovernorResetReleaseTimerResponse + (*PurgePythNetVaasRequest)(nil), // 24: node.v1.PurgePythNetVaasRequest + (*PurgePythNetVaasResponse)(nil), // 25: node.v1.PurgePythNetVaasResponse + (*GuardianSetUpdate_Guardian)(nil), // 26: node.v1.GuardianSetUpdate.Guardian + (*v1.ObservationRequest)(nil), // 27: gossip.v1.ObservationRequest } var file_node_v1_node_proto_depIdxs = []int32{ 1, // 0: node.v1.InjectGovernanceVAARequest.messages:type_name -> node.v1.GovernanceMessage @@ -1672,31 +1839,33 @@ var file_node_v1_node_proto_depIdxs = []int32{ 6, // 2: node.v1.GovernanceMessage.contract_upgrade:type_name -> node.v1.ContractUpgrade 5, // 3: node.v1.GovernanceMessage.bridge_register_chain:type_name -> node.v1.BridgeRegisterChain 7, // 4: node.v1.GovernanceMessage.bridge_contract_upgrade:type_name -> node.v1.BridgeUpgradeContract - 24, // 5: node.v1.GuardianSetUpdate.guardians:type_name -> node.v1.GuardianSetUpdate.Guardian - 25, // 6: node.v1.SendObservationRequestRequest.observation_request:type_name -> gossip.v1.ObservationRequest - 0, // 7: node.v1.NodePrivilegedService.InjectGovernanceVAA:input_type -> node.v1.InjectGovernanceVAARequest - 8, // 8: node.v1.NodePrivilegedService.FindMissingMessages:input_type -> node.v1.FindMissingMessagesRequest - 10, // 9: node.v1.NodePrivilegedService.SendObservationRequest:input_type -> node.v1.SendObservationRequestRequest - 12, // 10: node.v1.NodePrivilegedService.ChainGovernorStatus:input_type -> node.v1.ChainGovernorStatusRequest - 14, // 11: node.v1.NodePrivilegedService.ChainGovernorReload:input_type -> node.v1.ChainGovernorReloadRequest - 16, // 12: node.v1.NodePrivilegedService.ChainGovernorDropPendingVAA:input_type -> node.v1.ChainGovernorDropPendingVAARequest - 18, // 13: node.v1.NodePrivilegedService.ChainGovernorReleasePendingVAA:input_type -> node.v1.ChainGovernorReleasePendingVAARequest - 20, // 14: node.v1.NodePrivilegedService.ChainGovernorResetReleaseTimer:input_type -> node.v1.ChainGovernorResetReleaseTimerRequest - 22, // 15: node.v1.NodePrivilegedService.PurgePythNetVaas:input_type -> node.v1.PurgePythNetVaasRequest - 2, // 16: node.v1.NodePrivilegedService.InjectGovernanceVAA:output_type -> node.v1.InjectGovernanceVAAResponse - 9, // 17: node.v1.NodePrivilegedService.FindMissingMessages:output_type -> node.v1.FindMissingMessagesResponse - 11, // 18: node.v1.NodePrivilegedService.SendObservationRequest:output_type -> node.v1.SendObservationRequestResponse - 13, // 19: node.v1.NodePrivilegedService.ChainGovernorStatus:output_type -> node.v1.ChainGovernorStatusResponse - 15, // 20: node.v1.NodePrivilegedService.ChainGovernorReload:output_type -> node.v1.ChainGovernorReloadResponse - 17, // 21: node.v1.NodePrivilegedService.ChainGovernorDropPendingVAA:output_type -> node.v1.ChainGovernorDropPendingVAAResponse - 19, // 22: node.v1.NodePrivilegedService.ChainGovernorReleasePendingVAA:output_type -> node.v1.ChainGovernorReleasePendingVAAResponse - 21, // 23: node.v1.NodePrivilegedService.ChainGovernorResetReleaseTimer:output_type -> node.v1.ChainGovernorResetReleaseTimerResponse - 23, // 24: node.v1.NodePrivilegedService.PurgePythNetVaas:output_type -> node.v1.PurgePythNetVaasResponse - 16, // [16:25] is the sub-list for method output_type - 7, // [7:16] is the sub-list for method input_type - 7, // [7:7] is the sub-list for extension type_name - 7, // [7:7] is the sub-list for extension extendee - 0, // [0:7] is the sub-list for field type_name + 8, // 5: node.v1.GovernanceMessage.wormchain_store_code:type_name -> node.v1.WormchainStoreCode + 9, // 6: node.v1.GovernanceMessage.wormchain_instantiate_contract:type_name -> node.v1.WormchainInstantiateContract + 26, // 7: node.v1.GuardianSetUpdate.guardians:type_name -> node.v1.GuardianSetUpdate.Guardian + 27, // 8: node.v1.SendObservationRequestRequest.observation_request:type_name -> gossip.v1.ObservationRequest + 0, // 9: node.v1.NodePrivilegedService.InjectGovernanceVAA:input_type -> node.v1.InjectGovernanceVAARequest + 10, // 10: node.v1.NodePrivilegedService.FindMissingMessages:input_type -> node.v1.FindMissingMessagesRequest + 12, // 11: node.v1.NodePrivilegedService.SendObservationRequest:input_type -> node.v1.SendObservationRequestRequest + 14, // 12: node.v1.NodePrivilegedService.ChainGovernorStatus:input_type -> node.v1.ChainGovernorStatusRequest + 16, // 13: node.v1.NodePrivilegedService.ChainGovernorReload:input_type -> node.v1.ChainGovernorReloadRequest + 18, // 14: node.v1.NodePrivilegedService.ChainGovernorDropPendingVAA:input_type -> node.v1.ChainGovernorDropPendingVAARequest + 20, // 15: node.v1.NodePrivilegedService.ChainGovernorReleasePendingVAA:input_type -> node.v1.ChainGovernorReleasePendingVAARequest + 22, // 16: node.v1.NodePrivilegedService.ChainGovernorResetReleaseTimer:input_type -> node.v1.ChainGovernorResetReleaseTimerRequest + 24, // 17: node.v1.NodePrivilegedService.PurgePythNetVaas:input_type -> node.v1.PurgePythNetVaasRequest + 2, // 18: node.v1.NodePrivilegedService.InjectGovernanceVAA:output_type -> node.v1.InjectGovernanceVAAResponse + 11, // 19: node.v1.NodePrivilegedService.FindMissingMessages:output_type -> node.v1.FindMissingMessagesResponse + 13, // 20: node.v1.NodePrivilegedService.SendObservationRequest:output_type -> node.v1.SendObservationRequestResponse + 15, // 21: node.v1.NodePrivilegedService.ChainGovernorStatus:output_type -> node.v1.ChainGovernorStatusResponse + 17, // 22: node.v1.NodePrivilegedService.ChainGovernorReload:output_type -> node.v1.ChainGovernorReloadResponse + 19, // 23: node.v1.NodePrivilegedService.ChainGovernorDropPendingVAA:output_type -> node.v1.ChainGovernorDropPendingVAAResponse + 21, // 24: node.v1.NodePrivilegedService.ChainGovernorReleasePendingVAA:output_type -> node.v1.ChainGovernorReleasePendingVAAResponse + 23, // 25: node.v1.NodePrivilegedService.ChainGovernorResetReleaseTimer:output_type -> node.v1.ChainGovernorResetReleaseTimerResponse + 25, // 26: node.v1.NodePrivilegedService.PurgePythNetVaas:output_type -> node.v1.PurgePythNetVaasResponse + 18, // [18:27] is the sub-list for method output_type + 9, // [9:18] is the sub-list for method input_type + 9, // [9:9] is the sub-list for extension type_name + 9, // [9:9] is the sub-list for extension extendee + 0, // [0:9] is the sub-list for field type_name } func init() { file_node_v1_node_proto_init() } @@ -1802,7 +1971,7 @@ func file_node_v1_node_proto_init() { } } file_node_v1_node_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FindMissingMessagesRequest); i { + switch v := v.(*WormchainStoreCode); i { case 0: return &v.state case 1: @@ -1814,7 +1983,7 @@ func file_node_v1_node_proto_init() { } } file_node_v1_node_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FindMissingMessagesResponse); i { + switch v := v.(*WormchainInstantiateContract); i { case 0: return &v.state case 1: @@ -1826,7 +1995,7 @@ func file_node_v1_node_proto_init() { } } file_node_v1_node_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SendObservationRequestRequest); i { + switch v := v.(*FindMissingMessagesRequest); i { case 0: return &v.state case 1: @@ -1838,7 +2007,7 @@ func file_node_v1_node_proto_init() { } } file_node_v1_node_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SendObservationRequestResponse); i { + switch v := v.(*FindMissingMessagesResponse); i { case 0: return &v.state case 1: @@ -1850,7 +2019,7 @@ func file_node_v1_node_proto_init() { } } file_node_v1_node_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ChainGovernorStatusRequest); i { + switch v := v.(*SendObservationRequestRequest); i { case 0: return &v.state case 1: @@ -1862,7 +2031,7 @@ func file_node_v1_node_proto_init() { } } file_node_v1_node_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ChainGovernorStatusResponse); i { + switch v := v.(*SendObservationRequestResponse); i { case 0: return &v.state case 1: @@ -1874,7 +2043,7 @@ func file_node_v1_node_proto_init() { } } file_node_v1_node_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ChainGovernorReloadRequest); i { + switch v := v.(*ChainGovernorStatusRequest); i { case 0: return &v.state case 1: @@ -1886,7 +2055,7 @@ func file_node_v1_node_proto_init() { } } file_node_v1_node_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ChainGovernorReloadResponse); i { + switch v := v.(*ChainGovernorStatusResponse); i { case 0: return &v.state case 1: @@ -1898,7 +2067,7 @@ func file_node_v1_node_proto_init() { } } file_node_v1_node_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ChainGovernorDropPendingVAARequest); i { + switch v := v.(*ChainGovernorReloadRequest); i { case 0: return &v.state case 1: @@ -1910,7 +2079,7 @@ func file_node_v1_node_proto_init() { } } file_node_v1_node_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ChainGovernorDropPendingVAAResponse); i { + switch v := v.(*ChainGovernorReloadResponse); i { case 0: return &v.state case 1: @@ -1922,7 +2091,7 @@ func file_node_v1_node_proto_init() { } } file_node_v1_node_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ChainGovernorReleasePendingVAARequest); i { + switch v := v.(*ChainGovernorDropPendingVAARequest); i { case 0: return &v.state case 1: @@ -1934,7 +2103,7 @@ func file_node_v1_node_proto_init() { } } file_node_v1_node_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ChainGovernorReleasePendingVAAResponse); i { + switch v := v.(*ChainGovernorDropPendingVAAResponse); i { case 0: return &v.state case 1: @@ -1946,7 +2115,7 @@ func file_node_v1_node_proto_init() { } } file_node_v1_node_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ChainGovernorResetReleaseTimerRequest); i { + switch v := v.(*ChainGovernorReleasePendingVAARequest); i { case 0: return &v.state case 1: @@ -1958,7 +2127,7 @@ func file_node_v1_node_proto_init() { } } file_node_v1_node_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ChainGovernorResetReleaseTimerResponse); i { + switch v := v.(*ChainGovernorReleasePendingVAAResponse); i { case 0: return &v.state case 1: @@ -1970,7 +2139,7 @@ func file_node_v1_node_proto_init() { } } file_node_v1_node_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PurgePythNetVaasRequest); i { + switch v := v.(*ChainGovernorResetReleaseTimerRequest); i { case 0: return &v.state case 1: @@ -1982,7 +2151,7 @@ func file_node_v1_node_proto_init() { } } file_node_v1_node_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PurgePythNetVaasResponse); i { + switch v := v.(*ChainGovernorResetReleaseTimerResponse); i { case 0: return &v.state case 1: @@ -1994,6 +2163,30 @@ func file_node_v1_node_proto_init() { } } file_node_v1_node_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PurgePythNetVaasRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_node_v1_node_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PurgePythNetVaasResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_node_v1_node_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GuardianSetUpdate_Guardian); i { case 0: return &v.state @@ -2011,6 +2204,8 @@ func file_node_v1_node_proto_init() { (*GovernanceMessage_ContractUpgrade)(nil), (*GovernanceMessage_BridgeRegisterChain)(nil), (*GovernanceMessage_BridgeContractUpgrade)(nil), + (*GovernanceMessage_WormchainStoreCode)(nil), + (*GovernanceMessage_WormchainInstantiateContract)(nil), } type x struct{} out := protoimpl.TypeBuilder{ @@ -2018,7 +2213,7 @@ func file_node_v1_node_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_node_v1_node_proto_rawDesc, NumEnums: 0, - NumMessages: 25, + NumMessages: 27, NumExtensions: 0, NumServices: 1, }, diff --git a/proto/node/v1/node.proto b/proto/node/v1/node.proto index 6525f4562..ffae513a5 100644 --- a/proto/node/v1/node.proto +++ b/proto/node/v1/node.proto @@ -80,6 +80,11 @@ message GovernanceMessage { BridgeRegisterChain bridge_register_chain = 12; BridgeUpgradeContract bridge_contract_upgrade = 13; + + // Wormchain + + WormchainStoreCode wormchain_store_code = 14; + WormchainInstantiateContract wormchain_instantiate_contract = 15; } } @@ -142,6 +147,22 @@ message BridgeUpgradeContract { string new_contract = 3; } +message WormchainStoreCode { + // payload is the hex string of the sha3 256 hash of the wasm binary being uploaded + string wasm_hash = 1; +} + +message WormchainInstantiateContract { + // CodeID is the reference to the stored WASM code + uint64 code_id = 1; + + // Label is optional metadata to be stored with a contract instance. + string label = 2; + + // Json encoded message to be passed to the contract on instantiation + string instantiation_msg = 3; +} + message FindMissingMessagesRequest { // Emitter chain ID to iterate. uint32 emitter_chain = 1; diff --git a/sdk/vaa/governance.go b/sdk/vaa/governance.go index 96bdd1cef..b1d1cc41e 100644 --- a/sdk/vaa/governance.go +++ b/sdk/vaa/governance.go @@ -1,7 +1,11 @@ package vaa import ( + "encoding/binary" + "fmt" "time" + + "golang.org/x/crypto/sha3" ) var GovernanceEmitter = Address{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4} @@ -23,3 +27,33 @@ func CreateGovernanceVAA(timestamp time.Time, nonce uint32, sequence uint64, gua return vaa } + +// Compute the hash for cosmwasm contract instatiation params. +// The hash is keccak256 hash(hash(hash(BigEndian(CodeID)), Label), Msg). +// We compute the nested hash so there is no chance of bytes leaking between CodeID, Label, and Msg. +func CreateInstatiateCosmwasmContractHash(codeId uint64, label string, msg []byte) [32]byte { + var expected_hash [32]byte + + // hash(BigEndian(CodeID)) + var codeId_hash [32]byte + keccak := sha3.NewLegacyKeccak256() + if err := binary.Write(keccak, binary.BigEndian, codeId); err != nil { + panic(fmt.Sprintf("failed to write binary data (%d): %v", codeId, err)) + } + keccak.Sum(codeId_hash[:0]) + keccak.Reset() + + // hash(hash(BigEndian(CodeID)), Label) + var codeIdLabel_hash [32]byte + keccak.Write(codeId_hash[:]) + keccak.Write([]byte(label)) + keccak.Sum(codeIdLabel_hash[:0]) + keccak.Reset() + + // hash(hash(hash(BigEndian(CodeID)), Label), Msg) + keccak.Write(codeIdLabel_hash[:]) + keccak.Write(msg) + keccak.Sum(expected_hash[:0]) + + return expected_hash +} diff --git a/sdk/vaa/payloads.go b/sdk/vaa/payloads.go index 68b4b3190..8a6527247 100644 --- a/sdk/vaa/payloads.go +++ b/sdk/vaa/payloads.go @@ -36,6 +36,16 @@ type ( TargetChainID ChainID NewContract Address } + + // BodyWormchainStoreCode is a governance message to upload a new cosmwasm contract to wormchain + BodyWormchainStoreCode struct { + WasmHash [32]byte + } + + // BodyWormchainInstantiateContract is a governance message to instantiate a cosmwasm contract on wormchain + BodyWormchainInstantiateContract struct { + InstantiationParamsHash [32]byte + } ) func (b BodyContractUpgrade) Serialize() []byte { @@ -73,47 +83,39 @@ func (b BodyGuardianSetUpdate) Serialize() []byte { } func (r BodyTokenBridgeRegisterChain) Serialize() []byte { - if len(r.Module) > 32 { - panic("module longer than 32 byte") - } - - buf := &bytes.Buffer{} - - // Write token bridge header - for i := 0; i < (32 - len(r.Module)); i++ { - buf.WriteByte(0x00) - } - buf.Write([]byte(r.Module)) - // Write action ID - MustWrite(buf, binary.BigEndian, uint8(1)) - // Write target chain (0 = universal) - MustWrite(buf, binary.BigEndian, uint16(0)) - // Write chain to be registered - MustWrite(buf, binary.BigEndian, r.ChainID) - // Write emitter address of chain to be registered - buf.Write(r.EmitterAddress[:]) - - return buf.Bytes() + return serializeBridgeGovernanceVaa(r.Module, 1, r.ChainID, r.EmitterAddress) } func (r BodyTokenBridgeUpgradeContract) Serialize() []byte { - if len(r.Module) > 32 { + return serializeBridgeGovernanceVaa(r.Module, 2, r.TargetChainID, r.NewContract) +} + +func (r BodyWormchainStoreCode) Serialize() []byte { + return serializeBridgeGovernanceVaa("WasmdModule", 1, ChainIDWormchain, r.WasmHash) +} + +func (r BodyWormchainInstantiateContract) Serialize() []byte { + return serializeBridgeGovernanceVaa("WasmdModule", 2, ChainIDWormchain, r.InstantiationParamsHash) +} + +func serializeBridgeGovernanceVaa(module string, actionId uint8, chainId ChainID, payload [32]byte) []byte { + if len(module) > 32 { panic("module longer than 32 byte") } buf := &bytes.Buffer{} // Write token bridge header - for i := 0; i < (32 - len(r.Module)); i++ { + for i := 0; i < (32 - len(module)); i++ { buf.WriteByte(0x00) } - buf.Write([]byte(r.Module)) + buf.Write([]byte(module)) // Write action ID - MustWrite(buf, binary.BigEndian, uint8(2)) + MustWrite(buf, binary.BigEndian, actionId) // Write target chain - MustWrite(buf, binary.BigEndian, r.TargetChainID) + MustWrite(buf, binary.BigEndian, chainId) // Write emitter address of chain to be registered - buf.Write(r.NewContract[:]) + buf.Write(payload[:]) return buf.Bytes() } diff --git a/wormchain/x/wormhole/keeper/msg_server_wasmd.go b/wormchain/x/wormhole/keeper/msg_server_wasmd.go index 2d3e64c32..4f34224ed 100644 --- a/wormchain/x/wormhole/keeper/msg_server_wasmd.go +++ b/wormchain/x/wormhole/keeper/msg_server_wasmd.go @@ -3,12 +3,12 @@ package keeper import ( "bytes" "context" - "encoding/binary" wasmdtypes "github.com/CosmWasm/wasmd/x/wasm/types" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" "github.com/wormhole-foundation/wormchain/x/wormhole/types" + "github.com/wormhole-foundation/wormhole/sdk/vaa" "golang.org/x/crypto/sha3" ) @@ -92,16 +92,10 @@ func (k msgServer) InstantiateContract(goCtx context.Context, msg *types.MsgInst return nil, types.ErrUnknownGovernanceAction } - // Need to verify the msg contents by checking sha3.Sum(BigEndian(CodeID) || Label || Msg) - // The vaa governance payload must contain this hash. - - var expected_hash [32]byte - keccak := sha3.NewLegacyKeccak256() - binary.Write(keccak, binary.BigEndian, msg.CodeID) - keccak.Write([]byte(msg.Label)) - keccak.Write([]byte(msg.Msg)) - keccak.Sum(expected_hash[:0]) + // Need to verify the instatiation arguments + // The vaa governance payload must contain the hash of the expected args. + expected_hash := vaa.CreateInstatiateCosmwasmContractHash(msg.CodeID, msg.Label, msg.Msg) if !bytes.Equal(payload, expected_hash[:]) { return nil, types.ErrInvalidHash } diff --git a/wormchain/x/wormhole/keeper/msg_server_wasmd_test.go b/wormchain/x/wormhole/keeper/msg_server_wasmd_test.go index abadc02a1..41aea5bcb 100644 --- a/wormchain/x/wormhole/keeper/msg_server_wasmd_test.go +++ b/wormchain/x/wormhole/keeper/msg_server_wasmd_test.go @@ -31,12 +31,7 @@ func createWasmInstantiatePayload(code_id uint64, label string, json_msg string) // - code_id (big endian) // - label // - json_msg - var expected_hash [32]byte - keccak := sha3.NewLegacyKeccak256() - binary.Write(keccak, binary.BigEndian, code_id) - keccak.Write([]byte(label)) - keccak.Write([]byte(json_msg)) - keccak.Sum(expected_hash[:0]) + expected_hash := vaa.CreateInstatiateCosmwasmContractHash(code_id, label, []byte(json_msg)) var payload bytes.Buffer payload.Write(keeper.WasmdModule[:])