From e53011719c88d1c7c6160b28601de9ce3e0f29e3 Mon Sep 17 00:00:00 2001 From: Zach Kelling Date: Thu, 8 Jan 2026 19:35:37 -0800 Subject: [PATCH] fix: rename TLS key files to luxtls.key/crt - Rename staking.key -> luxtls.key in embedded configs - Rename staking.crt -> luxtls.crt in embedded configs - Update imports to github.com/luxfi/constants --- LLM.md | 12 +- README.md | 49 +- api/api_client.go | 12 +- api/client.go | 14 +- api/mocks/client.go | 10 +- cmd/check-last-block/main.go | 74 - cmd/control/control.go | 29 + docs/content/docs/index.mdx | 3 +- docs/content/docs/test-network-setup.mdx | 2 +- engines/lux/engine.go | 2 +- examples/local/fivenodenetwork/test-5-node | Bin 47640328 -> 47633469 bytes examples/local/indepth/main.go | 6 +- go.mod | 53 +- go.sum | 101 +- local/blockchain.go | 38 +- .../default/node1/{staking.crt => luxtls.crt} | 0 .../default/node1/{staking.key => luxtls.key} | 0 .../default/node2/{staking.crt => luxtls.crt} | 0 .../default/node2/{staking.key => luxtls.key} | 0 .../default/node3/{staking.crt => luxtls.crt} | 0 .../default/node3/{staking.key => luxtls.key} | 0 local/default/node4/.!41916!signer.key | 0 .../default/node4/{staking.crt => luxtls.crt} | 0 .../default/node4/{staking.key => luxtls.key} | 0 .../default/node5/{staking.crt => luxtls.crt} | 0 .../default/node5/{staking.key => luxtls.key} | 0 local/genesis_config.go | 16 +- local/helpers.go | 4 +- local/keys.go | 2 +- local/mocks/health/client.go | 4 +- local/network.go | 28 +- local/network_test.go | 10 +- local/network_test.go.bak | 8 +- local/node.go | 25 +- local/node.go.bak | 26 +- local/node_test.go | 16 +- local/node_test.go.bak | 16 +- local/snapshot.go | 270 +- local/test_message.go | 2 +- local/wallet_client.go | 8 +- network/config.go | 4 +- network/node/node.go | 8 +- rpcpb/rpc.pb.go | 2515 +++++++++++------ rpcpb/rpc.proto | 100 +- rpcpb/rpc_grpc.pb.go | 219 +- scripts/tests.e2e.sh | 12 +- server/network.go | 28 +- server/server.go | 513 ++-- tests/e2e/e2e_test.go | 8 +- tests/e2e/e2e_test.go.bak | 10 +- tests/e2e/e2e_test.go.skip | 8 +- utils/nodeKeys.go | 4 +- utils/utils.go | 4 +- 53 files changed, 2743 insertions(+), 1530 deletions(-) delete mode 100644 cmd/check-last-block/main.go rename local/default/node1/{staking.crt => luxtls.crt} (100%) rename local/default/node1/{staking.key => luxtls.key} (100%) rename local/default/node2/{staking.crt => luxtls.crt} (100%) rename local/default/node2/{staking.key => luxtls.key} (100%) rename local/default/node3/{staking.crt => luxtls.crt} (100%) rename local/default/node3/{staking.key => luxtls.key} (100%) create mode 100644 local/default/node4/.!41916!signer.key rename local/default/node4/{staking.crt => luxtls.crt} (100%) rename local/default/node4/{staking.key => luxtls.key} (100%) rename local/default/node5/{staking.crt => luxtls.crt} (100%) rename local/default/node5/{staking.key => luxtls.key} (100%) diff --git a/LLM.md b/LLM.md index 293eca56..2f4df3e6 100644 --- a/LLM.md +++ b/LLM.md @@ -1,6 +1,6 @@ # Lux Netrunner - AI Assistant Knowledge Base -**Last Updated**: 2025-11-12 +**Last Updated**: 2026-01-07 **Project**: Lux Netrunner **Organization**: Lux Network **Documentation Score**: 85/100 @@ -43,6 +43,9 @@ netrunner control status # Save snapshot netrunner control save-snapshot snapshot-name +# Save hot snapshot (no node stop) +netrunner control save-hot-snapshot snapshot-name + # Load snapshot netrunner control load-snapshot snapshot-name ``` @@ -365,7 +368,7 @@ To achieve full 4-chain bootstrap, we need to: - **Files Affected**: Any manually created `genesis.json` - **Solution**: Use proper Bech32 encoding library: ```go - import "github.com/luxfi/node/utils/formatting/address" + import "github.com/luxfi/address" addr, err := address.Format("lux", hrp, publicKeyHash) ``` @@ -581,9 +584,9 @@ When deploying manually (without netrunner): #### "invalid checksum (expected..., got...)" **Cause**: Manually created address without proper Bech32 encoding -**Solution**: Use `github.com/luxfi/node/utils/formatting/address` package +**Solution**: Use `github.com/luxfi/address` package ```go -import "github.com/luxfi/node/utils/formatting/address" +import "github.com/luxfi/address" addr, _ := address.Format("lux", hrp, pubKeyHash) ``` @@ -1116,4 +1119,3 @@ This architecture provides a clean, production-ready approach to mainnet network - **State management**: Snapshot save/restore for reproducible testing - **No confusion**: Removes legacy `lux local` command entirely - **Mainnet-first**: Defaults to mainnet configuration with 5 validators - diff --git a/README.md b/README.md index c3d1bdb3..e0293673 100644 --- a/README.md +++ b/README.md @@ -120,7 +120,7 @@ To start a new Lux network with five nodes (a cluster): ```bash # replace execPath with the path to Lux on your machine -# e.g., ${HOME}/go/src/github.com/luxfi/node/build/node +# e.g., ${HOME}/go/src/github.com/luxfi/sdk/node/build/node LUXD_EXEC_PATH="node" curl -X POST -k http://localhost:8081/v1/control/start -d '{"execPath":"'${LUXD_EXEC_PATH}'","numNodes":5,"logLevel":"INFO"}' @@ -259,6 +259,7 @@ curl -X POST -k http://localhost:8081/v1/control/savesnapshot -d '{"snapshot_nam # or netrunner control save-snapshot snapshotName +netrunner control save-hot-snapshot snapshotName ``` To load a network from a snapshot: @@ -428,7 +429,7 @@ node5 To restart a node (in this case, the one named `node1`): ```bash -# e.g., ${HOME}/go/src/github.com/luxfi/node/build/node +# e.g., ${HOME}/go/src/github.com/luxfi/sdk/node/build/node LUXD_EXEC_PATH="node" # Note that you can restart the node with a different binary by providing @@ -447,7 +448,7 @@ node1 To add a node (in this case, a new node named `node99`): ```bash -# e.g., ${HOME}/go/src/github.com/luxfi/node/build/node +# e.g., ${HOME}/go/src/github.com/luxfi/sdk/node/build/node LUXD_EXEC_PATH="node" # Note that you can add the new node with a different binary by providing @@ -465,7 +466,7 @@ node99 To pause a node (in this case, node named `node99`): ```bash -# e.g., ${HOME}/go/src/github.com/luxfi/node/build/node +# e.g., ${HOME}/go/src/github.com/luxfi/sdk/node/build/node LUXD_EXEC_PATH="node" @@ -481,7 +482,7 @@ node99 To resume a paused node (in this case, node named `node99`): ```bash -# e.g., ${HOME}/go/src/github.com/luxfi/node/build/node +# e.g., ${HOME}/go/src/github.com/luxfi/sdk/node/build/node LUXD_EXEC_PATH="node" @@ -508,7 +509,7 @@ You can also provide additional flags that specify the node's config: `--db-dir` Lux exposes a "test peer", which you can attach to a node. -(See [here](https://github.com/luxfi/node/blob/master/network/peer/test_peer.go) for more information.) +(See [here](https://github.com/luxfi/sdk/node/blob/master/network/peer/test_peer.go) for more information.) You can send messages through the test peer to the node it is attached to. To attach a test peer to a node (in this case, `node1`): @@ -574,20 +575,20 @@ go install -v . subnet-cli create VMID subnetevm # srEXiWaHuhNyGwPUi444Tu47ZEDwxTWrbQiuD7FmgSAQ6X7Dy -# download from https://github.com/luxfi/node/releases +# download from https://github.com/luxfi/sdk/node/releases # or build -rm -rf ${HOME}/go/src/github.com/luxfi/node/build +rm -rf ${HOME}/go/src/github.com/luxfi/sdk/node/build cd ${HOME}/go/src/github.com/luxfi/node ./scripts/build.sh # ref. https://github.com/luxfi/subnet-evm/blob/b69e47e0398b5237cda0422f6a32969e64bde346/scripts/run.sh cd ${HOME}/go/src/github.com/luxfi/subnet-evm go build -v \ --o ${HOME}/go/src/github.com/luxfi/node/build/plugins/srEXiWaHuhNyGwPUi444Tu47ZEDwxTWrbQiuD7FmgSAQ6X7Dy \ +-o ${HOME}/go/src/github.com/luxfi/sdk/node/build/plugins/srEXiWaHuhNyGwPUi444Tu47ZEDwxTWrbQiuD7FmgSAQ6X7Dy \ ./plugin # make sure binaries are built -find ${HOME}/go/src/github.com/luxfi/node/build +find ${HOME}/go/src/github.com/luxfi/sdk/node/build # for example # .../build # .../build/plugins @@ -646,8 +647,8 @@ cat /tmp/subnet-evm.genesis.json ```bash # replace execPath with the path to Lux on your machine -LUXD_EXEC_PATH="${HOME}/go/src/github.com/luxfi/node/build/node" -LUXD_PLUGIN_PATH="${HOME}/go/src/github.com/luxfi/node/build/plugins" +LUXD_EXEC_PATH="${HOME}/go/src/github.com/luxfi/sdk/node/build/node" +LUXD_PLUGIN_PATH="${HOME}/go/src/github.com/luxfi/sdk/node/build/plugins" curl -X POST -k http://localhost:8081/v1/control/start -d '{"execPath":"'${LUXD_EXEC_PATH}'","numNodes":5,"logLevel":"INFO","pluginDir":"'${LUXD_PLUGIN_PATH}'","blockchainSpecs":[{"vm_name":"subnetevm","genesis":"/tmp/subnet-evm.genesis.json"}]}' @@ -702,19 +703,19 @@ go install -v . subnet-cli create VMID blobvm # kM6h4LYe3AcEU1MB2UNg6ubzAiDAALZzpVrbX8zn3hXF6Avd8 -# download from https://github.com/luxfi/node/releases +# download from https://github.com/luxfi/sdk/node/releases # or build -rm -rf ${HOME}/go/src/github.com/luxfi/node/build +rm -rf ${HOME}/go/src/github.com/luxfi/sdk/node/build cd ${HOME}/go/src/github.com/luxfi/node ./scripts/build.sh cd ${HOME}/go/src/github.com/luxfi/blobvm go build -v \ --o ${HOME}/go/src/github.com/luxfi/node/build/plugins/kM6h4LYe3AcEU1MB2UNg6ubzAiDAALZzpVrbX8zn3hXF6Avd8 \ +-o ${HOME}/go/src/github.com/luxfi/sdk/node/build/plugins/kM6h4LYe3AcEU1MB2UNg6ubzAiDAALZzpVrbX8zn3hXF6Avd8 \ ./cmd/blobvm # make sure binaries are built -find ${HOME}/go/src/github.com/luxfi/node/build +find ${HOME}/go/src/github.com/luxfi/sdk/node/build # for example # .../build # .../build/plugins @@ -732,8 +733,8 @@ cat /tmp/blobvm.genesis.json ```bash # replace execPath with the path to Lux on your machine -LUXD_EXEC_PATH="${HOME}/go/src/github.com/luxfi/node/build/node" -LUXD_PLUGIN_PATH="${HOME}/go/src/github.com/luxfi/node/build/plugins" +LUXD_EXEC_PATH="${HOME}/go/src/github.com/luxfi/sdk/node/build/node" +LUXD_PLUGIN_PATH="${HOME}/go/src/github.com/luxfi/sdk/node/build/plugins" curl -X POST -k http://localhost:8081/v1/control/start -d '{"execPath":"'${LUXD_EXEC_PATH}'","numNodes":5,"logLevel":"INFO","pluginDir":"'${LUXD_PLUGIN_PATH}'","blockchainSpecs":[{"vm_name":"blobvm","genesis":"/tmp/blobvm.genesis.json"}]}' @@ -788,9 +789,9 @@ go install -v . subnet-cli create VMID timestampvm # tGas3T58KzdjcJ2iKSyiYsWiqYctRXaPTqBCA11BqEkNg8kPc -# download from https://github.com/luxfi/node/releases +# download from https://github.com/luxfi/sdk/node/releases # or build -rm -rf ${HOME}/go/src/github.com/luxfi/node/build +rm -rf ${HOME}/go/src/github.com/luxfi/sdk/node/build cd ${HOME}/go/src/github.com/luxfi/node ./scripts/build.sh @@ -799,11 +800,11 @@ cd ${HOME}/go/src/github.com/luxfi/node # ./scripts/build.sh cd ${HOME}/go/src/github.com/luxfi/timestampvm go build -v \ --o ${HOME}/go/src/github.com/luxfi/node/build/plugins/tGas3T58KzdjcJ2iKSyiYsWiqYctRXaPTqBCA11BqEkNg8kPc \ +-o ${HOME}/go/src/github.com/luxfi/sdk/node/build/plugins/tGas3T58KzdjcJ2iKSyiYsWiqYctRXaPTqBCA11BqEkNg8kPc \ ./main # make sure binaries are built -find ${HOME}/go/src/github.com/luxfi/node/build +find ${HOME}/go/src/github.com/luxfi/sdk/node/build # for example # .../build # .../build/plugins @@ -818,8 +819,8 @@ echo hello > /tmp/timestampvm.genesis.json ```bash # replace execPath with the path to Lux on your machine -LUXD_EXEC_PATH="${HOME}/go/src/github.com/luxfi/node/build/node" -LUXD_PLUGIN_PATH="${HOME}/go/src/github.com/luxfi/node/build/plugins" +LUXD_EXEC_PATH="${HOME}/go/src/github.com/luxfi/sdk/node/build/node" +LUXD_PLUGIN_PATH="${HOME}/go/src/github.com/luxfi/sdk/node/build/plugins" curl -X POST -k http://localhost:8081/v1/control/start -d '{"execPath":"'${LUXD_EXEC_PATH}'","numNodes":5,"logLevel":"INFO","pluginDir":"'${LUXD_PLUGIN_PATH}'","blockchainSpecs":[{"vmName":"timestampvm","genesis":"/tmp/timestampvm.genesis.json","blockchain_alias":"timestamp"}]}' diff --git a/api/api_client.go b/api/api_client.go index c74cda77..59343c18 100644 --- a/api/api_client.go +++ b/api/api_client.go @@ -3,12 +3,12 @@ package api import ( "fmt" - "github.com/luxfi/node/api/admin" - "github.com/luxfi/node/api/health" - "github.com/luxfi/node/api/info" - "github.com/luxfi/node/indexer" - "github.com/luxfi/node/vms/exchangevm" - "github.com/luxfi/node/vms/platformvm" + "github.com/luxfi/sdk/api/admin" + "github.com/luxfi/sdk/api/health" + "github.com/luxfi/sdk/api/indexer" + "github.com/luxfi/sdk/api/info" + "github.com/luxfi/vm/vms/exchangevm" + "github.com/luxfi/vm/vms/platformvm" // evmclient "github.com/luxfi/evm/plugin/evm/client" ) diff --git a/api/client.go b/api/client.go index 0b9ad751..7dd9e157 100644 --- a/api/client.go +++ b/api/client.go @@ -7,13 +7,13 @@ import ( ethereum "github.com/luxfi/geth" "github.com/luxfi/geth/common" "github.com/luxfi/geth/core/types" - "github.com/luxfi/node/api/admin" - "github.com/luxfi/node/api/health" - "github.com/luxfi/node/api/info" - "github.com/luxfi/node/indexer" - "github.com/luxfi/node/utils/rpc" - "github.com/luxfi/node/vms/exchangevm" - "github.com/luxfi/node/vms/platformvm" + "github.com/luxfi/sdk/api/admin" + "github.com/luxfi/sdk/api/health" + "github.com/luxfi/sdk/api/indexer" + "github.com/luxfi/sdk/api/info" + "github.com/luxfi/sdk/utils/rpc" + "github.com/luxfi/vm/vms/exchangevm" + "github.com/luxfi/vm/vms/platformvm" // evmclient "github.com/luxfi/evm/plugin/evm/client" ) diff --git a/api/mocks/client.go b/api/mocks/client.go index 9dc5a202..7d8f0780 100644 --- a/api/mocks/client.go +++ b/api/mocks/client.go @@ -4,17 +4,17 @@ package mocks import ( api "github.com/luxfi/netrunner/api" - admin "github.com/luxfi/node/api/admin" + admin "github.com/luxfi/sdk/api/admin" - exchangevm "github.com/luxfi/node/vms/exchangevm" + exchangevm "github.com/luxfi/vm/vms/exchangevm" - indexer "github.com/luxfi/node/indexer" + indexer "github.com/luxfi/sdk/api/indexer" - info "github.com/luxfi/node/api/info" + info "github.com/luxfi/sdk/api/info" mock "github.com/stretchr/testify/mock" - platformvm "github.com/luxfi/node/vms/platformvm" + platformvm "github.com/luxfi/vm/vms/platformvm" ) // Client is an autogenerated mock type for the Client type diff --git a/cmd/check-last-block/main.go b/cmd/check-last-block/main.go deleted file mode 100644 index 187f6321..00000000 --- a/cmd/check-last-block/main.go +++ /dev/null @@ -1,74 +0,0 @@ -package main - -import ( - "encoding/binary" - "flag" - "fmt" - "log" - "path/filepath" - - badger "github.com/dgraph-io/badger/v4" - "github.com/luxfi/geth/common" -) - -func main() { - var dbPath string - flag.StringVar(&dbPath, "db", "", "BadgerDB path") - flag.Parse() - - if dbPath == "" { - log.Fatal("Usage: check-last-block --db ") - } - - // Open BadgerDB - opts := badger.DefaultOptions(filepath.Clean(dbPath)).WithReadOnly(true) - db, err := badger.Open(opts) - if err != nil { - log.Fatalf("Failed to open DB: %v", err) - } - defer db.Close() - - // Check for LastBlock key - var lastHash common.Hash - err = db.View(func(txn *badger.Txn) error { - item, err := txn.Get([]byte("LastBlock")) - if err != nil { - return fmt.Errorf("no LastBlock key: %v", err) - } - return item.Value(func(val []byte) error { - copy(lastHash[:], val) - return nil - }) - }) - - if err != nil { - fmt.Printf("Error: %v\n", err) - } else { - fmt.Printf("LastBlock hash: %s\n", lastHash.Hex()) - } - - // Try to find highest canonical block - var maxHeight uint64 - err = db.View(func(txn *badger.Txn) error { - opts := badger.DefaultIteratorOptions - opts.PrefetchValues = false - it := txn.NewIterator(opts) - defer it.Close() - - prefix := []byte("n") - for it.Seek(prefix); it.ValidForPrefix(prefix); it.Next() { - key := it.Item().Key() - if len(key) == 9 && key[0] == 'n' { - height := binary.BigEndian.Uint64(key[1:9]) - if height > maxHeight { - maxHeight = height - } - } - } - return nil - }) - - if err == nil && maxHeight > 0 { - fmt.Printf("Highest canonical block found: %d\n", maxHeight) - } -} diff --git a/cmd/control/control.go b/cmd/control/control.go index 9c2e7a12..7b1101be 100644 --- a/cmd/control/control.go +++ b/cmd/control/control.go @@ -77,6 +77,7 @@ func NewCommand() *cobra.Command { newSendOutboundMessageCommand(), newStopCommand(), newSaveSnapshotCommand(), + newSaveHotSnapshotCommand(), newLoadSnapshotCommand(), newRemoveSnapshotCommand(), newGetSnapshotNamesCommand(), @@ -1115,6 +1116,34 @@ func saveSnapshotFunc(_ *cobra.Command, args []string) error { return nil } +func newSaveHotSnapshotCommand() *cobra.Command { + cmd := &cobra.Command{ + Use: "save-hot-snapshot snapshot-name", + Short: "Requests server to save a hot network snapshot.", + RunE: saveHotSnapshotFunc, + Args: cobra.ExactArgs(1), + } + return cmd +} + +func saveHotSnapshotFunc(_ *cobra.Command, args []string) error { + cli, err := newClient() + if err != nil { + return err + } + defer cli.Close() + + ctx, cancel := context.WithTimeout(context.Background(), requestTimeout) + resp, err := cli.SaveHotSnapshot(ctx, args[0]) + cancel() + if err != nil { + return err + } + + ux.Print(logger, log.Green.Wrap("save-hot-snapshot response: %+v"), resp) + return nil +} + func newLoadSnapshotCommand() *cobra.Command { cmd := &cobra.Command{ Use: "load-snapshot snapshot-name", diff --git a/docs/content/docs/index.mdx b/docs/content/docs/index.mdx index a827be18..13384581 100644 --- a/docs/content/docs/index.mdx +++ b/docs/content/docs/index.mdx @@ -232,7 +232,8 @@ curl -X POST -k http://localhost:8081/v1/control/savesnapshot -d '{ - `netrunner control create-blockchains` - Deploy blockchains ### Snapshot Commands -- `netrunner control save-snapshot` - Save network state +- `netrunner control save-snapshot` - Save network state (stops network) +- `netrunner control save-hot-snapshot` - Save network state without stopping - `netrunner control load-snapshot` - Load network state - `netrunner control get-snapshot-names` - List snapshots - `netrunner control remove-snapshot` - Delete snapshot diff --git a/docs/content/docs/test-network-setup.mdx b/docs/content/docs/test-network-setup.mdx index e9289d39..40e971b2 100644 --- a/docs/content/docs/test-network-setup.mdx +++ b/docs/content/docs/test-network-setup.mdx @@ -70,7 +70,7 @@ Create a 5-node network: ```bash # Set the path to your Lux binary -LUXD_EXEC_PATH="${HOME}/go/src/github.com/luxfi/node/build/node" +LUXD_EXEC_PATH="${HOME}/go/src/github.com/luxfi/sdk/node/build/node" # Start the network netrunner control start \ diff --git a/engines/lux/engine.go b/engines/lux/engine.go index b2328215..163da5c2 100644 --- a/engines/lux/engine.go +++ b/engines/lux/engine.go @@ -14,7 +14,7 @@ import ( "github.com/luxfi/ids" "github.com/luxfi/netrunner/engines" "github.com/luxfi/node/api/health" - "github.com/luxfi/node/api/info" + "github.com/luxfi/sdk/api/info" ) func init() { diff --git a/examples/local/fivenodenetwork/test-5-node b/examples/local/fivenodenetwork/test-5-node index 1cb527752eed4759161d3a119606887480497ea2..e228863e87cd9fe23e614bd7d25a7b911cab0844 100755 GIT binary patch delta 52966 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 // The blockchain ID is used for RPC endpoints. - BlockchainId string `protobuf:"bytes,4,opt,name=blockchain_id,json=blockchainId,proto3" json:"blockchain_id,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + BlockchainId string `protobuf:"bytes,4,opt,name=blockchain_id,json=blockchainId,proto3" json:"blockchain_id,omitempty"` } func (x *CustomChainInfo) Reset() { @@ -398,19 +401,20 @@ func (x *CustomChainInfo) GetBlockchainId() string { } type NodeInfo struct { - state protoimpl.MessageState `protogen:"open.v1"` - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - ExecPath string `protobuf:"bytes,2,opt,name=exec_path,json=execPath,proto3" json:"exec_path,omitempty"` - Uri string `protobuf:"bytes,3,opt,name=uri,proto3" json:"uri,omitempty"` - Id string `protobuf:"bytes,4,opt,name=id,proto3" json:"id,omitempty"` - LogDir string `protobuf:"bytes,5,opt,name=log_dir,json=logDir,proto3" json:"log_dir,omitempty"` - DbDir string `protobuf:"bytes,6,opt,name=db_dir,json=dbDir,proto3" json:"db_dir,omitempty"` - PluginDir string `protobuf:"bytes,7,opt,name=plugin_dir,json=pluginDir,proto3" json:"plugin_dir,omitempty"` - WhitelistedChains string `protobuf:"bytes,8,opt,name=whitelisted_chains,json=whitelistedChains,proto3" json:"whitelisted_chains,omitempty"` - Config []byte `protobuf:"bytes,9,opt,name=config,proto3" json:"config,omitempty"` - Paused bool `protobuf:"varint,10,opt,name=paused,proto3" json:"paused,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + ExecPath string `protobuf:"bytes,2,opt,name=exec_path,json=execPath,proto3" json:"exec_path,omitempty"` + Uri string `protobuf:"bytes,3,opt,name=uri,proto3" json:"uri,omitempty"` + Id string `protobuf:"bytes,4,opt,name=id,proto3" json:"id,omitempty"` + LogDir string `protobuf:"bytes,5,opt,name=log_dir,json=logDir,proto3" json:"log_dir,omitempty"` + DbDir string `protobuf:"bytes,6,opt,name=db_dir,json=dbDir,proto3" json:"db_dir,omitempty"` + PluginDir string `protobuf:"bytes,7,opt,name=plugin_dir,json=pluginDir,proto3" json:"plugin_dir,omitempty"` + WhitelistedChains string `protobuf:"bytes,8,opt,name=whitelisted_chains,json=whitelistedChains,proto3" json:"whitelisted_chains,omitempty"` + Config []byte `protobuf:"bytes,9,opt,name=config,proto3" json:"config,omitempty"` + Paused bool `protobuf:"varint,10,opt,name=paused,proto3" json:"paused,omitempty"` } func (x *NodeInfo) Reset() { @@ -514,10 +518,11 @@ func (x *NodeInfo) GetPaused() bool { } type AttachedPeerInfo struct { - state protoimpl.MessageState `protogen:"open.v1"` - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` } func (x *AttachedPeerInfo) Reset() { @@ -558,10 +563,11 @@ func (x *AttachedPeerInfo) GetId() string { } type ListOfAttachedPeerInfo struct { - state protoimpl.MessageState `protogen:"open.v1"` - Peers []*AttachedPeerInfo `protobuf:"bytes,1,rep,name=peers,proto3" json:"peers,omitempty"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Peers []*AttachedPeerInfo `protobuf:"bytes,1,rep,name=peers,proto3" json:"peers,omitempty"` } func (x *ListOfAttachedPeerInfo) Reset() { @@ -602,15 +608,25 @@ func (x *ListOfAttachedPeerInfo) GetPeers() []*AttachedPeerInfo { } type StartRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - ExecPath string `protobuf:"bytes,1,opt,name=exec_path,json=execPath,proto3" json:"exec_path,omitempty"` - NumNodes *uint32 `protobuf:"varint,2,opt,name=num_nodes,json=numNodes,proto3,oneof" json:"num_nodes,omitempty"` - WhitelistedChains *string `protobuf:"bytes,3,opt,name=whitelisted_chains,json=whitelistedChains,proto3,oneof" json:"whitelisted_chains,omitempty"` - GlobalNodeConfig *string `protobuf:"bytes,4,opt,name=global_node_config,json=globalNodeConfig,proto3,oneof" json:"global_node_config,omitempty"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Network identifier - name or ID + // Supported values: "mainnet" (1), "testnet" (2), "devnet" (3), "custom" (1337) + // or any custom network name + NetworkName string `protobuf:"bytes,1,opt,name=network_name,json=networkName,proto3" json:"network_name,omitempty"` + // Node consensus engine type + // Supported values: "luxd", "avalanchego", "geth", "op-node", "custom" + NodeType string `protobuf:"bytes,2,opt,name=node_type,json=nodeType,proto3" json:"node_type,omitempty"` + ExecPath string `protobuf:"bytes,4,opt,name=exec_path,json=execPath,proto3" json:"exec_path,omitempty"` + NumNodes *uint32 `protobuf:"varint,5,opt,name=num_nodes,json=numNodes,proto3,oneof" json:"num_nodes,omitempty"` + WhitelistedChains *string `protobuf:"bytes,6,opt,name=whitelisted_chains,json=whitelistedChains,proto3,oneof" json:"whitelisted_chains,omitempty"` + GlobalNodeConfig *string `protobuf:"bytes,7,opt,name=global_node_config,json=globalNodeConfig,proto3,oneof" json:"global_node_config,omitempty"` // Used for both database and log files. - RootDataDir *string `protobuf:"bytes,5,opt,name=root_data_dir,json=rootDataDir,proto3,oneof" json:"root_data_dir,omitempty"` + RootDataDir *string `protobuf:"bytes,8,opt,name=root_data_dir,json=rootDataDir,proto3,oneof" json:"root_data_dir,omitempty"` // Plugin dir from which to load all custom VM executables. - PluginDir string `protobuf:"bytes,6,opt,name=plugin_dir,json=pluginDir,proto3" json:"plugin_dir,omitempty"` + PluginDir string `protobuf:"bytes,9,opt,name=plugin_dir,json=pluginDir,proto3" json:"plugin_dir,omitempty"` // The list of: // - custom chain's VM name // - genesis file path @@ -628,26 +644,24 @@ type StartRequest struct { // If this field is set to none (by default), the node/network-runner // does not install the custom chain and does not create the chain, // even if the VM binary exists on the local plugins directory. - BlockchainSpecs []*BlockchainSpec `protobuf:"bytes,7,rep,name=blockchain_specs,json=blockchainSpecs,proto3" json:"blockchain_specs,omitempty"` - CustomNodeConfigs map[string]string `protobuf:"bytes,8,rep,name=custom_node_configs,json=customNodeConfigs,proto3" json:"custom_node_configs,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + BlockchainSpecs []*BlockchainSpec `protobuf:"bytes,10,rep,name=blockchain_specs,json=blockchainSpecs,proto3" json:"blockchain_specs,omitempty"` + CustomNodeConfigs map[string]string `protobuf:"bytes,11,rep,name=custom_node_configs,json=customNodeConfigs,proto3" json:"custom_node_configs,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Map of chain name to config file contents. // If specified, will create a file "chainname/config.json" with // the contents provided here. - ChainConfigs map[string]string `protobuf:"bytes,9,rep,name=chain_configs,json=chainConfigs,proto3" json:"chain_configs,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + ChainConfigs map[string]string `protobuf:"bytes,12,rep,name=chain_configs,json=chainConfigs,proto3" json:"chain_configs,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Map of chain name to upgrade file contents. // If specified, will create a file "chainname/upgrade.json" with // the contents provided here. - UpgradeConfigs map[string]string `protobuf:"bytes,10,rep,name=upgrade_configs,json=upgradeConfigs,proto3" json:"upgrade_configs,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + UpgradeConfigs map[string]string `protobuf:"bytes,13,rep,name=upgrade_configs,json=upgradeConfigs,proto3" json:"upgrade_configs,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // reassign default/custom ports if they are already taken - ReassignPortsIfUsed *bool `protobuf:"varint,11,opt,name=reassign_ports_if_used,json=reassignPortsIfUsed,proto3,oneof" json:"reassign_ports_if_used,omitempty"` + ReassignPortsIfUsed *bool `protobuf:"varint,14,opt,name=reassign_ports_if_used,json=reassignPortsIfUsed,proto3,oneof" json:"reassign_ports_if_used,omitempty"` // use dynamic ports instead of default ones - DynamicPorts *bool `protobuf:"varint,12,opt,name=dynamic_ports,json=dynamicPorts,proto3,oneof" json:"dynamic_ports,omitempty"` + DynamicPorts *bool `protobuf:"varint,15,opt,name=dynamic_ports,json=dynamicPorts,proto3,oneof" json:"dynamic_ports,omitempty"` // Map of chain id to chain config file contents. // If specified, will create a file "chainid.json" under chains config dir with // the contents provided here. - ChainConfigFiles map[string]string `protobuf:"bytes,13,rep,name=chain_config_files,json=chainConfigFiles,proto3" json:"chain_config_files,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + ChainConfigFiles map[string]string `protobuf:"bytes,16,rep,name=chain_config_files,json=chainConfigFiles,proto3" json:"chain_config_files,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } func (x *StartRequest) Reset() { @@ -680,6 +694,20 @@ func (*StartRequest) Descriptor() ([]byte, []int) { return file_rpcpb_rpc_proto_rawDescGZIP(), []int{9} } +func (x *StartRequest) GetNetworkName() string { + if x != nil { + return x.NetworkName + } + return "" +} + +func (x *StartRequest) GetNodeType() string { + if x != nil { + return x.NodeType + } + return "" +} + func (x *StartRequest) GetExecPath() string { if x != nil { return x.ExecPath @@ -772,9 +800,9 @@ func (x *StartRequest) GetChainConfigFiles() map[string]string { } type RPCVersionRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields } func (x *RPCVersionRequest) Reset() { @@ -808,10 +836,11 @@ func (*RPCVersionRequest) Descriptor() ([]byte, []int) { } type RPCVersionResponse struct { - state protoimpl.MessageState `protogen:"open.v1"` - Version uint32 `protobuf:"varint,1,opt,name=version,proto3" json:"version,omitempty"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Version uint32 `protobuf:"varint,1,opt,name=version,proto3" json:"version,omitempty"` } func (x *RPCVersionResponse) Reset() { @@ -852,11 +881,12 @@ func (x *RPCVersionResponse) GetVersion() uint32 { } type StartResponse struct { - state protoimpl.MessageState `protogen:"open.v1"` - ClusterInfo *ClusterInfo `protobuf:"bytes,1,opt,name=cluster_info,json=clusterInfo,proto3" json:"cluster_info,omitempty"` - ChainIds []string `protobuf:"bytes,2,rep,name=chain_ids,json=chainIds,proto3" json:"chain_ids,omitempty"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ClusterInfo *ClusterInfo `protobuf:"bytes,1,opt,name=cluster_info,json=clusterInfo,proto3" json:"cluster_info,omitempty"` + ChainIds []string `protobuf:"bytes,2,rep,name=chain_ids,json=chainIds,proto3" json:"chain_ids,omitempty"` } func (x *StartResponse) Reset() { @@ -904,13 +934,14 @@ func (x *StartResponse) GetChainIds() []string { } type ChainSpec struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // if empty, assumes all nodes should be participants Participants []string `protobuf:"bytes,1,rep,name=participants,proto3" json:"participants,omitempty"` // either file path or file contents ChainConfigFile string `protobuf:"bytes,2,opt,name=chain_config_file,json=chainConfigFile,proto3" json:"chain_config_file,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache } func (x *ChainSpec) Reset() { @@ -958,24 +989,25 @@ func (x *ChainSpec) GetChainConfigFile() string { } type ElasticChainSpec struct { - state protoimpl.MessageState `protogen:"open.v1"` - ChainId string `protobuf:"bytes,1,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` - AssetName string `protobuf:"bytes,2,opt,name=asset_name,json=assetName,proto3" json:"asset_name,omitempty"` - AssetSymbol string `protobuf:"bytes,3,opt,name=asset_symbol,json=assetSymbol,proto3" json:"asset_symbol,omitempty"` - InitialSupply uint64 `protobuf:"varint,4,opt,name=initial_supply,json=initialSupply,proto3" json:"initial_supply,omitempty"` - MaxSupply uint64 `protobuf:"varint,5,opt,name=max_supply,json=maxSupply,proto3" json:"max_supply,omitempty"` - MinConsumptionRate uint64 `protobuf:"varint,6,opt,name=min_consumption_rate,json=minConsumptionRate,proto3" json:"min_consumption_rate,omitempty"` - MaxConsumptionRate uint64 `protobuf:"varint,7,opt,name=max_consumption_rate,json=maxConsumptionRate,proto3" json:"max_consumption_rate,omitempty"` - MinValidatorStake uint64 `protobuf:"varint,8,opt,name=min_validator_stake,json=minValidatorStake,proto3" json:"min_validator_stake,omitempty"` - MaxValidatorStake uint64 `protobuf:"varint,9,opt,name=max_validator_stake,json=maxValidatorStake,proto3" json:"max_validator_stake,omitempty"` - MinStakeDuration uint64 `protobuf:"varint,10,opt,name=min_stake_duration,json=minStakeDuration,proto3" json:"min_stake_duration,omitempty"` - MaxStakeDuration uint64 `protobuf:"varint,11,opt,name=max_stake_duration,json=maxStakeDuration,proto3" json:"max_stake_duration,omitempty"` - MinDelegationFee uint32 `protobuf:"varint,12,opt,name=min_delegation_fee,json=minDelegationFee,proto3" json:"min_delegation_fee,omitempty"` - MinDelegatorStake uint64 `protobuf:"varint,13,opt,name=min_delegator_stake,json=minDelegatorStake,proto3" json:"min_delegator_stake,omitempty"` - MaxValidatorWeightFactor uint32 `protobuf:"varint,14,opt,name=max_validator_weight_factor,json=maxValidatorWeightFactor,proto3" json:"max_validator_weight_factor,omitempty"` - UptimeRequirement uint32 `protobuf:"varint,15,opt,name=uptime_requirement,json=uptimeRequirement,proto3" json:"uptime_requirement,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ChainId string `protobuf:"bytes,1,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` + AssetName string `protobuf:"bytes,2,opt,name=asset_name,json=assetName,proto3" json:"asset_name,omitempty"` + AssetSymbol string `protobuf:"bytes,3,opt,name=asset_symbol,json=assetSymbol,proto3" json:"asset_symbol,omitempty"` + InitialSupply uint64 `protobuf:"varint,4,opt,name=initial_supply,json=initialSupply,proto3" json:"initial_supply,omitempty"` + MaxSupply uint64 `protobuf:"varint,5,opt,name=max_supply,json=maxSupply,proto3" json:"max_supply,omitempty"` + MinConsumptionRate uint64 `protobuf:"varint,6,opt,name=min_consumption_rate,json=minConsumptionRate,proto3" json:"min_consumption_rate,omitempty"` + MaxConsumptionRate uint64 `protobuf:"varint,7,opt,name=max_consumption_rate,json=maxConsumptionRate,proto3" json:"max_consumption_rate,omitempty"` + MinValidatorStake uint64 `protobuf:"varint,8,opt,name=min_validator_stake,json=minValidatorStake,proto3" json:"min_validator_stake,omitempty"` + MaxValidatorStake uint64 `protobuf:"varint,9,opt,name=max_validator_stake,json=maxValidatorStake,proto3" json:"max_validator_stake,omitempty"` + MinStakeDuration uint64 `protobuf:"varint,10,opt,name=min_stake_duration,json=minStakeDuration,proto3" json:"min_stake_duration,omitempty"` + MaxStakeDuration uint64 `protobuf:"varint,11,opt,name=max_stake_duration,json=maxStakeDuration,proto3" json:"max_stake_duration,omitempty"` + MinDelegationFee uint32 `protobuf:"varint,12,opt,name=min_delegation_fee,json=minDelegationFee,proto3" json:"min_delegation_fee,omitempty"` + MinDelegatorStake uint64 `protobuf:"varint,13,opt,name=min_delegator_stake,json=minDelegatorStake,proto3" json:"min_delegator_stake,omitempty"` + MaxValidatorWeightFactor uint32 `protobuf:"varint,14,opt,name=max_validator_weight_factor,json=maxValidatorWeightFactor,proto3" json:"max_validator_weight_factor,omitempty"` + UptimeRequirement uint32 `protobuf:"varint,15,opt,name=uptime_requirement,json=uptimeRequirement,proto3" json:"uptime_requirement,omitempty"` } func (x *ElasticChainSpec) Reset() { @@ -1114,10 +1146,11 @@ func (x *ElasticChainSpec) GetUptimeRequirement() uint32 { } type TransformElasticChainsRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - ElasticChainSpec []*ElasticChainSpec `protobuf:"bytes,1,rep,name=elastic_chain_spec,json=elasticChainSpec,proto3" json:"elastic_chain_spec,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ElasticChainSpec []*ElasticChainSpec `protobuf:"bytes,1,rep,name=elastic_chain_spec,json=elasticChainSpec,proto3" json:"elastic_chain_spec,omitempty"` } func (x *TransformElasticChainsRequest) Reset() { @@ -1158,12 +1191,13 @@ func (x *TransformElasticChainsRequest) GetElasticChainSpec() []*ElasticChainSpe } type TransformElasticChainsResponse struct { - state protoimpl.MessageState `protogen:"open.v1"` - ClusterInfo *ClusterInfo `protobuf:"bytes,1,opt,name=cluster_info,json=clusterInfo,proto3" json:"cluster_info,omitempty"` - TxIds []string `protobuf:"bytes,2,rep,name=tx_ids,json=txIds,proto3" json:"tx_ids,omitempty"` - AssetIds []string `protobuf:"bytes,3,rep,name=asset_ids,json=assetIds,proto3" json:"asset_ids,omitempty"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ClusterInfo *ClusterInfo `protobuf:"bytes,1,opt,name=cluster_info,json=clusterInfo,proto3" json:"cluster_info,omitempty"` + TxIds []string `protobuf:"bytes,2,rep,name=tx_ids,json=txIds,proto3" json:"tx_ids,omitempty"` + AssetIds []string `protobuf:"bytes,3,rep,name=asset_ids,json=assetIds,proto3" json:"asset_ids,omitempty"` } func (x *TransformElasticChainsResponse) Reset() { @@ -1218,15 +1252,16 @@ func (x *TransformElasticChainsResponse) GetAssetIds() []string { } type PermissionlessValidatorSpec struct { - state protoimpl.MessageState `protogen:"open.v1"` - ChainId string `protobuf:"bytes,1,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` - NodeName string `protobuf:"bytes,2,opt,name=node_name,json=nodeName,proto3" json:"node_name,omitempty"` - StakedTokenAmount uint64 `protobuf:"varint,3,opt,name=staked_token_amount,json=stakedTokenAmount,proto3" json:"staked_token_amount,omitempty"` - AssetId string `protobuf:"bytes,4,opt,name=asset_id,json=assetId,proto3" json:"asset_id,omitempty"` - StartTime string `protobuf:"bytes,5,opt,name=start_time,json=startTime,proto3" json:"start_time,omitempty"` - StakeDuration uint64 `protobuf:"varint,6,opt,name=stake_duration,json=stakeDuration,proto3" json:"stake_duration,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ChainId string `protobuf:"bytes,1,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` + NodeName string `protobuf:"bytes,2,opt,name=node_name,json=nodeName,proto3" json:"node_name,omitempty"` + StakedTokenAmount uint64 `protobuf:"varint,3,opt,name=staked_token_amount,json=stakedTokenAmount,proto3" json:"staked_token_amount,omitempty"` + AssetId string `protobuf:"bytes,4,opt,name=asset_id,json=assetId,proto3" json:"asset_id,omitempty"` + StartTime string `protobuf:"bytes,5,opt,name=start_time,json=startTime,proto3" json:"start_time,omitempty"` + StakeDuration uint64 `protobuf:"varint,6,opt,name=stake_duration,json=stakeDuration,proto3" json:"stake_duration,omitempty"` } func (x *PermissionlessValidatorSpec) Reset() { @@ -1302,10 +1337,11 @@ func (x *PermissionlessValidatorSpec) GetStakeDuration() uint64 { } type AddPermissionlessValidatorRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - ValidatorSpec []*PermissionlessValidatorSpec `protobuf:"bytes,1,rep,name=validator_spec,json=validatorSpec,proto3" json:"validator_spec,omitempty"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ValidatorSpec []*PermissionlessValidatorSpec `protobuf:"bytes,1,rep,name=validator_spec,json=validatorSpec,proto3" json:"validator_spec,omitempty"` } func (x *AddPermissionlessValidatorRequest) Reset() { @@ -1346,10 +1382,11 @@ func (x *AddPermissionlessValidatorRequest) GetValidatorSpec() []*Permissionless } type AddPermissionlessValidatorResponse struct { - state protoimpl.MessageState `protogen:"open.v1"` - ClusterInfo *ClusterInfo `protobuf:"bytes,1,opt,name=cluster_info,json=clusterInfo,proto3" json:"cluster_info,omitempty"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ClusterInfo *ClusterInfo `protobuf:"bytes,1,opt,name=cluster_info,json=clusterInfo,proto3" json:"cluster_info,omitempty"` } func (x *AddPermissionlessValidatorResponse) Reset() { @@ -1390,11 +1427,12 @@ func (x *AddPermissionlessValidatorResponse) GetClusterInfo() *ClusterInfo { } type RemoveChainValidatorSpec struct { - state protoimpl.MessageState `protogen:"open.v1"` - ChainId string `protobuf:"bytes,1,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` - NodeNames []string `protobuf:"bytes,2,rep,name=node_names,json=nodeNames,proto3" json:"node_names,omitempty"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ChainId string `protobuf:"bytes,1,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` + NodeNames []string `protobuf:"bytes,2,rep,name=node_names,json=nodeNames,proto3" json:"node_names,omitempty"` } func (x *RemoveChainValidatorSpec) Reset() { @@ -1442,10 +1480,11 @@ func (x *RemoveChainValidatorSpec) GetNodeNames() []string { } type RemoveChainValidatorRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - ValidatorSpec []*RemoveChainValidatorSpec `protobuf:"bytes,1,rep,name=validator_spec,json=validatorSpec,proto3" json:"validator_spec,omitempty"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ValidatorSpec []*RemoveChainValidatorSpec `protobuf:"bytes,1,rep,name=validator_spec,json=validatorSpec,proto3" json:"validator_spec,omitempty"` } func (x *RemoveChainValidatorRequest) Reset() { @@ -1486,10 +1525,11 @@ func (x *RemoveChainValidatorRequest) GetValidatorSpec() []*RemoveChainValidator } type RemoveChainValidatorResponse struct { - state protoimpl.MessageState `protogen:"open.v1"` - ClusterInfo *ClusterInfo `protobuf:"bytes,1,opt,name=cluster_info,json=clusterInfo,proto3" json:"cluster_info,omitempty"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ClusterInfo *ClusterInfo `protobuf:"bytes,1,opt,name=cluster_info,json=clusterInfo,proto3" json:"cluster_info,omitempty"` } func (x *RemoveChainValidatorResponse) Reset() { @@ -1530,8 +1570,11 @@ func (x *RemoveChainValidatorResponse) GetClusterInfo() *ClusterInfo { } type BlockchainSpec struct { - state protoimpl.MessageState `protogen:"open.v1"` - VmName string `protobuf:"bytes,1,opt,name=vm_name,json=vmName,proto3" json:"vm_name,omitempty"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + VmName string `protobuf:"bytes,1,opt,name=vm_name,json=vmName,proto3" json:"vm_name,omitempty"` // either file path or file contents Genesis string `protobuf:"bytes,2,opt,name=genesis,proto3" json:"genesis,omitempty"` // either a chain_id is given for a previously created chain, @@ -1545,8 +1588,6 @@ type BlockchainSpec struct { BlockchainAlias string `protobuf:"bytes,7,opt,name=blockchain_alias,json=blockchainAlias,proto3" json:"blockchain_alias,omitempty"` // Per node chain config, either file path or file contents PerNodeChainConfig string `protobuf:"bytes,8,opt,name=per_node_chain_config,json=perNodeChainConfig,proto3" json:"per_node_chain_config,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache } func (x *BlockchainSpec) Reset() { @@ -1636,7 +1677,10 @@ func (x *BlockchainSpec) GetPerNodeChainConfig() string { } type CreateBlockchainsRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The list of: // - custom chain's VM name // - genesis file path @@ -1653,8 +1697,6 @@ type CreateBlockchainsRequest struct { // If this field is set to none (by default), the node/network-runner // will return error BlockchainSpecs []*BlockchainSpec `protobuf:"bytes,1,rep,name=blockchain_specs,json=blockchainSpecs,proto3" json:"blockchain_specs,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache } func (x *CreateBlockchainsRequest) Reset() { @@ -1695,11 +1737,12 @@ func (x *CreateBlockchainsRequest) GetBlockchainSpecs() []*BlockchainSpec { } type CreateBlockchainsResponse struct { - state protoimpl.MessageState `protogen:"open.v1"` - ClusterInfo *ClusterInfo `protobuf:"bytes,1,opt,name=cluster_info,json=clusterInfo,proto3" json:"cluster_info,omitempty"` - ChainIds []string `protobuf:"bytes,2,rep,name=chain_ids,json=chainIds,proto3" json:"chain_ids,omitempty"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ClusterInfo *ClusterInfo `protobuf:"bytes,1,opt,name=cluster_info,json=clusterInfo,proto3" json:"cluster_info,omitempty"` + ChainIds []string `protobuf:"bytes,2,rep,name=chain_ids,json=chainIds,proto3" json:"chain_ids,omitempty"` } func (x *CreateBlockchainsResponse) Reset() { @@ -1747,10 +1790,11 @@ func (x *CreateBlockchainsResponse) GetChainIds() []string { } type CreateChainsRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - ChainSpecs []*ChainSpec `protobuf:"bytes,1,rep,name=chain_specs,json=chainSpecs,proto3" json:"chain_specs,omitempty"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ChainSpecs []*ChainSpec `protobuf:"bytes,1,rep,name=chain_specs,json=chainSpecs,proto3" json:"chain_specs,omitempty"` } func (x *CreateChainsRequest) Reset() { @@ -1791,11 +1835,12 @@ func (x *CreateChainsRequest) GetChainSpecs() []*ChainSpec { } type CreateChainsResponse struct { - state protoimpl.MessageState `protogen:"open.v1"` - ClusterInfo *ClusterInfo `protobuf:"bytes,1,opt,name=cluster_info,json=clusterInfo,proto3" json:"cluster_info,omitempty"` - ChainIds []string `protobuf:"bytes,2,rep,name=chain_ids,json=chainIds,proto3" json:"chain_ids,omitempty"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ClusterInfo *ClusterInfo `protobuf:"bytes,1,opt,name=cluster_info,json=clusterInfo,proto3" json:"cluster_info,omitempty"` + ChainIds []string `protobuf:"bytes,2,rep,name=chain_ids,json=chainIds,proto3" json:"chain_ids,omitempty"` } func (x *CreateChainsResponse) Reset() { @@ -1843,9 +1888,13 @@ func (x *CreateChainsResponse) GetChainIds() []string { } type HealthRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Network name to check health for + // If empty, checks overall server health + NetworkName *string `protobuf:"bytes,1,opt,name=network_name,json=networkName,proto3,oneof" json:"network_name,omitempty"` } func (x *HealthRequest) Reset() { @@ -1878,11 +1927,21 @@ func (*HealthRequest) Descriptor() ([]byte, []int) { return file_rpcpb_rpc_proto_rawDescGZIP(), []int{28} } +func (x *HealthRequest) GetNetworkName() string { + if x != nil && x.NetworkName != nil { + return *x.NetworkName + } + return "" +} + type HealthResponse struct { - state protoimpl.MessageState `protogen:"open.v1"` - ClusterInfo *ClusterInfo `protobuf:"bytes,1,opt,name=cluster_info,json=clusterInfo,proto3" json:"cluster_info,omitempty"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ClusterInfo *ClusterInfo `protobuf:"bytes,1,opt,name=cluster_info,json=clusterInfo,proto3" json:"cluster_info,omitempty"` + // Network-specific health information + NetworkHealth *NetworkHealth `protobuf:"bytes,2,opt,name=network_health,json=networkHealth,proto3,oneof" json:"network_health,omitempty"` } func (x *HealthResponse) Reset() { @@ -1922,15 +1981,99 @@ func (x *HealthResponse) GetClusterInfo() *ClusterInfo { return nil } -type URIsRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - unknownFields protoimpl.UnknownFields +func (x *HealthResponse) GetNetworkHealth() *NetworkHealth { + if x != nil { + return x.NetworkHealth + } + return nil +} + +type NetworkHealth struct { + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + NetworkName string `protobuf:"bytes,1,opt,name=network_name,json=networkName,proto3" json:"network_name,omitempty"` + NetworkId uint32 `protobuf:"varint,2,opt,name=network_id,json=networkId,proto3" json:"network_id,omitempty"` + Healthy bool `protobuf:"varint,3,opt,name=healthy,proto3" json:"healthy,omitempty"` + HealthyNodes []string `protobuf:"bytes,4,rep,name=healthy_nodes,json=healthyNodes,proto3" json:"healthy_nodes,omitempty"` + UnhealthyNodes []string `protobuf:"bytes,5,rep,name=unhealthy_nodes,json=unhealthyNodes,proto3" json:"unhealthy_nodes,omitempty"` +} + +func (x *NetworkHealth) Reset() { + *x = NetworkHealth{} + mi := &file_rpcpb_rpc_proto_msgTypes[30] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *NetworkHealth) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NetworkHealth) ProtoMessage() {} + +func (x *NetworkHealth) ProtoReflect() protoreflect.Message { + mi := &file_rpcpb_rpc_proto_msgTypes[30] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use NetworkHealth.ProtoReflect.Descriptor instead. +func (*NetworkHealth) Descriptor() ([]byte, []int) { + return file_rpcpb_rpc_proto_rawDescGZIP(), []int{30} +} + +func (x *NetworkHealth) GetNetworkName() string { + if x != nil { + return x.NetworkName + } + return "" +} + +func (x *NetworkHealth) GetNetworkId() uint32 { + if x != nil { + return x.NetworkId + } + return 0 +} + +func (x *NetworkHealth) GetHealthy() bool { + if x != nil { + return x.Healthy + } + return false +} + +func (x *NetworkHealth) GetHealthyNodes() []string { + if x != nil { + return x.HealthyNodes + } + return nil +} + +func (x *NetworkHealth) GetUnhealthyNodes() []string { + if x != nil { + return x.UnhealthyNodes + } + return nil +} + +type URIsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields } func (x *URIsRequest) Reset() { *x = URIsRequest{} - mi := &file_rpcpb_rpc_proto_msgTypes[30] + mi := &file_rpcpb_rpc_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1942,7 +2085,7 @@ func (x *URIsRequest) String() string { func (*URIsRequest) ProtoMessage() {} func (x *URIsRequest) ProtoReflect() protoreflect.Message { - mi := &file_rpcpb_rpc_proto_msgTypes[30] + mi := &file_rpcpb_rpc_proto_msgTypes[31] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1955,19 +2098,20 @@ func (x *URIsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use URIsRequest.ProtoReflect.Descriptor instead. func (*URIsRequest) Descriptor() ([]byte, []int) { - return file_rpcpb_rpc_proto_rawDescGZIP(), []int{30} + return file_rpcpb_rpc_proto_rawDescGZIP(), []int{31} } type URIsResponse struct { - state protoimpl.MessageState `protogen:"open.v1"` - Uris []string `protobuf:"bytes,1,rep,name=uris,proto3" json:"uris,omitempty"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Uris []string `protobuf:"bytes,1,rep,name=uris,proto3" json:"uris,omitempty"` } func (x *URIsResponse) Reset() { *x = URIsResponse{} - mi := &file_rpcpb_rpc_proto_msgTypes[31] + mi := &file_rpcpb_rpc_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1979,7 +2123,7 @@ func (x *URIsResponse) String() string { func (*URIsResponse) ProtoMessage() {} func (x *URIsResponse) ProtoReflect() protoreflect.Message { - mi := &file_rpcpb_rpc_proto_msgTypes[31] + mi := &file_rpcpb_rpc_proto_msgTypes[32] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1992,7 +2136,7 @@ func (x *URIsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use URIsResponse.ProtoReflect.Descriptor instead. func (*URIsResponse) Descriptor() ([]byte, []int) { - return file_rpcpb_rpc_proto_rawDescGZIP(), []int{31} + return file_rpcpb_rpc_proto_rawDescGZIP(), []int{32} } func (x *URIsResponse) GetUris() []string { @@ -2003,14 +2147,18 @@ func (x *URIsResponse) GetUris() []string { } type WaitForHealthyRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Network name to wait for + // If empty, waits for any network to be healthy + NetworkName *string `protobuf:"bytes,1,opt,name=network_name,json=networkName,proto3,oneof" json:"network_name,omitempty"` } func (x *WaitForHealthyRequest) Reset() { *x = WaitForHealthyRequest{} - mi := &file_rpcpb_rpc_proto_msgTypes[32] + mi := &file_rpcpb_rpc_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2022,7 +2170,7 @@ func (x *WaitForHealthyRequest) String() string { func (*WaitForHealthyRequest) ProtoMessage() {} func (x *WaitForHealthyRequest) ProtoReflect() protoreflect.Message { - mi := &file_rpcpb_rpc_proto_msgTypes[32] + mi := &file_rpcpb_rpc_proto_msgTypes[33] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2035,19 +2183,27 @@ func (x *WaitForHealthyRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use WaitForHealthyRequest.ProtoReflect.Descriptor instead. func (*WaitForHealthyRequest) Descriptor() ([]byte, []int) { - return file_rpcpb_rpc_proto_rawDescGZIP(), []int{32} + return file_rpcpb_rpc_proto_rawDescGZIP(), []int{33} +} + +func (x *WaitForHealthyRequest) GetNetworkName() string { + if x != nil && x.NetworkName != nil { + return *x.NetworkName + } + return "" } type WaitForHealthyResponse struct { - state protoimpl.MessageState `protogen:"open.v1"` - ClusterInfo *ClusterInfo `protobuf:"bytes,1,opt,name=cluster_info,json=clusterInfo,proto3" json:"cluster_info,omitempty"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ClusterInfo *ClusterInfo `protobuf:"bytes,1,opt,name=cluster_info,json=clusterInfo,proto3" json:"cluster_info,omitempty"` } func (x *WaitForHealthyResponse) Reset() { *x = WaitForHealthyResponse{} - mi := &file_rpcpb_rpc_proto_msgTypes[33] + mi := &file_rpcpb_rpc_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2059,7 +2215,7 @@ func (x *WaitForHealthyResponse) String() string { func (*WaitForHealthyResponse) ProtoMessage() {} func (x *WaitForHealthyResponse) ProtoReflect() protoreflect.Message { - mi := &file_rpcpb_rpc_proto_msgTypes[33] + mi := &file_rpcpb_rpc_proto_msgTypes[34] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2072,7 +2228,7 @@ func (x *WaitForHealthyResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use WaitForHealthyResponse.ProtoReflect.Descriptor instead. func (*WaitForHealthyResponse) Descriptor() ([]byte, []int) { - return file_rpcpb_rpc_proto_rawDescGZIP(), []int{33} + return file_rpcpb_rpc_proto_rawDescGZIP(), []int{34} } func (x *WaitForHealthyResponse) GetClusterInfo() *ClusterInfo { @@ -2083,14 +2239,18 @@ func (x *WaitForHealthyResponse) GetClusterInfo() *ClusterInfo { } type StatusRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Network name to get status for + // If empty, returns overall server status + NetworkName *string `protobuf:"bytes,1,opt,name=network_name,json=networkName,proto3,oneof" json:"network_name,omitempty"` } func (x *StatusRequest) Reset() { *x = StatusRequest{} - mi := &file_rpcpb_rpc_proto_msgTypes[34] + mi := &file_rpcpb_rpc_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2102,7 +2262,7 @@ func (x *StatusRequest) String() string { func (*StatusRequest) ProtoMessage() {} func (x *StatusRequest) ProtoReflect() protoreflect.Message { - mi := &file_rpcpb_rpc_proto_msgTypes[34] + mi := &file_rpcpb_rpc_proto_msgTypes[35] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2115,19 +2275,29 @@ func (x *StatusRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use StatusRequest.ProtoReflect.Descriptor instead. func (*StatusRequest) Descriptor() ([]byte, []int) { - return file_rpcpb_rpc_proto_rawDescGZIP(), []int{34} + return file_rpcpb_rpc_proto_rawDescGZIP(), []int{35} +} + +func (x *StatusRequest) GetNetworkName() string { + if x != nil && x.NetworkName != nil { + return *x.NetworkName + } + return "" } type StatusResponse struct { - state protoimpl.MessageState `protogen:"open.v1"` - ClusterInfo *ClusterInfo `protobuf:"bytes,1,opt,name=cluster_info,json=clusterInfo,proto3" json:"cluster_info,omitempty"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ClusterInfo *ClusterInfo `protobuf:"bytes,1,opt,name=cluster_info,json=clusterInfo,proto3" json:"cluster_info,omitempty"` + // Network-specific status information + NetworkStatus *NetworkStatus `protobuf:"bytes,2,opt,name=network_status,json=networkStatus,proto3,oneof" json:"network_status,omitempty"` } func (x *StatusResponse) Reset() { *x = StatusResponse{} - mi := &file_rpcpb_rpc_proto_msgTypes[35] + mi := &file_rpcpb_rpc_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2139,7 +2309,7 @@ func (x *StatusResponse) String() string { func (*StatusResponse) ProtoMessage() {} func (x *StatusResponse) ProtoReflect() protoreflect.Message { - mi := &file_rpcpb_rpc_proto_msgTypes[35] + mi := &file_rpcpb_rpc_proto_msgTypes[36] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2152,7 +2322,7 @@ func (x *StatusResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use StatusResponse.ProtoReflect.Descriptor instead. func (*StatusResponse) Descriptor() ([]byte, []int) { - return file_rpcpb_rpc_proto_rawDescGZIP(), []int{35} + return file_rpcpb_rpc_proto_rawDescGZIP(), []int{36} } func (x *StatusResponse) GetClusterInfo() *ClusterInfo { @@ -2162,16 +2332,109 @@ func (x *StatusResponse) GetClusterInfo() *ClusterInfo { return nil } -type StreamStatusRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - PushInterval int64 `protobuf:"varint,1,opt,name=push_interval,json=pushInterval,proto3" json:"push_interval,omitempty"` - unknownFields protoimpl.UnknownFields +func (x *StatusResponse) GetNetworkStatus() *NetworkStatus { + if x != nil { + return x.NetworkStatus + } + return nil +} + +type NetworkStatus struct { + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + NetworkName string `protobuf:"bytes,1,opt,name=network_name,json=networkName,proto3" json:"network_name,omitempty"` + NetworkId uint32 `protobuf:"varint,2,opt,name=network_id,json=networkId,proto3" json:"network_id,omitempty"` + Status string `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"` // "running", "stopped", "starting", "error" + NumNodes uint32 `protobuf:"varint,4,opt,name=num_nodes,json=numNodes,proto3" json:"num_nodes,omitempty"` + Nodes []*NodeInfo `protobuf:"bytes,5,rep,name=nodes,proto3" json:"nodes,omitempty"` + Chains []*ChainInfo `protobuf:"bytes,6,rep,name=chains,proto3" json:"chains,omitempty"` +} + +func (x *NetworkStatus) Reset() { + *x = NetworkStatus{} + mi := &file_rpcpb_rpc_proto_msgTypes[37] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *NetworkStatus) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NetworkStatus) ProtoMessage() {} + +func (x *NetworkStatus) ProtoReflect() protoreflect.Message { + mi := &file_rpcpb_rpc_proto_msgTypes[37] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use NetworkStatus.ProtoReflect.Descriptor instead. +func (*NetworkStatus) Descriptor() ([]byte, []int) { + return file_rpcpb_rpc_proto_rawDescGZIP(), []int{37} +} + +func (x *NetworkStatus) GetNetworkName() string { + if x != nil { + return x.NetworkName + } + return "" +} + +func (x *NetworkStatus) GetNetworkId() uint32 { + if x != nil { + return x.NetworkId + } + return 0 +} + +func (x *NetworkStatus) GetStatus() string { + if x != nil { + return x.Status + } + return "" +} + +func (x *NetworkStatus) GetNumNodes() uint32 { + if x != nil { + return x.NumNodes + } + return 0 +} + +func (x *NetworkStatus) GetNodes() []*NodeInfo { + if x != nil { + return x.Nodes + } + return nil +} + +func (x *NetworkStatus) GetChains() []*ChainInfo { + if x != nil { + return x.Chains + } + return nil +} + +type StreamStatusRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + PushInterval int64 `protobuf:"varint,1,opt,name=push_interval,json=pushInterval,proto3" json:"push_interval,omitempty"` } func (x *StreamStatusRequest) Reset() { *x = StreamStatusRequest{} - mi := &file_rpcpb_rpc_proto_msgTypes[36] + mi := &file_rpcpb_rpc_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2183,7 +2446,7 @@ func (x *StreamStatusRequest) String() string { func (*StreamStatusRequest) ProtoMessage() {} func (x *StreamStatusRequest) ProtoReflect() protoreflect.Message { - mi := &file_rpcpb_rpc_proto_msgTypes[36] + mi := &file_rpcpb_rpc_proto_msgTypes[38] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2196,7 +2459,7 @@ func (x *StreamStatusRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use StreamStatusRequest.ProtoReflect.Descriptor instead. func (*StreamStatusRequest) Descriptor() ([]byte, []int) { - return file_rpcpb_rpc_proto_rawDescGZIP(), []int{36} + return file_rpcpb_rpc_proto_rawDescGZIP(), []int{38} } func (x *StreamStatusRequest) GetPushInterval() int64 { @@ -2207,15 +2470,16 @@ func (x *StreamStatusRequest) GetPushInterval() int64 { } type StreamStatusResponse struct { - state protoimpl.MessageState `protogen:"open.v1"` - ClusterInfo *ClusterInfo `protobuf:"bytes,1,opt,name=cluster_info,json=clusterInfo,proto3" json:"cluster_info,omitempty"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ClusterInfo *ClusterInfo `protobuf:"bytes,1,opt,name=cluster_info,json=clusterInfo,proto3" json:"cluster_info,omitempty"` } func (x *StreamStatusResponse) Reset() { *x = StreamStatusResponse{} - mi := &file_rpcpb_rpc_proto_msgTypes[37] + mi := &file_rpcpb_rpc_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2227,7 +2491,7 @@ func (x *StreamStatusResponse) String() string { func (*StreamStatusResponse) ProtoMessage() {} func (x *StreamStatusResponse) ProtoReflect() protoreflect.Message { - mi := &file_rpcpb_rpc_proto_msgTypes[37] + mi := &file_rpcpb_rpc_proto_msgTypes[39] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2240,7 +2504,7 @@ func (x *StreamStatusResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use StreamStatusResponse.ProtoReflect.Descriptor instead. func (*StreamStatusResponse) Descriptor() ([]byte, []int) { - return file_rpcpb_rpc_proto_rawDescGZIP(), []int{37} + return file_rpcpb_rpc_proto_rawDescGZIP(), []int{39} } func (x *StreamStatusResponse) GetClusterInfo() *ClusterInfo { @@ -2251,7 +2515,10 @@ func (x *StreamStatusResponse) GetClusterInfo() *ClusterInfo { } type RestartNodeRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // Must be a valid node name. Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // Optional fields are set to the previous values if empty. @@ -2260,24 +2527,22 @@ type RestartNodeRequest struct { // Map of chain name to config file contents. // If specified, will create a file "chainname/config.json" with // the contents provided here. - ChainConfigs map[string]string `protobuf:"bytes,4,rep,name=chain_configs,json=chainConfigs,proto3" json:"chain_configs,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + ChainConfigs map[string]string `protobuf:"bytes,4,rep,name=chain_configs,json=chainConfigs,proto3" json:"chain_configs,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Map of chain name to config file contents. // If specified, will create a file "chainname/upgrade.json" with // the contents provided here. - UpgradeConfigs map[string]string `protobuf:"bytes,5,rep,name=upgrade_configs,json=upgradeConfigs,proto3" json:"upgrade_configs,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + UpgradeConfigs map[string]string `protobuf:"bytes,5,rep,name=upgrade_configs,json=upgradeConfigs,proto3" json:"upgrade_configs,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Map of chain id to chain config file contents. // If specified, will create a file "chainid.json" under chains config dir with // the contents provided here. - ChainConfigFiles map[string]string `protobuf:"bytes,6,rep,name=chain_config_files,json=chainConfigFiles,proto3" json:"chain_config_files,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + ChainConfigFiles map[string]string `protobuf:"bytes,6,rep,name=chain_config_files,json=chainConfigFiles,proto3" json:"chain_config_files,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Plugin dir from which to load all custom VM executables. - PluginDir string `protobuf:"bytes,7,opt,name=plugin_dir,json=pluginDir,proto3" json:"plugin_dir,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + PluginDir string `protobuf:"bytes,7,opt,name=plugin_dir,json=pluginDir,proto3" json:"plugin_dir,omitempty"` } func (x *RestartNodeRequest) Reset() { *x = RestartNodeRequest{} - mi := &file_rpcpb_rpc_proto_msgTypes[38] + mi := &file_rpcpb_rpc_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2289,7 +2554,7 @@ func (x *RestartNodeRequest) String() string { func (*RestartNodeRequest) ProtoMessage() {} func (x *RestartNodeRequest) ProtoReflect() protoreflect.Message { - mi := &file_rpcpb_rpc_proto_msgTypes[38] + mi := &file_rpcpb_rpc_proto_msgTypes[40] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2302,7 +2567,7 @@ func (x *RestartNodeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RestartNodeRequest.ProtoReflect.Descriptor instead. func (*RestartNodeRequest) Descriptor() ([]byte, []int) { - return file_rpcpb_rpc_proto_rawDescGZIP(), []int{38} + return file_rpcpb_rpc_proto_rawDescGZIP(), []int{40} } func (x *RestartNodeRequest) GetName() string { @@ -2355,15 +2620,16 @@ func (x *RestartNodeRequest) GetPluginDir() string { } type RestartNodeResponse struct { - state protoimpl.MessageState `protogen:"open.v1"` - ClusterInfo *ClusterInfo `protobuf:"bytes,1,opt,name=cluster_info,json=clusterInfo,proto3" json:"cluster_info,omitempty"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ClusterInfo *ClusterInfo `protobuf:"bytes,1,opt,name=cluster_info,json=clusterInfo,proto3" json:"cluster_info,omitempty"` } func (x *RestartNodeResponse) Reset() { *x = RestartNodeResponse{} - mi := &file_rpcpb_rpc_proto_msgTypes[39] + mi := &file_rpcpb_rpc_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2375,7 +2641,7 @@ func (x *RestartNodeResponse) String() string { func (*RestartNodeResponse) ProtoMessage() {} func (x *RestartNodeResponse) ProtoReflect() protoreflect.Message { - mi := &file_rpcpb_rpc_proto_msgTypes[39] + mi := &file_rpcpb_rpc_proto_msgTypes[41] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2388,7 +2654,7 @@ func (x *RestartNodeResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RestartNodeResponse.ProtoReflect.Descriptor instead. func (*RestartNodeResponse) Descriptor() ([]byte, []int) { - return file_rpcpb_rpc_proto_rawDescGZIP(), []int{39} + return file_rpcpb_rpc_proto_rawDescGZIP(), []int{41} } func (x *RestartNodeResponse) GetClusterInfo() *ClusterInfo { @@ -2399,15 +2665,16 @@ func (x *RestartNodeResponse) GetClusterInfo() *ClusterInfo { } type RemoveNodeRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` } func (x *RemoveNodeRequest) Reset() { *x = RemoveNodeRequest{} - mi := &file_rpcpb_rpc_proto_msgTypes[40] + mi := &file_rpcpb_rpc_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2419,7 +2686,7 @@ func (x *RemoveNodeRequest) String() string { func (*RemoveNodeRequest) ProtoMessage() {} func (x *RemoveNodeRequest) ProtoReflect() protoreflect.Message { - mi := &file_rpcpb_rpc_proto_msgTypes[40] + mi := &file_rpcpb_rpc_proto_msgTypes[42] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2432,7 +2699,7 @@ func (x *RemoveNodeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveNodeRequest.ProtoReflect.Descriptor instead. func (*RemoveNodeRequest) Descriptor() ([]byte, []int) { - return file_rpcpb_rpc_proto_rawDescGZIP(), []int{40} + return file_rpcpb_rpc_proto_rawDescGZIP(), []int{42} } func (x *RemoveNodeRequest) GetName() string { @@ -2443,15 +2710,16 @@ func (x *RemoveNodeRequest) GetName() string { } type RemoveNodeResponse struct { - state protoimpl.MessageState `protogen:"open.v1"` - ClusterInfo *ClusterInfo `protobuf:"bytes,1,opt,name=cluster_info,json=clusterInfo,proto3" json:"cluster_info,omitempty"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ClusterInfo *ClusterInfo `protobuf:"bytes,1,opt,name=cluster_info,json=clusterInfo,proto3" json:"cluster_info,omitempty"` } func (x *RemoveNodeResponse) Reset() { *x = RemoveNodeResponse{} - mi := &file_rpcpb_rpc_proto_msgTypes[41] + mi := &file_rpcpb_rpc_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2463,7 +2731,7 @@ func (x *RemoveNodeResponse) String() string { func (*RemoveNodeResponse) ProtoMessage() {} func (x *RemoveNodeResponse) ProtoReflect() protoreflect.Message { - mi := &file_rpcpb_rpc_proto_msgTypes[41] + mi := &file_rpcpb_rpc_proto_msgTypes[43] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2476,7 +2744,7 @@ func (x *RemoveNodeResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveNodeResponse.ProtoReflect.Descriptor instead. func (*RemoveNodeResponse) Descriptor() ([]byte, []int) { - return file_rpcpb_rpc_proto_rawDescGZIP(), []int{41} + return file_rpcpb_rpc_proto_rawDescGZIP(), []int{43} } func (x *RemoveNodeResponse) GetClusterInfo() *ClusterInfo { @@ -2487,15 +2755,16 @@ func (x *RemoveNodeResponse) GetClusterInfo() *ClusterInfo { } type PauseNodeRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` } func (x *PauseNodeRequest) Reset() { *x = PauseNodeRequest{} - mi := &file_rpcpb_rpc_proto_msgTypes[42] + mi := &file_rpcpb_rpc_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2507,7 +2776,7 @@ func (x *PauseNodeRequest) String() string { func (*PauseNodeRequest) ProtoMessage() {} func (x *PauseNodeRequest) ProtoReflect() protoreflect.Message { - mi := &file_rpcpb_rpc_proto_msgTypes[42] + mi := &file_rpcpb_rpc_proto_msgTypes[44] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2520,7 +2789,7 @@ func (x *PauseNodeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use PauseNodeRequest.ProtoReflect.Descriptor instead. func (*PauseNodeRequest) Descriptor() ([]byte, []int) { - return file_rpcpb_rpc_proto_rawDescGZIP(), []int{42} + return file_rpcpb_rpc_proto_rawDescGZIP(), []int{44} } func (x *PauseNodeRequest) GetName() string { @@ -2531,15 +2800,16 @@ func (x *PauseNodeRequest) GetName() string { } type PauseNodeResponse struct { - state protoimpl.MessageState `protogen:"open.v1"` - ClusterInfo *ClusterInfo `protobuf:"bytes,1,opt,name=cluster_info,json=clusterInfo,proto3" json:"cluster_info,omitempty"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ClusterInfo *ClusterInfo `protobuf:"bytes,1,opt,name=cluster_info,json=clusterInfo,proto3" json:"cluster_info,omitempty"` } func (x *PauseNodeResponse) Reset() { *x = PauseNodeResponse{} - mi := &file_rpcpb_rpc_proto_msgTypes[43] + mi := &file_rpcpb_rpc_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2551,7 +2821,7 @@ func (x *PauseNodeResponse) String() string { func (*PauseNodeResponse) ProtoMessage() {} func (x *PauseNodeResponse) ProtoReflect() protoreflect.Message { - mi := &file_rpcpb_rpc_proto_msgTypes[43] + mi := &file_rpcpb_rpc_proto_msgTypes[45] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2564,7 +2834,7 @@ func (x *PauseNodeResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use PauseNodeResponse.ProtoReflect.Descriptor instead. func (*PauseNodeResponse) Descriptor() ([]byte, []int) { - return file_rpcpb_rpc_proto_rawDescGZIP(), []int{43} + return file_rpcpb_rpc_proto_rawDescGZIP(), []int{45} } func (x *PauseNodeResponse) GetClusterInfo() *ClusterInfo { @@ -2575,15 +2845,16 @@ func (x *PauseNodeResponse) GetClusterInfo() *ClusterInfo { } type ResumeNodeRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` } func (x *ResumeNodeRequest) Reset() { *x = ResumeNodeRequest{} - mi := &file_rpcpb_rpc_proto_msgTypes[44] + mi := &file_rpcpb_rpc_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2595,7 +2866,7 @@ func (x *ResumeNodeRequest) String() string { func (*ResumeNodeRequest) ProtoMessage() {} func (x *ResumeNodeRequest) ProtoReflect() protoreflect.Message { - mi := &file_rpcpb_rpc_proto_msgTypes[44] + mi := &file_rpcpb_rpc_proto_msgTypes[46] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2608,7 +2879,7 @@ func (x *ResumeNodeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ResumeNodeRequest.ProtoReflect.Descriptor instead. func (*ResumeNodeRequest) Descriptor() ([]byte, []int) { - return file_rpcpb_rpc_proto_rawDescGZIP(), []int{44} + return file_rpcpb_rpc_proto_rawDescGZIP(), []int{46} } func (x *ResumeNodeRequest) GetName() string { @@ -2619,15 +2890,16 @@ func (x *ResumeNodeRequest) GetName() string { } type ResumeNodeResponse struct { - state protoimpl.MessageState `protogen:"open.v1"` - ClusterInfo *ClusterInfo `protobuf:"bytes,1,opt,name=cluster_info,json=clusterInfo,proto3" json:"cluster_info,omitempty"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ClusterInfo *ClusterInfo `protobuf:"bytes,1,opt,name=cluster_info,json=clusterInfo,proto3" json:"cluster_info,omitempty"` } func (x *ResumeNodeResponse) Reset() { *x = ResumeNodeResponse{} - mi := &file_rpcpb_rpc_proto_msgTypes[45] + mi := &file_rpcpb_rpc_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2639,7 +2911,7 @@ func (x *ResumeNodeResponse) String() string { func (*ResumeNodeResponse) ProtoMessage() {} func (x *ResumeNodeResponse) ProtoReflect() protoreflect.Message { - mi := &file_rpcpb_rpc_proto_msgTypes[45] + mi := &file_rpcpb_rpc_proto_msgTypes[47] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2652,7 +2924,7 @@ func (x *ResumeNodeResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ResumeNodeResponse.ProtoReflect.Descriptor instead. func (*ResumeNodeResponse) Descriptor() ([]byte, []int) { - return file_rpcpb_rpc_proto_rawDescGZIP(), []int{45} + return file_rpcpb_rpc_proto_rawDescGZIP(), []int{47} } func (x *ResumeNodeResponse) GetClusterInfo() *ClusterInfo { @@ -2663,31 +2935,32 @@ func (x *ResumeNodeResponse) GetClusterInfo() *ClusterInfo { } type AddNodeRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - ExecPath string `protobuf:"bytes,2,opt,name=exec_path,json=execPath,proto3" json:"exec_path,omitempty"` - NodeConfig *string `protobuf:"bytes,3,opt,name=node_config,json=nodeConfig,proto3,oneof" json:"node_config,omitempty"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + ExecPath string `protobuf:"bytes,2,opt,name=exec_path,json=execPath,proto3" json:"exec_path,omitempty"` + NodeConfig *string `protobuf:"bytes,3,opt,name=node_config,json=nodeConfig,proto3,oneof" json:"node_config,omitempty"` // Map of chain name to config file contents. // If specified, will create a file "chainname/config.json" with // the contents provided here. - ChainConfigs map[string]string `protobuf:"bytes,4,rep,name=chain_configs,json=chainConfigs,proto3" json:"chain_configs,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + ChainConfigs map[string]string `protobuf:"bytes,4,rep,name=chain_configs,json=chainConfigs,proto3" json:"chain_configs,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Map of chain name to config file contents. // If specified, will create a file "chainname/upgrade.json" with // the contents provided here. - UpgradeConfigs map[string]string `protobuf:"bytes,5,rep,name=upgrade_configs,json=upgradeConfigs,proto3" json:"upgrade_configs,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + UpgradeConfigs map[string]string `protobuf:"bytes,5,rep,name=upgrade_configs,json=upgradeConfigs,proto3" json:"upgrade_configs,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Map of chain id to chain config file contents. // If specified, will create a file "chainid.json" under chains config dir with // the contents provided here. - ChainConfigFiles map[string]string `protobuf:"bytes,6,rep,name=chain_config_files,json=chainConfigFiles,proto3" json:"chain_config_files,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + ChainConfigFiles map[string]string `protobuf:"bytes,6,rep,name=chain_config_files,json=chainConfigFiles,proto3" json:"chain_config_files,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Plugin dir from which to load all custom VM executables. - PluginDir string `protobuf:"bytes,7,opt,name=plugin_dir,json=pluginDir,proto3" json:"plugin_dir,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + PluginDir string `protobuf:"bytes,7,opt,name=plugin_dir,json=pluginDir,proto3" json:"plugin_dir,omitempty"` } func (x *AddNodeRequest) Reset() { *x = AddNodeRequest{} - mi := &file_rpcpb_rpc_proto_msgTypes[46] + mi := &file_rpcpb_rpc_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2699,7 +2972,7 @@ func (x *AddNodeRequest) String() string { func (*AddNodeRequest) ProtoMessage() {} func (x *AddNodeRequest) ProtoReflect() protoreflect.Message { - mi := &file_rpcpb_rpc_proto_msgTypes[46] + mi := &file_rpcpb_rpc_proto_msgTypes[48] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2712,7 +2985,7 @@ func (x *AddNodeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use AddNodeRequest.ProtoReflect.Descriptor instead. func (*AddNodeRequest) Descriptor() ([]byte, []int) { - return file_rpcpb_rpc_proto_rawDescGZIP(), []int{46} + return file_rpcpb_rpc_proto_rawDescGZIP(), []int{48} } func (x *AddNodeRequest) GetName() string { @@ -2765,15 +3038,16 @@ func (x *AddNodeRequest) GetPluginDir() string { } type AddNodeResponse struct { - state protoimpl.MessageState `protogen:"open.v1"` - ClusterInfo *ClusterInfo `protobuf:"bytes,1,opt,name=cluster_info,json=clusterInfo,proto3" json:"cluster_info,omitempty"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ClusterInfo *ClusterInfo `protobuf:"bytes,1,opt,name=cluster_info,json=clusterInfo,proto3" json:"cluster_info,omitempty"` } func (x *AddNodeResponse) Reset() { *x = AddNodeResponse{} - mi := &file_rpcpb_rpc_proto_msgTypes[47] + mi := &file_rpcpb_rpc_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2785,7 +3059,7 @@ func (x *AddNodeResponse) String() string { func (*AddNodeResponse) ProtoMessage() {} func (x *AddNodeResponse) ProtoReflect() protoreflect.Message { - mi := &file_rpcpb_rpc_proto_msgTypes[47] + mi := &file_rpcpb_rpc_proto_msgTypes[49] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2798,7 +3072,7 @@ func (x *AddNodeResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use AddNodeResponse.ProtoReflect.Descriptor instead. func (*AddNodeResponse) Descriptor() ([]byte, []int) { - return file_rpcpb_rpc_proto_rawDescGZIP(), []int{47} + return file_rpcpb_rpc_proto_rawDescGZIP(), []int{49} } func (x *AddNodeResponse) GetClusterInfo() *ClusterInfo { @@ -2809,14 +3083,14 @@ func (x *AddNodeResponse) GetClusterInfo() *ClusterInfo { } type StopRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields } func (x *StopRequest) Reset() { *x = StopRequest{} - mi := &file_rpcpb_rpc_proto_msgTypes[48] + mi := &file_rpcpb_rpc_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2828,7 +3102,7 @@ func (x *StopRequest) String() string { func (*StopRequest) ProtoMessage() {} func (x *StopRequest) ProtoReflect() protoreflect.Message { - mi := &file_rpcpb_rpc_proto_msgTypes[48] + mi := &file_rpcpb_rpc_proto_msgTypes[50] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2841,19 +3115,20 @@ func (x *StopRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use StopRequest.ProtoReflect.Descriptor instead. func (*StopRequest) Descriptor() ([]byte, []int) { - return file_rpcpb_rpc_proto_rawDescGZIP(), []int{48} + return file_rpcpb_rpc_proto_rawDescGZIP(), []int{50} } type StopResponse struct { - state protoimpl.MessageState `protogen:"open.v1"` - ClusterInfo *ClusterInfo `protobuf:"bytes,1,opt,name=cluster_info,json=clusterInfo,proto3" json:"cluster_info,omitempty"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ClusterInfo *ClusterInfo `protobuf:"bytes,1,opt,name=cluster_info,json=clusterInfo,proto3" json:"cluster_info,omitempty"` } func (x *StopResponse) Reset() { *x = StopResponse{} - mi := &file_rpcpb_rpc_proto_msgTypes[49] + mi := &file_rpcpb_rpc_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2865,7 +3140,7 @@ func (x *StopResponse) String() string { func (*StopResponse) ProtoMessage() {} func (x *StopResponse) ProtoReflect() protoreflect.Message { - mi := &file_rpcpb_rpc_proto_msgTypes[49] + mi := &file_rpcpb_rpc_proto_msgTypes[51] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2878,7 +3153,7 @@ func (x *StopResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use StopResponse.ProtoReflect.Descriptor instead. func (*StopResponse) Descriptor() ([]byte, []int) { - return file_rpcpb_rpc_proto_rawDescGZIP(), []int{49} + return file_rpcpb_rpc_proto_rawDescGZIP(), []int{51} } func (x *StopResponse) GetClusterInfo() *ClusterInfo { @@ -2889,15 +3164,16 @@ func (x *StopResponse) GetClusterInfo() *ClusterInfo { } type AttachPeerRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - NodeName string `protobuf:"bytes,1,opt,name=node_name,json=nodeName,proto3" json:"node_name,omitempty"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + NodeName string `protobuf:"bytes,1,opt,name=node_name,json=nodeName,proto3" json:"node_name,omitempty"` } func (x *AttachPeerRequest) Reset() { *x = AttachPeerRequest{} - mi := &file_rpcpb_rpc_proto_msgTypes[50] + mi := &file_rpcpb_rpc_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2909,7 +3185,7 @@ func (x *AttachPeerRequest) String() string { func (*AttachPeerRequest) ProtoMessage() {} func (x *AttachPeerRequest) ProtoReflect() protoreflect.Message { - mi := &file_rpcpb_rpc_proto_msgTypes[50] + mi := &file_rpcpb_rpc_proto_msgTypes[52] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2922,7 +3198,7 @@ func (x *AttachPeerRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use AttachPeerRequest.ProtoReflect.Descriptor instead. func (*AttachPeerRequest) Descriptor() ([]byte, []int) { - return file_rpcpb_rpc_proto_rawDescGZIP(), []int{50} + return file_rpcpb_rpc_proto_rawDescGZIP(), []int{52} } func (x *AttachPeerRequest) GetNodeName() string { @@ -2933,16 +3209,17 @@ func (x *AttachPeerRequest) GetNodeName() string { } type AttachPeerResponse struct { - state protoimpl.MessageState `protogen:"open.v1"` - ClusterInfo *ClusterInfo `protobuf:"bytes,1,opt,name=cluster_info,json=clusterInfo,proto3" json:"cluster_info,omitempty"` - AttachedPeerInfo *AttachedPeerInfo `protobuf:"bytes,2,opt,name=attached_peer_info,json=attachedPeerInfo,proto3" json:"attached_peer_info,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ClusterInfo *ClusterInfo `protobuf:"bytes,1,opt,name=cluster_info,json=clusterInfo,proto3" json:"cluster_info,omitempty"` + AttachedPeerInfo *AttachedPeerInfo `protobuf:"bytes,2,opt,name=attached_peer_info,json=attachedPeerInfo,proto3" json:"attached_peer_info,omitempty"` } func (x *AttachPeerResponse) Reset() { *x = AttachPeerResponse{} - mi := &file_rpcpb_rpc_proto_msgTypes[51] + mi := &file_rpcpb_rpc_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2954,7 +3231,7 @@ func (x *AttachPeerResponse) String() string { func (*AttachPeerResponse) ProtoMessage() {} func (x *AttachPeerResponse) ProtoReflect() protoreflect.Message { - mi := &file_rpcpb_rpc_proto_msgTypes[51] + mi := &file_rpcpb_rpc_proto_msgTypes[53] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2967,7 +3244,7 @@ func (x *AttachPeerResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use AttachPeerResponse.ProtoReflect.Descriptor instead. func (*AttachPeerResponse) Descriptor() ([]byte, []int) { - return file_rpcpb_rpc_proto_rawDescGZIP(), []int{51} + return file_rpcpb_rpc_proto_rawDescGZIP(), []int{53} } func (x *AttachPeerResponse) GetClusterInfo() *ClusterInfo { @@ -2985,18 +3262,19 @@ func (x *AttachPeerResponse) GetAttachedPeerInfo() *AttachedPeerInfo { } type SendOutboundMessageRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - NodeName string `protobuf:"bytes,1,opt,name=node_name,json=nodeName,proto3" json:"node_name,omitempty"` - PeerId string `protobuf:"bytes,2,opt,name=peer_id,json=peerId,proto3" json:"peer_id,omitempty"` - Op uint32 `protobuf:"varint,3,opt,name=op,proto3" json:"op,omitempty"` - Bytes []byte `protobuf:"bytes,4,opt,name=bytes,proto3" json:"bytes,omitempty"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + NodeName string `protobuf:"bytes,1,opt,name=node_name,json=nodeName,proto3" json:"node_name,omitempty"` + PeerId string `protobuf:"bytes,2,opt,name=peer_id,json=peerId,proto3" json:"peer_id,omitempty"` + Op uint32 `protobuf:"varint,3,opt,name=op,proto3" json:"op,omitempty"` + Bytes []byte `protobuf:"bytes,4,opt,name=bytes,proto3" json:"bytes,omitempty"` } func (x *SendOutboundMessageRequest) Reset() { *x = SendOutboundMessageRequest{} - mi := &file_rpcpb_rpc_proto_msgTypes[52] + mi := &file_rpcpb_rpc_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3008,7 +3286,7 @@ func (x *SendOutboundMessageRequest) String() string { func (*SendOutboundMessageRequest) ProtoMessage() {} func (x *SendOutboundMessageRequest) ProtoReflect() protoreflect.Message { - mi := &file_rpcpb_rpc_proto_msgTypes[52] + mi := &file_rpcpb_rpc_proto_msgTypes[54] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3021,7 +3299,7 @@ func (x *SendOutboundMessageRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SendOutboundMessageRequest.ProtoReflect.Descriptor instead. func (*SendOutboundMessageRequest) Descriptor() ([]byte, []int) { - return file_rpcpb_rpc_proto_rawDescGZIP(), []int{52} + return file_rpcpb_rpc_proto_rawDescGZIP(), []int{54} } func (x *SendOutboundMessageRequest) GetNodeName() string { @@ -3053,15 +3331,16 @@ func (x *SendOutboundMessageRequest) GetBytes() []byte { } type SendOutboundMessageResponse struct { - state protoimpl.MessageState `protogen:"open.v1"` - Sent bool `protobuf:"varint,1,opt,name=sent,proto3" json:"sent,omitempty"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Sent bool `protobuf:"varint,1,opt,name=sent,proto3" json:"sent,omitempty"` } func (x *SendOutboundMessageResponse) Reset() { *x = SendOutboundMessageResponse{} - mi := &file_rpcpb_rpc_proto_msgTypes[53] + mi := &file_rpcpb_rpc_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3073,7 +3352,7 @@ func (x *SendOutboundMessageResponse) String() string { func (*SendOutboundMessageResponse) ProtoMessage() {} func (x *SendOutboundMessageResponse) ProtoReflect() protoreflect.Message { - mi := &file_rpcpb_rpc_proto_msgTypes[53] + mi := &file_rpcpb_rpc_proto_msgTypes[55] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3086,7 +3365,7 @@ func (x *SendOutboundMessageResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SendOutboundMessageResponse.ProtoReflect.Descriptor instead. func (*SendOutboundMessageResponse) Descriptor() ([]byte, []int) { - return file_rpcpb_rpc_proto_rawDescGZIP(), []int{53} + return file_rpcpb_rpc_proto_rawDescGZIP(), []int{55} } func (x *SendOutboundMessageResponse) GetSent() bool { @@ -3097,15 +3376,17 @@ func (x *SendOutboundMessageResponse) GetSent() bool { } type SaveSnapshotRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - SnapshotName string `protobuf:"bytes,1,opt,name=snapshot_name,json=snapshotName,proto3" json:"snapshot_name,omitempty"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + NetworkName string `protobuf:"bytes,1,opt,name=network_name,json=networkName,proto3" json:"network_name,omitempty"` + SnapshotName string `protobuf:"bytes,2,opt,name=snapshot_name,json=snapshotName,proto3" json:"snapshot_name,omitempty"` } func (x *SaveSnapshotRequest) Reset() { *x = SaveSnapshotRequest{} - mi := &file_rpcpb_rpc_proto_msgTypes[54] + mi := &file_rpcpb_rpc_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3117,7 +3398,7 @@ func (x *SaveSnapshotRequest) String() string { func (*SaveSnapshotRequest) ProtoMessage() {} func (x *SaveSnapshotRequest) ProtoReflect() protoreflect.Message { - mi := &file_rpcpb_rpc_proto_msgTypes[54] + mi := &file_rpcpb_rpc_proto_msgTypes[56] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3130,7 +3411,14 @@ func (x *SaveSnapshotRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SaveSnapshotRequest.ProtoReflect.Descriptor instead. func (*SaveSnapshotRequest) Descriptor() ([]byte, []int) { - return file_rpcpb_rpc_proto_rawDescGZIP(), []int{54} + return file_rpcpb_rpc_proto_rawDescGZIP(), []int{56} +} + +func (x *SaveSnapshotRequest) GetNetworkName() string { + if x != nil { + return x.NetworkName + } + return "" } func (x *SaveSnapshotRequest) GetSnapshotName() string { @@ -3141,15 +3429,16 @@ func (x *SaveSnapshotRequest) GetSnapshotName() string { } type SaveSnapshotResponse struct { - state protoimpl.MessageState `protogen:"open.v1"` - SnapshotPath string `protobuf:"bytes,1,opt,name=snapshot_path,json=snapshotPath,proto3" json:"snapshot_path,omitempty"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + SnapshotPath string `protobuf:"bytes,1,opt,name=snapshot_path,json=snapshotPath,proto3" json:"snapshot_path,omitempty"` } func (x *SaveSnapshotResponse) Reset() { *x = SaveSnapshotResponse{} - mi := &file_rpcpb_rpc_proto_msgTypes[55] + mi := &file_rpcpb_rpc_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3161,7 +3450,7 @@ func (x *SaveSnapshotResponse) String() string { func (*SaveSnapshotResponse) ProtoMessage() {} func (x *SaveSnapshotResponse) ProtoReflect() protoreflect.Message { - mi := &file_rpcpb_rpc_proto_msgTypes[55] + mi := &file_rpcpb_rpc_proto_msgTypes[57] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3174,7 +3463,7 @@ func (x *SaveSnapshotResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SaveSnapshotResponse.ProtoReflect.Descriptor instead. func (*SaveSnapshotResponse) Descriptor() ([]byte, []int) { - return file_rpcpb_rpc_proto_rawDescGZIP(), []int{55} + return file_rpcpb_rpc_proto_rawDescGZIP(), []int{57} } func (x *SaveSnapshotResponse) GetSnapshotPath() string { @@ -3185,23 +3474,25 @@ func (x *SaveSnapshotResponse) GetSnapshotPath() string { } type LoadSnapshotRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - SnapshotName string `protobuf:"bytes,1,opt,name=snapshot_name,json=snapshotName,proto3" json:"snapshot_name,omitempty"` - ExecPath *string `protobuf:"bytes,2,opt,name=exec_path,json=execPath,proto3,oneof" json:"exec_path,omitempty"` - PluginDir string `protobuf:"bytes,3,opt,name=plugin_dir,json=pluginDir,proto3" json:"plugin_dir,omitempty"` - RootDataDir *string `protobuf:"bytes,4,opt,name=root_data_dir,json=rootDataDir,proto3,oneof" json:"root_data_dir,omitempty"` - ChainConfigs map[string]string `protobuf:"bytes,5,rep,name=chain_configs,json=chainConfigs,proto3" json:"chain_configs,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` - UpgradeConfigs map[string]string `protobuf:"bytes,6,rep,name=upgrade_configs,json=upgradeConfigs,proto3" json:"upgrade_configs,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` - GlobalNodeConfig *string `protobuf:"bytes,7,opt,name=global_node_config,json=globalNodeConfig,proto3,oneof" json:"global_node_config,omitempty"` - ReassignPortsIfUsed *bool `protobuf:"varint,8,opt,name=reassign_ports_if_used,json=reassignPortsIfUsed,proto3,oneof" json:"reassign_ports_if_used,omitempty"` - ChainConfigFiles map[string]string `protobuf:"bytes,9,rep,name=chain_config_files,json=chainConfigFiles,proto3" json:"chain_config_files,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + NetworkName string `protobuf:"bytes,1,opt,name=network_name,json=networkName,proto3" json:"network_name,omitempty"` + SnapshotName string `protobuf:"bytes,2,opt,name=snapshot_name,json=snapshotName,proto3" json:"snapshot_name,omitempty"` + ExecPath *string `protobuf:"bytes,3,opt,name=exec_path,json=execPath,proto3,oneof" json:"exec_path,omitempty"` + PluginDir string `protobuf:"bytes,4,opt,name=plugin_dir,json=pluginDir,proto3" json:"plugin_dir,omitempty"` + RootDataDir *string `protobuf:"bytes,5,opt,name=root_data_dir,json=rootDataDir,proto3,oneof" json:"root_data_dir,omitempty"` + ChainConfigs map[string]string `protobuf:"bytes,6,rep,name=chain_configs,json=chainConfigs,proto3" json:"chain_configs,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + UpgradeConfigs map[string]string `protobuf:"bytes,7,rep,name=upgrade_configs,json=upgradeConfigs,proto3" json:"upgrade_configs,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + GlobalNodeConfig *string `protobuf:"bytes,8,opt,name=global_node_config,json=globalNodeConfig,proto3,oneof" json:"global_node_config,omitempty"` + ReassignPortsIfUsed *bool `protobuf:"varint,9,opt,name=reassign_ports_if_used,json=reassignPortsIfUsed,proto3,oneof" json:"reassign_ports_if_used,omitempty"` + ChainConfigFiles map[string]string `protobuf:"bytes,10,rep,name=chain_config_files,json=chainConfigFiles,proto3" json:"chain_config_files,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } func (x *LoadSnapshotRequest) Reset() { *x = LoadSnapshotRequest{} - mi := &file_rpcpb_rpc_proto_msgTypes[56] + mi := &file_rpcpb_rpc_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3213,7 +3504,7 @@ func (x *LoadSnapshotRequest) String() string { func (*LoadSnapshotRequest) ProtoMessage() {} func (x *LoadSnapshotRequest) ProtoReflect() protoreflect.Message { - mi := &file_rpcpb_rpc_proto_msgTypes[56] + mi := &file_rpcpb_rpc_proto_msgTypes[58] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3226,7 +3517,14 @@ func (x *LoadSnapshotRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use LoadSnapshotRequest.ProtoReflect.Descriptor instead. func (*LoadSnapshotRequest) Descriptor() ([]byte, []int) { - return file_rpcpb_rpc_proto_rawDescGZIP(), []int{56} + return file_rpcpb_rpc_proto_rawDescGZIP(), []int{58} +} + +func (x *LoadSnapshotRequest) GetNetworkName() string { + if x != nil { + return x.NetworkName + } + return "" } func (x *LoadSnapshotRequest) GetSnapshotName() string { @@ -3293,15 +3591,16 @@ func (x *LoadSnapshotRequest) GetChainConfigFiles() map[string]string { } type LoadSnapshotResponse struct { - state protoimpl.MessageState `protogen:"open.v1"` - ClusterInfo *ClusterInfo `protobuf:"bytes,1,opt,name=cluster_info,json=clusterInfo,proto3" json:"cluster_info,omitempty"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ClusterInfo *ClusterInfo `protobuf:"bytes,1,opt,name=cluster_info,json=clusterInfo,proto3" json:"cluster_info,omitempty"` } func (x *LoadSnapshotResponse) Reset() { *x = LoadSnapshotResponse{} - mi := &file_rpcpb_rpc_proto_msgTypes[57] + mi := &file_rpcpb_rpc_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3313,7 +3612,7 @@ func (x *LoadSnapshotResponse) String() string { func (*LoadSnapshotResponse) ProtoMessage() {} func (x *LoadSnapshotResponse) ProtoReflect() protoreflect.Message { - mi := &file_rpcpb_rpc_proto_msgTypes[57] + mi := &file_rpcpb_rpc_proto_msgTypes[59] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3326,7 +3625,7 @@ func (x *LoadSnapshotResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use LoadSnapshotResponse.ProtoReflect.Descriptor instead. func (*LoadSnapshotResponse) Descriptor() ([]byte, []int) { - return file_rpcpb_rpc_proto_rawDescGZIP(), []int{57} + return file_rpcpb_rpc_proto_rawDescGZIP(), []int{59} } func (x *LoadSnapshotResponse) GetClusterInfo() *ClusterInfo { @@ -3337,15 +3636,17 @@ func (x *LoadSnapshotResponse) GetClusterInfo() *ClusterInfo { } type RemoveSnapshotRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - SnapshotName string `protobuf:"bytes,1,opt,name=snapshot_name,json=snapshotName,proto3" json:"snapshot_name,omitempty"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + NetworkName string `protobuf:"bytes,1,opt,name=network_name,json=networkName,proto3" json:"network_name,omitempty"` + SnapshotName string `protobuf:"bytes,2,opt,name=snapshot_name,json=snapshotName,proto3" json:"snapshot_name,omitempty"` } func (x *RemoveSnapshotRequest) Reset() { *x = RemoveSnapshotRequest{} - mi := &file_rpcpb_rpc_proto_msgTypes[58] + mi := &file_rpcpb_rpc_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3357,7 +3658,7 @@ func (x *RemoveSnapshotRequest) String() string { func (*RemoveSnapshotRequest) ProtoMessage() {} func (x *RemoveSnapshotRequest) ProtoReflect() protoreflect.Message { - mi := &file_rpcpb_rpc_proto_msgTypes[58] + mi := &file_rpcpb_rpc_proto_msgTypes[60] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3370,7 +3671,14 @@ func (x *RemoveSnapshotRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveSnapshotRequest.ProtoReflect.Descriptor instead. func (*RemoveSnapshotRequest) Descriptor() ([]byte, []int) { - return file_rpcpb_rpc_proto_rawDescGZIP(), []int{58} + return file_rpcpb_rpc_proto_rawDescGZIP(), []int{60} +} + +func (x *RemoveSnapshotRequest) GetNetworkName() string { + if x != nil { + return x.NetworkName + } + return "" } func (x *RemoveSnapshotRequest) GetSnapshotName() string { @@ -3381,14 +3689,14 @@ func (x *RemoveSnapshotRequest) GetSnapshotName() string { } type RemoveSnapshotResponse struct { - state protoimpl.MessageState `protogen:"open.v1"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields } func (x *RemoveSnapshotResponse) Reset() { *x = RemoveSnapshotResponse{} - mi := &file_rpcpb_rpc_proto_msgTypes[59] + mi := &file_rpcpb_rpc_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3400,7 +3708,7 @@ func (x *RemoveSnapshotResponse) String() string { func (*RemoveSnapshotResponse) ProtoMessage() {} func (x *RemoveSnapshotResponse) ProtoReflect() protoreflect.Message { - mi := &file_rpcpb_rpc_proto_msgTypes[59] + mi := &file_rpcpb_rpc_proto_msgTypes[61] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3413,18 +3721,20 @@ func (x *RemoveSnapshotResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveSnapshotResponse.ProtoReflect.Descriptor instead. func (*RemoveSnapshotResponse) Descriptor() ([]byte, []int) { - return file_rpcpb_rpc_proto_rawDescGZIP(), []int{59} + return file_rpcpb_rpc_proto_rawDescGZIP(), []int{61} } type GetSnapshotNamesRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + NetworkName string `protobuf:"bytes,1,opt,name=network_name,json=networkName,proto3" json:"network_name,omitempty"` } func (x *GetSnapshotNamesRequest) Reset() { *x = GetSnapshotNamesRequest{} - mi := &file_rpcpb_rpc_proto_msgTypes[60] + mi := &file_rpcpb_rpc_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3436,7 +3746,7 @@ func (x *GetSnapshotNamesRequest) String() string { func (*GetSnapshotNamesRequest) ProtoMessage() {} func (x *GetSnapshotNamesRequest) ProtoReflect() protoreflect.Message { - mi := &file_rpcpb_rpc_proto_msgTypes[60] + mi := &file_rpcpb_rpc_proto_msgTypes[62] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3449,19 +3759,27 @@ func (x *GetSnapshotNamesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetSnapshotNamesRequest.ProtoReflect.Descriptor instead. func (*GetSnapshotNamesRequest) Descriptor() ([]byte, []int) { - return file_rpcpb_rpc_proto_rawDescGZIP(), []int{60} + return file_rpcpb_rpc_proto_rawDescGZIP(), []int{62} +} + +func (x *GetSnapshotNamesRequest) GetNetworkName() string { + if x != nil { + return x.NetworkName + } + return "" } type GetSnapshotNamesResponse struct { - state protoimpl.MessageState `protogen:"open.v1"` - SnapshotNames []string `protobuf:"bytes,1,rep,name=snapshot_names,json=snapshotNames,proto3" json:"snapshot_names,omitempty"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + SnapshotNames []string `protobuf:"bytes,1,rep,name=snapshot_names,json=snapshotNames,proto3" json:"snapshot_names,omitempty"` } func (x *GetSnapshotNamesResponse) Reset() { *x = GetSnapshotNamesResponse{} - mi := &file_rpcpb_rpc_proto_msgTypes[61] + mi := &file_rpcpb_rpc_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3473,7 +3791,7 @@ func (x *GetSnapshotNamesResponse) String() string { func (*GetSnapshotNamesResponse) ProtoMessage() {} func (x *GetSnapshotNamesResponse) ProtoReflect() protoreflect.Message { - mi := &file_rpcpb_rpc_proto_msgTypes[61] + mi := &file_rpcpb_rpc_proto_msgTypes[63] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3486,7 +3804,7 @@ func (x *GetSnapshotNamesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetSnapshotNamesResponse.ProtoReflect.Descriptor instead. func (*GetSnapshotNamesResponse) Descriptor() ([]byte, []int) { - return file_rpcpb_rpc_proto_rawDescGZIP(), []int{61} + return file_rpcpb_rpc_proto_rawDescGZIP(), []int{63} } func (x *GetSnapshotNamesResponse) GetSnapshotNames() []string { @@ -3498,350 +3816,849 @@ func (x *GetSnapshotNamesResponse) GetSnapshotNames() []string { var File_rpcpb_rpc_proto protoreflect.FileDescriptor -const file_rpcpb_rpc_proto_rawDesc = "" + - "\n" + - "\x0frpcpb/rpc.proto\x12\x05rpcpb\x1a\x1cgoogle/api/annotations.proto\"\r\n" + - "\vPingRequest\" \n" + - "\fPingResponse\x12\x10\n" + - "\x03pid\x18\x01 \x01(\x05R\x03pid\"2\n" + - "\x11ChainParticipants\x12\x1d\n" + - "\n" + - "node_names\x18\x01 \x03(\tR\tnodeNames\"\xaa\x06\n" + - "\vClusterInfo\x12\x1d\n" + - "\n" + - "node_names\x18\x01 \x03(\tR\tnodeNames\x12@\n" + - "\n" + - "node_infos\x18\x02 \x03(\v2!.rpcpb.ClusterInfo.NodeInfosEntryR\tnodeInfos\x12\x10\n" + - "\x03pid\x18\x03 \x01(\x05R\x03pid\x12\"\n" + - "\rroot_data_dir\x18\x04 \x01(\tR\vrootDataDir\x12\x18\n" + - "\ahealthy\x18\x05 \x01(\bR\ahealthy\x12Y\n" + - "\x13attached_peer_infos\x18\x06 \x03(\v2).rpcpb.ClusterInfo.AttachedPeerInfosEntryR\x11attachedPeerInfos\x122\n" + - "\x15custom_chains_healthy\x18\a \x01(\bR\x13customChainsHealthy\x12I\n" + - "\rcustom_chains\x18\b \x03(\v2$.rpcpb.ClusterInfo.CustomChainsEntryR\fcustomChains\x126\n" + - "\x06chains\x18\t \x03(\v2\x1e.rpcpb.ClusterInfo.ChainsEntryR\x06chains\x1aM\n" + - "\x0eNodeInfosEntry\x12\x10\n" + - "\x03key\x18\x01 \x01(\tR\x03key\x12%\n" + - "\x05value\x18\x02 \x01(\v2\x0f.rpcpb.NodeInfoR\x05value:\x028\x01\x1ac\n" + - "\x16AttachedPeerInfosEntry\x12\x10\n" + - "\x03key\x18\x01 \x01(\tR\x03key\x123\n" + - "\x05value\x18\x02 \x01(\v2\x1d.rpcpb.ListOfAttachedPeerInfoR\x05value:\x028\x01\x1aW\n" + - "\x11CustomChainsEntry\x12\x10\n" + - "\x03key\x18\x01 \x01(\tR\x03key\x12,\n" + - "\x05value\x18\x02 \x01(\v2\x16.rpcpb.CustomChainInfoR\x05value:\x028\x01\x1aK\n" + - "\vChainsEntry\x12\x10\n" + - "\x03key\x18\x01 \x01(\tR\x03key\x12&\n" + - "\x05value\x18\x02 \x01(\v2\x10.rpcpb.ChainInfoR\x05value:\x028\x01\"\x9d\x01\n" + - "\tChainInfo\x12\x1d\n" + - "\n" + - "is_elastic\x18\x01 \x01(\bR\tisElastic\x12(\n" + - "\x10elastic_chain_id\x18\x02 \x01(\tR\x0eelasticChainId\x12G\n" + - "\x12chain_participants\x18\x03 \x01(\v2\x18.rpcpb.ChainParticipantsR\x11chainParticipants\"\x87\x01\n" + - "\x0fCustomChainInfo\x12\x1d\n" + - "\n" + - "chain_name\x18\x01 \x01(\tR\tchainName\x12\x13\n" + - "\x05vm_id\x18\x02 \x01(\tR\x04vmId\x12\x1b\n" + - "\tpchain_id\x18\x03 \x01(\tR\bpchainId\x12#\n" + - "\rblockchain_id\x18\x04 \x01(\tR\fblockchainId\"\x8b\x02\n" + - "\bNodeInfo\x12\x12\n" + - "\x04name\x18\x01 \x01(\tR\x04name\x12\x1b\n" + - "\texec_path\x18\x02 \x01(\tR\bexecPath\x12\x10\n" + - "\x03uri\x18\x03 \x01(\tR\x03uri\x12\x0e\n" + - "\x02id\x18\x04 \x01(\tR\x02id\x12\x17\n" + - "\alog_dir\x18\x05 \x01(\tR\x06logDir\x12\x15\n" + - "\x06db_dir\x18\x06 \x01(\tR\x05dbDir\x12\x1d\n" + - "\n" + - "plugin_dir\x18\a \x01(\tR\tpluginDir\x12-\n" + - "\x12whitelisted_chains\x18\b \x01(\tR\x11whitelistedChains\x12\x16\n" + - "\x06config\x18\t \x01(\fR\x06config\x12\x16\n" + - "\x06paused\x18\n" + - " \x01(\bR\x06paused\"\"\n" + - "\x10AttachedPeerInfo\x12\x0e\n" + - "\x02id\x18\x01 \x01(\tR\x02id\"G\n" + - "\x16ListOfAttachedPeerInfo\x12-\n" + - "\x05peers\x18\x01 \x03(\v2\x17.rpcpb.AttachedPeerInfoR\x05peers\"\xff\b\n" + - "\fStartRequest\x12\x1b\n" + - "\texec_path\x18\x01 \x01(\tR\bexecPath\x12 \n" + - "\tnum_nodes\x18\x02 \x01(\rH\x00R\bnumNodes\x88\x01\x01\x122\n" + - "\x12whitelisted_chains\x18\x03 \x01(\tH\x01R\x11whitelistedChains\x88\x01\x01\x121\n" + - "\x12global_node_config\x18\x04 \x01(\tH\x02R\x10globalNodeConfig\x88\x01\x01\x12'\n" + - "\rroot_data_dir\x18\x05 \x01(\tH\x03R\vrootDataDir\x88\x01\x01\x12\x1d\n" + - "\n" + - "plugin_dir\x18\x06 \x01(\tR\tpluginDir\x12@\n" + - "\x10blockchain_specs\x18\a \x03(\v2\x15.rpcpb.BlockchainSpecR\x0fblockchainSpecs\x12Z\n" + - "\x13custom_node_configs\x18\b \x03(\v2*.rpcpb.StartRequest.CustomNodeConfigsEntryR\x11customNodeConfigs\x12J\n" + - "\rchain_configs\x18\t \x03(\v2%.rpcpb.StartRequest.ChainConfigsEntryR\fchainConfigs\x12P\n" + - "\x0fupgrade_configs\x18\n" + - " \x03(\v2'.rpcpb.StartRequest.UpgradeConfigsEntryR\x0eupgradeConfigs\x128\n" + - "\x16reassign_ports_if_used\x18\v \x01(\bH\x04R\x13reassignPortsIfUsed\x88\x01\x01\x12(\n" + - "\rdynamic_ports\x18\f \x01(\bH\x05R\fdynamicPorts\x88\x01\x01\x12W\n" + - "\x12chain_config_files\x18\r \x03(\v2).rpcpb.StartRequest.ChainConfigFilesEntryR\x10chainConfigFiles\x1aD\n" + - "\x16CustomNodeConfigsEntry\x12\x10\n" + - "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + - "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\x1a?\n" + - "\x11ChainConfigsEntry\x12\x10\n" + - "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + - "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\x1aA\n" + - "\x13UpgradeConfigsEntry\x12\x10\n" + - "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + - "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\x1aC\n" + - "\x15ChainConfigFilesEntry\x12\x10\n" + - "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + - "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01B\f\n" + - "\n" + - "_num_nodesB\x15\n" + - "\x13_whitelisted_chainsB\x15\n" + - "\x13_global_node_configB\x10\n" + - "\x0e_root_data_dirB\x19\n" + - "\x17_reassign_ports_if_usedB\x10\n" + - "\x0e_dynamic_ports\"\x13\n" + - "\x11RPCVersionRequest\".\n" + - "\x12RPCVersionResponse\x12\x18\n" + - "\aversion\x18\x01 \x01(\rR\aversion\"c\n" + - "\rStartResponse\x125\n" + - "\fcluster_info\x18\x01 \x01(\v2\x12.rpcpb.ClusterInfoR\vclusterInfo\x12\x1b\n" + - "\tchain_ids\x18\x02 \x03(\tR\bchainIds\"[\n" + - "\tChainSpec\x12\"\n" + - "\fparticipants\x18\x01 \x03(\tR\fparticipants\x12*\n" + - "\x11chain_config_file\x18\x02 \x01(\tR\x0fchainConfigFile\"\xa1\x05\n" + - "\x10ElasticChainSpec\x12\x19\n" + - "\bchain_id\x18\x01 \x01(\tR\achainId\x12\x1d\n" + - "\n" + - "asset_name\x18\x02 \x01(\tR\tassetName\x12!\n" + - "\fasset_symbol\x18\x03 \x01(\tR\vassetSymbol\x12%\n" + - "\x0einitial_supply\x18\x04 \x01(\x04R\rinitialSupply\x12\x1d\n" + - "\n" + - "max_supply\x18\x05 \x01(\x04R\tmaxSupply\x120\n" + - "\x14min_consumption_rate\x18\x06 \x01(\x04R\x12minConsumptionRate\x120\n" + - "\x14max_consumption_rate\x18\a \x01(\x04R\x12maxConsumptionRate\x12.\n" + - "\x13min_validator_stake\x18\b \x01(\x04R\x11minValidatorStake\x12.\n" + - "\x13max_validator_stake\x18\t \x01(\x04R\x11maxValidatorStake\x12,\n" + - "\x12min_stake_duration\x18\n" + - " \x01(\x04R\x10minStakeDuration\x12,\n" + - "\x12max_stake_duration\x18\v \x01(\x04R\x10maxStakeDuration\x12,\n" + - "\x12min_delegation_fee\x18\f \x01(\rR\x10minDelegationFee\x12.\n" + - "\x13min_delegator_stake\x18\r \x01(\x04R\x11minDelegatorStake\x12=\n" + - "\x1bmax_validator_weight_factor\x18\x0e \x01(\rR\x18maxValidatorWeightFactor\x12-\n" + - "\x12uptime_requirement\x18\x0f \x01(\rR\x11uptimeRequirement\"f\n" + - "\x1dTransformElasticChainsRequest\x12E\n" + - "\x12elastic_chain_spec\x18\x01 \x03(\v2\x17.rpcpb.ElasticChainSpecR\x10elasticChainSpec\"\x8b\x01\n" + - "\x1eTransformElasticChainsResponse\x125\n" + - "\fcluster_info\x18\x01 \x01(\v2\x12.rpcpb.ClusterInfoR\vclusterInfo\x12\x15\n" + - "\x06tx_ids\x18\x02 \x03(\tR\x05txIds\x12\x1b\n" + - "\tasset_ids\x18\x03 \x03(\tR\bassetIds\"\xe6\x01\n" + - "\x1bPermissionlessValidatorSpec\x12\x19\n" + - "\bchain_id\x18\x01 \x01(\tR\achainId\x12\x1b\n" + - "\tnode_name\x18\x02 \x01(\tR\bnodeName\x12.\n" + - "\x13staked_token_amount\x18\x03 \x01(\x04R\x11stakedTokenAmount\x12\x19\n" + - "\basset_id\x18\x04 \x01(\tR\aassetId\x12\x1d\n" + - "\n" + - "start_time\x18\x05 \x01(\tR\tstartTime\x12%\n" + - "\x0estake_duration\x18\x06 \x01(\x04R\rstakeDuration\"n\n" + - "!AddPermissionlessValidatorRequest\x12I\n" + - "\x0evalidator_spec\x18\x01 \x03(\v2\".rpcpb.PermissionlessValidatorSpecR\rvalidatorSpec\"[\n" + - "\"AddPermissionlessValidatorResponse\x125\n" + - "\fcluster_info\x18\x01 \x01(\v2\x12.rpcpb.ClusterInfoR\vclusterInfo\"T\n" + - "\x18RemoveChainValidatorSpec\x12\x19\n" + - "\bchain_id\x18\x01 \x01(\tR\achainId\x12\x1d\n" + - "\n" + - "node_names\x18\x02 \x03(\tR\tnodeNames\"e\n" + - "\x1bRemoveChainValidatorRequest\x12F\n" + - "\x0evalidator_spec\x18\x01 \x03(\v2\x1f.rpcpb.RemoveChainValidatorSpecR\rvalidatorSpec\"U\n" + - "\x1cRemoveChainValidatorResponse\x125\n" + - "\fcluster_info\x18\x01 \x01(\v2\x12.rpcpb.ClusterInfoR\vclusterInfo\"\xdf\x02\n" + - "\x0eBlockchainSpec\x12\x17\n" + - "\avm_name\x18\x01 \x01(\tR\x06vmName\x12\x18\n" + - "\agenesis\x18\x02 \x01(\tR\agenesis\x12\x1e\n" + - "\bchain_id\x18\x03 \x01(\tH\x00R\achainId\x88\x01\x01\x124\n" + - "\n" + - "chain_spec\x18\x04 \x01(\v2\x10.rpcpb.ChainSpecH\x01R\tchainSpec\x88\x01\x01\x12!\n" + - "\fchain_config\x18\x05 \x01(\tR\vchainConfig\x12'\n" + - "\x0fnetwork_upgrade\x18\x06 \x01(\tR\x0enetworkUpgrade\x12)\n" + - "\x10blockchain_alias\x18\a \x01(\tR\x0fblockchainAlias\x121\n" + - "\x15per_node_chain_config\x18\b \x01(\tR\x12perNodeChainConfigB\v\n" + - "\t_chain_idB\r\n" + - "\v_chain_spec\"\\\n" + - "\x18CreateBlockchainsRequest\x12@\n" + - "\x10blockchain_specs\x18\x01 \x03(\v2\x15.rpcpb.BlockchainSpecR\x0fblockchainSpecs\"o\n" + - "\x19CreateBlockchainsResponse\x125\n" + - "\fcluster_info\x18\x01 \x01(\v2\x12.rpcpb.ClusterInfoR\vclusterInfo\x12\x1b\n" + - "\tchain_ids\x18\x02 \x03(\tR\bchainIds\"H\n" + - "\x13CreateChainsRequest\x121\n" + - "\vchain_specs\x18\x01 \x03(\v2\x10.rpcpb.ChainSpecR\n" + - "chainSpecs\"j\n" + - "\x14CreateChainsResponse\x125\n" + - "\fcluster_info\x18\x01 \x01(\v2\x12.rpcpb.ClusterInfoR\vclusterInfo\x12\x1b\n" + - "\tchain_ids\x18\x02 \x03(\tR\bchainIds\"\x0f\n" + - "\rHealthRequest\"G\n" + - "\x0eHealthResponse\x125\n" + - "\fcluster_info\x18\x01 \x01(\v2\x12.rpcpb.ClusterInfoR\vclusterInfo\"\r\n" + - "\vURIsRequest\"\"\n" + - "\fURIsResponse\x12\x12\n" + - "\x04uris\x18\x01 \x03(\tR\x04uris\"\x17\n" + - "\x15WaitForHealthyRequest\"O\n" + - "\x16WaitForHealthyResponse\x125\n" + - "\fcluster_info\x18\x01 \x01(\v2\x12.rpcpb.ClusterInfoR\vclusterInfo\"\x0f\n" + - "\rStatusRequest\"G\n" + - "\x0eStatusResponse\x125\n" + - "\fcluster_info\x18\x01 \x01(\v2\x12.rpcpb.ClusterInfoR\vclusterInfo\":\n" + - "\x13StreamStatusRequest\x12#\n" + - "\rpush_interval\x18\x01 \x01(\x03R\fpushInterval\"M\n" + - "\x14StreamStatusResponse\x125\n" + - "\fcluster_info\x18\x01 \x01(\v2\x12.rpcpb.ClusterInfoR\vclusterInfo\"\x94\x05\n" + - "\x12RestartNodeRequest\x12\x12\n" + - "\x04name\x18\x01 \x01(\tR\x04name\x12 \n" + - "\texec_path\x18\x02 \x01(\tH\x00R\bexecPath\x88\x01\x01\x122\n" + - "\x12whitelisted_chains\x18\x03 \x01(\tH\x01R\x11whitelistedChains\x88\x01\x01\x12P\n" + - "\rchain_configs\x18\x04 \x03(\v2+.rpcpb.RestartNodeRequest.ChainConfigsEntryR\fchainConfigs\x12V\n" + - "\x0fupgrade_configs\x18\x05 \x03(\v2-.rpcpb.RestartNodeRequest.UpgradeConfigsEntryR\x0eupgradeConfigs\x12]\n" + - "\x12chain_config_files\x18\x06 \x03(\v2/.rpcpb.RestartNodeRequest.ChainConfigFilesEntryR\x10chainConfigFiles\x12\x1d\n" + - "\n" + - "plugin_dir\x18\a \x01(\tR\tpluginDir\x1a?\n" + - "\x11ChainConfigsEntry\x12\x10\n" + - "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + - "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\x1aA\n" + - "\x13UpgradeConfigsEntry\x12\x10\n" + - "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + - "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\x1aC\n" + - "\x15ChainConfigFilesEntry\x12\x10\n" + - "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + - "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01B\f\n" + - "\n" + - "_exec_pathB\x15\n" + - "\x13_whitelisted_chains\"L\n" + - "\x13RestartNodeResponse\x125\n" + - "\fcluster_info\x18\x01 \x01(\v2\x12.rpcpb.ClusterInfoR\vclusterInfo\"'\n" + - "\x11RemoveNodeRequest\x12\x12\n" + - "\x04name\x18\x01 \x01(\tR\x04name\"K\n" + - "\x12RemoveNodeResponse\x125\n" + - "\fcluster_info\x18\x01 \x01(\v2\x12.rpcpb.ClusterInfoR\vclusterInfo\"&\n" + - "\x10PauseNodeRequest\x12\x12\n" + - "\x04name\x18\x01 \x01(\tR\x04name\"J\n" + - "\x11PauseNodeResponse\x125\n" + - "\fcluster_info\x18\x01 \x01(\v2\x12.rpcpb.ClusterInfoR\vclusterInfo\"'\n" + - "\x11ResumeNodeRequest\x12\x12\n" + - "\x04name\x18\x01 \x01(\tR\x04name\"K\n" + - "\x12ResumeNodeResponse\x125\n" + - "\fcluster_info\x18\x01 \x01(\v2\x12.rpcpb.ClusterInfoR\vclusterInfo\"\xdc\x04\n" + - "\x0eAddNodeRequest\x12\x12\n" + - "\x04name\x18\x01 \x01(\tR\x04name\x12\x1b\n" + - "\texec_path\x18\x02 \x01(\tR\bexecPath\x12$\n" + - "\vnode_config\x18\x03 \x01(\tH\x00R\n" + - "nodeConfig\x88\x01\x01\x12L\n" + - "\rchain_configs\x18\x04 \x03(\v2'.rpcpb.AddNodeRequest.ChainConfigsEntryR\fchainConfigs\x12R\n" + - "\x0fupgrade_configs\x18\x05 \x03(\v2).rpcpb.AddNodeRequest.UpgradeConfigsEntryR\x0eupgradeConfigs\x12Y\n" + - "\x12chain_config_files\x18\x06 \x03(\v2+.rpcpb.AddNodeRequest.ChainConfigFilesEntryR\x10chainConfigFiles\x12\x1d\n" + - "\n" + - "plugin_dir\x18\a \x01(\tR\tpluginDir\x1a?\n" + - "\x11ChainConfigsEntry\x12\x10\n" + - "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + - "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\x1aA\n" + - "\x13UpgradeConfigsEntry\x12\x10\n" + - "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + - "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\x1aC\n" + - "\x15ChainConfigFilesEntry\x12\x10\n" + - "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + - "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01B\x0e\n" + - "\f_node_config\"H\n" + - "\x0fAddNodeResponse\x125\n" + - "\fcluster_info\x18\x01 \x01(\v2\x12.rpcpb.ClusterInfoR\vclusterInfo\"\r\n" + - "\vStopRequest\"E\n" + - "\fStopResponse\x125\n" + - "\fcluster_info\x18\x01 \x01(\v2\x12.rpcpb.ClusterInfoR\vclusterInfo\"0\n" + - "\x11AttachPeerRequest\x12\x1b\n" + - "\tnode_name\x18\x01 \x01(\tR\bnodeName\"\x92\x01\n" + - "\x12AttachPeerResponse\x125\n" + - "\fcluster_info\x18\x01 \x01(\v2\x12.rpcpb.ClusterInfoR\vclusterInfo\x12E\n" + - "\x12attached_peer_info\x18\x02 \x01(\v2\x17.rpcpb.AttachedPeerInfoR\x10attachedPeerInfo\"x\n" + - "\x1aSendOutboundMessageRequest\x12\x1b\n" + - "\tnode_name\x18\x01 \x01(\tR\bnodeName\x12\x17\n" + - "\apeer_id\x18\x02 \x01(\tR\x06peerId\x12\x0e\n" + - "\x02op\x18\x03 \x01(\rR\x02op\x12\x14\n" + - "\x05bytes\x18\x04 \x01(\fR\x05bytes\"1\n" + - "\x1bSendOutboundMessageResponse\x12\x12\n" + - "\x04sent\x18\x01 \x01(\bR\x04sent\":\n" + - "\x13SaveSnapshotRequest\x12#\n" + - "\rsnapshot_name\x18\x01 \x01(\tR\fsnapshotName\";\n" + - "\x14SaveSnapshotResponse\x12#\n" + - "\rsnapshot_path\x18\x01 \x01(\tR\fsnapshotPath\"\xb8\x06\n" + - "\x13LoadSnapshotRequest\x12#\n" + - "\rsnapshot_name\x18\x01 \x01(\tR\fsnapshotName\x12 \n" + - "\texec_path\x18\x02 \x01(\tH\x00R\bexecPath\x88\x01\x01\x12\x1d\n" + - "\n" + - "plugin_dir\x18\x03 \x01(\tR\tpluginDir\x12'\n" + - "\rroot_data_dir\x18\x04 \x01(\tH\x01R\vrootDataDir\x88\x01\x01\x12Q\n" + - "\rchain_configs\x18\x05 \x03(\v2,.rpcpb.LoadSnapshotRequest.ChainConfigsEntryR\fchainConfigs\x12W\n" + - "\x0fupgrade_configs\x18\x06 \x03(\v2..rpcpb.LoadSnapshotRequest.UpgradeConfigsEntryR\x0eupgradeConfigs\x121\n" + - "\x12global_node_config\x18\a \x01(\tH\x02R\x10globalNodeConfig\x88\x01\x01\x128\n" + - "\x16reassign_ports_if_used\x18\b \x01(\bH\x03R\x13reassignPortsIfUsed\x88\x01\x01\x12^\n" + - "\x12chain_config_files\x18\t \x03(\v20.rpcpb.LoadSnapshotRequest.ChainConfigFilesEntryR\x10chainConfigFiles\x1a?\n" + - "\x11ChainConfigsEntry\x12\x10\n" + - "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + - "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\x1aA\n" + - "\x13UpgradeConfigsEntry\x12\x10\n" + - "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + - "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\x1aC\n" + - "\x15ChainConfigFilesEntry\x12\x10\n" + - "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + - "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01B\f\n" + - "\n" + - "_exec_pathB\x10\n" + - "\x0e_root_data_dirB\x15\n" + - "\x13_global_node_configB\x19\n" + - "\x17_reassign_ports_if_used\"M\n" + - "\x14LoadSnapshotResponse\x125\n" + - "\fcluster_info\x18\x01 \x01(\v2\x12.rpcpb.ClusterInfoR\vclusterInfo\"<\n" + - "\x15RemoveSnapshotRequest\x12#\n" + - "\rsnapshot_name\x18\x01 \x01(\tR\fsnapshotName\"\x18\n" + - "\x16RemoveSnapshotResponse\"\x19\n" + - "\x17GetSnapshotNamesRequest\"A\n" + - "\x18GetSnapshotNamesResponse\x12%\n" + - "\x0esnapshot_names\x18\x01 \x03(\tR\rsnapshotNames2S\n" + - "\vPingService\x12D\n" + - "\x04Ping\x12\x12.rpcpb.PingRequest\x1a\x13.rpcpb.PingResponse\"\x13\x82\xd3\xe4\x93\x02\r:\x01*\"\b/v1/ping2\xdb\x15\n" + - "\x0eControlService\x12d\n" + - "\n" + - "RPCVersion\x12\x18.rpcpb.RPCVersionRequest\x1a\x19.rpcpb.RPCVersionResponse\"!\x82\xd3\xe4\x93\x02\x1b:\x01*\"\x16/v1/control/rpcversion\x12P\n" + - "\x05Start\x12\x13.rpcpb.StartRequest\x1a\x14.rpcpb.StartResponse\"\x1c\x82\xd3\xe4\x93\x02\x16:\x01*\"\x11/v1/control/start\x12\x80\x01\n" + - "\x11CreateBlockchains\x12\x1f.rpcpb.CreateBlockchainsRequest\x1a .rpcpb.CreateBlockchainsResponse\"(\x82\xd3\xe4\x93\x02\":\x01*\"\x1d/v1/control/createblockchains\x12\x94\x01\n" + - "\x16TransformElasticChains\x12$.rpcpb.TransformElasticChainsRequest\x1a%.rpcpb.TransformElasticChainsResponse\"-\x82\xd3\xe4\x93\x02':\x01*\"\"/v1/control/transformelasticchains\x12\xa4\x01\n" + - "\x1aAddPermissionlessValidator\x12(.rpcpb.AddPermissionlessValidatorRequest\x1a).rpcpb.AddPermissionlessValidatorResponse\"1\x82\xd3\xe4\x93\x02+:\x01*\"&/v1/control/addpermissionlessvalidator\x12\x8c\x01\n" + - "\x14RemoveChainValidator\x12\".rpcpb.RemoveChainValidatorRequest\x1a#.rpcpb.RemoveChainValidatorResponse\"+\x82\xd3\xe4\x93\x02%:\x01*\" /v1/control/removechainvalidator\x12l\n" + - "\fCreateChains\x12\x1a.rpcpb.CreateChainsRequest\x1a\x1b.rpcpb.CreateChainsResponse\"#\x82\xd3\xe4\x93\x02\x1d:\x01*\"\x18/v1/control/createchains\x12T\n" + - "\x06Health\x12\x14.rpcpb.HealthRequest\x1a\x15.rpcpb.HealthResponse\"\x1d\x82\xd3\xe4\x93\x02\x17:\x01*\"\x12/v1/control/health\x12L\n" + - "\x04URIs\x12\x12.rpcpb.URIsRequest\x1a\x13.rpcpb.URIsResponse\"\x1b\x82\xd3\xe4\x93\x02\x15:\x01*\"\x10/v1/control/uris\x12t\n" + - "\x0eWaitForHealthy\x12\x1c.rpcpb.WaitForHealthyRequest\x1a\x1d.rpcpb.WaitForHealthyResponse\"%\x82\xd3\xe4\x93\x02\x1f:\x01*\"\x1a/v1/control/waitforhealthy\x12T\n" + - "\x06Status\x12\x14.rpcpb.StatusRequest\x1a\x15.rpcpb.StatusResponse\"\x1d\x82\xd3\xe4\x93\x02\x17:\x01*\"\x12/v1/control/status\x12n\n" + - "\fStreamStatus\x12\x1a.rpcpb.StreamStatusRequest\x1a\x1b.rpcpb.StreamStatusResponse\"#\x82\xd3\xe4\x93\x02\x1d:\x01*\"\x18/v1/control/streamstatus0\x01\x12d\n" + - "\n" + - "RemoveNode\x12\x18.rpcpb.RemoveNodeRequest\x1a\x19.rpcpb.RemoveNodeResponse\"!\x82\xd3\xe4\x93\x02\x1b:\x01*\"\x16/v1/control/removenode\x12X\n" + - "\aAddNode\x12\x15.rpcpb.AddNodeRequest\x1a\x16.rpcpb.AddNodeResponse\"\x1e\x82\xd3\xe4\x93\x02\x18:\x01*\"\x13/v1/control/addnode\x12h\n" + - "\vRestartNode\x12\x19.rpcpb.RestartNodeRequest\x1a\x1a.rpcpb.RestartNodeResponse\"\"\x82\xd3\xe4\x93\x02\x1c:\x01*\"\x17/v1/control/restartnode\x12`\n" + - "\tPauseNode\x12\x17.rpcpb.PauseNodeRequest\x1a\x18.rpcpb.PauseNodeResponse\" \x82\xd3\xe4\x93\x02\x1a:\x01*\"\x15/v1/control/pausenode\x12d\n" + - "\n" + - "ResumeNode\x12\x18.rpcpb.ResumeNodeRequest\x1a\x19.rpcpb.ResumeNodeResponse\"!\x82\xd3\xe4\x93\x02\x1b:\x01*\"\x16/v1/control/resumenode\x12L\n" + - "\x04Stop\x12\x12.rpcpb.StopRequest\x1a\x13.rpcpb.StopResponse\"\x1b\x82\xd3\xe4\x93\x02\x15:\x01*\"\x10/v1/control/stop\x12d\n" + - "\n" + - "AttachPeer\x12\x18.rpcpb.AttachPeerRequest\x1a\x19.rpcpb.AttachPeerResponse\"!\x82\xd3\xe4\x93\x02\x1b:\x01*\"\x16/v1/control/attachpeer\x12\x88\x01\n" + - "\x13SendOutboundMessage\x12!.rpcpb.SendOutboundMessageRequest\x1a\".rpcpb.SendOutboundMessageResponse\"*\x82\xd3\xe4\x93\x02$:\x01*\"\x1f/v1/control/sendoutboundmessage\x12l\n" + - "\fSaveSnapshot\x12\x1a.rpcpb.SaveSnapshotRequest\x1a\x1b.rpcpb.SaveSnapshotResponse\"#\x82\xd3\xe4\x93\x02\x1d:\x01*\"\x18/v1/control/savesnapshot\x12r\n" + - "\x0fSaveHotSnapshot\x12\x1a.rpcpb.SaveSnapshotRequest\x1a\x1b.rpcpb.SaveSnapshotResponse\"&\x82\xd3\xe4\x93\x02 :\x01*\"\x1b/v1/control/savehotsnapshot\x12l\n" + - "\fLoadSnapshot\x12\x1a.rpcpb.LoadSnapshotRequest\x1a\x1b.rpcpb.LoadSnapshotResponse\"#\x82\xd3\xe4\x93\x02\x1d:\x01*\"\x18/v1/control/loadsnapshot\x12t\n" + - "\x0eRemoveSnapshot\x12\x1c.rpcpb.RemoveSnapshotRequest\x1a\x1d.rpcpb.RemoveSnapshotResponse\"%\x82\xd3\xe4\x93\x02\x1f:\x01*\"\x1a/v1/control/removesnapshot\x12|\n" + - "\x10GetSnapshotNames\x12\x1e.rpcpb.GetSnapshotNamesRequest\x1a\x1f.rpcpb.GetSnapshotNamesResponse\"'\x82\xd3\xe4\x93\x02!:\x01*\"\x1c/v1/control/getsnapshotnamesB\"Z github.com/luxfi/netrunner;rpcpbb\x06proto3" +var file_rpcpb_rpc_proto_rawDesc = []byte{ + 0x0a, 0x0f, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2f, 0x72, 0x70, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x12, 0x05, 0x72, 0x70, 0x63, 0x70, 0x62, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x0d, 0x0a, 0x0b, 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x20, 0x0a, 0x0c, 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x03, 0x70, 0x69, 0x64, 0x22, 0x32, 0x0a, 0x11, 0x43, 0x68, 0x61, 0x69, 0x6e, + 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x12, 0x1d, 0x0a, 0x0a, + 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x22, 0xaa, 0x06, 0x0a, 0x0b, + 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1d, 0x0a, 0x0a, 0x6e, + 0x6f, 0x64, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x40, 0x0a, 0x0a, 0x6e, 0x6f, + 0x64, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, + 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, + 0x66, 0x6f, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x12, 0x10, 0x0a, 0x03, + 0x70, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x22, + 0x0a, 0x0d, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x64, 0x69, 0x72, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x6f, 0x6f, 0x74, 0x44, 0x61, 0x74, 0x61, 0x44, + 0x69, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x07, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x12, 0x59, 0x0a, 0x13, + 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x5f, 0x70, 0x65, 0x65, 0x72, 0x5f, 0x69, 0x6e, + 0x66, 0x6f, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x72, 0x70, 0x63, 0x70, + 0x62, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x41, 0x74, + 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x50, 0x65, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x50, 0x65, + 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x63, 0x75, 0x73, 0x74, 0x6f, + 0x6d, 0x5f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x5f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, + 0x61, 0x69, 0x6e, 0x73, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x12, 0x49, 0x0a, 0x0d, 0x63, + 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x18, 0x08, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, + 0x69, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, + 0x43, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x12, 0x36, 0x0a, 0x06, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, + 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x43, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x43, 0x68, 0x61, 0x69, 0x6e, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x1a, 0x4d, + 0x0a, 0x0e, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x25, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x0f, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x63, 0x0a, + 0x16, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x50, 0x65, 0x65, 0x72, 0x49, 0x6e, 0x66, + 0x6f, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x33, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x66, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x50, + 0x65, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x1a, 0x57, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x69, + 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, + 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x4b, 0x0a, 0x0b, 0x43, + 0x68, 0x61, 0x69, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x26, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x70, + 0x63, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9d, 0x01, 0x0a, 0x09, 0x43, 0x68, 0x61, + 0x69, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x65, 0x6c, 0x61, + 0x73, 0x74, 0x69, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, 0x45, 0x6c, + 0x61, 0x73, 0x74, 0x69, 0x63, 0x12, 0x28, 0x0a, 0x10, 0x65, 0x6c, 0x61, 0x73, 0x74, 0x69, 0x63, + 0x5f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0e, 0x65, 0x6c, 0x61, 0x73, 0x74, 0x69, 0x63, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x12, + 0x47, 0x0a, 0x12, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, + 0x70, 0x61, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x72, 0x70, + 0x63, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, + 0x70, 0x61, 0x6e, 0x74, 0x73, 0x52, 0x11, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x50, 0x61, 0x72, 0x74, + 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x22, 0x87, 0x01, 0x0a, 0x0f, 0x43, 0x75, 0x73, + 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1d, 0x0a, 0x0a, + 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x13, 0x0a, 0x05, 0x76, + 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x76, 0x6d, 0x49, 0x64, + 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x12, 0x23, 0x0a, + 0x0d, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x63, 0x68, 0x61, 0x69, 0x6e, + 0x49, 0x64, 0x22, 0x8b, 0x02, 0x0a, 0x08, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x70, 0x61, 0x74, 0x68, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x78, 0x65, 0x63, 0x50, 0x61, 0x74, 0x68, + 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x69, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, + 0x72, 0x69, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, + 0x69, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x6c, 0x6f, 0x67, 0x5f, 0x64, 0x69, 0x72, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x6c, 0x6f, 0x67, 0x44, 0x69, 0x72, 0x12, 0x15, 0x0a, 0x06, 0x64, + 0x62, 0x5f, 0x64, 0x69, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x64, 0x62, 0x44, + 0x69, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x5f, 0x64, 0x69, 0x72, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x44, 0x69, + 0x72, 0x12, 0x2d, 0x0a, 0x12, 0x77, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x64, + 0x5f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x77, + 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x64, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x73, + 0x12, 0x16, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x61, 0x75, 0x73, + 0x65, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x61, 0x75, 0x73, 0x65, 0x64, + 0x22, 0x22, 0x0a, 0x10, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x50, 0x65, 0x65, 0x72, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x02, 0x69, 0x64, 0x22, 0x47, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x66, 0x41, 0x74, + 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x50, 0x65, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2d, + 0x0a, 0x05, 0x70, 0x65, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, + 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x50, 0x65, + 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x70, 0x65, 0x65, 0x72, 0x73, 0x22, 0xbf, 0x09, + 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, + 0x0a, 0x0c, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1b, + 0x0a, 0x09, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x65, 0x78, 0x65, 0x63, 0x50, 0x61, 0x74, 0x68, 0x12, 0x20, 0x0a, 0x09, 0x6e, + 0x75, 0x6d, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x00, + 0x52, 0x08, 0x6e, 0x75, 0x6d, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x88, 0x01, 0x01, 0x12, 0x32, 0x0a, + 0x12, 0x77, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x63, 0x68, 0x61, + 0x69, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x11, 0x77, 0x68, 0x69, + 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x64, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x88, 0x01, + 0x01, 0x12, 0x31, 0x0a, 0x12, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x6e, 0x6f, 0x64, 0x65, + 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, + 0x10, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x88, 0x01, 0x01, 0x12, 0x27, 0x0a, 0x0d, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x64, 0x61, 0x74, + 0x61, 0x5f, 0x64, 0x69, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x0b, 0x72, + 0x6f, 0x6f, 0x74, 0x44, 0x61, 0x74, 0x61, 0x44, 0x69, 0x72, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, + 0x0a, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x5f, 0x64, 0x69, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x44, 0x69, 0x72, 0x12, 0x40, 0x0a, 0x10, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x73, + 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x42, + 0x6c, 0x6f, 0x63, 0x6b, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0f, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x73, 0x12, 0x5a, + 0x0a, 0x13, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x72, 0x70, + 0x63, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4e, + 0x6f, 0x64, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x12, 0x4a, 0x0a, 0x0d, 0x63, 0x68, + 0x61, 0x69, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x25, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x12, 0x50, 0x0a, 0x0f, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, + 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x27, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x2e, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0e, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, + 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x12, 0x38, 0x0a, 0x16, 0x72, 0x65, 0x61, 0x73, + 0x73, 0x69, 0x67, 0x6e, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x5f, 0x69, 0x66, 0x5f, 0x75, 0x73, + 0x65, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x48, 0x04, 0x52, 0x13, 0x72, 0x65, 0x61, 0x73, + 0x73, 0x69, 0x67, 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x49, 0x66, 0x55, 0x73, 0x65, 0x64, 0x88, + 0x01, 0x01, 0x12, 0x28, 0x0a, 0x0d, 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x5f, 0x70, 0x6f, + 0x72, 0x74, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x48, 0x05, 0x52, 0x0c, 0x64, 0x79, 0x6e, + 0x61, 0x6d, 0x69, 0x63, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x88, 0x01, 0x01, 0x12, 0x57, 0x0a, 0x12, + 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x66, 0x69, 0x6c, + 0x65, 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, + 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x43, 0x68, + 0x61, 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x10, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x46, 0x69, 0x6c, 0x65, 0x73, 0x1a, 0x44, 0x0a, 0x16, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4e, + 0x6f, 0x64, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3f, 0x0a, 0x11, 0x43, + 0x68, 0x61, 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x41, 0x0a, 0x13, + 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, + 0x43, 0x0a, 0x15, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x46, 0x69, + 0x6c, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x6e, 0x75, 0x6d, 0x5f, 0x6e, 0x6f, 0x64, + 0x65, 0x73, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x77, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, + 0x65, 0x64, 0x5f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x67, 0x6c, + 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x64, + 0x69, 0x72, 0x42, 0x19, 0x0a, 0x17, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x5f, + 0x70, 0x6f, 0x72, 0x74, 0x73, 0x5f, 0x69, 0x66, 0x5f, 0x75, 0x73, 0x65, 0x64, 0x42, 0x10, 0x0a, + 0x0e, 0x5f, 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x22, + 0x13, 0x0a, 0x11, 0x52, 0x50, 0x43, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x22, 0x2e, 0x0a, 0x12, 0x52, 0x50, 0x43, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 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, 0x22, 0x63, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x72, 0x70, + 0x63, 0x70, 0x62, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1b, 0x0a, 0x09, + 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x08, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x73, 0x22, 0x5b, 0x0a, 0x09, 0x43, 0x68, 0x61, + 0x69, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, + 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x61, + 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x63, 0x68, + 0x61, 0x69, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x46, 0x69, 0x6c, 0x65, 0x22, 0xa1, 0x05, 0x0a, 0x10, 0x45, 0x6c, 0x61, 0x73, 0x74, + 0x69, 0x63, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x12, 0x19, 0x0a, 0x08, 0x63, + 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, + 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x73, 0x73, 0x65, + 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x73, + 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x73, 0x73, + 0x65, 0x74, 0x53, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x12, 0x25, 0x0a, 0x0e, 0x69, 0x6e, 0x69, 0x74, + 0x69, 0x61, 0x6c, 0x5f, 0x73, 0x75, 0x70, 0x70, 0x6c, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x0d, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x53, 0x75, 0x70, 0x70, 0x6c, 0x79, 0x12, + 0x1d, 0x0a, 0x0a, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x75, 0x70, 0x70, 0x6c, 0x79, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x09, 0x6d, 0x61, 0x78, 0x53, 0x75, 0x70, 0x70, 0x6c, 0x79, 0x12, 0x30, + 0x0a, 0x14, 0x6d, 0x69, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x12, 0x6d, 0x69, + 0x6e, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x61, 0x74, 0x65, + 0x12, 0x30, 0x0a, 0x14, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x12, + 0x6d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x61, + 0x74, 0x65, 0x12, 0x2e, 0x0a, 0x13, 0x6d, 0x69, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x6f, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x11, 0x6d, 0x69, 0x6e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, + 0x6b, 0x65, 0x12, 0x2e, 0x0a, 0x13, 0x6d, 0x61, 0x78, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x6f, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x11, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, + 0x6b, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x6d, 0x69, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x5f, + 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, + 0x6d, 0x69, 0x6e, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x2c, 0x0a, 0x12, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x5f, 0x64, 0x75, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x6d, 0x61, + 0x78, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2c, + 0x0a, 0x12, 0x6d, 0x69, 0x6e, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x66, 0x65, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x6d, 0x69, 0x6e, 0x44, + 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x65, 0x65, 0x12, 0x2e, 0x0a, 0x13, + 0x6d, 0x69, 0x6e, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x73, 0x74, + 0x61, 0x6b, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x04, 0x52, 0x11, 0x6d, 0x69, 0x6e, 0x44, 0x65, + 0x6c, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x12, 0x3d, 0x0a, 0x1b, + 0x6d, 0x61, 0x78, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x77, 0x65, + 0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x0e, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x18, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x57, + 0x65, 0x69, 0x67, 0x68, 0x74, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x2d, 0x0a, 0x12, 0x75, + 0x70, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x75, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x66, 0x0a, 0x1d, 0x54, 0x72, + 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x45, 0x6c, 0x61, 0x73, 0x74, 0x69, 0x63, 0x43, 0x68, + 0x61, 0x69, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x45, 0x0a, 0x12, 0x65, + 0x6c, 0x61, 0x73, 0x74, 0x69, 0x63, 0x5f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x73, 0x70, 0x65, + 0x63, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, + 0x45, 0x6c, 0x61, 0x73, 0x74, 0x69, 0x63, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x53, 0x70, 0x65, 0x63, + 0x52, 0x10, 0x65, 0x6c, 0x61, 0x73, 0x74, 0x69, 0x63, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x53, 0x70, + 0x65, 0x63, 0x22, 0x8b, 0x01, 0x0a, 0x1e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, + 0x45, 0x6c, 0x61, 0x73, 0x74, 0x69, 0x63, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x72, 0x70, + 0x63, 0x70, 0x62, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x15, 0x0a, 0x06, + 0x74, 0x78, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x74, 0x78, + 0x49, 0x64, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x73, + 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x73, + 0x22, 0xe6, 0x01, 0x0a, 0x1b, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x6c, + 0x65, 0x73, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x70, 0x65, 0x63, + 0x12, 0x19, 0x0a, 0x08, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x6e, + 0x6f, 0x64, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x6e, 0x6f, 0x64, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x13, 0x73, 0x74, 0x61, 0x6b, + 0x65, 0x64, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x11, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x64, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, + 0x74, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, + 0x74, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, + 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, + 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x5f, 0x64, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x73, 0x74, 0x61, 0x6b, + 0x65, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x6e, 0x0a, 0x21, 0x41, 0x64, 0x64, + 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x6c, 0x65, 0x73, 0x73, 0x56, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x49, + 0x0a, 0x0e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x73, 0x70, 0x65, 0x63, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x50, + 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x6c, 0x65, 0x73, 0x73, 0x56, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0d, 0x76, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x70, 0x65, 0x63, 0x22, 0x5b, 0x0a, 0x22, 0x41, 0x64, 0x64, + 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x6c, 0x65, 0x73, 0x73, 0x56, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x35, 0x0a, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x43, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x54, 0x0a, 0x18, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x43, 0x68, 0x61, 0x69, 0x6e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x70, + 0x65, 0x63, 0x12, 0x19, 0x0a, 0x08, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x12, 0x1d, 0x0a, + 0x0a, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x22, 0x65, 0x0a, 0x1b, + 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x56, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x46, 0x0a, 0x0e, 0x76, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6d, 0x6f, + 0x76, 0x65, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, + 0x53, 0x70, 0x65, 0x63, 0x52, 0x0d, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, + 0x70, 0x65, 0x63, 0x22, 0x55, 0x0a, 0x1c, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x68, 0x61, + 0x69, 0x6e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, + 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x72, 0x70, 0x63, 0x70, + 0x62, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0xdf, 0x02, 0x0a, 0x0e, 0x42, + 0x6c, 0x6f, 0x63, 0x6b, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x12, 0x17, 0x0a, + 0x07, 0x76, 0x6d, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x76, 0x6d, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, + 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, + 0x12, 0x1e, 0x0a, 0x08, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x88, 0x01, 0x01, + 0x12, 0x34, 0x0a, 0x0a, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x61, + 0x69, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x48, 0x01, 0x52, 0x09, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x53, + 0x70, 0x65, 0x63, 0x88, 0x01, 0x01, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x68, + 0x61, 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x27, 0x0a, 0x0f, 0x6e, 0x65, 0x74, + 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x55, 0x70, 0x67, 0x72, 0x61, + 0x64, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x63, 0x68, 0x61, 0x69, 0x6e, + 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x31, 0x0a, + 0x15, 0x70, 0x65, 0x72, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x70, 0x65, + 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x42, 0x0d, 0x0a, + 0x0b, 0x5f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x22, 0x5c, 0x0a, 0x18, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x63, 0x68, 0x61, 0x69, 0x6e, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x10, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, + 0x63, 0x68, 0x61, 0x69, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x63, 0x68, 0x61, 0x69, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x73, 0x22, 0x6f, 0x0a, 0x19, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, + 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1b, + 0x0a, 0x09, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x08, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x73, 0x22, 0x48, 0x0a, 0x13, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x31, 0x0a, 0x0b, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x73, 0x70, 0x65, 0x63, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, + 0x43, 0x68, 0x61, 0x69, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0a, 0x63, 0x68, 0x61, 0x69, 0x6e, + 0x53, 0x70, 0x65, 0x63, 0x73, 0x22, 0x6a, 0x0a, 0x14, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, + 0x68, 0x61, 0x69, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, + 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x43, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, + 0x73, 0x22, 0x48, 0x0a, 0x0d, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0c, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x6e, 0x65, 0x74, 0x77, + 0x6f, 0x72, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x6e, + 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x9c, 0x01, 0x0a, 0x0e, + 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, + 0x0a, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x43, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x40, 0x0a, 0x0e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, + 0x5f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, + 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x48, 0x65, 0x61, + 0x6c, 0x74, 0x68, 0x48, 0x00, 0x52, 0x0d, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x48, 0x65, + 0x61, 0x6c, 0x74, 0x68, 0x88, 0x01, 0x01, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x6e, 0x65, 0x74, 0x77, + 0x6f, 0x72, 0x6b, 0x5f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x22, 0xb9, 0x01, 0x0a, 0x0d, 0x4e, + 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x21, 0x0a, 0x0c, + 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x1d, 0x0a, 0x0a, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x09, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x12, 0x18, + 0x0a, 0x07, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x07, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x68, 0x65, 0x61, 0x6c, + 0x74, 0x68, 0x79, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x0c, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x27, 0x0a, + 0x0f, 0x75, 0x6e, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, + 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x75, 0x6e, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, + 0x79, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x22, 0x0d, 0x0a, 0x0b, 0x55, 0x52, 0x49, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x22, 0x0a, 0x0c, 0x55, 0x52, 0x49, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x72, 0x69, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x04, 0x75, 0x72, 0x69, 0x73, 0x22, 0x50, 0x0a, 0x15, 0x57, 0x61, 0x69, + 0x74, 0x46, 0x6f, 0x72, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0c, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x6e, 0x65, 0x74, 0x77, + 0x6f, 0x72, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x6e, + 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x4f, 0x0a, 0x16, 0x57, + 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x72, 0x70, + 0x63, 0x70, 0x62, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x48, 0x0a, 0x0d, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, + 0x0c, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4e, 0x61, + 0x6d, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, + 0x6b, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x9c, 0x01, 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x0c, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x12, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x40, 0x0a, 0x0e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, + 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x48, 0x00, + 0x52, 0x0d, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x88, + 0x01, 0x01, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0xd7, 0x01, 0x0a, 0x0d, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, + 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x6e, 0x65, 0x74, 0x77, 0x6f, + 0x72, 0x6b, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6e, + 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x6e, 0x65, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, + 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x75, 0x6d, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x6e, 0x75, 0x6d, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x25, + 0x0a, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, + 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, + 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x28, 0x0a, 0x06, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x18, + 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x43, 0x68, + 0x61, 0x69, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x22, + 0x3a, 0x0a, 0x13, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x70, + 0x75, 0x73, 0x68, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x22, 0x4d, 0x0a, 0x14, 0x53, + 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, + 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x72, 0x70, 0x63, 0x70, + 0x62, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x94, 0x05, 0x0a, 0x12, 0x52, + 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x09, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x70, 0x61, + 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x08, 0x65, 0x78, 0x65, 0x63, + 0x50, 0x61, 0x74, 0x68, 0x88, 0x01, 0x01, 0x12, 0x32, 0x0a, 0x12, 0x77, 0x68, 0x69, 0x74, 0x65, + 0x6c, 0x69, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x11, 0x77, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, + 0x65, 0x64, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x88, 0x01, 0x01, 0x12, 0x50, 0x0a, 0x0d, 0x63, + 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x18, 0x04, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x43, 0x68, + 0x61, 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x0c, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x12, 0x56, 0x0a, + 0x0f, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, + 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x52, + 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x2e, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0e, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x73, 0x12, 0x5d, 0x0a, 0x12, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x2f, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, + 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x43, 0x68, 0x61, + 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x10, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x46, + 0x69, 0x6c, 0x65, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x5f, 0x64, + 0x69, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, + 0x44, 0x69, 0x72, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x41, 0x0a, 0x13, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x43, 0x0a, 0x15, 0x43, 0x68, 0x61, 0x69, 0x6e, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x0c, 0x0a, 0x0a, + 0x5f, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x77, + 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x63, 0x68, 0x61, 0x69, 0x6e, + 0x73, 0x22, 0x4c, 0x0a, 0x13, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4e, 0x6f, 0x64, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x0c, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, + 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x22, + 0x27, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x4b, 0x0a, 0x12, 0x52, 0x65, 0x6d, 0x6f, + 0x76, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, + 0x0a, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x43, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x26, 0x0a, 0x10, 0x50, 0x61, 0x75, 0x73, 0x65, 0x4e, 0x6f, + 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x4a, 0x0a, + 0x11, 0x50, 0x61, 0x75, 0x73, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x35, 0x0a, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x6e, + 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, + 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x27, 0x0a, 0x11, 0x52, 0x65, 0x73, + 0x75, 0x6d, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x22, 0x4b, 0x0a, 0x12, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x4e, 0x6f, 0x64, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x0c, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, + 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x22, + 0xdc, 0x04, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x70, + 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x78, 0x65, 0x63, 0x50, + 0x61, 0x74, 0x68, 0x12, 0x24, 0x0a, 0x0b, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0a, 0x6e, 0x6f, 0x64, 0x65, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x88, 0x01, 0x01, 0x12, 0x4c, 0x0a, 0x0d, 0x63, 0x68, 0x61, + 0x69, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x27, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x41, 0x64, 0x64, 0x4e, 0x6f, 0x64, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x68, 0x61, 0x69, 0x6e, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x12, 0x52, 0x0a, 0x0f, 0x75, 0x70, 0x67, 0x72, 0x61, + 0x64, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x29, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x41, 0x64, 0x64, 0x4e, 0x6f, 0x64, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0e, 0x75, 0x70, 0x67, + 0x72, 0x61, 0x64, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x12, 0x59, 0x0a, 0x12, 0x63, + 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x66, 0x69, 0x6c, 0x65, + 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, + 0x41, 0x64, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x43, + 0x68, 0x61, 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x10, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, + 0x5f, 0x64, 0x69, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x6c, 0x75, 0x67, + 0x69, 0x6e, 0x44, 0x69, 0x72, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x41, 0x0a, 0x13, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, + 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x43, 0x0a, 0x15, 0x43, 0x68, 0x61, + 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x0e, + 0x0a, 0x0c, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x48, + 0x0a, 0x0f, 0x41, 0x64, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x35, 0x0a, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x66, + 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, + 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x0d, 0x0a, 0x0b, 0x53, 0x74, 0x6f, 0x70, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x45, 0x0a, 0x0c, 0x53, 0x74, 0x6f, 0x70, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, + 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x30, + 0x0a, 0x11, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x50, 0x65, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x4e, 0x61, 0x6d, 0x65, + 0x22, 0x92, 0x01, 0x0a, 0x12, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x50, 0x65, 0x65, 0x72, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, + 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x45, + 0x0a, 0x12, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x5f, 0x70, 0x65, 0x65, 0x72, 0x5f, + 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x72, 0x70, 0x63, + 0x70, 0x62, 0x2e, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x50, 0x65, 0x65, 0x72, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x10, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x50, 0x65, 0x65, + 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x78, 0x0a, 0x1a, 0x53, 0x65, 0x6e, 0x64, 0x4f, 0x75, 0x74, + 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x17, 0x0a, 0x07, 0x70, 0x65, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x70, 0x65, 0x65, 0x72, 0x49, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x70, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x6f, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x79, 0x74, + 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x62, 0x79, 0x74, 0x65, 0x73, 0x22, + 0x31, 0x0a, 0x1b, 0x53, 0x65, 0x6e, 0x64, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x4d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, + 0x0a, 0x04, 0x73, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x73, 0x65, + 0x6e, 0x74, 0x22, 0x5d, 0x0a, 0x13, 0x53, 0x61, 0x76, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x6e, 0x65, 0x74, + 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, + 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4e, 0x61, 0x6d, + 0x65, 0x22, 0x3b, 0x0a, 0x14, 0x53, 0x61, 0x76, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x6e, 0x61, + 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0c, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x61, 0x74, 0x68, 0x22, 0xdb, + 0x06, 0x0a, 0x13, 0x4c, 0x6f, 0x61, 0x64, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, + 0x6b, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6e, 0x65, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x6e, 0x61, + 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0c, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20, + 0x0a, 0x09, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x00, 0x52, 0x08, 0x65, 0x78, 0x65, 0x63, 0x50, 0x61, 0x74, 0x68, 0x88, 0x01, 0x01, + 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x5f, 0x64, 0x69, 0x72, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x44, 0x69, 0x72, 0x12, + 0x27, 0x0a, 0x0d, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x64, 0x69, 0x72, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x0b, 0x72, 0x6f, 0x6f, 0x74, 0x44, 0x61, + 0x74, 0x61, 0x44, 0x69, 0x72, 0x88, 0x01, 0x01, 0x12, 0x51, 0x0a, 0x0d, 0x63, 0x68, 0x61, 0x69, + 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x2c, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x53, 0x6e, 0x61, 0x70, + 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x43, 0x68, 0x61, 0x69, + 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, + 0x68, 0x61, 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x12, 0x57, 0x0a, 0x0f, 0x75, + 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x18, 0x07, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x61, + 0x64, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x2e, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0e, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x73, 0x12, 0x31, 0x0a, 0x12, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x6e, + 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, + 0x48, 0x02, 0x52, 0x10, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x88, 0x01, 0x01, 0x12, 0x38, 0x0a, 0x16, 0x72, 0x65, 0x61, 0x73, 0x73, + 0x69, 0x67, 0x6e, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x5f, 0x69, 0x66, 0x5f, 0x75, 0x73, 0x65, + 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x48, 0x03, 0x52, 0x13, 0x72, 0x65, 0x61, 0x73, 0x73, + 0x69, 0x67, 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x49, 0x66, 0x55, 0x73, 0x65, 0x64, 0x88, 0x01, + 0x01, 0x12, 0x5e, 0x0a, 0x12, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, + 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x10, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x46, 0x69, 0x6c, 0x65, + 0x73, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x1a, 0x41, 0x0a, 0x13, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x43, 0x0a, 0x15, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x65, + 0x78, 0x65, 0x63, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x72, 0x6f, 0x6f, + 0x74, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x64, 0x69, 0x72, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x67, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x42, 0x19, 0x0a, 0x17, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x5f, 0x70, + 0x6f, 0x72, 0x74, 0x73, 0x5f, 0x69, 0x66, 0x5f, 0x75, 0x73, 0x65, 0x64, 0x22, 0x4d, 0x0a, 0x14, + 0x4c, 0x6f, 0x61, 0x64, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, + 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x72, 0x70, 0x63, + 0x70, 0x62, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x5f, 0x0a, 0x15, 0x52, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6e, 0x65, 0x74, 0x77, + 0x6f, 0x72, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x6e, 0x61, 0x70, 0x73, + 0x68, 0x6f, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, + 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x18, 0x0a, 0x16, + 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3c, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x53, 0x6e, 0x61, + 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, + 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x41, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x53, 0x6e, 0x61, 0x70, 0x73, + 0x68, 0x6f, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x32, 0x53, 0x0a, 0x0b, 0x50, 0x69, 0x6e, 0x67, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x44, 0x0a, 0x04, 0x50, 0x69, 0x6e, 0x67, 0x12, 0x12, + 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x3a, + 0x01, 0x2a, 0x22, 0x08, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x69, 0x6e, 0x67, 0x32, 0xdb, 0x15, 0x0a, + 0x0e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, + 0x64, 0x0a, 0x0a, 0x52, 0x50, 0x43, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x2e, + 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x52, 0x50, 0x43, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, + 0x52, 0x50, 0x43, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x3a, 0x01, 0x2a, 0x22, 0x16, 0x2f, + 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x72, 0x70, 0x63, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x50, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x13, + 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x72, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1c, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x16, 0x3a, 0x01, 0x2a, 0x22, 0x11, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x80, 0x01, 0x0a, 0x11, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x12, 0x1f, 0x2e, + 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x6c, 0x6f, 0x63, + 0x6b, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, + 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x6c, 0x6f, + 0x63, 0x6b, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x3a, 0x01, 0x2a, 0x22, 0x1d, 0x2f, 0x76, 0x31, + 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x12, 0x94, 0x01, 0x0a, 0x16, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x45, 0x6c, 0x61, 0x73, 0x74, 0x69, 0x63, 0x43, + 0x68, 0x61, 0x69, 0x6e, 0x73, 0x12, 0x24, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x54, 0x72, + 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x45, 0x6c, 0x61, 0x73, 0x74, 0x69, 0x63, 0x43, 0x68, + 0x61, 0x69, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x72, 0x70, + 0x63, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x45, 0x6c, 0x61, + 0x73, 0x74, 0x69, 0x63, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x2d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x27, 0x3a, 0x01, 0x2a, 0x22, 0x22, 0x2f, + 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x6c, 0x61, 0x73, 0x74, 0x69, 0x63, 0x63, 0x68, 0x61, 0x69, 0x6e, + 0x73, 0x12, 0xa4, 0x01, 0x0a, 0x1a, 0x41, 0x64, 0x64, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x6c, 0x65, 0x73, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, + 0x12, 0x28, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x41, 0x64, 0x64, 0x50, 0x65, 0x72, 0x6d, + 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x6c, 0x65, 0x73, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x72, 0x70, 0x63, + 0x70, 0x62, 0x2e, 0x41, 0x64, 0x64, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x6c, 0x65, 0x73, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x31, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2b, 0x3a, 0x01, 0x2a, + 0x22, 0x26, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x61, 0x64, + 0x64, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x6c, 0x65, 0x73, 0x73, 0x76, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x8c, 0x01, 0x0a, 0x14, 0x52, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, + 0x72, 0x12, 0x22, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x43, 0x68, 0x61, 0x69, 0x6e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x52, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x25, 0x3a, 0x01, 0x2a, 0x22, 0x20, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2f, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x76, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x6c, 0x0a, 0x0c, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x12, 0x1a, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x23, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1d, 0x3a, 0x01, 0x2a, 0x22, 0x18, 0x2f, 0x76, 0x31, + 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x63, + 0x68, 0x61, 0x69, 0x6e, 0x73, 0x12, 0x54, 0x0a, 0x06, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, + 0x14, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x48, 0x65, + 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1d, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x17, 0x3a, 0x01, 0x2a, 0x22, 0x12, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x4c, 0x0a, 0x04, 0x55, + 0x52, 0x49, 0x73, 0x12, 0x12, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x55, 0x52, 0x49, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, + 0x55, 0x52, 0x49, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1b, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x15, 0x3a, 0x01, 0x2a, 0x22, 0x10, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x75, 0x72, 0x69, 0x73, 0x12, 0x74, 0x0a, 0x0e, 0x57, 0x61, 0x69, + 0x74, 0x46, 0x6f, 0x72, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x12, 0x1c, 0x2e, 0x72, 0x70, + 0x63, 0x70, 0x62, 0x2e, 0x57, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x48, 0x65, 0x61, 0x6c, 0x74, + 0x68, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x72, 0x70, 0x63, 0x70, + 0x62, 0x2e, 0x57, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x25, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1f, + 0x3a, 0x01, 0x2a, 0x22, 0x1a, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2f, 0x77, 0x61, 0x69, 0x74, 0x66, 0x6f, 0x72, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x12, + 0x54, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x2e, 0x72, 0x70, 0x63, 0x70, + 0x62, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x15, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x3a, 0x01, + 0x2a, 0x22, 0x12, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x6e, 0x0a, 0x0c, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1a, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x53, 0x74, + 0x72, 0x65, 0x61, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1b, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x23, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1d, 0x3a, 0x01, 0x2a, 0x22, 0x18, 0x2f, 0x76, 0x31, 0x2f, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x30, 0x01, 0x12, 0x64, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4e, + 0x6f, 0x64, 0x65, 0x12, 0x18, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6d, 0x6f, + 0x76, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, + 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4e, 0x6f, 0x64, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, + 0x3a, 0x01, 0x2a, 0x22, 0x16, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2f, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x6e, 0x6f, 0x64, 0x65, 0x12, 0x58, 0x0a, 0x07, 0x41, + 0x64, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x15, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x41, + 0x64, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, + 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x41, 0x64, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x3a, 0x01, 0x2a, + 0x22, 0x13, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x61, 0x64, + 0x64, 0x6e, 0x6f, 0x64, 0x65, 0x12, 0x68, 0x0a, 0x0b, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x19, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1a, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4e, + 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x22, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x1c, 0x3a, 0x01, 0x2a, 0x22, 0x17, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2f, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x6e, 0x6f, 0x64, 0x65, 0x12, + 0x60, 0x0a, 0x09, 0x50, 0x61, 0x75, 0x73, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x17, 0x2e, 0x72, + 0x70, 0x63, 0x70, 0x62, 0x2e, 0x50, 0x61, 0x75, 0x73, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x50, 0x61, + 0x75, 0x73, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x3a, 0x01, 0x2a, 0x22, 0x15, 0x2f, 0x76, 0x31, 0x2f, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x70, 0x61, 0x75, 0x73, 0x65, 0x6e, 0x6f, 0x64, + 0x65, 0x12, 0x64, 0x0a, 0x0a, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x12, + 0x18, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x4e, 0x6f, + 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x72, 0x70, 0x63, 0x70, + 0x62, 0x2e, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x3a, 0x01, 0x2a, 0x22, + 0x16, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x72, 0x65, 0x73, + 0x75, 0x6d, 0x65, 0x6e, 0x6f, 0x64, 0x65, 0x12, 0x4c, 0x0a, 0x04, 0x53, 0x74, 0x6f, 0x70, 0x12, + 0x12, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x6f, 0x70, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, + 0x3a, 0x01, 0x2a, 0x22, 0x10, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2f, 0x73, 0x74, 0x6f, 0x70, 0x12, 0x64, 0x0a, 0x0a, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x50, + 0x65, 0x65, 0x72, 0x12, 0x18, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x41, 0x74, 0x74, 0x61, + 0x63, 0x68, 0x50, 0x65, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, + 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x50, 0x65, 0x65, 0x72, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, + 0x3a, 0x01, 0x2a, 0x22, 0x16, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2f, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x70, 0x65, 0x65, 0x72, 0x12, 0x88, 0x01, 0x0a, 0x13, + 0x53, 0x65, 0x6e, 0x64, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x4d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x12, 0x21, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x6e, 0x64, + 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x53, + 0x65, 0x6e, 0x64, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x24, 0x3a, 0x01, 0x2a, 0x22, 0x1f, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2f, 0x73, 0x65, 0x6e, 0x64, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x6d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x6c, 0x0a, 0x0c, 0x53, 0x61, 0x76, 0x65, 0x53, 0x6e, + 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x1a, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x53, + 0x61, 0x76, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x53, 0x61, 0x76, 0x65, 0x53, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x23, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1d, 0x3a, 0x01, 0x2a, 0x22, 0x18, 0x2f, 0x76, 0x31, 0x2f, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x73, 0x61, 0x76, 0x65, 0x73, 0x6e, 0x61, 0x70, + 0x73, 0x68, 0x6f, 0x74, 0x12, 0x72, 0x0a, 0x0f, 0x53, 0x61, 0x76, 0x65, 0x48, 0x6f, 0x74, 0x53, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x1a, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, + 0x53, 0x61, 0x76, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x53, 0x61, 0x76, 0x65, + 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x3a, 0x01, 0x2a, 0x22, 0x1b, 0x2f, 0x76, 0x31, + 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x73, 0x61, 0x76, 0x65, 0x68, 0x6f, 0x74, + 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x6c, 0x0a, 0x0c, 0x4c, 0x6f, 0x61, 0x64, + 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x1a, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, + 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x61, + 0x64, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x23, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1d, 0x3a, 0x01, 0x2a, 0x22, 0x18, 0x2f, 0x76, + 0x31, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x6e, + 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x74, 0x0a, 0x0e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x1c, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, + 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x52, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x25, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1f, 0x3a, 0x01, 0x2a, + 0x22, 0x1a, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x72, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x7c, 0x0a, 0x10, + 0x47, 0x65, 0x74, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, + 0x12, 0x1e, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x6e, 0x61, 0x70, + 0x73, 0x68, 0x6f, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1f, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x6e, 0x61, 0x70, + 0x73, 0x68, 0x6f, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x27, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x21, 0x3a, 0x01, 0x2a, 0x22, 0x1c, 0x2f, 0x76, + 0x31, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x67, 0x65, 0x74, 0x73, 0x6e, 0x61, + 0x70, 0x73, 0x68, 0x6f, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x22, 0x5a, 0x20, 0x67, 0x69, + 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6c, 0x75, 0x78, 0x66, 0x69, 0x2f, 0x6e, + 0x65, 0x74, 0x72, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x3b, 0x72, 0x70, 0x63, 0x70, 0x62, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} var ( file_rpcpb_rpc_proto_rawDescOnce sync.Once - file_rpcpb_rpc_proto_rawDescData []byte + file_rpcpb_rpc_proto_rawDescData = file_rpcpb_rpc_proto_rawDesc ) func file_rpcpb_rpc_proto_rawDescGZIP() []byte { file_rpcpb_rpc_proto_rawDescOnce.Do(func() { - file_rpcpb_rpc_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_rpcpb_rpc_proto_rawDesc), len(file_rpcpb_rpc_proto_rawDesc))) + file_rpcpb_rpc_proto_rawDescData = protoimpl.X.CompressGZIP(file_rpcpb_rpc_proto_rawDescData) }) return file_rpcpb_rpc_proto_rawDescData } -var file_rpcpb_rpc_proto_msgTypes = make([]protoimpl.MessageInfo, 79) +var file_rpcpb_rpc_proto_msgTypes = make([]protoimpl.MessageInfo, 81) var file_rpcpb_rpc_proto_goTypes = []any{ (*PingRequest)(nil), // 0: rpcpb.PingRequest (*PingResponse)(nil), // 1: rpcpb.PingResponse @@ -3873,68 +4690,70 @@ var file_rpcpb_rpc_proto_goTypes = []any{ (*CreateChainsResponse)(nil), // 27: rpcpb.CreateChainsResponse (*HealthRequest)(nil), // 28: rpcpb.HealthRequest (*HealthResponse)(nil), // 29: rpcpb.HealthResponse - (*URIsRequest)(nil), // 30: rpcpb.URIsRequest - (*URIsResponse)(nil), // 31: rpcpb.URIsResponse - (*WaitForHealthyRequest)(nil), // 32: rpcpb.WaitForHealthyRequest - (*WaitForHealthyResponse)(nil), // 33: rpcpb.WaitForHealthyResponse - (*StatusRequest)(nil), // 34: rpcpb.StatusRequest - (*StatusResponse)(nil), // 35: rpcpb.StatusResponse - (*StreamStatusRequest)(nil), // 36: rpcpb.StreamStatusRequest - (*StreamStatusResponse)(nil), // 37: rpcpb.StreamStatusResponse - (*RestartNodeRequest)(nil), // 38: rpcpb.RestartNodeRequest - (*RestartNodeResponse)(nil), // 39: rpcpb.RestartNodeResponse - (*RemoveNodeRequest)(nil), // 40: rpcpb.RemoveNodeRequest - (*RemoveNodeResponse)(nil), // 41: rpcpb.RemoveNodeResponse - (*PauseNodeRequest)(nil), // 42: rpcpb.PauseNodeRequest - (*PauseNodeResponse)(nil), // 43: rpcpb.PauseNodeResponse - (*ResumeNodeRequest)(nil), // 44: rpcpb.ResumeNodeRequest - (*ResumeNodeResponse)(nil), // 45: rpcpb.ResumeNodeResponse - (*AddNodeRequest)(nil), // 46: rpcpb.AddNodeRequest - (*AddNodeResponse)(nil), // 47: rpcpb.AddNodeResponse - (*StopRequest)(nil), // 48: rpcpb.StopRequest - (*StopResponse)(nil), // 49: rpcpb.StopResponse - (*AttachPeerRequest)(nil), // 50: rpcpb.AttachPeerRequest - (*AttachPeerResponse)(nil), // 51: rpcpb.AttachPeerResponse - (*SendOutboundMessageRequest)(nil), // 52: rpcpb.SendOutboundMessageRequest - (*SendOutboundMessageResponse)(nil), // 53: rpcpb.SendOutboundMessageResponse - (*SaveSnapshotRequest)(nil), // 54: rpcpb.SaveSnapshotRequest - (*SaveSnapshotResponse)(nil), // 55: rpcpb.SaveSnapshotResponse - (*LoadSnapshotRequest)(nil), // 56: rpcpb.LoadSnapshotRequest - (*LoadSnapshotResponse)(nil), // 57: rpcpb.LoadSnapshotResponse - (*RemoveSnapshotRequest)(nil), // 58: rpcpb.RemoveSnapshotRequest - (*RemoveSnapshotResponse)(nil), // 59: rpcpb.RemoveSnapshotResponse - (*GetSnapshotNamesRequest)(nil), // 60: rpcpb.GetSnapshotNamesRequest - (*GetSnapshotNamesResponse)(nil), // 61: rpcpb.GetSnapshotNamesResponse - nil, // 62: rpcpb.ClusterInfo.NodeInfosEntry - nil, // 63: rpcpb.ClusterInfo.AttachedPeerInfosEntry - nil, // 64: rpcpb.ClusterInfo.CustomChainsEntry - nil, // 65: rpcpb.ClusterInfo.ChainsEntry - nil, // 66: rpcpb.StartRequest.CustomNodeConfigsEntry - nil, // 67: rpcpb.StartRequest.ChainConfigsEntry - nil, // 68: rpcpb.StartRequest.UpgradeConfigsEntry - nil, // 69: rpcpb.StartRequest.ChainConfigFilesEntry - nil, // 70: rpcpb.RestartNodeRequest.ChainConfigsEntry - nil, // 71: rpcpb.RestartNodeRequest.UpgradeConfigsEntry - nil, // 72: rpcpb.RestartNodeRequest.ChainConfigFilesEntry - nil, // 73: rpcpb.AddNodeRequest.ChainConfigsEntry - nil, // 74: rpcpb.AddNodeRequest.UpgradeConfigsEntry - nil, // 75: rpcpb.AddNodeRequest.ChainConfigFilesEntry - nil, // 76: rpcpb.LoadSnapshotRequest.ChainConfigsEntry - nil, // 77: rpcpb.LoadSnapshotRequest.UpgradeConfigsEntry - nil, // 78: rpcpb.LoadSnapshotRequest.ChainConfigFilesEntry + (*NetworkHealth)(nil), // 30: rpcpb.NetworkHealth + (*URIsRequest)(nil), // 31: rpcpb.URIsRequest + (*URIsResponse)(nil), // 32: rpcpb.URIsResponse + (*WaitForHealthyRequest)(nil), // 33: rpcpb.WaitForHealthyRequest + (*WaitForHealthyResponse)(nil), // 34: rpcpb.WaitForHealthyResponse + (*StatusRequest)(nil), // 35: rpcpb.StatusRequest + (*StatusResponse)(nil), // 36: rpcpb.StatusResponse + (*NetworkStatus)(nil), // 37: rpcpb.NetworkStatus + (*StreamStatusRequest)(nil), // 38: rpcpb.StreamStatusRequest + (*StreamStatusResponse)(nil), // 39: rpcpb.StreamStatusResponse + (*RestartNodeRequest)(nil), // 40: rpcpb.RestartNodeRequest + (*RestartNodeResponse)(nil), // 41: rpcpb.RestartNodeResponse + (*RemoveNodeRequest)(nil), // 42: rpcpb.RemoveNodeRequest + (*RemoveNodeResponse)(nil), // 43: rpcpb.RemoveNodeResponse + (*PauseNodeRequest)(nil), // 44: rpcpb.PauseNodeRequest + (*PauseNodeResponse)(nil), // 45: rpcpb.PauseNodeResponse + (*ResumeNodeRequest)(nil), // 46: rpcpb.ResumeNodeRequest + (*ResumeNodeResponse)(nil), // 47: rpcpb.ResumeNodeResponse + (*AddNodeRequest)(nil), // 48: rpcpb.AddNodeRequest + (*AddNodeResponse)(nil), // 49: rpcpb.AddNodeResponse + (*StopRequest)(nil), // 50: rpcpb.StopRequest + (*StopResponse)(nil), // 51: rpcpb.StopResponse + (*AttachPeerRequest)(nil), // 52: rpcpb.AttachPeerRequest + (*AttachPeerResponse)(nil), // 53: rpcpb.AttachPeerResponse + (*SendOutboundMessageRequest)(nil), // 54: rpcpb.SendOutboundMessageRequest + (*SendOutboundMessageResponse)(nil), // 55: rpcpb.SendOutboundMessageResponse + (*SaveSnapshotRequest)(nil), // 56: rpcpb.SaveSnapshotRequest + (*SaveSnapshotResponse)(nil), // 57: rpcpb.SaveSnapshotResponse + (*LoadSnapshotRequest)(nil), // 58: rpcpb.LoadSnapshotRequest + (*LoadSnapshotResponse)(nil), // 59: rpcpb.LoadSnapshotResponse + (*RemoveSnapshotRequest)(nil), // 60: rpcpb.RemoveSnapshotRequest + (*RemoveSnapshotResponse)(nil), // 61: rpcpb.RemoveSnapshotResponse + (*GetSnapshotNamesRequest)(nil), // 62: rpcpb.GetSnapshotNamesRequest + (*GetSnapshotNamesResponse)(nil), // 63: rpcpb.GetSnapshotNamesResponse + nil, // 64: rpcpb.ClusterInfo.NodeInfosEntry + nil, // 65: rpcpb.ClusterInfo.AttachedPeerInfosEntry + nil, // 66: rpcpb.ClusterInfo.CustomChainsEntry + nil, // 67: rpcpb.ClusterInfo.ChainsEntry + nil, // 68: rpcpb.StartRequest.CustomNodeConfigsEntry + nil, // 69: rpcpb.StartRequest.ChainConfigsEntry + nil, // 70: rpcpb.StartRequest.UpgradeConfigsEntry + nil, // 71: rpcpb.StartRequest.ChainConfigFilesEntry + nil, // 72: rpcpb.RestartNodeRequest.ChainConfigsEntry + nil, // 73: rpcpb.RestartNodeRequest.UpgradeConfigsEntry + nil, // 74: rpcpb.RestartNodeRequest.ChainConfigFilesEntry + nil, // 75: rpcpb.AddNodeRequest.ChainConfigsEntry + nil, // 76: rpcpb.AddNodeRequest.UpgradeConfigsEntry + nil, // 77: rpcpb.AddNodeRequest.ChainConfigFilesEntry + nil, // 78: rpcpb.LoadSnapshotRequest.ChainConfigsEntry + nil, // 79: rpcpb.LoadSnapshotRequest.UpgradeConfigsEntry + nil, // 80: rpcpb.LoadSnapshotRequest.ChainConfigFilesEntry } var file_rpcpb_rpc_proto_depIdxs = []int32{ - 62, // 0: rpcpb.ClusterInfo.node_infos:type_name -> rpcpb.ClusterInfo.NodeInfosEntry - 63, // 1: rpcpb.ClusterInfo.attached_peer_infos:type_name -> rpcpb.ClusterInfo.AttachedPeerInfosEntry - 64, // 2: rpcpb.ClusterInfo.custom_chains:type_name -> rpcpb.ClusterInfo.CustomChainsEntry - 65, // 3: rpcpb.ClusterInfo.chains:type_name -> rpcpb.ClusterInfo.ChainsEntry + 64, // 0: rpcpb.ClusterInfo.node_infos:type_name -> rpcpb.ClusterInfo.NodeInfosEntry + 65, // 1: rpcpb.ClusterInfo.attached_peer_infos:type_name -> rpcpb.ClusterInfo.AttachedPeerInfosEntry + 66, // 2: rpcpb.ClusterInfo.custom_chains:type_name -> rpcpb.ClusterInfo.CustomChainsEntry + 67, // 3: rpcpb.ClusterInfo.chains:type_name -> rpcpb.ClusterInfo.ChainsEntry 2, // 4: rpcpb.ChainInfo.chain_participants:type_name -> rpcpb.ChainParticipants 7, // 5: rpcpb.ListOfAttachedPeerInfo.peers:type_name -> rpcpb.AttachedPeerInfo 23, // 6: rpcpb.StartRequest.blockchain_specs:type_name -> rpcpb.BlockchainSpec - 66, // 7: rpcpb.StartRequest.custom_node_configs:type_name -> rpcpb.StartRequest.CustomNodeConfigsEntry - 67, // 8: rpcpb.StartRequest.chain_configs:type_name -> rpcpb.StartRequest.ChainConfigsEntry - 68, // 9: rpcpb.StartRequest.upgrade_configs:type_name -> rpcpb.StartRequest.UpgradeConfigsEntry - 69, // 10: rpcpb.StartRequest.chain_config_files:type_name -> rpcpb.StartRequest.ChainConfigFilesEntry + 68, // 7: rpcpb.StartRequest.custom_node_configs:type_name -> rpcpb.StartRequest.CustomNodeConfigsEntry + 69, // 8: rpcpb.StartRequest.chain_configs:type_name -> rpcpb.StartRequest.ChainConfigsEntry + 70, // 9: rpcpb.StartRequest.upgrade_configs:type_name -> rpcpb.StartRequest.UpgradeConfigsEntry + 71, // 10: rpcpb.StartRequest.chain_config_files:type_name -> rpcpb.StartRequest.ChainConfigFilesEntry 3, // 11: rpcpb.StartResponse.cluster_info:type_name -> rpcpb.ClusterInfo 14, // 12: rpcpb.TransformElasticChainsRequest.elastic_chain_spec:type_name -> rpcpb.ElasticChainSpec 3, // 13: rpcpb.TransformElasticChainsResponse.cluster_info:type_name -> rpcpb.ClusterInfo @@ -3948,88 +4767,92 @@ var file_rpcpb_rpc_proto_depIdxs = []int32{ 13, // 21: rpcpb.CreateChainsRequest.chain_specs:type_name -> rpcpb.ChainSpec 3, // 22: rpcpb.CreateChainsResponse.cluster_info:type_name -> rpcpb.ClusterInfo 3, // 23: rpcpb.HealthResponse.cluster_info:type_name -> rpcpb.ClusterInfo - 3, // 24: rpcpb.WaitForHealthyResponse.cluster_info:type_name -> rpcpb.ClusterInfo - 3, // 25: rpcpb.StatusResponse.cluster_info:type_name -> rpcpb.ClusterInfo - 3, // 26: rpcpb.StreamStatusResponse.cluster_info:type_name -> rpcpb.ClusterInfo - 70, // 27: rpcpb.RestartNodeRequest.chain_configs:type_name -> rpcpb.RestartNodeRequest.ChainConfigsEntry - 71, // 28: rpcpb.RestartNodeRequest.upgrade_configs:type_name -> rpcpb.RestartNodeRequest.UpgradeConfigsEntry - 72, // 29: rpcpb.RestartNodeRequest.chain_config_files:type_name -> rpcpb.RestartNodeRequest.ChainConfigFilesEntry - 3, // 30: rpcpb.RestartNodeResponse.cluster_info:type_name -> rpcpb.ClusterInfo - 3, // 31: rpcpb.RemoveNodeResponse.cluster_info:type_name -> rpcpb.ClusterInfo - 3, // 32: rpcpb.PauseNodeResponse.cluster_info:type_name -> rpcpb.ClusterInfo - 3, // 33: rpcpb.ResumeNodeResponse.cluster_info:type_name -> rpcpb.ClusterInfo - 73, // 34: rpcpb.AddNodeRequest.chain_configs:type_name -> rpcpb.AddNodeRequest.ChainConfigsEntry - 74, // 35: rpcpb.AddNodeRequest.upgrade_configs:type_name -> rpcpb.AddNodeRequest.UpgradeConfigsEntry - 75, // 36: rpcpb.AddNodeRequest.chain_config_files:type_name -> rpcpb.AddNodeRequest.ChainConfigFilesEntry - 3, // 37: rpcpb.AddNodeResponse.cluster_info:type_name -> rpcpb.ClusterInfo - 3, // 38: rpcpb.StopResponse.cluster_info:type_name -> rpcpb.ClusterInfo - 3, // 39: rpcpb.AttachPeerResponse.cluster_info:type_name -> rpcpb.ClusterInfo - 7, // 40: rpcpb.AttachPeerResponse.attached_peer_info:type_name -> rpcpb.AttachedPeerInfo - 76, // 41: rpcpb.LoadSnapshotRequest.chain_configs:type_name -> rpcpb.LoadSnapshotRequest.ChainConfigsEntry - 77, // 42: rpcpb.LoadSnapshotRequest.upgrade_configs:type_name -> rpcpb.LoadSnapshotRequest.UpgradeConfigsEntry - 78, // 43: rpcpb.LoadSnapshotRequest.chain_config_files:type_name -> rpcpb.LoadSnapshotRequest.ChainConfigFilesEntry - 3, // 44: rpcpb.LoadSnapshotResponse.cluster_info:type_name -> rpcpb.ClusterInfo - 6, // 45: rpcpb.ClusterInfo.NodeInfosEntry.value:type_name -> rpcpb.NodeInfo - 8, // 46: rpcpb.ClusterInfo.AttachedPeerInfosEntry.value:type_name -> rpcpb.ListOfAttachedPeerInfo - 5, // 47: rpcpb.ClusterInfo.CustomChainsEntry.value:type_name -> rpcpb.CustomChainInfo - 4, // 48: rpcpb.ClusterInfo.ChainsEntry.value:type_name -> rpcpb.ChainInfo - 0, // 49: rpcpb.PingService.Ping:input_type -> rpcpb.PingRequest - 10, // 50: rpcpb.ControlService.RPCVersion:input_type -> rpcpb.RPCVersionRequest - 9, // 51: rpcpb.ControlService.Start:input_type -> rpcpb.StartRequest - 24, // 52: rpcpb.ControlService.CreateBlockchains:input_type -> rpcpb.CreateBlockchainsRequest - 15, // 53: rpcpb.ControlService.TransformElasticChains:input_type -> rpcpb.TransformElasticChainsRequest - 18, // 54: rpcpb.ControlService.AddPermissionlessValidator:input_type -> rpcpb.AddPermissionlessValidatorRequest - 21, // 55: rpcpb.ControlService.RemoveChainValidator:input_type -> rpcpb.RemoveChainValidatorRequest - 26, // 56: rpcpb.ControlService.CreateChains:input_type -> rpcpb.CreateChainsRequest - 28, // 57: rpcpb.ControlService.Health:input_type -> rpcpb.HealthRequest - 30, // 58: rpcpb.ControlService.URIs:input_type -> rpcpb.URIsRequest - 32, // 59: rpcpb.ControlService.WaitForHealthy:input_type -> rpcpb.WaitForHealthyRequest - 34, // 60: rpcpb.ControlService.Status:input_type -> rpcpb.StatusRequest - 36, // 61: rpcpb.ControlService.StreamStatus:input_type -> rpcpb.StreamStatusRequest - 40, // 62: rpcpb.ControlService.RemoveNode:input_type -> rpcpb.RemoveNodeRequest - 46, // 63: rpcpb.ControlService.AddNode:input_type -> rpcpb.AddNodeRequest - 38, // 64: rpcpb.ControlService.RestartNode:input_type -> rpcpb.RestartNodeRequest - 42, // 65: rpcpb.ControlService.PauseNode:input_type -> rpcpb.PauseNodeRequest - 44, // 66: rpcpb.ControlService.ResumeNode:input_type -> rpcpb.ResumeNodeRequest - 48, // 67: rpcpb.ControlService.Stop:input_type -> rpcpb.StopRequest - 50, // 68: rpcpb.ControlService.AttachPeer:input_type -> rpcpb.AttachPeerRequest - 52, // 69: rpcpb.ControlService.SendOutboundMessage:input_type -> rpcpb.SendOutboundMessageRequest - 54, // 70: rpcpb.ControlService.SaveSnapshot:input_type -> rpcpb.SaveSnapshotRequest - 54, // 71: rpcpb.ControlService.SaveHotSnapshot:input_type -> rpcpb.SaveSnapshotRequest - 56, // 72: rpcpb.ControlService.LoadSnapshot:input_type -> rpcpb.LoadSnapshotRequest - 58, // 73: rpcpb.ControlService.RemoveSnapshot:input_type -> rpcpb.RemoveSnapshotRequest - 60, // 74: rpcpb.ControlService.GetSnapshotNames:input_type -> rpcpb.GetSnapshotNamesRequest - 1, // 75: rpcpb.PingService.Ping:output_type -> rpcpb.PingResponse - 11, // 76: rpcpb.ControlService.RPCVersion:output_type -> rpcpb.RPCVersionResponse - 12, // 77: rpcpb.ControlService.Start:output_type -> rpcpb.StartResponse - 25, // 78: rpcpb.ControlService.CreateBlockchains:output_type -> rpcpb.CreateBlockchainsResponse - 16, // 79: rpcpb.ControlService.TransformElasticChains:output_type -> rpcpb.TransformElasticChainsResponse - 19, // 80: rpcpb.ControlService.AddPermissionlessValidator:output_type -> rpcpb.AddPermissionlessValidatorResponse - 22, // 81: rpcpb.ControlService.RemoveChainValidator:output_type -> rpcpb.RemoveChainValidatorResponse - 27, // 82: rpcpb.ControlService.CreateChains:output_type -> rpcpb.CreateChainsResponse - 29, // 83: rpcpb.ControlService.Health:output_type -> rpcpb.HealthResponse - 31, // 84: rpcpb.ControlService.URIs:output_type -> rpcpb.URIsResponse - 33, // 85: rpcpb.ControlService.WaitForHealthy:output_type -> rpcpb.WaitForHealthyResponse - 35, // 86: rpcpb.ControlService.Status:output_type -> rpcpb.StatusResponse - 37, // 87: rpcpb.ControlService.StreamStatus:output_type -> rpcpb.StreamStatusResponse - 41, // 88: rpcpb.ControlService.RemoveNode:output_type -> rpcpb.RemoveNodeResponse - 47, // 89: rpcpb.ControlService.AddNode:output_type -> rpcpb.AddNodeResponse - 39, // 90: rpcpb.ControlService.RestartNode:output_type -> rpcpb.RestartNodeResponse - 43, // 91: rpcpb.ControlService.PauseNode:output_type -> rpcpb.PauseNodeResponse - 45, // 92: rpcpb.ControlService.ResumeNode:output_type -> rpcpb.ResumeNodeResponse - 49, // 93: rpcpb.ControlService.Stop:output_type -> rpcpb.StopResponse - 51, // 94: rpcpb.ControlService.AttachPeer:output_type -> rpcpb.AttachPeerResponse - 53, // 95: rpcpb.ControlService.SendOutboundMessage:output_type -> rpcpb.SendOutboundMessageResponse - 55, // 96: rpcpb.ControlService.SaveSnapshot:output_type -> rpcpb.SaveSnapshotResponse - 55, // 97: rpcpb.ControlService.SaveHotSnapshot:output_type -> rpcpb.SaveSnapshotResponse - 57, // 98: rpcpb.ControlService.LoadSnapshot:output_type -> rpcpb.LoadSnapshotResponse - 59, // 99: rpcpb.ControlService.RemoveSnapshot:output_type -> rpcpb.RemoveSnapshotResponse - 61, // 100: rpcpb.ControlService.GetSnapshotNames:output_type -> rpcpb.GetSnapshotNamesResponse - 75, // [75:101] is the sub-list for method output_type - 49, // [49:75] is the sub-list for method input_type - 49, // [49:49] is the sub-list for extension type_name - 49, // [49:49] is the sub-list for extension extendee - 0, // [0:49] is the sub-list for field type_name + 30, // 24: rpcpb.HealthResponse.network_health:type_name -> rpcpb.NetworkHealth + 3, // 25: rpcpb.WaitForHealthyResponse.cluster_info:type_name -> rpcpb.ClusterInfo + 3, // 26: rpcpb.StatusResponse.cluster_info:type_name -> rpcpb.ClusterInfo + 37, // 27: rpcpb.StatusResponse.network_status:type_name -> rpcpb.NetworkStatus + 6, // 28: rpcpb.NetworkStatus.nodes:type_name -> rpcpb.NodeInfo + 4, // 29: rpcpb.NetworkStatus.chains:type_name -> rpcpb.ChainInfo + 3, // 30: rpcpb.StreamStatusResponse.cluster_info:type_name -> rpcpb.ClusterInfo + 72, // 31: rpcpb.RestartNodeRequest.chain_configs:type_name -> rpcpb.RestartNodeRequest.ChainConfigsEntry + 73, // 32: rpcpb.RestartNodeRequest.upgrade_configs:type_name -> rpcpb.RestartNodeRequest.UpgradeConfigsEntry + 74, // 33: rpcpb.RestartNodeRequest.chain_config_files:type_name -> rpcpb.RestartNodeRequest.ChainConfigFilesEntry + 3, // 34: rpcpb.RestartNodeResponse.cluster_info:type_name -> rpcpb.ClusterInfo + 3, // 35: rpcpb.RemoveNodeResponse.cluster_info:type_name -> rpcpb.ClusterInfo + 3, // 36: rpcpb.PauseNodeResponse.cluster_info:type_name -> rpcpb.ClusterInfo + 3, // 37: rpcpb.ResumeNodeResponse.cluster_info:type_name -> rpcpb.ClusterInfo + 75, // 38: rpcpb.AddNodeRequest.chain_configs:type_name -> rpcpb.AddNodeRequest.ChainConfigsEntry + 76, // 39: rpcpb.AddNodeRequest.upgrade_configs:type_name -> rpcpb.AddNodeRequest.UpgradeConfigsEntry + 77, // 40: rpcpb.AddNodeRequest.chain_config_files:type_name -> rpcpb.AddNodeRequest.ChainConfigFilesEntry + 3, // 41: rpcpb.AddNodeResponse.cluster_info:type_name -> rpcpb.ClusterInfo + 3, // 42: rpcpb.StopResponse.cluster_info:type_name -> rpcpb.ClusterInfo + 3, // 43: rpcpb.AttachPeerResponse.cluster_info:type_name -> rpcpb.ClusterInfo + 7, // 44: rpcpb.AttachPeerResponse.attached_peer_info:type_name -> rpcpb.AttachedPeerInfo + 78, // 45: rpcpb.LoadSnapshotRequest.chain_configs:type_name -> rpcpb.LoadSnapshotRequest.ChainConfigsEntry + 79, // 46: rpcpb.LoadSnapshotRequest.upgrade_configs:type_name -> rpcpb.LoadSnapshotRequest.UpgradeConfigsEntry + 80, // 47: rpcpb.LoadSnapshotRequest.chain_config_files:type_name -> rpcpb.LoadSnapshotRequest.ChainConfigFilesEntry + 3, // 48: rpcpb.LoadSnapshotResponse.cluster_info:type_name -> rpcpb.ClusterInfo + 6, // 49: rpcpb.ClusterInfo.NodeInfosEntry.value:type_name -> rpcpb.NodeInfo + 8, // 50: rpcpb.ClusterInfo.AttachedPeerInfosEntry.value:type_name -> rpcpb.ListOfAttachedPeerInfo + 5, // 51: rpcpb.ClusterInfo.CustomChainsEntry.value:type_name -> rpcpb.CustomChainInfo + 4, // 52: rpcpb.ClusterInfo.ChainsEntry.value:type_name -> rpcpb.ChainInfo + 0, // 53: rpcpb.PingService.Ping:input_type -> rpcpb.PingRequest + 10, // 54: rpcpb.ControlService.RPCVersion:input_type -> rpcpb.RPCVersionRequest + 9, // 55: rpcpb.ControlService.Start:input_type -> rpcpb.StartRequest + 24, // 56: rpcpb.ControlService.CreateBlockchains:input_type -> rpcpb.CreateBlockchainsRequest + 15, // 57: rpcpb.ControlService.TransformElasticChains:input_type -> rpcpb.TransformElasticChainsRequest + 18, // 58: rpcpb.ControlService.AddPermissionlessValidator:input_type -> rpcpb.AddPermissionlessValidatorRequest + 21, // 59: rpcpb.ControlService.RemoveChainValidator:input_type -> rpcpb.RemoveChainValidatorRequest + 26, // 60: rpcpb.ControlService.CreateChains:input_type -> rpcpb.CreateChainsRequest + 28, // 61: rpcpb.ControlService.Health:input_type -> rpcpb.HealthRequest + 31, // 62: rpcpb.ControlService.URIs:input_type -> rpcpb.URIsRequest + 33, // 63: rpcpb.ControlService.WaitForHealthy:input_type -> rpcpb.WaitForHealthyRequest + 35, // 64: rpcpb.ControlService.Status:input_type -> rpcpb.StatusRequest + 38, // 65: rpcpb.ControlService.StreamStatus:input_type -> rpcpb.StreamStatusRequest + 42, // 66: rpcpb.ControlService.RemoveNode:input_type -> rpcpb.RemoveNodeRequest + 48, // 67: rpcpb.ControlService.AddNode:input_type -> rpcpb.AddNodeRequest + 40, // 68: rpcpb.ControlService.RestartNode:input_type -> rpcpb.RestartNodeRequest + 44, // 69: rpcpb.ControlService.PauseNode:input_type -> rpcpb.PauseNodeRequest + 46, // 70: rpcpb.ControlService.ResumeNode:input_type -> rpcpb.ResumeNodeRequest + 50, // 71: rpcpb.ControlService.Stop:input_type -> rpcpb.StopRequest + 52, // 72: rpcpb.ControlService.AttachPeer:input_type -> rpcpb.AttachPeerRequest + 54, // 73: rpcpb.ControlService.SendOutboundMessage:input_type -> rpcpb.SendOutboundMessageRequest + 56, // 74: rpcpb.ControlService.SaveSnapshot:input_type -> rpcpb.SaveSnapshotRequest + 56, // 75: rpcpb.ControlService.SaveHotSnapshot:input_type -> rpcpb.SaveSnapshotRequest + 58, // 76: rpcpb.ControlService.LoadSnapshot:input_type -> rpcpb.LoadSnapshotRequest + 60, // 77: rpcpb.ControlService.RemoveSnapshot:input_type -> rpcpb.RemoveSnapshotRequest + 62, // 78: rpcpb.ControlService.GetSnapshotNames:input_type -> rpcpb.GetSnapshotNamesRequest + 1, // 79: rpcpb.PingService.Ping:output_type -> rpcpb.PingResponse + 11, // 80: rpcpb.ControlService.RPCVersion:output_type -> rpcpb.RPCVersionResponse + 12, // 81: rpcpb.ControlService.Start:output_type -> rpcpb.StartResponse + 25, // 82: rpcpb.ControlService.CreateBlockchains:output_type -> rpcpb.CreateBlockchainsResponse + 16, // 83: rpcpb.ControlService.TransformElasticChains:output_type -> rpcpb.TransformElasticChainsResponse + 19, // 84: rpcpb.ControlService.AddPermissionlessValidator:output_type -> rpcpb.AddPermissionlessValidatorResponse + 22, // 85: rpcpb.ControlService.RemoveChainValidator:output_type -> rpcpb.RemoveChainValidatorResponse + 27, // 86: rpcpb.ControlService.CreateChains:output_type -> rpcpb.CreateChainsResponse + 29, // 87: rpcpb.ControlService.Health:output_type -> rpcpb.HealthResponse + 32, // 88: rpcpb.ControlService.URIs:output_type -> rpcpb.URIsResponse + 34, // 89: rpcpb.ControlService.WaitForHealthy:output_type -> rpcpb.WaitForHealthyResponse + 36, // 90: rpcpb.ControlService.Status:output_type -> rpcpb.StatusResponse + 39, // 91: rpcpb.ControlService.StreamStatus:output_type -> rpcpb.StreamStatusResponse + 43, // 92: rpcpb.ControlService.RemoveNode:output_type -> rpcpb.RemoveNodeResponse + 49, // 93: rpcpb.ControlService.AddNode:output_type -> rpcpb.AddNodeResponse + 41, // 94: rpcpb.ControlService.RestartNode:output_type -> rpcpb.RestartNodeResponse + 45, // 95: rpcpb.ControlService.PauseNode:output_type -> rpcpb.PauseNodeResponse + 47, // 96: rpcpb.ControlService.ResumeNode:output_type -> rpcpb.ResumeNodeResponse + 51, // 97: rpcpb.ControlService.Stop:output_type -> rpcpb.StopResponse + 53, // 98: rpcpb.ControlService.AttachPeer:output_type -> rpcpb.AttachPeerResponse + 55, // 99: rpcpb.ControlService.SendOutboundMessage:output_type -> rpcpb.SendOutboundMessageResponse + 57, // 100: rpcpb.ControlService.SaveSnapshot:output_type -> rpcpb.SaveSnapshotResponse + 57, // 101: rpcpb.ControlService.SaveHotSnapshot:output_type -> rpcpb.SaveSnapshotResponse + 59, // 102: rpcpb.ControlService.LoadSnapshot:output_type -> rpcpb.LoadSnapshotResponse + 61, // 103: rpcpb.ControlService.RemoveSnapshot:output_type -> rpcpb.RemoveSnapshotResponse + 63, // 104: rpcpb.ControlService.GetSnapshotNames:output_type -> rpcpb.GetSnapshotNamesResponse + 79, // [79:105] is the sub-list for method output_type + 53, // [53:79] is the sub-list for method input_type + 53, // [53:53] is the sub-list for extension type_name + 53, // [53:53] is the sub-list for extension extendee + 0, // [0:53] is the sub-list for field type_name } func init() { file_rpcpb_rpc_proto_init() } @@ -4039,16 +4862,21 @@ func file_rpcpb_rpc_proto_init() { } file_rpcpb_rpc_proto_msgTypes[9].OneofWrappers = []any{} file_rpcpb_rpc_proto_msgTypes[23].OneofWrappers = []any{} - file_rpcpb_rpc_proto_msgTypes[38].OneofWrappers = []any{} - file_rpcpb_rpc_proto_msgTypes[46].OneofWrappers = []any{} - file_rpcpb_rpc_proto_msgTypes[56].OneofWrappers = []any{} + file_rpcpb_rpc_proto_msgTypes[28].OneofWrappers = []any{} + file_rpcpb_rpc_proto_msgTypes[29].OneofWrappers = []any{} + file_rpcpb_rpc_proto_msgTypes[33].OneofWrappers = []any{} + file_rpcpb_rpc_proto_msgTypes[35].OneofWrappers = []any{} + file_rpcpb_rpc_proto_msgTypes[36].OneofWrappers = []any{} + file_rpcpb_rpc_proto_msgTypes[40].OneofWrappers = []any{} + file_rpcpb_rpc_proto_msgTypes[48].OneofWrappers = []any{} + file_rpcpb_rpc_proto_msgTypes[58].OneofWrappers = []any{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: unsafe.Slice(unsafe.StringData(file_rpcpb_rpc_proto_rawDesc), len(file_rpcpb_rpc_proto_rawDesc)), + RawDescriptor: file_rpcpb_rpc_proto_rawDesc, NumEnums: 0, - NumMessages: 79, + NumMessages: 81, NumExtensions: 0, NumServices: 2, }, @@ -4057,6 +4885,7 @@ func file_rpcpb_rpc_proto_init() { MessageInfos: file_rpcpb_rpc_proto_msgTypes, }.Build() File_rpcpb_rpc_proto = out.File + file_rpcpb_rpc_proto_rawDesc = nil file_rpcpb_rpc_proto_goTypes = nil file_rpcpb_rpc_proto_depIdxs = nil } diff --git a/rpcpb/rpc.proto b/rpcpb/rpc.proto index 068b9acc..08659037 100644 --- a/rpcpb/rpc.proto +++ b/rpcpb/rpc.proto @@ -272,15 +272,24 @@ message ListOfAttachedPeerInfo { } message StartRequest { - string exec_path = 1; - optional uint32 num_nodes = 2; - optional string whitelisted_chains = 3; - optional string global_node_config = 4; + // Network identifier - name or ID + // Supported values: "mainnet" (1), "testnet" (2), "devnet" (3), "custom" (1337) + // or any custom network name + string network_name = 1; + + // Node consensus engine type + // Supported values: "luxd", "avalanchego", "geth", "op-node", "custom" + string node_type = 2; + + string exec_path = 4; + optional uint32 num_nodes = 5; + optional string whitelisted_chains = 6; + optional string global_node_config = 7; // Used for both database and log files. - optional string root_data_dir = 5; + optional string root_data_dir = 8; // Plugin dir from which to load all custom VM executables. - string plugin_dir = 6; + string plugin_dir = 9; // The list of: // - custom chain's VM name @@ -299,30 +308,30 @@ message StartRequest { // If this field is set to none (by default), the node/network-runner // does not install the custom chain and does not create the chain, // even if the VM binary exists on the local plugins directory. - repeated BlockchainSpec blockchain_specs = 7; + repeated BlockchainSpec blockchain_specs = 10; - map custom_node_configs = 8; + map custom_node_configs = 11; // Map of chain name to config file contents. // If specified, will create a file "chainname/config.json" with // the contents provided here. - map chain_configs = 9; + map chain_configs = 12; // Map of chain name to upgrade file contents. // If specified, will create a file "chainname/upgrade.json" with // the contents provided here. - map upgrade_configs = 10; + map upgrade_configs = 13; // reassign default/custom ports if they are already taken - optional bool reassign_ports_if_used = 11; + optional bool reassign_ports_if_used = 14; // use dynamic ports instead of default ones - optional bool dynamic_ports = 12; + optional bool dynamic_ports = 15; // Map of chain id to chain config file contents. // If specified, will create a file "chainid.json" under chains config dir with // the contents provided here. - map chain_config_files = 13; + map chain_config_files = 16; } message RPCVersionRequest {} @@ -451,10 +460,24 @@ message CreateChainsResponse { repeated string chain_ids = 2; } -message HealthRequest {} +message HealthRequest { + // Network name to check health for + // If empty, checks overall server health + optional string network_name = 1; +} message HealthResponse { ClusterInfo cluster_info = 1; + // Network-specific health information + optional NetworkHealth network_health = 2; +} + +message NetworkHealth { + string network_name = 1; + uint32 network_id = 2; + bool healthy = 3; + repeated string healthy_nodes = 4; + repeated string unhealthy_nodes = 5; } message URIsRequest {} @@ -463,16 +486,35 @@ message URIsResponse { repeated string uris = 1; } -message WaitForHealthyRequest {} +message WaitForHealthyRequest { + // Network name to wait for + // If empty, waits for any network to be healthy + optional string network_name = 1; +} message WaitForHealthyResponse { ClusterInfo cluster_info = 1; } -message StatusRequest {} +message StatusRequest { + // Network name to get status for + // If empty, returns overall server status + optional string network_name = 1; +} message StatusResponse { ClusterInfo cluster_info = 1; + // Network-specific status information + optional NetworkStatus network_status = 2; +} + +message NetworkStatus { + string network_name = 1; + uint32 network_id = 2; + string status = 3; // "running", "stopped", "starting", "error" + uint32 num_nodes = 4; + repeated rpcpb.NodeInfo nodes = 5; + repeated rpcpb.ChainInfo chains = 6; } message StreamStatusRequest { @@ -593,7 +635,8 @@ message SendOutboundMessageResponse { } message SaveSnapshotRequest { - string snapshot_name = 1; + string network_name = 1; + string snapshot_name = 2; } message SaveSnapshotResponse { @@ -601,15 +644,16 @@ message SaveSnapshotResponse { } message LoadSnapshotRequest { - string snapshot_name = 1; - optional string exec_path = 2; - string plugin_dir = 3; - optional string root_data_dir = 4; - map chain_configs = 5; - map upgrade_configs = 6; - optional string global_node_config = 7; - optional bool reassign_ports_if_used = 8; - map chain_config_files = 9; + string network_name = 1; + string snapshot_name = 2; + optional string exec_path = 3; + string plugin_dir = 4; + optional string root_data_dir = 5; + map chain_configs = 6; + map upgrade_configs = 7; + optional string global_node_config = 8; + optional bool reassign_ports_if_used = 9; + map chain_config_files = 10; } message LoadSnapshotResponse { @@ -617,13 +661,15 @@ message LoadSnapshotResponse { } message RemoveSnapshotRequest { - string snapshot_name = 1; + string network_name = 1; + string snapshot_name = 2; } message RemoveSnapshotResponse { } message GetSnapshotNamesRequest { + string network_name = 1; } message GetSnapshotNamesResponse { diff --git a/rpcpb/rpc_grpc.pb.go b/rpcpb/rpc_grpc.pb.go index 0f713f5c..f9ad55ef 100644 --- a/rpcpb/rpc_grpc.pb.go +++ b/rpcpb/rpc_grpc.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: -// - protoc-gen-go-grpc v1.6.0 +// - protoc-gen-go-grpc v1.3.0 // - protoc (unknown) // source: rpcpb/rpc.proto @@ -8,7 +8,6 @@ package rpcpb import ( context "context" - grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" @@ -16,8 +15,8 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. -// Requires gRPC-Go v1.64.0 or later. -const _ = grpc.SupportPackageIsVersion9 +// Requires gRPC-Go v1.32.0 or later. +const _ = grpc.SupportPackageIsVersion7 const ( PingService_Ping_FullMethodName = "/rpcpb.PingService/Ping" @@ -39,9 +38,8 @@ func NewPingServiceClient(cc grpc.ClientConnInterface) PingServiceClient { } func (c *pingServiceClient) Ping(ctx context.Context, in *PingRequest, opts ...grpc.CallOption) (*PingResponse, error) { - cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(PingResponse) - err := c.cc.Invoke(ctx, PingService_Ping_FullMethodName, in, out, cOpts...) + err := c.cc.Invoke(ctx, PingService_Ping_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -50,24 +48,20 @@ func (c *pingServiceClient) Ping(ctx context.Context, in *PingRequest, opts ...g // PingServiceServer is the server API for PingService service. // All implementations must embed UnimplementedPingServiceServer -// for forward compatibility. +// for forward compatibility type PingServiceServer interface { Ping(context.Context, *PingRequest) (*PingResponse, error) mustEmbedUnimplementedPingServiceServer() } -// UnimplementedPingServiceServer must be embedded to have -// forward compatible implementations. -// -// NOTE: this should be embedded by value instead of pointer to avoid a nil -// pointer dereference when methods are called. -type UnimplementedPingServiceServer struct{} +// UnimplementedPingServiceServer must be embedded to have forward compatible implementations. +type UnimplementedPingServiceServer struct { +} func (UnimplementedPingServiceServer) Ping(context.Context, *PingRequest) (*PingResponse, error) { - return nil, status.Error(codes.Unimplemented, "method Ping not implemented") + return nil, status.Errorf(codes.Unimplemented, "method Ping not implemented") } func (UnimplementedPingServiceServer) mustEmbedUnimplementedPingServiceServer() {} -func (UnimplementedPingServiceServer) testEmbeddedByValue() {} // UnsafePingServiceServer may be embedded to opt out of forward compatibility for this service. // Use of this interface is not recommended, as added methods to PingServiceServer will @@ -77,13 +71,6 @@ type UnsafePingServiceServer interface { } func RegisterPingServiceServer(s grpc.ServiceRegistrar, srv PingServiceServer) { - // If the following call panics, it indicates UnimplementedPingServiceServer was - // embedded by pointer and is nil. This will cause panics if an - // unimplemented method is ever invoked, so we test this at initialization - // time to prevent it from happening at runtime later due to I/O. - if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { - t.testEmbeddedByValue() - } s.RegisterService(&PingService_ServiceDesc, srv) } @@ -164,7 +151,7 @@ type ControlServiceClient interface { URIs(ctx context.Context, in *URIsRequest, opts ...grpc.CallOption) (*URIsResponse, error) WaitForHealthy(ctx context.Context, in *WaitForHealthyRequest, opts ...grpc.CallOption) (*WaitForHealthyResponse, error) Status(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (*StatusResponse, error) - StreamStatus(ctx context.Context, in *StreamStatusRequest, opts ...grpc.CallOption) (grpc.ServerStreamingClient[StreamStatusResponse], error) + StreamStatus(ctx context.Context, in *StreamStatusRequest, opts ...grpc.CallOption) (ControlService_StreamStatusClient, error) RemoveNode(ctx context.Context, in *RemoveNodeRequest, opts ...grpc.CallOption) (*RemoveNodeResponse, error) AddNode(ctx context.Context, in *AddNodeRequest, opts ...grpc.CallOption) (*AddNodeResponse, error) RestartNode(ctx context.Context, in *RestartNodeRequest, opts ...grpc.CallOption) (*RestartNodeResponse, error) @@ -191,9 +178,8 @@ func NewControlServiceClient(cc grpc.ClientConnInterface) ControlServiceClient { } func (c *controlServiceClient) RPCVersion(ctx context.Context, in *RPCVersionRequest, opts ...grpc.CallOption) (*RPCVersionResponse, error) { - cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(RPCVersionResponse) - err := c.cc.Invoke(ctx, ControlService_RPCVersion_FullMethodName, in, out, cOpts...) + err := c.cc.Invoke(ctx, ControlService_RPCVersion_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -201,9 +187,8 @@ func (c *controlServiceClient) RPCVersion(ctx context.Context, in *RPCVersionReq } func (c *controlServiceClient) Start(ctx context.Context, in *StartRequest, opts ...grpc.CallOption) (*StartResponse, error) { - cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(StartResponse) - err := c.cc.Invoke(ctx, ControlService_Start_FullMethodName, in, out, cOpts...) + err := c.cc.Invoke(ctx, ControlService_Start_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -211,9 +196,8 @@ func (c *controlServiceClient) Start(ctx context.Context, in *StartRequest, opts } func (c *controlServiceClient) CreateBlockchains(ctx context.Context, in *CreateBlockchainsRequest, opts ...grpc.CallOption) (*CreateBlockchainsResponse, error) { - cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(CreateBlockchainsResponse) - err := c.cc.Invoke(ctx, ControlService_CreateBlockchains_FullMethodName, in, out, cOpts...) + err := c.cc.Invoke(ctx, ControlService_CreateBlockchains_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -221,9 +205,8 @@ func (c *controlServiceClient) CreateBlockchains(ctx context.Context, in *Create } func (c *controlServiceClient) TransformElasticChains(ctx context.Context, in *TransformElasticChainsRequest, opts ...grpc.CallOption) (*TransformElasticChainsResponse, error) { - cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(TransformElasticChainsResponse) - err := c.cc.Invoke(ctx, ControlService_TransformElasticChains_FullMethodName, in, out, cOpts...) + err := c.cc.Invoke(ctx, ControlService_TransformElasticChains_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -231,9 +214,8 @@ func (c *controlServiceClient) TransformElasticChains(ctx context.Context, in *T } func (c *controlServiceClient) AddPermissionlessValidator(ctx context.Context, in *AddPermissionlessValidatorRequest, opts ...grpc.CallOption) (*AddPermissionlessValidatorResponse, error) { - cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(AddPermissionlessValidatorResponse) - err := c.cc.Invoke(ctx, ControlService_AddPermissionlessValidator_FullMethodName, in, out, cOpts...) + err := c.cc.Invoke(ctx, ControlService_AddPermissionlessValidator_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -241,9 +223,8 @@ func (c *controlServiceClient) AddPermissionlessValidator(ctx context.Context, i } func (c *controlServiceClient) RemoveChainValidator(ctx context.Context, in *RemoveChainValidatorRequest, opts ...grpc.CallOption) (*RemoveChainValidatorResponse, error) { - cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(RemoveChainValidatorResponse) - err := c.cc.Invoke(ctx, ControlService_RemoveChainValidator_FullMethodName, in, out, cOpts...) + err := c.cc.Invoke(ctx, ControlService_RemoveChainValidator_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -251,9 +232,8 @@ func (c *controlServiceClient) RemoveChainValidator(ctx context.Context, in *Rem } func (c *controlServiceClient) CreateChains(ctx context.Context, in *CreateChainsRequest, opts ...grpc.CallOption) (*CreateChainsResponse, error) { - cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(CreateChainsResponse) - err := c.cc.Invoke(ctx, ControlService_CreateChains_FullMethodName, in, out, cOpts...) + err := c.cc.Invoke(ctx, ControlService_CreateChains_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -261,9 +241,8 @@ func (c *controlServiceClient) CreateChains(ctx context.Context, in *CreateChain } func (c *controlServiceClient) Health(ctx context.Context, in *HealthRequest, opts ...grpc.CallOption) (*HealthResponse, error) { - cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(HealthResponse) - err := c.cc.Invoke(ctx, ControlService_Health_FullMethodName, in, out, cOpts...) + err := c.cc.Invoke(ctx, ControlService_Health_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -271,9 +250,8 @@ func (c *controlServiceClient) Health(ctx context.Context, in *HealthRequest, op } func (c *controlServiceClient) URIs(ctx context.Context, in *URIsRequest, opts ...grpc.CallOption) (*URIsResponse, error) { - cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(URIsResponse) - err := c.cc.Invoke(ctx, ControlService_URIs_FullMethodName, in, out, cOpts...) + err := c.cc.Invoke(ctx, ControlService_URIs_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -281,9 +259,8 @@ func (c *controlServiceClient) URIs(ctx context.Context, in *URIsRequest, opts . } func (c *controlServiceClient) WaitForHealthy(ctx context.Context, in *WaitForHealthyRequest, opts ...grpc.CallOption) (*WaitForHealthyResponse, error) { - cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(WaitForHealthyResponse) - err := c.cc.Invoke(ctx, ControlService_WaitForHealthy_FullMethodName, in, out, cOpts...) + err := c.cc.Invoke(ctx, ControlService_WaitForHealthy_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -291,22 +268,20 @@ func (c *controlServiceClient) WaitForHealthy(ctx context.Context, in *WaitForHe } func (c *controlServiceClient) Status(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (*StatusResponse, error) { - cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(StatusResponse) - err := c.cc.Invoke(ctx, ControlService_Status_FullMethodName, in, out, cOpts...) + err := c.cc.Invoke(ctx, ControlService_Status_FullMethodName, in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *controlServiceClient) StreamStatus(ctx context.Context, in *StreamStatusRequest, opts ...grpc.CallOption) (grpc.ServerStreamingClient[StreamStatusResponse], error) { - cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) - stream, err := c.cc.NewStream(ctx, &ControlService_ServiceDesc.Streams[0], ControlService_StreamStatus_FullMethodName, cOpts...) +func (c *controlServiceClient) StreamStatus(ctx context.Context, in *StreamStatusRequest, opts ...grpc.CallOption) (ControlService_StreamStatusClient, error) { + stream, err := c.cc.NewStream(ctx, &ControlService_ServiceDesc.Streams[0], ControlService_StreamStatus_FullMethodName, opts...) if err != nil { return nil, err } - x := &grpc.GenericClientStream[StreamStatusRequest, StreamStatusResponse]{ClientStream: stream} + x := &controlServiceStreamStatusClient{stream} if err := x.ClientStream.SendMsg(in); err != nil { return nil, err } @@ -316,13 +291,26 @@ func (c *controlServiceClient) StreamStatus(ctx context.Context, in *StreamStatu return x, nil } -// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. -type ControlService_StreamStatusClient = grpc.ServerStreamingClient[StreamStatusResponse] +type ControlService_StreamStatusClient interface { + Recv() (*StreamStatusResponse, error) + grpc.ClientStream +} + +type controlServiceStreamStatusClient struct { + grpc.ClientStream +} + +func (x *controlServiceStreamStatusClient) Recv() (*StreamStatusResponse, error) { + m := new(StreamStatusResponse) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} func (c *controlServiceClient) RemoveNode(ctx context.Context, in *RemoveNodeRequest, opts ...grpc.CallOption) (*RemoveNodeResponse, error) { - cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(RemoveNodeResponse) - err := c.cc.Invoke(ctx, ControlService_RemoveNode_FullMethodName, in, out, cOpts...) + err := c.cc.Invoke(ctx, ControlService_RemoveNode_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -330,9 +318,8 @@ func (c *controlServiceClient) RemoveNode(ctx context.Context, in *RemoveNodeReq } func (c *controlServiceClient) AddNode(ctx context.Context, in *AddNodeRequest, opts ...grpc.CallOption) (*AddNodeResponse, error) { - cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(AddNodeResponse) - err := c.cc.Invoke(ctx, ControlService_AddNode_FullMethodName, in, out, cOpts...) + err := c.cc.Invoke(ctx, ControlService_AddNode_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -340,9 +327,8 @@ func (c *controlServiceClient) AddNode(ctx context.Context, in *AddNodeRequest, } func (c *controlServiceClient) RestartNode(ctx context.Context, in *RestartNodeRequest, opts ...grpc.CallOption) (*RestartNodeResponse, error) { - cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(RestartNodeResponse) - err := c.cc.Invoke(ctx, ControlService_RestartNode_FullMethodName, in, out, cOpts...) + err := c.cc.Invoke(ctx, ControlService_RestartNode_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -350,9 +336,8 @@ func (c *controlServiceClient) RestartNode(ctx context.Context, in *RestartNodeR } func (c *controlServiceClient) PauseNode(ctx context.Context, in *PauseNodeRequest, opts ...grpc.CallOption) (*PauseNodeResponse, error) { - cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(PauseNodeResponse) - err := c.cc.Invoke(ctx, ControlService_PauseNode_FullMethodName, in, out, cOpts...) + err := c.cc.Invoke(ctx, ControlService_PauseNode_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -360,9 +345,8 @@ func (c *controlServiceClient) PauseNode(ctx context.Context, in *PauseNodeReque } func (c *controlServiceClient) ResumeNode(ctx context.Context, in *ResumeNodeRequest, opts ...grpc.CallOption) (*ResumeNodeResponse, error) { - cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(ResumeNodeResponse) - err := c.cc.Invoke(ctx, ControlService_ResumeNode_FullMethodName, in, out, cOpts...) + err := c.cc.Invoke(ctx, ControlService_ResumeNode_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -370,9 +354,8 @@ func (c *controlServiceClient) ResumeNode(ctx context.Context, in *ResumeNodeReq } func (c *controlServiceClient) Stop(ctx context.Context, in *StopRequest, opts ...grpc.CallOption) (*StopResponse, error) { - cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(StopResponse) - err := c.cc.Invoke(ctx, ControlService_Stop_FullMethodName, in, out, cOpts...) + err := c.cc.Invoke(ctx, ControlService_Stop_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -380,9 +363,8 @@ func (c *controlServiceClient) Stop(ctx context.Context, in *StopRequest, opts . } func (c *controlServiceClient) AttachPeer(ctx context.Context, in *AttachPeerRequest, opts ...grpc.CallOption) (*AttachPeerResponse, error) { - cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(AttachPeerResponse) - err := c.cc.Invoke(ctx, ControlService_AttachPeer_FullMethodName, in, out, cOpts...) + err := c.cc.Invoke(ctx, ControlService_AttachPeer_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -390,9 +372,8 @@ func (c *controlServiceClient) AttachPeer(ctx context.Context, in *AttachPeerReq } func (c *controlServiceClient) SendOutboundMessage(ctx context.Context, in *SendOutboundMessageRequest, opts ...grpc.CallOption) (*SendOutboundMessageResponse, error) { - cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(SendOutboundMessageResponse) - err := c.cc.Invoke(ctx, ControlService_SendOutboundMessage_FullMethodName, in, out, cOpts...) + err := c.cc.Invoke(ctx, ControlService_SendOutboundMessage_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -400,9 +381,8 @@ func (c *controlServiceClient) SendOutboundMessage(ctx context.Context, in *Send } func (c *controlServiceClient) SaveSnapshot(ctx context.Context, in *SaveSnapshotRequest, opts ...grpc.CallOption) (*SaveSnapshotResponse, error) { - cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(SaveSnapshotResponse) - err := c.cc.Invoke(ctx, ControlService_SaveSnapshot_FullMethodName, in, out, cOpts...) + err := c.cc.Invoke(ctx, ControlService_SaveSnapshot_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -410,9 +390,8 @@ func (c *controlServiceClient) SaveSnapshot(ctx context.Context, in *SaveSnapsho } func (c *controlServiceClient) SaveHotSnapshot(ctx context.Context, in *SaveSnapshotRequest, opts ...grpc.CallOption) (*SaveSnapshotResponse, error) { - cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(SaveSnapshotResponse) - err := c.cc.Invoke(ctx, ControlService_SaveHotSnapshot_FullMethodName, in, out, cOpts...) + err := c.cc.Invoke(ctx, ControlService_SaveHotSnapshot_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -420,9 +399,8 @@ func (c *controlServiceClient) SaveHotSnapshot(ctx context.Context, in *SaveSnap } func (c *controlServiceClient) LoadSnapshot(ctx context.Context, in *LoadSnapshotRequest, opts ...grpc.CallOption) (*LoadSnapshotResponse, error) { - cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(LoadSnapshotResponse) - err := c.cc.Invoke(ctx, ControlService_LoadSnapshot_FullMethodName, in, out, cOpts...) + err := c.cc.Invoke(ctx, ControlService_LoadSnapshot_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -430,9 +408,8 @@ func (c *controlServiceClient) LoadSnapshot(ctx context.Context, in *LoadSnapsho } func (c *controlServiceClient) RemoveSnapshot(ctx context.Context, in *RemoveSnapshotRequest, opts ...grpc.CallOption) (*RemoveSnapshotResponse, error) { - cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(RemoveSnapshotResponse) - err := c.cc.Invoke(ctx, ControlService_RemoveSnapshot_FullMethodName, in, out, cOpts...) + err := c.cc.Invoke(ctx, ControlService_RemoveSnapshot_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -440,9 +417,8 @@ func (c *controlServiceClient) RemoveSnapshot(ctx context.Context, in *RemoveSna } func (c *controlServiceClient) GetSnapshotNames(ctx context.Context, in *GetSnapshotNamesRequest, opts ...grpc.CallOption) (*GetSnapshotNamesResponse, error) { - cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(GetSnapshotNamesResponse) - err := c.cc.Invoke(ctx, ControlService_GetSnapshotNames_FullMethodName, in, out, cOpts...) + err := c.cc.Invoke(ctx, ControlService_GetSnapshotNames_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -451,7 +427,7 @@ func (c *controlServiceClient) GetSnapshotNames(ctx context.Context, in *GetSnap // ControlServiceServer is the server API for ControlService service. // All implementations must embed UnimplementedControlServiceServer -// for forward compatibility. +// for forward compatibility type ControlServiceServer interface { RPCVersion(context.Context, *RPCVersionRequest) (*RPCVersionResponse, error) Start(context.Context, *StartRequest) (*StartResponse, error) @@ -464,7 +440,7 @@ type ControlServiceServer interface { URIs(context.Context, *URIsRequest) (*URIsResponse, error) WaitForHealthy(context.Context, *WaitForHealthyRequest) (*WaitForHealthyResponse, error) Status(context.Context, *StatusRequest) (*StatusResponse, error) - StreamStatus(*StreamStatusRequest, grpc.ServerStreamingServer[StreamStatusResponse]) error + StreamStatus(*StreamStatusRequest, ControlService_StreamStatusServer) error RemoveNode(context.Context, *RemoveNodeRequest) (*RemoveNodeResponse, error) AddNode(context.Context, *AddNodeRequest) (*AddNodeResponse, error) RestartNode(context.Context, *RestartNodeRequest) (*RestartNodeResponse, error) @@ -483,90 +459,86 @@ type ControlServiceServer interface { mustEmbedUnimplementedControlServiceServer() } -// UnimplementedControlServiceServer must be embedded to have -// forward compatible implementations. -// -// NOTE: this should be embedded by value instead of pointer to avoid a nil -// pointer dereference when methods are called. -type UnimplementedControlServiceServer struct{} +// UnimplementedControlServiceServer must be embedded to have forward compatible implementations. +type UnimplementedControlServiceServer struct { +} func (UnimplementedControlServiceServer) RPCVersion(context.Context, *RPCVersionRequest) (*RPCVersionResponse, error) { - return nil, status.Error(codes.Unimplemented, "method RPCVersion not implemented") + return nil, status.Errorf(codes.Unimplemented, "method RPCVersion not implemented") } func (UnimplementedControlServiceServer) Start(context.Context, *StartRequest) (*StartResponse, error) { - return nil, status.Error(codes.Unimplemented, "method Start not implemented") + return nil, status.Errorf(codes.Unimplemented, "method Start not implemented") } func (UnimplementedControlServiceServer) CreateBlockchains(context.Context, *CreateBlockchainsRequest) (*CreateBlockchainsResponse, error) { - return nil, status.Error(codes.Unimplemented, "method CreateBlockchains not implemented") + return nil, status.Errorf(codes.Unimplemented, "method CreateBlockchains not implemented") } func (UnimplementedControlServiceServer) TransformElasticChains(context.Context, *TransformElasticChainsRequest) (*TransformElasticChainsResponse, error) { - return nil, status.Error(codes.Unimplemented, "method TransformElasticChains not implemented") + return nil, status.Errorf(codes.Unimplemented, "method TransformElasticChains not implemented") } func (UnimplementedControlServiceServer) AddPermissionlessValidator(context.Context, *AddPermissionlessValidatorRequest) (*AddPermissionlessValidatorResponse, error) { - return nil, status.Error(codes.Unimplemented, "method AddPermissionlessValidator not implemented") + return nil, status.Errorf(codes.Unimplemented, "method AddPermissionlessValidator not implemented") } func (UnimplementedControlServiceServer) RemoveChainValidator(context.Context, *RemoveChainValidatorRequest) (*RemoveChainValidatorResponse, error) { - return nil, status.Error(codes.Unimplemented, "method RemoveChainValidator not implemented") + return nil, status.Errorf(codes.Unimplemented, "method RemoveChainValidator not implemented") } func (UnimplementedControlServiceServer) CreateChains(context.Context, *CreateChainsRequest) (*CreateChainsResponse, error) { - return nil, status.Error(codes.Unimplemented, "method CreateChains not implemented") + return nil, status.Errorf(codes.Unimplemented, "method CreateChains not implemented") } func (UnimplementedControlServiceServer) Health(context.Context, *HealthRequest) (*HealthResponse, error) { - return nil, status.Error(codes.Unimplemented, "method Health not implemented") + return nil, status.Errorf(codes.Unimplemented, "method Health not implemented") } func (UnimplementedControlServiceServer) URIs(context.Context, *URIsRequest) (*URIsResponse, error) { - return nil, status.Error(codes.Unimplemented, "method URIs not implemented") + return nil, status.Errorf(codes.Unimplemented, "method URIs not implemented") } func (UnimplementedControlServiceServer) WaitForHealthy(context.Context, *WaitForHealthyRequest) (*WaitForHealthyResponse, error) { - return nil, status.Error(codes.Unimplemented, "method WaitForHealthy not implemented") + return nil, status.Errorf(codes.Unimplemented, "method WaitForHealthy not implemented") } func (UnimplementedControlServiceServer) Status(context.Context, *StatusRequest) (*StatusResponse, error) { - return nil, status.Error(codes.Unimplemented, "method Status not implemented") + return nil, status.Errorf(codes.Unimplemented, "method Status not implemented") } -func (UnimplementedControlServiceServer) StreamStatus(*StreamStatusRequest, grpc.ServerStreamingServer[StreamStatusResponse]) error { - return status.Error(codes.Unimplemented, "method StreamStatus not implemented") +func (UnimplementedControlServiceServer) StreamStatus(*StreamStatusRequest, ControlService_StreamStatusServer) error { + return status.Errorf(codes.Unimplemented, "method StreamStatus not implemented") } func (UnimplementedControlServiceServer) RemoveNode(context.Context, *RemoveNodeRequest) (*RemoveNodeResponse, error) { - return nil, status.Error(codes.Unimplemented, "method RemoveNode not implemented") + return nil, status.Errorf(codes.Unimplemented, "method RemoveNode not implemented") } func (UnimplementedControlServiceServer) AddNode(context.Context, *AddNodeRequest) (*AddNodeResponse, error) { - return nil, status.Error(codes.Unimplemented, "method AddNode not implemented") + return nil, status.Errorf(codes.Unimplemented, "method AddNode not implemented") } func (UnimplementedControlServiceServer) RestartNode(context.Context, *RestartNodeRequest) (*RestartNodeResponse, error) { - return nil, status.Error(codes.Unimplemented, "method RestartNode not implemented") + return nil, status.Errorf(codes.Unimplemented, "method RestartNode not implemented") } func (UnimplementedControlServiceServer) PauseNode(context.Context, *PauseNodeRequest) (*PauseNodeResponse, error) { - return nil, status.Error(codes.Unimplemented, "method PauseNode not implemented") + return nil, status.Errorf(codes.Unimplemented, "method PauseNode not implemented") } func (UnimplementedControlServiceServer) ResumeNode(context.Context, *ResumeNodeRequest) (*ResumeNodeResponse, error) { - return nil, status.Error(codes.Unimplemented, "method ResumeNode not implemented") + return nil, status.Errorf(codes.Unimplemented, "method ResumeNode not implemented") } func (UnimplementedControlServiceServer) Stop(context.Context, *StopRequest) (*StopResponse, error) { - return nil, status.Error(codes.Unimplemented, "method Stop not implemented") + return nil, status.Errorf(codes.Unimplemented, "method Stop not implemented") } func (UnimplementedControlServiceServer) AttachPeer(context.Context, *AttachPeerRequest) (*AttachPeerResponse, error) { - return nil, status.Error(codes.Unimplemented, "method AttachPeer not implemented") + return nil, status.Errorf(codes.Unimplemented, "method AttachPeer not implemented") } func (UnimplementedControlServiceServer) SendOutboundMessage(context.Context, *SendOutboundMessageRequest) (*SendOutboundMessageResponse, error) { - return nil, status.Error(codes.Unimplemented, "method SendOutboundMessage not implemented") + return nil, status.Errorf(codes.Unimplemented, "method SendOutboundMessage not implemented") } func (UnimplementedControlServiceServer) SaveSnapshot(context.Context, *SaveSnapshotRequest) (*SaveSnapshotResponse, error) { - return nil, status.Error(codes.Unimplemented, "method SaveSnapshot not implemented") + return nil, status.Errorf(codes.Unimplemented, "method SaveSnapshot not implemented") } func (UnimplementedControlServiceServer) SaveHotSnapshot(context.Context, *SaveSnapshotRequest) (*SaveSnapshotResponse, error) { - return nil, status.Error(codes.Unimplemented, "method SaveHotSnapshot not implemented") + return nil, status.Errorf(codes.Unimplemented, "method SaveHotSnapshot not implemented") } func (UnimplementedControlServiceServer) LoadSnapshot(context.Context, *LoadSnapshotRequest) (*LoadSnapshotResponse, error) { - return nil, status.Error(codes.Unimplemented, "method LoadSnapshot not implemented") + return nil, status.Errorf(codes.Unimplemented, "method LoadSnapshot not implemented") } func (UnimplementedControlServiceServer) RemoveSnapshot(context.Context, *RemoveSnapshotRequest) (*RemoveSnapshotResponse, error) { - return nil, status.Error(codes.Unimplemented, "method RemoveSnapshot not implemented") + return nil, status.Errorf(codes.Unimplemented, "method RemoveSnapshot not implemented") } func (UnimplementedControlServiceServer) GetSnapshotNames(context.Context, *GetSnapshotNamesRequest) (*GetSnapshotNamesResponse, error) { - return nil, status.Error(codes.Unimplemented, "method GetSnapshotNames not implemented") + return nil, status.Errorf(codes.Unimplemented, "method GetSnapshotNames not implemented") } func (UnimplementedControlServiceServer) mustEmbedUnimplementedControlServiceServer() {} -func (UnimplementedControlServiceServer) testEmbeddedByValue() {} // UnsafeControlServiceServer may be embedded to opt out of forward compatibility for this service. // Use of this interface is not recommended, as added methods to ControlServiceServer will @@ -576,13 +548,6 @@ type UnsafeControlServiceServer interface { } func RegisterControlServiceServer(s grpc.ServiceRegistrar, srv ControlServiceServer) { - // If the following call panics, it indicates UnimplementedControlServiceServer was - // embedded by pointer and is nil. This will cause panics if an - // unimplemented method is ever invoked, so we test this at initialization - // time to prevent it from happening at runtime later due to I/O. - if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { - t.testEmbeddedByValue() - } s.RegisterService(&ControlService_ServiceDesc, srv) } @@ -789,11 +754,21 @@ func _ControlService_StreamStatus_Handler(srv interface{}, stream grpc.ServerStr if err := stream.RecvMsg(m); err != nil { return err } - return srv.(ControlServiceServer).StreamStatus(m, &grpc.GenericServerStream[StreamStatusRequest, StreamStatusResponse]{ServerStream: stream}) + return srv.(ControlServiceServer).StreamStatus(m, &controlServiceStreamStatusServer{stream}) } -// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. -type ControlService_StreamStatusServer = grpc.ServerStreamingServer[StreamStatusResponse] +type ControlService_StreamStatusServer interface { + Send(*StreamStatusResponse) error + grpc.ServerStream +} + +type controlServiceStreamStatusServer struct { + grpc.ServerStream +} + +func (x *controlServiceStreamStatusServer) Send(m *StreamStatusResponse) error { + return x.ServerStream.SendMsg(m) +} func _ControlService_RemoveNode_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(RemoveNodeRequest) diff --git a/scripts/tests.e2e.sh b/scripts/tests.e2e.sh index c886cfc1..60f62c22 100755 --- a/scripts/tests.e2e.sh +++ b/scripts/tests.e2e.sh @@ -47,13 +47,13 @@ if [ ! -f /tmp/node-v${VERSION_1}/node ] then ############################ # download node - # https://github.com/luxfi/node/releases + # https://github.com/luxfi/sdk/node/releases GOARCH=$(go env GOARCH) GOOS=$(go env GOOS) - DOWNLOAD_URL=https://github.com/luxfi/node/releases/download/v${VERSION_1}/node-linux-${GOARCH}-v${VERSION_1}.tar.gz + DOWNLOAD_URL=https://github.com/luxfi/sdk/node/releases/download/v${VERSION_1}/node-linux-${GOARCH}-v${VERSION_1}.tar.gz DOWNLOAD_PATH=/tmp/node.tar.gz if [[ ${GOOS} == "darwin" ]]; then - DOWNLOAD_URL=https://github.com/luxfi/node/releases/download/v${VERSION_1}/node-macos-v${VERSION_1}.zip + DOWNLOAD_URL=https://github.com/luxfi/sdk/node/releases/download/v${VERSION_1}/node-macos-v${VERSION_1}.zip DOWNLOAD_PATH=/tmp/node.zip fi @@ -78,13 +78,13 @@ if [ ! -f /tmp/node-v${VERSION_2}/node ] then ############################ # download node - # https://github.com/luxfi/node/releases + # https://github.com/luxfi/sdk/node/releases GOARCH=$(go env GOARCH) GOOS=$(go env GOOS) - DOWNLOAD_URL=https://github.com/luxfi/node/releases/download/v${VERSION_2}/node-linux-${GOARCH}-v${VERSION_2}.tar.gz + DOWNLOAD_URL=https://github.com/luxfi/sdk/node/releases/download/v${VERSION_2}/node-linux-${GOARCH}-v${VERSION_2}.tar.gz DOWNLOAD_PATH=/tmp/node.tar.gz if [[ ${GOOS} == "darwin" ]]; then - DOWNLOAD_URL=https://github.com/luxfi/node/releases/download/v${VERSION_2}/node-macos-v${VERSION_2}.zip + DOWNLOAD_URL=https://github.com/luxfi/sdk/node/releases/download/v${VERSION_2}/node-macos-v${VERSION_2}.zip DOWNLOAD_PATH=/tmp/node.zip fi diff --git a/server/network.go b/server/network.go index e247a209..1d8e0dbd 100644 --- a/server/network.go +++ b/server/network.go @@ -16,16 +16,16 @@ import ( "maps" "slices" + "github.com/luxfi/config" "github.com/luxfi/ids" "github.com/luxfi/netrunner/local" "github.com/luxfi/netrunner/network" "github.com/luxfi/netrunner/network/node" "github.com/luxfi/netrunner/rpcpb" - "github.com/luxfi/netrunner/utils/constants" + netconstants "github.com/luxfi/netrunner/utils/constants" "github.com/luxfi/netrunner/ux" - "github.com/luxfi/node/config" - luxd_constants "github.com/luxfi/const" + "github.com/luxfi/constantsants" "github.com/luxfi/log" ) @@ -93,6 +93,10 @@ type localNetworkOptions struct { redirectNodesOutput bool globalNodeConfig string + // Node consensus engine type + // Determines which binary to use and how to configure it + nodeType string // "luxd", "avalanchego", "geth", "op-node", etc. + pluginDir string customNodeConfigs map[string]string @@ -120,7 +124,7 @@ func newLocalNetwork(opts localNetworkOptions) (*localNetwork, error) { LogLevel: opts.logLevel, DisplayLevel: opts.logLevel, }) - logger, err := logFactory.Make(constants.LogNameMain) + logger, err := logFactory.Make(netconstants.LogNameMain) if err != nil { return nil, err } @@ -153,7 +157,7 @@ func (lc *localNetwork) createConfig() error { // If so, use the appropriate genesis configuration var cfg network.Config var err error - networkID := luxd_constants.CustomID // default to local (1337) + networkID := constants.CustomID // default to local (1337) if networkIDVal, ok := globalConfig["network-id"]; ok { switch v := networkIDVal.(type) { case float64: @@ -168,7 +172,7 @@ func (lc *localNetwork) createConfig() error { } } - lc.log.Info("createConfig networkID parsed", "networkID", networkID, "MainnetID", luxd_constants.MainnetID, "TestnetID", luxd_constants.TestnetID) + lc.log.Info("createConfig networkID parsed", "networkID", networkID, "MainnetID", constants.MainnetID, "TestnetID", constants.TestnetID) // CRITICAL: Check if we're resuming from existing state. // If node1/genesis.json exists AND node1/db has data, we MUST use the existing genesis @@ -193,7 +197,7 @@ func (lc *localNetwork) createConfig() error { useMnemonic := mnemonic != "" switch networkID { - case luxd_constants.MainnetID: // LUX Mainnet (1) + case constants.MainnetID: // LUX Mainnet (1) if useMnemonic { ux.Print(lc.log, "%s", log.Green.Wrap("Loading mainnet genesis FROM MNEMONIC (funds allocated to derived address)")) cfg, err = local.NewMainnetConfigFromMnemonic(lc.options.execPath, lc.options.numNodes) @@ -202,7 +206,7 @@ func (lc *localNetwork) createConfig() error { ux.Print(lc.log, "%s", log.Green.Wrap("Loading CANONICAL mainnet genesis (deterministic bytes)")) cfg, err = local.NewCanonicalMainnetConfig(lc.options.execPath, lc.options.numNodes) } - case luxd_constants.TestnetID: // LUX Testnet (2) + case constants.TestnetID: // LUX Testnet (2) if useMnemonic { ux.Print(lc.log, "%s", log.Green.Wrap("Loading testnet genesis FROM MNEMONIC (funds allocated to derived address)")) cfg, err = local.NewTestnetConfigFromMnemonic(lc.options.execPath, lc.options.numNodes) @@ -211,7 +215,7 @@ func (lc *localNetwork) createConfig() error { ux.Print(lc.log, "%s", log.Green.Wrap("Loading CANONICAL testnet genesis (deterministic bytes)")) cfg, err = local.NewCanonicalTestnetConfig(lc.options.execPath, lc.options.numNodes) } - case luxd_constants.DevnetID: // LUX Devnet (3) + case constants.DevnetID: // LUX Devnet (3) if useMnemonic { ux.Print(lc.log, "%s", log.Green.Wrap("Loading devnet genesis FROM MNEMONIC (funds allocated to derived address)")) cfg, err = local.NewDevnetConfigFromMnemonic(lc.options.execPath, lc.options.numNodes) @@ -219,7 +223,7 @@ func (lc *localNetwork) createConfig() error { ux.Print(lc.log, "%s", log.Green.Wrap("Loading CANONICAL devnet genesis (deterministic bytes)")) cfg, err = local.NewCanonicalDevnetConfig(lc.options.execPath, lc.options.numNodes) } - case luxd_constants.CustomID: // Custom/Local (1337) + case constants.CustomID: // Custom/Local (1337) if useMnemonic { ux.Print(lc.log, "%s", log.Green.Wrap("Loading custom genesis FROM MNEMONIC (funds allocated to derived address)")) cfg, err = local.NewLocalConfigFromMnemonic(lc.options.execPath, lc.options.numNodes) @@ -241,7 +245,7 @@ func (lc *localNetwork) createConfig() error { // since canonical genesis is already deterministic) if isResume && existingGenesis != "" { if cfg.Genesis != existingGenesis { - if networkID == luxd_constants.MainnetID || networkID == luxd_constants.TestnetID { + if networkID == constants.MainnetID || networkID == constants.TestnetID { // Log warning but use canonical - this shouldn't happen with proper setup ux.Print(lc.log, "%s", log.Orange.Wrap("WARNING: Existing genesis differs from canonical. Using canonical.")) fmt.Fprintf(os.Stderr, "WARNING: Genesis mismatch detected. Using canonical genesis.\n") @@ -724,7 +728,7 @@ func (lc *localNetwork) updateChainInfo(ctx context.Context) error { chainIDList := []string{} for _, chain := range chains { // Skip both PlatformChainID and PrimaryNetworkID (which is ids.Empty) - if chain.ID != luxd_constants.PlatformChainID && chain.ID != luxd_constants.PrimaryNetworkID { + if chain.ID != constants.PlatformChainID && chain.ID != constants.PrimaryNetworkID { chainIDList = append(chainIDList, chain.ID.String()) } } diff --git a/server/server.go b/server/server.go index dcf411d2..8f4f6181 100644 --- a/server/server.go +++ b/server/server.go @@ -31,9 +31,9 @@ import ( "github.com/luxfi/netrunner/rpcpb" "github.com/luxfi/netrunner/utils" "github.com/luxfi/netrunner/utils/constants" - "github.com/luxfi/node/config" - "github.com/luxfi/node/message" - "github.com/luxfi/node/network/peer" + "github.com/luxfi/config" + "github.com/luxfi/p2p/message" + "github.com/luxfi/p2p/peer" "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" "github.com/luxfi/log" @@ -188,11 +188,12 @@ type server struct { gwMux *runtime.ServeMux gwServer *http.Server - clusterInfo *rpcpb.ClusterInfo + // Multi-network support: map from network name to network instance + networks map[string]*localNetwork + clusterInfos map[string]*rpcpb.ClusterInfo // Controls running nodes. - // Invariant: If [network] is non-nil, then [clusterInfo] is non-nil. + // Invariant: If [networks] is non-nil, then [clusterInfos] is non-nil. - network *localNetwork asyncErrCh chan error rpcpb.UnimplementedPingServiceServer @@ -220,13 +221,15 @@ func New(cfg Config, logger log.Logger) (Server, error) { } s := &server{ - cfg: cfg, - logger: logger, - closed: make(chan struct{}), - ln: listener, - gRPCServer: grpc.NewServer(), - mu: new(sync.RWMutex), - asyncErrCh: make(chan error, 1), + cfg: cfg, + logger: logger, + closed: make(chan struct{}), + ln: listener, + gRPCServer: grpc.NewServer(), + mu: new(sync.RWMutex), + asyncErrCh: make(chan error, 1), + networks: make(map[string]*localNetwork), + clusterInfos: make(map[string]*rpcpb.ClusterInfo), } if !cfg.GwDisabled { s.gwMux = runtime.NewServeMux() @@ -318,14 +321,14 @@ func (s *server) Run(rootCtx context.Context) (err error) { <-gRPCErrChan // Wait for [s.gRPCServer.Serve] to return. } - // Grab lock to ensure [s.network] isn't being used. + // Grab lock to ensure [s.networks] isn't being used. s.mu.Lock() defer s.mu.Unlock() - if s.network != nil { + for name := range s.networks { // Close the network. - s.stopAndRemoveNetwork(nil) - s.logger.Warn("network stopped") + s.stopAndRemoveNetwork(name, nil) + s.logger.Warn("network stopped", log.String("network", name)) } s.rootCancel() @@ -347,8 +350,19 @@ func (s *server) Start(_ context.Context, req *rpcpb.StartRequest) (*rpcpb.Start s.mu.Lock() defer s.mu.Unlock() - // If [network] is already populated, the network has already been started. - if s.network != nil { + // Extract network name from request or use default + networkName := "mainnet" // Default for backward compatibility + // TODO: Use proper GetNetworkName() once proto is regenerated + // For now, we'll determine network type from other parameters + // In the future: networkName := req.GetNetworkName() + + // Extract node type from request + nodeType := "luxd" // Default to luxd for backward compatibility + // TODO: Use proper GetNodeType() once proto is regenerated + // In the future: nodeType := req.GetNodeType() + + // If this specific network is already running, return error + if s.networks[networkName] != nil { return nil, ErrAlreadyBootstrapped } @@ -390,7 +404,6 @@ func (s *server) Start(_ context.Context, req *rpcpb.StartRequest) (*rpcpb.Start ) // Determine base directory and network name for network-centric structure - var networkName string if len(rootDataDir) == 0 { // Default to ~/.lux for the base homeDir, _ := os.UserHomeDir() @@ -423,12 +436,19 @@ func (s *server) Start(_ context.Context, req *rpcpb.StartRequest) (*rpcpb.Start numNodes = uint32(len(customNodeConfigs)) } - s.clusterInfo = &rpcpb.ClusterInfo{ + if s.clusterInfos == nil { + s.clusterInfos = make(map[string]*rpcpb.ClusterInfo) + } + s.clusterInfos[networkName] = &rpcpb.ClusterInfo{ Pid: pid, RootDataDir: rootDataDir, } - s.network, err = newLocalNetwork(localNetworkOptions{ + if s.networks == nil { + s.networks = make(map[string]*localNetwork) + } + var nw *localNetwork + nw, err = newLocalNetwork(localNetworkOptions{ execPath: execPath, rootDataDir: rootDataDir, numNodes: numNodes, @@ -436,6 +456,7 @@ func (s *server) Start(_ context.Context, req *rpcpb.StartRequest) (*rpcpb.Start redirectNodesOutput: s.cfg.RedirectNodesOutput, pluginDir: pluginDir, globalNodeConfig: globalNodeConfig, + nodeType: nodeType, customNodeConfigs: customNodeConfigs, chainConfigs: req.ChainConfigs, upgradeConfigs: req.UpgradeConfigs, @@ -448,6 +469,7 @@ func (s *server) Start(_ context.Context, req *rpcpb.StartRequest) (*rpcpb.Start if err != nil { return nil, err } + s.networks[networkName] = nw s.logger.Info("starting", log.String("exec-path", execPath), @@ -462,29 +484,29 @@ func (s *server) Start(_ context.Context, req *rpcpb.StartRequest) (*rpcpb.Start ctx, cancel := context.WithTimeout(context.Background(), waitForHealthyTimeout) defer cancel() - if err := s.network.Start(ctx); err != nil { - s.logger.Warn("start failed to complete", log.Err(err)) - s.stopAndRemoveNetwork(nil) + if err := s.networks[networkName].Start(ctx); err != nil { + s.logger.Warn("start failed to complete", log.Err(err), log.String("network", networkName)) + s.stopAndRemoveNetwork(networkName, nil) return nil, err } ctx, cancel = context.WithTimeout(context.Background(), waitForHealthyTimeout) defer cancel() - chainIDs, err := s.network.CreateChains(ctx, chainSpecs) + chainIDs, err := s.networks[networkName].CreateChains(ctx, chainSpecs) if err != nil { - s.logger.Error("network never became healthy", log.Err(err)) - s.stopAndRemoveNetwork(err) + s.logger.Error("network never became healthy", log.Err(err), log.String("network", networkName)) + s.stopAndRemoveNetwork(networkName, err) return nil, err } - s.updateClusterInfo() - s.logger.Info("network healthy") + s.updateClusterInfo(networkName) + s.logger.Info("network healthy", log.String("network", networkName)) strChainIDs := []string{} for _, chainID := range chainIDs { strChainIDs = append(strChainIDs, chainID.String()) } - clusterInfo, err := deepCopy(s.clusterInfo) + clusterInfo, err := deepCopy(s.clusterInfos[networkName]) if err != nil { return nil, err } @@ -492,21 +514,22 @@ func (s *server) Start(_ context.Context, req *rpcpb.StartRequest) (*rpcpb.Start } // Asssumes [s.mu] is held. -func (s *server) updateClusterInfo() { - if s.network == nil { +func (s *server) updateClusterInfo(networkName string) { + if s.networks[networkName] == nil { // stop may have been called return } - s.clusterInfo.Healthy = true - s.clusterInfo.NodeNames = slices.Collect(maps.Keys(s.network.nodeInfos)) - sort.Strings(s.clusterInfo.NodeNames) - s.clusterInfo.NodeInfos = s.network.nodeInfos - s.clusterInfo.CustomChainsHealthy = true - s.clusterInfo.CustomChains = make(map[string]*rpcpb.CustomChainInfo) - for chainID, chainInfo := range s.network.customChainIDToInfo { - s.clusterInfo.CustomChains[chainID.String()] = chainInfo.info + clusterInfo := s.clusterInfos[networkName] + clusterInfo.Healthy = true + clusterInfo.NodeNames = slices.Collect(maps.Keys(s.networks[networkName].nodeInfos)) + sort.Strings(clusterInfo.NodeNames) + clusterInfo.NodeInfos = s.networks[networkName].nodeInfos + clusterInfo.CustomChainsHealthy = true + clusterInfo.CustomChains = make(map[string]*rpcpb.CustomChainInfo) + for chainID, chainInfo := range s.networks[networkName].customChainIDToInfo { + clusterInfo.CustomChains[chainID.String()] = chainInfo.info } - s.clusterInfo.Chains = s.network.chains + clusterInfo.Chains = s.networks[networkName].chains } // wait until some of this conditions is met: @@ -521,37 +544,60 @@ func (s *server) WaitForHealthy(ctx context.Context, _ *rpcpb.WaitForHealthyRequ for { s.mu.RLock() - if s.clusterInfo == nil { + if len(s.clusterInfos) == 0 { defer s.mu.RUnlock() return nil, ErrNotBootstrapped } - if s.clusterInfo.CustomChainsHealthy { - defer s.mu.RUnlock() - clusterInfo, err := deepCopy(s.clusterInfo) - if err != nil { - return nil, err + + // Return status for the first running network found (since we expect 1 per process) + for _, clusterInfo := range s.clusterInfos { + if clusterInfo.CustomChainsHealthy { + defer s.mu.RUnlock() + copiedInfo, err := deepCopy(clusterInfo) + if err != nil { + return nil, err + } + return &rpcpb.WaitForHealthyResponse{ClusterInfo: copiedInfo}, nil } - return &rpcpb.WaitForHealthyResponse{ClusterInfo: clusterInfo}, nil } + select { case err := <-s.asyncErrCh: defer s.mu.RUnlock() - clusterInfo, deepCopyErr := deepCopy(s.clusterInfo) - if deepCopyErr != nil { - err = multierr.Append(err, deepCopyErr) - return nil, err + // Try to get info from any existing cluster info + var clusterInfo *rpcpb.ClusterInfo + for _, info := range s.clusterInfos { + clusterInfo = info + break } - return &rpcpb.WaitForHealthyResponse{ClusterInfo: clusterInfo}, err + if clusterInfo != nil { + copiedInfo, deepCopyErr := deepCopy(clusterInfo) + if deepCopyErr != nil { + err = multierr.Append(err, deepCopyErr) + return nil, err + } + return &rpcpb.WaitForHealthyResponse{ClusterInfo: copiedInfo}, err + } + return nil, err case <-ctx.Done(): defer s.mu.RUnlock() - clusterInfo, err := deepCopy(s.clusterInfo) - if err != nil { - return nil, err + var clusterInfo *rpcpb.ClusterInfo + for _, info := range s.clusterInfos { + clusterInfo = info + break } - return &rpcpb.WaitForHealthyResponse{ClusterInfo: clusterInfo}, ctx.Err() + if clusterInfo != nil { + copiedInfo, err := deepCopy(clusterInfo) + if err != nil { + return nil, err + } + return &rpcpb.WaitForHealthyResponse{ClusterInfo: copiedInfo}, ctx.Err() + } + return nil, ctx.Err() default: } - if s.network == nil { + + if len(s.networks) == 0 { defer s.mu.RUnlock() return nil, ErrNotBootstrapped } @@ -567,14 +613,24 @@ func (s *server) CreateBlockchains( s.mu.Lock() defer s.mu.Unlock() - if s.network == nil { + if len(s.networks) == 0 { s.logger.Error("CreateBlockchains: network not bootstrapped") return nil, ErrNotBootstrapped } + // Use the first available network + var networkName string + var nw *localNetwork + for name, net := range s.networks { + networkName = name + nw = net + break + } + // Log the incoming request for debugging s.logger.Info("CreateBlockchains: received request", log.Int("numBlockchainSpecs", len(req.GetBlockchainSpecs())), + log.String("network", networkName), ) if len(req.GetBlockchainSpecs()) == 0 { @@ -591,7 +647,7 @@ func (s *server) CreateBlockchains( log.Bool("hasGenesis", spec.GetGenesis() != ""), log.Bool("hasChainId", spec.GetChainId() != ""), ) - chainSpec, err := getNetworkChainSpec(s.logger, spec, false, s.network.pluginDir) + chainSpec, err := getNetworkChainSpec(s.logger, spec, false, nw.pluginDir) if err != nil { s.logger.Error("CreateBlockchains: failed to parse blockchain spec", log.Err(err), @@ -605,7 +661,7 @@ func (s *server) CreateBlockchains( // check that the given chains exist chainsSet := set.Set[string]{} - chainIDsList := slices.Collect(maps.Keys(s.clusterInfo.Chains)) + chainIDsList := slices.Collect(maps.Keys(s.clusterInfos[networkName].Chains)) chainsSet.Add(chainIDsList...) for _, chainSpec := range chainSpecs { @@ -619,8 +675,8 @@ func (s *server) CreateBlockchains( } } - s.clusterInfo.Healthy = false - s.clusterInfo.CustomChainsHealthy = false + s.clusterInfos[networkName].Healthy = false + s.clusterInfos[networkName].CustomChainsHealthy = false s.logger.Info("CreateBlockchains: starting chain creation", log.Int("numChains", len(chainSpecs)), @@ -631,7 +687,7 @@ func (s *server) CreateBlockchains( // 30s is plenty for local P-chain operations; if it takes longer, something is wrong ctx, cancel := context.WithTimeout(context.Background(), chainDeployTimeout) defer cancel() - chainIDs, err := s.network.CreateChains(ctx, chainSpecs) + chainIDs, err := nw.CreateChains(ctx, chainSpecs) if err != nil { // Build detailed error context for logging vmNames := make([]string, len(chainSpecs)) @@ -643,20 +699,20 @@ func (s *server) CreateBlockchains( log.String("errorDetail", fmt.Sprintf("%+v", err)), log.Strings("vmNames", vmNames), log.Int("numChainSpecs", len(chainSpecs)), - log.String("pluginDir", s.network.pluginDir), + log.String("pluginDir", nw.pluginDir), ) // Also print to stdout for immediate visibility fmt.Printf("ERROR: CreateBlockchains failed: %v\n", err) fmt.Printf("ERROR: VMs attempted: %v\n", vmNames) - fmt.Printf("ERROR: Plugin directory: %s\n", s.network.pluginDir) + fmt.Printf("ERROR: Plugin directory: %s\n", nw.pluginDir) // Reset health flags on failure so subsequent deployments can proceed. // The network itself is still healthy, just this chain creation failed. - s.updateClusterInfo() + s.updateClusterInfo(networkName) // Don't stop the entire network on chain creation failure - keep it running // so user can retry or investigate. This makes the network more resilient. return nil, fmt.Errorf("CreateBlockchains failed for VMs %v: %w", vmNames, err) } - s.updateClusterInfo() + s.updateClusterInfo(networkName) s.logger.Info("CreateBlockchains: custom chains created successfully", log.Int("numChains", len(chainIDs)), ) @@ -666,7 +722,7 @@ func (s *server) CreateBlockchains( strChainIDs = append(strChainIDs, chainID.String()) } - clusterInfo, err := deepCopy(s.clusterInfo) + clusterInfo, err := deepCopy(s.clusterInfos[networkName]) if err != nil { return nil, err } @@ -680,7 +736,7 @@ func (s *server) AddPermissionlessValidator( s.mu.Lock() defer s.mu.Unlock() - if s.network == nil { + if s.networks["mainnet"] == nil { return nil, ErrNotBootstrapped } @@ -701,7 +757,7 @@ func (s *server) AddPermissionlessValidator( // check that the given chains exist chainsSet := set.Set[string]{} - chainsSet.Add(slices.Collect(maps.Keys(s.clusterInfo.Chains))...) + chainsSet.Add(slices.Collect(maps.Keys(s.clusterInfos["mainnet"].Chains))...) for _, validatorSpec := range validatorSpecList { if validatorSpec.ChainID == "" { @@ -711,14 +767,14 @@ func (s *server) AddPermissionlessValidator( } } - s.clusterInfo.Healthy = false - s.clusterInfo.CustomChainsHealthy = false + s.clusterInfos["mainnet"].Healthy = false + s.clusterInfos["mainnet"].CustomChainsHealthy = false ctx, cancel := context.WithTimeout(context.Background(), waitForHealthyTimeout) defer cancel() - err := s.network.AddPermissionlessValidators(ctx, validatorSpecList) + err := s.networks["mainnet"].AddPermissionlessValidators(ctx, validatorSpecList) - s.updateClusterInfo() + s.updateClusterInfo("mainnet") if err != nil { s.logger.Error("failed to add permissionless validator", log.Err(err)) @@ -727,7 +783,7 @@ func (s *server) AddPermissionlessValidator( s.logger.Info("successfully added permissionless validator") - clusterInfo, err := deepCopy(s.clusterInfo) + clusterInfo, err := deepCopy(s.clusterInfos["mainnet"]) if err != nil { return nil, err } @@ -741,7 +797,7 @@ func (s *server) RemoveChainValidator( s.mu.Lock() defer s.mu.Unlock() - if s.network == nil { + if s.networks["mainnet"] == nil { return nil, ErrNotBootstrapped } @@ -759,7 +815,7 @@ func (s *server) RemoveChainValidator( // check that the given chains exist chainsSet := set.Set[string]{} - chainsSet.Add(slices.Collect(maps.Keys(s.clusterInfo.Chains))...) + chainsSet.Add(slices.Collect(maps.Keys(s.clusterInfos["mainnet"].Chains))...) for _, validatorSpec := range validatorSpecList { if validatorSpec.ChainID == "" { @@ -769,14 +825,14 @@ func (s *server) RemoveChainValidator( } } - s.clusterInfo.Healthy = false - s.clusterInfo.CustomChainsHealthy = false + s.clusterInfos["mainnet"].Healthy = false + s.clusterInfos["mainnet"].CustomChainsHealthy = false ctx, cancel := context.WithTimeout(context.Background(), waitForHealthyTimeout) defer cancel() - err := s.network.RemoveChainValidator(ctx, validatorSpecList) + err := s.networks["mainnet"].RemoveChainValidator(ctx, validatorSpecList) - s.updateClusterInfo() + s.updateClusterInfo("mainnet") if err != nil { s.logger.Error("failed to remove chain validator", log.Err(err)) @@ -785,7 +841,7 @@ func (s *server) RemoveChainValidator( s.logger.Info("successfully removed chain validator") - clusterInfo, err := deepCopy(s.clusterInfo) + clusterInfo, err := deepCopy(s.clusterInfos["mainnet"]) if err != nil { return nil, err } @@ -799,7 +855,7 @@ func (s *server) TransformElasticChains( s.mu.Lock() defer s.mu.Unlock() - if s.network == nil { + if s.networks["mainnet"] == nil { return nil, ErrNotBootstrapped } @@ -817,7 +873,7 @@ func (s *server) TransformElasticChains( // check that the given chains exist chainsSet := set.Set[string]{} - chainsSet.Add(slices.Collect(maps.Keys(s.clusterInfo.Chains))...) + chainsSet.Add(slices.Collect(maps.Keys(s.clusterInfos["mainnet"].Chains))...) for _, elasticParticipantsSpec := range elasticParticipantsSpecList { if elasticParticipantsSpec.ChainID == nil { @@ -827,14 +883,14 @@ func (s *server) TransformElasticChains( } } - s.clusterInfo.Healthy = false - s.clusterInfo.CustomChainsHealthy = false + s.clusterInfos["mainnet"].Healthy = false + s.clusterInfos["mainnet"].CustomChainsHealthy = false ctx, cancel := context.WithTimeout(context.Background(), waitForHealthyTimeout) defer cancel() - txIDs, assetIDs, err := s.network.TransformChains(ctx, elasticParticipantsSpecList) + txIDs, assetIDs, err := s.networks["mainnet"].TransformChains(ctx, elasticParticipantsSpecList) - s.updateClusterInfo() + s.updateClusterInfo("mainnet") if err != nil { s.logger.Error("failed to transform chain into elastic chain", log.Err(err)) @@ -853,7 +909,7 @@ func (s *server) TransformElasticChains( strAssetIDs = append(strAssetIDs, assetID.String()) } - clusterInfo, err := deepCopy(s.clusterInfo) + clusterInfo, err := deepCopy(s.clusterInfos["mainnet"]) if err != nil { return nil, err } @@ -864,7 +920,7 @@ func (s *server) CreateChains(_ context.Context, req *rpcpb.CreateChainsRequest) s.mu.Lock() defer s.mu.Unlock() - if s.network == nil { + if s.networks["mainnet"] == nil { return nil, ErrNotBootstrapped } @@ -878,12 +934,12 @@ func (s *server) CreateChains(_ context.Context, req *rpcpb.CreateChainsRequest) s.logger.Info("waiting for local cluster readiness") - s.clusterInfo.Healthy = false - s.clusterInfo.CustomChainsHealthy = false + s.clusterInfos["mainnet"].Healthy = false + s.clusterInfos["mainnet"].CustomChainsHealthy = false ctx, cancel := context.WithTimeout(context.Background(), waitForHealthyTimeout) defer cancel() - chainIDs, err := s.network.CreateParticipantGroups(ctx, participantsSpecs) + chainIDs, err := s.networks["mainnet"].CreateParticipantGroups(ctx, participantsSpecs) if err != nil { s.logger.Error("failed to create chains", log.Err(err)) // Don't stop the entire network on chain creation failure - keep it running @@ -891,7 +947,7 @@ func (s *server) CreateChains(_ context.Context, req *rpcpb.CreateChainsRequest) // s.stopAndRemoveNetwork(err) // Commented out for resilience return nil, err } else { - s.updateClusterInfo() + s.updateClusterInfo("mainnet") } s.logger.Info("chains created") @@ -900,7 +956,7 @@ func (s *server) CreateChains(_ context.Context, req *rpcpb.CreateChainsRequest) strChainIDs = append(strChainIDs, chainID.String()) } - clusterInfo, err := deepCopy(s.clusterInfo) + clusterInfo, err := deepCopy(s.clusterInfos["mainnet"]) if err != nil { return nil, err } @@ -913,39 +969,55 @@ func (s *server) Health(ctx context.Context, _ *rpcpb.HealthRequest) (*rpcpb.Hea s.logger.Debug("Health") - if s.network == nil { + if len(s.networks) == 0 { return nil, ErrNotBootstrapped } - s.logger.Info("waiting for local cluster readiness") - if err := s.network.AwaitHealthyAndUpdateNetworkInfo(ctx); err != nil { + // Just check the first available network for backward compatibility + var networkName string + var network *localNetwork + for name, net := range s.networks { + networkName = name + network = net + break + } + + s.logger.Info("waiting for local cluster readiness", log.String("network", networkName)) + if err := network.AwaitHealthyAndUpdateNetworkInfo(ctx); err != nil { return nil, err } - s.clusterInfo.NodeNames = slices.Collect(maps.Keys(s.network.nodeInfos)) - sort.Strings(s.clusterInfo.NodeNames) - s.clusterInfo.NodeInfos = s.network.nodeInfos - s.clusterInfo.Healthy = true + // Update cluster info for this network + s.updateClusterInfo(networkName) - clusterInfo, err := deepCopy(s.clusterInfo) + clusterInfo, err := deepCopy(s.clusterInfos[networkName]) if err != nil { return nil, err } return &rpcpb.HealthResponse{ClusterInfo: clusterInfo}, nil } - func (s *server) URIs(context.Context, *rpcpb.URIsRequest) (*rpcpb.URIsResponse, error) { s.mu.RLock() defer s.mu.RUnlock() s.logger.Debug("URIs") - if s.network == nil { + if len(s.clusterInfos) == 0 { return nil, ErrNotBootstrapped } - uris := make([]string, 0, len(s.clusterInfo.NodeInfos)) - for _, nodeInfo := range s.clusterInfo.NodeInfos { + var clusterInfo *rpcpb.ClusterInfo + for _, info := range s.clusterInfos { + clusterInfo = info + break + } + + if clusterInfo == nil { + return nil, ErrNotBootstrapped + } + + uris := make([]string, 0, len(clusterInfo.NodeInfos)) + for _, nodeInfo := range clusterInfo.NodeInfos { uris = append(uris, nodeInfo.Uri) } sort.Strings(uris) @@ -953,22 +1025,33 @@ func (s *server) URIs(context.Context, *rpcpb.URIsRequest) (*rpcpb.URIsResponse, return &rpcpb.URIsResponse{Uris: uris}, nil } -func (s *server) Status(context.Context, *rpcpb.StatusRequest) (*rpcpb.StatusResponse, error) { +func (s *server) Status(ctx context.Context, req *rpcpb.StatusRequest) (*rpcpb.StatusResponse, error) { s.mu.RLock() defer s.mu.RUnlock() s.logger.Debug("Status") - if s.network == nil { + if len(s.networks) == 0 { return &rpcpb.StatusResponse{}, ErrNotBootstrapped } - return &rpcpb.StatusResponse{ClusterInfo: s.clusterInfo}, nil + // Just return the first available network's info + var clusterInfo *rpcpb.ClusterInfo + for _, info := range s.clusterInfos { + clusterInfo = info + break + } + + if clusterInfo == nil { + return &rpcpb.StatusResponse{}, ErrNotBootstrapped + } + + return &rpcpb.StatusResponse{ClusterInfo: clusterInfo}, nil } // Assumes [s.mu] is held. -func (s *server) stopAndRemoveNetwork(err error) { - s.logger.Info("removing network") +func (s *server) stopAndRemoveNetwork(networkName string, err error) { + s.logger.Info("removing network", log.String("network", networkName)) select { // cleanup of possible previous unchecked async err case err := <-s.asyncErrCh: @@ -978,16 +1061,17 @@ func (s *server) stopAndRemoveNetwork(err error) { if err != nil { s.asyncErrCh <- err } - if s.network != nil { + if s.networks[networkName] != nil { ctx, cancel := context.WithTimeout(context.Background(), stopTimeout) defer cancel() - s.network.Stop(ctx) + s.networks[networkName].Stop(ctx) + delete(s.networks, networkName) } - if s.clusterInfo != nil { - s.clusterInfo.Healthy = false - s.clusterInfo.CustomChainsHealthy = false + if s.clusterInfos[networkName] != nil { + s.clusterInfos[networkName].Healthy = false + s.clusterInfos[networkName].CustomChainsHealthy = false + delete(s.clusterInfos, networkName) } - s.network = nil } // TODO document this @@ -1052,7 +1136,7 @@ func (s *server) sendLoop(stream rpcpb.ControlService_StreamStatusServer, interv s.logger.Debug("sending cluster info") s.mu.RLock() - err := stream.Send(&rpcpb.StreamStatusResponse{ClusterInfo: s.clusterInfo}) + err := stream.Send(&rpcpb.StreamStatusResponse{ClusterInfo: s.clusterInfos["mainnet"]}) s.mu.RUnlock() if err != nil { if isClientCanceled(stream.Context().Err(), err) { @@ -1095,7 +1179,7 @@ func (s *server) AddNode(_ context.Context, req *rpcpb.AddNodeRequest) (*rpcpb.A s.logger.Debug("AddNode", log.String("name", req.Name)) - if s.network == nil { + if s.networks["mainnet"] == nil { return nil, ErrNotBootstrapped } @@ -1121,19 +1205,19 @@ func (s *server) AddNode(_ context.Context, req *rpcpb.AddNodeRequest) (*rpcpb.A PChainConfigFiles: req.ChainConfigFiles, } - if _, err := s.network.nw.AddNode(nodeConfig); err != nil { + if _, err := s.networks["mainnet"].nw.AddNode(nodeConfig); err != nil { return nil, err } - if err := s.network.UpdateNodeInfo(); err != nil { + if err := s.networks["mainnet"].UpdateNodeInfo(); err != nil { return nil, err } - s.clusterInfo.NodeNames = slices.Collect(maps.Keys(s.network.nodeInfos)) - sort.Strings(s.clusterInfo.NodeNames) - s.clusterInfo.NodeInfos = s.network.nodeInfos + s.clusterInfos["mainnet"].NodeNames = slices.Collect(maps.Keys(s.networks["mainnet"].nodeInfos)) + sort.Strings(s.clusterInfos["mainnet"].NodeNames) + s.clusterInfos["mainnet"].NodeInfos = s.networks["mainnet"].nodeInfos - clusterInfo, err := deepCopy(s.clusterInfo) + clusterInfo, err := deepCopy(s.clusterInfos["mainnet"]) if err != nil { return nil, err } @@ -1146,23 +1230,23 @@ func (s *server) RemoveNode(ctx context.Context, req *rpcpb.RemoveNodeRequest) ( s.logger.Debug("RemoveNode", log.String("name", req.Name)) - if s.network == nil { + if s.networks["mainnet"] == nil { return nil, ErrNotBootstrapped } - if err := s.network.nw.RemoveNode(ctx, req.Name); err != nil { + if err := s.networks["mainnet"].nw.RemoveNode(ctx, req.Name); err != nil { return nil, err } - if err := s.network.UpdateNodeInfo(); err != nil { + if err := s.networks["mainnet"].UpdateNodeInfo(); err != nil { return nil, err } - s.clusterInfo.NodeNames = slices.Collect(maps.Keys(s.network.nodeInfos)) - sort.Strings(s.clusterInfo.NodeNames) - s.clusterInfo.NodeInfos = s.network.nodeInfos + s.clusterInfos["mainnet"].NodeNames = slices.Collect(maps.Keys(s.networks["mainnet"].nodeInfos)) + sort.Strings(s.clusterInfos["mainnet"].NodeNames) + s.clusterInfos["mainnet"].NodeInfos = s.networks["mainnet"].nodeInfos - clusterInfo, err := deepCopy(s.clusterInfo) + clusterInfo, err := deepCopy(s.clusterInfos["mainnet"]) if err != nil { return nil, err } @@ -1175,11 +1259,11 @@ func (s *server) RestartNode(ctx context.Context, req *rpcpb.RestartNodeRequest) s.logger.Debug("RestartNode", log.String("name", req.Name)) - if s.network == nil { + if s.networks["mainnet"] == nil { return nil, ErrNotBootstrapped } - if err := s.network.nw.RestartNode( + if err := s.networks["mainnet"].nw.RestartNode( ctx, req.Name, req.GetExecPath(), @@ -1192,15 +1276,15 @@ func (s *server) RestartNode(ctx context.Context, req *rpcpb.RestartNodeRequest) return nil, err } - if err := s.network.UpdateNodeInfo(); err != nil { + if err := s.networks["mainnet"].UpdateNodeInfo(); err != nil { return nil, err } - s.clusterInfo.NodeNames = slices.Collect(maps.Keys(s.network.nodeInfos)) - sort.Strings(s.clusterInfo.NodeNames) - s.clusterInfo.NodeInfos = s.network.nodeInfos + s.clusterInfos["mainnet"].NodeNames = slices.Collect(maps.Keys(s.networks["mainnet"].nodeInfos)) + sort.Strings(s.clusterInfos["mainnet"].NodeNames) + s.clusterInfos["mainnet"].NodeInfos = s.networks["mainnet"].nodeInfos - clusterInfo, err := deepCopy(s.clusterInfo) + clusterInfo, err := deepCopy(s.clusterInfos["mainnet"]) if err != nil { return nil, err } @@ -1213,26 +1297,26 @@ func (s *server) PauseNode(ctx context.Context, req *rpcpb.PauseNodeRequest) (*r s.logger.Debug("PauseNode", log.String("name", req.Name)) - if s.network == nil { + if s.networks["mainnet"] == nil { return nil, ErrNotBootstrapped } - if err := s.network.nw.PauseNode( + if err := s.networks["mainnet"].nw.PauseNode( ctx, req.Name, ); err != nil { return nil, err } - if err := s.network.UpdateNodeInfo(); err != nil { + if err := s.networks["mainnet"].UpdateNodeInfo(); err != nil { return nil, err } - s.clusterInfo.NodeNames = slices.Collect(maps.Keys(s.network.nodeInfos)) - sort.Strings(s.clusterInfo.NodeNames) - s.clusterInfo.NodeInfos = s.network.nodeInfos + s.clusterInfos["mainnet"].NodeNames = slices.Collect(maps.Keys(s.networks["mainnet"].nodeInfos)) + sort.Strings(s.clusterInfos["mainnet"].NodeNames) + s.clusterInfos["mainnet"].NodeInfos = s.networks["mainnet"].nodeInfos - return &rpcpb.PauseNodeResponse{ClusterInfo: s.clusterInfo}, nil + return &rpcpb.PauseNodeResponse{ClusterInfo: s.clusterInfos["mainnet"]}, nil } func (s *server) ResumeNode(ctx context.Context, req *rpcpb.ResumeNodeRequest) (*rpcpb.ResumeNodeResponse, error) { @@ -1241,26 +1325,26 @@ func (s *server) ResumeNode(ctx context.Context, req *rpcpb.ResumeNodeRequest) ( s.logger.Debug("ResumeNode", log.String("name", req.Name)) - if s.network == nil { + if s.networks["mainnet"] == nil { return nil, ErrNotBootstrapped } - if err := s.network.nw.ResumeNode( + if err := s.networks["mainnet"].nw.ResumeNode( ctx, req.Name, ); err != nil { return nil, err } - if err := s.network.UpdateNodeInfo(); err != nil { + if err := s.networks["mainnet"].UpdateNodeInfo(); err != nil { return nil, err } - s.clusterInfo.NodeNames = slices.Collect(maps.Keys(s.network.nodeInfos)) - sort.Strings(s.clusterInfo.NodeNames) - s.clusterInfo.NodeInfos = s.network.nodeInfos + s.clusterInfos["mainnet"].NodeNames = slices.Collect(maps.Keys(s.networks["mainnet"].nodeInfos)) + sort.Strings(s.clusterInfos["mainnet"].NodeNames) + s.clusterInfos["mainnet"].NodeInfos = s.networks["mainnet"].nodeInfos - return &rpcpb.ResumeNodeResponse{ClusterInfo: s.clusterInfo}, nil + return &rpcpb.ResumeNodeResponse{ClusterInfo: s.clusterInfos["mainnet"]}, nil } func (s *server) Stop(context.Context, *rpcpb.StopRequest) (*rpcpb.StopResponse, error) { @@ -1269,9 +1353,9 @@ func (s *server) Stop(context.Context, *rpcpb.StopRequest) (*rpcpb.StopResponse, s.logger.Debug("Stop") - s.stopAndRemoveNetwork(nil) + s.stopAndRemoveNetwork("mainnet", nil) - return &rpcpb.StopResponse{ClusterInfo: s.clusterInfo}, nil + return &rpcpb.StopResponse{ClusterInfo: s.clusterInfos["mainnet"]}, nil } var _ peer.InboundHandler = &loggingInboundHandler{} @@ -1335,11 +1419,11 @@ func (s *server) AttachPeer(ctx context.Context, req *rpcpb.AttachPeerRequest) ( s.logger.Debug("AttachPeer") - if s.network == nil { + if s.networks["mainnet"] == nil { return nil, ErrNotBootstrapped } - node, err := s.network.nw.GetNode(req.NodeName) + node, err := s.networks["mainnet"].nw.GetNode(req.NodeName) if err != nil { return nil, err } @@ -1353,19 +1437,19 @@ func (s *server) AttachPeer(ctx context.Context, req *rpcpb.AttachPeerRequest) ( newPeerID := newPeer.ID().String() s.logger.Debug("new peer is attached to", log.String("peer-ID", newPeerID), log.String("node-name", node.GetName())) - if s.clusterInfo.AttachedPeerInfos == nil { - s.clusterInfo.AttachedPeerInfos = make(map[string]*rpcpb.ListOfAttachedPeerInfo) + if s.clusterInfos["mainnet"].AttachedPeerInfos == nil { + s.clusterInfos["mainnet"].AttachedPeerInfos = make(map[string]*rpcpb.ListOfAttachedPeerInfo) } peerInfo := &rpcpb.AttachedPeerInfo{Id: newPeerID} - if v, ok := s.clusterInfo.AttachedPeerInfos[req.NodeName]; ok { + if v, ok := s.clusterInfos["mainnet"].AttachedPeerInfos[req.NodeName]; ok { v.Peers = append(v.Peers, peerInfo) } else { - s.clusterInfo.AttachedPeerInfos[req.NodeName] = &rpcpb.ListOfAttachedPeerInfo{ + s.clusterInfos["mainnet"].AttachedPeerInfos[req.NodeName] = &rpcpb.ListOfAttachedPeerInfo{ Peers: []*rpcpb.AttachedPeerInfo{peerInfo}, } } - clusterInfo, err := deepCopy(s.clusterInfo) + clusterInfo, err := deepCopy(s.clusterInfos["mainnet"]) if err != nil { return nil, err } @@ -1378,11 +1462,11 @@ func (s *server) SendOutboundMessage(ctx context.Context, req *rpcpb.SendOutboun s.logger.Debug("SendOutboundMessage") - if s.network == nil { + if s.networks["mainnet"] == nil { return nil, ErrNotBootstrapped } - node, err := s.network.nw.GetNode(req.NodeName) + node, err := s.networks["mainnet"].nw.GetNode(req.NodeName) if err != nil { return nil, err } @@ -1397,20 +1481,30 @@ func (s *server) LoadSnapshot(_ context.Context, req *rpcpb.LoadSnapshotRequest) s.logger.Debug("LoadSnapshot") - if s.network != nil { + // Get network name from request, with backward compatibility + networkName := req.GetNetworkName() + if networkName == "" { + // For backward compatibility, try to determine from root dir if not specified + rootDataDir := req.GetRootDataDir() + if len(rootDataDir) == 0 { + networkName = constants.DefaultNetwork + } else { + networkName = getNetworkNameFromRootDir(rootDataDir) + } + } + + if len(s.networks) > 0 { return nil, ErrAlreadyBootstrapped } var err error rootDataDir := req.GetRootDataDir() - // Determine base directory and network name for network-centric structure - var networkName string + // If rootDataDir is still empty, set it up based on network name if len(rootDataDir) == 0 { // Default to ~/.lux for the base homeDir, _ := os.UserHomeDir() baseDir := filepath.Join(homeDir, ".lux") - networkName = constants.DefaultNetwork // Ensure base directory exists if err = os.MkdirAll(baseDir, os.ModePerm); err != nil { @@ -1423,10 +1517,6 @@ func (s *server) LoadSnapshot(_ context.Context, req *rpcpb.LoadSnapshotRequest) return nil, err } } else { - // CLI provided a specific rootDataDir - use it directly - // Trust the CLI to provide a properly structured path - networkName = getNetworkNameFromRootDir(rootDataDir) - // Ensure the provided directory exists if err = os.MkdirAll(rootDataDir, os.ModePerm); err != nil { return nil, err @@ -1436,7 +1526,11 @@ func (s *server) LoadSnapshot(_ context.Context, req *rpcpb.LoadSnapshotRequest) pid := int32(os.Getpid()) s.logger.Info("starting", log.Int32("pid", pid), log.String("network", networkName), log.String("root-data-dir", rootDataDir)) - s.network, err = newLocalNetwork(localNetworkOptions{ + if s.networks == nil { + s.networks = make(map[string]*localNetwork) + } + var nw *localNetwork + nw, err = newLocalNetwork(localNetworkOptions{ execPath: req.GetExecPath(), pluginDir: req.GetPluginDir(), rootDataDir: rootDataDir, @@ -1451,30 +1545,35 @@ func (s *server) LoadSnapshot(_ context.Context, req *rpcpb.LoadSnapshotRequest) if err != nil { return nil, err } - s.clusterInfo = &rpcpb.ClusterInfo{ + s.networks[networkName] = nw + + if s.clusterInfos == nil { + s.clusterInfos = make(map[string]*rpcpb.ClusterInfo) + } + s.clusterInfos[networkName] = &rpcpb.ClusterInfo{ Pid: pid, RootDataDir: rootDataDir, } // blocking load snapshot to soon get not found snapshot errors - if err := s.network.LoadSnapshot(req.SnapshotName); err != nil { + if err := s.networks[networkName].LoadSnapshot(req.SnapshotName); err != nil { s.logger.Warn("snapshot load failed to complete", log.Err(err)) - s.stopAndRemoveNetwork(nil) + s.stopAndRemoveNetwork(networkName, nil) return nil, err } ctx, cancel := context.WithTimeout(context.Background(), waitForHealthyTimeout) defer cancel() - err = s.network.AwaitHealthyAndUpdateNetworkInfo(ctx) + err = s.networks[networkName].AwaitHealthyAndUpdateNetworkInfo(ctx) if err != nil { s.logger.Warn("snapshot load failed to complete. stopping network and cleaning up network", log.Err(err)) - s.stopAndRemoveNetwork(err) + s.stopAndRemoveNetwork(networkName, err) return nil, err } - s.updateClusterInfo() + s.updateClusterInfo(networkName) s.logger.Info("network healthy") - clusterInfo, err := deepCopy(s.clusterInfo) + clusterInfo, err := deepCopy(s.clusterInfos[networkName]) if err != nil { return nil, err } @@ -1485,19 +1584,24 @@ func (s *server) SaveSnapshot(ctx context.Context, req *rpcpb.SaveSnapshotReques s.mu.Lock() defer s.mu.Unlock() - s.logger.Info("SaveSnapshot", log.String("snapshot-name", req.SnapshotName)) + networkName := req.GetNetworkName() + if networkName == "" { + networkName = "mainnet" // Default for backward compatibility + } - if s.network == nil { + s.logger.Info("SaveSnapshot", log.String("network-name", networkName), log.String("snapshot-name", req.SnapshotName)) + + if s.networks[networkName] == nil { return nil, ErrNotBootstrapped } - snapshotPath, err := s.network.nw.SaveSnapshot(ctx, req.SnapshotName) + snapshotPath, err := s.networks[networkName].nw.SaveSnapshot(ctx, req.SnapshotName) if err != nil { s.logger.Warn("snapshot save failed to complete", log.Err(err)) return nil, err } - s.stopAndRemoveNetwork(nil) + s.stopAndRemoveNetwork(networkName, nil) return &rpcpb.SaveSnapshotResponse{SnapshotPath: snapshotPath}, nil } @@ -1508,13 +1612,18 @@ func (s *server) SaveHotSnapshot(ctx context.Context, req *rpcpb.SaveSnapshotReq s.mu.RLock() // Read lock - doesn't block network operations defer s.mu.RUnlock() - s.logger.Info("SaveHotSnapshot", log.String("snapshot-name", req.SnapshotName)) + networkName := req.GetNetworkName() + if networkName == "" { + networkName = "mainnet" // Default for backward compatibility + } - if s.network == nil { + s.logger.Info("SaveHotSnapshot", log.String("network-name", networkName), log.String("snapshot-name", req.SnapshotName)) + + if s.networks[networkName] == nil { return nil, ErrNotBootstrapped } - snapshotPath, err := s.network.nw.SaveHotSnapshot(ctx, req.SnapshotName) + snapshotPath, err := s.networks[networkName].nw.SaveHotSnapshot(ctx, req.SnapshotName) if err != nil { s.logger.Warn("hot snapshot save failed to complete", log.Err(err)) return nil, err @@ -1532,30 +1641,40 @@ func (s *server) RemoveSnapshot(_ context.Context, req *rpcpb.RemoveSnapshotRequ s.mu.Lock() defer s.mu.Unlock() - s.logger.Info("RemoveSnapshot", log.String("snapshot-name", req.SnapshotName)) + networkName := req.GetNetworkName() + if networkName == "" { + networkName = "mainnet" // Default for backward compatibility + } - if s.network == nil { + s.logger.Info("RemoveSnapshot", log.String("network-name", networkName), log.String("snapshot-name", req.SnapshotName)) + + if s.networks[networkName] == nil { return nil, ErrNotBootstrapped } - if err := s.network.nw.RemoveSnapshot(req.SnapshotName); err != nil { + if err := s.networks[networkName].nw.RemoveSnapshot(req.SnapshotName); err != nil { s.logger.Warn("snapshot remove failed to complete", log.Err(err)) return nil, err } return &rpcpb.RemoveSnapshotResponse{}, nil } -func (s *server) GetSnapshotNames(context.Context, *rpcpb.GetSnapshotNamesRequest) (*rpcpb.GetSnapshotNamesResponse, error) { +func (s *server) GetSnapshotNames(ctx context.Context, req *rpcpb.GetSnapshotNamesRequest) (*rpcpb.GetSnapshotNamesResponse, error) { s.mu.RLock() defer s.mu.RUnlock() - s.logger.Info("GetSnapshotNames") + networkName := req.GetNetworkName() + if networkName == "" { + networkName = "mainnet" // Default for backward compatibility + } - if s.network == nil { + s.logger.Info("GetSnapshotNames", log.String("network-name", networkName)) + + if s.networks[networkName] == nil { return nil, ErrNotBootstrapped } - snapshotNames, err := s.network.nw.GetSnapshotNames() + snapshotNames, err := s.networks[networkName].nw.GetSnapshotNames() if err != nil { return nil, err } diff --git a/tests/e2e/e2e_test.go b/tests/e2e/e2e_test.go index 4232a509..fb4ca0a4 100644 --- a/tests/e2e/e2e_test.go +++ b/tests/e2e/e2e_test.go @@ -20,11 +20,11 @@ import ( "maps" "slices" - luxd_constants "github.com/luxfi/const" - "github.com/luxfi/node/api/admin" - "github.com/luxfi/node/message" + luxd_ "github.com/luxfi/constantsants" + "github.com/luxfi/p2p/message" + "github.com/luxfi/sdk/api/admin" - "github.com/luxfi/node/vms/platformvm" + "github.com/luxfi/vm/vms/platformvm" "github.com/luxfi/ids" "github.com/luxfi/log" diff --git a/tests/e2e/e2e_test.go.bak b/tests/e2e/e2e_test.go.bak index 915c2b59..302587a3 100644 --- a/tests/e2e/e2e_test.go.bak +++ b/tests/e2e/e2e_test.go.bak @@ -14,10 +14,10 @@ import ( "testing" "time" - "github.com/luxfi/node/api/admin" - "github.com/luxfi/node/message" - luxd_constants "github.com/luxfi/node/utils/constants" - "github.com/luxfi/node/vms/platformvm" + "github.com/luxfi/sdk/node/api/admin" + "github.com/luxfi/p2p/message" + luxd_constants "github.com/luxfi/utils/constants" + "github.com/luxfi/sdk/node/vms/platformvm" "github.com/prometheus/client_golang/prometheus" "golang.org/x/exp/maps" @@ -28,7 +28,7 @@ import ( "github.com/luxfi/netrunner/utils/constants" "github.com/luxfi/netrunner/ux" "github.com/luxfi/ids" - "github.com/luxfi/node/utils/logging" + "github.com/luxfi/utils/logging" "github.com/luxfi/metrics" ginkgo "github.com/onsi/ginkgo/v2" "github.com/onsi/gomega" diff --git a/tests/e2e/e2e_test.go.skip b/tests/e2e/e2e_test.go.skip index 6781c09f..6ebf3589 100644 --- a/tests/e2e/e2e_test.go.skip +++ b/tests/e2e/e2e_test.go.skip @@ -14,10 +14,10 @@ import ( "testing" "time" - "github.com/luxfi/node/api/admin" - "github.com/luxfi/node/message" - luxd_constants "github.com/luxfi/node/utils/constants" - "github.com/luxfi/node/vms/platformvm" + "github.com/luxfi/sdk/node/api/admin" + "github.com/luxfi/p2p/message" + luxd_constants "github.com/luxfi/utils/constants" + "github.com/luxfi/sdk/node/vms/platformvm" "golang.org/x/exp/maps" "github.com/luxfi/netrunner/client" diff --git a/utils/nodeKeys.go b/utils/nodeKeys.go index 77b04489..14b26d07 100644 --- a/utils/nodeKeys.go +++ b/utils/nodeKeys.go @@ -6,7 +6,7 @@ import ( "sync" "github.com/luxfi/crypto/bls/signer/localsigner" - "github.com/luxfi/node/staking" + luxtls "github.com/luxfi/tls" "golang.org/x/sync/errgroup" ) @@ -31,7 +31,7 @@ func EncodeNodeKeys(key *NodeKeys) *EncodedNodeKeys { } func generateNodeKeys() (*NodeKeys, error) { - stakingCert, stakingKey, err := staking.NewCertAndKeyBytes() + stakingCert, stakingKey, err := luxtls.NewCertAndKeyBytes() if err != nil { return nil, fmt.Errorf("couldn't generate staking cert/key: %w", err) } diff --git a/utils/utils.go b/utils/utils.go index c1a550ab..3e5dce25 100644 --- a/utils/utils.go +++ b/utils/utils.go @@ -12,7 +12,7 @@ import ( "github.com/luxfi/log" rpcb "github.com/luxfi/netrunner/rpcpb" "github.com/luxfi/netrunner/ux" - "github.com/luxfi/node/staking" + luxtls "github.com/luxfi/tls" ) const ( @@ -21,7 +21,7 @@ const ( ) func ToNodeID(stakingKey, stakingCert []byte) (ids.NodeID, error) { - cert, err := staking.LoadTLSCertFromBytes(stakingKey, stakingCert) + cert, err := luxtls.LoadTLSCertFromBytes(stakingKey, stakingCert) if err != nil { return ids.EmptyNodeID, err }