diff --git a/app/appmessage/message.go b/app/appmessage/message.go
index 8f778b1179..8f7bd373c8 100644
--- a/app/appmessage/message.go
+++ b/app/appmessage/message.go
@@ -163,6 +163,22 @@ const (
CmdGetMempoolEntriesByAddressesResponseMessage
CmdGetCoinSupplyRequestMessage
CmdGetCoinSupplyResponseMessage
+ CmdGetAcceptingBlockHashesOfTxsRequestMessage
+ CmdGetAcceptingBlockHashesOfTxsResponseMessage
+ CmdGetTxsRequestMessage
+ CmdGetTxsResponseMessage
+ CmdGetTxsConfirmationsRequestMessage
+ CmdGetTxsConfirmationsResponseMessage
+ CmdNotifyTxsConfirmationChangedRequestMessage
+ CmdNotifyTxsConfirmationChangedResponseMessage
+ CmdModifyNotifyingTxsConfirmationChangedRequestMessage
+ CmdModifyNotifyingTxsConfirmationChangedResponseMessage
+ CmdTxsConfirmationChangedNotificationMessage
+ CmdNotifyAddressesTxsRequestMessage
+ CmdNotifyAddressesTxsResponseMessage
+ CmdModifyNotifyingAddressesTxsRequestMessage
+ CmdModifyNotifyingAddressesTxsResponseMessage
+ CmdAddressesTxsNotificationMessage
)
// ProtocolMessageCommandToString maps all MessageCommands to their string representation
@@ -300,6 +316,22 @@ var RPCMessageCommandToString = map[MessageCommand]string{
CmdGetMempoolEntriesByAddressesResponseMessage: "GetMempoolEntriesByAddressesResponse",
CmdGetCoinSupplyRequestMessage: "GetCoinSupplyRequest",
CmdGetCoinSupplyResponseMessage: "GetCoinSupplyResponse",
+ CmdGetAcceptingBlockHashesOfTxsRequestMessage: "GetAcceptingBlockHashesOfTxsRequest",
+ CmdGetAcceptingBlockHashesOfTxsResponseMessage: "GetAcceptingBlockHashesOfTxsResponse",
+ CmdGetTxsRequestMessage: "GetTxsRequest",
+ CmdGetTxsResponseMessage: "GetTxsResponse",
+ CmdGetTxsConfirmationsRequestMessage: "GetTxsConfirmationsRequest",
+ CmdGetTxsConfirmationsResponseMessage: "GetTxsConfirmationsResponse",
+ CmdNotifyTxsConfirmationChangedRequestMessage: "NotifyTxsConfirmationChangedRequest",
+ CmdNotifyTxsConfirmationChangedResponseMessage: "ModifyNotifyingTxsConfirmationChangedRequest",
+ CmdModifyNotifyingTxsConfirmationChangedRequestMessage: "ModifyNotifyingTxsConfirmationChangedResponse",
+ CmdModifyNotifyingTxsConfirmationChangedResponseMessage: "TxsConfirmationChangedNotification",
+ CmdTxsConfirmationChangedNotificationMessage: "TxsConfirmationChangedNotification",
+ CmdNotifyAddressesTxsRequestMessage: "NotifyAddressesTxsRequest",
+ CmdNotifyAddressesTxsResponseMessage: "NotifyAddressesTxsResponse",
+ CmdModifyNotifyingAddressesTxsRequestMessage: "ModifyNotifyingAddressesTxsRequest",
+ CmdModifyNotifyingAddressesTxsResponseMessage: "ModifyNotifyingAddressesTxsResponse",
+ CmdAddressesTxsNotificationMessage: "AddressesTxsNotification",
}
// Message is an interface that describes a kaspa message. A type that
diff --git a/app/appmessage/rpc_get_accepting_blockhashes_of_txs.go b/app/appmessage/rpc_get_accepting_blockhashes_of_txs.go
new file mode 100644
index 0000000000..8b08ab3464
--- /dev/null
+++ b/app/appmessage/rpc_get_accepting_blockhashes_of_txs.go
@@ -0,0 +1,48 @@
+package appmessage
+
+// TxIDBlockHashPair is an appmessage corresponding to
+// its respective RPC message
+type TxIDBlockHashPair struct {
+ TxID string
+ Hash string
+}
+
+// GetAcceptingBlockHashesOfTxsRequestMessage is an appmessage corresponding to
+// its respective RPC message
+type GetAcceptingBlockHashesOfTxsRequestMessage struct {
+ baseMessage
+ TxIDs []string
+}
+
+// Command returns the protocol command string for the message
+func (msg *GetAcceptingBlockHashesOfTxsRequestMessage) Command() MessageCommand {
+ return CmdGetAcceptingBlockHashesOfTxsRequestMessage
+}
+
+// NewGetAcceptingBlockHashesOfTxsRequest returns a instance of the message
+func NewGetAcceptingBlockHashesOfTxsRequest(txIDs []string) *GetAcceptingBlockHashesOfTxsRequestMessage {
+ return &GetAcceptingBlockHashesOfTxsRequestMessage{
+ TxIDs: txIDs,
+ }
+}
+
+// GetAcceptingBlockHashesOfTxsResponseMessage is an appmessage corresponding to
+// its respective RPC message
+type GetAcceptingBlockHashesOfTxsResponseMessage struct {
+ baseMessage
+ TxIDBlockHashPairs []*TxIDBlockHashPair
+
+ Error *RPCError
+}
+
+// Command returns the protocol command string for the message
+func (msg *GetAcceptingBlockHashesOfTxsResponseMessage) Command() MessageCommand {
+ return CmdGetAcceptingBlockHashesOfTxsResponseMessage
+}
+
+// NewGetAcceptingBlockHashesOfTxsResponse returns an instance of the message
+func NewGetAcceptingBlockHashesOfTxsResponse(txIDBlockHashPairs []*TxIDBlockHashPair) *GetAcceptingBlockHashesOfTxsResponseMessage {
+ return &GetAcceptingBlockHashesOfTxsResponseMessage{
+ TxIDBlockHashPairs: txIDBlockHashPairs,
+ }
+}
diff --git a/app/appmessage/rpc_get_info.go b/app/appmessage/rpc_get_info.go
index 00c9882e7d..f70f6f139c 100644
--- a/app/appmessage/rpc_get_info.go
+++ b/app/appmessage/rpc_get_info.go
@@ -24,6 +24,8 @@ type GetInfoResponseMessage struct {
MempoolSize uint64
ServerVersion string
IsUtxoIndexed bool
+ IsTxIndexed bool
+ IsArchival bool
IsSynced bool
Error *RPCError
@@ -35,12 +37,15 @@ func (msg *GetInfoResponseMessage) Command() MessageCommand {
}
// NewGetInfoResponseMessage returns a instance of the message
-func NewGetInfoResponseMessage(p2pID string, mempoolSize uint64, serverVersion string, isUtxoIndexed bool, isSynced bool) *GetInfoResponseMessage {
+func NewGetInfoResponseMessage(p2pID string, mempoolSize uint64, serverVersion string, isUtxoIndexed bool,
+ isTxIndexed bool, isArchival bool, isSynced bool) *GetInfoResponseMessage {
return &GetInfoResponseMessage{
P2PID: p2pID,
MempoolSize: mempoolSize,
ServerVersion: serverVersion,
IsUtxoIndexed: isUtxoIndexed,
+ IsTxIndexed: isTxIndexed,
+ IsArchival: isArchival,
IsSynced: isSynced,
}
}
diff --git a/app/appmessage/rpc_get_txs.go b/app/appmessage/rpc_get_txs.go
new file mode 100644
index 0000000000..5e775db04a
--- /dev/null
+++ b/app/appmessage/rpc_get_txs.go
@@ -0,0 +1,41 @@
+package appmessage
+
+// GetTxsRequestMessage is an appmessage corresponding to
+// its respective RPC message
+type GetTxsRequestMessage struct {
+ baseMessage
+ TxIDs []string
+}
+
+// Command returns the protocol command string for the message
+func (msg *GetTxsRequestMessage) Command() MessageCommand {
+ return CmdGetTxsRequestMessage
+}
+
+// NewGetTxsRequest returns a instance of the message
+func NewGetTxsRequest(txIDs []string) *GetTxsRequestMessage {
+ return &GetTxsRequestMessage{
+ TxIDs: txIDs,
+ }
+}
+
+// GetTxsResponseMessage is an appmessage corresponding to
+// its respective RPC message
+type GetTxsResponseMessage struct {
+ baseMessage
+ Transactions []*RPCTransaction
+
+ Error *RPCError
+}
+
+// Command returns the protocol command string for the message
+func (msg *GetTxsResponseMessage) Command() MessageCommand {
+ return CmdGetTxsResponseMessage
+}
+
+// NewGetTxsResponse returns an instance of the message
+func NewGetTxsResponse(transactions []*RPCTransaction) *GetTxsResponseMessage {
+ return &GetTxsResponseMessage{
+ Transactions: transactions,
+ }
+}
diff --git a/app/appmessage/rpc_get_txs_confirmations.go b/app/appmessage/rpc_get_txs_confirmations.go
new file mode 100644
index 0000000000..2b14438215
--- /dev/null
+++ b/app/appmessage/rpc_get_txs_confirmations.go
@@ -0,0 +1,48 @@
+package appmessage
+
+// TxIDConfirmationsPair is an appmessage corresponding to
+// its respective RPC message
+type TxIDConfirmationsPair struct {
+ TxID string
+ Confirmations int64
+}
+
+// GetTxsConfirmationsRequestMessage is an appmessage corresponding to
+// its respective RPC message
+type GetTxsConfirmationsRequestMessage struct {
+ baseMessage
+ TxIDs []string
+}
+
+// Command returns the protocol command string for the message
+func (msg *GetTxsConfirmationsRequestMessage) Command() MessageCommand {
+ return CmdGetTxsConfirmationsRequestMessage
+}
+
+// NewGetTxsConfirmationsRequest returns a instance of the message
+func NewGetTxsConfirmationsRequest(txIDs []string) *GetTxsConfirmationsRequestMessage {
+ return &GetTxsConfirmationsRequestMessage{
+ TxIDs: txIDs,
+ }
+}
+
+// GetTxsConfirmationsResponseMessage is an appmessage corresponding to
+// its respective RPC message
+type GetTxsConfirmationsResponseMessage struct {
+ baseMessage
+ TxIDConfirmationsPairs []*TxIDConfirmationsPair
+
+ Error *RPCError
+}
+
+// Command returns the protocol command string for the message
+func (msg *GetTxsConfirmationsResponseMessage) Command() MessageCommand {
+ return CmdGetTxsConfirmationsResponseMessage
+}
+
+// NewGetTxsConfirmationsResponse returns an instance of the message
+func NewGetTxsConfirmationsResponse(txIDConfirmationsPairs []*TxIDConfirmationsPair) *GetTxsConfirmationsResponseMessage {
+ return &GetTxsConfirmationsResponseMessage{
+ TxIDConfirmationsPairs: txIDConfirmationsPairs,
+ }
+}
diff --git a/app/appmessage/rpc_modify_notifying_addresses_txs.go b/app/appmessage/rpc_modify_notifying_addresses_txs.go
new file mode 100644
index 0000000000..e3d306e913
--- /dev/null
+++ b/app/appmessage/rpc_modify_notifying_addresses_txs.go
@@ -0,0 +1,49 @@
+package appmessage
+
+// ModifyNotifyingAddressesTxsRequestMessage is an appmessage corresponding to
+// its respective RPC message
+type ModifyNotifyingAddressesTxsRequestMessage struct {
+ baseMessage
+ AddAddresses []string
+ RemoveAddresses []string
+ RequiredConfirmations uint32
+ IncludePending bool
+ IncludeSending bool
+ IncludeReceiving bool
+}
+
+// Command returns the protocol command string for the message
+func (msg *ModifyNotifyingAddressesTxsRequestMessage) Command() MessageCommand {
+ return CmdModifyNotifyingAddressesTxsRequestMessage
+}
+
+// NewModifyNotifyingAddressesTxsRequestMessage returns a instance of the message
+func NewModifyNotifyingAddressesTxsRequestMessage(addAddresses []string, removeAddresses []string,
+ requiredConfirmations uint32, includePending bool, includeSending bool,
+ includeReceiving bool) *ModifyNotifyingAddressesTxsRequestMessage {
+ return &ModifyNotifyingAddressesTxsRequestMessage{
+ AddAddresses: addAddresses,
+ RemoveAddresses: removeAddresses,
+ RequiredConfirmations: requiredConfirmations,
+ IncludePending: includePending,
+ IncludeSending: includeSending,
+ IncludeReceiving: includeReceiving,
+ }
+}
+
+// ModifyNotifyingAddressesTxsResponseMessage is an appmessage corresponding to
+// its respective RPC message
+type ModifyNotifyingAddressesTxsResponseMessage struct {
+ baseMessage
+ Error *RPCError
+}
+
+// Command returns the protocol command string for the message
+func (msg *ModifyNotifyingAddressesTxsResponseMessage) Command() MessageCommand {
+ return CmdModifyNotifyingAddressesTxsResponseMessage
+}
+
+// NewModifyNotifyingAddressesTxsResponseMessage returns a instance of the message
+func NewModifyNotifyingAddressesTxsResponseMessage() *NotifyAddressesTxsResponseMessage {
+ return &NotifyAddressesTxsResponseMessage{}
+}
diff --git a/app/appmessage/rpc_modify_notifying_txs_confirmation_changed.go b/app/appmessage/rpc_modify_notifying_txs_confirmation_changed.go
new file mode 100644
index 0000000000..910af4db24
--- /dev/null
+++ b/app/appmessage/rpc_modify_notifying_txs_confirmation_changed.go
@@ -0,0 +1,44 @@
+package appmessage
+
+// ModifyNotifyingTxsConfirmationChangedRequestMessage is an appmessage corresponding to
+// its respective RPC message
+type ModifyNotifyingTxsConfirmationChangedRequestMessage struct {
+ baseMessage
+ AddTxIDs []string
+ RemoveTxIDs []string
+ RequiredConfirmations uint32
+ IncludePending bool
+}
+
+// Command returns the protocol command string for the message
+func (msg *ModifyNotifyingTxsConfirmationChangedRequestMessage) Command() MessageCommand {
+ return CmdModifyNotifyingTxsConfirmationChangedRequestMessage
+}
+
+// NewModifyNotifyingTxsConfirmationChangedRequestMessage returns a instance of the message
+func NewModifyNotifyingTxsConfirmationChangedRequestMessage(addTxIDs []string, removeTxIDs []string,
+ requiredConfirmations uint32, includePending bool) *ModifyNotifyingTxsConfirmationChangedRequestMessage {
+ return &ModifyNotifyingTxsConfirmationChangedRequestMessage{
+ AddTxIDs: addTxIDs,
+ RemoveTxIDs: removeTxIDs,
+ RequiredConfirmations: requiredConfirmations,
+ IncludePending: includePending,
+ }
+}
+
+// ModifyNotifyingTxsConfirmationChangedResponseMessage is an appmessage corresponding to
+// its respective RPC message
+type ModifyNotifyingTxsConfirmationChangedResponseMessage struct {
+ baseMessage
+ Error *RPCError
+}
+
+// Command returns the protocol command string for the message
+func (msg *ModifyNotifyingTxsConfirmationChangedResponseMessage) Command() MessageCommand {
+ return CmdModifyNotifyingTxsConfirmationChangedResponseMessage
+}
+
+// NewModifyNotifyingTxsChangedResponseMessage returns a instance of the message
+func NewModifyNotifyingTxsChangedResponseMessage() *NotifyTxsConfirmationChangedResponseMessage {
+ return &NotifyTxsConfirmationChangedResponseMessage{}
+}
diff --git a/app/appmessage/rpc_notify_addresses_txs.go b/app/appmessage/rpc_notify_addresses_txs.go
new file mode 100644
index 0000000000..a23daba36f
--- /dev/null
+++ b/app/appmessage/rpc_notify_addresses_txs.go
@@ -0,0 +1,87 @@
+package appmessage
+
+// NotifyAddressesTxsRequestMessage is an appmessage corresponding to
+// its respective RPC message
+type NotifyAddressesTxsRequestMessage struct {
+ baseMessage
+ Addresses []string
+ RequiredConfirmations uint32
+ IncludePending bool
+ IncludeSending bool
+ IncludeReceiving bool
+}
+
+// Command returns the protocol command string for the message
+func (msg *NotifyAddressesTxsRequestMessage) Command() MessageCommand {
+ return CmdNotifyAddressesTxsRequestMessage
+}
+
+// NewNotifyAddressesTxsRequestMessage returns a instance of the message
+func NewNotifyAddressesTxsRequestMessage(addresses []string, requiredConfirmations uint32,
+ includePending bool, includeSending bool, includeReceiving bool) *NotifyAddressesTxsRequestMessage {
+ return &NotifyAddressesTxsRequestMessage{
+ Addresses: addresses,
+ RequiredConfirmations: requiredConfirmations,
+ IncludePending: includePending,
+ IncludeSending: includeSending,
+ IncludeReceiving: includeReceiving,
+ }
+}
+
+// NotifyAddressesTxsResponseMessage is an appmessage corresponding to
+// its respective RPC message
+type NotifyAddressesTxsResponseMessage struct {
+ baseMessage
+ Error *RPCError
+}
+
+// Command returns the protocol command string for the message
+func (msg *NotifyAddressesTxsResponseMessage) Command() MessageCommand {
+ return CmdNotifyAddressesTxsResponseMessage
+}
+
+// NewNotifyAddressesTxsResponseMessage returns a instance of the message
+func NewNotifyAddressesTxsResponseMessage() *NotifyAddressesTxsResponseMessage {
+ return &NotifyAddressesTxsResponseMessage{}
+}
+
+// AddressesTxsNotificationMessage is an appmessage corresponding to
+// its respective RPC message
+type AddressesTxsNotificationMessage struct {
+ baseMessage
+ RequiredConfirmations uint32
+ Pending *TxEntriesByAddresses
+ Confirmed *TxEntriesByAddresses
+ Unconfirmed *TxEntriesByAddresses
+}
+
+// Command returns the protocol command string for the message
+func (msg *AddressesTxsNotificationMessage) Command() MessageCommand {
+ return CmdAddressesTxsNotificationMessage
+}
+
+// NewAddressesTxsNotificationMessage returns a instance of the message
+func NewAddressesTxsNotificationMessage(requiredConfirmations uint32, pending *TxEntriesByAddresses,
+ confirmed *TxEntriesByAddresses, unconfirmed *TxEntriesByAddresses) *AddressesTxsNotificationMessage {
+ return &AddressesTxsNotificationMessage{
+ RequiredConfirmations: requiredConfirmations,
+ Pending: pending,
+ Confirmed: confirmed,
+ Unconfirmed: unconfirmed,
+ }
+}
+
+// TxEntriesByAddresses is an appmessage corresponding to
+// its respective RPC message
+type TxEntriesByAddresses struct {
+ Sent []*TxEntryByAddress
+ Received []*TxEntryByAddress
+}
+
+// TxEntryByAddress is an appmessage corresponding to
+// its respective RPC message
+type TxEntryByAddress struct {
+ Address string
+ TxID string
+ Confirmations uint32
+}
diff --git a/app/appmessage/rpc_notify_txs_confirmation_changed.go b/app/appmessage/rpc_notify_txs_confirmation_changed.go
new file mode 100644
index 0000000000..63d28bcb57
--- /dev/null
+++ b/app/appmessage/rpc_notify_txs_confirmation_changed.go
@@ -0,0 +1,68 @@
+package appmessage
+
+// NotifyTxsConfirmationChangedRequestMessage is an appmessage corresponding to
+// its respective RPC message
+type NotifyTxsConfirmationChangedRequestMessage struct {
+ baseMessage
+ TxIDs []string
+ RequiredConfirmations uint32
+ IncludePending bool
+}
+
+// Command returns the protocol command string for the message
+func (msg *NotifyTxsConfirmationChangedRequestMessage) Command() MessageCommand {
+ return CmdNotifyTxsConfirmationChangedRequestMessage
+}
+
+// NewNotifyTxsConfirmationChangedRequestMessage returns a instance of the message
+func NewNotifyTxsConfirmationChangedRequestMessage(TxIDs []string, requiredConfirmations uint32,
+ includePending bool) *NotifyTxsConfirmationChangedRequestMessage {
+ return &NotifyTxsConfirmationChangedRequestMessage{
+ TxIDs: TxIDs,
+ RequiredConfirmations: requiredConfirmations,
+ IncludePending: includePending,
+ }
+}
+
+// NotifyTxsConfirmationChangedResponseMessage is an appmessage corresponding to
+// its respective RPC message
+type NotifyTxsConfirmationChangedResponseMessage struct {
+ baseMessage
+ Error *RPCError
+}
+
+// Command returns the protocol command string for the message
+func (msg *NotifyTxsConfirmationChangedResponseMessage) Command() MessageCommand {
+ return CmdNotifyTxsConfirmationChangedResponseMessage
+}
+
+// NewNotifyTxsChangedResponseMessage returns a instance of the message
+func NewNotifyTxsChangedResponseMessage() *NotifyTxsConfirmationChangedResponseMessage {
+ return &NotifyTxsConfirmationChangedResponseMessage{}
+}
+
+// TxsConfirmationChangedNotificationMessage is an appmessage corresponding to
+// its respective RPC message
+type TxsConfirmationChangedNotificationMessage struct {
+ baseMessage
+ RequiredConfirmations uint32
+ Pending []*TxIDConfirmationsPair
+ Confirmed []*TxIDConfirmationsPair
+ UnconfirmedTxIds []string
+}
+
+// Command returns the protocol command string for the message
+func (msg *TxsConfirmationChangedNotificationMessage) Command() MessageCommand {
+ return CmdTxsConfirmationChangedNotificationMessage
+}
+
+// NewTxsChangedNotificationMessage returns a instance of the message
+func NewTxsChangedNotificationMessage(requiredConfirmations uint32, pending []*TxIDConfirmationsPair,
+ confirmed []*TxIDConfirmationsPair, unconfirmedTxIds []string) *TxsConfirmationChangedNotificationMessage {
+ return &TxsConfirmationChangedNotificationMessage{
+ RequiredConfirmations: requiredConfirmations,
+ Pending: pending,
+ Confirmed: confirmed,
+ UnconfirmedTxIds: unconfirmedTxIds,
+ }
+}
diff --git a/app/appmessage/rpc_submit_transaction.go b/app/appmessage/rpc_submit_transaction.go
index a39e7e5746..84cbdcae68 100644
--- a/app/appmessage/rpc_submit_transaction.go
+++ b/app/appmessage/rpc_submit_transaction.go
@@ -97,11 +97,14 @@ type RPCUTXOEntry struct {
// RPCTransactionVerboseData holds verbose data about a transaction
type RPCTransactionVerboseData struct {
- TransactionID string
- Hash string
- Mass uint64
- BlockHash string
- BlockTime uint64
+ TransactionID string
+ Hash string
+ Mass uint64
+ BlockHash string
+ BlockTime uint64
+ TxIndexed bool
+ AcceptingBlockHash string
+ Confirmations uint32
}
// RPCTransactionInputVerboseData holds data about a transaction input
diff --git a/app/component_manager.go b/app/component_manager.go
index 33b9a2c097..fd837a7737 100644
--- a/app/component_manager.go
+++ b/app/component_manager.go
@@ -12,6 +12,7 @@ import (
"github.com/kaspanet/kaspad/app/rpc"
"github.com/kaspanet/kaspad/domain"
"github.com/kaspanet/kaspad/domain/consensus"
+ "github.com/kaspanet/kaspad/domain/txindex"
"github.com/kaspanet/kaspad/domain/utxoindex"
"github.com/kaspanet/kaspad/infrastructure/config"
infrastructuredatabase "github.com/kaspanet/kaspad/infrastructure/db/database"
@@ -113,6 +114,16 @@ func NewComponentManager(cfg *config.Config, db infrastructuredatabase.Database,
log.Infof("UTXO index started")
}
+ var txIndex *txindex.TXIndex
+ if cfg.TXIndex {
+ txIndex, err = txindex.New(domain, db)
+ if err != nil {
+ return nil, err
+ }
+
+ log.Infof("TX index started")
+ }
+
connectionManager, err := connmanager.New(cfg, netAdapter, addressManager)
if err != nil {
return nil, err
@@ -121,7 +132,7 @@ func NewComponentManager(cfg *config.Config, db infrastructuredatabase.Database,
if err != nil {
return nil, err
}
- rpcManager := setupRPC(cfg, domain, netAdapter, protocolManager, connectionManager, addressManager, utxoIndex, domain.ConsensusEventsChannel(), interrupt)
+ rpcManager := setupRPC(cfg, domain, netAdapter, protocolManager, connectionManager, addressManager, utxoIndex, txIndex, domain.ConsensusEventsChannel(), interrupt)
return &ComponentManager{
cfg: cfg,
@@ -142,6 +153,7 @@ func setupRPC(
connectionManager *connmanager.ConnectionManager,
addressManager *addressmanager.AddressManager,
utxoIndex *utxoindex.UTXOIndex,
+ txIndex *txindex.TXIndex,
consensusEventsChan chan externalapi.ConsensusEvent,
shutDownChan chan<- struct{},
) *rpc.Manager {
@@ -154,6 +166,7 @@ func setupRPC(
connectionManager,
addressManager,
utxoIndex,
+ txIndex,
consensusEventsChan,
shutDownChan,
)
diff --git a/app/rpc/manager.go b/app/rpc/manager.go
index c9479666b4..382820bc39 100644
--- a/app/rpc/manager.go
+++ b/app/rpc/manager.go
@@ -6,6 +6,7 @@ import (
"github.com/kaspanet/kaspad/app/rpc/rpccontext"
"github.com/kaspanet/kaspad/domain"
"github.com/kaspanet/kaspad/domain/consensus/model/externalapi"
+ "github.com/kaspanet/kaspad/domain/txindex"
"github.com/kaspanet/kaspad/domain/utxoindex"
"github.com/kaspanet/kaspad/infrastructure/config"
"github.com/kaspanet/kaspad/infrastructure/logger"
@@ -29,6 +30,7 @@ func NewManager(
connectionManager *connmanager.ConnectionManager,
addressManager *addressmanager.AddressManager,
utxoIndex *utxoindex.UTXOIndex,
+ txIndex *txindex.TXIndex,
consensusEventsChan chan externalapi.ConsensusEvent,
shutDownChan chan<- struct{}) *Manager {
@@ -41,6 +43,7 @@ func NewManager(
connectionManager,
addressManager,
utxoIndex,
+ txIndex,
shutDownChan,
),
}
@@ -69,6 +72,11 @@ func (m *Manager) initConsensusEventsHandler(consensusEventsChan chan externalap
if err != nil {
panic(err)
}
+ case *externalapi.PruningPointChange:
+ err := m.notifyPruningPointChange()
+ if err != nil {
+ panic(err)
+ }
default:
panic(errors.Errorf("Got event of unsupported type %T", consensusEvent))
}
@@ -113,6 +121,13 @@ func (m *Manager) notifyVirtualChange(virtualChangeSet *externalapi.VirtualChang
}
}
+ if m.context.Config.TXIndex && virtualChangeSet.VirtualSelectedParentChainChanges.Added != nil {
+ err := m.notifyTXsChanged(virtualChangeSet)
+ if err != nil {
+ return err
+ }
+ }
+
err := m.notifyVirtualSelectedParentBlueScoreChanged(virtualChangeSet.VirtualSelectedParentBlueScore)
if err != nil {
return err
@@ -145,6 +160,19 @@ func (m *Manager) NotifyNewBlockTemplate() error {
return m.context.NotificationManager.NotifyNewBlockTemplate(notification)
}
+func (m *Manager) notifyPruningPointChange() error {
+ onEnd := logger.LogAndMeasureExecutionTime(log, "RPCManager.NotifyPruningPointChange")
+ defer onEnd()
+
+ if m.context.Config.TXIndex {
+ err := m.notifyPruningPointChangeTXAcceptancePrune()
+ if err != nil {
+ return err
+ }
+ }
+ return nil
+}
+
// NotifyPruningPointUTXOSetOverride notifies the manager whenever the UTXO index
// resets due to pruning point change via IBD.
func (m *Manager) NotifyPruningPointUTXOSetOverride() error {
@@ -191,6 +219,18 @@ func (m *Manager) notifyUTXOsChanged(virtualChangeSet *externalapi.VirtualChange
return m.context.NotificationManager.NotifyUTXOsChanged(utxoIndexChanges)
}
+func (m *Manager) notifyTXsChanged(virtualChangeSet *externalapi.VirtualChangeSet) error {
+ onEnd := logger.LogAndMeasureExecutionTime(log, "RPCManager.NotifyTXsChanged")
+ defer onEnd()
+
+ txIndexChanges, err := m.context.TXIndex.Update(virtualChangeSet)
+ if err != nil {
+ return err
+ }
+
+ return m.context.NotifyTXAcceptanceChange(txIndexChanges)
+}
+
func (m *Manager) notifyPruningPointUTXOSetOverride() error {
onEnd := logger.LogAndMeasureExecutionTime(log, "RPCManager.notifyPruningPointUTXOSetOverride")
defer onEnd()
@@ -203,6 +243,18 @@ func (m *Manager) notifyPruningPointUTXOSetOverride() error {
return m.context.NotificationManager.NotifyPruningPointUTXOSetOverride()
}
+func (m *Manager) notifyPruningPointChangeTXAcceptancePrune() error {
+ onEnd := logger.LogAndMeasureExecutionTime(log, "RPCManager.notifyPruningPointChange")
+ defer onEnd()
+
+ err := m.context.TXIndex.Reset() //TO Do: a full reset resync does the job, but a prune could be more effcient.
+ if err != nil {
+ return err
+ }
+
+ return nil
+}
+
func (m *Manager) notifyVirtualSelectedParentBlueScoreChanged(virtualSelectedParentBlueScore uint64) error {
onEnd := logger.LogAndMeasureExecutionTime(log, "RPCManager.NotifyVirtualSelectedParentBlueScoreChanged")
defer onEnd()
diff --git a/app/rpc/rpc.go b/app/rpc/rpc.go
index 770b9eb221..77cb2253a7 100644
--- a/app/rpc/rpc.go
+++ b/app/rpc/rpc.go
@@ -51,6 +51,9 @@ var handlers = map[appmessage.MessageCommand]handler{
appmessage.CmdNotifyNewBlockTemplateRequestMessage: rpchandlers.HandleNotifyNewBlockTemplate,
appmessage.CmdGetCoinSupplyRequestMessage: rpchandlers.HandleGetCoinSupply,
appmessage.CmdGetMempoolEntriesByAddressesRequestMessage: rpchandlers.HandleGetMempoolEntriesByAddresses,
+ appmessage.CmdGetAcceptingBlockHashesOfTxsRequestMessage: rpchandlers.HandleGetAcceptingBlockHashesOfTxs,
+ appmessage.CmdGetTxsRequestMessage: rpchandlers.HandleGetTxs,
+ appmessage.CmdGetTxsConfirmationsRequestMessage: rpchandlers.HandleGetTxsConfirmations,
}
func (m *Manager) routerInitializer(router *router.Router, netConnection *netadapter.NetConnection) {
diff --git a/app/rpc/rpccontext/context.go b/app/rpc/rpccontext/context.go
index e4674ef620..2e51fdd7a7 100644
--- a/app/rpc/rpccontext/context.go
+++ b/app/rpc/rpccontext/context.go
@@ -3,6 +3,7 @@ package rpccontext
import (
"github.com/kaspanet/kaspad/app/protocol"
"github.com/kaspanet/kaspad/domain"
+ "github.com/kaspanet/kaspad/domain/txindex"
"github.com/kaspanet/kaspad/domain/utxoindex"
"github.com/kaspanet/kaspad/infrastructure/config"
"github.com/kaspanet/kaspad/infrastructure/network/addressmanager"
@@ -19,6 +20,7 @@ type Context struct {
ConnectionManager *connmanager.ConnectionManager
AddressManager *addressmanager.AddressManager
UTXOIndex *utxoindex.UTXOIndex
+ TXIndex *txindex.TXIndex
ShutDownChan chan<- struct{}
NotificationManager *NotificationManager
@@ -32,6 +34,7 @@ func NewContext(cfg *config.Config,
connectionManager *connmanager.ConnectionManager,
addressManager *addressmanager.AddressManager,
utxoIndex *utxoindex.UTXOIndex,
+ txIndex *txindex.TXIndex,
shutDownChan chan<- struct{}) *Context {
context := &Context{
@@ -42,6 +45,7 @@ func NewContext(cfg *config.Config,
ConnectionManager: connectionManager,
AddressManager: addressManager,
UTXOIndex: utxoIndex,
+ TXIndex: txIndex,
ShutDownChan: shutDownChan,
}
context.NotificationManager = NewNotificationManager(cfg.ActiveNetParams)
diff --git a/app/rpc/rpccontext/notificationmanager.go b/app/rpc/rpccontext/notificationmanager.go
index bcd2db4d7c..cc7965a3d8 100644
--- a/app/rpc/rpccontext/notificationmanager.go
+++ b/app/rpc/rpccontext/notificationmanager.go
@@ -4,6 +4,7 @@ import (
"sync"
"github.com/kaspanet/kaspad/domain/dagconfig"
+ "github.com/kaspanet/kaspad/domain/txindex"
"github.com/kaspanet/kaspad/domain/consensus/model/externalapi"
"github.com/kaspanet/kaspad/domain/consensus/utils/txscript"
@@ -42,7 +43,9 @@ type NotificationListener struct {
propagatePruningPointUTXOSetOverrideNotifications bool
propagateNewBlockTemplateNotifications bool
- propagateUTXOsChangedNotificationAddresses map[utxoindex.ScriptPublicKeyString]*UTXOsChangedNotificationAddress
+ propagateUTXOsChangedNotificationAddresses map[utxoindex.ScriptPublicKeyString]*UTXOsChangedNotificationAddress
+ propagateAddressesTxsNotifications TXsConfirmationChangedNotificationHolder
+ propagateTxsConfirmationChhangedNotifications TXsConfirmationChangedNotificationHolder
includeAcceptedTransactionIDsInVirtualSelectedParentChainChangedNotifications bool
}
@@ -199,6 +202,29 @@ func (nm *NotificationManager) NotifyFinalityConflictResolved(notification *appm
return nil
}
+// NotifyUTXOsChanged notifies the notification manager that UTXOs have been changed
+func (nm *NotificationManager) NotifyTXAcceptanceChange(txChanges *txindex.TXAcceptanceChange) error {
+ nm.RLock()
+ defer nm.RUnlock()
+
+ for router, listener := range nm.listeners {
+ if listener.propagateTXsConfirmationChangedNotifications {
+ // Filter utxoChanges and create a notification
+ notification, err := listener.convertUTXOChangesToUTXOsChangedNotification(utxoChanges)
+ if err != nil {
+ return err
+ }
+
+ // Enqueue the notification
+ err = router.OutgoingRoute().MaybeEnqueue(notification)
+ if err != nil {
+ return err
+ }
+ }
+ }
+ return nil
+}
+
// NotifyUTXOsChanged notifies the notification manager that UTXOs have been changed
func (nm *NotificationManager) NotifyUTXOsChanged(utxoChanges *utxoindex.UTXOChanges) error {
nm.RLock()
@@ -367,6 +393,26 @@ func (nm *NotificationManager) PropagateUTXOsChangedNotifications(nl *Notificati
}
}
+// PropagateUTXOsChangedNotifications instructs the listener to send UTXOs changed notifications
+// to the remote listener for the given addresses. Subsequent calls instruct the listener to
+// send UTXOs changed notifications for those addresses along with the old ones. Duplicate addresses
+// are ignored.
+func (nm *NotificationManager) PropagateTXsConfirmationChangedNotifications(nl *NotificationListener, addresses []*UTXOsChangedNotificationAddress) {
+ // Apply a write-lock since the internal listener address map is modified
+ nm.Lock()
+ defer nm.Unlock()
+
+ if !nl.propagateUTXOsChangedNotifications {
+ nl.propagateUTXOsChangedNotifications = true
+ nl.propagateUTXOsChangedNotificationAddresses =
+ make(map[utxoindex.ScriptPublicKeyString]*UTXOsChangedNotificationAddress, len(addresses))
+ }
+
+ for _, address := range addresses {
+ nl.propagateUTXOsChangedNotificationAddresses[address.ScriptPublicKeyString] = address
+ }
+}
+
// StopPropagatingUTXOsChangedNotifications instructs the listener to stop sending UTXOs
// changed notifications to the remote listener for the given addresses. Addresses for which
// notifications are not currently sent are ignored.
diff --git a/app/rpc/rpccontext/tx_changed.go b/app/rpc/rpccontext/tx_changed.go
new file mode 100644
index 0000000000..2330f8be0c
--- /dev/null
+++ b/app/rpc/rpccontext/tx_changed.go
@@ -0,0 +1,119 @@
+package rpccontext
+
+import (
+ "github.com/kaspanet/kaspad/app/appmessage"
+ "github.com/kaspanet/kaspad/domain/consensus/model/externalapi"
+ "github.com/kaspanet/kaspad/domain/txindex"
+)
+
+// TXsConfirmationChanged represents information for the TXsConfirmationChanged listener.
+// This type is meant to be used in TXsChanged notifications
+type TXsConfirmationChangedNotificationState struct {
+ RequiredConfirmations uint32
+ IncludePending bool
+ RegisteredTxsToBlueScore txindex.TxIDsToBlueScores
+ UnregesiteredTxsBlueScore map[externalapi.DomainTransactionID]uint64 //this is bluescore when txid was either a) inserted into listener, or b) removed from listener
+}
+
+func (ctx *Context) NewTXsConfirmationChangedNotificationState(txIds []*externalapi.DomainTransactionID, requiredConfirmations uint32,
+ includePending bool) (*TXsConfirmationChangedNotificationState, error) {
+ registeredTxsToBlueScore, NotFound, err := ctx.TXIndex.GetTXsBlueScores(txIds)
+ if err != nil {
+ return nil, err
+ }
+ virtualInfo, err := ctx.Domain.Consensus().GetVirtualInfo()
+ if err != nil {
+ return nil, err
+ }
+
+ unregesiteredTxsBlueScore := make(txindex.TxIDsToBlueScores, len(NotFound))
+ for _, txID := range NotFound {
+ unregesiteredTxsBlueScore[*txID] = virtualInfo.BlueScore
+ }
+ return &TXsConfirmationChangedNotificationState{
+ RequiredConfirmations: requiredConfirmations,
+ IncludePending: includePending,
+ RegisteredTxsToBlueScore: registeredTxsToBlueScore,
+ UnregesiteredTxsBlueScore: unregesiteredTxsBlueScore,
+ }, nil
+}
+
+func (tcc *TXsConfirmationChangedNotificationState) updateStateAndExtractConfirmations(txAcceptanceChange *txindex.TXAcceptanceChange) (
+ pending []*appmessage.TxIDConfirmationsPair, confirmed []*appmessage.TxIDConfirmationsPair, unconfirmed []*appmessage.TxIDConfirmationsPair) {
+
+ pending = make([]*appmessage.TxIDConfirmationsPair, 0)
+ confirmed = make([]*appmessage.TxIDConfirmationsPair, 0)
+ unconfirmed = make([]*appmessage.TxIDConfirmationsPair, 0)
+
+ for txID := range txAcceptanceChange.Removed {
+ _, found := tcc.RegisteredTxsToBlueScore[txID]
+ if found {
+ delete(tcc.RegisteredTxsToBlueScore, txID)
+ tcc.UnregesiteredTxsBlueScore[txID] = txAcceptanceChange.VirtualBlueScore
+ }
+ }
+ for txID := range txAcceptanceChange.Added {
+ _, found := tcc.UnregesiteredTxsBlueScore[txID]
+ if !found {
+ delete(tcc.UnregesiteredTxsBlueScore, txID)
+ tcc.RegisteredTxsToBlueScore[txID] = txAcceptanceChange.VirtualBlueScore
+ }
+ }
+
+ for txID, txBluescore := range tcc.RegisteredTxsToBlueScore {
+ confirmations := uint32(txAcceptanceChange.VirtualBlueScore - txBluescore)
+ if confirmations >= tcc.RequiredConfirmations {
+ confirmed = append(confirmed, &appmessage.TxIDConfirmationsPair{TxID: txID.String(), Confirmations: int64(confirmations)})
+ } else if tcc.IncludePending {
+ pending = append(pending, &appmessage.TxIDConfirmationsPair{TxID: txID.String(), Confirmations: int64(confirmations)})
+ }
+ }
+
+ for txID, txBluescore := range tcc.UnregesiteredTxsBlueScore {
+ unconfirmations := uint32(txAcceptanceChange.VirtualBlueScore - txBluescore)
+ if unconfirmations >= tcc.RequiredConfirmations {
+ unconfirmed = append(unconfirmed, &appmessage.TxIDConfirmationsPair{TxID: txID.String(), Confirmations: int64(unconfirmations)})
+ delete(tcc.UnregesiteredTxsBlueScore, txID)
+ }
+ }
+
+ if tcc.IncludePending {
+ return pending, confirmed, unconfirmed
+ }
+
+ return nil, confirmed, unconfirmed
+}
+
+// TXsConfirmationChanged represents information for the TXsConfirmationChanged listener.
+// This type is meant to be used in TXsChanged notifications
+type AddressesTxsNotificationState struct {
+ RequiredConfirmations uint32
+ IncludePending bool
+ IncludeSpending bool
+ IncludeReciving bool
+ RegisteredScriptPublicKeysToTxIdsToBlueScores map[string]txindex.TxIDsToBlueScores
+ UnregesiteredcriptPublicKeysToTxIdsToBlueScores map[string]txindex.TxIDsToBlueScores //this is bluescore when txid was either a) inserted into listener, or b) removed from listener
+}
+
+func (ctx *Context) AddressesTxsNotificationState(txIds []*externalapi.DomainTransactionID, requiredConfirmations uint32,
+ includePending bool) (*TXsConfirmationChangedNotificationState, error) {
+ registeredTxsToBlueScore, NotFound, err := ctx.TXIndex.GetTXsBlueScores(txIds)
+ if err != nil {
+ return nil, err
+ }
+ virtualInfo, err := ctx.Domain.Consensus().GetVirtualInfo()
+ if err != nil {
+ return nil, err
+ }
+
+ unregesiteredTxsBlueScore := make(txindex.TxIDsToBlueScores, len(NotFound))
+ for _, txID := range NotFound {
+ unregesiteredTxsBlueScore[*txID] = virtualInfo.BlueScore
+ }
+ return &TXsConfirmationChangedNotificationState{
+ RequiredConfirmations: requiredConfirmations,
+ IncludePending: includePending,
+ RegisteredTxsToBlueScore: registeredTxsToBlueScore,
+ UnregesiteredTxsBlueScore: unregesiteredTxsBlueScore,
+ }, nil
+}
diff --git a/app/rpc/rpccontext/verbosedata.go b/app/rpc/rpccontext/verbosedata.go
index e42d3ed8d3..af4161322b 100644
--- a/app/rpc/rpccontext/verbosedata.go
+++ b/app/rpc/rpccontext/verbosedata.go
@@ -8,6 +8,7 @@ import (
difficultyPackage "github.com/kaspanet/kaspad/util/difficulty"
"github.com/pkg/errors"
+ "github.com/kaspanet/kaspad/domain/consensus/database"
"github.com/kaspanet/kaspad/domain/consensus/utils/hashes"
"github.com/kaspanet/kaspad/domain/consensus/utils/txscript"
@@ -128,6 +129,31 @@ func (ctx *Context) PopulateTransactionWithVerboseData(
Hash: consensushashing.TransactionHash(domainTransaction).String(),
Mass: domainTransaction.Mass,
}
+ if ctx.Config.TXIndex {
+ acceptingBlockHash, foundAcceptingBlockHash, err := ctx.TXIndex.TXAcceptingBlockHash(domainTransaction.ID)
+ if err != nil {
+ if !database.IsNotFoundError(err) {
+ return err
+ }
+ return err
+ }
+ confirmations, foundConfirmations, err := ctx.TXIndex.GetTXConfirmations(domainTransaction.ID)
+ if err != nil {
+ if !database.IsNotFoundError(err) {
+ return err
+ }
+ }
+ if !foundAcceptingBlockHash || !foundConfirmations {
+ transaction.VerboseData.TxIndexed = false
+ } else {
+ transaction.VerboseData.TxIndexed = true
+ transaction.VerboseData.AcceptingBlockHash = acceptingBlockHash.String()
+ transaction.VerboseData.Confirmations = uint32(confirmations)
+ }
+ } else {
+ transaction.VerboseData.TxIndexed = false
+ }
+
if domainBlockHeader != nil {
transaction.VerboseData.BlockHash = consensushashing.HeaderHash(domainBlockHeader).String()
transaction.VerboseData.BlockTime = uint64(domainBlockHeader.TimeInMilliseconds())
diff --git a/app/rpc/rpchandlers/get_accepting_blockhashes_of_txs.go b/app/rpc/rpchandlers/get_accepting_blockhashes_of_txs.go
new file mode 100644
index 0000000000..931e138d1f
--- /dev/null
+++ b/app/rpc/rpchandlers/get_accepting_blockhashes_of_txs.go
@@ -0,0 +1,57 @@
+package rpchandlers
+
+import (
+ "github.com/kaspanet/kaspad/app/appmessage"
+ "github.com/kaspanet/kaspad/app/rpc/rpccontext"
+ "github.com/kaspanet/kaspad/domain/consensus/model/externalapi"
+ "github.com/kaspanet/kaspad/infrastructure/network/netadapter/router"
+
+ "github.com/pkg/errors"
+)
+
+// HandleGetAcceptingBlockHashesOfTxs handles the respectively named RPC command
+func HandleGetAcceptingBlockHashesOfTxs(context *rpccontext.Context, _ *router.Router, request appmessage.Message) (appmessage.Message, error) {
+ var err error
+
+ if !context.Config.TXIndex {
+ errorMessage := &appmessage.GetAcceptingBlockHashesOfTxsResponseMessage{}
+ errorMessage.Error = appmessage.RPCErrorf("Method unavailable when kaspad is run without --txindex")
+ return errorMessage, nil
+ }
+
+ getAcceptingBlockHashesOfTxsRequest := request.(*appmessage.GetAcceptingBlockHashesOfTxsRequestMessage)
+
+ domainTxIDs := make([]*externalapi.DomainTransactionID, len(getAcceptingBlockHashesOfTxsRequest.TxIDs))
+ for i := range domainTxIDs {
+ domainTxIDs[i], err = externalapi.NewDomainTransactionIDFromString(getAcceptingBlockHashesOfTxsRequest.TxIDs[i])
+ if err != nil {
+ errorMessage := &appmessage.GetAcceptingBlockHashesOfTxsResponseMessage{}
+ errorMessage.Error = appmessage.RPCErrorf("error parsing txID: %s", getAcceptingBlockHashesOfTxsRequest.TxIDs[i])
+ return errorMessage, nil
+ }
+ }
+ acceptingBlockHashes, _, err := context.TXIndex.TXAcceptingBlockHashes(domainTxIDs)
+ if err != nil {
+ rpcError := &appmessage.RPCError{}
+ if !errors.As(err, &rpcError) {
+ return nil, err
+ }
+ errorMessage := &appmessage.GetAcceptingBlockHashesOfTxsResponseMessage{}
+ errorMessage.Error = rpcError
+ return errorMessage, nil
+ }
+
+ txIDBlockHashpairs := make([]*appmessage.TxIDBlockHashPair, len(acceptingBlockHashes))
+ i := 0
+ for txID, blockHash := range acceptingBlockHashes {
+ txIDBlockHashpairs[i] = &appmessage.TxIDBlockHashPair{
+ TxID: txID.String(),
+ Hash: blockHash.String(),
+ }
+ i++
+ }
+
+ response := appmessage.NewGetAcceptingBlockHashesOfTxsResponse(txIDBlockHashpairs)
+
+ return response, nil
+}
diff --git a/app/rpc/rpchandlers/get_info.go b/app/rpc/rpchandlers/get_info.go
index 308e47615d..3c6cf5c5c8 100644
--- a/app/rpc/rpchandlers/get_info.go
+++ b/app/rpc/rpchandlers/get_info.go
@@ -19,6 +19,8 @@ func HandleGetInfo(context *rpccontext.Context, _ *router.Router, _ appmessage.M
uint64(context.Domain.MiningManager().TransactionCount(true, false)),
version.Version(),
context.Config.UTXOIndex,
+ context.Config.TXIndex,
+ context.Config.IsArchivalNode,
context.ProtocolManager.Context().HasPeers() && isNearlySynced,
)
diff --git a/app/rpc/rpchandlers/get_txs.go b/app/rpc/rpchandlers/get_txs.go
new file mode 100644
index 0000000000..035e182e9e
--- /dev/null
+++ b/app/rpc/rpchandlers/get_txs.go
@@ -0,0 +1,81 @@
+package rpchandlers
+
+import (
+ "errors"
+
+ "github.com/kaspanet/kaspad/app/appmessage"
+ "github.com/kaspanet/kaspad/app/rpc/rpccontext"
+ "github.com/kaspanet/kaspad/domain/consensus/model/externalapi"
+ "github.com/kaspanet/kaspad/domain/consensus/utils/consensushashing"
+ "github.com/kaspanet/kaspad/infrastructure/network/netadapter/router"
+)
+
+// HandleGetTxs handles the respectively named RPC command
+func HandleGetTxs(context *rpccontext.Context, _ *router.Router, request appmessage.Message) (appmessage.Message, error) {
+ var err error
+
+ if !context.Config.TXIndex {
+ errorMessage := &appmessage.GetTxsResponseMessage{}
+ errorMessage.Error = appmessage.RPCErrorf("Method unavailable when kaspad is run without --txindex")
+ return errorMessage, nil
+ }
+
+ getTxsRequest := request.(*appmessage.GetTxsRequestMessage)
+
+ domainTxIDs := make([]*externalapi.DomainTransactionID, len(getTxsRequest.TxIDs))
+
+ for i := range domainTxIDs {
+ domainTxIDs[i], err = externalapi.NewDomainTransactionIDFromString(getTxsRequest.TxIDs[i])
+ if err != nil {
+ errorMessage := &appmessage.GetTxsConfirmationsResponseMessage{}
+ errorMessage.Error = appmessage.RPCErrorf("error parsing txID: %s", getTxsRequest.TxIDs[i])
+ return errorMessage, nil
+ }
+ }
+
+ transactions, _, err := context.TXIndex.GetTXs(domainTxIDs)
+ if err != nil {
+ rpcError := &appmessage.RPCError{}
+ if !errors.As(err, &rpcError) {
+ return nil, err
+ }
+ errorMessage := &appmessage.GetTxsResponseMessage{}
+ errorMessage.Error = rpcError
+ return errorMessage, nil
+ }
+
+ rpcTransactions := make([]*appmessage.RPCTransaction, len(transactions))
+
+ for i := range transactions {
+ rpcTransactions[i] = appmessage.DomainTransactionToRPCTransaction(transactions[i])
+ blockForVerboseData, found, err := context.TXIndex.TXAcceptingBlock(consensushashing.TransactionID(transactions[i]))
+ if err != nil {
+ rpcError := &appmessage.RPCError{}
+ if !errors.As(err, &rpcError) {
+ return nil, err
+ }
+ errorMessage := &appmessage.GetTxsResponseMessage{}
+ errorMessage.Error = rpcError
+ return errorMessage, nil
+ }
+ if !found {
+ errorMessage := &appmessage.GetTxsResponseMessage{}
+ errorMessage.Error = appmessage.RPCErrorf("Could not find accepting block in the txindex database for txID: %s", consensushashing.TransactionID(transactions[i]).String())
+ return errorMessage, nil
+ }
+
+ err = context.PopulateTransactionWithVerboseData(rpcTransactions[i], blockForVerboseData.Header)
+ if err != nil {
+ if errors.Is(err, rpccontext.ErrBuildBlockVerboseDataInvalidBlock) {
+ errorMessage := &appmessage.GetTxsResponseMessage{}
+ errorMessage.Error = appmessage.RPCErrorf("Block %s is invalid", consensushashing.BlockHash(blockForVerboseData).String())
+ return errorMessage, nil
+ }
+ return nil, err
+ }
+ }
+
+ response := appmessage.NewGetTxsResponse(rpcTransactions)
+
+ return response, nil
+}
diff --git a/app/rpc/rpchandlers/get_txs_confirmations.go b/app/rpc/rpchandlers/get_txs_confirmations.go
new file mode 100644
index 0000000000..33f94922d8
--- /dev/null
+++ b/app/rpc/rpchandlers/get_txs_confirmations.go
@@ -0,0 +1,64 @@
+package rpchandlers
+
+import (
+ "errors"
+ "fmt"
+
+ "github.com/kaspanet/kaspad/app/appmessage"
+ "github.com/kaspanet/kaspad/app/rpc/rpccontext"
+ "github.com/kaspanet/kaspad/domain/consensus/model/externalapi"
+ "github.com/kaspanet/kaspad/infrastructure/network/netadapter/router"
+)
+
+// HandleGetTxsConfirmations handles the respectively named RPC command
+func HandleGetTxsConfirmations(context *rpccontext.Context, _ *router.Router, request appmessage.Message) (appmessage.Message, error) {
+ var err error
+
+ if !context.Config.TXIndex {
+ errorMessage := &appmessage.GetTxsConfirmationsResponseMessage{}
+ errorMessage.Error = appmessage.RPCErrorf("Method unavailable when kaspad is run without --txindex")
+ return errorMessage, nil
+ }
+
+ getTxsConfirmationsRequest := request.(*appmessage.GetTxsConfirmationsRequestMessage)
+
+ domainTxIDs := make([]*externalapi.DomainTransactionID, len(getTxsConfirmationsRequest.TxIDs))
+
+ for i := range domainTxIDs {
+ domainTxIDs[i], err = externalapi.NewDomainTransactionIDFromString(getTxsConfirmationsRequest.TxIDs[i])
+ if err != nil {
+ errorMessage := &appmessage.GetTxsConfirmationsResponseMessage{}
+ errorMessage.Error = appmessage.RPCErrorf("error parsing txID: %s", getTxsConfirmationsRequest.TxIDs[i])
+ return errorMessage, nil
+ }
+ }
+
+ txIDsToConfirmations, _, err := context.TXIndex.GetTXsConfirmations(domainTxIDs)
+ if err != nil {
+ rpcError := &appmessage.RPCError{}
+ if !errors.As(err, &rpcError) {
+ return nil, err
+ }
+ errorMessage := &appmessage.GetTxsConfirmationsResponseMessage{}
+ errorMessage.Error = rpcError
+ return errorMessage, nil
+ }
+
+ txIDConfirmationPairs := make([]*appmessage.TxIDConfirmationsPair, len(txIDsToConfirmations))
+
+ i := 0
+ for txID, Confirmations := range txIDsToConfirmations {
+ txIDConfirmationPairs[i] = &appmessage.TxIDConfirmationsPair{
+ TxID: txID.String(),
+ Confirmations: Confirmations,
+ }
+ i++
+ }
+
+ fmt.Println(txIDConfirmationPairs[0].Confirmations)
+ fmt.Println(txIDConfirmationPairs[1].Confirmations)
+
+ response := appmessage.NewGetTxsConfirmationsResponse(txIDConfirmationPairs)
+
+ return response, nil
+}
diff --git a/app/rpc/rpchandlers/modify_notifying_addresses_txs.go b/app/rpc/rpchandlers/modify_notifying_addresses_txs.go
new file mode 100644
index 0000000000..e3d306e913
--- /dev/null
+++ b/app/rpc/rpchandlers/modify_notifying_addresses_txs.go
@@ -0,0 +1,49 @@
+package appmessage
+
+// ModifyNotifyingAddressesTxsRequestMessage is an appmessage corresponding to
+// its respective RPC message
+type ModifyNotifyingAddressesTxsRequestMessage struct {
+ baseMessage
+ AddAddresses []string
+ RemoveAddresses []string
+ RequiredConfirmations uint32
+ IncludePending bool
+ IncludeSending bool
+ IncludeReceiving bool
+}
+
+// Command returns the protocol command string for the message
+func (msg *ModifyNotifyingAddressesTxsRequestMessage) Command() MessageCommand {
+ return CmdModifyNotifyingAddressesTxsRequestMessage
+}
+
+// NewModifyNotifyingAddressesTxsRequestMessage returns a instance of the message
+func NewModifyNotifyingAddressesTxsRequestMessage(addAddresses []string, removeAddresses []string,
+ requiredConfirmations uint32, includePending bool, includeSending bool,
+ includeReceiving bool) *ModifyNotifyingAddressesTxsRequestMessage {
+ return &ModifyNotifyingAddressesTxsRequestMessage{
+ AddAddresses: addAddresses,
+ RemoveAddresses: removeAddresses,
+ RequiredConfirmations: requiredConfirmations,
+ IncludePending: includePending,
+ IncludeSending: includeSending,
+ IncludeReceiving: includeReceiving,
+ }
+}
+
+// ModifyNotifyingAddressesTxsResponseMessage is an appmessage corresponding to
+// its respective RPC message
+type ModifyNotifyingAddressesTxsResponseMessage struct {
+ baseMessage
+ Error *RPCError
+}
+
+// Command returns the protocol command string for the message
+func (msg *ModifyNotifyingAddressesTxsResponseMessage) Command() MessageCommand {
+ return CmdModifyNotifyingAddressesTxsResponseMessage
+}
+
+// NewModifyNotifyingAddressesTxsResponseMessage returns a instance of the message
+func NewModifyNotifyingAddressesTxsResponseMessage() *NotifyAddressesTxsResponseMessage {
+ return &NotifyAddressesTxsResponseMessage{}
+}
diff --git a/app/rpc/rpchandlers/modify_notifying_txs_confirmation_changed.go b/app/rpc/rpchandlers/modify_notifying_txs_confirmation_changed.go
new file mode 100644
index 0000000000..910af4db24
--- /dev/null
+++ b/app/rpc/rpchandlers/modify_notifying_txs_confirmation_changed.go
@@ -0,0 +1,44 @@
+package appmessage
+
+// ModifyNotifyingTxsConfirmationChangedRequestMessage is an appmessage corresponding to
+// its respective RPC message
+type ModifyNotifyingTxsConfirmationChangedRequestMessage struct {
+ baseMessage
+ AddTxIDs []string
+ RemoveTxIDs []string
+ RequiredConfirmations uint32
+ IncludePending bool
+}
+
+// Command returns the protocol command string for the message
+func (msg *ModifyNotifyingTxsConfirmationChangedRequestMessage) Command() MessageCommand {
+ return CmdModifyNotifyingTxsConfirmationChangedRequestMessage
+}
+
+// NewModifyNotifyingTxsConfirmationChangedRequestMessage returns a instance of the message
+func NewModifyNotifyingTxsConfirmationChangedRequestMessage(addTxIDs []string, removeTxIDs []string,
+ requiredConfirmations uint32, includePending bool) *ModifyNotifyingTxsConfirmationChangedRequestMessage {
+ return &ModifyNotifyingTxsConfirmationChangedRequestMessage{
+ AddTxIDs: addTxIDs,
+ RemoveTxIDs: removeTxIDs,
+ RequiredConfirmations: requiredConfirmations,
+ IncludePending: includePending,
+ }
+}
+
+// ModifyNotifyingTxsConfirmationChangedResponseMessage is an appmessage corresponding to
+// its respective RPC message
+type ModifyNotifyingTxsConfirmationChangedResponseMessage struct {
+ baseMessage
+ Error *RPCError
+}
+
+// Command returns the protocol command string for the message
+func (msg *ModifyNotifyingTxsConfirmationChangedResponseMessage) Command() MessageCommand {
+ return CmdModifyNotifyingTxsConfirmationChangedResponseMessage
+}
+
+// NewModifyNotifyingTxsChangedResponseMessage returns a instance of the message
+func NewModifyNotifyingTxsChangedResponseMessage() *NotifyTxsConfirmationChangedResponseMessage {
+ return &NotifyTxsConfirmationChangedResponseMessage{}
+}
diff --git a/app/rpc/rpchandlers/notify_addresses_txs.go b/app/rpc/rpchandlers/notify_addresses_txs.go
new file mode 100644
index 0000000000..a23daba36f
--- /dev/null
+++ b/app/rpc/rpchandlers/notify_addresses_txs.go
@@ -0,0 +1,87 @@
+package appmessage
+
+// NotifyAddressesTxsRequestMessage is an appmessage corresponding to
+// its respective RPC message
+type NotifyAddressesTxsRequestMessage struct {
+ baseMessage
+ Addresses []string
+ RequiredConfirmations uint32
+ IncludePending bool
+ IncludeSending bool
+ IncludeReceiving bool
+}
+
+// Command returns the protocol command string for the message
+func (msg *NotifyAddressesTxsRequestMessage) Command() MessageCommand {
+ return CmdNotifyAddressesTxsRequestMessage
+}
+
+// NewNotifyAddressesTxsRequestMessage returns a instance of the message
+func NewNotifyAddressesTxsRequestMessage(addresses []string, requiredConfirmations uint32,
+ includePending bool, includeSending bool, includeReceiving bool) *NotifyAddressesTxsRequestMessage {
+ return &NotifyAddressesTxsRequestMessage{
+ Addresses: addresses,
+ RequiredConfirmations: requiredConfirmations,
+ IncludePending: includePending,
+ IncludeSending: includeSending,
+ IncludeReceiving: includeReceiving,
+ }
+}
+
+// NotifyAddressesTxsResponseMessage is an appmessage corresponding to
+// its respective RPC message
+type NotifyAddressesTxsResponseMessage struct {
+ baseMessage
+ Error *RPCError
+}
+
+// Command returns the protocol command string for the message
+func (msg *NotifyAddressesTxsResponseMessage) Command() MessageCommand {
+ return CmdNotifyAddressesTxsResponseMessage
+}
+
+// NewNotifyAddressesTxsResponseMessage returns a instance of the message
+func NewNotifyAddressesTxsResponseMessage() *NotifyAddressesTxsResponseMessage {
+ return &NotifyAddressesTxsResponseMessage{}
+}
+
+// AddressesTxsNotificationMessage is an appmessage corresponding to
+// its respective RPC message
+type AddressesTxsNotificationMessage struct {
+ baseMessage
+ RequiredConfirmations uint32
+ Pending *TxEntriesByAddresses
+ Confirmed *TxEntriesByAddresses
+ Unconfirmed *TxEntriesByAddresses
+}
+
+// Command returns the protocol command string for the message
+func (msg *AddressesTxsNotificationMessage) Command() MessageCommand {
+ return CmdAddressesTxsNotificationMessage
+}
+
+// NewAddressesTxsNotificationMessage returns a instance of the message
+func NewAddressesTxsNotificationMessage(requiredConfirmations uint32, pending *TxEntriesByAddresses,
+ confirmed *TxEntriesByAddresses, unconfirmed *TxEntriesByAddresses) *AddressesTxsNotificationMessage {
+ return &AddressesTxsNotificationMessage{
+ RequiredConfirmations: requiredConfirmations,
+ Pending: pending,
+ Confirmed: confirmed,
+ Unconfirmed: unconfirmed,
+ }
+}
+
+// TxEntriesByAddresses is an appmessage corresponding to
+// its respective RPC message
+type TxEntriesByAddresses struct {
+ Sent []*TxEntryByAddress
+ Received []*TxEntryByAddress
+}
+
+// TxEntryByAddress is an appmessage corresponding to
+// its respective RPC message
+type TxEntryByAddress struct {
+ Address string
+ TxID string
+ Confirmations uint32
+}
diff --git a/app/rpc/rpchandlers/notify_txs_confirmation_changed.go b/app/rpc/rpchandlers/notify_txs_confirmation_changed.go
new file mode 100644
index 0000000000..63d28bcb57
--- /dev/null
+++ b/app/rpc/rpchandlers/notify_txs_confirmation_changed.go
@@ -0,0 +1,68 @@
+package appmessage
+
+// NotifyTxsConfirmationChangedRequestMessage is an appmessage corresponding to
+// its respective RPC message
+type NotifyTxsConfirmationChangedRequestMessage struct {
+ baseMessage
+ TxIDs []string
+ RequiredConfirmations uint32
+ IncludePending bool
+}
+
+// Command returns the protocol command string for the message
+func (msg *NotifyTxsConfirmationChangedRequestMessage) Command() MessageCommand {
+ return CmdNotifyTxsConfirmationChangedRequestMessage
+}
+
+// NewNotifyTxsConfirmationChangedRequestMessage returns a instance of the message
+func NewNotifyTxsConfirmationChangedRequestMessage(TxIDs []string, requiredConfirmations uint32,
+ includePending bool) *NotifyTxsConfirmationChangedRequestMessage {
+ return &NotifyTxsConfirmationChangedRequestMessage{
+ TxIDs: TxIDs,
+ RequiredConfirmations: requiredConfirmations,
+ IncludePending: includePending,
+ }
+}
+
+// NotifyTxsConfirmationChangedResponseMessage is an appmessage corresponding to
+// its respective RPC message
+type NotifyTxsConfirmationChangedResponseMessage struct {
+ baseMessage
+ Error *RPCError
+}
+
+// Command returns the protocol command string for the message
+func (msg *NotifyTxsConfirmationChangedResponseMessage) Command() MessageCommand {
+ return CmdNotifyTxsConfirmationChangedResponseMessage
+}
+
+// NewNotifyTxsChangedResponseMessage returns a instance of the message
+func NewNotifyTxsChangedResponseMessage() *NotifyTxsConfirmationChangedResponseMessage {
+ return &NotifyTxsConfirmationChangedResponseMessage{}
+}
+
+// TxsConfirmationChangedNotificationMessage is an appmessage corresponding to
+// its respective RPC message
+type TxsConfirmationChangedNotificationMessage struct {
+ baseMessage
+ RequiredConfirmations uint32
+ Pending []*TxIDConfirmationsPair
+ Confirmed []*TxIDConfirmationsPair
+ UnconfirmedTxIds []string
+}
+
+// Command returns the protocol command string for the message
+func (msg *TxsConfirmationChangedNotificationMessage) Command() MessageCommand {
+ return CmdTxsConfirmationChangedNotificationMessage
+}
+
+// NewTxsChangedNotificationMessage returns a instance of the message
+func NewTxsChangedNotificationMessage(requiredConfirmations uint32, pending []*TxIDConfirmationsPair,
+ confirmed []*TxIDConfirmationsPair, unconfirmedTxIds []string) *TxsConfirmationChangedNotificationMessage {
+ return &TxsConfirmationChangedNotificationMessage{
+ RequiredConfirmations: requiredConfirmations,
+ Pending: pending,
+ Confirmed: confirmed,
+ UnconfirmedTxIds: unconfirmedTxIds,
+ }
+}
diff --git a/cmd/kaspactl/commands.go b/cmd/kaspactl/commands.go
index d56d1b886e..cce13cbbed 100644
--- a/cmd/kaspactl/commands.go
+++ b/cmd/kaspactl/commands.go
@@ -15,6 +15,10 @@ var commandTypes = []reflect.Type{
reflect.TypeOf(protowire.KaspadMessage_GetCurrentNetworkRequest{}),
reflect.TypeOf(protowire.KaspadMessage_GetInfoRequest{}),
+ reflect.TypeOf(protowire.KaspadMessage_GetAcceptingBlockHashesOfTxsRequest{}),
+ reflect.TypeOf(protowire.KaspadMessage_GetTxsRequest{}),
+ reflect.TypeOf(protowire.KaspadMessage_GetTxsConfirmationsRequest{}),
+
reflect.TypeOf(protowire.KaspadMessage_GetBlockRequest{}),
reflect.TypeOf(protowire.KaspadMessage_GetBlocksRequest{}),
reflect.TypeOf(protowire.KaspadMessage_GetHeadersRequest{}),
diff --git a/domain/consensus/consensus.go b/domain/consensus/consensus.go
index 518d7d608d..2a83255c54 100644
--- a/domain/consensus/consensus.go
+++ b/domain/consensus/consensus.go
@@ -74,7 +74,7 @@ func (s *consensus) ValidateAndInsertBlockWithTrustedData(block *externalapi.Blo
s.lock.Lock()
defer s.lock.Unlock()
- _, _, err := s.blockProcessor.ValidateAndInsertBlockWithTrustedData(block, validateUTXO)
+ _, _, _, err := s.blockProcessor.ValidateAndInsertBlockWithTrustedData(block, validateUTXO)
if err != nil {
return err
}
@@ -143,7 +143,7 @@ func (s *consensus) Init(skipAddingGenesis bool) error {
},
},
}
- _, _, err = s.blockProcessor.ValidateAndInsertBlockWithTrustedData(genesisWithTrustedData, true)
+ _, _, _, err = s.blockProcessor.ValidateAndInsertBlockWithTrustedData(genesisWithTrustedData, true)
if err != nil {
return err
}
@@ -249,9 +249,8 @@ func (s *consensus) validateAndInsertBlockWithLock(block *externalapi.DomainBloc
}
return nil
}
-
func (s *consensus) validateAndInsertBlockNoLock(block *externalapi.DomainBlock, updateVirtual bool) (*externalapi.VirtualChangeSet, error) {
- virtualChangeSet, blockStatus, err := s.blockProcessor.ValidateAndInsertBlock(block, updateVirtual)
+ virtualChangeSet, pruningPointChange, blockStatus, err := s.blockProcessor.ValidateAndInsertBlock(block, updateVirtual)
if err != nil {
return nil, err
}
@@ -261,6 +260,14 @@ func (s *consensus) validateAndInsertBlockNoLock(block *externalapi.DomainBlock,
s.virtualNotUpdated = true
}
+ if pruningPointChange != nil {
+ //always send before sendVirtualChangedEvent, since it will trigger the TXIndex reset before an update
+ err = s.sendPruningPointChangedEvent(pruningPointChange)
+ if err != nil {
+ return nil, err
+ }
+ }
+
err = s.sendBlockAddedEvent(block, blockStatus)
if err != nil {
return nil, err
@@ -321,6 +328,21 @@ func (s *consensus) sendVirtualChangedEvent(virtualChangeSet *externalapi.Virtua
return nil
}
+func (s *consensus) sendPruningPointChangedEvent(pruningPointChange *externalapi.PruningPointChange) error {
+ if s.consensusEventsChan != nil {
+
+ if len(s.consensusEventsChan) == cap(s.consensusEventsChan) {
+ return errors.Errorf("consensusEventsChan is full")
+ }
+
+ s.consensusEventsChan <- pruningPointChange
+
+ return nil
+ }
+ return nil
+
+}
+
// ValidateTransactionAndPopulateWithConsensusData validates the given transaction
// and populates it with any missing consensus data
func (s *consensus) ValidateTransactionAndPopulateWithConsensusData(transaction *externalapi.DomainTransaction) error {
@@ -373,6 +395,22 @@ func (s *consensus) GetBlock(blockHash *externalapi.DomainHash) (*externalapi.Do
return block, nil
}
+func (s *consensus) GetBlocks(blockHashes []*externalapi.DomainHash) ([]*externalapi.DomainBlock, error) {
+ s.lock.Lock()
+ defer s.lock.Unlock()
+
+ stagingArea := model.NewStagingArea()
+
+ blocks, err := s.blockStore.Blocks(s.databaseContext, stagingArea, blockHashes)
+ if err != nil {
+ if errors.Is(err, database.ErrNotFound) {
+ return nil, errors.Wrapf(err, "could not find Quried blocks")
+ }
+ return nil, err
+ }
+ return blocks, nil
+}
+
func (s *consensus) GetBlockEvenIfHeaderOnly(blockHash *externalapi.DomainHash) (*externalapi.DomainBlock, error) {
s.lock.Lock()
defer s.lock.Unlock()
@@ -966,7 +1004,8 @@ func (s *consensus) resolveVirtualChunkNoLock(maxBlocksToResolve uint64) (*exter
s.virtualNotUpdated = !isCompletelyResolved
stagingArea := model.NewStagingArea()
- err = s.pruningManager.UpdatePruningPointByVirtual(stagingArea)
+
+ pruningPointChange, err := s.pruningManager.UpdatePruningPointByVirtualAndReturnChange(stagingArea)
if err != nil {
return nil, false, err
}
@@ -981,6 +1020,13 @@ func (s *consensus) resolveVirtualChunkNoLock(maxBlocksToResolve uint64) (*exter
return nil, false, err
}
+ if pruningPointChange != nil {
+ err = s.sendPruningPointChangedEvent(pruningPointChange)
+ if err != nil {
+ return nil, false, err
+ }
+ }
+
err = s.sendVirtualChangedEvent(virtualChangeSet, true)
if err != nil {
return nil, false, err
diff --git a/domain/consensus/database/serialization/dbobjects.pb.go b/domain/consensus/database/serialization/dbobjects.pb.go
index f237621c37..e37c40a320 100644
--- a/domain/consensus/database/serialization/dbobjects.pb.go
+++ b/domain/consensus/database/serialization/dbobjects.pb.go
@@ -1,6 +1,6 @@
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
-// protoc-gen-go v1.28.0
+// protoc-gen-go v1.26.0
// protoc v3.17.2
// source: dbobjects.proto
diff --git a/domain/consensus/database/serialization/dbobjects.proto b/domain/consensus/database/serialization/dbobjects.proto
index 1248ad33da..5844f1f77a 100644
--- a/domain/consensus/database/serialization/dbobjects.proto
+++ b/domain/consensus/database/serialization/dbobjects.proto
@@ -162,4 +162,4 @@ message DbBlockHeaderCount {
message DbBlockGHOSTDAGDataHashPair {
DbHash hash = 1;
DbBlockGhostdagData GhostdagData = 2;
-}
+}
\ No newline at end of file
diff --git a/domain/consensus/factory.go b/domain/consensus/factory.go
index 8d1efef470..5d75ee08f5 100644
--- a/domain/consensus/factory.go
+++ b/domain/consensus/factory.go
@@ -547,7 +547,7 @@ func (f *factory) NewConsensus(config *Config, db infrastructuredatabase.Databas
// If the virtual moved before shutdown but the pruning point hasn't, we
// move it if needed.
stagingArea := model.NewStagingArea()
- err = pruningManager.UpdatePruningPointByVirtual(stagingArea)
+ _, err = pruningManager.UpdatePruningPointByVirtualAndReturnChange(stagingArea)
if err != nil {
return nil, false, err
}
diff --git a/domain/consensus/model/externalapi/consensus.go b/domain/consensus/model/externalapi/consensus.go
index d7aadc2036..0fff5b3543 100644
--- a/domain/consensus/model/externalapi/consensus.go
+++ b/domain/consensus/model/externalapi/consensus.go
@@ -14,6 +14,7 @@ type Consensus interface {
ApplyPruningPointProof(pruningPointProof *PruningPointProof) error
GetBlock(blockHash *DomainHash) (*DomainBlock, error)
+ GetBlocks(blockHashes []*DomainHash) ([]*DomainBlock, error)
GetBlockEvenIfHeaderOnly(blockHash *DomainHash) (*DomainBlock, error)
GetBlockHeader(blockHash *DomainHash) (BlockHeader, error)
GetBlockInfo(blockHash *DomainHash) (*BlockInfo, error)
diff --git a/domain/consensus/model/externalapi/consensus_events.go b/domain/consensus/model/externalapi/consensus_events.go
index 54c0158493..2f34a050fc 100644
--- a/domain/consensus/model/externalapi/consensus_events.go
+++ b/domain/consensus/model/externalapi/consensus_events.go
@@ -5,6 +5,14 @@ type ConsensusEvent interface {
isConsensusEvent()
}
+// PruningPointChange is an event raised by consensus when a new pruning point was added to the dag
+type PruningPointChange struct {
+ OldPruningPoint *DomainHash
+ NewPruningPoint *DomainHash
+}
+
+func (*PruningPointChange) isConsensusEvent() {}
+
// BlockAdded is an event raised by consensus when a block was added to the dag
type BlockAdded struct {
Block *DomainBlock
diff --git a/domain/consensus/model/interface_processes_blockprocessor.go b/domain/consensus/model/interface_processes_blockprocessor.go
index cf6b835aa8..d046c16eeb 100644
--- a/domain/consensus/model/interface_processes_blockprocessor.go
+++ b/domain/consensus/model/interface_processes_blockprocessor.go
@@ -4,7 +4,7 @@ import "github.com/kaspanet/kaspad/domain/consensus/model/externalapi"
// BlockProcessor is responsible for processing incoming blocks
type BlockProcessor interface {
- ValidateAndInsertBlock(block *externalapi.DomainBlock, shouldValidateAgainstUTXO bool) (*externalapi.VirtualChangeSet, externalapi.BlockStatus, error)
+ ValidateAndInsertBlock(block *externalapi.DomainBlock, shouldValidateAgainstUTXO bool) (*externalapi.VirtualChangeSet, *externalapi.PruningPointChange, externalapi.BlockStatus, error)
ValidateAndInsertImportedPruningPoint(newPruningPoint *externalapi.DomainHash) error
- ValidateAndInsertBlockWithTrustedData(block *externalapi.BlockWithTrustedData, validateUTXO bool) (*externalapi.VirtualChangeSet, externalapi.BlockStatus, error)
+ ValidateAndInsertBlockWithTrustedData(block *externalapi.BlockWithTrustedData, validateUTXO bool) (*externalapi.VirtualChangeSet, *externalapi.PruningPointChange, externalapi.BlockStatus, error)
}
diff --git a/domain/consensus/model/interface_processes_pruningmanager.go b/domain/consensus/model/interface_processes_pruningmanager.go
index cda221ba8d..1e4bc8e62b 100644
--- a/domain/consensus/model/interface_processes_pruningmanager.go
+++ b/domain/consensus/model/interface_processes_pruningmanager.go
@@ -4,7 +4,7 @@ import "github.com/kaspanet/kaspad/domain/consensus/model/externalapi"
// PruningManager resolves and manages the current pruning point
type PruningManager interface {
- UpdatePruningPointByVirtual(stagingArea *StagingArea) error
+ UpdatePruningPointByVirtualAndReturnChange(stagingArea *StagingArea) (*externalapi.PruningPointChange, error)
IsValidPruningPoint(stagingArea *StagingArea, blockHash *externalapi.DomainHash) (bool, error)
ArePruningPointsViolatingFinality(stagingArea *StagingArea, pruningPoints []externalapi.BlockHeader) (bool, error)
ArePruningPointsInValidChain(stagingArea *StagingArea) (bool, error)
diff --git a/domain/consensus/processes/blockprocessor/blockprocessor.go b/domain/consensus/processes/blockprocessor/blockprocessor.go
index f61ed14300..3e5dab59a9 100644
--- a/domain/consensus/processes/blockprocessor/blockprocessor.go
+++ b/domain/consensus/processes/blockprocessor/blockprocessor.go
@@ -145,7 +145,7 @@ func New(
// ValidateAndInsertBlock validates the given block and, if valid, applies it
// to the current state
func (bp *blockProcessor) ValidateAndInsertBlock(block *externalapi.DomainBlock,
- shouldValidateAgainstUTXO bool) (*externalapi.VirtualChangeSet, externalapi.BlockStatus, error) {
+ shouldValidateAgainstUTXO bool) (*externalapi.VirtualChangeSet, *externalapi.PruningPointChange, externalapi.BlockStatus, error) {
onEnd := logger.LogAndMeasureExecutionTime(log, "ValidateAndInsertBlock")
defer onEnd()
@@ -162,7 +162,7 @@ func (bp *blockProcessor) ValidateAndInsertImportedPruningPoint(newPruningPoint
}
func (bp *blockProcessor) ValidateAndInsertBlockWithTrustedData(block *externalapi.BlockWithTrustedData,
- shouldValidateAgainstUTXO bool) (*externalapi.VirtualChangeSet, externalapi.BlockStatus, error) {
+ shouldValidateAgainstUTXO bool) (*externalapi.VirtualChangeSet, *externalapi.PruningPointChange, externalapi.BlockStatus, error) {
onEnd := logger.LogAndMeasureExecutionTime(log, "ValidateAndInsertBlockWithTrustedData")
defer onEnd()
diff --git a/domain/consensus/processes/blockprocessor/validate_and_insert_block.go b/domain/consensus/processes/blockprocessor/validate_and_insert_block.go
index 5d71d60e08..452bd37c1b 100644
--- a/domain/consensus/processes/blockprocessor/validate_and_insert_block.go
+++ b/domain/consensus/processes/blockprocessor/validate_and_insert_block.go
@@ -77,44 +77,47 @@ func (bp *blockProcessor) updateVirtualAcceptanceDataAfterImportingPruningPoint(
}
func (bp *blockProcessor) validateAndInsertBlock(stagingArea *model.StagingArea, block *externalapi.DomainBlock,
- isPruningPoint bool, shouldValidateAgainstUTXO bool, isBlockWithTrustedData bool) (*externalapi.VirtualChangeSet, externalapi.BlockStatus, error) {
+ isPruningPoint bool, shouldValidateAgainstUTXO bool, isBlockWithTrustedData bool) (*externalapi.VirtualChangeSet, *externalapi.PruningPointChange, externalapi.BlockStatus, error) {
blockHash := consensushashing.HeaderHash(block.Header)
err := bp.validateBlock(stagingArea, block, isBlockWithTrustedData)
if err != nil {
- return nil, externalapi.StatusInvalid, err
+ return nil, nil, externalapi.StatusInvalid, err
}
status, err := bp.setBlockStatusAfterBlockValidation(stagingArea, block, isPruningPoint)
if err != nil {
- return nil, externalapi.StatusInvalid, err
+ return nil, nil, externalapi.StatusInvalid, err
}
var oldHeadersSelectedTip *externalapi.DomainHash
+
hasHeaderSelectedTip, err := bp.headersSelectedTipStore.Has(bp.databaseContext, stagingArea)
if err != nil {
- return nil, externalapi.StatusInvalid, err
+ return nil, nil, externalapi.StatusInvalid, err
}
if hasHeaderSelectedTip {
var err error
oldHeadersSelectedTip, err = bp.headersSelectedTipStore.HeadersSelectedTip(bp.databaseContext, stagingArea)
if err != nil {
- return nil, externalapi.StatusInvalid, err
+ return nil, nil, externalapi.StatusInvalid, err
}
}
+ var oldPruningPoint *externalapi.DomainHash
+
shouldAddHeaderSelectedTip := false
if !hasHeaderSelectedTip {
shouldAddHeaderSelectedTip = true
} else {
- pruningPoint, err := bp.pruningStore.PruningPoint(bp.databaseContext, stagingArea)
+ oldPruningPoint, err = bp.pruningStore.PruningPoint(bp.databaseContext, stagingArea)
if err != nil {
- return nil, externalapi.StatusInvalid, err
+ return nil, nil, externalapi.StatusInvalid, err
}
- isInSelectedChainOfPruningPoint, err := bp.dagTopologyManager.IsInSelectedParentChainOf(stagingArea, pruningPoint, blockHash)
+ isInSelectedChainOfPruningPoint, err := bp.dagTopologyManager.IsInSelectedParentChainOf(stagingArea, oldPruningPoint, blockHash)
if err != nil {
- return nil, externalapi.StatusInvalid, err
+ return nil, nil, externalapi.StatusInvalid, err
}
// Don't set blocks in the anticone of the pruning point as header selected tip.
@@ -125,7 +128,7 @@ func (bp *blockProcessor) validateAndInsertBlock(stagingArea *model.StagingArea,
// Don't set blocks in the anticone of the pruning point as header selected tip.
err = bp.headerTipsManager.AddHeaderTip(stagingArea, blockHash)
if err != nil {
- return nil, externalapi.StatusInvalid, err
+ return nil, nil, externalapi.StatusInvalid, err
}
}
@@ -138,40 +141,42 @@ func (bp *blockProcessor) validateAndInsertBlock(stagingArea *model.StagingArea,
// Attempt to add the block to the virtual
selectedParentChainChanges, virtualUTXODiff, reversalData, err = bp.consensusStateManager.AddBlock(stagingArea, blockHash, shouldValidateAgainstUTXO)
if err != nil {
- return nil, externalapi.StatusInvalid, err
+ return nil, nil, externalapi.StatusInvalid, err
}
}
if hasHeaderSelectedTip {
err := bp.updateReachabilityReindexRoot(stagingArea, oldHeadersSelectedTip)
if err != nil {
- return nil, externalapi.StatusInvalid, err
+ return nil, nil, externalapi.StatusInvalid, err
}
}
+ var pruningPointChange *externalapi.PruningPointChange
+
if !isHeaderOnlyBlock && shouldValidateAgainstUTXO {
// Trigger pruning, which will check if the pruning point changed and delete the data if it did.
- err = bp.pruningManager.UpdatePruningPointByVirtual(stagingArea)
+ pruningPointChange, err = bp.pruningManager.UpdatePruningPointByVirtualAndReturnChange(stagingArea)
if err != nil {
- return nil, externalapi.StatusInvalid, err
+ return nil, nil, externalapi.StatusInvalid, err
}
}
err = staging.CommitAllChanges(bp.databaseContext, stagingArea)
if err != nil {
- return nil, externalapi.StatusInvalid, err
+ return nil, nil, externalapi.StatusInvalid, err
}
if reversalData != nil {
err = bp.consensusStateManager.ReverseUTXODiffs(blockHash, reversalData)
if err != nil {
- return nil, externalapi.StatusInvalid, err
+ return nil, nil, externalapi.StatusInvalid, err
}
}
err = bp.pruningManager.UpdatePruningPointIfRequired()
if err != nil {
- return nil, externalapi.StatusInvalid, err
+ return nil, nil, externalapi.StatusInvalid, err
}
log.Debug(logger.NewLogClosure(func() string {
@@ -196,14 +201,14 @@ func (bp *blockProcessor) validateAndInsertBlock(stagingArea *model.StagingArea,
virtualGhostDAGData.BlueScore(), blockCount, headerCount)
}))
if logClosureErr != nil {
- return nil, externalapi.StatusInvalid, logClosureErr
+ return nil, nil, externalapi.StatusInvalid, logClosureErr
}
virtualParents, err := bp.dagTopologyManager.Parents(stagingArea, model.VirtualBlockHash)
if database.IsNotFoundError(err) {
virtualParents = nil
} else if err != nil {
- return nil, externalapi.StatusInvalid, err
+ return nil, nil, externalapi.StatusInvalid, err
}
bp.pastMedianTimeManager.InvalidateVirtualPastMedianTimeCache()
@@ -214,7 +219,7 @@ func (bp *blockProcessor) validateAndInsertBlock(stagingArea *model.StagingArea,
VirtualSelectedParentChainChanges: selectedParentChainChanges,
VirtualUTXODiff: virtualUTXODiff,
VirtualParents: virtualParents,
- }, status, nil
+ }, pruningPointChange, status, nil
}
func (bp *blockProcessor) loadUTXODataForGenesis(stagingArea *model.StagingArea, block *externalapi.DomainBlock) {
diff --git a/domain/consensus/processes/blockprocessor/validate_and_insert_block_with_trusted_data.go b/domain/consensus/processes/blockprocessor/validate_and_insert_block_with_trusted_data.go
index 7627ef00e8..53d9718562 100644
--- a/domain/consensus/processes/blockprocessor/validate_and_insert_block_with_trusted_data.go
+++ b/domain/consensus/processes/blockprocessor/validate_and_insert_block_with_trusted_data.go
@@ -8,7 +8,7 @@ import (
)
func (bp *blockProcessor) validateAndInsertBlockWithTrustedData(stagingArea *model.StagingArea,
- block *externalapi.BlockWithTrustedData, validateUTXO bool) (*externalapi.VirtualChangeSet, externalapi.BlockStatus, error) {
+ block *externalapi.BlockWithTrustedData, validateUTXO bool) (*externalapi.VirtualChangeSet, *externalapi.PruningPointChange, externalapi.BlockStatus, error) {
blockHash := consensushashing.BlockHash(block.Block)
for i, daaBlock := range block.DAAWindow {
@@ -22,7 +22,7 @@ func (bp *blockProcessor) validateAndInsertBlockWithTrustedData(stagingArea *mod
blockReplacedGHOSTDAGData, err := bp.ghostdagDataWithoutPrunedBlocks(stagingArea, block.GHOSTDAGData[0].GHOSTDAGData)
if err != nil {
- return nil, externalapi.StatusInvalid, err
+ return nil, nil, externalapi.StatusInvalid, err
}
bp.ghostdagDataStore.Stage(stagingArea, blockHash, blockReplacedGHOSTDAGData, false)
diff --git a/domain/consensus/processes/pruningmanager/pruningmanager.go b/domain/consensus/processes/pruningmanager/pruningmanager.go
index c5bdf1cf90..c978edff16 100644
--- a/domain/consensus/processes/pruningmanager/pruningmanager.go
+++ b/domain/consensus/processes/pruningmanager/pruningmanager.go
@@ -112,48 +112,52 @@ func New(
}
}
-func (pm *pruningManager) UpdatePruningPointByVirtual(stagingArea *model.StagingArea) error {
+func (pm *pruningManager) UpdatePruningPointByVirtualAndReturnChange(stagingArea *model.StagingArea) (*externalapi.PruningPointChange, error) {
onEnd := logger.LogAndMeasureExecutionTime(log, "pruningManager.UpdatePruningPointByVirtual")
defer onEnd()
hasPruningPoint, err := pm.pruningStore.HasPruningPoint(pm.databaseContext, stagingArea)
if err != nil {
- return err
+ return nil, err
}
if !hasPruningPoint {
hasGenesis, err := pm.blocksStore.HasBlock(pm.databaseContext, stagingArea, pm.genesisHash)
if err != nil {
- return err
+ return nil, err
}
if hasGenesis {
err = pm.savePruningPoint(stagingArea, pm.genesisHash)
if err != nil {
- return err
+ return nil, err
}
}
// Pruning point should initially set manually on a pruned-headers node.
- return nil
+ return &externalapi.PruningPointChange{
+ NewPruningPoint: pm.genesisHash,
+ }, err
}
virtualGHOSTDAGData, err := pm.ghostdagDataStore.Get(pm.databaseContext, stagingArea, model.VirtualBlockHash, false)
if err != nil {
- return err
+ return nil, err
}
if virtualGHOSTDAGData.SelectedParent().Equal(pm.genesisHash) {
- return nil
+ return &externalapi.PruningPointChange{
+ OldPruningPoint: pm.genesisHash,
+ }, err
}
newPruningPoint, newCandidate, err := pm.nextPruningPointAndCandidateByBlockHash(stagingArea, virtualGHOSTDAGData.SelectedParent(), nil)
if err != nil {
- return err
+ return nil, err
}
currentCandidate, err := pm.pruningPointCandidate(stagingArea)
if err != nil {
- return err
+ return nil, err
}
if !newCandidate.Equal(currentCandidate) {
@@ -163,32 +167,36 @@ func (pm *pruningManager) UpdatePruningPointByVirtual(stagingArea *model.Staging
currentPruningPoint, err := pm.pruningStore.PruningPoint(pm.databaseContext, stagingArea)
if err != nil {
- return err
+ return nil, err
}
if !newPruningPoint.Equal(currentPruningPoint) {
currentPruningPointGHOSTDAGData, err := pm.ghostdagDataStore.Get(pm.databaseContext, stagingArea, currentPruningPoint, false)
if err != nil {
- return err
+ return nil, err
}
newPruningPointGHOSTDAGData, err := pm.ghostdagDataStore.Get(pm.databaseContext, stagingArea, newPruningPoint, false)
if err != nil {
- return err
+ return nil, err
}
if pm.finalityScore(newPruningPointGHOSTDAGData.BlueScore()) > pm.finalityScore(currentPruningPointGHOSTDAGData.BlueScore())+1 {
- return errors.Errorf("cannot advance pruning point by more than one finality interval at once")
+ return nil, errors.Errorf("cannot advance pruning point by more than one finality interval at once")
}
log.Debugf("Moving pruning point from %s to %s", currentPruningPoint, newPruningPoint)
err = pm.savePruningPoint(stagingArea, newPruningPoint)
if err != nil {
- return err
+ return nil, err
}
+ return &externalapi.PruningPointChange{
+ OldPruningPoint: currentPruningPoint,
+ NewPruningPoint: newPruningPoint,
+ }, nil
}
- return nil
+ return nil, nil
}
type blockIteratorFromOneBlock struct {
diff --git a/domain/consensus/test_consensus.go b/domain/consensus/test_consensus.go
index 6f67c47a3d..9bd720ee9f 100644
--- a/domain/consensus/test_consensus.go
+++ b/domain/consensus/test_consensus.go
@@ -272,7 +272,7 @@ func (tc *testConsensus) UpdatePruningPointByVirtual() error {
defer tc.lock.Unlock()
stagingArea := model.NewStagingArea()
- err := tc.pruningManager.UpdatePruningPointByVirtual(stagingArea)
+ _, err := tc.pruningManager.UpdatePruningPointByVirtualAndReturnChange(stagingArea)
if err != nil {
return err
}
diff --git a/domain/txindex/log.go b/domain/txindex/log.go
new file mode 100644
index 0000000000..898b14a7b2
--- /dev/null
+++ b/domain/txindex/log.go
@@ -0,0 +1,11 @@
+// Copyright (c) 2016 The btcsuite developers
+// Use of this source code is governed by an ISC
+// license that can be found in the LICENSE file.
+
+package txindex
+
+import (
+ "github.com/kaspanet/kaspad/infrastructure/logger"
+)
+
+var log = logger.RegisterSubSystem("TXIN")
diff --git a/domain/txindex/model.go b/domain/txindex/model.go
new file mode 100644
index 0000000000..3053ec2ce5
--- /dev/null
+++ b/domain/txindex/model.go
@@ -0,0 +1,48 @@
+package txindex
+
+import (
+ "github.com/kaspanet/kaspad/domain/consensus/model/externalapi"
+)
+
+// TXsChanges is the set of changes made to the TX index after
+// a successful update
+type TXsChanges struct {
+ Added TxChange
+ Removed TxChange
+}
+
+type AddrsChanges struct {
+ AddedSent AddrsChange
+ RemovedSent AddrsChange
+ AddedReceived AddrsChange
+ RemovedReceived AddrsChange
+}
+
+type TxChange map[externalapi.DomainTransactionID]*TxData
+type AddrsChange map[ScriptPublicKeyString][]*externalapi.DomainTransactionID
+
+type VirtualBlueScore uint64
+
+type ScriptPublicKeyString string
+//TxData holds tx data stored in the TXIndex database
+
+type TxData struct {
+ IncludingBlockHash *externalapi.DomainHash
+ AcceptingBlockHash *externalapi.DomainHash
+ IncludingIndex uint32
+}
+
+//TxIDsToTxIndexData is a map of TxIDs to corrospnding TxIndexData
+type TxIDsToTxIndexData map[externalapi.DomainTransactionID]*TxData
+
+//TxIDsToBlockHashes is a map of TxIDs to corrospnding blockHashes
+type TxIDsToBlockHashes map[externalapi.DomainTransactionID]*externalapi.DomainHash
+
+//TxIDsToBlocks is a map of TxIDs to corrospnding blocks
+type TxIDsToBlocks map[externalapi.DomainTransactionID]*externalapi.DomainBlock
+
+//TxIDsToConfirmations is a map of TxIDs to corrospnding Confirmations
+type TxIDsToConfirmations map[externalapi.DomainTransactionID]int64
+
+//TxIDsToBlueScores is a map of TxIDs to corrospnding Confirmations
+type TxIDsToBlueScores map[externalapi.DomainTransactionID]uint64
diff --git a/domain/txindex/serialization.go b/domain/txindex/serialization.go
new file mode 100644
index 0000000000..bdef8ee6af
--- /dev/null
+++ b/domain/txindex/serialization.go
@@ -0,0 +1,139 @@
+package txindex
+
+import (
+ "encoding/binary"
+ "io"
+
+ "github.com/kaspanet/kaspad/domain/consensus/model/externalapi"
+ "github.com/pkg/errors"
+)
+
+func serializeHashes(hashes []*externalapi.DomainHash) []byte {
+ serializedHashes := make([]byte, hashesLengthSize+externalapi.DomainHashSize*len(hashes))
+ binary.LittleEndian.PutUint64(serializedHashes[:hashesLengthSize], uint64(len(hashes)))
+ for i, hash := range hashes {
+ start := hashesLengthSize + externalapi.DomainHashSize*i
+ end := start + externalapi.DomainHashSize
+ copy(serializedHashes[start:end], hash.ByteSlice())
+ }
+ return serializedHashes
+}
+
+const hashesLengthSize = 8
+
+func deserializeHashes(serializedHashes []byte) ([]*externalapi.DomainHash, error) {
+ length := binary.LittleEndian.Uint64(serializedHashes[:hashesLengthSize])
+ hashes := make([]*externalapi.DomainHash, length)
+ for i := uint64(0); i < length; i++ {
+ start := hashesLengthSize + externalapi.DomainHashSize*i
+ end := start + externalapi.DomainHashSize
+
+ if end > uint64(len(serializedHashes)) {
+ return nil, errors.Wrapf(io.ErrUnexpectedEOF, "unexpected EOF while deserializing hashes")
+ }
+
+ var err error
+ hashes[i], err = externalapi.NewDomainHashFromByteSlice(serializedHashes[start:end])
+ if err != nil {
+ return nil, err
+ }
+ }
+
+ return hashes, nil
+}
+
+func serializeTxIds(deserializedTransactionIds []*externalapi.DomainTransactionID) []byte {
+ serializedHashes := make([]byte, externalapi.DomainHashSize * len(deserializedTransactionIds))
+ for i, transactionId := range deserializedTransactionIds {
+ start := hashesLengthSize + externalapi.DomainHashSize*i
+ end := start + externalapi.DomainHashSize
+ copy(serializedHashes[start:end], transactionId.ByteSlice())
+ }
+ return serializedHashes
+}
+
+func deserializeTxIds(serializedTransactionIds []byte) ([]*externalapi.DomainTransactionID, error) {
+ length := len(serializedTransactionIds) / 32
+ transactionIds := make([]*externalapi.DomainTransactionID, length)
+ for i := 0; i < length; i++ {
+ start := externalapi.DomainHashSize * i
+ end := start + externalapi.DomainHashSize
+
+ if end > len(serializedTransactionIds) {
+ return nil, errors.Wrapf(io.ErrUnexpectedEOF, "unexpected EOF while deserializing transaction Ids")
+ }
+
+ var err error
+ transactionIds[i], err = externalapi.NewDomainTransactionIDFromByteSlice(serializedTransactionIds[start:end])
+ if err != nil {
+ return nil, err
+ }
+ }
+
+ return transactionIds, nil
+}
+
+func deserializeTxIdsToMap(serializedTransactionIds []byte) (map[*externalapi.DomainTransactionID]interface{}, error) {
+ length := len(serializedTransactionIds) / 32
+ transactionIdsMap := make(map[*externalapi.DomainTransactionID]interface{}, length)
+ for i := 0; i < length; i++ {
+ start := externalapi.DomainHashSize * i
+ end := start + externalapi.DomainHashSize
+
+ if end > len(serializedTransactionIds) {
+ return nil, errors.Wrapf(io.ErrUnexpectedEOF, "unexpected EOF while deserializing transaction Ids")
+ }
+
+ var err error
+ transactionId, err := externalapi.NewDomainTransactionIDFromByteSlice(serializedTransactionIds[start:end])
+ if err != nil {
+ return nil, err
+ }
+ transactionIdsMap[transactionId] = nil
+
+ }
+
+ return transactionIdsMap, nil
+}
+
+func serializeTxIdsFromMap(deserializedTransactionIdsMap map[*externalapi.DomainTransactionID]interface{}) ([]byte) {
+ serializedTxIds := make([]byte, externalapi.DomainHashSize * len(deserializedTransactionIdsMap))
+ i := 0
+ for transactionId := range deserializedTransactionIdsMap {
+ start := hashesLengthSize + externalapi.DomainHashSize* i
+ end := start + externalapi.DomainHashSize
+ copy(serializedTxIds[start:end], transactionId.ByteSlice())
+ i++
+ }
+ return serializedTxIds
+}
+
+func deserializeTxIndexData(serializedTxIndexData []byte) (*TxData, error) {
+ var err error
+
+ deserializedTxIndexData := &TxData{}
+ deserializedTxIndexData.IncludingBlockHash, err = externalapi.NewDomainHashFromByteSlice(serializedTxIndexData[:32])
+ if err != nil {
+ return nil, err
+ }
+ deserializedTxIndexData.AcceptingBlockHash, err = externalapi.NewDomainHashFromByteSlice(serializedTxIndexData[32:64])
+ if err != nil {
+ return nil, err
+ }
+ deserializedTxIndexData.IncludingIndex = binary.BigEndian.Uint32(serializedTxIndexData[64:68])
+
+ return deserializedTxIndexData, nil
+}
+
+func serializeTxIndexData(blockTxIndexData *TxData) []byte {
+ indexBytes := make([]byte, 4)
+ binary.BigEndian.PutUint32(indexBytes, blockTxIndexData.IncludingIndex)
+ serializedTxIndexData := append(
+ append(
+ blockTxIndexData.IncludingBlockHash.ByteSlice(),
+ blockTxIndexData.AcceptingBlockHash.ByteSlice()...,
+ ),
+ indexBytes...,
+ )
+ return serializedTxIndexData
+}
diff --git a/domain/txindex/serialization_test.go b/domain/txindex/serialization_test.go
new file mode 100644
index 0000000000..665fc0debd
--- /dev/null
+++ b/domain/txindex/serialization_test.go
@@ -0,0 +1,43 @@
+package txindex
+
+import (
+ "encoding/binary"
+ "math/rand"
+ "testing"
+
+ "github.com/kaspanet/kaspad/domain/consensus/model/externalapi"
+)
+
+func Test_serializeTxIndexData(t *testing.T) {
+ r := rand.New(rand.NewSource(0))
+
+ serializedtxIndex := make([]byte, 68) // 32 bytes including block hash 32 bytes accepting blockhash and 4 bytes uint32
+ r.Read(serializedtxIndex[:])
+ includingBlockHash, err := externalapi.NewDomainHashFromByteSlice(serializedtxIndex[:32])
+ if err != nil {
+ t.Fatalf(err.Error())
+ }
+ acceptingBlockHash, err := externalapi.NewDomainHashFromByteSlice(serializedtxIndex[32:64])
+ if err != nil {
+ t.Fatalf(err.Error())
+ }
+ includingIndex := binary.BigEndian.Uint32(serializedtxIndex[64:68])
+
+ testdeserializedtxIndex := &TxData{
+ IncludingBlockHash: includingBlockHash,
+ AcceptingBlockHash: acceptingBlockHash,
+ IncludingIndex: includingIndex,
+ }
+
+ result, err := deserializeTxIndexData(serializeTxIndexData(testdeserializedtxIndex))
+ if err != nil {
+ t.Fatalf("Failed deserializing txIndexData: %v", err)
+ }
+ if !testdeserializedtxIndex.IncludingBlockHash.Equal(result.IncludingBlockHash) {
+ t.Fatalf("Expected including block hash: \n %s \n Got: \n %s\n", testdeserializedtxIndex.IncludingBlockHash.String(), result.IncludingBlockHash.String())
+ } else if !testdeserializedtxIndex.AcceptingBlockHash.Equal(result.AcceptingBlockHash) {
+ t.Fatalf("Expected accepting block hash \n %s \n Got: \n %s\n", testdeserializedtxIndex.AcceptingBlockHash.String(), result.AcceptingBlockHash.String())
+ } else if testdeserializedtxIndex.IncludingIndex != result.IncludingIndex {
+ t.Fatalf("Expected including index \n %d \n Got: \n %d\n", testdeserializedtxIndex.IncludingIndex, result.IncludingIndex)
+ }
+}
diff --git a/domain/txindex/store.go b/domain/txindex/store.go
new file mode 100644
index 0000000000..54e05b7616
--- /dev/null
+++ b/domain/txindex/store.go
@@ -0,0 +1,566 @@
+package txindex
+
+import (
+ "encoding/binary"
+
+ "github.com/kaspanet/kaspad/domain/consensus/model/externalapi"
+ "github.com/kaspanet/kaspad/infrastructure/db/database"
+ "github.com/kaspanet/kaspad/infrastructure/logger"
+ "github.com/pkg/errors"
+ "golang.org/x/exp/maps"
+)
+
+var txAcceptedIndexBucket = database.MakeBucket([]byte("tx-index"))
+var addrIndexSentBucket = database.MakeBucket([]byte("addr-index-sent"))
+var addrIndexReceivedBucket = database.MakeBucket([]byte("addr-index-received"))
+
+var virtualParentsKey = database.MakeBucket([]byte("")).Key([]byte("tx-index-virtual-parent"))
+var virtualBlueScoreKey = database.MakeBucket([]byte("")).Key([]byte("tx-index-virtual-bluescore"))
+var pruningPointKey = database.MakeBucket([]byte("")).Key([]byte("tx-index-prunning-point"))
+
+type txIndexStore struct {
+ database database.Database
+ toAddTxs TxChange
+ toRemoveTxs TxChange
+ toAddSent AddrsChange
+ toRemoveSent AddrsChange
+ toAddReceived AddrsChange
+ toRemoveReceived AddrsChange
+ virtualParents []*externalapi.DomainHash
+ virtualBlueScore VirtualBlueScore
+ pruningPoint *externalapi.DomainHash
+}
+
+func newTXIndexStore(database database.Database) *txIndexStore {
+ return &txIndexStore{
+ database: database,
+ toAddTxs: make(TxChange),
+ toRemoveTxs: make(TxChange),
+ toAddSent: make(AddrsChange),
+ toRemoveSent: make(AddrsChange),
+ toAddReceived: make(AddrsChange),
+ toRemoveReceived: make(AddrsChange),
+ virtualParents: nil,
+ pruningPoint: nil,
+ }
+}
+
+func (tis *txIndexStore) deleteAll() error {
+ err := tis.database.Delete(virtualParentsKey)
+ if err != nil {
+ return err
+ }
+
+ err = tis.database.Delete(pruningPointKey)
+ if err != nil {
+ return err
+ }
+
+ err = tis.database.Delete(virtualBlueScoreKey)
+ if err != nil {
+ return err
+ }
+
+ cursor, err := tis.database.Cursor(txAcceptedIndexBucket)
+ if err != nil {
+ return err
+ }
+ defer cursor.Close()
+ for cursor.Next() {
+ key, err := cursor.Key()
+ if err != nil {
+ return err
+ }
+
+ err = tis.database.Delete(key)
+ if err != nil {
+ return err
+ }
+ }
+
+ return nil
+}
+
+func (tis *txIndexStore) add(txID externalapi.DomainTransactionID, includingIndex uint32,
+ includingBlockHash *externalapi.DomainHash, acceptingBlockHash *externalapi.DomainHash,
+ sentAddrs []*externalapi.ScriptPublicKey, receivedAddrs []*externalapi.ScriptPublicKey) {
+ log.Tracef("Adding %s Txs from blockHash %s", txID.String(), includingBlockHash.String())
+ delete(tis.toRemoveTxs, txID) //adding takes precedence
+ tis.toAddTxs[txID] = &TxData{
+ IncludingBlockHash: includingBlockHash,
+ IncludingIndex: includingIndex,
+ AcceptingBlockHash: acceptingBlockHash,
+ }
+ for _, sentAddrs := range sentAddrs{
+ txIDs, found := tis.toAddSent[ScriptPublicKeyString(sentAddrs.String())]
+ if found {
+ tis.toAddSent[ScriptPublicKeyString(sentAddrs.String())] = append(txIDs, &txID)
+ } else {
+ tis.toAddSent[ScriptPublicKeyString(sentAddrs.String())] = []*externalapi.DomainTransactionID{&txID}
+ }
+ }
+ for _, receivedAddr := range receivedAddrs{
+ txIDs, found := tis.toAddReceived[ScriptPublicKeyString(receivedAddr.String())]
+ if found {
+ tis.toAddReceived[ScriptPublicKeyString(receivedAddr.String())] = append(txIDs, &txID)
+ } else {
+ tis.toAddReceived[ScriptPublicKeyString(receivedAddr.String())] = []*externalapi.DomainTransactionID{&txID}
+ }
+ }
+}
+
+func (tis *txIndexStore) remove(txID externalapi.DomainTransactionID, includingIndex uint32,
+ includingBlockHash *externalapi.DomainHash, acceptingBlockHash *externalapi.DomainHash,
+ sentAddrs []*externalapi.ScriptPublicKey, receivedAddrs []*externalapi.ScriptPublicKey) {
+ log.Tracef("Removing %s Txs from blockHash %s", txID.String(), includingBlockHash.String())
+ if _, found := tis.toAddTxs[txID]; !found { //adding takes precedence
+ tis.toRemoveTxs[txID] = &TxData{
+ IncludingBlockHash: includingBlockHash,
+ IncludingIndex: includingIndex,
+ AcceptingBlockHash: acceptingBlockHash,
+ }
+ for _, sentAddrs := range sentAddrs{
+ txIDs, found := tis.toAddSent[ScriptPublicKeyString(sentAddrs.String())]
+ if found {
+ tis.toAddSent[ScriptPublicKeyString(sentAddrs.String())] = append(txIDs, &txID)
+ } else {
+ tis.toAddSent[ScriptPublicKeyString(sentAddrs.String())] = []*externalapi.DomainTransactionID{&txID}
+ }
+ }
+ for _, receivedAddr := range receivedAddrs{
+ txIDs, found := tis.toAddReceived[ScriptPublicKeyString(receivedAddr.String())]
+ if found {
+ tis.toAddReceived[ScriptPublicKeyString(receivedAddr.String())] = append(txIDs, &txID)
+ } else {
+ tis.toAddReceived[ScriptPublicKeyString(receivedAddr.String())] = []*externalapi.DomainTransactionID{&txID}
+ }
+ }
+ }
+}
+
+func (tis *txIndexStore) discardAllButPruningPoint() {
+ tis.toAddTxs = make(TxChange)
+ tis.toRemoveTxs = make(TxChange)
+ tis.toAddSent = make(AddrsChange)
+ tis.toRemoveSent = make(AddrsChange)
+ tis.toAddReceived = make(AddrsChange)
+ tis.toRemoveReceived = make(AddrsChange)
+ tis.virtualParents = nil
+}
+
+func (tis *txIndexStore) commit() error {
+ onEnd := logger.LogAndMeasureExecutionTime(log, "txIndexStore.commit")
+ defer onEnd()
+
+ dbTransaction, err := tis.database.Begin()
+ if err != nil {
+ return err
+ }
+
+ defer dbTransaction.RollbackUnlessClosed()
+
+ for toAddTxID, txData := range tis.toAddTxs {
+ delete(tis.toRemoveTxs, toAddTxID) //safeguard
+ key := tis.convertTxIDToKey(txAcceptedIndexBucket, toAddTxID)
+ dbTransaction.Put(key, serializeTxIndexData(txData))
+ if err != nil {
+ return err
+ }
+ }
+
+ for toRemoveTxID := range tis.toRemoveTxs {
+ key := tis.convertTxIDToKey(txAcceptedIndexBucket, toRemoveTxID)
+ err := dbTransaction.Delete(key)
+ if err != nil {
+ return err
+ }
+ }
+
+ for scriptPublicKey, receivedTxsRemoved := range tis.toRemoveSent {
+ scriptPublicKey := externalapi.NewScriptPublicKeyFromString(string(scriptPublicKey))
+ key := tis.convertScriptPublicKeyToKey(addrIndexSentBucket, scriptPublicKey)
+ serializedTxIds, err := tis.database.Get(key)
+ if err != nil {
+ return err
+ }
+ TxIdsSet, err := deserializeTxIdsToMap(serializedTxIds)
+ if err != nil {
+ return err
+ }
+ for _, receivedTxIdToRemove := range receivedTxsRemoved {
+ delete(TxIdsSet, receivedTxIdToRemove)
+ }
+
+ serializedTxIds = serializeTxIdsFromMap(TxIdsSet)
+
+ err = tis.database.Put(key, serializedTxIds)
+ if err != nil {
+ return err
+ }
+ }
+
+ for scriptPublicKey, receivedTxsRemoved := range tis.toRemoveReceived {
+ scriptPublicKey := externalapi.NewScriptPublicKeyFromString(string(scriptPublicKey))
+ key := tis.convertScriptPublicKeyToKey(addrIndexReceivedBucket, scriptPublicKey)
+ serializedTxIds, err := tis.database.Get(key)
+ if err != nil {
+ return err
+ }
+ TxIdsSet, err := deserializeTxIdsToMap(serializedTxIds)
+ if err != nil {
+ return err
+ }
+ for _, receivedTxIdToRemove := range receivedTxsRemoved {
+ delete(TxIdsSet, receivedTxIdToRemove)
+ }
+
+ serializedTxIds = serializeTxIdsFromMap(TxIdsSet)
+
+ err = tis.database.Put(key, serializedTxIds)
+ if err != nil {
+ return err
+ }
+ }
+
+ for scriptPublicKey, sentTxsAdded := range tis.toAddSent {
+ scriptPublicKey := externalapi.NewScriptPublicKeyFromString(string(scriptPublicKey))
+ key := tis.convertScriptPublicKeyToKey(addrIndexSentBucket, scriptPublicKey)
+ found, err := tis.database.Has(key)
+ if err != nil {
+ return err
+ }
+ if found{
+ serializedTxIds, err := tis.database.Get(key)
+ if err != nil {
+ return err
+ }
+ TxIdsSet, err := deserializeTxIdsToMap(serializedTxIds)
+ if err != nil {
+ return err
+ }
+ newTxIds := make([]*externalapi.DomainTransactionID, 0)
+ for _, sentTxId := range sentTxsAdded {
+ if _, found := TxIdsSet[sentTxId]; found {
+ continue
+ }
+ newTxIds = append(newTxIds, sentTxId)
+ }
+ sentTxsAdded = newTxIds
+
+ }
+ serializedTxIds := serializeTxIds(sentTxsAdded)
+
+ err = tis.database.Put(key, serializedTxIds)
+ if err != nil {
+ return err
+ }
+ }
+
+ for scriptPublicKey, receivedTxsAdded := range tis.toAddReceived {
+ scriptPublicKey := externalapi.NewScriptPublicKeyFromString(string(scriptPublicKey))
+ key := tis.convertScriptPublicKeyToKey(addrIndexReceivedBucket, scriptPublicKey)
+ found, err := tis.database.Has(key)
+ if err != nil {
+ return err
+ }
+ if found {
+ serializedTxIds, err := tis.database.Get(key)
+ if err != nil {
+ return err
+ }
+ TxIdsSet, err := deserializeTxIdsToMap(serializedTxIds)
+ if err != nil {
+ return err
+ }
+ newTxIds := make([]*externalapi.DomainTransactionID, 0)
+ for _, recivedTxIdToAdd := range receivedTxsAdded {
+ if _, found := TxIdsSet[recivedTxIdToAdd]; found {
+ continue
+ }
+ newTxIds = append(newTxIds, recivedTxIdToAdd)
+ }
+ receivedTxsAdded = newTxIds
+
+ }
+ serializedTxIds := serializeTxIds(receivedTxsAdded)
+
+ err = tis.database.Put(key, serializedTxIds)
+ if err != nil {
+ return err
+ }
+ }
+
+ err = dbTransaction.Put(virtualParentsKey, serializeHashes(tis.virtualParents))
+ if err != nil {
+ return err
+ }
+
+ err = dbTransaction.Commit()
+ if err != nil {
+ return err
+ }
+
+ tis.discardAllButPruningPoint()
+
+ return nil
+}
+
+func (tis *txIndexStore) commitVirtualParentsWithoutTransaction(virtualParents []*externalapi.DomainHash) error {
+ serializeParentHashes := serializeHashes(virtualParents)
+ return tis.database.Put(virtualParentsKey, serializeParentHashes)
+}
+
+func (tis *txIndexStore) updateVirtualParents(virtualParents []*externalapi.DomainHash) {
+ tis.virtualParents = virtualParents
+}
+
+func (tis *txIndexStore) updateAndCommitPruningPointWithoutTransaction(pruningPoint *externalapi.DomainHash) error {
+ tis.pruningPoint = pruningPoint
+
+ return tis.database.Put(pruningPointKey, pruningPoint.ByteSlice())
+}
+
+func (tis *txIndexStore) commitTxIDsWithoutTransaction() error {
+ for txID, txData := range tis.toAddTxs {
+ delete(tis.toRemoveTxs, txID) //adding takes precedence
+ key := tis.convertTxIDToKey(txAcceptedIndexBucket, txID)
+ err := tis.database.Put(key, serializeTxIndexData(txData))
+ if err != nil {
+ return err
+ }
+ }
+
+ for txID := range tis.toRemoveTxs { //safer to remove first
+ key := tis.convertTxIDToKey(txAcceptedIndexBucket, txID)
+ err := tis.database.Delete(key)
+ if err != nil {
+ return err
+ }
+ }
+
+ return nil
+}
+
+func (tis *txIndexStore) getVirtualParents() ([]*externalapi.DomainHash, error) {
+ if tis.isAnythingStaged() {
+ return nil, errors.Errorf("cannot get the virtual parent while staging isn't empty")
+ }
+
+ serializedVirtualParentHash, err := tis.database.Get(virtualParentsKey)
+ if err != nil {
+ return nil, err
+ }
+
+ return deserializeHashes(serializedVirtualParentHash)
+}
+
+func (tis *txIndexStore) getPruningPoint() (*externalapi.DomainHash, error) {
+ if tis.isAnythingStaged() {
+ return nil, errors.Errorf("cannot get the Pruning point while staging isn't empty")
+ }
+
+ serializedPruningPointHash, err := tis.database.Get(pruningPointKey)
+ if err != nil {
+ return nil, err
+ }
+
+ return externalapi.NewDomainHashFromByteSlice(serializedPruningPointHash)
+}
+
+func (tis *txIndexStore) getBlueScore() (uint64, error) {
+ if tis.isAnythingStaged() {
+ return 0, errors.Errorf("cannot get the virtual bluescore while staging isn't empty")
+ }
+
+ serializedVirtualBlueScore, err := tis.database.Get(virtualBlueScoreKey)
+ if err != nil {
+ return 0, err
+ }
+
+ return binary.BigEndian.Uint64(serializedVirtualBlueScore), nil
+}
+
+func (tis *txIndexStore) convertTxIDToKey(bucket *database.Bucket, txID externalapi.DomainTransactionID) *database.Key {
+ return bucket.Key(txID.ByteSlice())
+}
+
+func (tis *txIndexStore) convertScriptPublicKeyToKey(bucket *database.Bucket, scriptPublicKey *externalapi.ScriptPublicKey) *database.Key {
+ var scriptPublicKeyBytes = make([]byte, 2+len(scriptPublicKey.Script)) // uint16
+ binary.LittleEndian.PutUint16(scriptPublicKeyBytes[:2], scriptPublicKey.Version)
+ copy(scriptPublicKeyBytes[2:], scriptPublicKey.Script)
+ return bucket.Key(scriptPublicKeyBytes)
+}
+
+func (tis *txIndexStore) stagedData() (
+ toAddTxs TxChange,
+ toRemoveTxs TxChange,
+ toAddSent AddrsChange,
+ toRemoveSent AddrsChange,
+ toAddReceived AddrsChange,
+ toRemoveReceived AddrsChange,
+ virtualParents []*externalapi.DomainHash,
+ pruningPoint *externalapi.DomainHash ) {
+
+ toAddClone := make(TxChange)
+ toRemoveClone := make(TxChange)
+ toAddSentClone := make(AddrsChange)
+ toRemoveSentClone := make(AddrsChange)
+ toAddReceivedClone := make(AddrsChange)
+ toRemoveReceivedClone := make(AddrsChange)
+
+ maps.Copy(toAddClone, tis.toAddTxs)
+ maps.Copy(toRemoveClone, tis.toRemoveTxs)
+ maps.Copy(toAddSentClone, tis.toAddSent)
+ maps.Copy(toRemoveSentClone, tis.toRemoveSent)
+ maps.Copy(toAddReceivedClone, tis.toAddReceived)
+ maps.Copy(toRemoveReceivedClone, tis.toRemoveReceived)
+
+ return toAddClone, toRemoveClone, toAddSentClone,
+ toRemoveSentClone, toAddReceivedClone,
+ toRemoveReceived, tis.virtualParents, tis.pruningPoint
+}
+
+func (tis *txIndexStore) isAnythingStaged() bool {
+ return len(tis.toAddTxs) > 0 || len(tis.toRemoveTxs) > 0
+}
+
+func (tis *txIndexStore) getTxData(txID *externalapi.DomainTransactionID) (txData *TxData, found bool, err error) {
+
+ if tis.isAnythingStaged() {
+ return nil, false, errors.Errorf("cannot get TX accepting Block hash while staging isn't empty")
+ }
+
+ key := tis.convertTxIDToKey(txAcceptedIndexBucket, *txID)
+ serializedTxData, err := tis.database.Get(key)
+ if err != nil {
+ if database.IsNotFoundError(err) {
+ return nil, false, nil
+ }
+ return nil, false, err
+ }
+
+ deserializedTxData, err := deserializeTxIndexData(serializedTxData)
+ if err != nil {
+ return nil, false, err
+ }
+
+ return deserializedTxData, true, nil
+}
+
+func (tis *txIndexStore) getTxsData(txIDs []*externalapi.DomainTransactionID) (
+ txsData TxIDsToTxIndexData, notFoundTxIDs []*externalapi.DomainTransactionID, err error) {
+
+ if tis.isAnythingStaged() {
+ return nil, nil, errors.Errorf("cannot get TX accepting Block hash while staging isn't empty")
+ }
+
+ keys := make([]*database.Key, len(txIDs))
+
+ txsData = make(TxIDsToTxIndexData)
+ notFoundTxIDs = make([]*externalapi.DomainTransactionID, 0)
+
+ for i, key := range keys {
+ key = tis.convertTxIDToKey(txAcceptedIndexBucket, *txIDs[i])
+ serializedTxData, err := tis.database.Get(key)
+ if err != nil {
+ if database.IsNotFoundError(err) {
+ notFoundTxIDs = append(notFoundTxIDs, txIDs[i])
+ } else {
+ return nil, nil, err
+ }
+ }
+ deserializedTxData, err := deserializeTxIndexData(serializedTxData)
+ if err != nil {
+ return nil, nil, err
+ }
+
+ txsData[*txIDs[i]] = deserializedTxData
+ }
+
+ return txsData, notFoundTxIDs, nil
+}
+
+func (tis *txIndexStore) getTxIdsFromScriptPublicKey(scriptPublicKey *externalapi.ScriptPublicKey, includeReceived bool, includeSent bool) (
+ received []*externalapi.DomainTransactionID, sent []*externalapi.DomainTransactionID, err error) {
+
+ if tis.isAnythingStaged() {
+ return nil, nil, errors.Errorf("cannot get TX accepting Block hash while staging isn't empty")
+ }
+
+ if includeReceived {
+ key := tis.convertScriptPublicKeyToKey(addrIndexReceivedBucket, scriptPublicKey)
+ serializedTxIds, err := tis.database.Get(key)
+ if err != nil && !database.IsNotFoundError(err){
+ return nil, nil, err
+ }
+ received, err = deserializeTxIds(serializedTxIds)
+ if err != nil {
+ return nil, nil, err
+ }
+
+ }
+ if includeSent {
+ key := tis.convertScriptPublicKeyToKey(addrIndexSentBucket, scriptPublicKey)
+ serializedTxIds, err := tis.database.Get(key)
+ if err != nil && !database.IsNotFoundError(err) {
+ return nil, nil, err
+ }
+
+ sent, err = deserializeTxIds(serializedTxIds)
+ if err != nil {
+ return nil, nil, err
+ }
+ }
+
+ return received, sent, nil
+}
+
+func (tis *txIndexStore) getTxIdsOfScriptPublicKeys(scriptPublicKeys []*externalapi.ScriptPublicKey, includeReceived bool, includeSent bool) (
+ AddrsChange, AddrsChange, error) {
+
+ if tis.isAnythingStaged() {
+ return nil, nil, errors.Errorf("cannot get TXs of scriptPublicKeys while staging isn't empty")
+ }
+
+ AddressesToReceivedTxIds := make(AddrsChange)
+ AddressesToSentTxIds := make(AddrsChange)
+
+ for _, scriptPublicKey := range scriptPublicKeys {
+ if includeReceived {
+ key := tis.convertScriptPublicKeyToKey(addrIndexReceivedBucket, scriptPublicKey)
+ serializedTxIds, err := tis.database.Get(key)
+ if err != nil {
+ if database.IsNotFoundError(err) {
+ continue
+ } else {
+ return nil, nil, err
+ }
+ }
+ deserializedTxIds, err := deserializeTxIds(serializedTxIds)
+ if err != nil {
+ return nil, nil, err
+ }
+
+ AddressesToReceivedTxIds[ScriptPublicKeyString(scriptPublicKey.String())] = deserializedTxIds
+ }
+ if includeSent {
+ key := tis.convertScriptPublicKeyToKey(addrIndexSentBucket, scriptPublicKey)
+ serializedTxIds, err := tis.database.Get(key)
+ if err != nil {
+ if database.IsNotFoundError(err) {
+ continue
+ } else {
+ return nil, nil, err
+ }
+ }
+ deserializedTxIds, err := deserializeTxIds(serializedTxIds)
+ if err != nil {
+ return nil, nil, err
+ }
+
+ AddressesToSentTxIds[ScriptPublicKeyString(scriptPublicKey.String())] = deserializedTxIds
+ }
+ }
+
+ return AddressesToReceivedTxIds, AddressesToSentTxIds, nil
+}
diff --git a/domain/txindex/txindex.go b/domain/txindex/txindex.go
new file mode 100644
index 0000000000..8df0a56809
--- /dev/null
+++ b/domain/txindex/txindex.go
@@ -0,0 +1,719 @@
+package txindex
+
+import (
+ "fmt"
+ "sync"
+
+ "github.com/kaspanet/kaspad/domain"
+ "github.com/kaspanet/kaspad/domain/consensus/model/externalapi"
+ "github.com/kaspanet/kaspad/domain/consensus/utils/consensushashing"
+ "github.com/kaspanet/kaspad/infrastructure/db/database"
+ "github.com/kaspanet/kaspad/infrastructure/logger"
+)
+
+//TO DO: For archival nodes pruningPoint references should be substituted with the virtualchainBlock with the lowest bluescore!
+
+// TXIndex maintains an index between transaction IDs and accepting block hashes
+type TXIndex struct {
+ domain domain.Domain
+ store *txIndexStore
+
+ mutex sync.Mutex
+}
+
+// New creates a new TX index.
+//
+// NOTE: While this is called no new blocks can be added to the consensus.
+func New(domain domain.Domain, database database.Database) (*TXIndex, error) {
+ txIndex := &TXIndex{
+ domain: domain,
+ store: newTXIndexStore(database),
+ }
+ isSynced, err := txIndex.isSynced()
+ if err != nil {
+ return nil, err
+ }
+
+ if !isSynced || true {
+
+ err := txIndex.Reset()
+ if err != nil {
+ return nil, err
+ }
+ }
+
+ return txIndex, nil
+}
+
+// Reset deletes the whole Txindex and resyncs it from consensus.
+func (ti *TXIndex) Reset() error {
+ ti.mutex.Lock()
+ defer ti.mutex.Unlock()
+
+ log.Tracef("Reseting TX Index")
+
+ err := ti.store.deleteAll()
+ if err != nil {
+ return err
+ }
+
+ virtualInfo, err := ti.domain.Consensus().GetVirtualInfo()
+ if err != nil {
+ return err
+ }
+
+ pruningPoint, err := ti.domain.Consensus().PruningPoint()
+ if err != nil {
+ return err
+ }
+
+ //we iterate from pruningPoint up - this gurantees that newer accepting blocks overwrite older ones in the store mapping
+ //we also do not collect data before pruning point, since relevent blockData is pruned (see `TO DO`` note at the top regarding archival nodes)
+ selectedParentChainChanges, err := ti.domain.Consensus().GetVirtualSelectedParentChainFromBlock(pruningPoint)
+ if err != nil {
+ return err
+ }
+
+ ti.removeTXIDs(selectedParentChainChanges, len(selectedParentChainChanges.Removed))
+ if err != nil {
+ return err
+ }
+
+ ti.addTXIDs(selectedParentChainChanges, len(selectedParentChainChanges.Added))
+ if err != nil {
+ return err
+ }
+
+ err = ti.store.commitTxIDsWithoutTransaction()
+ if err != nil {
+ return err
+ }
+
+ ti.store.updateAndCommitPruningPointWithoutTransaction(pruningPoint)
+ if err != nil {
+ return err
+ }
+
+ ti.store.commitVirtualParentsWithoutTransaction(virtualInfo.ParentHashes)
+ if err != nil {
+ return err
+ }
+
+ ti.store.discardAllButPruningPoint()
+
+ return nil
+}
+
+func (ti *TXIndex) isSynced() (bool, error) {
+
+ txIndexVirtualParents, err := ti.store.getVirtualParents()
+ if err != nil {
+ if database.IsNotFoundError(err) {
+ return false, nil
+ }
+ return false, err
+ }
+
+ txIndexPruningPoint, err := ti.store.getPruningPoint()
+ if err != nil {
+ if database.IsNotFoundError(err) {
+ return false, nil
+ }
+ return false, err
+ }
+
+ virtualInfo, err := ti.domain.Consensus().GetVirtualInfo()
+ if err != nil {
+ return false, err
+ }
+
+ PruningPoint, err := ti.domain.Consensus().PruningPoint()
+ if err != nil {
+ return false, err
+ }
+
+ return externalapi.HashesEqual(virtualInfo.ParentHashes, txIndexVirtualParents) || txIndexPruningPoint.Equal(PruningPoint), nil
+}
+
+// Update updates the TX index with the given DAG selected parent chain changes
+func (ti *TXIndex) Update(virtualChangeSet *externalapi.VirtualChangeSet) (*TXsChanges, *AddrsChanges, error) {
+ onEnd := logger.LogAndMeasureExecutionTime(log, "TXIndex.Update")
+ defer onEnd()
+
+ ti.mutex.Lock()
+ defer ti.mutex.Unlock()
+
+ log.Tracef("Updating TX index with VirtualSelectedParentChainChanges: %+v", virtualChangeSet.VirtualSelectedParentChainChanges)
+
+ err := ti.removeTXIDs(virtualChangeSet.VirtualSelectedParentChainChanges, 1000)
+ if err != nil {
+ return nil, nil, err
+ }
+
+ err = ti.addTXIDs(virtualChangeSet.VirtualSelectedParentChainChanges, 1000)
+ if err != nil {
+ return nil, nil, err
+ }
+
+ ti.store.updateVirtualParents(virtualChangeSet.VirtualParents)
+
+ txsAdded, txsRemoved, addrsSentTxsAdded, addrsSentTxsRemoved, addrsReceivedAdded, addrsReceivedTxsRemoved, _, _ := ti.store.stagedData()
+ txChanges := &TXsChanges{
+ Added: txsAdded,
+ Removed: txsRemoved,
+ }
+
+ AddrsChanges := &AddrsChanges{
+ AddedSent: addrsSentTxsAdded,
+ RemovedSent: addrsSentTxsRemoved,
+ AddedReceived: addrsReceivedAdded,
+ RemovedReceived: addrsReceivedTxsRemoved,
+ }
+
+ err = ti.store.commit()
+ if err != nil {
+ return nil, nil, err
+ }
+
+ return txChanges, AddrsChanges, nil
+}
+
+func (ti *TXIndex) addTXIDs(selectedParentChainChanges *externalapi.SelectedChainPath, chunkSize int) error {
+ position := 0
+ for position < len(selectedParentChainChanges.Added) {
+ var chainBlocksChunk []*externalapi.DomainHash
+
+ if position+chunkSize > len(selectedParentChainChanges.Added) {
+ chainBlocksChunk = selectedParentChainChanges.Added[position:]
+ } else {
+ chainBlocksChunk = selectedParentChainChanges.Added[position : position+chunkSize]
+ }
+ // We use chunks in order to avoid blocking consensus for too long
+ // note: this might not be needed here, but unsure how kaspad handles pruning / when reset might be called.
+ chainBlocksAcceptanceData, err := ti.domain.Consensus().GetBlocksAcceptanceData(chainBlocksChunk)
+ if err != nil {
+ return err
+ }
+ for i, acceptingBlockHash := range chainBlocksChunk {
+ chainBlockAcceptanceData := chainBlocksAcceptanceData[i]
+ for _, blockAcceptanceData := range chainBlockAcceptanceData {
+ for j, transactionAcceptanceData := range blockAcceptanceData.TransactionAcceptanceData {
+ log.Warnf("TX index Adding: %d transactions", len(blockAcceptanceData.TransactionAcceptanceData))
+ if transactionAcceptanceData.IsAccepted {
+ if err != nil {
+ return err
+ }
+
+ senders := make([]*externalapi.ScriptPublicKey, len(transactionAcceptanceData.Transaction.Inputs))
+ for i, input := range transactionAcceptanceData.Transaction.Inputs {
+ senders[i] = input.UTXOEntry.ScriptPublicKey()
+ }
+
+ receivers := make([]*externalapi.ScriptPublicKey, len(transactionAcceptanceData.Transaction.Outputs))
+ for i, output := range transactionAcceptanceData.Transaction.Outputs {
+ receivers[i] = output.ScriptPublicKey
+ }
+ ti.store.add(
+ *consensushashing.TransactionID(transactionAcceptanceData.Transaction),
+ uint32(j), // index of including block where transaction is found
+ blockAcceptanceData.BlockHash, // this is the including block
+ acceptingBlockHash, // this is the accepting block
+ senders,
+ receivers,
+ )
+ }
+ }
+ }
+ }
+ position += chunkSize
+ }
+ return nil
+}
+
+func (ti *TXIndex) removeTXIDs(selectedParentChainChanges *externalapi.SelectedChainPath, chunkSize int) error {
+ position := 0
+ for position < len(selectedParentChainChanges.Removed) {
+ var chainBlocksChunk []*externalapi.DomainHash
+
+ if position+chunkSize > len(selectedParentChainChanges.Removed) {
+ chainBlocksChunk = selectedParentChainChanges.Removed[position:]
+ } else {
+ chainBlocksChunk = selectedParentChainChanges.Removed[position : position+chunkSize]
+ }
+ // We use chunks in order to avoid blocking consensus for too long
+ // note: this might not be needed here, but unsure how kaspad handles pruning / when reset might be called.
+ chainBlocksAcceptanceData, err := ti.domain.Consensus().GetBlocksAcceptanceData(chainBlocksChunk)
+ if err != nil {
+ return err
+ }
+ for i, acceptingBlockHash := range chainBlocksChunk {
+ chainBlockAcceptanceData := chainBlocksAcceptanceData[i]
+ for _, blockAcceptanceData := range chainBlockAcceptanceData {
+ log.Tracef("TX index Removing: %d transactions", len(blockAcceptanceData.TransactionAcceptanceData))
+ for j, transactionAcceptanceData := range blockAcceptanceData.TransactionAcceptanceData {
+ if transactionAcceptanceData.IsAccepted {
+ senders := make([]*externalapi.ScriptPublicKey, len(transactionAcceptanceData.Transaction.Inputs))
+ for i, input := range transactionAcceptanceData.Transaction.Inputs {
+ senders[i] = input.UTXOEntry.ScriptPublicKey()
+ }
+
+ receivers := make([]*externalapi.ScriptPublicKey, len(transactionAcceptanceData.Transaction.Outputs))
+ for i, output := range transactionAcceptanceData.Transaction.Outputs {
+ receivers[i] = output.ScriptPublicKey
+ }
+ ti.store.add(
+ *consensushashing.TransactionID(transactionAcceptanceData.Transaction),
+ uint32(j), // index of including block where transaction is found
+ blockAcceptanceData.BlockHash, // this is the including block
+ acceptingBlockHash, // this is the accepting block
+ senders,
+ receivers,
+ )
+ }
+ }
+ }
+ }
+ position += chunkSize
+ }
+ return nil
+}
+
+// TXAcceptingBlockHash returns the accepting block hash for for the given txID
+func (ti *TXIndex) TXAcceptingBlockHash(txID *externalapi.DomainTransactionID) (
+ acceptingBlockHash *externalapi.DomainHash, found bool, err error) {
+ onEnd := logger.LogAndMeasureExecutionTime(log, "TXIndex.TXAcceptingBlockHash")
+ defer onEnd()
+
+ ti.mutex.Lock()
+ defer ti.mutex.Unlock()
+
+ txData, found, err := ti.store.getTxData(txID)
+ if err != nil {
+ return nil, false, err
+ }
+ if !found {
+ return nil, false, nil
+ }
+
+ return txData.AcceptingBlockHash, found, nil
+}
+
+// TXAcceptingBlockHashes returns the accepting block hashes for for the given txIDs
+func (ti *TXIndex) TXAcceptingBlockHashes(txIDs []*externalapi.DomainTransactionID) (
+ txIDsToAcceptingBlockHashes TxIDsToBlockHashes, missingTxIds []*externalapi.DomainTransactionID, err error) {
+ onEnd := logger.LogAndMeasureExecutionTime(log, "TXIndex.TXAcceptingBlockHashes")
+ defer onEnd()
+
+ ti.mutex.Lock()
+ defer ti.mutex.Unlock()
+
+ txIDsToTxIndexData, missingTxIds, err := ti.store.getTxsData(txIDs)
+ if err != nil {
+ return nil, nil, err
+ }
+
+ txIDsToAcceptingBlockHashes = make(TxIDsToBlockHashes)
+ for txID, txIndexData := range txIDsToTxIndexData {
+ txIDsToAcceptingBlockHashes[txID] = txIndexData.AcceptingBlockHash
+ }
+
+ return txIDsToAcceptingBlockHashes, missingTxIds, nil
+}
+
+// TXAcceptingBlock returns the accepting block for for the given txID
+func (ti *TXIndex) TXAcceptingBlock(txID *externalapi.DomainTransactionID) (
+ block *externalapi.DomainBlock, found bool, err error) {
+ onEnd := logger.LogAndMeasureExecutionTime(log, "TXIndex.TXAcceptingBlock")
+ defer onEnd()
+
+ ti.mutex.Lock()
+ defer ti.mutex.Unlock()
+
+ txIndexData, found, err := ti.store.getTxData(txID)
+ if err != nil {
+ return nil, false, err
+ }
+
+ acceptingBlock, err := ti.domain.Consensus().GetBlockEvenIfHeaderOnly(txIndexData.AcceptingBlockHash)
+
+ if err != nil {
+ if database.IsNotFoundError(err) {
+ return nil, false, fmt.Errorf("accepting block %s missing for txID %s ", txIndexData.AcceptingBlockHash.String(), txID.String())
+ }
+ return nil, false, err
+ }
+ return acceptingBlock, true, nil
+}
+
+// GetTXs returns the domain transaction for for the given txIDs
+func (ti *TXIndex) GetTXs(txIDs []*externalapi.DomainTransactionID) (
+ txs []*externalapi.DomainTransaction, notFound []*externalapi.DomainTransactionID, err error) {
+ onEnd := logger.LogAndMeasureExecutionTime(log, "TXIndex.GetTXs")
+ defer onEnd()
+
+ ti.mutex.Lock()
+ defer ti.mutex.Unlock()
+
+ txIDsToTxIndexData, notFound, err := ti.store.getTxsData(txIDs)
+ if err != nil {
+ return nil, nil, err
+ }
+
+ txs = make([]*externalapi.DomainTransaction, len(txIDsToTxIndexData))
+ i := 0
+
+ for txID, txIndexData := range txIDsToTxIndexData {
+ includingBlock, err := ti.domain.Consensus().GetBlockEvenIfHeaderOnly(txIndexData.IncludingBlockHash)
+
+ if err != nil {
+ if database.IsNotFoundError(err) {
+ return nil, nil, fmt.Errorf("including block %s missing for txID %s ", txIndexData.IncludingBlockHash.String(), txID.String())
+ }
+ return nil, nil, err
+ }
+
+ txs[i] = includingBlock.Transactions[txIndexData.IncludingIndex]
+ i++
+ }
+
+ return txs, notFound, nil
+}
+
+// GetTXConfirmations returns the tx confirmations for for the given txID
+func (ti *TXIndex) GetTXConfirmations(txID *externalapi.DomainTransactionID) (
+ confirmations int64, found bool, err error) {
+ onEnd := logger.LogAndMeasureExecutionTime(log, "TXIndex.GetTXConfirmations")
+ defer onEnd()
+
+ ti.mutex.Lock()
+ defer ti.mutex.Unlock()
+
+ txdata, found, err := ti.store.getTxData(txID)
+ if err != nil {
+ return 0, false, err
+ }
+
+ acceptingBlockHeader, err := ti.domain.Consensus().GetBlockHeader(txdata.AcceptingBlockHash)
+ if err != nil {
+ return -1, false, err
+ }
+
+ virtualBlueScore, err := ti.store.getBlueScore()
+ if err != nil {
+ return 0, false, err
+ }
+
+ return int64(virtualBlueScore - acceptingBlockHeader.BlueScore()), true, nil
+}
+
+// GetTXsConfirmations returns the tx confirmations for for the given txIDs
+func (ti *TXIndex) GetTXsConfirmations(txIDs []*externalapi.DomainTransactionID) (
+ txIDsToConfirmations TxIDsToConfirmations, notFound []*externalapi.DomainTransactionID, err error) {
+ onEnd := logger.LogAndMeasureExecutionTime(log, "TXIndex.GetTXsConfirmations")
+ defer onEnd()
+
+ ti.mutex.Lock()
+ defer ti.mutex.Unlock()
+
+ virtualBlueScore, err := ti.store.getBlueScore()
+ if err != nil {
+ return nil, nil, err
+ }
+
+ txIDsToTxIndexData, _, err := ti.store.getTxsData(txIDs)
+ if err != nil {
+ return nil, nil, err
+ }
+
+ txIDsToConfirmations = make(TxIDsToConfirmations)
+ for txID, txIndexData := range txIDsToTxIndexData {
+ acceptingBlockHeader, err := ti.domain.Consensus().GetBlockHeader(txIndexData.AcceptingBlockHash)
+ if err != nil {
+ if database.IsNotFoundError(err) {
+ return nil, nil, fmt.Errorf("including block %s missing for txID %s ", txIndexData.IncludingBlockHash.String(), txID.String())
+ }
+ return nil, nil, err
+ }
+ txIDsToConfirmations[txID] = int64(virtualBlueScore - acceptingBlockHeader.BlueScore())
+ }
+
+ return txIDsToConfirmations, notFound, nil
+}
+
+// TXIncludingBlockHash returns the including block hash for the given txID
+func (ti *TXIndex) TXIncludingBlockHash(txID *externalapi.DomainTransactionID) (includingBlockHash *externalapi.DomainHash, found bool, err error) {
+ onEnd := logger.LogAndMeasureExecutionTime(log, "TXIndex.TXIncludingBlockHash")
+ defer onEnd()
+
+ ti.mutex.Lock()
+ defer ti.mutex.Unlock()
+
+ txIndexData, found, err := ti.store.getTxData(txID)
+ if err != nil {
+ return nil, false, err
+ }
+
+ return txIndexData.IncludingBlockHash, true, nil
+}
+
+// TXIncludingBlock returns the including block hashes for for the given txIDs
+func (ti *TXIndex) TXIncludingBlock(txID *externalapi.DomainTransactionID) (
+ block *externalapi.DomainBlock, found bool, err error) {
+ onEnd := logger.LogAndMeasureExecutionTime(log, "TXIndex.TXIncludingBlock")
+ defer onEnd()
+
+ ti.mutex.Lock()
+ defer ti.mutex.Unlock()
+
+ txIndexData, found, err := ti.store.getTxData(txID)
+ if err != nil {
+ return nil, false, err
+ }
+
+ includingBlock, err := ti.domain.Consensus().GetBlockEvenIfHeaderOnly(txIndexData.IncludingBlockHash)
+
+ if err != nil {
+ if database.IsNotFoundError(err) {
+ return nil, false, fmt.Errorf("including block %s missing for txID %s ", txIndexData.IncludingBlockHash.String(), txID.String())
+ }
+ return nil, false, err
+ }
+ return includingBlock, true, nil
+}
+
+// TXIncludingBlockHashes returns the including block hashes for for the given txI
+func (ti *TXIndex) TXIncludingBlockHashes(txIDs []*externalapi.DomainTransactionID) (
+ txIDsToIncludinglockHashes TxIDsToBlockHashes, missingTxIds []*externalapi.DomainTransactionID, err error) {
+ onEnd := logger.LogAndMeasureExecutionTime(log, "TXIndex.TXIncludingBlockHashes")
+ defer onEnd()
+
+ ti.mutex.Lock()
+ defer ti.mutex.Unlock()
+
+ txIDsToTxIndexData, notFound, err := ti.store.getTxsData(txIDs)
+ if err != nil {
+ return nil, nil, err
+ }
+
+ txIDsToIncludinglockHashes = make(TxIDsToBlockHashes)
+
+ for txID, txIndexData := range txIDsToTxIndexData {
+ txIDsToIncludinglockHashes[txID] = txIndexData.IncludingBlockHash
+ }
+
+ return txIDsToIncludinglockHashes, notFound, nil
+}
+
+// TXIncludingBlocks returns the including block hashes for for the given txIDs
+func (ti *TXIndex) TXIncludingBlocks(txIDs []*externalapi.DomainTransactionID) (
+ txIDsToIncludingBlocks TxIDsToBlocks, notFound []*externalapi.DomainTransactionID, err error) {
+ onEnd := logger.LogAndMeasureExecutionTime(log, "TXIndex.TXIncludingBlocks")
+ defer onEnd()
+
+ ti.mutex.Lock()
+ defer ti.mutex.Unlock()
+
+ txIDsToTxIndexData, notFound, err := ti.store.getTxsData(txIDs)
+ if err != nil {
+ return nil, nil, err
+ }
+
+ txIDsToIncludingBlocks = make(TxIDsToBlocks)
+
+ for txID, txIndexData := range txIDsToTxIndexData {
+ txIDsToIncludingBlocks[txID], err = ti.domain.Consensus().GetBlockEvenIfHeaderOnly(txIndexData.IncludingBlockHash)
+ if err != nil {
+ if database.IsNotFoundError(err) {
+ return nil, nil, fmt.Errorf("including block %s missing for txID %s ", txIndexData.IncludingBlockHash.String(), txID.String())
+ }
+ return nil, nil, err
+ }
+ }
+
+ return txIDsToIncludingBlocks, notFound, nil
+}
+
+// GetTXsBlueScores returns the tx's accepting bluescore for for the given txID
+// Note: this is a optimization function to store and dynamically calc. tx confirmations with access to to virtual bluescore
+// such as in the case of rpc confirmation notification listeners
+func (ti *TXIndex) GetTXsBlueScores(txIDs []*externalapi.DomainTransactionID) (
+ txIDsToBlueScores TxIDsToBlueScores, notFound []*externalapi.DomainTransactionID, err error) {
+ onEnd := logger.LogAndMeasureExecutionTime(log, "TXIndex.GetTXsBlueScores")
+ defer onEnd()
+
+ ti.mutex.Lock()
+ defer ti.mutex.Unlock()
+
+ txIDsToTxIndexData, notFound, err := ti.store.getTxsData(txIDs)
+ if err != nil {
+ return nil, nil, err
+ }
+
+ txIDsToBlueScores = make(TxIDsToBlueScores)
+ for txID, txIndexData := range txIDsToTxIndexData {
+ acceptingBlockHeader, err := ti.domain.Consensus().GetBlockHeader(txIndexData.AcceptingBlockHash)
+ if err != nil {
+ if database.IsNotFoundError(err) {
+ return nil, nil, fmt.Errorf("Accepting block %s missing for txID %s ", txIndexData.AcceptingBlockHash.String(), txID.String())
+ }
+ return nil, nil, err
+ }
+ txIDsToBlueScores[txID] = acceptingBlockHeader.BlueScore()
+ }
+
+ return txIDsToBlueScores, notFound, nil
+}
+
+func (ti *TXIndex) GetTXIdsOfScriptPublicKey(scriptPublicKey *externalapi.ScriptPublicKey, includeRecieved bool, includeSent bool) (
+ received []*externalapi.DomainTransactionID, sent []*externalapi.DomainTransactionID, found bool, err error) {
+ onEnd := logger.LogAndMeasureExecutionTime(log, "TXIndex.GetTXIdsOfScriptPublicKey")
+ defer onEnd()
+
+ ti.mutex.Lock()
+ defer ti.mutex.Unlock()
+
+ received, sent, err = ti.store.getTxIdsFromScriptPublicKey(scriptPublicKey, includeRecieved, includeSent)
+ if err != nil {
+ return nil, nil, false, err
+ }
+
+ return received, sent, received == nil && sent == nil, nil
+}
+
+func (ti *TXIndex) GetTXIdsOfScriptPublicKeys(scriptPublicKeys []*externalapi.ScriptPublicKey, includeRecieved bool, includeSent bool) (
+ received AddrsChange, sent AddrsChange, err error) {
+ onEnd := logger.LogAndMeasureExecutionTime(log, "TXIndex.GetTXIdsOfScriptPublicKey")
+ defer onEnd()
+
+ ti.mutex.Lock()
+ defer ti.mutex.Unlock()
+
+ received, sent, err = ti.store.getTxIdsOfScriptPublicKeys(scriptPublicKeys, includeRecieved, includeSent)
+ if err != nil {
+ return nil, nil, err
+ }
+
+ return received, sent, nil
+}
+
+func (ti *TXIndex) GetTXsOfScriptPublicKey(scriptPublicKey *externalapi.ScriptPublicKey, includeRecieved bool, includeSent bool) (
+ receivedTxs []*externalapi.DomainTransaction, sensentTxst []*externalapi.DomainTransaction, found bool, err error) {
+ onEnd := logger.LogAndMeasureExecutionTime(log, "TXIndex.GetTXsOfScriptPublicKey")
+ defer onEnd()
+
+ ti.mutex.Lock()
+ defer ti.mutex.Unlock()
+
+ receivedTxIds, sentTxIds, err := ti.store.getTxIdsFromScriptPublicKey(scriptPublicKey, includeRecieved, includeSent)
+ if err != nil {
+ return nil, nil, false, err
+ }
+
+ txIDsToTxIndexData, _, err := ti.store.getTxsData(receivedTxIds)
+ if err != nil {
+ return nil, nil, false, err
+ }
+
+ receivedTxs = make([]*externalapi.DomainTransaction, len(receivedTxIds))
+ i := 0
+ for txID, txData := range txIDsToTxIndexData {
+ includingBlock, err := ti.domain.Consensus().GetBlock(txData.IncludingBlockHash)
+
+ if err != nil {
+ if database.IsNotFoundError(err) {
+ return nil, nil, false, fmt.Errorf("including block %s missing for txID %s ", txData.IncludingBlockHash.String(), txID.String())
+ }
+ return nil, nil, false, err
+ }
+ receivedTxs[i] = includingBlock.Transactions[txData.IncludingIndex]
+ i++
+ }
+
+ txIDsToTxIndexData, _, err = ti.store.getTxsData(sentTxIds)
+ if err != nil {
+ return nil, nil, false, err
+ }
+
+ sentTxs := make([]*externalapi.DomainTransaction, len(receivedTxIds))
+ i = 0
+ for txID, txData := range txIDsToTxIndexData {
+ includingBlock, err := ti.domain.Consensus().GetBlock(txData.IncludingBlockHash)
+
+ if err != nil {
+ if database.IsNotFoundError(err) {
+ return nil, nil, false, fmt.Errorf("including block %s missing for txID %s ", txData.IncludingBlockHash.String(), txID.String())
+ }
+ return nil, nil, false, err
+ }
+ sentTxs[i] = includingBlock.Transactions[txData.IncludingIndex]
+ i++
+ }
+
+ return receivedTxs, sentTxs, receivedTxs == nil && sentTxs == nil, nil
+}
+
+func (ti *TXIndex) GetTXsOfScriptPublicKeys(scriptPublicKeys []*externalapi.ScriptPublicKey, includeRecieved bool, includeSent bool) (
+ receivedTxs map[ScriptPublicKeyString][]*externalapi.DomainTransaction, sentTxs map[ScriptPublicKeyString][]*externalapi.DomainTransaction, err error) {
+ onEnd := logger.LogAndMeasureExecutionTime(log, "TXIndex.GetTXsOfScriptPublicKey")
+ defer onEnd()
+
+ ti.mutex.Lock()
+ defer ti.mutex.Unlock()
+
+ receivedTxIds, sentTxIds, err := ti.store.getTxIdsOfScriptPublicKeys(scriptPublicKeys, includeRecieved, includeSent)
+ if err != nil {
+ return nil, nil, err
+ }
+
+ receivedTxs = make(map[ScriptPublicKeyString][]*externalapi.DomainTransaction)
+ i := 0
+ for scriptPublicKeyString, txIds := range receivedTxIds {
+
+ txIDsToTxIndexData, _, err := ti.store.getTxsData(txIds)
+ if err != nil {
+ return nil, nil, err
+ }
+ i = 0
+
+ for txID, txData := range txIDsToTxIndexData{
+
+ includingBlock, err := ti.domain.Consensus().GetBlock(txData.IncludingBlockHash)
+ if err != nil {
+ if database.IsNotFoundError(err) {
+ return nil, nil, fmt.Errorf("including block %s missing for txID %s ", txData.IncludingBlockHash.String(), txID.String())
+ }
+ return nil, nil, err
+ }
+ receivedTxs[scriptPublicKeyString] = append(receivedTxs[scriptPublicKeyString], includingBlock.Transactions[txData.IncludingIndex])
+ i++
+
+ }
+ }
+ sentTxs = make(map[ScriptPublicKeyString][]*externalapi.DomainTransaction)
+ i = 0
+ for scriptPublicKeyString, txIds := range sentTxIds {
+
+ txIDsToTxIndexData, _, err := ti.store.getTxsData(txIds)
+ if err != nil {
+ return nil, nil, err
+ }
+ i = 0
+
+ for txID, txData := range txIDsToTxIndexData{
+
+ includingBlock, err := ti.domain.Consensus().GetBlock(txData.IncludingBlockHash)
+ if err != nil {
+ if database.IsNotFoundError(err) {
+ return nil, nil, fmt.Errorf("including block %s missing for txID %s ", txData.IncludingBlockHash.String(), txID.String())
+ }
+ return nil, nil, err
+ }
+ sentTxs[scriptPublicKeyString] = append(sentTxs[scriptPublicKeyString], includingBlock.Transactions[txData.IncludingIndex])
+ i++
+
+ }
+ }
+
+
+ return receivedTxs, sentTxs, nil
+}
diff --git a/go.mod b/go.mod
index 52f9343df9..5cc7e7a6d9 100644
--- a/go.mod
+++ b/go.mod
@@ -1,7 +1,9 @@
-module github.com/kaspanet/kaspad
+module github.com/kaspanet/kaspad
go 1.18
+//replace github.com/kaspanet/kaspad/domain/txindex => /home/ds/Coding/kaspad/kaspad/domain/txindex
+
require (
github.com/btcsuite/btcutil v1.0.2
github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd
@@ -30,4 +32,4 @@ require (
golang.org/x/text v0.3.5 // indirect
google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08 // indirect
gopkg.in/yaml.v2 v2.3.0 // indirect
-)
+)
\ No newline at end of file
diff --git a/infrastructure/config/config.go b/infrastructure/config/config.go
index f5e280e3c3..3a261e7391 100644
--- a/infrastructure/config/config.go
+++ b/infrastructure/config/config.go
@@ -122,6 +122,7 @@ type Flags struct {
ResetDatabase bool `long:"reset-db" description:"Reset database before starting node. It's needed when switching between subnetworks."`
MaxUTXOCacheSize uint64 `long:"maxutxocachesize" description:"Max size of loaded UTXO into ram from the disk in bytes"`
UTXOIndex bool `long:"utxoindex" description:"Enable the UTXO index"`
+ TXIndex bool `long:"txindex" description:"Enable the TX index"`
IsArchivalNode bool `long:"archival" description:"Run as an archival node: don't delete old block data when moving the pruning point (Warning: heavy disk usage)'"`
AllowSubmitBlockWhenNotSynced bool `long:"allow-submit-block-when-not-synced" hidden:"true" description:"Allow the node to accept blocks from RPC while not synced (this flag is mainly used for testing)"`
EnableSanityCheckPruningUTXOSet bool `long:"enable-sanity-check-pruning-utxo" hidden:"true" description:"When moving the pruning point - check that the utxo set matches the utxo commitment"`
diff --git a/infrastructure/network/netadapter/server/grpcserver/protowire/messages.pb.go b/infrastructure/network/netadapter/server/grpcserver/protowire/messages.pb.go
index c273e10d7e..2ff98481f2 100644
--- a/infrastructure/network/netadapter/server/grpcserver/protowire/messages.pb.go
+++ b/infrastructure/network/netadapter/server/grpcserver/protowire/messages.pb.go
@@ -156,6 +156,22 @@ type KaspadMessage struct {
// *KaspadMessage_GetMempoolEntriesByAddressesResponse
// *KaspadMessage_GetCoinSupplyRequest
// *KaspadMessage_GetCoinSupplyResponse
+ // *KaspadMessage_GetAcceptingBlockHashesOfTxsRequest
+ // *KaspadMessage_GetAcceptingBlockHashesOfTxsResponse
+ // *KaspadMessage_GetTxsRequest
+ // *KaspadMessage_GetTxsResponse
+ // *KaspadMessage_GetTxsConfirmationsRequest
+ // *KaspadMessage_GetTxsConfirmationsResponse
+ // *KaspadMessage_NotifyTxsConfirmationChangedRequst
+ // *KaspadMessage_NotifyTxsConfirmationChangedResponse
+ // *KaspadMessage_ModifyNotifyingTxsConfirmationChangedRequest
+ // *KaspadMessage_ModifyNotifyingTxsConfirmationChangedResponse
+ // *KaspadMessage_TxsConfirmationChangedNotification
+ // *KaspadMessage_NotifyAddressesTxsRequest
+ // *KaspadMessage_NotifyAddressesTxsResponse
+ // *KaspadMessage_ModifyNotifyingAddressesTxsRequest
+ // *KaspadMessage_ModifyNotifyingAddressesTxsResponse
+ // *KaspadMessage_AddressesTxsNotification
Payload isKaspadMessage_Payload `protobuf_oneof:"payload"`
}
@@ -1108,6 +1124,118 @@ func (x *KaspadMessage) GetGetCoinSupplyResponse() *GetCoinSupplyResponseMessage
return nil
}
+func (x *KaspadMessage) GetGetAcceptingBlockHashesOfTxsRequest() *GetAcceptingBlockHashesOfTxsRequestMessage {
+ if x, ok := x.GetPayload().(*KaspadMessage_GetAcceptingBlockHashesOfTxsRequest); ok {
+ return x.GetAcceptingBlockHashesOfTxsRequest
+ }
+ return nil
+}
+
+func (x *KaspadMessage) GetGetAcceptingBlockHashesOfTxsResponse() *GetAcceptingBlockHashesOfTxsResponseMessage {
+ if x, ok := x.GetPayload().(*KaspadMessage_GetAcceptingBlockHashesOfTxsResponse); ok {
+ return x.GetAcceptingBlockHashesOfTxsResponse
+ }
+ return nil
+}
+
+func (x *KaspadMessage) GetGetTxsRequest() *GetTxsRequestMessage {
+ if x, ok := x.GetPayload().(*KaspadMessage_GetTxsRequest); ok {
+ return x.GetTxsRequest
+ }
+ return nil
+}
+
+func (x *KaspadMessage) GetGetTxsResponse() *GetTxsResponseMessage {
+ if x, ok := x.GetPayload().(*KaspadMessage_GetTxsResponse); ok {
+ return x.GetTxsResponse
+ }
+ return nil
+}
+
+func (x *KaspadMessage) GetGetTxsConfirmationsRequest() *GetTxsConfirmationsRequestMessage {
+ if x, ok := x.GetPayload().(*KaspadMessage_GetTxsConfirmationsRequest); ok {
+ return x.GetTxsConfirmationsRequest
+ }
+ return nil
+}
+
+func (x *KaspadMessage) GetGetTxsConfirmationsResponse() *GetTxsConfirmationsResponseMessage {
+ if x, ok := x.GetPayload().(*KaspadMessage_GetTxsConfirmationsResponse); ok {
+ return x.GetTxsConfirmationsResponse
+ }
+ return nil
+}
+
+func (x *KaspadMessage) GetNotifyTxsConfirmationChangedRequst() *NotifyTxsConfirmationChangedRequestMessage {
+ if x, ok := x.GetPayload().(*KaspadMessage_NotifyTxsConfirmationChangedRequst); ok {
+ return x.NotifyTxsConfirmationChangedRequst
+ }
+ return nil
+}
+
+func (x *KaspadMessage) GetNotifyTxsConfirmationChangedResponse() *NotifyTxsConfirmationChangedResponseMessage {
+ if x, ok := x.GetPayload().(*KaspadMessage_NotifyTxsConfirmationChangedResponse); ok {
+ return x.NotifyTxsConfirmationChangedResponse
+ }
+ return nil
+}
+
+func (x *KaspadMessage) GetModifyNotifyingTxsConfirmationChangedRequest() *ModifyNotifyingTxsConfirmationChangedRequestMessage {
+ if x, ok := x.GetPayload().(*KaspadMessage_ModifyNotifyingTxsConfirmationChangedRequest); ok {
+ return x.ModifyNotifyingTxsConfirmationChangedRequest
+ }
+ return nil
+}
+
+func (x *KaspadMessage) GetModifyNotifyingTxsConfirmationChangedResponse() *ModifyNotifyingTxsConfirmationChangedResponseMessage {
+ if x, ok := x.GetPayload().(*KaspadMessage_ModifyNotifyingTxsConfirmationChangedResponse); ok {
+ return x.ModifyNotifyingTxsConfirmationChangedResponse
+ }
+ return nil
+}
+
+func (x *KaspadMessage) GetTxsConfirmationChangedNotification() *TxsConfirmationChangedNotificationMessage {
+ if x, ok := x.GetPayload().(*KaspadMessage_TxsConfirmationChangedNotification); ok {
+ return x.TxsConfirmationChangedNotification
+ }
+ return nil
+}
+
+func (x *KaspadMessage) GetNotifyAddressesTxsRequest() *NotifyAddressesTxsRequestMessage {
+ if x, ok := x.GetPayload().(*KaspadMessage_NotifyAddressesTxsRequest); ok {
+ return x.NotifyAddressesTxsRequest
+ }
+ return nil
+}
+
+func (x *KaspadMessage) GetNotifyAddressesTxsResponse() *NotifyAddressesTxsResponseMessage {
+ if x, ok := x.GetPayload().(*KaspadMessage_NotifyAddressesTxsResponse); ok {
+ return x.NotifyAddressesTxsResponse
+ }
+ return nil
+}
+
+func (x *KaspadMessage) GetModifyNotifyingAddressesTxsRequest() *ModifyNotifyingAddressesTxsRequestMessage {
+ if x, ok := x.GetPayload().(*KaspadMessage_ModifyNotifyingAddressesTxsRequest); ok {
+ return x.ModifyNotifyingAddressesTxsRequest
+ }
+ return nil
+}
+
+func (x *KaspadMessage) GetModifyNotifyingAddressesTxsResponse() *ModifyNotifyingAddressesTxsResponseMessage {
+ if x, ok := x.GetPayload().(*KaspadMessage_ModifyNotifyingAddressesTxsResponse); ok {
+ return x.ModifyNotifyingAddressesTxsResponse
+ }
+ return nil
+}
+
+func (x *KaspadMessage) GetAddressesTxsNotification() *AddressesTxsNotificationMessage {
+ if x, ok := x.GetPayload().(*KaspadMessage_AddressesTxsNotification); ok {
+ return x.AddressesTxsNotification
+ }
+ return nil
+}
+
type isKaspadMessage_Payload interface {
isKaspadMessage_Payload()
}
@@ -1632,6 +1760,70 @@ type KaspadMessage_GetCoinSupplyResponse struct {
GetCoinSupplyResponse *GetCoinSupplyResponseMessage `protobuf:"bytes,1087,opt,name=getCoinSupplyResponse,proto3,oneof"`
}
+type KaspadMessage_GetAcceptingBlockHashesOfTxsRequest struct {
+ GetAcceptingBlockHashesOfTxsRequest *GetAcceptingBlockHashesOfTxsRequestMessage `protobuf:"bytes,1088,opt,name=getAcceptingBlockHashesOfTxsRequest,proto3,oneof"`
+}
+
+type KaspadMessage_GetAcceptingBlockHashesOfTxsResponse struct {
+ GetAcceptingBlockHashesOfTxsResponse *GetAcceptingBlockHashesOfTxsResponseMessage `protobuf:"bytes,1089,opt,name=getAcceptingBlockHashesOfTxsResponse,proto3,oneof"`
+}
+
+type KaspadMessage_GetTxsRequest struct {
+ GetTxsRequest *GetTxsRequestMessage `protobuf:"bytes,1090,opt,name=getTxsRequest,proto3,oneof"`
+}
+
+type KaspadMessage_GetTxsResponse struct {
+ GetTxsResponse *GetTxsResponseMessage `protobuf:"bytes,1091,opt,name=getTxsResponse,proto3,oneof"`
+}
+
+type KaspadMessage_GetTxsConfirmationsRequest struct {
+ GetTxsConfirmationsRequest *GetTxsConfirmationsRequestMessage `protobuf:"bytes,1092,opt,name=getTxsConfirmationsRequest,proto3,oneof"`
+}
+
+type KaspadMessage_GetTxsConfirmationsResponse struct {
+ GetTxsConfirmationsResponse *GetTxsConfirmationsResponseMessage `protobuf:"bytes,1093,opt,name=getTxsConfirmationsResponse,proto3,oneof"`
+}
+
+type KaspadMessage_NotifyTxsConfirmationChangedRequst struct {
+ NotifyTxsConfirmationChangedRequst *NotifyTxsConfirmationChangedRequestMessage `protobuf:"bytes,1094,opt,name=notifyTxsConfirmationChangedRequst,proto3,oneof"`
+}
+
+type KaspadMessage_NotifyTxsConfirmationChangedResponse struct {
+ NotifyTxsConfirmationChangedResponse *NotifyTxsConfirmationChangedResponseMessage `protobuf:"bytes,1095,opt,name=notifyTxsConfirmationChangedResponse,proto3,oneof"`
+}
+
+type KaspadMessage_ModifyNotifyingTxsConfirmationChangedRequest struct {
+ ModifyNotifyingTxsConfirmationChangedRequest *ModifyNotifyingTxsConfirmationChangedRequestMessage `protobuf:"bytes,1096,opt,name=modifyNotifyingTxsConfirmationChangedRequest,proto3,oneof"`
+}
+
+type KaspadMessage_ModifyNotifyingTxsConfirmationChangedResponse struct {
+ ModifyNotifyingTxsConfirmationChangedResponse *ModifyNotifyingTxsConfirmationChangedResponseMessage `protobuf:"bytes,1097,opt,name=modifyNotifyingTxsConfirmationChangedResponse,proto3,oneof"`
+}
+
+type KaspadMessage_TxsConfirmationChangedNotification struct {
+ TxsConfirmationChangedNotification *TxsConfirmationChangedNotificationMessage `protobuf:"bytes,1098,opt,name=txsConfirmationChangedNotification,proto3,oneof"`
+}
+
+type KaspadMessage_NotifyAddressesTxsRequest struct {
+ NotifyAddressesTxsRequest *NotifyAddressesTxsRequestMessage `protobuf:"bytes,1099,opt,name=notifyAddressesTxsRequest,proto3,oneof"`
+}
+
+type KaspadMessage_NotifyAddressesTxsResponse struct {
+ NotifyAddressesTxsResponse *NotifyAddressesTxsResponseMessage `protobuf:"bytes,1100,opt,name=notifyAddressesTxsResponse,proto3,oneof"`
+}
+
+type KaspadMessage_ModifyNotifyingAddressesTxsRequest struct {
+ ModifyNotifyingAddressesTxsRequest *ModifyNotifyingAddressesTxsRequestMessage `protobuf:"bytes,1101,opt,name=modifyNotifyingAddressesTxsRequest,proto3,oneof"`
+}
+
+type KaspadMessage_ModifyNotifyingAddressesTxsResponse struct {
+ ModifyNotifyingAddressesTxsResponse *ModifyNotifyingAddressesTxsResponseMessage `protobuf:"bytes,1102,opt,name=modifyNotifyingAddressesTxsResponse,proto3,oneof"`
+}
+
+type KaspadMessage_AddressesTxsNotification struct {
+ AddressesTxsNotification *AddressesTxsNotificationMessage `protobuf:"bytes,1103,opt,name=AddressesTxsNotification,proto3,oneof"`
+}
+
func (*KaspadMessage_Addresses) isKaspadMessage_Payload() {}
func (*KaspadMessage_Block) isKaspadMessage_Payload() {}
@@ -1892,13 +2084,45 @@ func (*KaspadMessage_GetCoinSupplyRequest) isKaspadMessage_Payload() {}
func (*KaspadMessage_GetCoinSupplyResponse) isKaspadMessage_Payload() {}
+func (*KaspadMessage_GetAcceptingBlockHashesOfTxsRequest) isKaspadMessage_Payload() {}
+
+func (*KaspadMessage_GetAcceptingBlockHashesOfTxsResponse) isKaspadMessage_Payload() {}
+
+func (*KaspadMessage_GetTxsRequest) isKaspadMessage_Payload() {}
+
+func (*KaspadMessage_GetTxsResponse) isKaspadMessage_Payload() {}
+
+func (*KaspadMessage_GetTxsConfirmationsRequest) isKaspadMessage_Payload() {}
+
+func (*KaspadMessage_GetTxsConfirmationsResponse) isKaspadMessage_Payload() {}
+
+func (*KaspadMessage_NotifyTxsConfirmationChangedRequst) isKaspadMessage_Payload() {}
+
+func (*KaspadMessage_NotifyTxsConfirmationChangedResponse) isKaspadMessage_Payload() {}
+
+func (*KaspadMessage_ModifyNotifyingTxsConfirmationChangedRequest) isKaspadMessage_Payload() {}
+
+func (*KaspadMessage_ModifyNotifyingTxsConfirmationChangedResponse) isKaspadMessage_Payload() {}
+
+func (*KaspadMessage_TxsConfirmationChangedNotification) isKaspadMessage_Payload() {}
+
+func (*KaspadMessage_NotifyAddressesTxsRequest) isKaspadMessage_Payload() {}
+
+func (*KaspadMessage_NotifyAddressesTxsResponse) isKaspadMessage_Payload() {}
+
+func (*KaspadMessage_ModifyNotifyingAddressesTxsRequest) isKaspadMessage_Payload() {}
+
+func (*KaspadMessage_ModifyNotifyingAddressesTxsResponse) isKaspadMessage_Payload() {}
+
+func (*KaspadMessage_AddressesTxsNotification) isKaspadMessage_Payload() {}
+
var File_messages_proto protoreflect.FileDescriptor
var file_messages_proto_rawDesc = []byte{
0x0a, 0x0e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
0x12, 0x09, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x1a, 0x09, 0x70, 0x32, 0x70,
0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x09, 0x72, 0x70, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74,
- 0x6f, 0x22, 0xbf, 0x6d, 0x0a, 0x0d, 0x4b, 0x61, 0x73, 0x70, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73,
+ 0x6f, 0x22, 0xb1, 0x7d, 0x0a, 0x0d, 0x4b, 0x61, 0x73, 0x70, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73,
0x61, 0x67, 0x65, 0x12, 0x3b, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73,
0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69,
0x72, 0x65, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x4d, 0x65, 0x73, 0x73,
@@ -2773,21 +2997,148 @@ var file_messages_proto_rawDesc = []byte{
0x72, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x69, 0x6e, 0x53, 0x75, 0x70, 0x70, 0x6c, 0x79,
0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48,
0x00, 0x52, 0x15, 0x67, 0x65, 0x74, 0x43, 0x6f, 0x69, 0x6e, 0x53, 0x75, 0x70, 0x70, 0x6c, 0x79,
- 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x09, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c,
- 0x6f, 0x61, 0x64, 0x32, 0x50, 0x0a, 0x03, 0x50, 0x32, 0x50, 0x12, 0x49, 0x0a, 0x0d, 0x4d, 0x65,
- 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x18, 0x2e, 0x70, 0x72,
- 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x4b, 0x61, 0x73, 0x70, 0x61, 0x64, 0x4d, 0x65,
- 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72,
- 0x65, 0x2e, 0x4b, 0x61, 0x73, 0x70, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22,
- 0x00, 0x28, 0x01, 0x30, 0x01, 0x32, 0x50, 0x0a, 0x03, 0x52, 0x50, 0x43, 0x12, 0x49, 0x0a, 0x0d,
+ 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x8a, 0x01, 0x0a, 0x23, 0x67, 0x65, 0x74,
+ 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6e, 0x67, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61,
+ 0x73, 0x68, 0x65, 0x73, 0x4f, 0x66, 0x54, 0x78, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+ 0x18, 0xc0, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77,
+ 0x69, 0x72, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6e, 0x67,
+ 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x4f, 0x66, 0x54, 0x78, 0x73,
+ 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00,
+ 0x52, 0x23, 0x67, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6e, 0x67, 0x42, 0x6c,
+ 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x4f, 0x66, 0x54, 0x78, 0x73, 0x52, 0x65,
+ 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x8d, 0x01, 0x0a, 0x24, 0x67, 0x65, 0x74, 0x41, 0x63, 0x63,
+ 0x65, 0x70, 0x74, 0x69, 0x6e, 0x67, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x65,
+ 0x73, 0x4f, 0x66, 0x54, 0x78, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0xc1,
+ 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72,
+ 0x65, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6e, 0x67, 0x42, 0x6c,
+ 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x4f, 0x66, 0x54, 0x78, 0x73, 0x52, 0x65,
+ 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52,
+ 0x24, 0x67, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6e, 0x67, 0x42, 0x6c, 0x6f,
+ 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x4f, 0x66, 0x54, 0x78, 0x73, 0x52, 0x65, 0x73,
+ 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a, 0x0d, 0x67, 0x65, 0x74, 0x54, 0x78, 0x73, 0x52,
+ 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0xc2, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e,
+ 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x78, 0x73,
+ 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00,
+ 0x52, 0x0d, 0x67, 0x65, 0x74, 0x54, 0x78, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12,
+ 0x4b, 0x0a, 0x0e, 0x67, 0x65, 0x74, 0x54, 0x78, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+ 0x65, 0x18, 0xc3, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+ 0x77, 0x69, 0x72, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x78, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f,
+ 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x0e, 0x67, 0x65,
+ 0x74, 0x54, 0x78, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6f, 0x0a, 0x1a,
+ 0x67, 0x65, 0x74, 0x54, 0x78, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0xc4, 0x08, 0x20, 0x01, 0x28,
+ 0x0b, 0x32, 0x2c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x47, 0x65,
+ 0x74, 0x54, 0x78, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48,
+ 0x00, 0x52, 0x1a, 0x67, 0x65, 0x74, 0x54, 0x78, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x72, 0x0a,
+ 0x1b, 0x67, 0x65, 0x74, 0x54, 0x78, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0xc5, 0x08, 0x20,
+ 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e,
+ 0x47, 0x65, 0x74, 0x54, 0x78, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61,
+ 0x67, 0x65, 0x48, 0x00, 0x52, 0x1b, 0x67, 0x65, 0x74, 0x54, 0x78, 0x73, 0x43, 0x6f, 0x6e, 0x66,
+ 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+ 0x65, 0x12, 0x88, 0x01, 0x0a, 0x22, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x54, 0x78, 0x73, 0x43,
+ 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x67,
+ 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x73, 0x74, 0x18, 0xc6, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32,
+ 0x35, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x4e, 0x6f, 0x74, 0x69,
+ 0x66, 0x79, 0x54, 0x78, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d,
+ 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x22, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x79,
+ 0x54, 0x78, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43,
+ 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x73, 0x74, 0x12, 0x8d, 0x01, 0x0a,
+ 0x24, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x54, 0x78, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72,
+ 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x52, 0x65, 0x73,
+ 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0xc7, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x70,
+ 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x54,
+ 0x78, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68,
+ 0x61, 0x6e, 0x67, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73,
+ 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x24, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x54, 0x78,
+ 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61,
+ 0x6e, 0x67, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0xa5, 0x01, 0x0a,
+ 0x2c, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x69, 0x6e, 0x67,
+ 0x54, 0x78, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43,
+ 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0xc8, 0x08,
+ 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65,
+ 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x69, 0x6e, 0x67,
+ 0x54, 0x78, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43,
+ 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73,
+ 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x2c, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x4e, 0x6f,
+ 0x74, 0x69, 0x66, 0x79, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72,
+ 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x52, 0x65, 0x71,
+ 0x75, 0x65, 0x73, 0x74, 0x12, 0xa8, 0x01, 0x0a, 0x2d, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x4e,
+ 0x6f, 0x74, 0x69, 0x66, 0x79, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69,
+ 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x52, 0x65,
+ 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0xc9, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3f, 0x2e,
+ 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79,
+ 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x73, 0x43, 0x6f, 0x6e, 0x66,
+ 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x52,
+ 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00,
+ 0x52, 0x2d, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x69, 0x6e,
+ 0x67, 0x54, 0x78, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12,
+ 0x87, 0x01, 0x0a, 0x22, 0x74, 0x78, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69,
+ 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0xca, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e,
+ 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x54, 0x78, 0x73, 0x43, 0x6f, 0x6e,
+ 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64,
+ 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x73, 0x73,
+ 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x22, 0x74, 0x78, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72,
+ 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x4e, 0x6f, 0x74,
+ 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x6c, 0x0a, 0x19, 0x6e, 0x6f, 0x74,
+ 0x69, 0x66, 0x79, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x54, 0x78, 0x73, 0x52,
+ 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0xcb, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e,
+ 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79,
+ 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x54, 0x78, 0x73, 0x52, 0x65, 0x71, 0x75,
+ 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x19, 0x6e, 0x6f,
+ 0x74, 0x69, 0x66, 0x79, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x54, 0x78, 0x73,
+ 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x6f, 0x0a, 0x1a, 0x6e, 0x6f, 0x74, 0x69, 0x66,
+ 0x79, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x54, 0x78, 0x73, 0x52, 0x65, 0x73,
+ 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0xcc, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x70,
+ 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x41,
+ 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x54, 0x78, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f,
+ 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x1a, 0x6e, 0x6f,
+ 0x74, 0x69, 0x66, 0x79, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x54, 0x78, 0x73,
+ 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x87, 0x01, 0x0a, 0x22, 0x6d, 0x6f, 0x64,
+ 0x69, 0x66, 0x79, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x69, 0x6e, 0x67, 0x41, 0x64, 0x64, 0x72,
+ 0x65, 0x73, 0x73, 0x65, 0x73, 0x54, 0x78, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18,
+ 0xcd, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69,
+ 0x72, 0x65, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x69,
+ 0x6e, 0x67, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x54, 0x78, 0x73, 0x52, 0x65,
+ 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x22,
+ 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x69, 0x6e, 0x67, 0x41,
+ 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x54, 0x78, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65,
+ 0x73, 0x74, 0x12, 0x8a, 0x01, 0x0a, 0x23, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x4e, 0x6f, 0x74,
+ 0x69, 0x66, 0x79, 0x69, 0x6e, 0x67, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x54,
+ 0x78, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0xce, 0x08, 0x20, 0x01, 0x28,
+ 0x0b, 0x32, 0x35, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x4d, 0x6f,
+ 0x64, 0x69, 0x66, 0x79, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x69, 0x6e, 0x67, 0x41, 0x64, 0x64,
+ 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x54, 0x78, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+ 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x23, 0x6d, 0x6f, 0x64, 0x69,
+ 0x66, 0x79, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x69, 0x6e, 0x67, 0x41, 0x64, 0x64, 0x72, 0x65,
+ 0x73, 0x73, 0x65, 0x73, 0x54, 0x78, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12,
+ 0x69, 0x0a, 0x18, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x54, 0x78, 0x73, 0x4e,
+ 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0xcf, 0x08, 0x20, 0x01,
+ 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x41,
+ 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x54, 0x78, 0x73, 0x4e, 0x6f, 0x74, 0x69, 0x66,
+ 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00,
+ 0x52, 0x18, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x54, 0x78, 0x73, 0x4e, 0x6f,
+ 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x09, 0x0a, 0x07, 0x70, 0x61,
+ 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x32, 0x50, 0x0a, 0x03, 0x50, 0x32, 0x50, 0x12, 0x49, 0x0a, 0x0d,
0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x18, 0x2e,
0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x4b, 0x61, 0x73, 0x70, 0x61, 0x64,
0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77,
0x69, 0x72, 0x65, 0x2e, 0x4b, 0x61, 0x73, 0x70, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67,
- 0x65, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x42, 0x26, 0x5a, 0x24, 0x67, 0x69, 0x74, 0x68, 0x75,
- 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6b, 0x61, 0x73, 0x70, 0x61, 0x6e, 0x65, 0x74, 0x2f, 0x6b,
- 0x61, 0x73, 0x70, 0x61, 0x64, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x62,
- 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+ 0x65, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x32, 0x50, 0x0a, 0x03, 0x52, 0x50, 0x43, 0x12, 0x49,
+ 0x0a, 0x0d, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12,
+ 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x4b, 0x61, 0x73, 0x70,
+ 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+ 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x4b, 0x61, 0x73, 0x70, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73,
+ 0x61, 0x67, 0x65, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x42, 0x26, 0x5a, 0x24, 0x67, 0x69, 0x74,
+ 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6b, 0x61, 0x73, 0x70, 0x61, 0x6e, 0x65, 0x74,
+ 0x2f, 0x6b, 0x61, 0x73, 0x70, 0x61, 0x64, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72,
+ 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}
var (
@@ -2934,6 +3285,22 @@ var file_messages_proto_goTypes = []interface{}{
(*GetMempoolEntriesByAddressesResponseMessage)(nil), // 127: protowire.GetMempoolEntriesByAddressesResponseMessage
(*GetCoinSupplyRequestMessage)(nil), // 128: protowire.GetCoinSupplyRequestMessage
(*GetCoinSupplyResponseMessage)(nil), // 129: protowire.GetCoinSupplyResponseMessage
+ (*GetAcceptingBlockHashesOfTxsRequestMessage)(nil), // 130: protowire.GetAcceptingBlockHashesOfTxsRequestMessage
+ (*GetAcceptingBlockHashesOfTxsResponseMessage)(nil), // 131: protowire.GetAcceptingBlockHashesOfTxsResponseMessage
+ (*GetTxsRequestMessage)(nil), // 132: protowire.GetTxsRequestMessage
+ (*GetTxsResponseMessage)(nil), // 133: protowire.GetTxsResponseMessage
+ (*GetTxsConfirmationsRequestMessage)(nil), // 134: protowire.GetTxsConfirmationsRequestMessage
+ (*GetTxsConfirmationsResponseMessage)(nil), // 135: protowire.GetTxsConfirmationsResponseMessage
+ (*NotifyTxsConfirmationChangedRequestMessage)(nil), // 136: protowire.NotifyTxsConfirmationChangedRequestMessage
+ (*NotifyTxsConfirmationChangedResponseMessage)(nil), // 137: protowire.NotifyTxsConfirmationChangedResponseMessage
+ (*ModifyNotifyingTxsConfirmationChangedRequestMessage)(nil), // 138: protowire.ModifyNotifyingTxsConfirmationChangedRequestMessage
+ (*ModifyNotifyingTxsConfirmationChangedResponseMessage)(nil), // 139: protowire.ModifyNotifyingTxsConfirmationChangedResponseMessage
+ (*TxsConfirmationChangedNotificationMessage)(nil), // 140: protowire.TxsConfirmationChangedNotificationMessage
+ (*NotifyAddressesTxsRequestMessage)(nil), // 141: protowire.NotifyAddressesTxsRequestMessage
+ (*NotifyAddressesTxsResponseMessage)(nil), // 142: protowire.NotifyAddressesTxsResponseMessage
+ (*ModifyNotifyingAddressesTxsRequestMessage)(nil), // 143: protowire.ModifyNotifyingAddressesTxsRequestMessage
+ (*ModifyNotifyingAddressesTxsResponseMessage)(nil), // 144: protowire.ModifyNotifyingAddressesTxsResponseMessage
+ (*AddressesTxsNotificationMessage)(nil), // 145: protowire.AddressesTxsNotificationMessage
}
var file_messages_proto_depIdxs = []int32{
1, // 0: protowire.KaspadMessage.addresses:type_name -> protowire.AddressesMessage
@@ -3066,15 +3433,31 @@ var file_messages_proto_depIdxs = []int32{
127, // 127: protowire.KaspadMessage.getMempoolEntriesByAddressesResponse:type_name -> protowire.GetMempoolEntriesByAddressesResponseMessage
128, // 128: protowire.KaspadMessage.getCoinSupplyRequest:type_name -> protowire.GetCoinSupplyRequestMessage
129, // 129: protowire.KaspadMessage.getCoinSupplyResponse:type_name -> protowire.GetCoinSupplyResponseMessage
- 0, // 130: protowire.P2P.MessageStream:input_type -> protowire.KaspadMessage
- 0, // 131: protowire.RPC.MessageStream:input_type -> protowire.KaspadMessage
- 0, // 132: protowire.P2P.MessageStream:output_type -> protowire.KaspadMessage
- 0, // 133: protowire.RPC.MessageStream:output_type -> protowire.KaspadMessage
- 132, // [132:134] is the sub-list for method output_type
- 130, // [130:132] is the sub-list for method input_type
- 130, // [130:130] is the sub-list for extension type_name
- 130, // [130:130] is the sub-list for extension extendee
- 0, // [0:130] is the sub-list for field type_name
+ 130, // 130: protowire.KaspadMessage.getAcceptingBlockHashesOfTxsRequest:type_name -> protowire.GetAcceptingBlockHashesOfTxsRequestMessage
+ 131, // 131: protowire.KaspadMessage.getAcceptingBlockHashesOfTxsResponse:type_name -> protowire.GetAcceptingBlockHashesOfTxsResponseMessage
+ 132, // 132: protowire.KaspadMessage.getTxsRequest:type_name -> protowire.GetTxsRequestMessage
+ 133, // 133: protowire.KaspadMessage.getTxsResponse:type_name -> protowire.GetTxsResponseMessage
+ 134, // 134: protowire.KaspadMessage.getTxsConfirmationsRequest:type_name -> protowire.GetTxsConfirmationsRequestMessage
+ 135, // 135: protowire.KaspadMessage.getTxsConfirmationsResponse:type_name -> protowire.GetTxsConfirmationsResponseMessage
+ 136, // 136: protowire.KaspadMessage.notifyTxsConfirmationChangedRequst:type_name -> protowire.NotifyTxsConfirmationChangedRequestMessage
+ 137, // 137: protowire.KaspadMessage.notifyTxsConfirmationChangedResponse:type_name -> protowire.NotifyTxsConfirmationChangedResponseMessage
+ 138, // 138: protowire.KaspadMessage.modifyNotifyingTxsConfirmationChangedRequest:type_name -> protowire.ModifyNotifyingTxsConfirmationChangedRequestMessage
+ 139, // 139: protowire.KaspadMessage.modifyNotifyingTxsConfirmationChangedResponse:type_name -> protowire.ModifyNotifyingTxsConfirmationChangedResponseMessage
+ 140, // 140: protowire.KaspadMessage.txsConfirmationChangedNotification:type_name -> protowire.TxsConfirmationChangedNotificationMessage
+ 141, // 141: protowire.KaspadMessage.notifyAddressesTxsRequest:type_name -> protowire.NotifyAddressesTxsRequestMessage
+ 142, // 142: protowire.KaspadMessage.notifyAddressesTxsResponse:type_name -> protowire.NotifyAddressesTxsResponseMessage
+ 143, // 143: protowire.KaspadMessage.modifyNotifyingAddressesTxsRequest:type_name -> protowire.ModifyNotifyingAddressesTxsRequestMessage
+ 144, // 144: protowire.KaspadMessage.modifyNotifyingAddressesTxsResponse:type_name -> protowire.ModifyNotifyingAddressesTxsResponseMessage
+ 145, // 145: protowire.KaspadMessage.AddressesTxsNotification:type_name -> protowire.AddressesTxsNotificationMessage
+ 0, // 146: protowire.P2P.MessageStream:input_type -> protowire.KaspadMessage
+ 0, // 147: protowire.RPC.MessageStream:input_type -> protowire.KaspadMessage
+ 0, // 148: protowire.P2P.MessageStream:output_type -> protowire.KaspadMessage
+ 0, // 149: protowire.RPC.MessageStream:output_type -> protowire.KaspadMessage
+ 148, // [148:150] is the sub-list for method output_type
+ 146, // [146:148] is the sub-list for method input_type
+ 146, // [146:146] is the sub-list for extension type_name
+ 146, // [146:146] is the sub-list for extension extendee
+ 0, // [0:146] is the sub-list for field type_name
}
func init() { file_messages_proto_init() }
@@ -3229,6 +3612,22 @@ func file_messages_proto_init() {
(*KaspadMessage_GetMempoolEntriesByAddressesResponse)(nil),
(*KaspadMessage_GetCoinSupplyRequest)(nil),
(*KaspadMessage_GetCoinSupplyResponse)(nil),
+ (*KaspadMessage_GetAcceptingBlockHashesOfTxsRequest)(nil),
+ (*KaspadMessage_GetAcceptingBlockHashesOfTxsResponse)(nil),
+ (*KaspadMessage_GetTxsRequest)(nil),
+ (*KaspadMessage_GetTxsResponse)(nil),
+ (*KaspadMessage_GetTxsConfirmationsRequest)(nil),
+ (*KaspadMessage_GetTxsConfirmationsResponse)(nil),
+ (*KaspadMessage_NotifyTxsConfirmationChangedRequst)(nil),
+ (*KaspadMessage_NotifyTxsConfirmationChangedResponse)(nil),
+ (*KaspadMessage_ModifyNotifyingTxsConfirmationChangedRequest)(nil),
+ (*KaspadMessage_ModifyNotifyingTxsConfirmationChangedResponse)(nil),
+ (*KaspadMessage_TxsConfirmationChangedNotification)(nil),
+ (*KaspadMessage_NotifyAddressesTxsRequest)(nil),
+ (*KaspadMessage_NotifyAddressesTxsResponse)(nil),
+ (*KaspadMessage_ModifyNotifyingAddressesTxsRequest)(nil),
+ (*KaspadMessage_ModifyNotifyingAddressesTxsResponse)(nil),
+ (*KaspadMessage_AddressesTxsNotification)(nil),
}
type x struct{}
out := protoimpl.TypeBuilder{
diff --git a/infrastructure/network/netadapter/server/grpcserver/protowire/messages.proto b/infrastructure/network/netadapter/server/grpcserver/protowire/messages.proto
index 50be89138c..2b5a0c7682 100644
--- a/infrastructure/network/netadapter/server/grpcserver/protowire/messages.proto
+++ b/infrastructure/network/netadapter/server/grpcserver/protowire/messages.proto
@@ -139,6 +139,23 @@ message KaspadMessage {
GetMempoolEntriesByAddressesResponseMessage getMempoolEntriesByAddressesResponse = 1085;
GetCoinSupplyRequestMessage getCoinSupplyRequest = 1086;
GetCoinSupplyResponseMessage getCoinSupplyResponse= 1087;
+
+ GetAcceptingBlockHashesOfTxsRequestMessage getAcceptingBlockHashesOfTxsRequest = 1088;
+ GetAcceptingBlockHashesOfTxsResponseMessage getAcceptingBlockHashesOfTxsResponse = 1089;
+ GetTxsRequestMessage getTxsRequest = 1090;
+ GetTxsResponseMessage getTxsResponse = 1091;
+ GetTxsConfirmationsRequestMessage getTxsConfirmationsRequest = 1092;
+ GetTxsConfirmationsResponseMessage getTxsConfirmationsResponse = 1093;
+ NotifyTxsConfirmationChangedRequestMessage notifyTxsConfirmationChangedRequst = 1094;
+ NotifyTxsConfirmationChangedResponseMessage notifyTxsConfirmationChangedResponse = 1095;
+ ModifyNotifyingTxsConfirmationChangedRequestMessage modifyNotifyingTxsConfirmationChangedRequest = 1096;
+ ModifyNotifyingTxsConfirmationChangedResponseMessage modifyNotifyingTxsConfirmationChangedResponse = 1097;
+ TxsConfirmationChangedNotificationMessage txsConfirmationChangedNotification = 1098;
+ NotifyAddressesTxsRequestMessage notifyAddressesTxsRequest = 1099;
+ NotifyAddressesTxsResponseMessage notifyAddressesTxsResponse = 1100;
+ ModifyNotifyingAddressesTxsRequestMessage modifyNotifyingAddressesTxsRequest = 1101;
+ ModifyNotifyingAddressesTxsResponseMessage modifyNotifyingAddressesTxsResponse = 1102;
+ AddressesTxsNotificationMessage AddressesTxsNotification = 1103;
}
}
diff --git a/infrastructure/network/netadapter/server/grpcserver/protowire/rpc.md b/infrastructure/network/netadapter/server/grpcserver/protowire/rpc.md
index 12a22923c6..d6416576e9 100644
--- a/infrastructure/network/netadapter/server/grpcserver/protowire/rpc.md
+++ b/infrastructure/network/netadapter/server/grpcserver/protowire/rpc.md
@@ -102,6 +102,8 @@
- [UnbanResponseMessage](#protowire.UnbanResponseMessage)
- [GetInfoRequestMessage](#protowire.GetInfoRequestMessage)
- [GetInfoResponseMessage](#protowire.GetInfoResponseMessage)
+ - [GetAcceptingBlockHashOfTxRequestMessage](#protowire.GetAcceptingBlockHashOfTxRequestMessage)
+ - [GetAcceptingBlockHashOfTxResponseMessage](#protowire.GetAcceptingBlockHashOfTxResponseMessage)
- [EstimateNetworkHashesPerSecondRequestMessage](#protowire.EstimateNetworkHashesPerSecondRequestMessage)
- [EstimateNetworkHashesPerSecondResponseMessage](#protowire.EstimateNetworkHashesPerSecondResponseMessage)
- [NotifyNewBlockTemplateRequestMessage](#protowire.NotifyNewBlockTemplateRequestMessage)
@@ -112,6 +114,27 @@
- [GetMempoolEntriesByAddressesResponseMessage](#protowire.GetMempoolEntriesByAddressesResponseMessage)
- [GetCoinSupplyRequestMessage](#protowire.GetCoinSupplyRequestMessage)
- [GetCoinSupplyResponseMessage](#protowire.GetCoinSupplyResponseMessage)
+ - [RpcTxIDConfirmationsPair](#protowire.RpcTxIDConfirmationsPair)
+ - [RpcTxIDBlockHashPair](#protowire.RpcTxIDBlockHashPair)
+ - [RpcTxIDBlockPair](#protowire.RpcTxIDBlockPair)
+ - [GetAcceptingBlockHashesOfTxsRequestMessage](#protowire.GetAcceptingBlockHashesOfTxsRequestMessage)
+ - [GetAcceptingBlockHashesOfTxsResponseMessage](#protowire.GetAcceptingBlockHashesOfTxsResponseMessage)
+ - [GetTxsRequestMessage](#protowire.GetTxsRequestMessage)
+ - [GetTxsResponseMessage](#protowire.GetTxsResponseMessage)
+ - [GetTxsConfirmationsRequestMessage](#protowire.GetTxsConfirmationsRequestMessage)
+ - [GetTxsConfirmationsResponseMessage](#protowire.GetTxsConfirmationsResponseMessage)
+ - [NotifyTxsConfirmationChangedRequestMessage](#protowire.NotifyTxsConfirmationChangedRequestMessage)
+ - [NotifyTxsConfirmationChangedResponseMessage](#protowire.NotifyTxsConfirmationChangedResponseMessage)
+ - [TxsConfirmationChangedNotificationMessage](#protowire.TxsConfirmationChangedNotificationMessage)
+ - [ModifyNotifyingTxsConfirmationChangedRequestMessage](#protowire.ModifyNotifyingTxsConfirmationChangedRequestMessage)
+ - [ModifyNotifyingTxsConfirmationChangedResponseMessage](#protowire.ModifyNotifyingTxsConfirmationChangedResponseMessage)
+ - [TxEntryByAddress](#protowire.TxEntryByAddress)
+ - [TxEntriesByAddresses](#protowire.TxEntriesByAddresses)
+ - [NotifyAddressesTxsRequestMessage](#protowire.NotifyAddressesTxsRequestMessage)
+ - [NotifyAddressesTxsResponseMessage](#protowire.NotifyAddressesTxsResponseMessage)
+ - [ModifyNotifyingAddressesTxsRequestMessage](#protowire.ModifyNotifyingAddressesTxsRequestMessage)
+ - [ModifyNotifyingAddressesTxsResponseMessage](#protowire.ModifyNotifyingAddressesTxsResponseMessage)
+ - [AddressesTxsNotificationMessage](#protowire.AddressesTxsNotificationMessage)
- [SubmitBlockResponseMessage.RejectReason](#protowire.SubmitBlockResponseMessage.RejectReason)
@@ -353,6 +376,9 @@ Receivers of any ResponseMessage are expected to check whether its error field i
| mass | [uint64](#uint64) | | |
| blockHash | [string](#string) | | |
| blockTime | [uint64](#uint64) | | |
+| txIndexed | [bool](#bool) | | whether the transaction is stored in the txindex database, regardless if kaspad is run with the `--txindex` flag, or not. |
+| acceptingBlockHash | [string](#string) | | Kaspad must be started with the `--txindex` flag, for parameter to display. |
+| confirmations | [uint32](#uint32) | | Kaspad must be started with the `--txindex` flag for parameter to display. |
@@ -1700,6 +1726,8 @@ GetInfoRequestMessage returns info about the node.
| mempoolSize | [uint64](#uint64) | | |
| serverVersion | [string](#string) | | |
| isUtxoIndexed | [bool](#bool) | | |
+| isTxIndexed | [bool](#bool) | | |
+| isArchival | [bool](#bool) | | |
| isSynced | [bool](#bool) | | |
| error | [RPCError](#protowire.RPCError) | | |
@@ -1708,6 +1736,37 @@ GetInfoRequestMessage returns info about the node.
+
+
+### GetAcceptingBlockHashOfTxRequestMessage
+Kaspad most be started with the `--txindex` flag for this Request to work.
+
+
+| Field | Type | Label | Description |
+| ----- | ---- | ----- | ----------- |
+| txID | [string](#string) | | |
+
+
+
+
+
+
+
+
+### GetAcceptingBlockHashOfTxResponseMessage
+the accepting block is defined as the virtual chain block that first knows about the transaction. This block may change, or be ommitted and resubmitted, during virtual changes at the tip of the blockDAG
+
+
+| Field | Type | Label | Description |
+| ----- | ---- | ----- | ----------- |
+| hash | [string](#string) | | the accepting block is defined as the virtual chain block that first knows about the transaction. This block may change, or be ommitted and resubmitted, during virtual changes at the tip of the blockDAG |
+| error | [RPCError](#protowire.RPCError) | | |
+
+
+
+
+
+
### EstimateNetworkHashesPerSecondRequestMessage
@@ -1857,6 +1916,354 @@ See NotifyNewBlockTemplateRequestMessage
+
+
+
+### RpcTxIDConfirmationsPair
+
+
+
+| Field | Type | Label | Description |
+| ----- | ---- | ----- | ----------- |
+| txID | [string](#string) | | |
+| confirmations | [int64](#int64) | | |
+
+
+
+
+
+
+
+
+### RpcTxIDBlockHashPair
+
+
+
+| Field | Type | Label | Description |
+| ----- | ---- | ----- | ----------- |
+| txID | [string](#string) | | |
+| Hash | [string](#string) | | |
+
+
+
+
+
+
+
+
+### RpcTxIDBlockPair
+
+
+
+| Field | Type | Label | Description |
+| ----- | ---- | ----- | ----------- |
+| txID | [string](#string) | | |
+| block | [RpcBlock](#protowire.RpcBlock) | | |
+
+
+
+
+
+
+
+
+### GetAcceptingBlockHashesOfTxsRequestMessage
+Kaspad must be started with the `--txindex` flag for this Request to work.
+
+
+| Field | Type | Label | Description |
+| ----- | ---- | ----- | ----------- |
+| txIDs | [string](#string) | repeated | |
+
+
+
+
+
+
+
+
+### GetAcceptingBlockHashesOfTxsResponseMessage
+
+
+
+| Field | Type | Label | Description |
+| ----- | ---- | ----- | ----------- |
+| txIDBlockHashPairs | [RpcTxIDBlockHashPair](#protowire.RpcTxIDBlockHashPair) | repeated | |
+| error | [RPCError](#protowire.RPCError) | | |
+
+
+
+
+
+
+
+
+### GetTxsRequestMessage
+Kaspad must be started with the `--txindex` flag for this Request to work.
+
+
+| Field | Type | Label | Description |
+| ----- | ---- | ----- | ----------- |
+| txIDs | [string](#string) | repeated | |
+
+
+
+
+
+
+
+
+### GetTxsResponseMessage
+
+
+
+| Field | Type | Label | Description |
+| ----- | ---- | ----- | ----------- |
+| transactions | [RpcTransaction](#protowire.RpcTransaction) | repeated | |
+| error | [RPCError](#protowire.RPCError) | | |
+
+
+
+
+
+
+
+
+### GetTxsConfirmationsRequestMessage
+Kaspad must be started with the `--txindex` flag for this Request to work.
+
+
+| Field | Type | Label | Description |
+| ----- | ---- | ----- | ----------- |
+| txIDs | [string](#string) | repeated | |
+
+
+
+
+
+
+
+
+### GetTxsConfirmationsResponseMessage
+
+
+
+| Field | Type | Label | Description |
+| ----- | ---- | ----- | ----------- |
+| txIDConfirmationsPairs | [RpcTxIDConfirmationsPair](#protowire.RpcTxIDConfirmationsPair) | repeated | |
+| error | [RPCError](#protowire.RPCError) | | |
+
+
+
+
+
+
+
+
+### NotifyTxsConfirmationChangedRequestMessage
+NotifyTxsConfirmationChangedRequstMessage is a listener that registers confirmations from supplied TxIDs
+Kaspad must be started with the `--txindex` flag for this Request to work.
+
+
+| Field | Type | Label | Description |
+| ----- | ---- | ----- | ----------- |
+| TxIDs | [string](#string) | repeated | initial TxIds to listen for when regestering for notifications |
+| requiredConfirmations | [uint32](#uint32) | | number of confirmations until a transaction is considered confirmed |
+| includePending | [bool](#bool) | | weather to notify confirmation changes during pre-Confirmed states |
+
+
+
+
+
+
+
+
+### NotifyTxsConfirmationChangedResponseMessage
+
+
+
+| Field | Type | Label | Description |
+| ----- | ---- | ----- | ----------- |
+| error | [RPCError](#protowire.RPCError) | | |
+
+
+
+
+
+
+
+
+### TxsConfirmationChangedNotificationMessage
+TxsConfirmationChangedNotificationMessage is the notification about txs pertaining to specified TxIDs
+
+
+| Field | Type | Label | Description |
+| ----- | ---- | ----- | ----------- |
+| requiredConfirmations | [uint32](#uint32) | | the required confirmations set when notification was sent |
+| pending | [RpcTxIDConfirmationsPair](#protowire.RpcTxIDConfirmationsPair) | repeated | RpcTxIDConfirmationsPairs which have entered the virtual chain but not passed the required confirmations |
+| confirmed | [RpcTxIDConfirmationsPair](#protowire.RpcTxIDConfirmationsPair) | repeated | RpcTxIDConfirmationsPairs which have entered the virtual chain and passed the required confirmations |
+| unconfirmedTxIds | [string](#string) | repeated | TxIds which were not confirmed within the required confirmations. |
+| error | [RPCError](#protowire.RPCError) | | |
+
+
+
+
+
+
+
+
+### ModifyNotifyingTxsConfirmationChangedRequestMessage
+ModifyNotifyingTxsConfirmationChangedRequestMessage modfies the params of a registered `NotifyTxsConfirmationChangedRequstMessage`
+must be registered to NotifyTxsConfirmationChangedRequstMessage for this command to work
+
+
+| Field | Type | Label | Description |
+| ----- | ---- | ----- | ----------- |
+| addTxIDs | [string](#string) | repeated | add txIds to the notification stream |
+| removeTxIDs | [string](#string) | repeated | remove txIds to the notification stream |
+| requiredConfirmations | [uint32](#uint32) | | |
+| includePending | [bool](#bool) | | |
+
+
+
+
+
+
+
+
+### ModifyNotifyingTxsConfirmationChangedResponseMessage
+
+
+
+| Field | Type | Label | Description |
+| ----- | ---- | ----- | ----------- |
+| error | [RPCError](#protowire.RPCError) | | |
+
+
+
+
+
+
+
+
+### TxEntryByAddress
+
+
+
+| Field | Type | Label | Description |
+| ----- | ---- | ----- | ----------- |
+| address | [string](#string) | | |
+| txId | [string](#string) | | |
+| confirmations | [uint32](#uint32) | | |
+
+
+
+
+
+
+
+
+### TxEntriesByAddresses
+
+
+
+| Field | Type | Label | Description |
+| ----- | ---- | ----- | ----------- |
+| sent | [TxEntryByAddress](#protowire.TxEntryByAddress) | repeated | |
+| received | [TxEntryByAddress](#protowire.TxEntryByAddress) | repeated | |
+
+
+
+
+
+
+
+
+### NotifyAddressesTxsRequestMessage
+NotifyAddressesTxsChangedRequestMessage Listens for Txs pertaining to specified addresses according to the params specified
+
+
+| Field | Type | Label | Description |
+| ----- | ---- | ----- | ----------- |
+| addresses | [string](#string) | repeated | initial addresses to listen for Tx changes when regestering for notifications |
+| requiredConfirmations | [uint32](#uint32) | | number of confirmations until a transaction is considered confirmed |
+| includePending | [bool](#bool) | | whether to notify confirmation changes during pre-Confirmed states |
+| includeSending | [bool](#bool) | | whether to listen on addresses sending txs |
+| includeReceiving | [bool](#bool) | | whether to listen on addresses reciving txs |
+
+
+
+
+
+
+
+
+### NotifyAddressesTxsResponseMessage
+
+
+
+| Field | Type | Label | Description |
+| ----- | ---- | ----- | ----------- |
+| error | [RPCError](#protowire.RPCError) | | |
+
+
+
+
+
+
+
+
+### ModifyNotifyingAddressesTxsRequestMessage
+ModifyNotifyAddressesTxsParamsRequestMessage modifies the params used for a regesitered `NotifyAddressesTxsRequest`
+Must be registered to NotifyAddressTxChangedRequestMessage for this command to work
+
+
+| Field | Type | Label | Description |
+| ----- | ---- | ----- | ----------- |
+| AddAddresses | [string](#string) | repeated | add addresses to the notification stream |
+| RemoveAddresses | [string](#string) | repeated | remove addresses to the notification stream |
+| requiredConfirmations | [uint32](#uint32) | | |
+| includePending | [bool](#bool) | | |
+| includeSending | [bool](#bool) | | |
+| includeReceiving | [bool](#bool) | | |
+
+
+
+
+
+
+
+
+### ModifyNotifyingAddressesTxsResponseMessage
+
+
+
+| Field | Type | Label | Description |
+| ----- | ---- | ----- | ----------- |
+| error | [RPCError](#protowire.RPCError) | | |
+
+
+
+
+
+
+
+
+### AddressesTxsNotificationMessage
+AddressesTxsNotificationMessage is the notification about txs pertaining to specified addresses
+
+
+| Field | Type | Label | Description |
+| ----- | ---- | ----- | ----------- |
+| requiredConfirmations | [uint32](#uint32) | | the required confirmations set when notification was sent |
+| pending | [TxEntriesByAddresses](#protowire.TxEntriesByAddresses) | | TxEntriesByAddresses which have entered the blockdag but not passed the required confirmations |
+| confirmed | [TxEntriesByAddresses](#protowire.TxEntriesByAddresses) | | TxEntriesByAddresses which have entered the blockdag and passed the required confirmations |
+| unconfirmed | [TxEntriesByAddresses](#protowire.TxEntriesByAddresses) | | TxEntriesByAddresses which have been pending, but removed via a reorg within the number of required confirmations. |
+
+
+
+
+
diff --git a/infrastructure/network/netadapter/server/grpcserver/protowire/rpc.pb.go b/infrastructure/network/netadapter/server/grpcserver/protowire/rpc.pb.go
index a72e70fe47..9ebc01634c 100644
--- a/infrastructure/network/netadapter/server/grpcserver/protowire/rpc.pb.go
+++ b/infrastructure/network/netadapter/server/grpcserver/protowire/rpc.pb.go
@@ -924,11 +924,14 @@ type RpcTransactionVerboseData struct {
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
- TransactionId string `protobuf:"bytes,1,opt,name=transactionId,proto3" json:"transactionId,omitempty"`
- Hash string `protobuf:"bytes,2,opt,name=hash,proto3" json:"hash,omitempty"`
- Mass uint64 `protobuf:"varint,4,opt,name=mass,proto3" json:"mass,omitempty"`
- BlockHash string `protobuf:"bytes,12,opt,name=blockHash,proto3" json:"blockHash,omitempty"`
- BlockTime uint64 `protobuf:"varint,14,opt,name=blockTime,proto3" json:"blockTime,omitempty"`
+ TransactionId string `protobuf:"bytes,1,opt,name=transactionId,proto3" json:"transactionId,omitempty"`
+ Hash string `protobuf:"bytes,2,opt,name=hash,proto3" json:"hash,omitempty"`
+ Mass uint64 `protobuf:"varint,4,opt,name=mass,proto3" json:"mass,omitempty"`
+ BlockHash string `protobuf:"bytes,12,opt,name=blockHash,proto3" json:"blockHash,omitempty"`
+ BlockTime uint64 `protobuf:"varint,14,opt,name=blockTime,proto3" json:"blockTime,omitempty"`
+ TxIndexed bool `protobuf:"varint,15,opt,name=txIndexed,proto3" json:"txIndexed,omitempty"` //whether the transaction is stored in the txindex database, regardless if kaspad is run with the `--txindex` flag, or not.
+ AcceptingBlockHash string `protobuf:"bytes,16,opt,name=acceptingBlockHash,proto3" json:"acceptingBlockHash,omitempty"` // Kaspad must be started with the `--txindex` flag, for parameter to display.
+ Confirmations uint32 `protobuf:"varint,17,opt,name=confirmations,proto3" json:"confirmations,omitempty"` // Kaspad must be started with the `--txindex` flag for parameter to display.
}
func (x *RpcTransactionVerboseData) Reset() {
@@ -998,6 +1001,27 @@ func (x *RpcTransactionVerboseData) GetBlockTime() uint64 {
return 0
}
+func (x *RpcTransactionVerboseData) GetTxIndexed() bool {
+ if x != nil {
+ return x.TxIndexed
+ }
+ return false
+}
+
+func (x *RpcTransactionVerboseData) GetAcceptingBlockHash() string {
+ if x != nil {
+ return x.AcceptingBlockHash
+ }
+ return ""
+}
+
+func (x *RpcTransactionVerboseData) GetConfirmations() uint32 {
+ if x != nil {
+ return x.Confirmations
+ }
+ return 0
+}
+
type RpcTransactionInputVerboseData struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
@@ -5510,7 +5534,9 @@ type GetInfoResponseMessage struct {
MempoolSize uint64 `protobuf:"varint,2,opt,name=mempoolSize,proto3" json:"mempoolSize,omitempty"`
ServerVersion string `protobuf:"bytes,3,opt,name=serverVersion,proto3" json:"serverVersion,omitempty"`
IsUtxoIndexed bool `protobuf:"varint,4,opt,name=isUtxoIndexed,proto3" json:"isUtxoIndexed,omitempty"`
- IsSynced bool `protobuf:"varint,5,opt,name=isSynced,proto3" json:"isSynced,omitempty"`
+ IsTxIndexed bool `protobuf:"varint,5,opt,name=isTxIndexed,proto3" json:"isTxIndexed,omitempty"`
+ IsArchival bool `protobuf:"varint,6,opt,name=isArchival,proto3" json:"isArchival,omitempty"`
+ IsSynced bool `protobuf:"varint,7,opt,name=isSynced,proto3" json:"isSynced,omitempty"`
Error *RPCError `protobuf:"bytes,1000,opt,name=error,proto3" json:"error,omitempty"`
}
@@ -5574,6 +5600,20 @@ func (x *GetInfoResponseMessage) GetIsUtxoIndexed() bool {
return false
}
+func (x *GetInfoResponseMessage) GetIsTxIndexed() bool {
+ if x != nil {
+ return x.IsTxIndexed
+ }
+ return false
+}
+
+func (x *GetInfoResponseMessage) GetIsArchival() bool {
+ if x != nil {
+ return x.IsArchival
+ }
+ return false
+}
+
func (x *GetInfoResponseMessage) GetIsSynced() bool {
if x != nil {
return x.IsSynced
@@ -5588,6 +5628,110 @@ func (x *GetInfoResponseMessage) GetError() *RPCError {
return nil
}
+//Kaspad most be started with the `--txindex` flag for this Request to work.
+type GetAcceptingBlockHashOfTxRequestMessage struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ TxID string `protobuf:"bytes,1,opt,name=txID,proto3" json:"txID,omitempty"`
+}
+
+func (x *GetAcceptingBlockHashOfTxRequestMessage) Reset() {
+ *x = GetAcceptingBlockHashOfTxRequestMessage{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_rpc_proto_msgTypes[98]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *GetAcceptingBlockHashOfTxRequestMessage) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetAcceptingBlockHashOfTxRequestMessage) ProtoMessage() {}
+
+func (x *GetAcceptingBlockHashOfTxRequestMessage) ProtoReflect() protoreflect.Message {
+ mi := &file_rpc_proto_msgTypes[98]
+ 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 GetAcceptingBlockHashOfTxRequestMessage.ProtoReflect.Descriptor instead.
+func (*GetAcceptingBlockHashOfTxRequestMessage) Descriptor() ([]byte, []int) {
+ return file_rpc_proto_rawDescGZIP(), []int{98}
+}
+
+func (x *GetAcceptingBlockHashOfTxRequestMessage) GetTxID() string {
+ if x != nil {
+ return x.TxID
+ }
+ return ""
+}
+
+//the accepting block is defined as the virtual chain block that first knows about the transaction. This block may change, or be ommitted and resubmitted, during virtual changes at the tip of the blockDAG
+type GetAcceptingBlockHashOfTxResponseMessage struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Hash string `protobuf:"bytes,1,opt,name=hash,proto3" json:"hash,omitempty"` //the accepting block is defined as the virtual chain block that first knows about the transaction. This block may change, or be ommitted and resubmitted, during virtual changes at the tip of the blockDAG
+ Error *RPCError `protobuf:"bytes,1000,opt,name=error,proto3" json:"error,omitempty"`
+}
+
+func (x *GetAcceptingBlockHashOfTxResponseMessage) Reset() {
+ *x = GetAcceptingBlockHashOfTxResponseMessage{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_rpc_proto_msgTypes[99]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *GetAcceptingBlockHashOfTxResponseMessage) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetAcceptingBlockHashOfTxResponseMessage) ProtoMessage() {}
+
+func (x *GetAcceptingBlockHashOfTxResponseMessage) ProtoReflect() protoreflect.Message {
+ mi := &file_rpc_proto_msgTypes[99]
+ 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 GetAcceptingBlockHashOfTxResponseMessage.ProtoReflect.Descriptor instead.
+func (*GetAcceptingBlockHashOfTxResponseMessage) Descriptor() ([]byte, []int) {
+ return file_rpc_proto_rawDescGZIP(), []int{99}
+}
+
+func (x *GetAcceptingBlockHashOfTxResponseMessage) GetHash() string {
+ if x != nil {
+ return x.Hash
+ }
+ return ""
+}
+
+func (x *GetAcceptingBlockHashOfTxResponseMessage) GetError() *RPCError {
+ if x != nil {
+ return x.Error
+ }
+ return nil
+}
+
type EstimateNetworkHashesPerSecondRequestMessage struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
@@ -5600,7 +5744,7 @@ type EstimateNetworkHashesPerSecondRequestMessage struct {
func (x *EstimateNetworkHashesPerSecondRequestMessage) Reset() {
*x = EstimateNetworkHashesPerSecondRequestMessage{}
if protoimpl.UnsafeEnabled {
- mi := &file_rpc_proto_msgTypes[98]
+ mi := &file_rpc_proto_msgTypes[100]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -5613,7 +5757,7 @@ func (x *EstimateNetworkHashesPerSecondRequestMessage) String() string {
func (*EstimateNetworkHashesPerSecondRequestMessage) ProtoMessage() {}
func (x *EstimateNetworkHashesPerSecondRequestMessage) ProtoReflect() protoreflect.Message {
- mi := &file_rpc_proto_msgTypes[98]
+ mi := &file_rpc_proto_msgTypes[100]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -5626,7 +5770,7 @@ func (x *EstimateNetworkHashesPerSecondRequestMessage) ProtoReflect() protorefle
// Deprecated: Use EstimateNetworkHashesPerSecondRequestMessage.ProtoReflect.Descriptor instead.
func (*EstimateNetworkHashesPerSecondRequestMessage) Descriptor() ([]byte, []int) {
- return file_rpc_proto_rawDescGZIP(), []int{98}
+ return file_rpc_proto_rawDescGZIP(), []int{100}
}
func (x *EstimateNetworkHashesPerSecondRequestMessage) GetWindowSize() uint32 {
@@ -5655,7 +5799,7 @@ type EstimateNetworkHashesPerSecondResponseMessage struct {
func (x *EstimateNetworkHashesPerSecondResponseMessage) Reset() {
*x = EstimateNetworkHashesPerSecondResponseMessage{}
if protoimpl.UnsafeEnabled {
- mi := &file_rpc_proto_msgTypes[99]
+ mi := &file_rpc_proto_msgTypes[101]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -5668,7 +5812,7 @@ func (x *EstimateNetworkHashesPerSecondResponseMessage) String() string {
func (*EstimateNetworkHashesPerSecondResponseMessage) ProtoMessage() {}
func (x *EstimateNetworkHashesPerSecondResponseMessage) ProtoReflect() protoreflect.Message {
- mi := &file_rpc_proto_msgTypes[99]
+ mi := &file_rpc_proto_msgTypes[101]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -5681,7 +5825,7 @@ func (x *EstimateNetworkHashesPerSecondResponseMessage) ProtoReflect() protorefl
// Deprecated: Use EstimateNetworkHashesPerSecondResponseMessage.ProtoReflect.Descriptor instead.
func (*EstimateNetworkHashesPerSecondResponseMessage) Descriptor() ([]byte, []int) {
- return file_rpc_proto_rawDescGZIP(), []int{99}
+ return file_rpc_proto_rawDescGZIP(), []int{101}
}
func (x *EstimateNetworkHashesPerSecondResponseMessage) GetNetworkHashesPerSecond() uint64 {
@@ -5711,7 +5855,7 @@ type NotifyNewBlockTemplateRequestMessage struct {
func (x *NotifyNewBlockTemplateRequestMessage) Reset() {
*x = NotifyNewBlockTemplateRequestMessage{}
if protoimpl.UnsafeEnabled {
- mi := &file_rpc_proto_msgTypes[100]
+ mi := &file_rpc_proto_msgTypes[102]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -5724,7 +5868,7 @@ func (x *NotifyNewBlockTemplateRequestMessage) String() string {
func (*NotifyNewBlockTemplateRequestMessage) ProtoMessage() {}
func (x *NotifyNewBlockTemplateRequestMessage) ProtoReflect() protoreflect.Message {
- mi := &file_rpc_proto_msgTypes[100]
+ mi := &file_rpc_proto_msgTypes[102]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -5737,7 +5881,7 @@ func (x *NotifyNewBlockTemplateRequestMessage) ProtoReflect() protoreflect.Messa
// Deprecated: Use NotifyNewBlockTemplateRequestMessage.ProtoReflect.Descriptor instead.
func (*NotifyNewBlockTemplateRequestMessage) Descriptor() ([]byte, []int) {
- return file_rpc_proto_rawDescGZIP(), []int{100}
+ return file_rpc_proto_rawDescGZIP(), []int{102}
}
type NotifyNewBlockTemplateResponseMessage struct {
@@ -5751,7 +5895,7 @@ type NotifyNewBlockTemplateResponseMessage struct {
func (x *NotifyNewBlockTemplateResponseMessage) Reset() {
*x = NotifyNewBlockTemplateResponseMessage{}
if protoimpl.UnsafeEnabled {
- mi := &file_rpc_proto_msgTypes[101]
+ mi := &file_rpc_proto_msgTypes[103]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -5764,7 +5908,7 @@ func (x *NotifyNewBlockTemplateResponseMessage) String() string {
func (*NotifyNewBlockTemplateResponseMessage) ProtoMessage() {}
func (x *NotifyNewBlockTemplateResponseMessage) ProtoReflect() protoreflect.Message {
- mi := &file_rpc_proto_msgTypes[101]
+ mi := &file_rpc_proto_msgTypes[103]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -5777,7 +5921,7 @@ func (x *NotifyNewBlockTemplateResponseMessage) ProtoReflect() protoreflect.Mess
// Deprecated: Use NotifyNewBlockTemplateResponseMessage.ProtoReflect.Descriptor instead.
func (*NotifyNewBlockTemplateResponseMessage) Descriptor() ([]byte, []int) {
- return file_rpc_proto_rawDescGZIP(), []int{101}
+ return file_rpc_proto_rawDescGZIP(), []int{103}
}
func (x *NotifyNewBlockTemplateResponseMessage) GetError() *RPCError {
@@ -5800,7 +5944,7 @@ type NewBlockTemplateNotificationMessage struct {
func (x *NewBlockTemplateNotificationMessage) Reset() {
*x = NewBlockTemplateNotificationMessage{}
if protoimpl.UnsafeEnabled {
- mi := &file_rpc_proto_msgTypes[102]
+ mi := &file_rpc_proto_msgTypes[104]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -5813,7 +5957,7 @@ func (x *NewBlockTemplateNotificationMessage) String() string {
func (*NewBlockTemplateNotificationMessage) ProtoMessage() {}
func (x *NewBlockTemplateNotificationMessage) ProtoReflect() protoreflect.Message {
- mi := &file_rpc_proto_msgTypes[102]
+ mi := &file_rpc_proto_msgTypes[104]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -5826,7 +5970,7 @@ func (x *NewBlockTemplateNotificationMessage) ProtoReflect() protoreflect.Messag
// Deprecated: Use NewBlockTemplateNotificationMessage.ProtoReflect.Descriptor instead.
func (*NewBlockTemplateNotificationMessage) Descriptor() ([]byte, []int) {
- return file_rpc_proto_rawDescGZIP(), []int{102}
+ return file_rpc_proto_rawDescGZIP(), []int{104}
}
type MempoolEntryByAddress struct {
@@ -5842,7 +5986,7 @@ type MempoolEntryByAddress struct {
func (x *MempoolEntryByAddress) Reset() {
*x = MempoolEntryByAddress{}
if protoimpl.UnsafeEnabled {
- mi := &file_rpc_proto_msgTypes[103]
+ mi := &file_rpc_proto_msgTypes[105]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -5855,7 +5999,7 @@ func (x *MempoolEntryByAddress) String() string {
func (*MempoolEntryByAddress) ProtoMessage() {}
func (x *MempoolEntryByAddress) ProtoReflect() protoreflect.Message {
- mi := &file_rpc_proto_msgTypes[103]
+ mi := &file_rpc_proto_msgTypes[105]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -5868,7 +6012,7 @@ func (x *MempoolEntryByAddress) ProtoReflect() protoreflect.Message {
// Deprecated: Use MempoolEntryByAddress.ProtoReflect.Descriptor instead.
func (*MempoolEntryByAddress) Descriptor() ([]byte, []int) {
- return file_rpc_proto_rawDescGZIP(), []int{103}
+ return file_rpc_proto_rawDescGZIP(), []int{105}
}
func (x *MempoolEntryByAddress) GetAddress() string {
@@ -5905,7 +6049,7 @@ type GetMempoolEntriesByAddressesRequestMessage struct {
func (x *GetMempoolEntriesByAddressesRequestMessage) Reset() {
*x = GetMempoolEntriesByAddressesRequestMessage{}
if protoimpl.UnsafeEnabled {
- mi := &file_rpc_proto_msgTypes[104]
+ mi := &file_rpc_proto_msgTypes[106]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -5918,7 +6062,7 @@ func (x *GetMempoolEntriesByAddressesRequestMessage) String() string {
func (*GetMempoolEntriesByAddressesRequestMessage) ProtoMessage() {}
func (x *GetMempoolEntriesByAddressesRequestMessage) ProtoReflect() protoreflect.Message {
- mi := &file_rpc_proto_msgTypes[104]
+ mi := &file_rpc_proto_msgTypes[106]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -5931,7 +6075,7 @@ func (x *GetMempoolEntriesByAddressesRequestMessage) ProtoReflect() protoreflect
// Deprecated: Use GetMempoolEntriesByAddressesRequestMessage.ProtoReflect.Descriptor instead.
func (*GetMempoolEntriesByAddressesRequestMessage) Descriptor() ([]byte, []int) {
- return file_rpc_proto_rawDescGZIP(), []int{104}
+ return file_rpc_proto_rawDescGZIP(), []int{106}
}
func (x *GetMempoolEntriesByAddressesRequestMessage) GetAddresses() []string {
@@ -5967,7 +6111,7 @@ type GetMempoolEntriesByAddressesResponseMessage struct {
func (x *GetMempoolEntriesByAddressesResponseMessage) Reset() {
*x = GetMempoolEntriesByAddressesResponseMessage{}
if protoimpl.UnsafeEnabled {
- mi := &file_rpc_proto_msgTypes[105]
+ mi := &file_rpc_proto_msgTypes[107]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -5980,7 +6124,7 @@ func (x *GetMempoolEntriesByAddressesResponseMessage) String() string {
func (*GetMempoolEntriesByAddressesResponseMessage) ProtoMessage() {}
func (x *GetMempoolEntriesByAddressesResponseMessage) ProtoReflect() protoreflect.Message {
- mi := &file_rpc_proto_msgTypes[105]
+ mi := &file_rpc_proto_msgTypes[107]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -5993,7 +6137,7 @@ func (x *GetMempoolEntriesByAddressesResponseMessage) ProtoReflect() protoreflec
// Deprecated: Use GetMempoolEntriesByAddressesResponseMessage.ProtoReflect.Descriptor instead.
func (*GetMempoolEntriesByAddressesResponseMessage) Descriptor() ([]byte, []int) {
- return file_rpc_proto_rawDescGZIP(), []int{105}
+ return file_rpc_proto_rawDescGZIP(), []int{107}
}
func (x *GetMempoolEntriesByAddressesResponseMessage) GetEntries() []*MempoolEntryByAddress {
@@ -6019,7 +6163,7 @@ type GetCoinSupplyRequestMessage struct {
func (x *GetCoinSupplyRequestMessage) Reset() {
*x = GetCoinSupplyRequestMessage{}
if protoimpl.UnsafeEnabled {
- mi := &file_rpc_proto_msgTypes[106]
+ mi := &file_rpc_proto_msgTypes[108]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -6032,7 +6176,7 @@ func (x *GetCoinSupplyRequestMessage) String() string {
func (*GetCoinSupplyRequestMessage) ProtoMessage() {}
func (x *GetCoinSupplyRequestMessage) ProtoReflect() protoreflect.Message {
- mi := &file_rpc_proto_msgTypes[106]
+ mi := &file_rpc_proto_msgTypes[108]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -6045,7 +6189,7 @@ func (x *GetCoinSupplyRequestMessage) ProtoReflect() protoreflect.Message {
// Deprecated: Use GetCoinSupplyRequestMessage.ProtoReflect.Descriptor instead.
func (*GetCoinSupplyRequestMessage) Descriptor() ([]byte, []int) {
- return file_rpc_proto_rawDescGZIP(), []int{106}
+ return file_rpc_proto_rawDescGZIP(), []int{108}
}
type GetCoinSupplyResponseMessage struct {
@@ -6061,7 +6205,7 @@ type GetCoinSupplyResponseMessage struct {
func (x *GetCoinSupplyResponseMessage) Reset() {
*x = GetCoinSupplyResponseMessage{}
if protoimpl.UnsafeEnabled {
- mi := &file_rpc_proto_msgTypes[107]
+ mi := &file_rpc_proto_msgTypes[109]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -6074,7 +6218,7 @@ func (x *GetCoinSupplyResponseMessage) String() string {
func (*GetCoinSupplyResponseMessage) ProtoMessage() {}
func (x *GetCoinSupplyResponseMessage) ProtoReflect() protoreflect.Message {
- mi := &file_rpc_proto_msgTypes[107]
+ mi := &file_rpc_proto_msgTypes[109]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -6087,7 +6231,7 @@ func (x *GetCoinSupplyResponseMessage) ProtoReflect() protoreflect.Message {
// Deprecated: Use GetCoinSupplyResponseMessage.ProtoReflect.Descriptor instead.
func (*GetCoinSupplyResponseMessage) Descriptor() ([]byte, []int) {
- return file_rpc_proto_rawDescGZIP(), []int{107}
+ return file_rpc_proto_rawDescGZIP(), []int{109}
}
func (x *GetCoinSupplyResponseMessage) GetMaxSompi() uint64 {
@@ -6111,99 +6255,1338 @@ func (x *GetCoinSupplyResponseMessage) GetError() *RPCError {
return nil
}
-var File_rpc_proto protoreflect.FileDescriptor
+type RpcTxIDConfirmationsPair struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
-var file_rpc_proto_rawDesc = []byte{
- 0x0a, 0x09, 0x72, 0x70, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x09, 0x70, 0x72, 0x6f,
- 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x22, 0x24, 0x0a, 0x08, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72,
- 0x6f, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20,
- 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0xbe, 0x01, 0x0a,
- 0x08, 0x52, 0x70, 0x63, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x31, 0x0a, 0x06, 0x68, 0x65, 0x61,
- 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x74,
- 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x70, 0x63, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65,
- 0x61, 0x64, 0x65, 0x72, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x3d, 0x0a, 0x0c,
- 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03,
- 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52,
- 0x70, 0x63, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x74,
- 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x40, 0x0a, 0x0b, 0x76,
- 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b,
- 0x32, 0x1e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x70, 0x63,
- 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x56, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61,
- 0x52, 0x0b, 0x76, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x22, 0xab, 0x03,
- 0x0a, 0x0e, 0x52, 0x70, 0x63, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72,
- 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28,
- 0x0d, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x07, 0x70, 0x61,
- 0x72, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x70, 0x72,
- 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x70, 0x63, 0x42, 0x6c, 0x6f, 0x63, 0x6b,
- 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x07, 0x70, 0x61,
- 0x72, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x68, 0x61, 0x73, 0x68, 0x4d, 0x65, 0x72,
- 0x6b, 0x6c, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x68,
- 0x61, 0x73, 0x68, 0x4d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x32, 0x0a,
- 0x14, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, 0x49, 0x64, 0x4d, 0x65, 0x72, 0x6b, 0x6c,
- 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x61, 0x63, 0x63,
- 0x65, 0x70, 0x74, 0x65, 0x64, 0x49, 0x64, 0x4d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x52, 0x6f, 0x6f,
- 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x75, 0x74, 0x78, 0x6f, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d,
- 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x75, 0x74, 0x78, 0x6f, 0x43,
- 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d,
- 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69,
- 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x12, 0x0a, 0x04, 0x62, 0x69, 0x74, 0x73, 0x18,
- 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x62, 0x69, 0x74, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6e,
- 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6e, 0x6f, 0x6e, 0x63,
- 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x61, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x09, 0x20,
- 0x01, 0x28, 0x04, 0x52, 0x08, 0x64, 0x61, 0x61, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x1a, 0x0a,
- 0x08, 0x62, 0x6c, 0x75, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52,
- 0x08, 0x62, 0x6c, 0x75, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72, 0x75,
- 0x6e, 0x69, 0x6e, 0x67, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52,
- 0x0c, 0x70, 0x72, 0x75, 0x6e, 0x69, 0x6e, 0x67, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x1c, 0x0a,
- 0x09, 0x62, 0x6c, 0x75, 0x65, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x04,
- 0x52, 0x09, 0x62, 0x6c, 0x75, 0x65, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x22, 0x3a, 0x0a, 0x14, 0x52,
- 0x70, 0x63, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x50, 0x61, 0x72, 0x65,
- 0x6e, 0x74, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x48, 0x61, 0x73,
- 0x68, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x61, 0x72, 0x65, 0x6e,
- 0x74, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x22, 0x91, 0x03, 0x0a, 0x13, 0x52, 0x70, 0x63, 0x42,
- 0x6c, 0x6f, 0x63, 0x6b, 0x56, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x12,
- 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68,
- 0x61, 0x73, 0x68, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x69, 0x66, 0x66, 0x69, 0x63, 0x75, 0x6c, 0x74,
- 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0a, 0x64, 0x69, 0x66, 0x66, 0x69, 0x63, 0x75,
- 0x6c, 0x74, 0x79, 0x12, 0x2e, 0x0a, 0x12, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x50,
- 0x61, 0x72, 0x65, 0x6e, 0x74, 0x48, 0x61, 0x73, 0x68, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52,
- 0x12, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x48,
- 0x61, 0x73, 0x68, 0x12, 0x26, 0x0a, 0x0e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69,
- 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x72, 0x61,
- 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x69,
- 0x73, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4f, 0x6e, 0x6c, 0x79, 0x18, 0x0f, 0x20, 0x01, 0x28,
- 0x08, 0x52, 0x0c, 0x69, 0x73, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4f, 0x6e, 0x6c, 0x79, 0x12,
- 0x1c, 0x0a, 0x09, 0x62, 0x6c, 0x75, 0x65, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x10, 0x20, 0x01,
- 0x28, 0x04, 0x52, 0x09, 0x62, 0x6c, 0x75, 0x65, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x26, 0x0a,
- 0x0e, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18,
- 0x11, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x48,
- 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x53, 0x65,
- 0x74, 0x42, 0x6c, 0x75, 0x65, 0x73, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x12, 0x20, 0x03,
- 0x28, 0x09, 0x52, 0x13, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x53, 0x65, 0x74, 0x42, 0x6c, 0x75, 0x65,
- 0x73, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x2e, 0x0a, 0x12, 0x6d, 0x65, 0x72, 0x67, 0x65,
- 0x53, 0x65, 0x74, 0x52, 0x65, 0x64, 0x73, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x13, 0x20,
- 0x03, 0x28, 0x09, 0x52, 0x12, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x64,
- 0x73, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x69, 0x73, 0x43, 0x68, 0x61,
- 0x69, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x14, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x69,
- 0x73, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x22, 0xd1, 0x02, 0x0a, 0x0e,
- 0x52, 0x70, 0x63, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18,
- 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52,
- 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x36, 0x0a, 0x06, 0x69, 0x6e, 0x70, 0x75,
- 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
- 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x70, 0x63, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74,
- 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x52, 0x06, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73,
- 0x12, 0x39, 0x0a, 0x07, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28,
- 0x0b, 0x32, 0x1f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x70,
- 0x63, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x75, 0x74, 0x70,
- 0x75, 0x74, 0x52, 0x07, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x6c,
- 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x6c,
- 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x73, 0x75, 0x62, 0x6e, 0x65,
- 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73,
- 0x75, 0x62, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x67,
- 0x61, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x03, 0x67, 0x61, 0x73, 0x12, 0x18, 0x0a,
- 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07,
- 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x46, 0x0a, 0x0b, 0x76, 0x65, 0x72, 0x62, 0x6f,
- 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x70,
+ TxID string `protobuf:"bytes,1,opt,name=txID,proto3" json:"txID,omitempty"`
+ Confirmations int64 `protobuf:"varint,2,opt,name=confirmations,proto3" json:"confirmations,omitempty"`
+}
+
+func (x *RpcTxIDConfirmationsPair) Reset() {
+ *x = RpcTxIDConfirmationsPair{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_rpc_proto_msgTypes[110]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *RpcTxIDConfirmationsPair) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*RpcTxIDConfirmationsPair) ProtoMessage() {}
+
+func (x *RpcTxIDConfirmationsPair) ProtoReflect() protoreflect.Message {
+ mi := &file_rpc_proto_msgTypes[110]
+ 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 RpcTxIDConfirmationsPair.ProtoReflect.Descriptor instead.
+func (*RpcTxIDConfirmationsPair) Descriptor() ([]byte, []int) {
+ return file_rpc_proto_rawDescGZIP(), []int{110}
+}
+
+func (x *RpcTxIDConfirmationsPair) GetTxID() string {
+ if x != nil {
+ return x.TxID
+ }
+ return ""
+}
+
+func (x *RpcTxIDConfirmationsPair) GetConfirmations() int64 {
+ if x != nil {
+ return x.Confirmations
+ }
+ return 0
+}
+
+type RpcTxIDBlockHashPair struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ TxID string `protobuf:"bytes,1,opt,name=txID,proto3" json:"txID,omitempty"`
+ Hash string `protobuf:"bytes,2,opt,name=Hash,proto3" json:"Hash,omitempty"`
+}
+
+func (x *RpcTxIDBlockHashPair) Reset() {
+ *x = RpcTxIDBlockHashPair{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_rpc_proto_msgTypes[111]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *RpcTxIDBlockHashPair) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*RpcTxIDBlockHashPair) ProtoMessage() {}
+
+func (x *RpcTxIDBlockHashPair) ProtoReflect() protoreflect.Message {
+ mi := &file_rpc_proto_msgTypes[111]
+ 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 RpcTxIDBlockHashPair.ProtoReflect.Descriptor instead.
+func (*RpcTxIDBlockHashPair) Descriptor() ([]byte, []int) {
+ return file_rpc_proto_rawDescGZIP(), []int{111}
+}
+
+func (x *RpcTxIDBlockHashPair) GetTxID() string {
+ if x != nil {
+ return x.TxID
+ }
+ return ""
+}
+
+func (x *RpcTxIDBlockHashPair) GetHash() string {
+ if x != nil {
+ return x.Hash
+ }
+ return ""
+}
+
+type RpcTxIDBlockPair struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ TxID string `protobuf:"bytes,1,opt,name=txID,proto3" json:"txID,omitempty"`
+ Block *RpcBlock `protobuf:"bytes,2,opt,name=block,proto3" json:"block,omitempty"`
+}
+
+func (x *RpcTxIDBlockPair) Reset() {
+ *x = RpcTxIDBlockPair{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_rpc_proto_msgTypes[112]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *RpcTxIDBlockPair) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*RpcTxIDBlockPair) ProtoMessage() {}
+
+func (x *RpcTxIDBlockPair) ProtoReflect() protoreflect.Message {
+ mi := &file_rpc_proto_msgTypes[112]
+ 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 RpcTxIDBlockPair.ProtoReflect.Descriptor instead.
+func (*RpcTxIDBlockPair) Descriptor() ([]byte, []int) {
+ return file_rpc_proto_rawDescGZIP(), []int{112}
+}
+
+func (x *RpcTxIDBlockPair) GetTxID() string {
+ if x != nil {
+ return x.TxID
+ }
+ return ""
+}
+
+func (x *RpcTxIDBlockPair) GetBlock() *RpcBlock {
+ if x != nil {
+ return x.Block
+ }
+ return nil
+}
+
+// Kaspad must be started with the `--txindex` flag for this Request to work.
+type GetAcceptingBlockHashesOfTxsRequestMessage struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ TxIDs []string `protobuf:"bytes,1,rep,name=txIDs,proto3" json:"txIDs,omitempty"`
+}
+
+func (x *GetAcceptingBlockHashesOfTxsRequestMessage) Reset() {
+ *x = GetAcceptingBlockHashesOfTxsRequestMessage{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_rpc_proto_msgTypes[113]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *GetAcceptingBlockHashesOfTxsRequestMessage) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetAcceptingBlockHashesOfTxsRequestMessage) ProtoMessage() {}
+
+func (x *GetAcceptingBlockHashesOfTxsRequestMessage) ProtoReflect() protoreflect.Message {
+ mi := &file_rpc_proto_msgTypes[113]
+ 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 GetAcceptingBlockHashesOfTxsRequestMessage.ProtoReflect.Descriptor instead.
+func (*GetAcceptingBlockHashesOfTxsRequestMessage) Descriptor() ([]byte, []int) {
+ return file_rpc_proto_rawDescGZIP(), []int{113}
+}
+
+func (x *GetAcceptingBlockHashesOfTxsRequestMessage) GetTxIDs() []string {
+ if x != nil {
+ return x.TxIDs
+ }
+ return nil
+}
+
+type GetAcceptingBlockHashesOfTxsResponseMessage struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ TxIDBlockHashPairs []*RpcTxIDBlockHashPair `protobuf:"bytes,1,rep,name=txIDBlockHashPairs,proto3" json:"txIDBlockHashPairs,omitempty"`
+ Error *RPCError `protobuf:"bytes,1000,opt,name=error,proto3" json:"error,omitempty"`
+}
+
+func (x *GetAcceptingBlockHashesOfTxsResponseMessage) Reset() {
+ *x = GetAcceptingBlockHashesOfTxsResponseMessage{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_rpc_proto_msgTypes[114]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *GetAcceptingBlockHashesOfTxsResponseMessage) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetAcceptingBlockHashesOfTxsResponseMessage) ProtoMessage() {}
+
+func (x *GetAcceptingBlockHashesOfTxsResponseMessage) ProtoReflect() protoreflect.Message {
+ mi := &file_rpc_proto_msgTypes[114]
+ 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 GetAcceptingBlockHashesOfTxsResponseMessage.ProtoReflect.Descriptor instead.
+func (*GetAcceptingBlockHashesOfTxsResponseMessage) Descriptor() ([]byte, []int) {
+ return file_rpc_proto_rawDescGZIP(), []int{114}
+}
+
+func (x *GetAcceptingBlockHashesOfTxsResponseMessage) GetTxIDBlockHashPairs() []*RpcTxIDBlockHashPair {
+ if x != nil {
+ return x.TxIDBlockHashPairs
+ }
+ return nil
+}
+
+func (x *GetAcceptingBlockHashesOfTxsResponseMessage) GetError() *RPCError {
+ if x != nil {
+ return x.Error
+ }
+ return nil
+}
+
+// Kaspad must be started with the `--txindex` flag for this Request to work.
+type GetTxsRequestMessage struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ TxIDs []string `protobuf:"bytes,1,rep,name=txIDs,proto3" json:"txIDs,omitempty"`
+}
+
+func (x *GetTxsRequestMessage) Reset() {
+ *x = GetTxsRequestMessage{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_rpc_proto_msgTypes[115]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *GetTxsRequestMessage) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetTxsRequestMessage) ProtoMessage() {}
+
+func (x *GetTxsRequestMessage) ProtoReflect() protoreflect.Message {
+ mi := &file_rpc_proto_msgTypes[115]
+ 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 GetTxsRequestMessage.ProtoReflect.Descriptor instead.
+func (*GetTxsRequestMessage) Descriptor() ([]byte, []int) {
+ return file_rpc_proto_rawDescGZIP(), []int{115}
+}
+
+func (x *GetTxsRequestMessage) GetTxIDs() []string {
+ if x != nil {
+ return x.TxIDs
+ }
+ return nil
+}
+
+type GetTxsResponseMessage struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Transactions []*RpcTransaction `protobuf:"bytes,1,rep,name=transactions,proto3" json:"transactions,omitempty"`
+ Error *RPCError `protobuf:"bytes,1000,opt,name=error,proto3" json:"error,omitempty"`
+}
+
+func (x *GetTxsResponseMessage) Reset() {
+ *x = GetTxsResponseMessage{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_rpc_proto_msgTypes[116]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *GetTxsResponseMessage) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetTxsResponseMessage) ProtoMessage() {}
+
+func (x *GetTxsResponseMessage) ProtoReflect() protoreflect.Message {
+ mi := &file_rpc_proto_msgTypes[116]
+ 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 GetTxsResponseMessage.ProtoReflect.Descriptor instead.
+func (*GetTxsResponseMessage) Descriptor() ([]byte, []int) {
+ return file_rpc_proto_rawDescGZIP(), []int{116}
+}
+
+func (x *GetTxsResponseMessage) GetTransactions() []*RpcTransaction {
+ if x != nil {
+ return x.Transactions
+ }
+ return nil
+}
+
+func (x *GetTxsResponseMessage) GetError() *RPCError {
+ if x != nil {
+ return x.Error
+ }
+ return nil
+}
+
+// Kaspad must be started with the `--txindex` flag for this Request to work.
+type GetTxsConfirmationsRequestMessage struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ TxIDs []string `protobuf:"bytes,1,rep,name=txIDs,proto3" json:"txIDs,omitempty"`
+}
+
+func (x *GetTxsConfirmationsRequestMessage) Reset() {
+ *x = GetTxsConfirmationsRequestMessage{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_rpc_proto_msgTypes[117]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *GetTxsConfirmationsRequestMessage) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetTxsConfirmationsRequestMessage) ProtoMessage() {}
+
+func (x *GetTxsConfirmationsRequestMessage) ProtoReflect() protoreflect.Message {
+ mi := &file_rpc_proto_msgTypes[117]
+ 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 GetTxsConfirmationsRequestMessage.ProtoReflect.Descriptor instead.
+func (*GetTxsConfirmationsRequestMessage) Descriptor() ([]byte, []int) {
+ return file_rpc_proto_rawDescGZIP(), []int{117}
+}
+
+func (x *GetTxsConfirmationsRequestMessage) GetTxIDs() []string {
+ if x != nil {
+ return x.TxIDs
+ }
+ return nil
+}
+
+type GetTxsConfirmationsResponseMessage struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ TxIDConfirmationsPairs []*RpcTxIDConfirmationsPair `protobuf:"bytes,1,rep,name=txIDConfirmationsPairs,proto3" json:"txIDConfirmationsPairs,omitempty"`
+ Error *RPCError `protobuf:"bytes,1000,opt,name=error,proto3" json:"error,omitempty"`
+}
+
+func (x *GetTxsConfirmationsResponseMessage) Reset() {
+ *x = GetTxsConfirmationsResponseMessage{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_rpc_proto_msgTypes[118]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *GetTxsConfirmationsResponseMessage) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetTxsConfirmationsResponseMessage) ProtoMessage() {}
+
+func (x *GetTxsConfirmationsResponseMessage) ProtoReflect() protoreflect.Message {
+ mi := &file_rpc_proto_msgTypes[118]
+ 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 GetTxsConfirmationsResponseMessage.ProtoReflect.Descriptor instead.
+func (*GetTxsConfirmationsResponseMessage) Descriptor() ([]byte, []int) {
+ return file_rpc_proto_rawDescGZIP(), []int{118}
+}
+
+func (x *GetTxsConfirmationsResponseMessage) GetTxIDConfirmationsPairs() []*RpcTxIDConfirmationsPair {
+ if x != nil {
+ return x.TxIDConfirmationsPairs
+ }
+ return nil
+}
+
+func (x *GetTxsConfirmationsResponseMessage) GetError() *RPCError {
+ if x != nil {
+ return x.Error
+ }
+ return nil
+}
+
+// NotifyTxsConfirmationChangedRequstMessage is a listener that registers confirmations from supplied TxIDs
+// Kaspad must be started with the `--txindex` flag for this Request to work.
+type NotifyTxsConfirmationChangedRequestMessage struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ TxIDs []string `protobuf:"bytes,1,rep,name=TxIDs,proto3" json:"TxIDs,omitempty"` //initial TxIds to listen for when regestering for notifications
+ RequiredConfirmations uint32 `protobuf:"varint,2,opt,name=requiredConfirmations,proto3" json:"requiredConfirmations,omitempty"` // number of confirmations until a transaction is considered confirmed
+ IncludePending bool `protobuf:"varint,3,opt,name=includePending,proto3" json:"includePending,omitempty"` // weather to notify confirmation changes during pre-Confirmed states
+}
+
+func (x *NotifyTxsConfirmationChangedRequestMessage) Reset() {
+ *x = NotifyTxsConfirmationChangedRequestMessage{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_rpc_proto_msgTypes[119]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *NotifyTxsConfirmationChangedRequestMessage) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*NotifyTxsConfirmationChangedRequestMessage) ProtoMessage() {}
+
+func (x *NotifyTxsConfirmationChangedRequestMessage) ProtoReflect() protoreflect.Message {
+ mi := &file_rpc_proto_msgTypes[119]
+ 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 NotifyTxsConfirmationChangedRequestMessage.ProtoReflect.Descriptor instead.
+func (*NotifyTxsConfirmationChangedRequestMessage) Descriptor() ([]byte, []int) {
+ return file_rpc_proto_rawDescGZIP(), []int{119}
+}
+
+func (x *NotifyTxsConfirmationChangedRequestMessage) GetTxIDs() []string {
+ if x != nil {
+ return x.TxIDs
+ }
+ return nil
+}
+
+func (x *NotifyTxsConfirmationChangedRequestMessage) GetRequiredConfirmations() uint32 {
+ if x != nil {
+ return x.RequiredConfirmations
+ }
+ return 0
+}
+
+func (x *NotifyTxsConfirmationChangedRequestMessage) GetIncludePending() bool {
+ if x != nil {
+ return x.IncludePending
+ }
+ return false
+}
+
+type NotifyTxsConfirmationChangedResponseMessage struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Error *RPCError `protobuf:"bytes,1000,opt,name=error,proto3" json:"error,omitempty"`
+}
+
+func (x *NotifyTxsConfirmationChangedResponseMessage) Reset() {
+ *x = NotifyTxsConfirmationChangedResponseMessage{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_rpc_proto_msgTypes[120]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *NotifyTxsConfirmationChangedResponseMessage) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*NotifyTxsConfirmationChangedResponseMessage) ProtoMessage() {}
+
+func (x *NotifyTxsConfirmationChangedResponseMessage) ProtoReflect() protoreflect.Message {
+ mi := &file_rpc_proto_msgTypes[120]
+ 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 NotifyTxsConfirmationChangedResponseMessage.ProtoReflect.Descriptor instead.
+func (*NotifyTxsConfirmationChangedResponseMessage) Descriptor() ([]byte, []int) {
+ return file_rpc_proto_rawDescGZIP(), []int{120}
+}
+
+func (x *NotifyTxsConfirmationChangedResponseMessage) GetError() *RPCError {
+ if x != nil {
+ return x.Error
+ }
+ return nil
+}
+
+// TxsConfirmationChangedNotificationMessage is the notification about txs pertaining to specified TxIDs
+type TxsConfirmationChangedNotificationMessage struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ RequiredConfirmations uint32 `protobuf:"varint,1,opt,name=requiredConfirmations,proto3" json:"requiredConfirmations,omitempty"` //the required confirmations set when notification was sent
+ Pending []*RpcTxIDConfirmationsPair `protobuf:"bytes,2,rep,name=pending,proto3" json:"pending,omitempty"` // RpcTxIDConfirmationsPairs which have entered the virtual chain but not passed the required confirmations
+ Confirmed []*RpcTxIDConfirmationsPair `protobuf:"bytes,3,rep,name=confirmed,proto3" json:"confirmed,omitempty"` // RpcTxIDConfirmationsPairs which have entered the virtual chain and passed the required confirmations
+ UnconfirmedTxIds []string `protobuf:"bytes,4,rep,name=unconfirmedTxIds,proto3" json:"unconfirmedTxIds,omitempty"` // TxIds which were not confirmed within the required confirmations.
+ Error *RPCError `protobuf:"bytes,1000,opt,name=error,proto3" json:"error,omitempty"`
+}
+
+func (x *TxsConfirmationChangedNotificationMessage) Reset() {
+ *x = TxsConfirmationChangedNotificationMessage{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_rpc_proto_msgTypes[121]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *TxsConfirmationChangedNotificationMessage) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*TxsConfirmationChangedNotificationMessage) ProtoMessage() {}
+
+func (x *TxsConfirmationChangedNotificationMessage) ProtoReflect() protoreflect.Message {
+ mi := &file_rpc_proto_msgTypes[121]
+ 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 TxsConfirmationChangedNotificationMessage.ProtoReflect.Descriptor instead.
+func (*TxsConfirmationChangedNotificationMessage) Descriptor() ([]byte, []int) {
+ return file_rpc_proto_rawDescGZIP(), []int{121}
+}
+
+func (x *TxsConfirmationChangedNotificationMessage) GetRequiredConfirmations() uint32 {
+ if x != nil {
+ return x.RequiredConfirmations
+ }
+ return 0
+}
+
+func (x *TxsConfirmationChangedNotificationMessage) GetPending() []*RpcTxIDConfirmationsPair {
+ if x != nil {
+ return x.Pending
+ }
+ return nil
+}
+
+func (x *TxsConfirmationChangedNotificationMessage) GetConfirmed() []*RpcTxIDConfirmationsPair {
+ if x != nil {
+ return x.Confirmed
+ }
+ return nil
+}
+
+func (x *TxsConfirmationChangedNotificationMessage) GetUnconfirmedTxIds() []string {
+ if x != nil {
+ return x.UnconfirmedTxIds
+ }
+ return nil
+}
+
+func (x *TxsConfirmationChangedNotificationMessage) GetError() *RPCError {
+ if x != nil {
+ return x.Error
+ }
+ return nil
+}
+
+// ModifyNotifyingTxsConfirmationChangedRequestMessage modfies the params of a registered `NotifyTxsConfirmationChangedRequstMessage`
+// must be registered to NotifyTxsConfirmationChangedRequstMessage for this command to work
+type ModifyNotifyingTxsConfirmationChangedRequestMessage struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ AddTxIDs []string `protobuf:"bytes,1,rep,name=addTxIDs,proto3" json:"addTxIDs,omitempty"` //add txIds to the notification stream
+ RemoveTxIDs []string `protobuf:"bytes,2,rep,name=removeTxIDs,proto3" json:"removeTxIDs,omitempty"` //remove txIds to the notification stream
+ RequiredConfirmations uint32 `protobuf:"varint,3,opt,name=requiredConfirmations,proto3" json:"requiredConfirmations,omitempty"`
+ IncludePending bool `protobuf:"varint,4,opt,name=includePending,proto3" json:"includePending,omitempty"`
+}
+
+func (x *ModifyNotifyingTxsConfirmationChangedRequestMessage) Reset() {
+ *x = ModifyNotifyingTxsConfirmationChangedRequestMessage{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_rpc_proto_msgTypes[122]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *ModifyNotifyingTxsConfirmationChangedRequestMessage) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ModifyNotifyingTxsConfirmationChangedRequestMessage) ProtoMessage() {}
+
+func (x *ModifyNotifyingTxsConfirmationChangedRequestMessage) ProtoReflect() protoreflect.Message {
+ mi := &file_rpc_proto_msgTypes[122]
+ 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 ModifyNotifyingTxsConfirmationChangedRequestMessage.ProtoReflect.Descriptor instead.
+func (*ModifyNotifyingTxsConfirmationChangedRequestMessage) Descriptor() ([]byte, []int) {
+ return file_rpc_proto_rawDescGZIP(), []int{122}
+}
+
+func (x *ModifyNotifyingTxsConfirmationChangedRequestMessage) GetAddTxIDs() []string {
+ if x != nil {
+ return x.AddTxIDs
+ }
+ return nil
+}
+
+func (x *ModifyNotifyingTxsConfirmationChangedRequestMessage) GetRemoveTxIDs() []string {
+ if x != nil {
+ return x.RemoveTxIDs
+ }
+ return nil
+}
+
+func (x *ModifyNotifyingTxsConfirmationChangedRequestMessage) GetRequiredConfirmations() uint32 {
+ if x != nil {
+ return x.RequiredConfirmations
+ }
+ return 0
+}
+
+func (x *ModifyNotifyingTxsConfirmationChangedRequestMessage) GetIncludePending() bool {
+ if x != nil {
+ return x.IncludePending
+ }
+ return false
+}
+
+type ModifyNotifyingTxsConfirmationChangedResponseMessage struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Error *RPCError `protobuf:"bytes,1000,opt,name=error,proto3" json:"error,omitempty"`
+}
+
+func (x *ModifyNotifyingTxsConfirmationChangedResponseMessage) Reset() {
+ *x = ModifyNotifyingTxsConfirmationChangedResponseMessage{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_rpc_proto_msgTypes[123]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *ModifyNotifyingTxsConfirmationChangedResponseMessage) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ModifyNotifyingTxsConfirmationChangedResponseMessage) ProtoMessage() {}
+
+func (x *ModifyNotifyingTxsConfirmationChangedResponseMessage) ProtoReflect() protoreflect.Message {
+ mi := &file_rpc_proto_msgTypes[123]
+ 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 ModifyNotifyingTxsConfirmationChangedResponseMessage.ProtoReflect.Descriptor instead.
+func (*ModifyNotifyingTxsConfirmationChangedResponseMessage) Descriptor() ([]byte, []int) {
+ return file_rpc_proto_rawDescGZIP(), []int{123}
+}
+
+func (x *ModifyNotifyingTxsConfirmationChangedResponseMessage) GetError() *RPCError {
+ if x != nil {
+ return x.Error
+ }
+ return nil
+}
+
+type TxEntryByAddress struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Address string `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"`
+ TxId string `protobuf:"bytes,2,opt,name=txId,proto3" json:"txId,omitempty"`
+ Confirmations uint32 `protobuf:"varint,3,opt,name=confirmations,proto3" json:"confirmations,omitempty"`
+}
+
+func (x *TxEntryByAddress) Reset() {
+ *x = TxEntryByAddress{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_rpc_proto_msgTypes[124]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *TxEntryByAddress) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*TxEntryByAddress) ProtoMessage() {}
+
+func (x *TxEntryByAddress) ProtoReflect() protoreflect.Message {
+ mi := &file_rpc_proto_msgTypes[124]
+ 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 TxEntryByAddress.ProtoReflect.Descriptor instead.
+func (*TxEntryByAddress) Descriptor() ([]byte, []int) {
+ return file_rpc_proto_rawDescGZIP(), []int{124}
+}
+
+func (x *TxEntryByAddress) GetAddress() string {
+ if x != nil {
+ return x.Address
+ }
+ return ""
+}
+
+func (x *TxEntryByAddress) GetTxId() string {
+ if x != nil {
+ return x.TxId
+ }
+ return ""
+}
+
+func (x *TxEntryByAddress) GetConfirmations() uint32 {
+ if x != nil {
+ return x.Confirmations
+ }
+ return 0
+}
+
+type TxEntriesByAddresses struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Sent []*TxEntryByAddress `protobuf:"bytes,1,rep,name=sent,proto3" json:"sent,omitempty"`
+ Received []*TxEntryByAddress `protobuf:"bytes,2,rep,name=received,proto3" json:"received,omitempty"`
+}
+
+func (x *TxEntriesByAddresses) Reset() {
+ *x = TxEntriesByAddresses{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_rpc_proto_msgTypes[125]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *TxEntriesByAddresses) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*TxEntriesByAddresses) ProtoMessage() {}
+
+func (x *TxEntriesByAddresses) ProtoReflect() protoreflect.Message {
+ mi := &file_rpc_proto_msgTypes[125]
+ 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 TxEntriesByAddresses.ProtoReflect.Descriptor instead.
+func (*TxEntriesByAddresses) Descriptor() ([]byte, []int) {
+ return file_rpc_proto_rawDescGZIP(), []int{125}
+}
+
+func (x *TxEntriesByAddresses) GetSent() []*TxEntryByAddress {
+ if x != nil {
+ return x.Sent
+ }
+ return nil
+}
+
+func (x *TxEntriesByAddresses) GetReceived() []*TxEntryByAddress {
+ if x != nil {
+ return x.Received
+ }
+ return nil
+}
+
+// NotifyAddressesTxsChangedRequestMessage Listens for Txs pertaining to specified addresses according to the params specified
+type NotifyAddressesTxsRequestMessage struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Addresses []string `protobuf:"bytes,1,rep,name=addresses,proto3" json:"addresses,omitempty"` //initial addresses to listen for Tx changes when regestering for notifications
+ RequiredConfirmations uint32 `protobuf:"varint,2,opt,name=requiredConfirmations,proto3" json:"requiredConfirmations,omitempty"` // number of confirmations until a transaction is considered confirmed
+ IncludePending bool `protobuf:"varint,3,opt,name=includePending,proto3" json:"includePending,omitempty"` //whether to notify confirmation changes during pre-Confirmed states
+ IncludeSending bool `protobuf:"varint,4,opt,name=includeSending,proto3" json:"includeSending,omitempty"` //whether to listen on addresses sending txs
+ IncludeReceiving bool `protobuf:"varint,5,opt,name=includeReceiving,proto3" json:"includeReceiving,omitempty"` //whether to listen on addresses reciving txs
+}
+
+func (x *NotifyAddressesTxsRequestMessage) Reset() {
+ *x = NotifyAddressesTxsRequestMessage{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_rpc_proto_msgTypes[126]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *NotifyAddressesTxsRequestMessage) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*NotifyAddressesTxsRequestMessage) ProtoMessage() {}
+
+func (x *NotifyAddressesTxsRequestMessage) ProtoReflect() protoreflect.Message {
+ mi := &file_rpc_proto_msgTypes[126]
+ 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 NotifyAddressesTxsRequestMessage.ProtoReflect.Descriptor instead.
+func (*NotifyAddressesTxsRequestMessage) Descriptor() ([]byte, []int) {
+ return file_rpc_proto_rawDescGZIP(), []int{126}
+}
+
+func (x *NotifyAddressesTxsRequestMessage) GetAddresses() []string {
+ if x != nil {
+ return x.Addresses
+ }
+ return nil
+}
+
+func (x *NotifyAddressesTxsRequestMessage) GetRequiredConfirmations() uint32 {
+ if x != nil {
+ return x.RequiredConfirmations
+ }
+ return 0
+}
+
+func (x *NotifyAddressesTxsRequestMessage) GetIncludePending() bool {
+ if x != nil {
+ return x.IncludePending
+ }
+ return false
+}
+
+func (x *NotifyAddressesTxsRequestMessage) GetIncludeSending() bool {
+ if x != nil {
+ return x.IncludeSending
+ }
+ return false
+}
+
+func (x *NotifyAddressesTxsRequestMessage) GetIncludeReceiving() bool {
+ if x != nil {
+ return x.IncludeReceiving
+ }
+ return false
+}
+
+type NotifyAddressesTxsResponseMessage struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Error *RPCError `protobuf:"bytes,1000,opt,name=error,proto3" json:"error,omitempty"`
+}
+
+func (x *NotifyAddressesTxsResponseMessage) Reset() {
+ *x = NotifyAddressesTxsResponseMessage{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_rpc_proto_msgTypes[127]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *NotifyAddressesTxsResponseMessage) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*NotifyAddressesTxsResponseMessage) ProtoMessage() {}
+
+func (x *NotifyAddressesTxsResponseMessage) ProtoReflect() protoreflect.Message {
+ mi := &file_rpc_proto_msgTypes[127]
+ 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 NotifyAddressesTxsResponseMessage.ProtoReflect.Descriptor instead.
+func (*NotifyAddressesTxsResponseMessage) Descriptor() ([]byte, []int) {
+ return file_rpc_proto_rawDescGZIP(), []int{127}
+}
+
+func (x *NotifyAddressesTxsResponseMessage) GetError() *RPCError {
+ if x != nil {
+ return x.Error
+ }
+ return nil
+}
+
+// ModifyNotifyAddressesTxsParamsRequestMessage modifies the params used for a regesitered `NotifyAddressesTxsRequest`
+// Must be registered to NotifyAddressTxChangedRequestMessage for this command to work
+type ModifyNotifyingAddressesTxsRequestMessage struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ AddAddresses []string `protobuf:"bytes,1,rep,name=AddAddresses,proto3" json:"AddAddresses,omitempty"` //add addresses to the notification stream
+ RemoveAddresses []string `protobuf:"bytes,2,rep,name=RemoveAddresses,proto3" json:"RemoveAddresses,omitempty"` //remove addresses to the notification stream
+ RequiredConfirmations uint32 `protobuf:"varint,3,opt,name=requiredConfirmations,proto3" json:"requiredConfirmations,omitempty"`
+ IncludePending bool `protobuf:"varint,4,opt,name=includePending,proto3" json:"includePending,omitempty"`
+ IncludeSending bool `protobuf:"varint,5,opt,name=includeSending,proto3" json:"includeSending,omitempty"`
+ IncludeReceiving bool `protobuf:"varint,6,opt,name=includeReceiving,proto3" json:"includeReceiving,omitempty"`
+}
+
+func (x *ModifyNotifyingAddressesTxsRequestMessage) Reset() {
+ *x = ModifyNotifyingAddressesTxsRequestMessage{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_rpc_proto_msgTypes[128]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *ModifyNotifyingAddressesTxsRequestMessage) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ModifyNotifyingAddressesTxsRequestMessage) ProtoMessage() {}
+
+func (x *ModifyNotifyingAddressesTxsRequestMessage) ProtoReflect() protoreflect.Message {
+ mi := &file_rpc_proto_msgTypes[128]
+ 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 ModifyNotifyingAddressesTxsRequestMessage.ProtoReflect.Descriptor instead.
+func (*ModifyNotifyingAddressesTxsRequestMessage) Descriptor() ([]byte, []int) {
+ return file_rpc_proto_rawDescGZIP(), []int{128}
+}
+
+func (x *ModifyNotifyingAddressesTxsRequestMessage) GetAddAddresses() []string {
+ if x != nil {
+ return x.AddAddresses
+ }
+ return nil
+}
+
+func (x *ModifyNotifyingAddressesTxsRequestMessage) GetRemoveAddresses() []string {
+ if x != nil {
+ return x.RemoveAddresses
+ }
+ return nil
+}
+
+func (x *ModifyNotifyingAddressesTxsRequestMessage) GetRequiredConfirmations() uint32 {
+ if x != nil {
+ return x.RequiredConfirmations
+ }
+ return 0
+}
+
+func (x *ModifyNotifyingAddressesTxsRequestMessage) GetIncludePending() bool {
+ if x != nil {
+ return x.IncludePending
+ }
+ return false
+}
+
+func (x *ModifyNotifyingAddressesTxsRequestMessage) GetIncludeSending() bool {
+ if x != nil {
+ return x.IncludeSending
+ }
+ return false
+}
+
+func (x *ModifyNotifyingAddressesTxsRequestMessage) GetIncludeReceiving() bool {
+ if x != nil {
+ return x.IncludeReceiving
+ }
+ return false
+}
+
+type ModifyNotifyingAddressesTxsResponseMessage struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Error *RPCError `protobuf:"bytes,1000,opt,name=error,proto3" json:"error,omitempty"`
+}
+
+func (x *ModifyNotifyingAddressesTxsResponseMessage) Reset() {
+ *x = ModifyNotifyingAddressesTxsResponseMessage{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_rpc_proto_msgTypes[129]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *ModifyNotifyingAddressesTxsResponseMessage) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ModifyNotifyingAddressesTxsResponseMessage) ProtoMessage() {}
+
+func (x *ModifyNotifyingAddressesTxsResponseMessage) ProtoReflect() protoreflect.Message {
+ mi := &file_rpc_proto_msgTypes[129]
+ 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 ModifyNotifyingAddressesTxsResponseMessage.ProtoReflect.Descriptor instead.
+func (*ModifyNotifyingAddressesTxsResponseMessage) Descriptor() ([]byte, []int) {
+ return file_rpc_proto_rawDescGZIP(), []int{129}
+}
+
+func (x *ModifyNotifyingAddressesTxsResponseMessage) GetError() *RPCError {
+ if x != nil {
+ return x.Error
+ }
+ return nil
+}
+
+// AddressesTxsNotificationMessage is the notification about txs pertaining to specified addresses
+type AddressesTxsNotificationMessage struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ RequiredConfirmations uint32 `protobuf:"varint,1,opt,name=requiredConfirmations,proto3" json:"requiredConfirmations,omitempty"` //the required confirmations set when notification was sent
+ Pending *TxEntriesByAddresses `protobuf:"bytes,2,opt,name=pending,proto3" json:"pending,omitempty"` // TxEntriesByAddresses which have entered the blockdag but not passed the required confirmations
+ Confirmed *TxEntriesByAddresses `protobuf:"bytes,3,opt,name=confirmed,proto3" json:"confirmed,omitempty"` // TxEntriesByAddresses which have entered the blockdag and passed the required confirmations
+ Unconfirmed *TxEntriesByAddresses `protobuf:"bytes,4,opt,name=unconfirmed,proto3" json:"unconfirmed,omitempty"` // TxEntriesByAddresses which have been pending, but removed via a reorg within the number of required confirmations.
+}
+
+func (x *AddressesTxsNotificationMessage) Reset() {
+ *x = AddressesTxsNotificationMessage{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_rpc_proto_msgTypes[130]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *AddressesTxsNotificationMessage) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*AddressesTxsNotificationMessage) ProtoMessage() {}
+
+func (x *AddressesTxsNotificationMessage) ProtoReflect() protoreflect.Message {
+ mi := &file_rpc_proto_msgTypes[130]
+ 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 AddressesTxsNotificationMessage.ProtoReflect.Descriptor instead.
+func (*AddressesTxsNotificationMessage) Descriptor() ([]byte, []int) {
+ return file_rpc_proto_rawDescGZIP(), []int{130}
+}
+
+func (x *AddressesTxsNotificationMessage) GetRequiredConfirmations() uint32 {
+ if x != nil {
+ return x.RequiredConfirmations
+ }
+ return 0
+}
+
+func (x *AddressesTxsNotificationMessage) GetPending() *TxEntriesByAddresses {
+ if x != nil {
+ return x.Pending
+ }
+ return nil
+}
+
+func (x *AddressesTxsNotificationMessage) GetConfirmed() *TxEntriesByAddresses {
+ if x != nil {
+ return x.Confirmed
+ }
+ return nil
+}
+
+func (x *AddressesTxsNotificationMessage) GetUnconfirmed() *TxEntriesByAddresses {
+ if x != nil {
+ return x.Unconfirmed
+ }
+ return nil
+}
+
+var File_rpc_proto protoreflect.FileDescriptor
+
+var file_rpc_proto_rawDesc = []byte{
+ 0x0a, 0x09, 0x72, 0x70, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x09, 0x70, 0x72, 0x6f,
+ 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x22, 0x24, 0x0a, 0x08, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72,
+ 0x6f, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20,
+ 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0xbe, 0x01, 0x0a,
+ 0x08, 0x52, 0x70, 0x63, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x31, 0x0a, 0x06, 0x68, 0x65, 0x61,
+ 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+ 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x70, 0x63, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65,
+ 0x61, 0x64, 0x65, 0x72, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x3d, 0x0a, 0x0c,
+ 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03,
+ 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52,
+ 0x70, 0x63, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x74,
+ 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x40, 0x0a, 0x0b, 0x76,
+ 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b,
+ 0x32, 0x1e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x70, 0x63,
+ 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x56, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61,
+ 0x52, 0x0b, 0x76, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x22, 0xab, 0x03,
+ 0x0a, 0x0e, 0x52, 0x70, 0x63, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72,
+ 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28,
+ 0x0d, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x07, 0x70, 0x61,
+ 0x72, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x70, 0x72,
+ 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x70, 0x63, 0x42, 0x6c, 0x6f, 0x63, 0x6b,
+ 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x07, 0x70, 0x61,
+ 0x72, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x68, 0x61, 0x73, 0x68, 0x4d, 0x65, 0x72,
+ 0x6b, 0x6c, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x68,
+ 0x61, 0x73, 0x68, 0x4d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x32, 0x0a,
+ 0x14, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, 0x49, 0x64, 0x4d, 0x65, 0x72, 0x6b, 0x6c,
+ 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x61, 0x63, 0x63,
+ 0x65, 0x70, 0x74, 0x65, 0x64, 0x49, 0x64, 0x4d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x52, 0x6f, 0x6f,
+ 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x75, 0x74, 0x78, 0x6f, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d,
+ 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x75, 0x74, 0x78, 0x6f, 0x43,
+ 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d,
+ 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69,
+ 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x12, 0x0a, 0x04, 0x62, 0x69, 0x74, 0x73, 0x18,
+ 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x62, 0x69, 0x74, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6e,
+ 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6e, 0x6f, 0x6e, 0x63,
+ 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x61, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x09, 0x20,
+ 0x01, 0x28, 0x04, 0x52, 0x08, 0x64, 0x61, 0x61, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x1a, 0x0a,
+ 0x08, 0x62, 0x6c, 0x75, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52,
+ 0x08, 0x62, 0x6c, 0x75, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72, 0x75,
+ 0x6e, 0x69, 0x6e, 0x67, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52,
+ 0x0c, 0x70, 0x72, 0x75, 0x6e, 0x69, 0x6e, 0x67, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x1c, 0x0a,
+ 0x09, 0x62, 0x6c, 0x75, 0x65, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x04,
+ 0x52, 0x09, 0x62, 0x6c, 0x75, 0x65, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x22, 0x3a, 0x0a, 0x14, 0x52,
+ 0x70, 0x63, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x50, 0x61, 0x72, 0x65,
+ 0x6e, 0x74, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x48, 0x61, 0x73,
+ 0x68, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x61, 0x72, 0x65, 0x6e,
+ 0x74, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x22, 0x91, 0x03, 0x0a, 0x13, 0x52, 0x70, 0x63, 0x42,
+ 0x6c, 0x6f, 0x63, 0x6b, 0x56, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x12,
+ 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68,
+ 0x61, 0x73, 0x68, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x69, 0x66, 0x66, 0x69, 0x63, 0x75, 0x6c, 0x74,
+ 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0a, 0x64, 0x69, 0x66, 0x66, 0x69, 0x63, 0x75,
+ 0x6c, 0x74, 0x79, 0x12, 0x2e, 0x0a, 0x12, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x50,
+ 0x61, 0x72, 0x65, 0x6e, 0x74, 0x48, 0x61, 0x73, 0x68, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52,
+ 0x12, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x48,
+ 0x61, 0x73, 0x68, 0x12, 0x26, 0x0a, 0x0e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69,
+ 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x72, 0x61,
+ 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x69,
+ 0x73, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4f, 0x6e, 0x6c, 0x79, 0x18, 0x0f, 0x20, 0x01, 0x28,
+ 0x08, 0x52, 0x0c, 0x69, 0x73, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4f, 0x6e, 0x6c, 0x79, 0x12,
+ 0x1c, 0x0a, 0x09, 0x62, 0x6c, 0x75, 0x65, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x10, 0x20, 0x01,
+ 0x28, 0x04, 0x52, 0x09, 0x62, 0x6c, 0x75, 0x65, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x26, 0x0a,
+ 0x0e, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18,
+ 0x11, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x48,
+ 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x53, 0x65,
+ 0x74, 0x42, 0x6c, 0x75, 0x65, 0x73, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x12, 0x20, 0x03,
+ 0x28, 0x09, 0x52, 0x13, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x53, 0x65, 0x74, 0x42, 0x6c, 0x75, 0x65,
+ 0x73, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x2e, 0x0a, 0x12, 0x6d, 0x65, 0x72, 0x67, 0x65,
+ 0x53, 0x65, 0x74, 0x52, 0x65, 0x64, 0x73, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x13, 0x20,
+ 0x03, 0x28, 0x09, 0x52, 0x12, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x64,
+ 0x73, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x69, 0x73, 0x43, 0x68, 0x61,
+ 0x69, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x14, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x69,
+ 0x73, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x22, 0xd1, 0x02, 0x0a, 0x0e,
+ 0x52, 0x70, 0x63, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18,
+ 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52,
+ 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x36, 0x0a, 0x06, 0x69, 0x6e, 0x70, 0x75,
+ 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+ 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x70, 0x63, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74,
+ 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x52, 0x06, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73,
+ 0x12, 0x39, 0x0a, 0x07, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28,
+ 0x0b, 0x32, 0x1f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x70,
+ 0x63, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x75, 0x74, 0x70,
+ 0x75, 0x74, 0x52, 0x07, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x6c,
+ 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x6c,
+ 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x73, 0x75, 0x62, 0x6e, 0x65,
+ 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73,
+ 0x75, 0x62, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x67,
+ 0x61, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x03, 0x67, 0x61, 0x73, 0x12, 0x18, 0x0a,
+ 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07,
+ 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x46, 0x0a, 0x0b, 0x76, 0x65, 0x72, 0x62, 0x6f,
+ 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x70,
0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x70, 0x63, 0x54, 0x72, 0x61, 0x6e,
0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x44, 0x61,
0x74, 0x61, 0x52, 0x0b, 0x76, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x22,
@@ -6258,7 +7641,7 @@ var file_rpc_proto_rawDesc = []byte{
0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x44, 0x61, 0x61, 0x53, 0x63,
0x6f, 0x72, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x69, 0x73, 0x43, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73,
0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x69, 0x73, 0x43, 0x6f, 0x69, 0x6e, 0x62,
- 0x61, 0x73, 0x65, 0x22, 0xa5, 0x01, 0x0a, 0x19, 0x52, 0x70, 0x63, 0x54, 0x72, 0x61, 0x6e, 0x73,
+ 0x61, 0x73, 0x65, 0x22, 0x99, 0x02, 0x0a, 0x19, 0x52, 0x70, 0x63, 0x54, 0x72, 0x61, 0x6e, 0x73,
0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x44, 0x61, 0x74,
0x61, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e,
0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61,
@@ -6268,656 +7651,866 @@ var file_rpc_proto_rawDesc = []byte{
0x1c, 0x0a, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x18, 0x0c, 0x20, 0x01,
0x28, 0x09, 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x12, 0x1c, 0x0a,
0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x04,
- 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x20, 0x0a, 0x1e, 0x52,
- 0x70, 0x63, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x70,
- 0x75, 0x74, 0x56, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x22, 0x8b, 0x01,
- 0x0a, 0x1f, 0x52, 0x70, 0x63, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e,
- 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x56, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x44, 0x61, 0x74,
- 0x61, 0x12, 0x30, 0x0a, 0x13, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x50, 0x75, 0x62, 0x6c, 0x69,
- 0x63, 0x4b, 0x65, 0x79, 0x54, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13,
- 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x54,
- 0x79, 0x70, 0x65, 0x12, 0x36, 0x0a, 0x16, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x50, 0x75, 0x62,
- 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x06, 0x20,
- 0x01, 0x28, 0x09, 0x52, 0x16, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x50, 0x75, 0x62, 0x6c, 0x69,
- 0x63, 0x4b, 0x65, 0x79, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x21, 0x0a, 0x1f, 0x47,
- 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b,
- 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x76,
- 0x0a, 0x20, 0x47, 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4e, 0x65, 0x74, 0x77,
- 0x6f, 0x72, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61,
- 0x67, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4e, 0x65, 0x74,
- 0x77, 0x6f, 0x72, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x75, 0x72, 0x72,
- 0x65, 0x6e, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72,
- 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f,
- 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52,
- 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x74, 0x0a, 0x19, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74,
- 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73,
- 0x61, 0x67, 0x65, 0x12, 0x29, 0x0a, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x02, 0x20, 0x01,
- 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52,
- 0x70, 0x63, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x2c,
- 0x0a, 0x11, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x4e, 0x6f, 0x6e, 0x44, 0x41, 0x41, 0x42, 0x6c, 0x6f,
- 0x63, 0x6b, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x61, 0x6c, 0x6c, 0x6f, 0x77,
- 0x4e, 0x6f, 0x6e, 0x44, 0x41, 0x41, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x22, 0xdc, 0x01, 0x0a,
- 0x1a, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70,
- 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x56, 0x0a, 0x0c, 0x72,
- 0x65, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28,
- 0x0e, 0x32, 0x32, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x53, 0x75,
- 0x62, 0x6d, 0x69, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
- 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x52, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x52,
- 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x52, 0x0c, 0x72, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x61,
- 0x73, 0x6f, 0x6e, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20,
- 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e,
- 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22,
- 0x3a, 0x0a, 0x0c, 0x52, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12,
- 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x11, 0x0a, 0x0d, 0x42, 0x4c, 0x4f,
- 0x43, 0x4b, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09,
- 0x49, 0x53, 0x5f, 0x49, 0x4e, 0x5f, 0x49, 0x42, 0x44, 0x10, 0x02, 0x22, 0x5e, 0x0a, 0x1e, 0x47,
- 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52,
- 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1e, 0x0a,
- 0x0a, 0x70, 0x61, 0x79, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28,
- 0x09, 0x52, 0x0a, 0x70, 0x61, 0x79, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1c, 0x0a,
- 0x09, 0x65, 0x78, 0x74, 0x72, 0x61, 0x44, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
- 0x52, 0x09, 0x65, 0x78, 0x74, 0x72, 0x61, 0x44, 0x61, 0x74, 0x61, 0x22, 0x94, 0x01, 0x0a, 0x1f,
- 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65,
+ 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74,
+ 0x78, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x64, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09,
+ 0x74, 0x78, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x64, 0x12, 0x2e, 0x0a, 0x12, 0x61, 0x63, 0x63,
+ 0x65, 0x70, 0x74, 0x69, 0x6e, 0x67, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x18,
+ 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6e, 0x67,
+ 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x12, 0x24, 0x0a, 0x0d, 0x63, 0x6f, 0x6e,
+ 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0d,
+ 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22,
+ 0x20, 0x0a, 0x1e, 0x52, 0x70, 0x63, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f,
+ 0x6e, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x56, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x44, 0x61, 0x74,
+ 0x61, 0x22, 0x8b, 0x01, 0x0a, 0x1f, 0x52, 0x70, 0x63, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63,
+ 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x56, 0x65, 0x72, 0x62, 0x6f, 0x73,
+ 0x65, 0x44, 0x61, 0x74, 0x61, 0x12, 0x30, 0x0a, 0x13, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x50,
+ 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x54, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01,
+ 0x28, 0x09, 0x52, 0x13, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63,
+ 0x4b, 0x65, 0x79, 0x54, 0x79, 0x70, 0x65, 0x12, 0x36, 0x0a, 0x16, 0x73, 0x63, 0x72, 0x69, 0x70,
+ 0x74, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73,
+ 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x16, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x50,
+ 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22,
+ 0x21, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4e, 0x65, 0x74,
+ 0x77, 0x6f, 0x72, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61,
+ 0x67, 0x65, 0x22, 0x76, 0x0a, 0x20, 0x47, 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74,
+ 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d,
+ 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e,
+ 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e,
+ 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x2a,
+ 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13,
+ 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72,
+ 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x74, 0x0a, 0x19, 0x53, 0x75,
+ 0x62, 0x6d, 0x69, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+ 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x29, 0x0a, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b,
+ 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69,
+ 0x72, 0x65, 0x2e, 0x52, 0x70, 0x63, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x05, 0x62, 0x6c, 0x6f,
+ 0x63, 0x6b, 0x12, 0x2c, 0x0a, 0x11, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x4e, 0x6f, 0x6e, 0x44, 0x41,
+ 0x41, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x61,
+ 0x6c, 0x6c, 0x6f, 0x77, 0x4e, 0x6f, 0x6e, 0x44, 0x41, 0x41, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73,
+ 0x22, 0xdc, 0x01, 0x0a, 0x1a, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b,
0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12,
- 0x29, 0x0a, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13,
- 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x70, 0x63, 0x42, 0x6c,
- 0x6f, 0x63, 0x6b, 0x52, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x73,
- 0x53, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73,
- 0x53, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18,
- 0xe8, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69,
- 0x72, 0x65, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72,
- 0x6f, 0x72, 0x22, 0x20, 0x0a, 0x1e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x42, 0x6c, 0x6f, 0x63,
- 0x6b, 0x41, 0x64, 0x64, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73,
- 0x73, 0x61, 0x67, 0x65, 0x22, 0x4d, 0x0a, 0x1f, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x42, 0x6c,
- 0x6f, 0x63, 0x6b, 0x41, 0x64, 0x64, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
- 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72,
+ 0x56, 0x0a, 0x0c, 0x72, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18,
+ 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x32, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72,
+ 0x65, 0x2e, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73,
+ 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x52, 0x65, 0x6a,
+ 0x65, 0x63, 0x74, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x52, 0x0c, 0x72, 0x65, 0x6a, 0x65, 0x63,
+ 0x74, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72,
0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77,
0x69, 0x72, 0x65, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72,
- 0x72, 0x6f, 0x72, 0x22, 0x4a, 0x0a, 0x1d, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x41, 0x64, 0x64, 0x65,
- 0x64, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x73,
- 0x73, 0x61, 0x67, 0x65, 0x12, 0x29, 0x0a, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x03, 0x20,
- 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e,
- 0x52, 0x70, 0x63, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x22,
- 0x20, 0x0a, 0x1e, 0x47, 0x65, 0x74, 0x50, 0x65, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73,
- 0x73, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67,
- 0x65, 0x22, 0xf5, 0x01, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x50, 0x65, 0x65, 0x72, 0x41, 0x64, 0x64,
- 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65,
- 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x4c, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73,
- 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
- 0x77, 0x69, 0x72, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x65, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72,
- 0x65, 0x73, 0x73, 0x65, 0x73, 0x4b, 0x6e, 0x6f, 0x77, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73,
- 0x73, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x09, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73,
- 0x73, 0x65, 0x73, 0x12, 0x58, 0x0a, 0x0f, 0x62, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x41, 0x64, 0x64,
- 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x70,
+ 0x72, 0x6f, 0x72, 0x22, 0x3a, 0x0a, 0x0c, 0x52, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x61,
+ 0x73, 0x6f, 0x6e, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x11, 0x0a,
+ 0x0d, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x01,
+ 0x12, 0x0d, 0x0a, 0x09, 0x49, 0x53, 0x5f, 0x49, 0x4e, 0x5f, 0x49, 0x42, 0x44, 0x10, 0x02, 0x22,
+ 0x5e, 0x0a, 0x1e, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x65, 0x6d, 0x70, 0x6c,
+ 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67,
+ 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x61, 0x79, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18,
+ 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x61, 0x79, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73,
+ 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x78, 0x74, 0x72, 0x61, 0x44, 0x61, 0x74, 0x61, 0x18, 0x02,
+ 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x78, 0x74, 0x72, 0x61, 0x44, 0x61, 0x74, 0x61, 0x22,
+ 0x94, 0x01, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x65, 0x6d, 0x70,
+ 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73,
+ 0x61, 0x67, 0x65, 0x12, 0x29, 0x0a, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x03, 0x20, 0x01,
+ 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52,
+ 0x70, 0x63, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x1a,
+ 0x0a, 0x08, 0x69, 0x73, 0x53, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08,
+ 0x52, 0x08, 0x69, 0x73, 0x53, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72,
+ 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f,
+ 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52,
+ 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x20, 0x0a, 0x1e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79,
+ 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x41, 0x64, 0x64, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
+ 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x4d, 0x0a, 0x1f, 0x4e, 0x6f, 0x74, 0x69,
+ 0x66, 0x79, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x41, 0x64, 0x64, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70,
+ 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2a, 0x0a, 0x05, 0x65,
+ 0x72, 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72,
+ 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72,
+ 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x4a, 0x0a, 0x1d, 0x42, 0x6c, 0x6f, 0x63, 0x6b,
+ 0x41, 0x64, 0x64, 0x65, 0x64, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x29, 0x0a, 0x05, 0x62, 0x6c, 0x6f, 0x63,
+ 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77,
+ 0x69, 0x72, 0x65, 0x2e, 0x52, 0x70, 0x63, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x05, 0x62, 0x6c,
+ 0x6f, 0x63, 0x6b, 0x22, 0x20, 0x0a, 0x1e, 0x47, 0x65, 0x74, 0x50, 0x65, 0x65, 0x72, 0x41, 0x64,
+ 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65,
+ 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0xf5, 0x01, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x50, 0x65, 0x65,
+ 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+ 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x4c, 0x0a, 0x09, 0x61, 0x64, 0x64,
+ 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x70,
0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x65, 0x65, 0x72,
0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x4b, 0x6e, 0x6f, 0x77, 0x6e, 0x41, 0x64,
- 0x64, 0x72, 0x65, 0x73, 0x73, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x0f, 0x62, 0x61,
- 0x6e, 0x6e, 0x65, 0x64, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x12, 0x2a, 0x0a,
- 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e,
- 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72,
- 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x39, 0x0a, 0x23, 0x47, 0x65, 0x74,
+ 0x64, 0x72, 0x65, 0x73, 0x73, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x09, 0x61, 0x64,
+ 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x12, 0x58, 0x0a, 0x0f, 0x62, 0x61, 0x6e, 0x6e, 0x65,
+ 0x64, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b,
+ 0x32, 0x2e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x47, 0x65, 0x74,
0x50, 0x65, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x4b, 0x6e, 0x6f,
0x77, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,
- 0x12, 0x12, 0x0a, 0x04, 0x41, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04,
- 0x41, 0x64, 0x64, 0x72, 0x22, 0x22, 0x0a, 0x20, 0x47, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63,
- 0x74, 0x65, 0x64, 0x54, 0x69, 0x70, 0x48, 0x61, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
- 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x79, 0x0a, 0x21, 0x47, 0x65, 0x74, 0x53,
+ 0x52, 0x0f, 0x62, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65,
+ 0x73, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28,
+ 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x50,
+ 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x39, 0x0a,
+ 0x23, 0x47, 0x65, 0x74, 0x50, 0x65, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65,
+ 0x73, 0x4b, 0x6e, 0x6f, 0x77, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x4d, 0x65, 0x73,
+ 0x73, 0x61, 0x67, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x41, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01,
+ 0x28, 0x09, 0x52, 0x04, 0x41, 0x64, 0x64, 0x72, 0x22, 0x22, 0x0a, 0x20, 0x47, 0x65, 0x74, 0x53,
0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x54, 0x69, 0x70, 0x48, 0x61, 0x73, 0x68, 0x52, 0x65,
- 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x28, 0x0a,
- 0x0f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x54, 0x69, 0x70, 0x48, 0x61, 0x73, 0x68,
- 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64,
- 0x54, 0x69, 0x70, 0x48, 0x61, 0x73, 0x68, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72,
- 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77,
- 0x69, 0x72, 0x65, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72,
- 0x72, 0x6f, 0x72, 0x22, 0x97, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x70, 0x6f,
- 0x6f, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65,
- 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x78, 0x49, 0x64, 0x18, 0x01, 0x20,
- 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x78, 0x49, 0x64, 0x12, 0x2c, 0x0a, 0x11, 0x69, 0x6e, 0x63,
- 0x6c, 0x75, 0x64, 0x65, 0x4f, 0x72, 0x70, 0x68, 0x61, 0x6e, 0x50, 0x6f, 0x6f, 0x6c, 0x18, 0x02,
- 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x4f, 0x72, 0x70,
- 0x68, 0x61, 0x6e, 0x50, 0x6f, 0x6f, 0x6c, 0x12, 0x34, 0x0a, 0x15, 0x66, 0x69, 0x6c, 0x74, 0x65,
- 0x72, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6f, 0x6c,
- 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x54, 0x72,
- 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6f, 0x6c, 0x22, 0x7b, 0x0a,
- 0x1e, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x70, 0x6f, 0x6f, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79,
- 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12,
- 0x2d, 0x0a, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17,
- 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x4d, 0x65, 0x6d, 0x70, 0x6f,
- 0x6f, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x2a,
- 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13,
- 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72,
- 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x85, 0x01, 0x0a, 0x1f, 0x47,
- 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x70, 0x6f, 0x6f, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73,
- 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2c,
- 0x0a, 0x11, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x4f, 0x72, 0x70, 0x68, 0x61, 0x6e, 0x50,
- 0x6f, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x69, 0x6e, 0x63, 0x6c, 0x75,
- 0x64, 0x65, 0x4f, 0x72, 0x70, 0x68, 0x61, 0x6e, 0x50, 0x6f, 0x6f, 0x6c, 0x12, 0x34, 0x0a, 0x15,
- 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f,
- 0x6e, 0x50, 0x6f, 0x6f, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x66, 0x69, 0x6c,
- 0x74, 0x65, 0x72, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f,
- 0x6f, 0x6c, 0x22, 0x81, 0x01, 0x0a, 0x20, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x70, 0x6f, 0x6f,
- 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
- 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x31, 0x0a, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69,
- 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
- 0x77, 0x69, 0x72, 0x65, 0x2e, 0x4d, 0x65, 0x6d, 0x70, 0x6f, 0x6f, 0x6c, 0x45, 0x6e, 0x74, 0x72,
- 0x79, 0x52, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72,
- 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f,
- 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52,
- 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x79, 0x0a, 0x0c, 0x4d, 0x65, 0x6d, 0x70, 0x6f, 0x6f,
- 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x66, 0x65, 0x65, 0x18, 0x01, 0x20,
- 0x01, 0x28, 0x04, 0x52, 0x03, 0x66, 0x65, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x74, 0x72, 0x61, 0x6e,
- 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e,
- 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x70, 0x63, 0x54, 0x72, 0x61,
- 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61,
- 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x73, 0x4f, 0x72, 0x70, 0x68, 0x61,
- 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, 0x4f, 0x72, 0x70, 0x68, 0x61,
- 0x6e, 0x22, 0x24, 0x0a, 0x22, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65,
- 0x64, 0x50, 0x65, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
- 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x8f, 0x01, 0x0a, 0x23, 0x47, 0x65, 0x74, 0x43,
- 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x50, 0x65, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f,
- 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12,
- 0x3c, 0x0a, 0x05, 0x69, 0x6e, 0x66, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26,
- 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f,
- 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x50, 0x65, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x4d,
- 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x69, 0x6e, 0x66, 0x6f, 0x73, 0x12, 0x2a, 0x0a,
- 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e,
- 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72,
- 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xd3, 0x02, 0x0a, 0x1b, 0x47, 0x65,
- 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x50, 0x65, 0x65, 0x72, 0x49, 0x6e,
- 0x66, 0x6f, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18,
- 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64,
- 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72,
- 0x65, 0x73, 0x73, 0x12, 0x2a, 0x0a, 0x10, 0x6c, 0x61, 0x73, 0x74, 0x50, 0x69, 0x6e, 0x67, 0x44,
- 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x6c,
- 0x61, 0x73, 0x74, 0x50, 0x69, 0x6e, 0x67, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12,
- 0x1e, 0x0a, 0x0a, 0x69, 0x73, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x06, 0x20,
- 0x01, 0x28, 0x08, 0x52, 0x0a, 0x69, 0x73, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x12,
- 0x1e, 0x0a, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x07, 0x20,
- 0x01, 0x28, 0x03, 0x52, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12,
- 0x1c, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01,
- 0x28, 0x09, 0x52, 0x09, 0x75, 0x73, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x3c, 0x0a,
- 0x19, 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x74, 0x6f,
- 0x63, 0x6f, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d,
- 0x52, 0x19, 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x74,
- 0x6f, 0x63, 0x6f, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, 0x0d, 0x74,
- 0x69, 0x6d, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x18, 0x0a, 0x20, 0x01,
- 0x28, 0x03, 0x52, 0x0d, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65,
- 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x73, 0x49, 0x62, 0x64, 0x50, 0x65, 0x65, 0x72, 0x18, 0x0b,
- 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, 0x49, 0x62, 0x64, 0x50, 0x65, 0x65, 0x72, 0x22,
- 0x53, 0x0a, 0x15, 0x41, 0x64, 0x64, 0x50, 0x65, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
- 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72,
- 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65,
- 0x73, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x69, 0x73, 0x50, 0x65, 0x72, 0x6d, 0x61, 0x6e, 0x65, 0x6e,
- 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, 0x50, 0x65, 0x72, 0x6d, 0x61,
- 0x6e, 0x65, 0x6e, 0x74, 0x22, 0x44, 0x0a, 0x16, 0x41, 0x64, 0x64, 0x50, 0x65, 0x65, 0x72, 0x52,
- 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2a,
+ 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x79, 0x0a, 0x21,
+ 0x47, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x54, 0x69, 0x70, 0x48, 0x61,
+ 0x73, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67,
+ 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x54, 0x69, 0x70,
+ 0x48, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x73, 0x65, 0x6c, 0x65,
+ 0x63, 0x74, 0x65, 0x64, 0x54, 0x69, 0x70, 0x48, 0x61, 0x73, 0x68, 0x12, 0x2a, 0x0a, 0x05, 0x65,
+ 0x72, 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72,
+ 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72,
+ 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x97, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x4d,
+ 0x65, 0x6d, 0x70, 0x6f, 0x6f, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65,
+ 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x78, 0x49,
+ 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x78, 0x49, 0x64, 0x12, 0x2c, 0x0a,
+ 0x11, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x4f, 0x72, 0x70, 0x68, 0x61, 0x6e, 0x50, 0x6f,
+ 0x6f, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64,
+ 0x65, 0x4f, 0x72, 0x70, 0x68, 0x61, 0x6e, 0x50, 0x6f, 0x6f, 0x6c, 0x12, 0x34, 0x0a, 0x15, 0x66,
+ 0x69, 0x6c, 0x74, 0x65, 0x72, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e,
+ 0x50, 0x6f, 0x6f, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x66, 0x69, 0x6c, 0x74,
+ 0x65, 0x72, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6f,
+ 0x6c, 0x22, 0x7b, 0x0a, 0x1e, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x70, 0x6f, 0x6f, 0x6c, 0x45,
+ 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73,
+ 0x61, 0x67, 0x65, 0x12, 0x2d, 0x0a, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01,
+ 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x4d,
+ 0x65, 0x6d, 0x70, 0x6f, 0x6f, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x65, 0x6e, 0x74,
+ 0x72, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01,
+ 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52,
+ 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x85,
+ 0x01, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x70, 0x6f, 0x6f, 0x6c, 0x45, 0x6e, 0x74,
+ 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61,
+ 0x67, 0x65, 0x12, 0x2c, 0x0a, 0x11, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x4f, 0x72, 0x70,
+ 0x68, 0x61, 0x6e, 0x50, 0x6f, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x69,
+ 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x4f, 0x72, 0x70, 0x68, 0x61, 0x6e, 0x50, 0x6f, 0x6f, 0x6c,
+ 0x12, 0x34, 0x0a, 0x15, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61,
+ 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6f, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52,
+ 0x15, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69,
+ 0x6f, 0x6e, 0x50, 0x6f, 0x6f, 0x6c, 0x22, 0x81, 0x01, 0x0a, 0x20, 0x47, 0x65, 0x74, 0x4d, 0x65,
+ 0x6d, 0x70, 0x6f, 0x6f, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70,
+ 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x31, 0x0a, 0x07, 0x65,
+ 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70,
+ 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x4d, 0x65, 0x6d, 0x70, 0x6f, 0x6f, 0x6c,
+ 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x2a,
0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13,
0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72,
- 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x80, 0x01, 0x0a, 0x1f, 0x53,
- 0x75, 0x62, 0x6d, 0x69, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e,
- 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x3b,
- 0x0a, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20,
- 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e,
- 0x52, 0x70, 0x63, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b,
- 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x61,
- 0x6c, 0x6c, 0x6f, 0x77, 0x4f, 0x72, 0x70, 0x68, 0x61, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08,
- 0x52, 0x0b, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x4f, 0x72, 0x70, 0x68, 0x61, 0x6e, 0x22, 0x74, 0x0a,
- 0x20, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69,
- 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67,
- 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e,
- 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61,
- 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72,
- 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77,
- 0x69, 0x72, 0x65, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72,
- 0x72, 0x6f, 0x72, 0x22, 0x7d, 0x0a, 0x35, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x56, 0x69, 0x72,
- 0x74, 0x75, 0x61, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x50, 0x61, 0x72, 0x65,
- 0x6e, 0x74, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x52, 0x65,
- 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x44, 0x0a, 0x1d,
- 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, 0x54,
- 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x18, 0x01, 0x20,
- 0x01, 0x28, 0x08, 0x52, 0x1d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x41, 0x63, 0x63, 0x65,
- 0x70, 0x74, 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49,
- 0x64, 0x73, 0x22, 0x64, 0x0a, 0x36, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x56, 0x69, 0x72, 0x74,
- 0x75, 0x61, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x50, 0x61, 0x72, 0x65, 0x6e,
- 0x74, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x52, 0x65, 0x73,
- 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2a, 0x0a, 0x05,
- 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70,
- 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f,
- 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x81, 0x02, 0x0a, 0x34, 0x56, 0x69, 0x72,
- 0x74, 0x75, 0x61, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x50, 0x61, 0x72, 0x65,
- 0x6e, 0x74, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x4e, 0x6f,
- 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67,
- 0x65, 0x12, 0x38, 0x0a, 0x17, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x43, 0x68, 0x61, 0x69,
- 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03,
- 0x28, 0x09, 0x52, 0x17, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x43, 0x68, 0x61, 0x69, 0x6e,
- 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x61,
- 0x64, 0x64, 0x65, 0x64, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61,
- 0x73, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x15, 0x61, 0x64, 0x64, 0x65,
- 0x64, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x65,
- 0x73, 0x12, 0x59, 0x0a, 0x16, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, 0x54, 0x72, 0x61,
- 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28,
- 0x0b, 0x32, 0x21, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x41, 0x63,
- 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f,
- 0x6e, 0x49, 0x64, 0x73, 0x52, 0x16, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, 0x54, 0x72,
- 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x22, 0x5e, 0x0a, 0x16,
- 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d,
- 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01,
- 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x30, 0x0a, 0x13, 0x69, 0x6e,
- 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e,
- 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65,
- 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x70, 0x0a, 0x17,
- 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
- 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x29, 0x0a, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b,
- 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69,
- 0x72, 0x65, 0x2e, 0x52, 0x70, 0x63, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x05, 0x62, 0x6c, 0x6f,
- 0x63, 0x6b, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01,
+ 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x79, 0x0a, 0x0c, 0x4d, 0x65,
+ 0x6d, 0x70, 0x6f, 0x6f, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x66, 0x65,
+ 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x03, 0x66, 0x65, 0x65, 0x12, 0x3b, 0x0a, 0x0b,
+ 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28,
+ 0x0b, 0x32, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x70,
+ 0x63, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x74, 0x72,
+ 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x73, 0x4f,
+ 0x72, 0x70, 0x68, 0x61, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, 0x4f,
+ 0x72, 0x70, 0x68, 0x61, 0x6e, 0x22, 0x24, 0x0a, 0x22, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x6e,
+ 0x65, 0x63, 0x74, 0x65, 0x64, 0x50, 0x65, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71,
+ 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x8f, 0x01, 0x0a, 0x23,
+ 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x50, 0x65, 0x65, 0x72,
+ 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73,
+ 0x61, 0x67, 0x65, 0x12, 0x3c, 0x0a, 0x05, 0x69, 0x6e, 0x66, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03,
+ 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x47,
+ 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x50, 0x65, 0x65, 0x72, 0x49,
+ 0x6e, 0x66, 0x6f, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x69, 0x6e, 0x66, 0x6f,
+ 0x73, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28,
+ 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x50,
+ 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xd3, 0x02,
+ 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x50, 0x65,
+ 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x0e, 0x0a,
+ 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a,
+ 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07,
+ 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x2a, 0x0a, 0x10, 0x6c, 0x61, 0x73, 0x74, 0x50,
+ 0x69, 0x6e, 0x67, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28,
+ 0x03, 0x52, 0x10, 0x6c, 0x61, 0x73, 0x74, 0x50, 0x69, 0x6e, 0x67, 0x44, 0x75, 0x72, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x69, 0x73, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e,
+ 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x69, 0x73, 0x4f, 0x75, 0x74, 0x62, 0x6f,
+ 0x75, 0x6e, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x4f, 0x66, 0x66, 0x73, 0x65,
+ 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x4f, 0x66, 0x66,
+ 0x73, 0x65, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74,
+ 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x75, 0x73, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e,
+ 0x74, 0x12, 0x3c, 0x0a, 0x19, 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, 0x64, 0x50,
+ 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x09,
+ 0x20, 0x01, 0x28, 0x0d, 0x52, 0x19, 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, 0x64,
+ 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12,
+ 0x24, 0x0a, 0x0d, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64,
+ 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x6f, 0x6e, 0x6e,
+ 0x65, 0x63, 0x74, 0x65, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x73, 0x49, 0x62, 0x64, 0x50, 0x65,
+ 0x65, 0x72, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, 0x49, 0x62, 0x64, 0x50,
+ 0x65, 0x65, 0x72, 0x22, 0x53, 0x0a, 0x15, 0x41, 0x64, 0x64, 0x50, 0x65, 0x65, 0x72, 0x52, 0x65,
+ 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07,
+ 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61,
+ 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x69, 0x73, 0x50, 0x65, 0x72, 0x6d,
+ 0x61, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, 0x50,
+ 0x65, 0x72, 0x6d, 0x61, 0x6e, 0x65, 0x6e, 0x74, 0x22, 0x44, 0x0a, 0x16, 0x41, 0x64, 0x64, 0x50,
+ 0x65, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61,
+ 0x67, 0x65, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01,
0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52,
- 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x41,
- 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x53, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x52,
- 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a,
- 0x0c, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20,
- 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49,
- 0x64, 0x22, 0x66, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x53, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x77, 0x6f,
- 0x72, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67,
- 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x67, 0x61, 0x73, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x01, 0x20,
- 0x01, 0x28, 0x04, 0x52, 0x08, 0x67, 0x61, 0x73, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x2a, 0x0a,
- 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e,
- 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72,
- 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x9a, 0x01, 0x0a, 0x34, 0x47, 0x65,
- 0x74, 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64,
- 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x46, 0x72, 0x6f, 0x6d, 0x42,
- 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61,
- 0x67, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x48, 0x61, 0x73, 0x68, 0x18,
- 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x48, 0x61, 0x73, 0x68,
+ 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x80,
+ 0x01, 0x0a, 0x1f, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63,
+ 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61,
+ 0x67, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f,
+ 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77,
+ 0x69, 0x72, 0x65, 0x2e, 0x52, 0x70, 0x63, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69,
+ 0x6f, 0x6e, 0x52, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12,
+ 0x20, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x4f, 0x72, 0x70, 0x68, 0x61, 0x6e, 0x18, 0x02,
+ 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x4f, 0x72, 0x70, 0x68, 0x61,
+ 0x6e, 0x22, 0x74, 0x0a, 0x20, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73,
+ 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65,
+ 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63,
+ 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x72,
+ 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x05, 0x65,
+ 0x72, 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72,
+ 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72,
+ 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x7d, 0x0a, 0x35, 0x4e, 0x6f, 0x74, 0x69, 0x66,
+ 0x79, 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64,
+ 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x67,
+ 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,
0x12, 0x44, 0x0a, 0x1d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x41, 0x63, 0x63, 0x65, 0x70,
0x74, 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64,
- 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65,
+ 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65,
0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74,
- 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x22, 0x80, 0x01, 0x0a, 0x16, 0x41, 0x63, 0x63, 0x65, 0x70,
+ 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x22, 0x64, 0x0a, 0x36, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79,
+ 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x50,
+ 0x61, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65,
+ 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,
+ 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x0b,
+ 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x50, 0x43,
+ 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x81, 0x02, 0x0a,
+ 0x34, 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64,
+ 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x67,
+ 0x65, 0x64, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65,
+ 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x38, 0x0a, 0x17, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64,
+ 0x43, 0x68, 0x61, 0x69, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73,
+ 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x17, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x43,
+ 0x68, 0x61, 0x69, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12,
+ 0x34, 0x0a, 0x15, 0x61, 0x64, 0x64, 0x65, 0x64, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x42, 0x6c, 0x6f,
+ 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x15,
+ 0x61, 0x64, 0x64, 0x65, 0x64, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48,
+ 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x59, 0x0a, 0x16, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x65,
+ 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x18,
+ 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72,
+ 0x65, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61,
+ 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x52, 0x16, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74,
+ 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73,
+ 0x22, 0x5e, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75,
+ 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61,
+ 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x30,
+ 0x0a, 0x13, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63,
+ 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x69, 0x6e, 0x63,
+ 0x6c, 0x75, 0x64, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73,
+ 0x22, 0x70, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70,
+ 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x29, 0x0a, 0x05, 0x62,
+ 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f,
+ 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x70, 0x63, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52,
+ 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18,
+ 0xe8, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69,
+ 0x72, 0x65, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72,
+ 0x6f, 0x72, 0x22, 0x41, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x53, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x77,
+ 0x6f, 0x72, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67,
+ 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49,
+ 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x77,
+ 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x22, 0x66, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x53, 0x75, 0x62, 0x6e,
+ 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65,
+ 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x67, 0x61, 0x73, 0x4c, 0x69, 0x6d, 0x69,
+ 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x67, 0x61, 0x73, 0x4c, 0x69, 0x6d, 0x69,
+ 0x74, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28,
+ 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x50,
+ 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x9a, 0x01,
+ 0x0a, 0x34, 0x47, 0x65, 0x74, 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x53, 0x65, 0x6c, 0x65,
+ 0x63, 0x74, 0x65, 0x64, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x46,
+ 0x72, 0x6f, 0x6d, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d,
+ 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x48,
+ 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74,
+ 0x48, 0x61, 0x73, 0x68, 0x12, 0x44, 0x0a, 0x1d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x41,
+ 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69,
+ 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1d, 0x69, 0x6e, 0x63,
+ 0x6c, 0x75, 0x64, 0x65, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e,
+ 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x22, 0x80, 0x01, 0x0a, 0x16, 0x41,
+ 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69,
+ 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x12, 0x2e, 0x0a, 0x12, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x69,
+ 0x6e, 0x67, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28,
+ 0x09, 0x52, 0x12, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6e, 0x67, 0x42, 0x6c, 0x6f, 0x63,
+ 0x6b, 0x48, 0x61, 0x73, 0x68, 0x12, 0x36, 0x0a, 0x16, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x65,
+ 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x18,
+ 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x16, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, 0x54,
+ 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x22, 0xae, 0x02,
+ 0x0a, 0x35, 0x47, 0x65, 0x74, 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x53, 0x65, 0x6c, 0x65,
+ 0x63, 0x74, 0x65, 0x64, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x46,
+ 0x72, 0x6f, 0x6d, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+ 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x38, 0x0a, 0x17, 0x72, 0x65, 0x6d, 0x6f, 0x76,
+ 0x65, 0x64, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68,
+ 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x17, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65,
+ 0x64, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x65,
+ 0x73, 0x12, 0x34, 0x0a, 0x15, 0x61, 0x64, 0x64, 0x65, 0x64, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x42,
+ 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09,
+ 0x52, 0x15, 0x61, 0x64, 0x64, 0x65, 0x64, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x42, 0x6c, 0x6f, 0x63,
+ 0x6b, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x59, 0x0a, 0x16, 0x61, 0x63, 0x63, 0x65, 0x70,
0x74, 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64,
- 0x73, 0x12, 0x2e, 0x0a, 0x12, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6e, 0x67, 0x42, 0x6c,
- 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x61,
- 0x63, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6e, 0x67, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73,
- 0x68, 0x12, 0x36, 0x0a, 0x16, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, 0x54, 0x72, 0x61,
- 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28,
- 0x09, 0x52, 0x16, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73,
- 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x22, 0xae, 0x02, 0x0a, 0x35, 0x47, 0x65,
- 0x74, 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64,
- 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x46, 0x72, 0x6f, 0x6d, 0x42,
- 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73,
- 0x61, 0x67, 0x65, 0x12, 0x38, 0x0a, 0x17, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x43, 0x68,
- 0x61, 0x69, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x01,
- 0x20, 0x03, 0x28, 0x09, 0x52, 0x17, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x43, 0x68, 0x61,
- 0x69, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x34, 0x0a,
- 0x15, 0x61, 0x64, 0x64, 0x65, 0x64, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b,
- 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x15, 0x61, 0x64,
- 0x64, 0x65, 0x64, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73,
- 0x68, 0x65, 0x73, 0x12, 0x59, 0x0a, 0x16, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, 0x54,
- 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x18, 0x02, 0x20,
- 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e,
- 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74,
- 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x52, 0x16, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64,
- 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x12, 0x2a,
- 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13,
- 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72,
- 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x8b, 0x01, 0x0a, 0x17, 0x47,
- 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d,
- 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6c, 0x6f, 0x77, 0x48, 0x61, 0x73,
- 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6c, 0x6f, 0x77, 0x48, 0x61, 0x73, 0x68,
- 0x12, 0x24, 0x0a, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b,
- 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65,
- 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64,
- 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20,
- 0x01, 0x28, 0x08, 0x52, 0x13, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x72, 0x61, 0x6e,
- 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x95, 0x01, 0x0a, 0x18, 0x47, 0x65, 0x74,
- 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65,
- 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61,
- 0x73, 0x68, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63,
- 0x6b, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x2b, 0x0a, 0x06, 0x62, 0x6c, 0x6f, 0x63, 0x6b,
- 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77,
- 0x69, 0x72, 0x65, 0x2e, 0x52, 0x70, 0x63, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x06, 0x62, 0x6c,
- 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07,
- 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65,
- 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72,
- 0x22, 0x1d, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x43, 0x6f, 0x75, 0x6e,
- 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22,
- 0x8c, 0x01, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x43, 0x6f, 0x75, 0x6e,
- 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,
- 0x12, 0x1e, 0x0a, 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01,
- 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x43, 0x6f, 0x75, 0x6e, 0x74,
- 0x12, 0x20, 0x0a, 0x0b, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18,
- 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x75,
- 0x6e, 0x74, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01,
+ 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77,
+ 0x69, 0x72, 0x65, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e,
+ 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x52, 0x16, 0x61, 0x63, 0x63, 0x65,
+ 0x70, 0x74, 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49,
+ 0x64, 0x73, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01,
0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52,
- 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x1f,
- 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x44, 0x61, 0x67, 0x49, 0x6e, 0x66,
- 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22,
- 0x9e, 0x03, 0x0a, 0x1e, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x44, 0x61, 0x67, 0x49,
- 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61,
- 0x67, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4e, 0x61, 0x6d,
- 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b,
- 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x43, 0x6f, 0x75,
- 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x43,
+ 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x8b,
+ 0x01, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75,
+ 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6c, 0x6f,
+ 0x77, 0x48, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6c, 0x6f, 0x77,
+ 0x48, 0x61, 0x73, 0x68, 0x12, 0x24, 0x0a, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x42,
+ 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x69, 0x6e, 0x63,
+ 0x6c, 0x75, 0x64, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x69, 0x6e,
+ 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e,
+ 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65,
+ 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x95, 0x01, 0x0a,
+ 0x18, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+ 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x62, 0x6c, 0x6f,
+ 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b,
+ 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x2b, 0x0a, 0x06, 0x62,
+ 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72,
+ 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x70, 0x63, 0x42, 0x6c, 0x6f, 0x63, 0x6b,
+ 0x52, 0x06, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f,
+ 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+ 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65,
+ 0x72, 0x72, 0x6f, 0x72, 0x22, 0x1d, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b,
+ 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73,
+ 0x61, 0x67, 0x65, 0x22, 0x8c, 0x01, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b,
+ 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73,
+ 0x73, 0x61, 0x67, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x43, 0x6f, 0x75,
+ 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x43,
0x6f, 0x75, 0x6e, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x43, 0x6f,
- 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x68, 0x65, 0x61, 0x64, 0x65,
- 0x72, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x70, 0x48, 0x61, 0x73,
- 0x68, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x74, 0x69, 0x70, 0x48, 0x61,
- 0x73, 0x68, 0x65, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x69, 0x66, 0x66, 0x69, 0x63, 0x75, 0x6c,
- 0x74, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0a, 0x64, 0x69, 0x66, 0x66, 0x69, 0x63,
- 0x75, 0x6c, 0x74, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x70, 0x61, 0x73, 0x74, 0x4d, 0x65, 0x64, 0x69,
- 0x61, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x70, 0x61,
- 0x73, 0x74, 0x4d, 0x65, 0x64, 0x69, 0x61, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x30, 0x0a, 0x13,
- 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x48, 0x61, 0x73,
- 0x68, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x13, 0x76, 0x69, 0x72, 0x74, 0x75,
- 0x61, 0x6c, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x2a,
- 0x0a, 0x10, 0x70, 0x72, 0x75, 0x6e, 0x69, 0x6e, 0x67, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x48, 0x61,
- 0x73, 0x68, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x70, 0x72, 0x75, 0x6e, 0x69, 0x6e,
- 0x67, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x48, 0x61, 0x73, 0x68, 0x12, 0x28, 0x0a, 0x0f, 0x76, 0x69,
- 0x72, 0x74, 0x75, 0x61, 0x6c, 0x44, 0x61, 0x61, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x09, 0x20,
- 0x01, 0x28, 0x04, 0x52, 0x0f, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x44, 0x61, 0x61, 0x53,
- 0x63, 0x6f, 0x72, 0x65, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07,
+ 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x68, 0x65, 0x61, 0x64, 0x65,
+ 0x72, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18,
+ 0xe8, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69,
+ 0x72, 0x65, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72,
+ 0x6f, 0x72, 0x22, 0x1f, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x44, 0x61,
+ 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73,
+ 0x61, 0x67, 0x65, 0x22, 0x9e, 0x03, 0x0a, 0x1e, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b,
+ 0x44, 0x61, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d,
+ 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72,
+ 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6e, 0x65, 0x74,
+ 0x77, 0x6f, 0x72, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x62, 0x6c, 0x6f, 0x63,
+ 0x6b, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x62, 0x6c,
+ 0x6f, 0x63, 0x6b, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x68, 0x65, 0x61, 0x64,
+ 0x65, 0x72, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x68,
+ 0x65, 0x61, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69,
+ 0x70, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x74,
+ 0x69, 0x70, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x69, 0x66, 0x66,
+ 0x69, 0x63, 0x75, 0x6c, 0x74, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0a, 0x64, 0x69,
+ 0x66, 0x66, 0x69, 0x63, 0x75, 0x6c, 0x74, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x70, 0x61, 0x73, 0x74,
+ 0x4d, 0x65, 0x64, 0x69, 0x61, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03,
+ 0x52, 0x0e, 0x70, 0x61, 0x73, 0x74, 0x4d, 0x65, 0x64, 0x69, 0x61, 0x6e, 0x54, 0x69, 0x6d, 0x65,
+ 0x12, 0x30, 0x0a, 0x13, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x65, 0x6e,
+ 0x74, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x13, 0x76,
+ 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x48, 0x61, 0x73, 0x68,
+ 0x65, 0x73, 0x12, 0x2a, 0x0a, 0x10, 0x70, 0x72, 0x75, 0x6e, 0x69, 0x6e, 0x67, 0x50, 0x6f, 0x69,
+ 0x6e, 0x74, 0x48, 0x61, 0x73, 0x68, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x70, 0x72,
+ 0x75, 0x6e, 0x69, 0x6e, 0x67, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x48, 0x61, 0x73, 0x68, 0x12, 0x28,
+ 0x0a, 0x0f, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x44, 0x61, 0x61, 0x53, 0x63, 0x6f, 0x72,
+ 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0f, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c,
+ 0x44, 0x61, 0x61, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f,
+ 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+ 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65,
+ 0x72, 0x72, 0x6f, 0x72, 0x22, 0x55, 0x0a, 0x25, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x46,
+ 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x52,
+ 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2c, 0x0a,
+ 0x11, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61,
+ 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x69,
+ 0x74, 0x79, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x22, 0x54, 0x0a, 0x26, 0x52,
+ 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x43, 0x6f,
+ 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65,
+ 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0xe8,
+ 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72,
+ 0x65, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f,
+ 0x72, 0x22, 0x27, 0x0a, 0x25, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x46, 0x69, 0x6e, 0x61, 0x6c,
+ 0x69, 0x74, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75,
+ 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x54, 0x0a, 0x26, 0x4e, 0x6f,
+ 0x74, 0x69, 0x66, 0x79, 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x43, 0x6f, 0x6e, 0x66,
+ 0x6c, 0x69, 0x63, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73,
+ 0x73, 0x61, 0x67, 0x65, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07,
0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65,
0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72,
- 0x22, 0x55, 0x0a, 0x25, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x46, 0x69, 0x6e, 0x61, 0x6c,
- 0x69, 0x74, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65,
- 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2c, 0x0a, 0x11, 0x66, 0x69, 0x6e,
- 0x61, 0x6c, 0x69, 0x74, 0x79, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x18, 0x01,
- 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x42, 0x6c,
- 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x22, 0x54, 0x0a, 0x26, 0x52, 0x65, 0x73, 0x6f, 0x6c,
- 0x76, 0x65, 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x6c, 0x69,
- 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67,
+ 0x22, 0x55, 0x0a, 0x23, 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x43, 0x6f, 0x6e, 0x66,
+ 0x6c, 0x69, 0x63, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2e, 0x0a, 0x12, 0x76, 0x69, 0x6f, 0x6c, 0x61,
+ 0x74, 0x69, 0x6e, 0x67, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20,
+ 0x01, 0x28, 0x09, 0x52, 0x12, 0x76, 0x69, 0x6f, 0x6c, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x42, 0x6c,
+ 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x22, 0x5b, 0x0a, 0x2b, 0x46, 0x69, 0x6e, 0x61, 0x6c,
+ 0x69, 0x74, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x6c,
+ 0x76, 0x65, 0x64, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d,
+ 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2c, 0x0a, 0x11, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x69,
+ 0x74, 0x79, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28,
+ 0x09, 0x52, 0x11, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x42, 0x6c, 0x6f, 0x63, 0x6b,
+ 0x48, 0x61, 0x73, 0x68, 0x22, 0x18, 0x0a, 0x16, 0x53, 0x68, 0x75, 0x74, 0x44, 0x6f, 0x77, 0x6e,
+ 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x45,
+ 0x0a, 0x17, 0x53, 0x68, 0x75, 0x74, 0x44, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+ 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, 0x72,
+ 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+ 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05,
+ 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x70, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x48, 0x65, 0x61, 0x64,
+ 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67,
+ 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x48, 0x61, 0x73, 0x68, 0x18, 0x01,
+ 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x48, 0x61, 0x73, 0x68, 0x12,
+ 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05,
+ 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x69, 0x73, 0x41, 0x73, 0x63, 0x65, 0x6e,
+ 0x64, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, 0x41, 0x73,
+ 0x63, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x22, 0x61, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x48, 0x65,
+ 0x61, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73,
+ 0x73, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18,
+ 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, 0x2a,
+ 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13,
+ 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72,
+ 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x40, 0x0a, 0x20, 0x4e, 0x6f,
+ 0x74, 0x69, 0x66, 0x79, 0x55, 0x74, 0x78, 0x6f, 0x73, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64,
+ 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1c,
+ 0x0a, 0x09, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28,
+ 0x09, 0x52, 0x09, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x22, 0x4f, 0x0a, 0x21,
+ 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x55, 0x74, 0x78, 0x6f, 0x73, 0x43, 0x68, 0x61, 0x6e, 0x67,
+ 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67,
0x65, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28,
0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x50,
- 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x27, 0x0a,
- 0x25, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x43,
- 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d,
- 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x54, 0x0a, 0x26, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79,
- 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74,
- 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,
- 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x0b,
- 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x50, 0x43,
- 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x55, 0x0a, 0x23,
- 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74,
- 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x73, 0x73,
- 0x61, 0x67, 0x65, 0x12, 0x2e, 0x0a, 0x12, 0x76, 0x69, 0x6f, 0x6c, 0x61, 0x74, 0x69, 0x6e, 0x67,
- 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
- 0x12, 0x76, 0x69, 0x6f, 0x6c, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48,
- 0x61, 0x73, 0x68, 0x22, 0x5b, 0x0a, 0x2b, 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x43,
- 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x4e,
- 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61,
- 0x67, 0x65, 0x12, 0x2c, 0x0a, 0x11, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x42, 0x6c,
- 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x66,
- 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68,
- 0x22, 0x18, 0x0a, 0x16, 0x53, 0x68, 0x75, 0x74, 0x44, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75,
- 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x45, 0x0a, 0x17, 0x53, 0x68,
- 0x75, 0x74, 0x44, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65,
- 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0xe8,
- 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72,
- 0x65, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f,
- 0x72, 0x22, 0x70, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x52,
- 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1c, 0x0a,
- 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x48, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
- 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x48, 0x61, 0x73, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x6c,
- 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69,
- 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x69, 0x73, 0x41, 0x73, 0x63, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67,
- 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, 0x41, 0x73, 0x63, 0x65, 0x6e, 0x64,
- 0x69, 0x6e, 0x67, 0x22, 0x61, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72,
- 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,
- 0x12, 0x18, 0x0a, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28,
- 0x09, 0x52, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72,
- 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f,
- 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52,
- 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x40, 0x0a, 0x20, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79,
- 0x55, 0x74, 0x78, 0x6f, 0x73, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75,
+ 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x95, 0x01,
+ 0x0a, 0x1f, 0x55, 0x74, 0x78, 0x6f, 0x73, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x4e, 0x6f,
+ 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67,
+ 0x65, 0x12, 0x36, 0x0a, 0x05, 0x61, 0x64, 0x64, 0x65, 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b,
+ 0x32, 0x20, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x55, 0x74, 0x78,
+ 0x6f, 0x73, 0x42, 0x79, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x45, 0x6e, 0x74,
+ 0x72, 0x79, 0x52, 0x05, 0x61, 0x64, 0x64, 0x65, 0x64, 0x12, 0x3a, 0x0a, 0x07, 0x72, 0x65, 0x6d,
+ 0x6f, 0x76, 0x65, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x70, 0x72, 0x6f,
+ 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x55, 0x74, 0x78, 0x6f, 0x73, 0x42, 0x79, 0x41, 0x64,
+ 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x72, 0x65,
+ 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x22, 0x9c, 0x01, 0x0a, 0x15, 0x55, 0x74, 0x78, 0x6f, 0x73, 0x42,
+ 0x79, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12,
+ 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
+ 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x32, 0x0a, 0x08, 0x6f, 0x75, 0x74,
+ 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x70, 0x72,
+ 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x70, 0x63, 0x4f, 0x75, 0x74, 0x70, 0x6f,
+ 0x69, 0x6e, 0x74, 0x52, 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x35, 0x0a,
+ 0x09, 0x75, 0x74, 0x78, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b,
+ 0x32, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x70, 0x63,
+ 0x55, 0x74, 0x78, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x75, 0x74, 0x78, 0x6f, 0x45,
+ 0x6e, 0x74, 0x72, 0x79, 0x22, 0x47, 0x0a, 0x27, 0x53, 0x74, 0x6f, 0x70, 0x4e, 0x6f, 0x74, 0x69,
+ 0x66, 0x79, 0x69, 0x6e, 0x67, 0x55, 0x74, 0x78, 0x6f, 0x73, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65,
+ 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12,
+ 0x1c, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03,
+ 0x28, 0x09, 0x52, 0x09, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x22, 0x56, 0x0a,
+ 0x28, 0x53, 0x74, 0x6f, 0x70, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x69, 0x6e, 0x67, 0x55, 0x74,
+ 0x78, 0x6f, 0x73, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+ 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, 0x72,
+ 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+ 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05,
+ 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x41, 0x0a, 0x21, 0x47, 0x65, 0x74, 0x55, 0x74, 0x78, 0x6f,
+ 0x73, 0x42, 0x79, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75,
0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x64,
0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61,
- 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x22, 0x4f, 0x0a, 0x21, 0x4e, 0x6f, 0x74, 0x69,
- 0x66, 0x79, 0x55, 0x74, 0x78, 0x6f, 0x73, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x52, 0x65,
- 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2a, 0x0a,
- 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e,
- 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72,
- 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x95, 0x01, 0x0a, 0x1f, 0x55, 0x74,
- 0x78, 0x6f, 0x73, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69,
- 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x36, 0x0a,
- 0x05, 0x61, 0x64, 0x64, 0x65, 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x70,
- 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x55, 0x74, 0x78, 0x6f, 0x73, 0x42, 0x79,
- 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05,
- 0x61, 0x64, 0x64, 0x65, 0x64, 0x12, 0x3a, 0x0a, 0x07, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64,
- 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69,
- 0x72, 0x65, 0x2e, 0x55, 0x74, 0x78, 0x6f, 0x73, 0x42, 0x79, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73,
- 0x73, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65,
- 0x64, 0x22, 0x9c, 0x01, 0x0a, 0x15, 0x55, 0x74, 0x78, 0x6f, 0x73, 0x42, 0x79, 0x41, 0x64, 0x64,
- 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x61,
- 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64,
- 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x32, 0x0a, 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e,
- 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77,
- 0x69, 0x72, 0x65, 0x2e, 0x52, 0x70, 0x63, 0x4f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52,
- 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x35, 0x0a, 0x09, 0x75, 0x74, 0x78,
- 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70,
- 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x70, 0x63, 0x55, 0x74, 0x78, 0x6f,
- 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x75, 0x74, 0x78, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79,
- 0x22, 0x47, 0x0a, 0x27, 0x53, 0x74, 0x6f, 0x70, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x69, 0x6e,
- 0x67, 0x55, 0x74, 0x78, 0x6f, 0x73, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x52, 0x65, 0x71,
- 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61,
- 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09,
- 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x22, 0x56, 0x0a, 0x28, 0x53, 0x74, 0x6f,
- 0x70, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x69, 0x6e, 0x67, 0x55, 0x74, 0x78, 0x6f, 0x73, 0x43,
- 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65,
- 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0xe8,
- 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72,
- 0x65, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f,
- 0x72, 0x22, 0x41, 0x0a, 0x21, 0x47, 0x65, 0x74, 0x55, 0x74, 0x78, 0x6f, 0x73, 0x42, 0x79, 0x41,
- 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d,
- 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73,
- 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x64, 0x64, 0x72, 0x65,
- 0x73, 0x73, 0x65, 0x73, 0x22, 0x8c, 0x01, 0x0a, 0x22, 0x47, 0x65, 0x74, 0x55, 0x74, 0x78, 0x6f,
- 0x73, 0x42, 0x79, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70,
- 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x3a, 0x0a, 0x07, 0x65,
- 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x70,
- 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x55, 0x74, 0x78, 0x6f, 0x73, 0x42, 0x79,
- 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07,
- 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72,
- 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77,
- 0x69, 0x72, 0x65, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72,
- 0x72, 0x6f, 0x72, 0x22, 0x3d, 0x0a, 0x21, 0x47, 0x65, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63,
- 0x65, 0x42, 0x79, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
- 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72,
- 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65,
- 0x73, 0x73, 0x22, 0x6a, 0x0a, 0x22, 0x47, 0x65, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65,
- 0x42, 0x79, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
- 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x62, 0x61, 0x6c, 0x61,
- 0x6e, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x62, 0x61, 0x6c, 0x61, 0x6e,
- 0x63, 0x65, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01,
- 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52,
- 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x44,
- 0x0a, 0x24, 0x47, 0x65, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x42, 0x79, 0x41,
- 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d,
- 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73,
- 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x64, 0x64, 0x72, 0x65,
- 0x73, 0x73, 0x65, 0x73, 0x22, 0x78, 0x0a, 0x16, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73,
- 0x42, 0x79, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x18,
- 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
- 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x62, 0x61, 0x6c, 0x61,
- 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x62, 0x61, 0x6c, 0x61, 0x6e,
- 0x63, 0x65, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01,
- 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52,
- 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x90,
- 0x01, 0x0a, 0x25, 0x47, 0x65, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x42, 0x79,
- 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
- 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x3b, 0x0a, 0x07, 0x65, 0x6e, 0x74, 0x72,
- 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x70, 0x72, 0x6f, 0x74,
- 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x42, 0x79,
- 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x65, 0x6e,
- 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0xe8,
- 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72,
- 0x65, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f,
- 0x72, 0x22, 0x31, 0x0a, 0x2f, 0x47, 0x65, 0x74, 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x53,
- 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x42, 0x6c, 0x75,
- 0x65, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73,
- 0x73, 0x61, 0x67, 0x65, 0x22, 0x7c, 0x0a, 0x30, 0x47, 0x65, 0x74, 0x56, 0x69, 0x72, 0x74, 0x75,
- 0x61, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74,
- 0x42, 0x6c, 0x75, 0x65, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
- 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x62, 0x6c, 0x75, 0x65,
- 0x53, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x62, 0x6c, 0x75,
- 0x65, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18,
+ 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x22, 0x8c, 0x01, 0x0a, 0x22, 0x47, 0x65, 0x74,
+ 0x55, 0x74, 0x78, 0x6f, 0x73, 0x42, 0x79, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73,
+ 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12,
+ 0x3a, 0x0a, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b,
+ 0x32, 0x20, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x55, 0x74, 0x78,
+ 0x6f, 0x73, 0x42, 0x79, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x45, 0x6e, 0x74,
+ 0x72, 0x79, 0x52, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x2a, 0x0a, 0x05, 0x65,
+ 0x72, 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72,
+ 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72,
+ 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x3d, 0x0a, 0x21, 0x47, 0x65, 0x74, 0x42, 0x61,
+ 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x42, 0x79, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65,
+ 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07,
+ 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61,
+ 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x6a, 0x0a, 0x22, 0x47, 0x65, 0x74, 0x42, 0x61, 0x6c,
+ 0x61, 0x6e, 0x63, 0x65, 0x42, 0x79, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73,
+ 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07,
+ 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x62,
+ 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18,
+ 0xe8, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69,
+ 0x72, 0x65, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72,
+ 0x6f, 0x72, 0x22, 0x44, 0x0a, 0x24, 0x47, 0x65, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65,
+ 0x73, 0x42, 0x79, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75,
+ 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x64,
+ 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61,
+ 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x22, 0x78, 0x0a, 0x16, 0x42, 0x61, 0x6c, 0x61,
+ 0x6e, 0x63, 0x65, 0x73, 0x42, 0x79, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x45, 0x6e, 0x74,
+ 0x72, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20,
+ 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x18, 0x0a, 0x07,
+ 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x62,
+ 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18,
0xe8, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69,
0x72, 0x65, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72,
- 0x6f, 0x72, 0x22, 0x3b, 0x0a, 0x39, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x56, 0x69, 0x72, 0x74,
+ 0x6f, 0x72, 0x22, 0x90, 0x01, 0x0a, 0x25, 0x47, 0x65, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63,
+ 0x65, 0x73, 0x42, 0x79, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x52, 0x65, 0x73,
+ 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x3b, 0x0a, 0x07,
+ 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e,
+ 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63,
+ 0x65, 0x73, 0x42, 0x79, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79,
+ 0x52, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, 0x72,
+ 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+ 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05,
+ 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x31, 0x0a, 0x2f, 0x47, 0x65, 0x74, 0x56, 0x69, 0x72, 0x74,
0x75, 0x61, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x50, 0x61, 0x72, 0x65, 0x6e,
- 0x74, 0x42, 0x6c, 0x75, 0x65, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65,
- 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22,
- 0x68, 0x0a, 0x3a, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c,
- 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x42, 0x6c,
- 0x75, 0x65, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x52, 0x65,
- 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2a, 0x0a,
- 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e,
- 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72,
- 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x82, 0x01, 0x0a, 0x38, 0x56, 0x69,
+ 0x74, 0x42, 0x6c, 0x75, 0x65, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
+ 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x7c, 0x0a, 0x30, 0x47, 0x65, 0x74, 0x56,
+ 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x50, 0x61,
+ 0x72, 0x65, 0x6e, 0x74, 0x42, 0x6c, 0x75, 0x65, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x73,
+ 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1c, 0x0a, 0x09,
+ 0x62, 0x6c, 0x75, 0x65, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52,
+ 0x09, 0x62, 0x6c, 0x75, 0x65, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72,
+ 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f,
+ 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52,
+ 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x3b, 0x0a, 0x39, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79,
+ 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x50,
+ 0x61, 0x72, 0x65, 0x6e, 0x74, 0x42, 0x6c, 0x75, 0x65, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x43, 0x68,
+ 0x61, 0x6e, 0x67, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73,
+ 0x61, 0x67, 0x65, 0x22, 0x68, 0x0a, 0x3a, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x56, 0x69, 0x72,
+ 0x74, 0x75, 0x61, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x50, 0x61, 0x72, 0x65,
+ 0x6e, 0x74, 0x42, 0x6c, 0x75, 0x65, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67,
+ 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67,
+ 0x65, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28,
+ 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x50,
+ 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x82, 0x01,
+ 0x0a, 0x38, 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65,
+ 0x64, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x42, 0x6c, 0x75, 0x65, 0x53, 0x63, 0x6f, 0x72, 0x65,
+ 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x46, 0x0a, 0x1e, 0x76, 0x69,
0x72, 0x74, 0x75, 0x61, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x50, 0x61, 0x72,
- 0x65, 0x6e, 0x74, 0x42, 0x6c, 0x75, 0x65, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x43, 0x68, 0x61, 0x6e,
- 0x67, 0x65, 0x64, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d,
- 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x46, 0x0a, 0x1e, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61,
- 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x42,
- 0x6c, 0x75, 0x65, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x1e,
- 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x50,
- 0x61, 0x72, 0x65, 0x6e, 0x74, 0x42, 0x6c, 0x75, 0x65, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x22, 0x2c,
- 0x0a, 0x2a, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x44,
- 0x61, 0x61, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x52, 0x65,
- 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x59, 0x0a, 0x2b,
- 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x44, 0x61, 0x61,
- 0x53, 0x63, 0x6f, 0x72, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70,
- 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2a, 0x0a, 0x05, 0x65,
- 0x72, 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72,
- 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72,
- 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x55, 0x0a, 0x29, 0x56, 0x69, 0x72, 0x74, 0x75,
- 0x61, 0x6c, 0x44, 0x61, 0x61, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65,
- 0x64, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x73,
- 0x73, 0x61, 0x67, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x44,
- 0x61, 0x61, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0f, 0x76,
- 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x44, 0x61, 0x61, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x22, 0x31,
- 0x0a, 0x2f, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x50, 0x72, 0x75, 0x6e, 0x69, 0x6e, 0x67, 0x50,
+ 0x65, 0x6e, 0x74, 0x42, 0x6c, 0x75, 0x65, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01,
+ 0x28, 0x04, 0x52, 0x1e, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63,
+ 0x74, 0x65, 0x64, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x42, 0x6c, 0x75, 0x65, 0x53, 0x63, 0x6f,
+ 0x72, 0x65, 0x22, 0x2c, 0x0a, 0x2a, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x56, 0x69, 0x72, 0x74,
+ 0x75, 0x61, 0x6c, 0x44, 0x61, 0x61, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67,
+ 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,
+ 0x22, 0x59, 0x0a, 0x2b, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x56, 0x69, 0x72, 0x74, 0x75, 0x61,
+ 0x6c, 0x44, 0x61, 0x61, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64,
+ 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12,
+ 0x2a, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32,
+ 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x50, 0x43, 0x45,
+ 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x55, 0x0a, 0x29, 0x56,
+ 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x44, 0x61, 0x61, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x43, 0x68,
+ 0x61, 0x6e, 0x67, 0x65, 0x64, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x76, 0x69, 0x72, 0x74,
+ 0x75, 0x61, 0x6c, 0x44, 0x61, 0x61, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28,
+ 0x04, 0x52, 0x0f, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x44, 0x61, 0x61, 0x53, 0x63, 0x6f,
+ 0x72, 0x65, 0x22, 0x31, 0x0a, 0x2f, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x50, 0x72, 0x75, 0x6e,
+ 0x69, 0x6e, 0x67, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x55, 0x54, 0x58, 0x4f, 0x53, 0x65, 0x74, 0x4f,
+ 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65,
+ 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x5e, 0x0a, 0x30, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x50,
+ 0x72, 0x75, 0x6e, 0x69, 0x6e, 0x67, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x55, 0x54, 0x58, 0x4f, 0x53,
+ 0x65, 0x74, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+ 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, 0x72,
+ 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+ 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05,
+ 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x30, 0x0a, 0x2e, 0x50, 0x72, 0x75, 0x6e, 0x69, 0x6e, 0x67,
+ 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x55, 0x54, 0x58, 0x4f, 0x53, 0x65, 0x74, 0x4f, 0x76, 0x65, 0x72,
+ 0x72, 0x69, 0x64, 0x65, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x38, 0x0a, 0x36, 0x53, 0x74, 0x6f, 0x70, 0x4e,
+ 0x6f, 0x74, 0x69, 0x66, 0x79, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x75, 0x6e, 0x69, 0x6e, 0x67, 0x50,
0x6f, 0x69, 0x6e, 0x74, 0x55, 0x54, 0x58, 0x4f, 0x53, 0x65, 0x74, 0x4f, 0x76, 0x65, 0x72, 0x72,
0x69, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67,
- 0x65, 0x22, 0x5e, 0x0a, 0x30, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x50, 0x72, 0x75, 0x6e, 0x69,
- 0x6e, 0x67, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x55, 0x54, 0x58, 0x4f, 0x53, 0x65, 0x74, 0x4f, 0x76,
- 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65,
- 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0xe8,
- 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72,
- 0x65, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f,
- 0x72, 0x22, 0x30, 0x0a, 0x2e, 0x50, 0x72, 0x75, 0x6e, 0x69, 0x6e, 0x67, 0x50, 0x6f, 0x69, 0x6e,
- 0x74, 0x55, 0x54, 0x58, 0x4f, 0x53, 0x65, 0x74, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65,
- 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x73, 0x73,
- 0x61, 0x67, 0x65, 0x22, 0x38, 0x0a, 0x36, 0x53, 0x74, 0x6f, 0x70, 0x4e, 0x6f, 0x74, 0x69, 0x66,
- 0x79, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x75, 0x6e, 0x69, 0x6e, 0x67, 0x50, 0x6f, 0x69, 0x6e, 0x74,
- 0x55, 0x54, 0x58, 0x4f, 0x53, 0x65, 0x74, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x52,
- 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x65, 0x0a,
- 0x37, 0x53, 0x74, 0x6f, 0x70, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x69, 0x6e, 0x67, 0x50, 0x72,
- 0x75, 0x6e, 0x69, 0x6e, 0x67, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x55, 0x54, 0x58, 0x4f, 0x53, 0x65,
- 0x74, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
- 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f,
- 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
- 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65,
- 0x72, 0x72, 0x6f, 0x72, 0x22, 0x23, 0x0a, 0x11, 0x42, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65,
- 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x70, 0x18,
- 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x70, 0x22, 0x40, 0x0a, 0x12, 0x42, 0x61, 0x6e,
- 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12,
+ 0x65, 0x22, 0x65, 0x0a, 0x37, 0x53, 0x74, 0x6f, 0x70, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x69,
+ 0x6e, 0x67, 0x50, 0x72, 0x75, 0x6e, 0x69, 0x6e, 0x67, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x55, 0x54,
+ 0x58, 0x4f, 0x53, 0x65, 0x74, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x52, 0x65, 0x73,
+ 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2a, 0x0a, 0x05,
+ 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70,
+ 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f,
+ 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x23, 0x0a, 0x11, 0x42, 0x61, 0x6e, 0x52,
+ 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x0e, 0x0a,
+ 0x02, 0x69, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x70, 0x22, 0x40, 0x0a,
+ 0x12, 0x42, 0x61, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73,
+ 0x61, 0x67, 0x65, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20,
+ 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e,
+ 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22,
+ 0x25, 0x0a, 0x13, 0x55, 0x6e, 0x62, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d,
+ 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x70, 0x18, 0x01, 0x20, 0x01,
+ 0x28, 0x09, 0x52, 0x02, 0x69, 0x70, 0x22, 0x42, 0x0a, 0x14, 0x55, 0x6e, 0x62, 0x61, 0x6e, 0x52,
+ 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2a,
+ 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13,
+ 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72,
+ 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x17, 0x0a, 0x15, 0x47, 0x65,
+ 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73,
+ 0x61, 0x67, 0x65, 0x22, 0xa6, 0x02, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52,
+ 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x14,
+ 0x0a, 0x05, 0x70, 0x32, 0x70, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70,
+ 0x32, 0x70, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x6d, 0x65, 0x6d, 0x70, 0x6f, 0x6f, 0x6c, 0x53,
+ 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x6d, 0x65, 0x6d, 0x70, 0x6f,
+ 0x6f, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72,
+ 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73,
+ 0x65, 0x72, 0x76, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, 0x0d,
+ 0x69, 0x73, 0x55, 0x74, 0x78, 0x6f, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x64, 0x18, 0x04, 0x20,
+ 0x01, 0x28, 0x08, 0x52, 0x0d, 0x69, 0x73, 0x55, 0x74, 0x78, 0x6f, 0x49, 0x6e, 0x64, 0x65, 0x78,
+ 0x65, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x69, 0x73, 0x54, 0x78, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65,
+ 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, 0x54, 0x78, 0x49, 0x6e, 0x64,
+ 0x65, 0x78, 0x65, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x69, 0x73, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76,
+ 0x61, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x69, 0x73, 0x41, 0x72, 0x63, 0x68,
+ 0x69, 0x76, 0x61, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x73, 0x53, 0x79, 0x6e, 0x63, 0x65, 0x64,
+ 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, 0x53, 0x79, 0x6e, 0x63, 0x65, 0x64,
+ 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x0b,
+ 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x50, 0x43,
+ 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x3d, 0x0a, 0x27,
+ 0x47, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6e, 0x67, 0x42, 0x6c, 0x6f, 0x63,
+ 0x6b, 0x48, 0x61, 0x73, 0x68, 0x4f, 0x66, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+ 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x78, 0x49, 0x44, 0x18,
+ 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x78, 0x49, 0x44, 0x22, 0x6a, 0x0a, 0x28, 0x47,
+ 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6e, 0x67, 0x42, 0x6c, 0x6f, 0x63, 0x6b,
+ 0x48, 0x61, 0x73, 0x68, 0x4f, 0x66, 0x54, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+ 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18,
+ 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x2a, 0x0a, 0x05, 0x65,
+ 0x72, 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72,
+ 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72,
+ 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x6c, 0x0a, 0x2c, 0x45, 0x73, 0x74, 0x69, 0x6d,
+ 0x61, 0x74, 0x65, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73,
+ 0x50, 0x65, 0x72, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+ 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x77, 0x69, 0x6e, 0x64, 0x6f,
+ 0x77, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x77, 0x69, 0x6e,
+ 0x64, 0x6f, 0x77, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74,
+ 0x48, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72,
+ 0x74, 0x48, 0x61, 0x73, 0x68, 0x22, 0x93, 0x01, 0x0a, 0x2d, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61,
+ 0x74, 0x65, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x50,
+ 0x65, 0x72, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+ 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x36, 0x0a, 0x16, 0x6e, 0x65, 0x74, 0x77, 0x6f,
+ 0x72, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x50, 0x65, 0x72, 0x53, 0x65, 0x63, 0x6f, 0x6e,
+ 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x16, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b,
+ 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x50, 0x65, 0x72, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x12,
0x2a, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32,
0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x50, 0x43, 0x45,
- 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x25, 0x0a, 0x13, 0x55,
- 0x6e, 0x62, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61,
- 0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02,
- 0x69, 0x70, 0x22, 0x42, 0x0a, 0x14, 0x55, 0x6e, 0x62, 0x61, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f,
- 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72,
- 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f,
- 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52,
- 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x17, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66,
- 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22,
- 0xe4, 0x01, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f,
- 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x32,
- 0x70, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x32, 0x70, 0x49, 0x64,
- 0x12, 0x20, 0x0a, 0x0b, 0x6d, 0x65, 0x6d, 0x70, 0x6f, 0x6f, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x18,
- 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x6d, 0x65, 0x6d, 0x70, 0x6f, 0x6f, 0x6c, 0x53, 0x69,
- 0x7a, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73,
- 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x65, 0x72, 0x76, 0x65,
- 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, 0x0d, 0x69, 0x73, 0x55, 0x74,
- 0x78, 0x6f, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52,
- 0x0d, 0x69, 0x73, 0x55, 0x74, 0x78, 0x6f, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x64, 0x12, 0x1a,
- 0x0a, 0x08, 0x69, 0x73, 0x53, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08,
- 0x52, 0x08, 0x69, 0x73, 0x53, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72,
+ 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x26, 0x0a, 0x24, 0x4e,
+ 0x6f, 0x74, 0x69, 0x66, 0x79, 0x4e, 0x65, 0x77, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x65, 0x6d,
+ 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73,
+ 0x61, 0x67, 0x65, 0x22, 0x53, 0x0a, 0x25, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x4e, 0x65, 0x77,
+ 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73,
+ 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2a, 0x0a, 0x05,
+ 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70,
+ 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f,
+ 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x25, 0x0a, 0x23, 0x4e, 0x65, 0x77, 0x42,
+ 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x74, 0x69,
+ 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22,
+ 0x9b, 0x01, 0x0a, 0x15, 0x4d, 0x65, 0x6d, 0x70, 0x6f, 0x6f, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79,
+ 0x42, 0x79, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64,
+ 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72,
+ 0x65, 0x73, 0x73, 0x12, 0x31, 0x0a, 0x07, 0x73, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x02,
+ 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65,
+ 0x2e, 0x4d, 0x65, 0x6d, 0x70, 0x6f, 0x6f, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x73,
+ 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x35, 0x0a, 0x09, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76,
+ 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+ 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x4d, 0x65, 0x6d, 0x70, 0x6f, 0x6f, 0x6c, 0x45, 0x6e, 0x74,
+ 0x72, 0x79, 0x52, 0x09, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x69, 0x6e, 0x67, 0x22, 0xae, 0x01,
+ 0x0a, 0x2a, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x70, 0x6f, 0x6f, 0x6c, 0x45, 0x6e, 0x74, 0x72,
+ 0x69, 0x65, 0x73, 0x42, 0x79, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x52, 0x65,
+ 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1c, 0x0a, 0x09,
+ 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52,
+ 0x09, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x69, 0x6e,
+ 0x63, 0x6c, 0x75, 0x64, 0x65, 0x4f, 0x72, 0x70, 0x68, 0x61, 0x6e, 0x50, 0x6f, 0x6f, 0x6c, 0x18,
+ 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x4f, 0x72,
+ 0x70, 0x68, 0x61, 0x6e, 0x50, 0x6f, 0x6f, 0x6c, 0x12, 0x34, 0x0a, 0x15, 0x66, 0x69, 0x6c, 0x74,
+ 0x65, 0x72, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6f,
+ 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x54,
+ 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6f, 0x6c, 0x22, 0x95,
+ 0x01, 0x0a, 0x2b, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x70, 0x6f, 0x6f, 0x6c, 0x45, 0x6e, 0x74,
+ 0x72, 0x69, 0x65, 0x73, 0x42, 0x79, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x52,
+ 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x3a,
+ 0x0a, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32,
+ 0x20, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x4d, 0x65, 0x6d, 0x70,
+ 0x6f, 0x6f, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x79, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73,
+ 0x73, 0x52, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72,
0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f,
0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52,
- 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x6c, 0x0a, 0x2c, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61,
- 0x74, 0x65, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x50,
- 0x65, 0x72, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d,
- 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77,
- 0x53, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x77, 0x69, 0x6e, 0x64,
- 0x6f, 0x77, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x48,
- 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74,
- 0x48, 0x61, 0x73, 0x68, 0x22, 0x93, 0x01, 0x0a, 0x2d, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74,
- 0x65, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x50, 0x65,
- 0x72, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d,
- 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x36, 0x0a, 0x16, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72,
- 0x6b, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x50, 0x65, 0x72, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64,
- 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x16, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x48,
- 0x61, 0x73, 0x68, 0x65, 0x73, 0x50, 0x65, 0x72, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x12, 0x2a,
+ 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x1d, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x69,
+ 0x6e, 0x53, 0x75, 0x70, 0x70, 0x6c, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65,
+ 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x92, 0x01, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x69,
+ 0x6e, 0x53, 0x75, 0x70, 0x70, 0x6c, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d,
+ 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x53, 0x6f, 0x6d,
+ 0x70, 0x69, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x53, 0x6f, 0x6d,
+ 0x70, 0x69, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6e,
+ 0x67, 0x53, 0x6f, 0x6d, 0x70, 0x69, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x63, 0x69,
+ 0x72, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x6f, 0x6d, 0x70, 0x69, 0x12, 0x2a,
0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13,
0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72,
- 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x26, 0x0a, 0x24, 0x4e, 0x6f,
- 0x74, 0x69, 0x66, 0x79, 0x4e, 0x65, 0x77, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x65, 0x6d, 0x70,
- 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61,
- 0x67, 0x65, 0x22, 0x53, 0x0a, 0x25, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x4e, 0x65, 0x77, 0x42,
- 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70,
+ 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x54, 0x0a, 0x18, 0x52, 0x70,
+ 0x63, 0x54, 0x78, 0x49, 0x44, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x73, 0x50, 0x61, 0x69, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x78, 0x49, 0x44, 0x18, 0x01,
+ 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x78, 0x49, 0x44, 0x12, 0x24, 0x0a, 0x0d, 0x63, 0x6f,
+ 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28,
+ 0x03, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73,
+ 0x22, 0x3e, 0x0a, 0x14, 0x52, 0x70, 0x63, 0x54, 0x78, 0x49, 0x44, 0x42, 0x6c, 0x6f, 0x63, 0x6b,
+ 0x48, 0x61, 0x73, 0x68, 0x50, 0x61, 0x69, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x78, 0x49, 0x44,
+ 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x78, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04,
+ 0x48, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x61, 0x73, 0x68,
+ 0x22, 0x51, 0x0a, 0x10, 0x52, 0x70, 0x63, 0x54, 0x78, 0x49, 0x44, 0x42, 0x6c, 0x6f, 0x63, 0x6b,
+ 0x50, 0x61, 0x69, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x78, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01,
+ 0x28, 0x09, 0x52, 0x04, 0x74, 0x78, 0x49, 0x44, 0x12, 0x29, 0x0a, 0x05, 0x62, 0x6c, 0x6f, 0x63,
+ 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77,
+ 0x69, 0x72, 0x65, 0x2e, 0x52, 0x70, 0x63, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x05, 0x62, 0x6c,
+ 0x6f, 0x63, 0x6b, 0x22, 0x42, 0x0a, 0x2a, 0x47, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74,
+ 0x69, 0x6e, 0x67, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x4f, 0x66,
+ 0x54, 0x78, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67,
+ 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x78, 0x49, 0x44, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09,
+ 0x52, 0x05, 0x74, 0x78, 0x49, 0x44, 0x73, 0x22, 0xaa, 0x01, 0x0a, 0x2b, 0x47, 0x65, 0x74, 0x41,
+ 0x63, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6e, 0x67, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73,
+ 0x68, 0x65, 0x73, 0x4f, 0x66, 0x54, 0x78, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+ 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x4f, 0x0a, 0x12, 0x74, 0x78, 0x49, 0x44, 0x42,
+ 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x50, 0x61, 0x69, 0x72, 0x73, 0x18, 0x01, 0x20,
+ 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e,
+ 0x52, 0x70, 0x63, 0x54, 0x78, 0x49, 0x44, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68,
+ 0x50, 0x61, 0x69, 0x72, 0x52, 0x12, 0x74, 0x78, 0x49, 0x44, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48,
+ 0x61, 0x73, 0x68, 0x50, 0x61, 0x69, 0x72, 0x73, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f,
+ 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+ 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65,
+ 0x72, 0x72, 0x6f, 0x72, 0x22, 0x2c, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x54, 0x78, 0x73, 0x52, 0x65,
+ 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05,
+ 0x74, 0x78, 0x49, 0x44, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x74, 0x78, 0x49,
+ 0x44, 0x73, 0x22, 0x82, 0x01, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x54, 0x78, 0x73, 0x52, 0x65, 0x73,
+ 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x3d, 0x0a, 0x0c,
+ 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03,
+ 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52,
+ 0x70, 0x63, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x74,
+ 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2a, 0x0a, 0x05, 0x65,
+ 0x72, 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72,
+ 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72,
+ 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x39, 0x0a, 0x21, 0x47, 0x65, 0x74, 0x54, 0x78,
+ 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65,
+ 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05,
+ 0x74, 0x78, 0x49, 0x44, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x74, 0x78, 0x49,
+ 0x44, 0x73, 0x22, 0xad, 0x01, 0x0a, 0x22, 0x47, 0x65, 0x74, 0x54, 0x78, 0x73, 0x43, 0x6f, 0x6e,
+ 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+ 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x5b, 0x0a, 0x16, 0x74, 0x78, 0x49,
+ 0x44, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x50, 0x61,
+ 0x69, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+ 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x70, 0x63, 0x54, 0x78, 0x49, 0x44, 0x43, 0x6f, 0x6e,
+ 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x50, 0x61, 0x69, 0x72, 0x52, 0x16,
+ 0x74, 0x78, 0x49, 0x44, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x73, 0x50, 0x61, 0x69, 0x72, 0x73, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18,
+ 0xe8, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69,
+ 0x72, 0x65, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72,
+ 0x6f, 0x72, 0x22, 0xa0, 0x01, 0x0a, 0x2a, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x54, 0x78, 0x73,
+ 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e,
+ 0x67, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67,
+ 0x65, 0x12, 0x14, 0x0a, 0x05, 0x54, 0x78, 0x49, 0x44, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09,
+ 0x52, 0x05, 0x54, 0x78, 0x49, 0x44, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x72, 0x65, 0x71, 0x75, 0x69,
+ 0x72, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73,
+ 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x15, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64,
+ 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x26, 0x0a,
+ 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x18,
+ 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x50, 0x65,
+ 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x22, 0x59, 0x0a, 0x2b, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x54,
+ 0x78, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68,
+ 0x61, 0x6e, 0x67, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73,
+ 0x73, 0x61, 0x67, 0x65, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07,
+ 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65,
+ 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72,
+ 0x22, 0xbb, 0x02, 0x0a, 0x29, 0x54, 0x78, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x4e, 0x6f, 0x74, 0x69, 0x66,
+ 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x34,
+ 0x0a, 0x15, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72,
+ 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x15, 0x72,
+ 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3d, 0x0a, 0x07, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x18,
+ 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72,
+ 0x65, 0x2e, 0x52, 0x70, 0x63, 0x54, 0x78, 0x49, 0x44, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x50, 0x61, 0x69, 0x72, 0x52, 0x07, 0x70, 0x65, 0x6e, 0x64,
+ 0x69, 0x6e, 0x67, 0x12, 0x41, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64,
+ 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69,
+ 0x72, 0x65, 0x2e, 0x52, 0x70, 0x63, 0x54, 0x78, 0x49, 0x44, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72,
+ 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x50, 0x61, 0x69, 0x72, 0x52, 0x09, 0x63, 0x6f, 0x6e,
+ 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x12, 0x2a, 0x0a, 0x10, 0x75, 0x6e, 0x63, 0x6f, 0x6e, 0x66,
+ 0x69, 0x72, 0x6d, 0x65, 0x64, 0x54, 0x78, 0x49, 0x64, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09,
+ 0x52, 0x10, 0x75, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x54, 0x78, 0x49,
+ 0x64, 0x73, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01,
+ 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52,
+ 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xd1,
+ 0x01, 0x0a, 0x33, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x69,
+ 0x6e, 0x67, 0x54, 0x78, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d,
+ 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x61, 0x64, 0x64, 0x54, 0x78, 0x49,
+ 0x44, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x61, 0x64, 0x64, 0x54, 0x78, 0x49,
+ 0x44, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x78, 0x49, 0x44,
+ 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x54,
+ 0x78, 0x49, 0x44, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64,
+ 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20,
+ 0x01, 0x28, 0x0d, 0x52, 0x15, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x43, 0x6f, 0x6e,
+ 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x69, 0x6e,
+ 0x63, 0x6c, 0x75, 0x64, 0x65, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x04, 0x20, 0x01,
+ 0x28, 0x08, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x50, 0x65, 0x6e, 0x64, 0x69,
+ 0x6e, 0x67, 0x22, 0x62, 0x0a, 0x34, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x4e, 0x6f, 0x74, 0x69,
+ 0x66, 0x79, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f,
+ 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72,
+ 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f,
+ 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52,
+ 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x66, 0x0a, 0x10, 0x54, 0x78, 0x45, 0x6e, 0x74, 0x72,
+ 0x79, 0x42, 0x79, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64,
+ 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64,
+ 0x72, 0x65, 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x78, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01,
+ 0x28, 0x09, 0x52, 0x04, 0x74, 0x78, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x66,
+ 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52,
+ 0x0d, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x80,
+ 0x01, 0x0a, 0x14, 0x54, 0x78, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x42, 0x79, 0x41, 0x64,
+ 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x12, 0x2f, 0x0a, 0x04, 0x73, 0x65, 0x6e, 0x74, 0x18,
+ 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72,
+ 0x65, 0x2e, 0x54, 0x78, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x79, 0x41, 0x64, 0x64, 0x72, 0x65,
+ 0x73, 0x73, 0x52, 0x04, 0x73, 0x65, 0x6e, 0x74, 0x12, 0x37, 0x0a, 0x08, 0x72, 0x65, 0x63, 0x65,
+ 0x69, 0x76, 0x65, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x70, 0x72, 0x6f,
+ 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x54, 0x78, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x79,
+ 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x08, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65,
+ 0x64, 0x22, 0xf2, 0x01, 0x0a, 0x20, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x41, 0x64, 0x64, 0x72,
+ 0x65, 0x73, 0x73, 0x65, 0x73, 0x54, 0x78, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d,
+ 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73,
+ 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x64, 0x64, 0x72, 0x65,
+ 0x73, 0x73, 0x65, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64,
+ 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20,
+ 0x01, 0x28, 0x0d, 0x52, 0x15, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x43, 0x6f, 0x6e,
+ 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x69, 0x6e,
+ 0x63, 0x6c, 0x75, 0x64, 0x65, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01,
+ 0x28, 0x08, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x50, 0x65, 0x6e, 0x64, 0x69,
+ 0x6e, 0x67, 0x12, 0x26, 0x0a, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x53, 0x65, 0x6e,
+ 0x64, 0x69, 0x6e, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c,
+ 0x75, 0x64, 0x65, 0x53, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x2a, 0x0a, 0x10, 0x69, 0x6e,
+ 0x63, 0x6c, 0x75, 0x64, 0x65, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x69, 0x6e, 0x67, 0x18, 0x05,
+ 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x52, 0x65, 0x63,
+ 0x65, 0x69, 0x76, 0x69, 0x6e, 0x67, 0x22, 0x4f, 0x0a, 0x21, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79,
+ 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x54, 0x78, 0x73, 0x52, 0x65, 0x73, 0x70,
0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2a, 0x0a, 0x05, 0x65,
0x72, 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72,
0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72,
- 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x25, 0x0a, 0x23, 0x4e, 0x65, 0x77, 0x42, 0x6c,
- 0x6f, 0x63, 0x6b, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x74, 0x69, 0x66,
- 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x9b,
- 0x01, 0x0a, 0x15, 0x4d, 0x65, 0x6d, 0x70, 0x6f, 0x6f, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42,
- 0x79, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72,
- 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65,
- 0x73, 0x73, 0x12, 0x31, 0x0a, 0x07, 0x73, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20,
- 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e,
- 0x4d, 0x65, 0x6d, 0x70, 0x6f, 0x6f, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x73, 0x65,
- 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x35, 0x0a, 0x09, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x69,
- 0x6e, 0x67, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
- 0x77, 0x69, 0x72, 0x65, 0x2e, 0x4d, 0x65, 0x6d, 0x70, 0x6f, 0x6f, 0x6c, 0x45, 0x6e, 0x74, 0x72,
- 0x79, 0x52, 0x09, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x69, 0x6e, 0x67, 0x22, 0xae, 0x01, 0x0a,
- 0x2a, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x70, 0x6f, 0x6f, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x69,
- 0x65, 0x73, 0x42, 0x79, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x52, 0x65, 0x71,
- 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61,
- 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09,
- 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x69, 0x6e, 0x63,
- 0x6c, 0x75, 0x64, 0x65, 0x4f, 0x72, 0x70, 0x68, 0x61, 0x6e, 0x50, 0x6f, 0x6f, 0x6c, 0x18, 0x02,
- 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x4f, 0x72, 0x70,
- 0x68, 0x61, 0x6e, 0x50, 0x6f, 0x6f, 0x6c, 0x12, 0x34, 0x0a, 0x15, 0x66, 0x69, 0x6c, 0x74, 0x65,
- 0x72, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6f, 0x6c,
- 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x54, 0x72,
- 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6f, 0x6c, 0x22, 0x95, 0x01,
- 0x0a, 0x2b, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x70, 0x6f, 0x6f, 0x6c, 0x45, 0x6e, 0x74, 0x72,
- 0x69, 0x65, 0x73, 0x42, 0x79, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x52, 0x65,
- 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x3a, 0x0a,
- 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20,
- 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x4d, 0x65, 0x6d, 0x70, 0x6f,
- 0x6f, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x79, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73,
- 0x52, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, 0x72,
- 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74,
- 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05,
- 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x1d, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x69, 0x6e,
- 0x53, 0x75, 0x70, 0x70, 0x6c, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73,
- 0x73, 0x61, 0x67, 0x65, 0x22, 0x92, 0x01, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x69, 0x6e,
- 0x53, 0x75, 0x70, 0x70, 0x6c, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65,
- 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x53, 0x6f, 0x6d, 0x70,
- 0x69, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x53, 0x6f, 0x6d, 0x70,
- 0x69, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6e, 0x67,
- 0x53, 0x6f, 0x6d, 0x70, 0x69, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x63, 0x69, 0x72,
- 0x63, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x6f, 0x6d, 0x70, 0x69, 0x12, 0x2a, 0x0a,
- 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e,
- 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72,
- 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x42, 0x26, 0x5a, 0x24, 0x67, 0x69, 0x74,
- 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6b, 0x61, 0x73, 0x70, 0x61, 0x6e, 0x65, 0x74,
- 0x2f, 0x6b, 0x61, 0x73, 0x70, 0x61, 0x64, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72,
- 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+ 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xab, 0x02, 0x0a, 0x29, 0x4d, 0x6f, 0x64, 0x69,
+ 0x66, 0x79, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x69, 0x6e, 0x67, 0x41, 0x64, 0x64, 0x72, 0x65,
+ 0x73, 0x73, 0x65, 0x73, 0x54, 0x78, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65,
+ 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x41, 0x64, 0x64, 0x72,
+ 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x41, 0x64, 0x64,
+ 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x12, 0x28, 0x0a, 0x0f, 0x52, 0x65, 0x6d,
+ 0x6f, 0x76, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03,
+ 0x28, 0x09, 0x52, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73,
+ 0x73, 0x65, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x43,
+ 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01,
+ 0x28, 0x0d, 0x52, 0x15, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x66,
+ 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x69, 0x6e, 0x63,
+ 0x6c, 0x75, 0x64, 0x65, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28,
+ 0x08, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e,
+ 0x67, 0x12, 0x26, 0x0a, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x53, 0x65, 0x6e, 0x64,
+ 0x69, 0x6e, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75,
+ 0x64, 0x65, 0x53, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x2a, 0x0a, 0x10, 0x69, 0x6e, 0x63,
+ 0x6c, 0x75, 0x64, 0x65, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x69, 0x6e, 0x67, 0x18, 0x06, 0x20,
+ 0x01, 0x28, 0x08, 0x52, 0x10, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x52, 0x65, 0x63, 0x65,
+ 0x69, 0x76, 0x69, 0x6e, 0x67, 0x22, 0x58, 0x0a, 0x2a, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x4e,
+ 0x6f, 0x74, 0x69, 0x66, 0x79, 0x69, 0x6e, 0x67, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65,
+ 0x73, 0x54, 0x78, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73,
+ 0x61, 0x67, 0x65, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20,
+ 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e,
+ 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22,
+ 0x94, 0x02, 0x0a, 0x1f, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x54, 0x78, 0x73,
+ 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x73, 0x73,
+ 0x61, 0x67, 0x65, 0x12, 0x34, 0x0a, 0x15, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x43,
+ 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01,
+ 0x28, 0x0d, 0x52, 0x15, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x66,
+ 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x39, 0x0a, 0x07, 0x70, 0x65, 0x6e,
+ 0x64, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x70, 0x72, 0x6f,
+ 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x54, 0x78, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73,
+ 0x42, 0x79, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x52, 0x07, 0x70, 0x65, 0x6e,
+ 0x64, 0x69, 0x6e, 0x67, 0x12, 0x3d, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65,
+ 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77,
+ 0x69, 0x72, 0x65, 0x2e, 0x54, 0x78, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x42, 0x79, 0x41,
+ 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x52, 0x09, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72,
+ 0x6d, 0x65, 0x64, 0x12, 0x41, 0x0a, 0x0b, 0x75, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d,
+ 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+ 0x77, 0x69, 0x72, 0x65, 0x2e, 0x54, 0x78, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x42, 0x79,
+ 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x52, 0x0b, 0x75, 0x6e, 0x63, 0x6f, 0x6e,
+ 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x42, 0x26, 0x5a, 0x24, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62,
+ 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6b, 0x61, 0x73, 0x70, 0x61, 0x6e, 0x65, 0x74, 0x2f, 0x6b, 0x61,
+ 0x73, 0x70, 0x61, 0x64, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x62, 0x06,
+ 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}
var (
@@ -6933,7 +8526,7 @@ func file_rpc_proto_rawDescGZIP() []byte {
}
var file_rpc_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
-var file_rpc_proto_msgTypes = make([]protoimpl.MessageInfo, 108)
+var file_rpc_proto_msgTypes = make([]protoimpl.MessageInfo, 131)
var file_rpc_proto_goTypes = []interface{}{
(SubmitBlockResponseMessage_RejectReason)(0), // 0: protowire.SubmitBlockResponseMessage.RejectReason
(*RPCError)(nil), // 1: protowire.RPCError
@@ -7034,16 +8627,39 @@ var file_rpc_proto_goTypes = []interface{}{
(*UnbanResponseMessage)(nil), // 96: protowire.UnbanResponseMessage
(*GetInfoRequestMessage)(nil), // 97: protowire.GetInfoRequestMessage
(*GetInfoResponseMessage)(nil), // 98: protowire.GetInfoResponseMessage
- (*EstimateNetworkHashesPerSecondRequestMessage)(nil), // 99: protowire.EstimateNetworkHashesPerSecondRequestMessage
- (*EstimateNetworkHashesPerSecondResponseMessage)(nil), // 100: protowire.EstimateNetworkHashesPerSecondResponseMessage
- (*NotifyNewBlockTemplateRequestMessage)(nil), // 101: protowire.NotifyNewBlockTemplateRequestMessage
- (*NotifyNewBlockTemplateResponseMessage)(nil), // 102: protowire.NotifyNewBlockTemplateResponseMessage
- (*NewBlockTemplateNotificationMessage)(nil), // 103: protowire.NewBlockTemplateNotificationMessage
- (*MempoolEntryByAddress)(nil), // 104: protowire.MempoolEntryByAddress
- (*GetMempoolEntriesByAddressesRequestMessage)(nil), // 105: protowire.GetMempoolEntriesByAddressesRequestMessage
- (*GetMempoolEntriesByAddressesResponseMessage)(nil), // 106: protowire.GetMempoolEntriesByAddressesResponseMessage
- (*GetCoinSupplyRequestMessage)(nil), // 107: protowire.GetCoinSupplyRequestMessage
- (*GetCoinSupplyResponseMessage)(nil), // 108: protowire.GetCoinSupplyResponseMessage
+ (*GetAcceptingBlockHashOfTxRequestMessage)(nil), // 99: protowire.GetAcceptingBlockHashOfTxRequestMessage
+ (*GetAcceptingBlockHashOfTxResponseMessage)(nil), // 100: protowire.GetAcceptingBlockHashOfTxResponseMessage
+ (*EstimateNetworkHashesPerSecondRequestMessage)(nil), // 101: protowire.EstimateNetworkHashesPerSecondRequestMessage
+ (*EstimateNetworkHashesPerSecondResponseMessage)(nil), // 102: protowire.EstimateNetworkHashesPerSecondResponseMessage
+ (*NotifyNewBlockTemplateRequestMessage)(nil), // 103: protowire.NotifyNewBlockTemplateRequestMessage
+ (*NotifyNewBlockTemplateResponseMessage)(nil), // 104: protowire.NotifyNewBlockTemplateResponseMessage
+ (*NewBlockTemplateNotificationMessage)(nil), // 105: protowire.NewBlockTemplateNotificationMessage
+ (*MempoolEntryByAddress)(nil), // 106: protowire.MempoolEntryByAddress
+ (*GetMempoolEntriesByAddressesRequestMessage)(nil), // 107: protowire.GetMempoolEntriesByAddressesRequestMessage
+ (*GetMempoolEntriesByAddressesResponseMessage)(nil), // 108: protowire.GetMempoolEntriesByAddressesResponseMessage
+ (*GetCoinSupplyRequestMessage)(nil), // 109: protowire.GetCoinSupplyRequestMessage
+ (*GetCoinSupplyResponseMessage)(nil), // 110: protowire.GetCoinSupplyResponseMessage
+ (*RpcTxIDConfirmationsPair)(nil), // 111: protowire.RpcTxIDConfirmationsPair
+ (*RpcTxIDBlockHashPair)(nil), // 112: protowire.RpcTxIDBlockHashPair
+ (*RpcTxIDBlockPair)(nil), // 113: protowire.RpcTxIDBlockPair
+ (*GetAcceptingBlockHashesOfTxsRequestMessage)(nil), // 114: protowire.GetAcceptingBlockHashesOfTxsRequestMessage
+ (*GetAcceptingBlockHashesOfTxsResponseMessage)(nil), // 115: protowire.GetAcceptingBlockHashesOfTxsResponseMessage
+ (*GetTxsRequestMessage)(nil), // 116: protowire.GetTxsRequestMessage
+ (*GetTxsResponseMessage)(nil), // 117: protowire.GetTxsResponseMessage
+ (*GetTxsConfirmationsRequestMessage)(nil), // 118: protowire.GetTxsConfirmationsRequestMessage
+ (*GetTxsConfirmationsResponseMessage)(nil), // 119: protowire.GetTxsConfirmationsResponseMessage
+ (*NotifyTxsConfirmationChangedRequestMessage)(nil), // 120: protowire.NotifyTxsConfirmationChangedRequestMessage
+ (*NotifyTxsConfirmationChangedResponseMessage)(nil), // 121: protowire.NotifyTxsConfirmationChangedResponseMessage
+ (*TxsConfirmationChangedNotificationMessage)(nil), // 122: protowire.TxsConfirmationChangedNotificationMessage
+ (*ModifyNotifyingTxsConfirmationChangedRequestMessage)(nil), // 123: protowire.ModifyNotifyingTxsConfirmationChangedRequestMessage
+ (*ModifyNotifyingTxsConfirmationChangedResponseMessage)(nil), // 124: protowire.ModifyNotifyingTxsConfirmationChangedResponseMessage
+ (*TxEntryByAddress)(nil), // 125: protowire.TxEntryByAddress
+ (*TxEntriesByAddresses)(nil), // 126: protowire.TxEntriesByAddresses
+ (*NotifyAddressesTxsRequestMessage)(nil), // 127: protowire.NotifyAddressesTxsRequestMessage
+ (*NotifyAddressesTxsResponseMessage)(nil), // 128: protowire.NotifyAddressesTxsResponseMessage
+ (*ModifyNotifyingAddressesTxsRequestMessage)(nil), // 129: protowire.ModifyNotifyingAddressesTxsRequestMessage
+ (*ModifyNotifyingAddressesTxsResponseMessage)(nil), // 130: protowire.ModifyNotifyingAddressesTxsResponseMessage
+ (*AddressesTxsNotificationMessage)(nil), // 131: protowire.AddressesTxsNotificationMessage
}
var file_rpc_proto_depIdxs = []int32{
3, // 0: protowire.RpcBlock.header:type_name -> protowire.RpcBlockHeader
@@ -7115,18 +8731,38 @@ var file_rpc_proto_depIdxs = []int32{
1, // 66: protowire.BanResponseMessage.error:type_name -> protowire.RPCError
1, // 67: protowire.UnbanResponseMessage.error:type_name -> protowire.RPCError
1, // 68: protowire.GetInfoResponseMessage.error:type_name -> protowire.RPCError
- 1, // 69: protowire.EstimateNetworkHashesPerSecondResponseMessage.error:type_name -> protowire.RPCError
- 1, // 70: protowire.NotifyNewBlockTemplateResponseMessage.error:type_name -> protowire.RPCError
- 33, // 71: protowire.MempoolEntryByAddress.sending:type_name -> protowire.MempoolEntry
- 33, // 72: protowire.MempoolEntryByAddress.receiving:type_name -> protowire.MempoolEntry
- 104, // 73: protowire.GetMempoolEntriesByAddressesResponseMessage.entries:type_name -> protowire.MempoolEntryByAddress
- 1, // 74: protowire.GetMempoolEntriesByAddressesResponseMessage.error:type_name -> protowire.RPCError
- 1, // 75: protowire.GetCoinSupplyResponseMessage.error:type_name -> protowire.RPCError
- 76, // [76:76] is the sub-list for method output_type
- 76, // [76:76] is the sub-list for method input_type
- 76, // [76:76] is the sub-list for extension type_name
- 76, // [76:76] is the sub-list for extension extendee
- 0, // [0:76] is the sub-list for field type_name
+ 1, // 69: protowire.GetAcceptingBlockHashOfTxResponseMessage.error:type_name -> protowire.RPCError
+ 1, // 70: protowire.EstimateNetworkHashesPerSecondResponseMessage.error:type_name -> protowire.RPCError
+ 1, // 71: protowire.NotifyNewBlockTemplateResponseMessage.error:type_name -> protowire.RPCError
+ 33, // 72: protowire.MempoolEntryByAddress.sending:type_name -> protowire.MempoolEntry
+ 33, // 73: protowire.MempoolEntryByAddress.receiving:type_name -> protowire.MempoolEntry
+ 106, // 74: protowire.GetMempoolEntriesByAddressesResponseMessage.entries:type_name -> protowire.MempoolEntryByAddress
+ 1, // 75: protowire.GetMempoolEntriesByAddressesResponseMessage.error:type_name -> protowire.RPCError
+ 1, // 76: protowire.GetCoinSupplyResponseMessage.error:type_name -> protowire.RPCError
+ 2, // 77: protowire.RpcTxIDBlockPair.block:type_name -> protowire.RpcBlock
+ 112, // 78: protowire.GetAcceptingBlockHashesOfTxsResponseMessage.txIDBlockHashPairs:type_name -> protowire.RpcTxIDBlockHashPair
+ 1, // 79: protowire.GetAcceptingBlockHashesOfTxsResponseMessage.error:type_name -> protowire.RPCError
+ 6, // 80: protowire.GetTxsResponseMessage.transactions:type_name -> protowire.RpcTransaction
+ 1, // 81: protowire.GetTxsResponseMessage.error:type_name -> protowire.RPCError
+ 111, // 82: protowire.GetTxsConfirmationsResponseMessage.txIDConfirmationsPairs:type_name -> protowire.RpcTxIDConfirmationsPair
+ 1, // 83: protowire.GetTxsConfirmationsResponseMessage.error:type_name -> protowire.RPCError
+ 1, // 84: protowire.NotifyTxsConfirmationChangedResponseMessage.error:type_name -> protowire.RPCError
+ 111, // 85: protowire.TxsConfirmationChangedNotificationMessage.pending:type_name -> protowire.RpcTxIDConfirmationsPair
+ 111, // 86: protowire.TxsConfirmationChangedNotificationMessage.confirmed:type_name -> protowire.RpcTxIDConfirmationsPair
+ 1, // 87: protowire.TxsConfirmationChangedNotificationMessage.error:type_name -> protowire.RPCError
+ 1, // 88: protowire.ModifyNotifyingTxsConfirmationChangedResponseMessage.error:type_name -> protowire.RPCError
+ 125, // 89: protowire.TxEntriesByAddresses.sent:type_name -> protowire.TxEntryByAddress
+ 125, // 90: protowire.TxEntriesByAddresses.received:type_name -> protowire.TxEntryByAddress
+ 1, // 91: protowire.NotifyAddressesTxsResponseMessage.error:type_name -> protowire.RPCError
+ 1, // 92: protowire.ModifyNotifyingAddressesTxsResponseMessage.error:type_name -> protowire.RPCError
+ 126, // 93: protowire.AddressesTxsNotificationMessage.pending:type_name -> protowire.TxEntriesByAddresses
+ 126, // 94: protowire.AddressesTxsNotificationMessage.confirmed:type_name -> protowire.TxEntriesByAddresses
+ 126, // 95: protowire.AddressesTxsNotificationMessage.unconfirmed:type_name -> protowire.TxEntriesByAddresses
+ 96, // [96:96] is the sub-list for method output_type
+ 96, // [96:96] is the sub-list for method input_type
+ 96, // [96:96] is the sub-list for extension type_name
+ 96, // [96:96] is the sub-list for extension extendee
+ 0, // [0:96] is the sub-list for field type_name
}
func init() { file_rpc_proto_init() }
@@ -8312,7 +9948,7 @@ func file_rpc_proto_init() {
}
}
file_rpc_proto_msgTypes[98].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*EstimateNetworkHashesPerSecondRequestMessage); i {
+ switch v := v.(*GetAcceptingBlockHashOfTxRequestMessage); i {
case 0:
return &v.state
case 1:
@@ -8324,7 +9960,7 @@ func file_rpc_proto_init() {
}
}
file_rpc_proto_msgTypes[99].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*EstimateNetworkHashesPerSecondResponseMessage); i {
+ switch v := v.(*GetAcceptingBlockHashOfTxResponseMessage); i {
case 0:
return &v.state
case 1:
@@ -8336,7 +9972,7 @@ func file_rpc_proto_init() {
}
}
file_rpc_proto_msgTypes[100].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*NotifyNewBlockTemplateRequestMessage); i {
+ switch v := v.(*EstimateNetworkHashesPerSecondRequestMessage); i {
case 0:
return &v.state
case 1:
@@ -8348,7 +9984,7 @@ func file_rpc_proto_init() {
}
}
file_rpc_proto_msgTypes[101].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*NotifyNewBlockTemplateResponseMessage); i {
+ switch v := v.(*EstimateNetworkHashesPerSecondResponseMessage); i {
case 0:
return &v.state
case 1:
@@ -8360,7 +9996,7 @@ func file_rpc_proto_init() {
}
}
file_rpc_proto_msgTypes[102].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*NewBlockTemplateNotificationMessage); i {
+ switch v := v.(*NotifyNewBlockTemplateRequestMessage); i {
case 0:
return &v.state
case 1:
@@ -8372,7 +10008,7 @@ func file_rpc_proto_init() {
}
}
file_rpc_proto_msgTypes[103].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*MempoolEntryByAddress); i {
+ switch v := v.(*NotifyNewBlockTemplateResponseMessage); i {
case 0:
return &v.state
case 1:
@@ -8384,7 +10020,7 @@ func file_rpc_proto_init() {
}
}
file_rpc_proto_msgTypes[104].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*GetMempoolEntriesByAddressesRequestMessage); i {
+ switch v := v.(*NewBlockTemplateNotificationMessage); i {
case 0:
return &v.state
case 1:
@@ -8396,7 +10032,7 @@ func file_rpc_proto_init() {
}
}
file_rpc_proto_msgTypes[105].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*GetMempoolEntriesByAddressesResponseMessage); i {
+ switch v := v.(*MempoolEntryByAddress); i {
case 0:
return &v.state
case 1:
@@ -8408,7 +10044,7 @@ func file_rpc_proto_init() {
}
}
file_rpc_proto_msgTypes[106].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*GetCoinSupplyRequestMessage); i {
+ switch v := v.(*GetMempoolEntriesByAddressesRequestMessage); i {
case 0:
return &v.state
case 1:
@@ -8420,6 +10056,30 @@ func file_rpc_proto_init() {
}
}
file_rpc_proto_msgTypes[107].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*GetMempoolEntriesByAddressesResponseMessage); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_rpc_proto_msgTypes[108].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*GetCoinSupplyRequestMessage); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_rpc_proto_msgTypes[109].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*GetCoinSupplyResponseMessage); i {
case 0:
return &v.state
@@ -8431,6 +10091,258 @@ func file_rpc_proto_init() {
return nil
}
}
+ file_rpc_proto_msgTypes[110].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*RpcTxIDConfirmationsPair); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_rpc_proto_msgTypes[111].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*RpcTxIDBlockHashPair); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_rpc_proto_msgTypes[112].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*RpcTxIDBlockPair); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_rpc_proto_msgTypes[113].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*GetAcceptingBlockHashesOfTxsRequestMessage); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_rpc_proto_msgTypes[114].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*GetAcceptingBlockHashesOfTxsResponseMessage); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_rpc_proto_msgTypes[115].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*GetTxsRequestMessage); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_rpc_proto_msgTypes[116].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*GetTxsResponseMessage); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_rpc_proto_msgTypes[117].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*GetTxsConfirmationsRequestMessage); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_rpc_proto_msgTypes[118].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*GetTxsConfirmationsResponseMessage); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_rpc_proto_msgTypes[119].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*NotifyTxsConfirmationChangedRequestMessage); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_rpc_proto_msgTypes[120].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*NotifyTxsConfirmationChangedResponseMessage); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_rpc_proto_msgTypes[121].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*TxsConfirmationChangedNotificationMessage); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_rpc_proto_msgTypes[122].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*ModifyNotifyingTxsConfirmationChangedRequestMessage); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_rpc_proto_msgTypes[123].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*ModifyNotifyingTxsConfirmationChangedResponseMessage); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_rpc_proto_msgTypes[124].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*TxEntryByAddress); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_rpc_proto_msgTypes[125].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*TxEntriesByAddresses); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_rpc_proto_msgTypes[126].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*NotifyAddressesTxsRequestMessage); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_rpc_proto_msgTypes[127].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*NotifyAddressesTxsResponseMessage); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_rpc_proto_msgTypes[128].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*ModifyNotifyingAddressesTxsRequestMessage); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_rpc_proto_msgTypes[129].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*ModifyNotifyingAddressesTxsResponseMessage); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_rpc_proto_msgTypes[130].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*AddressesTxsNotificationMessage); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
}
type x struct{}
out := protoimpl.TypeBuilder{
@@ -8438,7 +10350,7 @@ func file_rpc_proto_init() {
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
RawDescriptor: file_rpc_proto_rawDesc,
NumEnums: 1,
- NumMessages: 108,
+ NumMessages: 131,
NumExtensions: 0,
NumServices: 0,
},
diff --git a/infrastructure/network/netadapter/server/grpcserver/protowire/rpc.proto b/infrastructure/network/netadapter/server/grpcserver/protowire/rpc.proto
index 81919c9540..b0ce2aa4c5 100644
--- a/infrastructure/network/netadapter/server/grpcserver/protowire/rpc.proto
+++ b/infrastructure/network/netadapter/server/grpcserver/protowire/rpc.proto
@@ -105,6 +105,9 @@ message RpcTransactionVerboseData{
uint64 mass = 4;
string blockHash = 12;
uint64 blockTime = 14;
+ bool txIndexed = 15; //whether the transaction is stored in the txindex database, regardless if kaspad is run with the `--txindex` flag, or not.
+ string acceptingBlockHash = 16; // Kaspad must be started with the `--txindex` flag, for parameter to display.
+ uint32 confirmations = 17; // Kaspad must be started with the `--txindex` flag for parameter to display.
}
message RpcTransactionInputVerboseData{
@@ -662,10 +665,25 @@ message GetInfoResponseMessage{
uint64 mempoolSize = 2;
string serverVersion = 3;
bool isUtxoIndexed = 4;
- bool isSynced = 5;
+ bool isTxIndexed = 5;
+ bool isArchival = 6;
+ bool isSynced = 7;
+
RPCError error = 1000;
}
+
+//Kaspad most be started with the `--txindex` flag for this Request to work.
+message GetAcceptingBlockHashOfTxRequestMessage {
+ string txID = 1;
+}
+
+ //the accepting block is defined as the virtual chain block that first knows about the transaction. This block may change, or be ommitted and resubmitted, during virtual changes at the tip of the blockDAG
+message GetAcceptingBlockHashOfTxResponseMessage {
+ string hash = 1; //the accepting block is defined as the virtual chain block that first knows about the transaction. This block may change, or be ommitted and resubmitted, during virtual changes at the tip of the blockDAG
+ RPCError error = 1000;
+}
+
message EstimateNetworkHashesPerSecondRequestMessage{
uint32 windowSize = 1;
string startHash = 2;
@@ -706,7 +724,7 @@ message GetMempoolEntriesByAddressesRequestMessage{
bool filterTransactionPool = 3;
}
-message GetMempoolEntriesByAddressesResponseMessage{
+message GetMempoolEntriesByAddressesResponseMessage{
repeated MempoolEntryByAddress entries = 1;
RPCError error = 1000;
@@ -721,3 +739,143 @@ message GetCoinSupplyResponseMessage{
RPCError error = 1000;
}
+
+message RpcTxIDConfirmationsPair {
+ string txID = 1;
+ int64 confirmations = 2;
+}
+
+message RpcTxIDBlockHashPair {
+ string txID = 1;
+ string Hash = 2;
+}
+
+message RpcTxIDBlockPair {
+ string txID = 1;
+ RpcBlock block = 2;
+}
+
+// Kaspad must be started with the `--txindex` flag for this Request to work.
+message GetAcceptingBlockHashesOfTxsRequestMessage{
+ repeated string txIDs = 1;
+}
+message GetAcceptingBlockHashesOfTxsResponseMessage{
+ repeated RpcTxIDBlockHashPair txIDBlockHashPairs = 1;
+
+ RPCError error = 1000;
+}
+
+// Kaspad must be started with the `--txindex` flag for this Request to work.
+message GetTxsRequestMessage{
+ repeated string txIDs = 1;
+}
+
+message GetTxsResponseMessage{
+ repeated RpcTransaction transactions = 1;
+
+
+ RPCError error = 1000;
+}
+
+
+// Kaspad must be started with the `--txindex` flag for this Request to work.
+message GetTxsConfirmationsRequestMessage{
+ repeated string txIDs = 1;
+}
+
+message GetTxsConfirmationsResponseMessage{
+ repeated RpcTxIDConfirmationsPair txIDConfirmationsPairs = 1;
+
+ RPCError error = 1000;
+}
+
+// NotifyTxsConfirmationChangedRequstMessage is a listener that registers confirmations from supplied TxIDs
+// Kaspad must be started with the `--txindex` flag for this Request to work.
+// Note: this listener will try to retroactively confirm historic txs when such TxIds are added. But, any confirmed txIds supplied beyond pruning (~3 days),
+// will erroneously be displayed as unconfirmed, since it will be missing from the kaspad's pruned txindex database.
+message NotifyTxsConfirmationChangedRequestMessage{
+ repeated string TxIDs = 1; //initial TxIds to listen for when regestering for notifications
+
+ uint32 requiredConfirmations = 2; // number of confirmations until a transaction is considered confirmed
+ bool includePending = 3; // weather to notify confirmation changes during pre-Confirmed states
+
+}
+
+message NotifyTxsConfirmationChangedResponseMessage{
+
+ RPCError error = 1000;
+}
+
+// TxsConfirmationChangedNotificationMessage is the notification about txs pertaining to specified TxIDs
+message TxsConfirmationChangedNotificationMessage{
+ uint32 requiredConfirmations = 1; //the required confirmations set when notification was sent
+ repeated RpcTxIDConfirmationsPair pending = 2; // RpcTxIDConfirmationsPairs which have entered the virtual chain but not passed the required confirmations
+ repeated RpcTxIDConfirmationsPair confirmed = 3; // RpcTxIDConfirmationsPairs which have entered the virtual chain and passed the required confirmations
+ repeated string unconfirmedTxIds = 4; // TxIds which were not confirmed within the required confirmations.
+
+ RPCError error = 1000;
+}
+
+// ModifyNotifyingTxsConfirmationChangedRequestMessage modfies the params of a registered `NotifyTxsConfirmationChangedRequstMessage`
+// must be registered to NotifyTxsConfirmationChangedRequstMessage for this command to work
+message ModifyNotifyingTxsConfirmationChangedRequestMessage{
+ repeated string addTxIDs = 1; //add txIds to the notification stream
+ repeated string removeTxIDs = 2; //remove txIds to the notification stream
+ uint32 requiredConfirmations = 3;
+ bool includePending = 4;
+}
+
+message ModifyNotifyingTxsConfirmationChangedResponseMessage{
+ RPCError error = 1000;
+}
+
+message TxEntryByAddress{
+ string address = 1;
+ string txId = 2;
+ uint32 confirmations = 3;
+ }
+
+message TxEntriesByAddresses{
+ repeated TxEntryByAddress sent = 1;
+ repeated TxEntryByAddress received = 2;
+ }
+
+// NotifyAddressesTxsChangedRequestMessage Listens for Txs pertaining to specified addresses according to the params specified
+// Kaspad must be started with the `--txindex` flag for this Request to work.
+// Note: this listener will not try to retroactively confirm historic txs pertaining to specified addresses when new addresses are added.
+// as such, add addresses / start listener before incoming transactions are expected.
+message NotifyAddressesTxsRequestMessage{
+ repeated string addresses = 1; //initial addresses to listen for Tx changes when regestering for notifications
+ uint32 requiredConfirmations = 2; // number of confirmations until a transaction is considered confirmed
+ bool includePending = 3; //whether to notify confirmation changes during pre-Confirmed states
+ bool includeSending = 4; //whether to listen on addresses sending txs
+ bool includeReceiving = 5; //whether to listen on addresses reciving txs
+}
+
+message NotifyAddressesTxsResponseMessage{
+ RPCError error = 1000;
+}
+
+// ModifyNotifyAddressesTxsParamsRequestMessage modifies the params used for a regesitered `NotifyAddressesTxsRequest`
+// Must be registered to NotifyAddressTxChangedRequestMessage for this command to work
+message ModifyNotifyingAddressesTxsRequestMessage{
+ repeated string AddAddresses = 1; //add addresses to the notification stream
+ repeated string RemoveAddresses = 2; //remove addresses to the notification stream
+ uint32 requiredConfirmations = 3;
+ bool includePending = 4;
+ bool includeSending = 5;
+ bool includeReceiving = 6;
+}
+
+message ModifyNotifyingAddressesTxsResponseMessage{
+
+ RPCError error = 1000;
+}
+
+// AddressesTxsNotificationMessage is the notification about txs pertaining to specified addresses
+message AddressesTxsNotificationMessage{
+ uint32 requiredConfirmations = 1; //the required confirmations set when notification was sent
+ TxEntriesByAddresses pending = 2; // TxEntriesByAddresses which have entered the blockdag but not passed the required confirmations
+ TxEntriesByAddresses confirmed = 3; // TxEntriesByAddresses which have entered the blockdag and passed the required confirmations
+ TxEntriesByAddresses unconfirmed = 4; // TxEntriesByAddresses which have been pending, but removed via a reorg within the number of required confirmations.
+}
\ No newline at end of file
diff --git a/infrastructure/network/netadapter/server/grpcserver/protowire/rpc_get_accepting_blockhashes_of_txs.go b/infrastructure/network/netadapter/server/grpcserver/protowire/rpc_get_accepting_blockhashes_of_txs.go
new file mode 100644
index 0000000000..20aeb8f281
--- /dev/null
+++ b/infrastructure/network/netadapter/server/grpcserver/protowire/rpc_get_accepting_blockhashes_of_txs.go
@@ -0,0 +1,104 @@
+package protowire
+
+import (
+ "github.com/kaspanet/kaspad/app/appmessage"
+ "github.com/pkg/errors"
+)
+
+func (x *KaspadMessage_GetAcceptingBlockHashesOfTxsRequest) toAppMessage() (appmessage.Message, error) {
+ if x == nil {
+ return nil, errors.Wrapf(errorNil, "KaspadMessage_GetAcceptingBlockHashesOfTxsRequest")
+ }
+ return x.GetAcceptingBlockHashesOfTxsRequest.toAppMessage()
+}
+
+func (x *KaspadMessage_GetAcceptingBlockHashesOfTxsRequest) fromAppMessage(message *appmessage.GetAcceptingBlockHashesOfTxsRequestMessage) error {
+ x.GetAcceptingBlockHashesOfTxsRequest = &GetAcceptingBlockHashesOfTxsRequestMessage{
+ TxIDs: message.TxIDs,
+ }
+ return nil
+}
+
+func (x *GetAcceptingBlockHashesOfTxsRequestMessage) toAppMessage() (appmessage.Message, error) {
+ if x == nil {
+ return nil, errors.Wrapf(errorNil, "GetAcceptingBlockHashesOfTxsRequestMessage is nil")
+ }
+ return &appmessage.GetAcceptingBlockHashesOfTxsRequestMessage{
+ TxIDs: x.TxIDs,
+ }, nil
+}
+
+func (x *KaspadMessage_GetAcceptingBlockHashesOfTxsResponse) toAppMessage() (appmessage.Message, error) {
+
+ if x == nil {
+ return nil, errors.Wrapf(errorNil, "KaspadMessage_GetAcceptingBlockHashesOfTxsResponse is nil")
+ }
+ return x.GetAcceptingBlockHashesOfTxsResponse.toAppMessage()
+}
+
+func (x *KaspadMessage_GetAcceptingBlockHashesOfTxsResponse) fromAppMessage(message *appmessage.GetAcceptingBlockHashesOfTxsResponseMessage) error {
+ var rpcErr *RPCError
+ if message.Error != nil {
+ rpcErr = &RPCError{Message: message.Error.Message}
+ }
+
+ rpcTxIDBlockHashPairs := make([]*RpcTxIDBlockHashPair, len(message.TxIDBlockHashPairs))
+ for i := range rpcTxIDBlockHashPairs {
+ rpcTxIDBlockHashPairs[i] = &RpcTxIDBlockHashPair{}
+ rpcTxIDBlockHashPairs[i].fromAppMessage(message.TxIDBlockHashPairs[i])
+ }
+
+ x.GetAcceptingBlockHashesOfTxsResponse = &GetAcceptingBlockHashesOfTxsResponseMessage{
+ TxIDBlockHashPairs: rpcTxIDBlockHashPairs,
+
+ Error: rpcErr,
+ }
+ return nil
+}
+
+func (x *GetAcceptingBlockHashesOfTxsResponseMessage) toAppMessage() (appmessage.Message, error) {
+ if x == nil {
+ return nil, errors.Wrapf(errorNil, "GetAcceptingBlockHashesOfTxsResponseMessage is nil")
+ }
+ rpcErr, err := x.Error.toAppMessage()
+ // Error is an optional field
+ if err != nil && !errors.Is(err, errorNil) {
+ return nil, err
+ }
+
+ if rpcErr != nil && x.TxIDBlockHashPairs != nil {
+ return nil, errors.New("GetAcceptingBlockHashesfTxsResponseMessage contains both an error and a response")
+ }
+
+ appTxIDBlockHashPairs := make([]*appmessage.TxIDBlockHashPair, len(x.TxIDBlockHashPairs))
+ for i := range appTxIDBlockHashPairs {
+ appTxIDBlockHashPairs[i], err = x.TxIDBlockHashPairs[i].toAppMessage()
+ if err != nil {
+ return nil, err
+ }
+ }
+
+ return &appmessage.GetAcceptingBlockHashesOfTxsResponseMessage{
+ TxIDBlockHashPairs: appTxIDBlockHashPairs,
+ Error: rpcErr,
+ }, nil
+}
+
+func (x *RpcTxIDBlockHashPair) toAppMessage() (*appmessage.TxIDBlockHashPair, error) {
+ if x == nil {
+ return nil, errors.Wrapf(errorNil, "TxIDBlockHashPair is nil")
+ }
+
+ return &appmessage.TxIDBlockHashPair{
+ TxID: x.TxID,
+ Hash: x.Hash,
+ }, nil
+}
+
+func (x *RpcTxIDBlockHashPair) fromAppMessage(message *appmessage.TxIDBlockHashPair) {
+
+ *x = RpcTxIDBlockHashPair{
+ TxID: message.TxID,
+ Hash: message.Hash,
+ }
+}
diff --git a/infrastructure/network/netadapter/server/grpcserver/protowire/rpc_get_info.go b/infrastructure/network/netadapter/server/grpcserver/protowire/rpc_get_info.go
index a75f07dd73..ed85c44abb 100644
--- a/infrastructure/network/netadapter/server/grpcserver/protowire/rpc_get_info.go
+++ b/infrastructure/network/netadapter/server/grpcserver/protowire/rpc_get_info.go
@@ -31,6 +31,8 @@ func (x *KaspadMessage_GetInfoResponse) fromAppMessage(message *appmessage.GetIn
ServerVersion: message.ServerVersion,
MempoolSize: message.MempoolSize,
IsUtxoIndexed: message.IsUtxoIndexed,
+ IsTxIndexed: message.IsTxIndexed,
+ IsArchival: message.IsArchival,
IsSynced: message.IsSynced,
Error: err,
}
@@ -56,6 +58,8 @@ func (x *GetInfoResponseMessage) toAppMessage() (appmessage.Message, error) {
MempoolSize: x.MempoolSize,
ServerVersion: x.ServerVersion,
IsUtxoIndexed: x.IsUtxoIndexed,
+ IsTxIndexed: x.IsTxIndexed,
+ IsArchival: x.IsArchival,
IsSynced: x.IsSynced,
Error: rpcErr,
diff --git a/infrastructure/network/netadapter/server/grpcserver/protowire/rpc_get_txs.go b/infrastructure/network/netadapter/server/grpcserver/protowire/rpc_get_txs.go
new file mode 100644
index 0000000000..1ad387d461
--- /dev/null
+++ b/infrastructure/network/netadapter/server/grpcserver/protowire/rpc_get_txs.go
@@ -0,0 +1,85 @@
+package protowire
+
+import (
+ "github.com/kaspanet/kaspad/app/appmessage"
+ "github.com/pkg/errors"
+)
+
+func (x *KaspadMessage_GetTxsRequest) toAppMessage() (appmessage.Message, error) {
+ if x == nil {
+ return nil, errors.Wrapf(errorNil, "KaspadMessage_GetTxsRequest")
+ }
+ return x.GetTxsRequest.toAppMessage()
+}
+
+func (x *KaspadMessage_GetTxsRequest) fromAppMessage(message *appmessage.GetTxsRequestMessage) error {
+ x.GetTxsRequest = &GetTxsRequestMessage{
+ TxIDs: message.TxIDs,
+ }
+ return nil
+}
+
+func (x *GetTxsRequestMessage) toAppMessage() (appmessage.Message, error) {
+ if x == nil {
+ return nil, errors.Wrapf(errorNil, "GetTxsRequestMessage is nil")
+ }
+ return &appmessage.GetTxsRequestMessage{
+ TxIDs: x.TxIDs,
+ }, nil
+}
+
+func (x *KaspadMessage_GetTxsResponse) toAppMessage() (appmessage.Message, error) {
+
+ if x == nil {
+ return nil, errors.Wrapf(errorNil, "KaspadMessage_GetTxsResponse is nil")
+ }
+ return x.GetTxsResponse.toAppMessage()
+}
+
+func (x *KaspadMessage_GetTxsResponse) fromAppMessage(message *appmessage.GetTxsResponseMessage) error {
+ var rpcErr *RPCError
+ if message.Error != nil {
+ rpcErr = &RPCError{Message: message.Error.Message}
+ }
+
+ rpcTransactions := make([]*RpcTransaction, len(message.Transactions))
+ for i := range rpcTransactions {
+ rpcTransactions[i] = &RpcTransaction{}
+ rpcTransactions[i].fromAppMessage(message.Transactions[i])
+ }
+
+ x.GetTxsResponse = &GetTxsResponseMessage{
+ Transactions: rpcTransactions,
+
+ Error: rpcErr,
+ }
+ return nil
+}
+
+func (x *GetTxsResponseMessage) toAppMessage() (appmessage.Message, error) {
+ if x == nil {
+ return nil, errors.Wrapf(errorNil, "GetTxsResponseMessage is nil")
+ }
+ rpcErr, err := x.Error.toAppMessage()
+ // Error is an optional field
+ if err != nil && !errors.Is(err, errorNil) {
+ return nil, err
+ }
+
+ if rpcErr != nil && x.Transactions != nil {
+ return nil, errors.New("GetTxsResponseMessage contains both an error and a response")
+ }
+
+ appTransactions := make([]*appmessage.RPCTransaction, len(x.Transactions))
+ for i := range appTransactions {
+ appTransactions[i], err = x.Transactions[i].toAppMessage()
+ if err != nil {
+ return nil, err
+ }
+ }
+
+ return &appmessage.GetTxsResponseMessage{
+ Transactions: appTransactions,
+ Error: rpcErr,
+ }, nil
+}
diff --git a/infrastructure/network/netadapter/server/grpcserver/protowire/rpc_get_txs_confirmations.go b/infrastructure/network/netadapter/server/grpcserver/protowire/rpc_get_txs_confirmations.go
new file mode 100644
index 0000000000..3056e795f1
--- /dev/null
+++ b/infrastructure/network/netadapter/server/grpcserver/protowire/rpc_get_txs_confirmations.go
@@ -0,0 +1,104 @@
+package protowire
+
+import (
+ "github.com/kaspanet/kaspad/app/appmessage"
+ "github.com/pkg/errors"
+)
+
+func (x *KaspadMessage_GetTxsConfirmationsRequest) toAppMessage() (appmessage.Message, error) {
+ if x == nil {
+ return nil, errors.Wrapf(errorNil, "KaspadMessage_GetTxsConfirmationsRequest")
+ }
+ return x.GetTxsConfirmationsRequest.toAppMessage()
+}
+
+func (x *KaspadMessage_GetTxsConfirmationsRequest) fromAppMessage(message *appmessage.GetTxsConfirmationsRequestMessage) error {
+ x.GetTxsConfirmationsRequest = &GetTxsConfirmationsRequestMessage{
+ TxIDs: message.TxIDs,
+ }
+ return nil
+}
+
+func (x *GetTxsConfirmationsRequestMessage) toAppMessage() (appmessage.Message, error) {
+ if x == nil {
+ return nil, errors.Wrapf(errorNil, "GetTxsConfirmationsRequestMessage is nil")
+ }
+ return &appmessage.GetTxsConfirmationsRequestMessage{
+ TxIDs: x.TxIDs,
+ }, nil
+}
+
+func (x *KaspadMessage_GetTxsConfirmationsResponse) toAppMessage() (appmessage.Message, error) {
+
+ if x == nil {
+ return nil, errors.Wrapf(errorNil, "KaspadMessage_GetTxsConfirmationsResponse is nil")
+ }
+ return x.GetTxsConfirmationsResponse.toAppMessage()
+}
+
+func (x *KaspadMessage_GetTxsConfirmationsResponse) fromAppMessage(message *appmessage.GetTxsConfirmationsResponseMessage) error {
+ var rpcErr *RPCError
+ if message.Error != nil {
+ rpcErr = &RPCError{Message: message.Error.Message}
+ }
+
+ rpcTxIDConfirmationsPairs := make([]*RpcTxIDConfirmationsPair, len(message.TxIDConfirmationsPairs))
+ for i := range rpcTxIDConfirmationsPairs {
+ rpcTxIDConfirmationsPairs[i] = &RpcTxIDConfirmationsPair{}
+ rpcTxIDConfirmationsPairs[i].fromAppMessage(message.TxIDConfirmationsPairs[i])
+ }
+
+ x.GetTxsConfirmationsResponse = &GetTxsConfirmationsResponseMessage{
+ TxIDConfirmationsPairs: rpcTxIDConfirmationsPairs,
+
+ Error: rpcErr,
+ }
+ return nil
+}
+
+func (x *GetTxsConfirmationsResponseMessage) toAppMessage() (appmessage.Message, error) {
+ if x == nil {
+ return nil, errors.Wrapf(errorNil, "GetTxsConfirmationsResponseMessage is nil")
+ }
+ rpcErr, err := x.Error.toAppMessage()
+ // Error is an optional field
+ if err != nil && !errors.Is(err, errorNil) {
+ return nil, err
+ }
+
+ if rpcErr != nil && x.TxIDConfirmationsPairs != nil {
+ return nil, errors.New("GetTxsConfirmationsResponseMessage contains both an error and a response")
+ }
+
+ appTxIDConfirmationsPairs := make([]*appmessage.TxIDConfirmationsPair, len(x.TxIDConfirmationsPairs))
+ for i := range appTxIDConfirmationsPairs {
+ appTxIDConfirmationsPairs[i], err = x.TxIDConfirmationsPairs[i].toAppMessage()
+ if err != nil {
+ return nil, err
+ }
+ }
+
+ return &appmessage.GetTxsConfirmationsResponseMessage{
+ TxIDConfirmationsPairs: appTxIDConfirmationsPairs,
+ Error: rpcErr,
+ }, nil
+}
+
+func (x *RpcTxIDConfirmationsPair) toAppMessage() (*appmessage.TxIDConfirmationsPair, error) {
+ if x == nil {
+ return nil, errors.Wrapf(errorNil, "TxIDConfirmationsPair is nil")
+ }
+
+ return &appmessage.TxIDConfirmationsPair{
+ TxID: x.TxID,
+ Confirmations: x.Confirmations,
+ }, nil
+}
+
+func (x *RpcTxIDConfirmationsPair) fromAppMessage(message *appmessage.TxIDConfirmationsPair) {
+
+ *x = RpcTxIDConfirmationsPair{
+ TxID: message.TxID,
+ Confirmations: message.Confirmations,
+ }
+}
diff --git a/infrastructure/network/netadapter/server/grpcserver/protowire/rpc_modify_notifying_addresses_txs.go b/infrastructure/network/netadapter/server/grpcserver/protowire/rpc_modify_notifying_addresses_txs.go
new file mode 100644
index 0000000000..47256001de
--- /dev/null
+++ b/infrastructure/network/netadapter/server/grpcserver/protowire/rpc_modify_notifying_addresses_txs.go
@@ -0,0 +1,71 @@
+package protowire
+
+import (
+ "github.com/kaspanet/kaspad/app/appmessage"
+ "github.com/pkg/errors"
+)
+
+func (x *KaspadMessage_ModifyNotifyingAddressesTxsRequest) toAppMessage() (appmessage.Message, error) {
+ if x == nil {
+ return nil, errors.Wrapf(errorNil, "KaspadMessage_ModifyNotifyingAddressesTxsRequest is nil")
+ }
+ return x.ModifyNotifyingAddressesTxsRequest.toAppMessage()
+}
+
+func (x *KaspadMessage_ModifyNotifyingAddressesTxsRequest) fromAppMessage(message *appmessage.ModifyNotifyingAddressesTxsRequestMessage) error {
+ x.ModifyNotifyingAddressesTxsRequest = &ModifyNotifyingAddressesTxsRequestMessage{
+ AddAddresses: message.AddAddresses,
+ RemoveAddresses: message.RemoveAddresses,
+ RequiredConfirmations: message.RequiredConfirmations,
+ IncludePending: message.IncludePending,
+ IncludeSending: message.IncludeSending,
+ IncludeReceiving: message.IncludeReceiving,
+ }
+ return nil
+}
+
+func (x *ModifyNotifyingAddressesTxsRequestMessage) toAppMessage() (appmessage.Message, error) {
+ if x == nil {
+ return nil, errors.Wrapf(errorNil, "ModifyNotifyingAddressesTxsRequestMessage is nil")
+ }
+ return &appmessage.ModifyNotifyingAddressesTxsRequestMessage{
+ AddAddresses: x.AddAddresses,
+ RemoveAddresses: x.RemoveAddresses,
+ RequiredConfirmations: x.RequiredConfirmations,
+ IncludePending: x.IncludePending,
+ IncludeSending: x.IncludeSending,
+ IncludeReceiving: x.IncludeReceiving,
+ }, nil
+}
+
+func (x *KaspadMessage_ModifyNotifyingAddressesTxsResponse) toAppMessage() (appmessage.Message, error) {
+ if x == nil {
+ return nil, errors.Wrapf(errorNil, "ModifyNotifyingAddressesTxsResponseMessage is nil")
+ }
+ return x.ModifyNotifyingAddressesTxsResponse.toAppMessage()
+}
+
+func (x *ModifyNotifyingAddressesTxsResponseMessage) toAppMessage() (appmessage.Message, error) {
+ if x == nil {
+ return nil, errors.Wrapf(errorNil, "ModifyNotifyingAddressesTxsResponseMessage is nil")
+ }
+ rpcErr, err := x.Error.toAppMessage()
+ // Error is an optional field
+ if err != nil && !errors.Is(err, errorNil) {
+ return nil, err
+ }
+ return &appmessage.ModifyNotifyingAddressesTxsResponseMessage{
+ Error: rpcErr,
+ }, nil
+}
+
+func (x *KaspadMessage_ModifyNotifyingAddressesTxsResponse) fromAppMessage(message *appmessage.ModifyNotifyingAddressesTxsResponseMessage) error {
+ var err *RPCError
+ if message.Error != nil {
+ err = &RPCError{Message: message.Error.Message}
+ }
+ x.ModifyNotifyingAddressesTxsResponse = &ModifyNotifyingAddressesTxsResponseMessage{
+ Error: err,
+ }
+ return nil
+}
diff --git a/infrastructure/network/netadapter/server/grpcserver/protowire/rpc_modify_notifying_txs_confirmation_changed.go b/infrastructure/network/netadapter/server/grpcserver/protowire/rpc_modify_notifying_txs_confirmation_changed.go
new file mode 100644
index 0000000000..6c3b800543
--- /dev/null
+++ b/infrastructure/network/netadapter/server/grpcserver/protowire/rpc_modify_notifying_txs_confirmation_changed.go
@@ -0,0 +1,67 @@
+package protowire
+
+import (
+ "github.com/kaspanet/kaspad/app/appmessage"
+ "github.com/pkg/errors"
+)
+
+func (x *KaspadMessage_ModifyNotifyingTxsConfirmationChangedRequest) toAppMessage() (appmessage.Message, error) {
+ if x == nil {
+ return nil, errors.Wrapf(errorNil, "KaspadMessage_ModifyNotifyingTxsConfirmationChangedRequest is nil")
+ }
+ return x.ModifyNotifyingTxsConfirmationChangedRequest.toAppMessage()
+}
+
+func (x *KaspadMessage_ModifyNotifyingTxsConfirmationChangedRequest) fromAppMessage(message *appmessage.ModifyNotifyingTxsConfirmationChangedRequestMessage) error {
+ x.ModifyNotifyingTxsConfirmationChangedRequest = &ModifyNotifyingTxsConfirmationChangedRequestMessage{
+ AddTxIDs: message.AddTxIDs,
+ RemoveTxIDs: message.RemoveTxIDs,
+ RequiredConfirmations: message.RequiredConfirmations,
+ IncludePending: message.IncludePending,
+ }
+ return nil
+}
+
+func (x *ModifyNotifyingTxsConfirmationChangedRequestMessage) toAppMessage() (appmessage.Message, error) {
+ if x == nil {
+ return nil, errors.Wrapf(errorNil, "ModifyNotifyingTxsConfirmationChangedRequestMessage is nil")
+ }
+ return &appmessage.ModifyNotifyingTxsConfirmationChangedRequestMessage{
+ AddTxIDs: x.AddTxIDs,
+ RemoveTxIDs: x.RemoveTxIDs,
+ RequiredConfirmations: x.RequiredConfirmations,
+ IncludePending: x.IncludePending,
+ }, nil
+}
+
+func (x *KaspadMessage_ModifyNotifyingTxsConfirmationChangedResponse) toAppMessage() (appmessage.Message, error) {
+ if x == nil {
+ return nil, errors.Wrapf(errorNil, "ModifyNotifyingTxsConfirmationChangedResponseMessage is nil")
+ }
+ return x.ModifyNotifyingTxsConfirmationChangedResponse.toAppMessage()
+}
+
+func (x *ModifyNotifyingTxsConfirmationChangedResponseMessage) toAppMessage() (appmessage.Message, error) {
+ if x == nil {
+ return nil, errors.Wrapf(errorNil, "ModifyNotifyingTxsConfirmationChangedResponseMessage is nil")
+ }
+ rpcErr, err := x.Error.toAppMessage()
+ // Error is an optional field
+ if err != nil && !errors.Is(err, errorNil) {
+ return nil, err
+ }
+ return &appmessage.ModifyNotifyingTxsConfirmationChangedResponseMessage{
+ Error: rpcErr,
+ }, nil
+}
+
+func (x *KaspadMessage_ModifyNotifyingTxsConfirmationChangedResponse) fromAppMessage(message *appmessage.ModifyNotifyingTxsConfirmationChangedResponseMessage) error {
+ var err *RPCError
+ if message.Error != nil {
+ err = &RPCError{Message: message.Error.Message}
+ }
+ x.ModifyNotifyingTxsConfirmationChangedResponse = &ModifyNotifyingTxsConfirmationChangedResponseMessage{
+ Error: err,
+ }
+ return nil
+}
diff --git a/infrastructure/network/netadapter/server/grpcserver/protowire/rpc_notify_addresses_txs.go b/infrastructure/network/netadapter/server/grpcserver/protowire/rpc_notify_addresses_txs.go
new file mode 100644
index 0000000000..7fc4ef1e61
--- /dev/null
+++ b/infrastructure/network/netadapter/server/grpcserver/protowire/rpc_notify_addresses_txs.go
@@ -0,0 +1,193 @@
+package protowire
+
+import (
+ "github.com/kaspanet/kaspad/app/appmessage"
+ "github.com/pkg/errors"
+)
+
+func (x *KaspadMessage_NotifyAddressesTxsRequest) toAppMessage() (appmessage.Message, error) {
+ if x == nil {
+ return nil, errors.Wrapf(errorNil, "KaspadMessage_NotifyAddressesTxsRequest is nil")
+ }
+ return x.NotifyAddressesTxsRequest.toAppMessage()
+}
+
+func (x *KaspadMessage_NotifyAddressesTxsRequest) fromAppMessage(message *appmessage.NotifyAddressesTxsRequestMessage) error {
+ x.NotifyAddressesTxsRequest = &NotifyAddressesTxsRequestMessage{
+ Addresses: message.Addresses,
+ RequiredConfirmations: message.RequiredConfirmations,
+ IncludePending: message.IncludePending,
+ IncludeSending: message.IncludeSending,
+ IncludeReceiving: message.IncludeReceiving,
+ }
+ return nil
+}
+
+func (x *NotifyAddressesTxsRequestMessage) toAppMessage() (appmessage.Message, error) {
+ if x == nil {
+ return nil, errors.Wrapf(errorNil, "NotifyAddressesTxsRequestMessage is nil")
+ }
+ return &appmessage.NotifyAddressesTxsRequestMessage{
+ Addresses: x.Addresses,
+ RequiredConfirmations: x.RequiredConfirmations,
+ IncludePending: x.IncludePending,
+ IncludeSending: x.IncludeSending,
+ IncludeReceiving: x.IncludeReceiving,
+ }, nil
+}
+
+func (x *KaspadMessage_NotifyAddressesTxsResponse) toAppMessage() (appmessage.Message, error) {
+ if x == nil {
+ return nil, errors.Wrapf(errorNil, "NotifyAddressesTxsResponseMessage is nil")
+ }
+ return x.NotifyAddressesTxsResponse.toAppMessage()
+}
+
+func (x *KaspadMessage_NotifyAddressesTxsResponse) fromAppMessage(message *appmessage.NotifyAddressesTxsResponseMessage) error {
+ var err *RPCError
+ if message.Error != nil {
+ err = &RPCError{Message: message.Error.Message}
+ }
+ x.NotifyAddressesTxsResponse = &NotifyAddressesTxsResponseMessage{
+ Error: err,
+ }
+ return nil
+}
+
+func (x *NotifyAddressesTxsResponseMessage) toAppMessage() (appmessage.Message, error) {
+ if x == nil {
+ return nil, errors.Wrapf(errorNil, "NotifyAddressesTxsResponseMessage is nil")
+ }
+ rpcErr, err := x.Error.toAppMessage()
+ // Error is an optional field
+ if err != nil && !errors.Is(err, errorNil) {
+ return nil, err
+ }
+ return &appmessage.NotifyAddressesTxsResponseMessage{
+ Error: rpcErr,
+ }, nil
+}
+
+func (x *KaspadMessage_AddressesTxsNotification) toAppMessage() (appmessage.Message, error) {
+ if x == nil {
+ return nil, errors.Wrapf(errorNil, "KaspadMessage_AddressesTxsNotification is nil")
+ }
+ return x.AddressesTxsNotification.toAppMessage()
+}
+
+func (x *KaspadMessage_AddressesTxsNotification) fromAppMessage(message *appmessage.AddressesTxsNotificationMessage) error {
+
+ pending := &TxEntriesByAddresses{}
+ pending.fromAppMessage(message.Pending)
+
+ confirmed := &TxEntriesByAddresses{}
+ confirmed.fromAppMessage(message.Confirmed)
+
+ unconfirmed := &TxEntriesByAddresses{}
+ unconfirmed.fromAppMessage(message.Unconfirmed)
+
+ x.AddressesTxsNotification = &AddressesTxsNotificationMessage{
+ RequiredConfirmations: message.RequiredConfirmations,
+ Pending: pending,
+ Confirmed: confirmed,
+ Unconfirmed: unconfirmed,
+ }
+ return nil
+}
+
+func (x *AddressesTxsNotificationMessage) toAppMessage() (appmessage.Message, error) {
+ if x == nil {
+ return nil, errors.Wrapf(errorNil, "AddressesTxsNotificationMessage is nil")
+ }
+ pending, err := x.Pending.toAppMessage()
+ if err != nil {
+ return nil, err
+ }
+
+ confirmed, err := x.Pending.toAppMessage()
+ if err != nil {
+ return nil, err
+ }
+
+ unconfirmed, err := x.Unconfirmed.toAppMessage()
+ if err != nil {
+ return nil, err
+ }
+
+ return &appmessage.AddressesTxsNotificationMessage{
+ RequiredConfirmations: x.RequiredConfirmations,
+ Pending: pending,
+ Confirmed: confirmed,
+ Unconfirmed: unconfirmed,
+ }, nil
+}
+
+func (x *TxEntriesByAddresses) toAppMessage() (*appmessage.TxEntriesByAddresses, error) {
+ if x == nil {
+ return nil, errors.Wrapf(errorNil, "TxEntriesByAddresses is nil")
+ }
+
+ sent := make([]*appmessage.TxEntryByAddress, len(x.Sent))
+ for i, entry := range x.Sent {
+ entry, err := entry.toAppMessage()
+ if err != nil {
+ return nil, err
+ }
+ sent[i] = entry
+ }
+
+ received := make([]*appmessage.TxEntryByAddress, len(x.Received))
+ for i, entry := range x.Received {
+ entry, err := entry.toAppMessage()
+ if err != nil {
+ return nil, err
+ }
+ received[i] = entry
+ }
+
+ return &appmessage.TxEntriesByAddresses{
+ Sent: sent,
+ Received: received,
+ }, nil
+}
+
+func (x *TxEntriesByAddresses) fromAppMessage(message *appmessage.TxEntriesByAddresses) {
+
+ sent := make([]*TxEntryByAddress, len(message.Sent))
+ for i, entry := range message.Sent {
+ sent[i] = &TxEntryByAddress{}
+ sent[i].fromAppMessage(entry)
+ }
+
+ received := make([]*TxEntryByAddress, len(message.Received))
+ for i, entry := range message.Received {
+ received[i] = &TxEntryByAddress{}
+ received[i].fromAppMessage(entry)
+ }
+
+ *x = TxEntriesByAddresses{
+ Sent: sent,
+ Received: received,
+ }
+}
+
+func (x *TxEntryByAddress) toAppMessage() (*appmessage.TxEntryByAddress, error) {
+ if x == nil {
+ return nil, errors.Wrapf(errorNil, "TxEntryByAddress is nil")
+ }
+
+ return &appmessage.TxEntryByAddress{
+ Address: x.Address,
+ TxID: x.TxId,
+ Confirmations: x.Confirmations,
+ }, nil
+}
+
+func (x *TxEntryByAddress) fromAppMessage(message *appmessage.TxEntryByAddress) {
+
+ *x = TxEntryByAddress{
+ Address: message.Address,
+ TxId: message.TxID,
+ Confirmations: message.Confirmations,
+ }
+}
diff --git a/infrastructure/network/netadapter/server/grpcserver/protowire/rpc_notify_txs_confirmation_changed.go b/infrastructure/network/netadapter/server/grpcserver/protowire/rpc_notify_txs_confirmation_changed.go
new file mode 100644
index 0000000000..ffbc203e96
--- /dev/null
+++ b/infrastructure/network/netadapter/server/grpcserver/protowire/rpc_notify_txs_confirmation_changed.go
@@ -0,0 +1,124 @@
+package protowire
+
+import (
+ "github.com/kaspanet/kaspad/app/appmessage"
+ "github.com/pkg/errors"
+)
+
+func (x *KaspadMessage_NotifyTxsConfirmationChangedRequst) toAppMessage() (appmessage.Message, error) {
+ if x == nil {
+ return nil, errors.Wrapf(errorNil, "KaspadMessage_NotifyTxsConfirmationChangedRequest is nil")
+ }
+ return x.NotifyTxsConfirmationChangedRequst.toAppMessage()
+}
+
+func (x *KaspadMessage_NotifyTxsConfirmationChangedRequst) fromAppMessage(message *appmessage.NotifyTxsConfirmationChangedRequestMessage) error {
+ x.NotifyTxsConfirmationChangedRequst = &NotifyTxsConfirmationChangedRequestMessage{
+ TxIDs: message.TxIDs,
+ RequiredConfirmations: message.RequiredConfirmations,
+ IncludePending: message.IncludePending,
+ }
+ return nil
+}
+
+func (x *NotifyTxsConfirmationChangedRequestMessage) toAppMessage() (appmessage.Message, error) {
+ if x == nil {
+ return nil, errors.Wrapf(errorNil, "NotifyTxsConfirmationChangedRequestMessage is nil")
+ }
+ return &appmessage.NotifyTxsConfirmationChangedRequestMessage{
+ TxIDs: x.TxIDs,
+ RequiredConfirmations: x.RequiredConfirmations,
+ IncludePending: x.IncludePending,
+ }, nil
+}
+
+func (x *KaspadMessage_NotifyTxsConfirmationChangedResponse) toAppMessage() (appmessage.Message, error) {
+ if x == nil {
+ return nil, errors.Wrapf(errorNil, "NotifyTxsConfirmationChangedResponseMessage is nil")
+ }
+ return x.NotifyTxsConfirmationChangedResponse.toAppMessage()
+}
+
+func (x *KaspadMessage_NotifyTxsConfirmationChangedResponse) fromAppMessage(message *appmessage.NotifyTxsConfirmationChangedResponseMessage) error {
+ var err *RPCError
+ if message.Error != nil {
+ err = &RPCError{Message: message.Error.Message}
+ }
+ x.NotifyTxsConfirmationChangedResponse = &NotifyTxsConfirmationChangedResponseMessage{
+ Error: err,
+ }
+ return nil
+}
+
+func (x *NotifyTxsConfirmationChangedResponseMessage) toAppMessage() (appmessage.Message, error) {
+ if x == nil {
+ return nil, errors.Wrapf(errorNil, "NotifyTxsConfirmationChangedResponseMessage is nil")
+ }
+ rpcErr, err := x.Error.toAppMessage()
+ // Error is an optional field
+ if err != nil && !errors.Is(err, errorNil) {
+ return nil, err
+ }
+ return &appmessage.NotifyTxsConfirmationChangedResponseMessage{
+ Error: rpcErr,
+ }, nil
+}
+
+func (x *KaspadMessage_TxsConfirmationChangedNotification) toAppMessage() (appmessage.Message, error) {
+ if x == nil {
+ return nil, errors.Wrapf(errorNil, "KaspadMessage_TxsConfirmationChangedNotification is nil")
+ }
+ return x.TxsConfirmationChangedNotification.toAppMessage()
+}
+
+func (x *KaspadMessage_TxsConfirmationChangedNotification) fromAppMessage(message *appmessage.TxsConfirmationChangedNotificationMessage) error {
+ pending := make([]*RpcTxIDConfirmationsPair, len(message.Pending))
+ for i, entry := range message.Pending {
+ pending[i] = &RpcTxIDConfirmationsPair{}
+ pending[i].fromAppMessage(entry)
+ }
+
+ confirmed := make([]*RpcTxIDConfirmationsPair, len(message.Confirmed))
+ for i, entry := range message.Confirmed {
+ confirmed[i] = &RpcTxIDConfirmationsPair{}
+ confirmed[i].fromAppMessage(entry)
+ }
+
+ x.TxsConfirmationChangedNotification = &TxsConfirmationChangedNotificationMessage{
+ RequiredConfirmations: message.RequiredConfirmations,
+ Pending: pending,
+ Confirmed: confirmed,
+ UnconfirmedTxIds: message.UnconfirmedTxIds,
+ }
+ return nil
+}
+
+func (x *TxsConfirmationChangedNotificationMessage) toAppMessage() (appmessage.Message, error) {
+ if x == nil {
+ return nil, errors.Wrapf(errorNil, "TxsConfirmationChangedNotificationMessage is nil")
+ }
+ pending := make([]*appmessage.TxIDConfirmationsPair, len(x.Pending))
+ for i, confirmationPair := range x.Pending {
+ appConfirmationPair, err := confirmationPair.toAppMessage()
+ if err != nil {
+ return nil, err
+ }
+ pending[i] = appConfirmationPair
+ }
+
+ confirmed := make([]*appmessage.TxIDConfirmationsPair, len(x.Confirmed))
+ for i, appConfirmationPair := range x.Confirmed {
+ appConfirmationPair, err := appConfirmationPair.toAppMessage()
+ if err != nil {
+ return nil, err
+ }
+ confirmed[i] = appConfirmationPair
+ }
+
+ return &appmessage.TxsConfirmationChangedNotificationMessage{
+ RequiredConfirmations: x.RequiredConfirmations,
+ Pending: pending,
+ Confirmed: confirmed,
+ UnconfirmedTxIds: x.UnconfirmedTxIds,
+ }, nil
+}
diff --git a/infrastructure/network/netadapter/server/grpcserver/protowire/rpc_submit_transaction.go b/infrastructure/network/netadapter/server/grpcserver/protowire/rpc_submit_transaction.go
index 292eb02a7c..b43760b951 100644
--- a/infrastructure/network/netadapter/server/grpcserver/protowire/rpc_submit_transaction.go
+++ b/infrastructure/network/netadapter/server/grpcserver/protowire/rpc_submit_transaction.go
@@ -294,21 +294,27 @@ func (x *RpcTransactionVerboseData) toAppMessage() (*appmessage.RPCTransactionVe
return nil, errors.Wrapf(errorNil, "RpcTransactionVerboseData is nil")
}
return &appmessage.RPCTransactionVerboseData{
- TransactionID: x.TransactionId,
- Hash: x.Hash,
- Mass: x.Mass,
- BlockHash: x.BlockHash,
- BlockTime: x.BlockTime,
+ TransactionID: x.TransactionId,
+ Hash: x.Hash,
+ Mass: x.Mass,
+ BlockHash: x.BlockHash,
+ BlockTime: x.BlockTime,
+ TxIndexed: x.TxIndexed,
+ AcceptingBlockHash: x.AcceptingBlockHash,
+ Confirmations: x.Confirmations,
}, nil
}
func (x *RpcTransactionVerboseData) fromAppMessage(message *appmessage.RPCTransactionVerboseData) {
*x = RpcTransactionVerboseData{
- TransactionId: message.TransactionID,
- Hash: message.Hash,
- Mass: message.Mass,
- BlockHash: message.BlockHash,
- BlockTime: message.BlockTime,
+ TransactionId: message.TransactionID,
+ Hash: message.Hash,
+ Mass: message.Mass,
+ BlockHash: message.BlockHash,
+ BlockTime: message.BlockTime,
+ TxIndexed: message.TxIndexed,
+ AcceptingBlockHash: message.AcceptingBlockHash,
+ Confirmations: message.Confirmations,
}
}
diff --git a/infrastructure/network/netadapter/server/grpcserver/protowire/wire.go b/infrastructure/network/netadapter/server/grpcserver/protowire/wire.go
index 30dd18b6ea..a23fb4fe55 100644
--- a/infrastructure/network/netadapter/server/grpcserver/protowire/wire.go
+++ b/infrastructure/network/netadapter/server/grpcserver/protowire/wire.go
@@ -968,6 +968,48 @@ func toRPCPayload(message appmessage.Message) (isKaspadMessage_Payload, error) {
return nil, err
}
return payload, nil
+ case *appmessage.GetAcceptingBlockHashesOfTxsRequestMessage:
+ payload := new(KaspadMessage_GetAcceptingBlockHashesOfTxsRequest)
+ err := payload.fromAppMessage(message)
+ if err != nil {
+ return nil, err
+ }
+ return payload, nil
+ case *appmessage.GetAcceptingBlockHashesOfTxsResponseMessage:
+ payload := new(KaspadMessage_GetAcceptingBlockHashesOfTxsResponse)
+ err := payload.fromAppMessage(message)
+ if err != nil {
+ return nil, err
+ }
+ return payload, nil
+ case *appmessage.GetTxsRequestMessage:
+ payload := new(KaspadMessage_GetTxsRequest)
+ err := payload.fromAppMessage(message)
+ if err != nil {
+ return nil, err
+ }
+ return payload, nil
+ case *appmessage.GetTxsResponseMessage:
+ payload := new(KaspadMessage_GetTxsResponse)
+ err := payload.fromAppMessage(message)
+ if err != nil {
+ return nil, err
+ }
+ return payload, nil
+ case *appmessage.GetTxsConfirmationsRequestMessage:
+ payload := new(KaspadMessage_GetTxsConfirmationsRequest)
+ err := payload.fromAppMessage(message)
+ if err != nil {
+ return nil, err
+ }
+ return payload, nil
+ case *appmessage.GetTxsConfirmationsResponseMessage:
+ payload := new(KaspadMessage_GetTxsConfirmationsResponse)
+ err := payload.fromAppMessage(message)
+ if err != nil {
+ return nil, err
+ }
+ return payload, nil
default:
return nil, nil
}
diff --git a/infrastructure/network/rpcclient/rpc_get_accepting_blockhashes_of_txs.go b/infrastructure/network/rpcclient/rpc_get_accepting_blockhashes_of_txs.go
new file mode 100644
index 0000000000..b22ae811cc
--- /dev/null
+++ b/infrastructure/network/rpcclient/rpc_get_accepting_blockhashes_of_txs.go
@@ -0,0 +1,20 @@
+package rpcclient
+
+import "github.com/kaspanet/kaspad/app/appmessage"
+
+// GetAcceptingBlockHashesOfTxs sends an RPC request respective to the function's name and returns the RPC server's response
+func (c *RPCClient) GetAcceptingBlockHashesOfTxs(txIDs []string) (*appmessage.GetAcceptingBlockHashesOfTxsResponseMessage, error) {
+ err := c.rpcRouter.outgoingRoute().Enqueue(appmessage.NewGetAcceptingBlockHashesOfTxsRequest(txIDs))
+ if err != nil {
+ return nil, err
+ }
+ response, err := c.route(appmessage.CmdGetAcceptingBlockHashesOfTxsResponseMessage).DequeueWithTimeout(c.timeout)
+ if err != nil {
+ return nil, err
+ }
+ getAcceptingBlockHashesOfTxsResponse := response.(*appmessage.GetAcceptingBlockHashesOfTxsResponseMessage)
+ if getAcceptingBlockHashesOfTxsResponse.Error != nil {
+ return nil, c.convertRPCError(getAcceptingBlockHashesOfTxsResponse.Error)
+ }
+ return getAcceptingBlockHashesOfTxsResponse, nil
+}
diff --git a/infrastructure/network/rpcclient/rpc_get_txs.go b/infrastructure/network/rpcclient/rpc_get_txs.go
new file mode 100644
index 0000000000..4d7058358d
--- /dev/null
+++ b/infrastructure/network/rpcclient/rpc_get_txs.go
@@ -0,0 +1,20 @@
+package rpcclient
+
+import "github.com/kaspanet/kaspad/app/appmessage"
+
+// GetTxs sends an RPC request respective to the function's name and returns the RPC server's response
+func (c *RPCClient) GetTxs(txIDs []string) (*appmessage.GetTxsResponseMessage, error) {
+ err := c.rpcRouter.outgoingRoute().Enqueue(appmessage.NewGetTxsRequest(txIDs))
+ if err != nil {
+ return nil, err
+ }
+ response, err := c.route(appmessage.CmdGetTxsResponseMessage).DequeueWithTimeout(c.timeout)
+ if err != nil {
+ return nil, err
+ }
+ getTxsResponse := response.(*appmessage.GetTxsResponseMessage)
+ if getTxsResponse.Error != nil {
+ return nil, c.convertRPCError(getTxsResponse.Error)
+ }
+ return getTxsResponse, nil
+}
diff --git a/infrastructure/network/rpcclient/rpc_get_txs_confirmations.go b/infrastructure/network/rpcclient/rpc_get_txs_confirmations.go
new file mode 100644
index 0000000000..007feaa888
--- /dev/null
+++ b/infrastructure/network/rpcclient/rpc_get_txs_confirmations.go
@@ -0,0 +1,20 @@
+package rpcclient
+
+import "github.com/kaspanet/kaspad/app/appmessage"
+
+// GetTxsConfirmations sends an RPC request respective to the function's name and returns the RPC server's response
+func (c *RPCClient) GetTxsConfirmations(txIDs []string) (*appmessage.GetTxsConfirmationsResponseMessage, error) {
+ err := c.rpcRouter.outgoingRoute().Enqueue(appmessage.NewGetTxsConfirmationsRequest(txIDs))
+ if err != nil {
+ return nil, err
+ }
+ response, err := c.route(appmessage.CmdGetTxsConfirmationsResponseMessage).DequeueWithTimeout(c.timeout)
+ if err != nil {
+ return nil, err
+ }
+ getTxsConfirmationsResponse := response.(*appmessage.GetTxsConfirmationsResponseMessage)
+ if getTxsConfirmationsResponse.Error != nil {
+ return nil, c.convertRPCError(getTxsConfirmationsResponse.Error)
+ }
+ return getTxsConfirmationsResponse, nil
+}
diff --git a/testing/integration/setup_test.go b/testing/integration/setup_test.go
index 4b28234847..10e7c9b053 100644
--- a/testing/integration/setup_test.go
+++ b/testing/integration/setup_test.go
@@ -24,6 +24,7 @@ type appHarness struct {
config *config.Config
database database.Database
utxoIndex bool
+ txIndex bool
overrideDAGParams *dagconfig.Params
}
@@ -33,6 +34,7 @@ type harnessParams struct {
miningAddress string
miningAddressPrivateKey string
utxoIndex bool
+ txIndex bool
overrideDAGParams *dagconfig.Params
protocolVersion uint32
}
@@ -45,6 +47,7 @@ func setupHarness(t *testing.T, params *harnessParams) (harness *appHarness, tea
miningAddress: params.miningAddress,
miningAddressPrivateKey: params.miningAddressPrivateKey,
utxoIndex: params.utxoIndex,
+ txIndex: params.txIndex,
overrideDAGParams: params.overrideDAGParams,
}